Completed
Push — master ( d6bbb0...d1764d )
by Brian
18s queued 15s
created
includes/admin/wpinv-admin-functions.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -101,9 +101,9 @@  discard block
 block discarded – undo
101 101
         case 'status' :
102 102
             $value   = $wpi_invoice->get_status( true ) . ( $wpi_invoice->is_recurring() && $wpi_invoice->is_parent() ? ' <span class="wpi-suffix">' . __( '(r)', 'invoicing' ) . '</span>' : '' );
103 103
             $is_viewed = wpinv_is_invoice_viewed( $wpi_invoice->ID );
104
-	        $gateway_title = wpinv_get_gateway_admin_label( $wpi_invoice->get_gateway() );
105
-	        $offline_gateways = apply_filters('wpinv_offline_payments', array('bank_transfer', 'cheque', 'cod'));
106
-	        $is_offline_payment = in_array($wpi_invoice->get_gateway(), $offline_gateways) ? true : false;
104
+            $gateway_title = wpinv_get_gateway_admin_label( $wpi_invoice->get_gateway() );
105
+            $offline_gateways = apply_filters('wpinv_offline_payments', array('bank_transfer', 'cheque', 'cod'));
106
+            $is_offline_payment = in_array($wpi_invoice->get_gateway(), $offline_gateways) ? true : false;
107 107
 
108 108
             if ( 1 == $is_viewed ) {
109 109
                 $value .= '&nbsp;&nbsp;<i class="fa fa-eye" title="'.__( 'Viewed by Customer', 'invoicing' ).'"></i>';
@@ -174,69 +174,69 @@  discard block
 block discarded – undo
174 174
 }
175 175
 
176 176
 function wpinv_admin_messages() {
177
-	global $wpinv_options, $pagenow, $post;
177
+    global $wpinv_options, $pagenow, $post;
178 178
 
179
-	if ( isset( $_GET['wpinv-message'] ) && 'discount_added' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
180
-		 add_settings_error( 'wpinv-notices', 'wpinv-discount-added', __( 'Discount code added.', 'invoicing' ), 'updated' );
181
-	}
179
+    if ( isset( $_GET['wpinv-message'] ) && 'discount_added' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
180
+            add_settings_error( 'wpinv-notices', 'wpinv-discount-added', __( 'Discount code added.', 'invoicing' ), 'updated' );
181
+    }
182 182
 
183
-	if ( isset( $_GET['wpinv-message'] ) && 'discount_add_failed' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
184
-		add_settings_error( 'wpinv-notices', 'wpinv-discount-add-fail', __( 'There was a problem adding your discount code, please try again.', 'invoicing' ), 'error' );
185
-	}
183
+    if ( isset( $_GET['wpinv-message'] ) && 'discount_add_failed' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
184
+        add_settings_error( 'wpinv-notices', 'wpinv-discount-add-fail', __( 'There was a problem adding your discount code, please try again.', 'invoicing' ), 'error' );
185
+    }
186 186
 
187
-	if ( isset( $_GET['wpinv-message'] ) && 'discount_exists' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
188
-		add_settings_error( 'wpinv-notices', 'wpinv-discount-exists', __( 'A discount with that code already exists, please use a different code.', 'invoicing' ), 'error' );
189
-	}
187
+    if ( isset( $_GET['wpinv-message'] ) && 'discount_exists' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
188
+        add_settings_error( 'wpinv-notices', 'wpinv-discount-exists', __( 'A discount with that code already exists, please use a different code.', 'invoicing' ), 'error' );
189
+    }
190 190
 
191
-	if ( isset( $_GET['wpinv-message'] ) && 'discount_updated' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
192
-		 add_settings_error( 'wpinv-notices', 'wpinv-discount-updated', __( 'Discount code updated.', 'invoicing' ), 'updated' );
193
-	}
191
+    if ( isset( $_GET['wpinv-message'] ) && 'discount_updated' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
192
+            add_settings_error( 'wpinv-notices', 'wpinv-discount-updated', __( 'Discount code updated.', 'invoicing' ), 'updated' );
193
+    }
194 194
 
195
-	if ( isset( $_GET['wpinv-message'] ) && 'discount_update_failed' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
196
-		add_settings_error( 'wpinv-notices', 'wpinv-discount-updated-fail', __( 'There was a problem updating your discount code, please try again.', 'invoicing' ), 'error' );
197
-	}
195
+    if ( isset( $_GET['wpinv-message'] ) && 'discount_update_failed' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
196
+        add_settings_error( 'wpinv-notices', 'wpinv-discount-updated-fail', __( 'There was a problem updating your discount code, please try again.', 'invoicing' ), 'error' );
197
+    }
198 198
 
199
-	if ( isset( $_GET['wpinv-message'] ) && 'invoice_deleted' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
200
-		add_settings_error( 'wpinv-notices', 'wpinv-deleted', __( 'The invoice has been deleted.', 'invoicing' ), 'updated' );
201
-	}
199
+    if ( isset( $_GET['wpinv-message'] ) && 'invoice_deleted' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
200
+        add_settings_error( 'wpinv-notices', 'wpinv-deleted', __( 'The invoice has been deleted.', 'invoicing' ), 'updated' );
201
+    }
202 202
 
203
-	if ( isset( $_GET['wpinv-message'] ) && 'email_disabled' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
204
-		add_settings_error( 'wpinv-notices', 'wpinv-sent-fail', __( 'Email notification is disabled. Please check settings.', 'invoicing' ), 'error' );
205
-	}
203
+    if ( isset( $_GET['wpinv-message'] ) && 'email_disabled' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
204
+        add_settings_error( 'wpinv-notices', 'wpinv-sent-fail', __( 'Email notification is disabled. Please check settings.', 'invoicing' ), 'error' );
205
+    }
206 206
 
207
-	if ( isset( $_GET['wpinv-message'] ) && 'email_sent' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
208
-		add_settings_error( 'wpinv-notices', 'wpinv-sent', __( 'The email has been sent to customer.', 'invoicing' ), 'updated' );
207
+    if ( isset( $_GET['wpinv-message'] ) && 'email_sent' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
208
+        add_settings_error( 'wpinv-notices', 'wpinv-sent', __( 'The email has been sent to customer.', 'invoicing' ), 'updated' );
209 209
     }
210 210
     
211 211
     if ( isset( $_GET['wpinv-message'] ) && 'email_fail' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
212
-		add_settings_error( 'wpinv-notices', 'wpinv-sent-fail', __( 'Fail to send email to the customer.', 'invoicing' ), 'error' );
212
+        add_settings_error( 'wpinv-notices', 'wpinv-sent-fail', __( 'Fail to send email to the customer.', 'invoicing' ), 'error' );
213 213
     }
214 214
 
215 215
     if ( isset( $_GET['wpinv-message'] ) && 'invoice-note-deleted' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
216 216
         add_settings_error( 'wpinv-notices', 'wpinv-note-deleted', __( 'The invoice note has been deleted.', 'invoicing' ), 'updated' );
217 217
     }
218 218
 
219
-	if ( isset( $_GET['wpinv-message'] ) && 'settings-imported' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
220
-		add_settings_error( 'wpinv-notices', 'wpinv-settings-imported', __( 'The settings have been imported.', 'invoicing' ), 'updated' );
221
-	}
219
+    if ( isset( $_GET['wpinv-message'] ) && 'settings-imported' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
220
+        add_settings_error( 'wpinv-notices', 'wpinv-settings-imported', __( 'The settings have been imported.', 'invoicing' ), 'updated' );
221
+    }
222 222
 
223
-	if ( isset( $_GET['wpinv-message'] ) && 'note-added' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
224
-		add_settings_error( 'wpinv-notices', 'wpinv-note-added', __( 'The invoice note has been added successfully.', 'invoicing' ), 'updated' );
225
-	}
223
+    if ( isset( $_GET['wpinv-message'] ) && 'note-added' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
224
+        add_settings_error( 'wpinv-notices', 'wpinv-note-added', __( 'The invoice note has been added successfully.', 'invoicing' ), 'updated' );
225
+    }
226 226
 
227
-	if ( isset( $_GET['wpinv-message'] ) && 'invoice-updated' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
228
-		add_settings_error( 'wpinv-notices', 'wpinv-updated', __( 'The invoice has been successfully updated.', 'invoicing' ), 'updated' );
229
-	}
227
+    if ( isset( $_GET['wpinv-message'] ) && 'invoice-updated' == $_GET['wpinv-message'] && wpinv_current_user_can_manage_invoicing() ) {
228
+        add_settings_error( 'wpinv-notices', 'wpinv-updated', __( 'The invoice has been successfully updated.', 'invoicing' ), 'updated' );
229
+    }
230 230
     
231
-	if ( $pagenow == 'post.php' && !empty( $post->post_type ) && $post->post_type == 'wpi_item' && !wpinv_item_is_editable( $post ) ) {
232
-		$message = apply_filters( 'wpinv_item_non_editable_message', __( 'This item in not editable.', 'invoicing' ), $post->ID );
231
+    if ( $pagenow == 'post.php' && !empty( $post->post_type ) && $post->post_type == 'wpi_item' && !wpinv_item_is_editable( $post ) ) {
232
+        $message = apply_filters( 'wpinv_item_non_editable_message', __( 'This item in not editable.', 'invoicing' ), $post->ID );
233 233
 
234
-		if ( !empty( $message ) ) {
235
-			add_settings_error( 'wpinv-notices', 'wpinv-edit-n', $message, 'updated' );
236
-		}
237
-	}
234
+        if ( !empty( $message ) ) {
235
+            add_settings_error( 'wpinv-notices', 'wpinv-edit-n', $message, 'updated' );
236
+        }
237
+    }
238 238
 
239
-	settings_errors( 'wpinv-notices' );
239
+    settings_errors( 'wpinv-notices' );
240 240
 }
241 241
 add_action( 'admin_notices', 'wpinv_admin_messages' );
242 242
 
@@ -326,7 +326,7 @@  discard block
 block discarded – undo
326 326
         break;
327 327
         case 'id' :
328 328
            echo $post->ID;
329
-           echo '<div class="hidden" id="wpinv_inline-' . $post->ID . '">
329
+            echo '<div class="hidden" id="wpinv_inline-' . $post->ID . '">
330 330
                     <div class="price">' . wpinv_get_item_price( $post->ID ) . '</div>';
331 331
                     if ( $wpinv_euvat->allow_vat_rules() ) {
332 332
                         echo '<div class="vat_rule">' . $wpinv_euvat->get_item_rule( $post->ID ) . '</div>';
Please login to merge, or discard this patch.
includes/api/class-wpinv-rest-items-controller.php 1 patch
Indentation   +987 added lines, -987 removed lines patch added patch discarded remove patch
@@ -20,91 +20,91 @@  discard block
 block discarded – undo
20 20
 class WPInv_REST_Items_Controller extends WP_REST_Posts_Controller {
21 21
 
22 22
     /**
23
-	 * Post type.
24
-	 *
25
-	 * @var string
26
-	 */
27
-	protected $post_type = 'wpi_item';
23
+     * Post type.
24
+     *
25
+     * @var string
26
+     */
27
+    protected $post_type = 'wpi_item';
28 28
 	
29
-	/**
30
-	 * Cached results of get_item_schema.
31
-	 *
32
-	 * @since 1.0.13
33
-	 * @var array
34
-	 */
35
-	protected $schema;
29
+    /**
30
+     * Cached results of get_item_schema.
31
+     *
32
+     * @since 1.0.13
33
+     * @var array
34
+     */
35
+    protected $schema;
36 36
 
37 37
     /**
38
-	 * Constructor.
39
-	 *
40
-	 * @since 1.0.13
41
-	 *
42
-	 * @param string $namespace Api Namespace
43
-	 */
44
-	public function __construct( $namespace ) {
38
+     * Constructor.
39
+     *
40
+     * @since 1.0.13
41
+     *
42
+     * @param string $namespace Api Namespace
43
+     */
44
+    public function __construct( $namespace ) {
45 45
         
46 46
         // Set api namespace...
47
-		$this->namespace = $namespace;
47
+        $this->namespace = $namespace;
48 48
 
49 49
         // ... and the rest base
50 50
         $this->rest_base = 'items';
51 51
 		
52 52
     }
53 53
 	
54
-	/**
55
-	 * Registers the routes for the objects of the controller.
56
-	 *
57
-	 * @since 1.0.13
58
-	 *
59
-	 * @see register_rest_route()
60
-	 */
61
-	public function register_routes() {
62
-
63
-		parent::register_routes();
64
-
65
-		register_rest_route(
66
-			$this->namespace,
67
-			'/' . $this->rest_base . '/item-types',
68
-			array(
69
-				array(
70
-					'methods'             => WP_REST_Server::READABLE,
71
-					'callback'            => array( $this, 'get_item_types' ),
72
-				),
73
-			)
74
-		);
75
-
76
-	}
54
+    /**
55
+     * Registers the routes for the objects of the controller.
56
+     *
57
+     * @since 1.0.13
58
+     *
59
+     * @see register_rest_route()
60
+     */
61
+    public function register_routes() {
62
+
63
+        parent::register_routes();
64
+
65
+        register_rest_route(
66
+            $this->namespace,
67
+            '/' . $this->rest_base . '/item-types',
68
+            array(
69
+                array(
70
+                    'methods'             => WP_REST_Server::READABLE,
71
+                    'callback'            => array( $this, 'get_item_types' ),
72
+                ),
73
+            )
74
+        );
75
+
76
+    }
77 77
 
78 78
     /**
79
-	 * Checks if a given request has access to read items.
79
+     * Checks if a given request has access to read items.
80 80
      * 
81
-	 *
82
-	 * @since 1.0.13
83
-	 *
84
-	 * @param WP_REST_Request $request Full details about the request.
85
-	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
86
-	 */
87
-	public function get_items_permissions_check( $request ) {
81
+     *
82
+     * @since 1.0.13
83
+     *
84
+     * @param WP_REST_Request $request Full details about the request.
85
+     * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
86
+     */
87
+    public function get_items_permissions_check( $request ) {
88 88
 	
89
-		if ( current_user_can( 'manage_options' ) ||  current_user_can( 'manage_invoicing' ) ) {
90
-			return true;
91
-		}
89
+        if ( current_user_can( 'manage_options' ) ||  current_user_can( 'manage_invoicing' ) ) {
90
+            return true;
91
+        }
92 92
 
93
-		return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to view invoice items.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
93
+        return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to view invoice items.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
94 94
 
95 95
     }
96 96
     
97 97
     /**
98
-	 * Retrieves a collection of invoice items.
99
-	 *
100
-	 * @since 1.0.13
101
-	 *
102
-	 * @param WP_REST_Request $request Full details about the request.
103
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
104
-	 */
105
-	public function get_items( $request ) {
98
+     * Retrieves a collection of invoice items.
99
+     *
100
+     * @since 1.0.13
101
+     *
102
+     * @param WP_REST_Request $request Full details about the request.
103
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
104
+     */
105
+    public function get_items( $request ) {
106 106
 		
107
-		// Retrieve the list of registered item query parameters.
107
+        // Retrieve the list of registered item query parameters.
108 108
         $registered = $this->get_collection_params();
109 109
         
110 110
         $args       = array();
@@ -117,54 +117,54 @@  discard block
 block discarded – undo
117 117
 
118 118
         }
119 119
 
120
-		/**
121
-		 * Filters the wpinv_get_items arguments for items rest requests.
122
-		 *
123
-		 *
124
-		 * @since 1.0.13
125
-		 *
126
-		 *
127
-		 * @param array           $args    Key value array of query var to query value.
128
-		 * @param WP_REST_Request $request The request used.
129
-		 */
120
+        /**
121
+         * Filters the wpinv_get_items arguments for items rest requests.
122
+         *
123
+         *
124
+         * @since 1.0.13
125
+         *
126
+         *
127
+         * @param array           $args    Key value array of query var to query value.
128
+         * @param WP_REST_Request $request The request used.
129
+         */
130 130
         $args       = apply_filters( "wpinv_rest_get_items_arguments", $args, $request, $this );
131 131
 		
132
-		// Special args
133
-		$args[ 'return' ]   = 'objects';
134
-		$args[ 'paginate' ] = true;
132
+        // Special args
133
+        $args[ 'return' ]   = 'objects';
134
+        $args[ 'paginate' ] = true;
135 135
 
136 136
         // Run the query.
137
-		$query = wpinv_get_all_items( $args );
137
+        $query = wpinv_get_all_items( $args );
138 138
 		
139
-		// Prepare the retrieved items
140
-		$items = array();
141
-		foreach( $query->items as $item ) {
142
-
143
-			if ( ! $this->check_read_permission( $item ) ) {
144
-				continue;
145
-			}
146
-
147
-			$data       = $this->prepare_item_for_response( $item, $request );
148
-			$items[]    = $this->prepare_response_for_collection( $data );
149
-
150
-		}
151
-
152
-		// Prepare the response.
153
-		$response = rest_ensure_response( $items );
154
-		$response->header( 'X-WP-Total', (int) $query->total );
155
-		$response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
156
-
157
-		/**
158
-		 * Filters the responses for item requests.
159
-		 *
160
-		 *
161
-		 * @since 1.0.13
162
-		 *
163
-		 *
164
-		 * @param arrWP_REST_Response $response    Response object.
165
-		 * @param WP_REST_Request     $request The request used.
139
+        // Prepare the retrieved items
140
+        $items = array();
141
+        foreach( $query->items as $item ) {
142
+
143
+            if ( ! $this->check_read_permission( $item ) ) {
144
+                continue;
145
+            }
146
+
147
+            $data       = $this->prepare_item_for_response( $item, $request );
148
+            $items[]    = $this->prepare_response_for_collection( $data );
149
+
150
+        }
151
+
152
+        // Prepare the response.
153
+        $response = rest_ensure_response( $items );
154
+        $response->header( 'X-WP-Total', (int) $query->total );
155
+        $response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
156
+
157
+        /**
158
+         * Filters the responses for item requests.
159
+         *
160
+         *
161
+         * @since 1.0.13
162
+         *
163
+         *
164
+         * @param arrWP_REST_Response $response    Response object.
165
+         * @param WP_REST_Request     $request The request used.
166 166
          * @param array               $args Array of args used to retrieve the items
167
-		 */
167
+         */
168 168
         $response       = apply_filters( "wpinv_rest_items_response", $response, $request, $args );
169 169
 
170 170
         return rest_ensure_response( $response );
@@ -172,25 +172,25 @@  discard block
 block discarded – undo
172 172
     }
173 173
 
174 174
     /**
175
-	 * Get the post, if the ID is valid.
176
-	 *
177
-	 * @since 1.0.13
178
-	 *
179
-	 * @param int $item_id Supplied ID.
180
-	 * @return WPInv_Item|WP_Error Item object if ID is valid, WP_Error otherwise.
181
-	 */
182
-	protected function get_post( $item_id ) {
175
+     * Get the post, if the ID is valid.
176
+     *
177
+     * @since 1.0.13
178
+     *
179
+     * @param int $item_id Supplied ID.
180
+     * @return WPInv_Item|WP_Error Item object if ID is valid, WP_Error otherwise.
181
+     */
182
+    protected function get_post( $item_id ) {
183 183
 		
184
-		$error     = new WP_Error( 'rest_item_invalid_id', __( 'Invalid item ID.', 'invoicing' ), array( 'status' => 404 ) );
184
+        $error     = new WP_Error( 'rest_item_invalid_id', __( 'Invalid item ID.', 'invoicing' ), array( 'status' => 404 ) );
185 185
 
186 186
         // Ids start from 1
187 187
         if ( (int) $item_id <= 0 ) {
188
-			return $error;
189
-		}
188
+            return $error;
189
+        }
190 190
 
191
-		$item = wpinv_get_item_by( 'id', (int) $item_id );
192
-		if ( empty( $item ) ) {
193
-			return $error;
191
+        $item = wpinv_get_item_by( 'id', (int) $item_id );
192
+        if ( empty( $item ) ) {
193
+            return $error;
194 194
         }
195 195
 
196 196
         return $item;
@@ -198,27 +198,27 @@  discard block
 block discarded – undo
198 198
     }
199 199
 
200 200
     /**
201
-	 * Checks if a given request has access to read an invoice item.
202
-	 *
203
-	 * @since 1.0.13
204
-	 *
205
-	 * @param WP_REST_Request $request Full details about the request.
206
-	 * @return bool|WP_Error True if the request has read access for the invoice item, WP_Error object otherwise.
207
-	 */
208
-	public function get_item_permissions_check( $request ) {
201
+     * Checks if a given request has access to read an invoice item.
202
+     *
203
+     * @since 1.0.13
204
+     *
205
+     * @param WP_REST_Request $request Full details about the request.
206
+     * @return bool|WP_Error True if the request has read access for the invoice item, WP_Error object otherwise.
207
+     */
208
+    public function get_item_permissions_check( $request ) {
209 209
 
210 210
         // Retrieve the item object.
211 211
         $item = $this->get_post( $request['id'] );
212 212
         
213 213
         // Ensure it is valid.
214
-		if ( is_wp_error( $item ) ) {
215
-			return $item;
216
-		}
214
+        if ( is_wp_error( $item ) ) {
215
+            return $item;
216
+        }
217 217
 
218
-		$post_type = get_post_type_object( $this->post_type );
218
+        $post_type = get_post_type_object( $this->post_type );
219 219
 
220
-		if ( ! current_user_can(  $post_type->cap->read_post, $item->ID  ) ) {
221
-			return new WP_Error( 
220
+        if ( ! current_user_can(  $post_type->cap->read_post, $item->ID  ) ) {
221
+            return new WP_Error( 
222 222
                 'rest_cannot_edit', 
223 223
                 __( 'Sorry, you are not allowed to view this item.', 'invoicing' ), 
224 224
                 array( 
@@ -227,61 +227,61 @@  discard block
 block discarded – undo
227 227
             );
228 228
         }
229 229
 
230
-		return $this->check_read_permission( $item );
230
+        return $this->check_read_permission( $item );
231 231
     }
232 232
     
233 233
     /**
234
-	 * Checks if an item can be read.
235
-	 * 
236
-	 * An item can be read by site admins.
237
-	 *
238
-	 *
239
-	 * @since 1.0.13
240
-	 *
241
-	 * @param WPInv_Item $item WPInv_Item object.
242
-	 * @return bool Whether the post can be read.
243
-	 */
244
-	public function check_read_permission( $item ) {
245
-
246
-		// An item can be read by an admin...
247
-		if ( current_user_can( 'manage_options' ) ||  current_user_can( 'manage_invoicing' ) ) {
248
-			return true;
249
-		}
250
-
251
-		return false;
234
+     * Checks if an item can be read.
235
+     * 
236
+     * An item can be read by site admins.
237
+     *
238
+     *
239
+     * @since 1.0.13
240
+     *
241
+     * @param WPInv_Item $item WPInv_Item object.
242
+     * @return bool Whether the post can be read.
243
+     */
244
+    public function check_read_permission( $item ) {
245
+
246
+        // An item can be read by an admin...
247
+        if ( current_user_can( 'manage_options' ) ||  current_user_can( 'manage_invoicing' ) ) {
248
+            return true;
249
+        }
250
+
251
+        return false;
252 252
     }
253 253
     
254 254
     /**
255
-	 * Retrieves a single invoice item.
256
-	 *
257
-	 * @since 1.0.13
258
-	 *
259
-	 * @param WP_REST_Request $request Full details about the request.
260
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
261
-	 */
262
-	public function get_item( $request ) {
255
+     * Retrieves a single invoice item.
256
+     *
257
+     * @since 1.0.13
258
+     *
259
+     * @param WP_REST_Request $request Full details about the request.
260
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
261
+     */
262
+    public function get_item( $request ) {
263 263
 
264 264
         // Fetch the item.
265 265
         $item = $this->get_post( $request['id'] );
266 266
         
267 267
         // Abort early if it does not exist
268
-		if ( is_wp_error( $item ) ) {
269
-			return $item;
270
-		}
271
-
272
-		// Prepare the response
273
-		$response = $this->prepare_item_for_response( $item, $request );
274
-
275
-		/**
276
-		 * Filters the responses for single invoice item requests.
277
-		 *
278
-		 *
279
-		 * @since 1.0.13
280
-		 * @var WP_HTTP_Response
281
-		 *
282
-		 * @param WP_HTTP_Response $response Response.
283
-		 * @param WP_REST_Request  $request The request used.
284
-		 */
268
+        if ( is_wp_error( $item ) ) {
269
+            return $item;
270
+        }
271
+
272
+        // Prepare the response
273
+        $response = $this->prepare_item_for_response( $item, $request );
274
+
275
+        /**
276
+         * Filters the responses for single invoice item requests.
277
+         *
278
+         *
279
+         * @since 1.0.13
280
+         * @var WP_HTTP_Response
281
+         *
282
+         * @param WP_HTTP_Response $response Response.
283
+         * @param WP_REST_Request  $request The request used.
284
+         */
285 285
         $response       = apply_filters( "wpinv_rest_get_item_response", $response, $request );
286 286
 
287 287
         return rest_ensure_response( $response );
@@ -289,26 +289,26 @@  discard block
 block discarded – undo
289 289
     }
290 290
     
291 291
     /**
292
-	 * Checks if a given request has access to create an invoice item.
293
-	 *
294
-	 * @since 1.0.13
295
-	 *
296
-	 * @param WP_REST_Request $request Full details about the request.
297
-	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
298
-	 */
299
-	public function create_item_permissions_check( $request ) {
292
+     * Checks if a given request has access to create an invoice item.
293
+     *
294
+     * @since 1.0.13
295
+     *
296
+     * @param WP_REST_Request $request Full details about the request.
297
+     * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
298
+     */
299
+    public function create_item_permissions_check( $request ) {
300 300
 	
301
-		if ( ! empty( $request['id'] ) ) {
302
-			return new WP_Error( 'rest_item_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
303
-		}
301
+        if ( ! empty( $request['id'] ) ) {
302
+            return new WP_Error( 'rest_item_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
303
+        }
304 304
 
305
-		if ( current_user_can( 'manage_options' ) ||  current_user_can( 'manage_invoicing' ) ) {
306
-			return true;
307
-		}
305
+        if ( current_user_can( 'manage_options' ) ||  current_user_can( 'manage_invoicing' ) ) {
306
+            return true;
307
+        }
308 308
 
309
-		$post_type = get_post_type_object( $this->post_type );
310
-		if ( ! current_user_can( $post_type->cap->create_posts ) ) {
311
-			return new WP_Error( 
309
+        $post_type = get_post_type_object( $this->post_type );
310
+        if ( ! current_user_can( $post_type->cap->create_posts ) ) {
311
+            return new WP_Error( 
312 312
                 'rest_cannot_create', 
313 313
                 __( 'Sorry, you are not allowed to create invoice items as this user.', 'invoicing' ), 
314 314
                 array( 
@@ -317,253 +317,253 @@  discard block
 block discarded – undo
317 317
             );
318 318
         }
319 319
 
320
-		return true;
320
+        return true;
321 321
     }
322 322
     
323 323
     /**
324
-	 * Creates a single invoice item.
325
-	 *
326
-	 * @since 1.0.13
327
-	 *
328
-	 * @param WP_REST_Request $request Full details about the request.
329
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
330
-	 */
331
-	public function create_item( $request ) {
332
-
333
-		if ( ! empty( $request['id'] ) ) {
334
-			return new WP_Error( 'rest_item_exists', __( 'Cannot create existing invoice item.', 'invoicing' ), array( 'status' => 400 ) );
335
-		}
324
+     * Creates a single invoice item.
325
+     *
326
+     * @since 1.0.13
327
+     *
328
+     * @param WP_REST_Request $request Full details about the request.
329
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
330
+     */
331
+    public function create_item( $request ) {
332
+
333
+        if ( ! empty( $request['id'] ) ) {
334
+            return new WP_Error( 'rest_item_exists', __( 'Cannot create existing invoice item.', 'invoicing' ), array( 'status' => 400 ) );
335
+        }
336 336
 
337
-		$request->set_param( 'context', 'edit' );
337
+        $request->set_param( 'context', 'edit' );
338 338
 
339
-		// Prepare the updated data.
340
-		$item_data = $this->prepare_item_for_database( $request );
339
+        // Prepare the updated data.
340
+        $item_data = $this->prepare_item_for_database( $request );
341 341
 
342
-		if ( is_wp_error( $item_data ) ) {
343
-			return $item_data;
344
-		}
342
+        if ( is_wp_error( $item_data ) ) {
343
+            return $item_data;
344
+        }
345 345
 
346
-		// Try creating the item.
346
+        // Try creating the item.
347 347
         $item = wpinv_create_item( $item_data, true );
348 348
 
349
-		if ( is_wp_error( $item ) ) {
349
+        if ( is_wp_error( $item ) ) {
350 350
             return $item;
351
-		}
352
-
353
-		// Prepare the response
354
-		$response = $this->prepare_item_for_response( $item, $request );
355
-
356
-		/**
357
-		 * Fires after a single invoice item is created or updated via the REST API.
358
-		 *
359
-		 * @since 1.0.13
360
-		 *
361
-		 * @param WPinv_Item   $item  Inserted or updated item object.
362
-		 * @param WP_REST_Request $request  Request object.
363
-		 * @param bool            $creating True when creating a post, false when updating.
364
-		 */
365
-		do_action( "wpinv_rest_insert_item", $item, $request, true );
366
-
367
-		/**
368
-		 * Filters the responses for creating single item requests.
369
-		 *
370
-		 *
371
-		 * @since 1.0.13
372
-		 *
373
-		 *
374
-		 * @param array           $item_data Invoice properties.
375
-		 * @param WP_REST_Request $request The request used.
376
-		 */
351
+        }
352
+
353
+        // Prepare the response
354
+        $response = $this->prepare_item_for_response( $item, $request );
355
+
356
+        /**
357
+         * Fires after a single invoice item is created or updated via the REST API.
358
+         *
359
+         * @since 1.0.13
360
+         *
361
+         * @param WPinv_Item   $item  Inserted or updated item object.
362
+         * @param WP_REST_Request $request  Request object.
363
+         * @param bool            $creating True when creating a post, false when updating.
364
+         */
365
+        do_action( "wpinv_rest_insert_item", $item, $request, true );
366
+
367
+        /**
368
+         * Filters the responses for creating single item requests.
369
+         *
370
+         *
371
+         * @since 1.0.13
372
+         *
373
+         *
374
+         * @param array           $item_data Invoice properties.
375
+         * @param WP_REST_Request $request The request used.
376
+         */
377 377
         $response       = apply_filters( "wpinv_rest_create_item_response", $response, $request );
378 378
 
379 379
         return rest_ensure_response( $response );
380
-	}
381
-
382
-	/**
383
-	 * Checks if a given request has access to update an item.
384
-	 *
385
-	 * @since 1.0.13
386
-	 *
387
-	 * @param WP_REST_Request $request Full details about the request.
388
-	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
389
-	 */
390
-	public function update_item_permissions_check( $request ) {
391
-
392
-		// Retrieve the item.
393
-		$item = $this->get_post( $request['id'] );
394
-		if ( is_wp_error( $item ) ) {
395
-			return $item;
396
-		}
397
-
398
-		if ( wpinv_current_user_can_manage_invoicing() ) {
399
-			return true;
400
-		}
401
-
402
-		return new WP_Error( 
403
-			'rest_cannot_edit', 
404
-			__( 'Sorry, you are not allowed to update this item.', 'invoicing' ), 
405
-			array( 
406
-				'status' => rest_authorization_required_code(),
407
-			)
408
-		);
409
-
410
-	}
411
-
412
-	/**
413
-	 * Updates a single item.
414
-	 *
415
-	 * @since 1.0.13
416
-	 *
417
-	 * @param WP_REST_Request $request Full details about the request.
418
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
419
-	 */
420
-	public function update_item( $request ) {
380
+    }
381
+
382
+    /**
383
+     * Checks if a given request has access to update an item.
384
+     *
385
+     * @since 1.0.13
386
+     *
387
+     * @param WP_REST_Request $request Full details about the request.
388
+     * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
389
+     */
390
+    public function update_item_permissions_check( $request ) {
391
+
392
+        // Retrieve the item.
393
+        $item = $this->get_post( $request['id'] );
394
+        if ( is_wp_error( $item ) ) {
395
+            return $item;
396
+        }
397
+
398
+        if ( wpinv_current_user_can_manage_invoicing() ) {
399
+            return true;
400
+        }
401
+
402
+        return new WP_Error( 
403
+            'rest_cannot_edit', 
404
+            __( 'Sorry, you are not allowed to update this item.', 'invoicing' ), 
405
+            array( 
406
+                'status' => rest_authorization_required_code(),
407
+            )
408
+        );
409
+
410
+    }
411
+
412
+    /**
413
+     * Updates a single item.
414
+     *
415
+     * @since 1.0.13
416
+     *
417
+     * @param WP_REST_Request $request Full details about the request.
418
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
419
+     */
420
+    public function update_item( $request ) {
421 421
 		
422
-		// Ensure the item exists.
422
+        // Ensure the item exists.
423 423
         $valid_check = $this->get_post( $request['id'] );
424 424
         
425 425
         // Abort early if it does not exist
426
-		if ( is_wp_error( $valid_check ) ) {
427
-			return $valid_check;
428
-		}
426
+        if ( is_wp_error( $valid_check ) ) {
427
+            return $valid_check;
428
+        }
429 429
 
430
-		$request->set_param( 'context', 'edit' );
430
+        $request->set_param( 'context', 'edit' );
431 431
 
432
-		// Prepare the updated data.
433
-		$data_to_update = $this->prepare_item_for_database( $request );
432
+        // Prepare the updated data.
433
+        $data_to_update = $this->prepare_item_for_database( $request );
434 434
 
435
-		if ( is_wp_error( $data_to_update ) ) {
436
-			return $data_to_update;
437
-		}
435
+        if ( is_wp_error( $data_to_update ) ) {
436
+            return $data_to_update;
437
+        }
438 438
 
439
-		// Abort if no item data is provided
439
+        // Abort if no item data is provided
440 440
         if( empty( $data_to_update ) ) {
441 441
             return new WP_Error( 'missing_data', __( 'An update request cannot be empty.', 'invoicing' ) );
442 442
         }
443 443
 
444
-		// Include the item ID
445
-		$data_to_update['ID'] = $request['id'];
446
-
447
-		// Update the item
448
-		$updated_item = wpinv_update_item( $data_to_update, true );
449
-
450
-		// Incase the update operation failed...
451
-		if ( is_wp_error( $updated_item ) ) {
452
-			return $updated_item;
453
-		}
454
-
455
-		// Prepare the response
456
-		$response = $this->prepare_item_for_response( $updated_item, $request );
457
-
458
-		/** This action is documented in includes/class-wpinv-rest-item-controller.php */
459
-		do_action( "wpinv_rest_insert_item", $updated_item, $request, false );
460
-
461
-		/**
462
-		 * Filters the responses for updating single item requests.
463
-		 *
464
-		 *
465
-		 * @since 1.0.13
466
-		 *
467
-		 *
468
-		 * @param array           $data_to_update Item properties.
469
-		 * @param WP_REST_Request $request The request used.
470
-		 */
444
+        // Include the item ID
445
+        $data_to_update['ID'] = $request['id'];
446
+
447
+        // Update the item
448
+        $updated_item = wpinv_update_item( $data_to_update, true );
449
+
450
+        // Incase the update operation failed...
451
+        if ( is_wp_error( $updated_item ) ) {
452
+            return $updated_item;
453
+        }
454
+
455
+        // Prepare the response
456
+        $response = $this->prepare_item_for_response( $updated_item, $request );
457
+
458
+        /** This action is documented in includes/class-wpinv-rest-item-controller.php */
459
+        do_action( "wpinv_rest_insert_item", $updated_item, $request, false );
460
+
461
+        /**
462
+         * Filters the responses for updating single item requests.
463
+         *
464
+         *
465
+         * @since 1.0.13
466
+         *
467
+         *
468
+         * @param array           $data_to_update Item properties.
469
+         * @param WP_REST_Request $request The request used.
470
+         */
471 471
         $response       = apply_filters( "wpinv_rest_update_item_response", $response,  $data_to_update, $request );
472 472
 
473 473
         return rest_ensure_response( $response );
474
-	}
475
-
476
-	/**
477
-	 * Checks if a given request has access to delete an item.
478
-	 *
479
-	 * @since 1.0.13
480
-	 *
481
-	 * @param WP_REST_Request $request Full details about the request.
482
-	 * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
483
-	 */
484
-	public function delete_item_permissions_check( $request ) {
485
-
486
-		// Retrieve the item.
487
-		$item = $this->get_post( $request['id'] );
488
-		if ( is_wp_error( $item ) ) {
489
-			return $item;
490
-		}
491
-
492
-		// 
493
-
494
-		// Ensure the current user can delete the item
495
-		if (! wpinv_can_delete_item( $request['id'] ) ) {
496
-			return new WP_Error( 
474
+    }
475
+
476
+    /**
477
+     * Checks if a given request has access to delete an item.
478
+     *
479
+     * @since 1.0.13
480
+     *
481
+     * @param WP_REST_Request $request Full details about the request.
482
+     * @return true|WP_Error True if the request has access to delete the item, WP_Error object otherwise.
483
+     */
484
+    public function delete_item_permissions_check( $request ) {
485
+
486
+        // Retrieve the item.
487
+        $item = $this->get_post( $request['id'] );
488
+        if ( is_wp_error( $item ) ) {
489
+            return $item;
490
+        }
491
+
492
+        // 
493
+
494
+        // Ensure the current user can delete the item
495
+        if (! wpinv_can_delete_item( $request['id'] ) ) {
496
+            return new WP_Error( 
497 497
                 'rest_cannot_delete', 
498 498
                 __( 'Sorry, you are not allowed to delete this item.', 'invoicing' ), 
499 499
                 array( 
500 500
                     'status' => rest_authorization_required_code(),
501 501
                 )
502 502
             );
503
-		}
504
-
505
-		return true;
506
-	}
507
-
508
-	/**
509
-	 * Deletes a single item.
510
-	 *
511
-	 * @since 1.0.13
512
-	 *
513
-	 * @param WP_REST_Request $request Full details about the request.
514
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
515
-	 */
516
-	public function delete_item( $request ) {
503
+        }
504
+
505
+        return true;
506
+    }
507
+
508
+    /**
509
+     * Deletes a single item.
510
+     *
511
+     * @since 1.0.13
512
+     *
513
+     * @param WP_REST_Request $request Full details about the request.
514
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
515
+     */
516
+    public function delete_item( $request ) {
517 517
 		
518
-		// Retrieve the item.
519
-		$item = $this->get_post( $request['id'] );
520
-		if ( is_wp_error( $item ) ) {
521
-			return $item;
522
-		}
518
+        // Retrieve the item.
519
+        $item = $this->get_post( $request['id'] );
520
+        if ( is_wp_error( $item ) ) {
521
+            return $item;
522
+        }
523 523
 
524
-		$request->set_param( 'context', 'edit' );
524
+        $request->set_param( 'context', 'edit' );
525 525
 
526
-		// Prepare the item id
527
-		$id    = $item->ID;
526
+        // Prepare the item id
527
+        $id    = $item->ID;
528 528
 
529
-		// Prepare the response
530
-		$response = $this->prepare_item_for_response( $item, $request );
529
+        // Prepare the response
530
+        $response = $this->prepare_item_for_response( $item, $request );
531 531
 
532
-		// Check if the user wants to bypass the trash...
533
-		$force_delete = (bool) $request['force'];
532
+        // Check if the user wants to bypass the trash...
533
+        $force_delete = (bool) $request['force'];
534 534
 
535
-		// Try deleting the item.
536
-		$deleted = wp_delete_post( $id, $force_delete );
535
+        // Try deleting the item.
536
+        $deleted = wp_delete_post( $id, $force_delete );
537 537
 
538
-		// Abort early if we can't delete the item.
539
-		if ( ! $deleted ) {
540
-			return new WP_Error( 'rest_cannot_delete', __( 'The item cannot be deleted.', 'invoicing' ), array( 'status' => 500 ) );
541
-		}
538
+        // Abort early if we can't delete the item.
539
+        if ( ! $deleted ) {
540
+            return new WP_Error( 'rest_cannot_delete', __( 'The item cannot be deleted.', 'invoicing' ), array( 'status' => 500 ) );
541
+        }
542 542
 
543
-		/**
544
-		 * Fires immediately after a single item is deleted or trashed via the REST API.
545
-		 *
546
-		 *
547
-		 * @since 1.0.13
548
-		 *
549
-		 * @param WPInv_Item    $item  The deleted or trashed item.
550
-		 * @param WP_REST_Request  $request  The request sent to the API.
551
-		 */
552
-		do_action( "wpinv_rest_delete_item", $item, $request );
543
+        /**
544
+         * Fires immediately after a single item is deleted or trashed via the REST API.
545
+         *
546
+         *
547
+         * @since 1.0.13
548
+         *
549
+         * @param WPInv_Item    $item  The deleted or trashed item.
550
+         * @param WP_REST_Request  $request  The request sent to the API.
551
+         */
552
+        do_action( "wpinv_rest_delete_item", $item, $request );
553 553
 
554
-		return $response;
554
+        return $response;
555 555
 
556
-	}
556
+    }
557 557
     
558 558
     
559 559
     /**
560
-	 * Retrieves the query params for the items collection.
561
-	 *
562
-	 * @since 1.0.13
563
-	 *
564
-	 * @return array Collection parameters.
565
-	 */
566
-	public function get_collection_params() {
560
+     * Retrieves the query params for the items collection.
561
+     *
562
+     * @since 1.0.13
563
+     *
564
+     * @return array Collection parameters.
565
+     */
566
+    public function get_collection_params() {
567 567
         
568 568
         $query_params               = array(
569 569
 
@@ -577,27 +577,27 @@  discard block
 block discarded – undo
577 577
             
578 578
             // Item types
579 579
             'type'                  => array(
580
-				'description'       => __( 'Type of items to fetch.', 'invoicing' ),
581
-				'type'              => 'array',
582
-				'default'           => wpinv_item_types(),
583
-				'items'             => array(
580
+                'description'       => __( 'Type of items to fetch.', 'invoicing' ),
581
+                'type'              => 'array',
582
+                'default'           => wpinv_item_types(),
583
+                'items'             => array(
584 584
                     'enum'          => wpinv_item_types(),
585 585
                     'type'          => 'string',
586 586
                 ),
587
-			),
587
+            ),
588 588
 			
589
-			// Number of results per page
589
+            // Number of results per page
590 590
             'limit'                 => array(
591
-				'description'       => __( 'Number of items to fetch.', 'invoicing' ),
592
-				'type'              => 'integer',
593
-				'default'           => (int) get_option( 'posts_per_page' ),
591
+                'description'       => __( 'Number of items to fetch.', 'invoicing' ),
592
+                'type'              => 'integer',
593
+                'default'           => (int) get_option( 'posts_per_page' ),
594 594
             ),
595 595
 
596 596
             // Pagination
597 597
             'page'     => array(
598
-				'description'       => __( 'Current page to fetch.', 'invoicing' ),
599
-				'type'              => 'integer',
600
-				'default'           => 1,
598
+                'description'       => __( 'Current page to fetch.', 'invoicing' ),
599
+                'type'              => 'integer',
600
+                'default'           => 1,
601 601
             ),
602 602
 
603 603
             // Exclude certain items
@@ -620,9 +620,9 @@  discard block
 block discarded – undo
620 620
                     'date',
621 621
                     'ID',
622 622
                     'modified',
623
-					'title',
624
-					'relevance',
625
-					'rand'
623
+                    'title',
624
+                    'relevance',
625
+                    'rand'
626 626
                 ),
627 627
             ),
628 628
 
@@ -632,617 +632,617 @@  discard block
 block discarded – undo
632 632
                 'type'        => 'string',
633 633
                 'default'     => 'DESC',
634 634
                 'enum'        => array( 'ASC', 'DESC' ),
635
-			),
635
+            ),
636 636
 			
637
-			// Search term
637
+            // Search term
638 638
             'search'                => array(
639
-				'description'       => __( 'Return items that match the search term.', 'invoicing' ),
640
-				'type'              => 'string',
639
+                'description'       => __( 'Return items that match the search term.', 'invoicing' ),
640
+                'type'              => 'string',
641 641
             ),
642 642
         );
643 643
 
644
-		/**
645
-		 * Filter collection parameters for the items controller.
646
-		 *
647
-		 *
648
-		 * @since 1.0.13
649
-		 *
650
-		 * @param array        $query_params JSON Schema-formatted collection parameters.
651
-		 */
652
-		return apply_filters( "wpinv_rest_items_collection_params", $query_params );
644
+        /**
645
+         * Filter collection parameters for the items controller.
646
+         *
647
+         *
648
+         * @since 1.0.13
649
+         *
650
+         * @param array        $query_params JSON Schema-formatted collection parameters.
651
+         */
652
+        return apply_filters( "wpinv_rest_items_collection_params", $query_params );
653 653
     }
654 654
     
655 655
     /**
656
-	 * Checks if a given post type can be viewed or managed.
657
-	 *
658
-	 * @since 1.0.13
659
-	 *
660
-	 * @param object|string $post_type Post type name or object.
661
-	 * @return bool Whether the post type is allowed in REST.
662
-	 */
663
-	protected function check_is_post_type_allowed( $post_type ) {
664
-		return true;
665
-	}
666
-
667
-	/**
668
-	 * Prepares a single item for create or update.
669
-	 *
670
-	 * @since 1.0.13
671
-	 *
672
-	 * @param WP_REST_Request $request Request object.
673
-	 * @return array|WP_Error Invoice Properties or WP_Error.
674
-	 */
675
-	protected function prepare_item_for_database( $request ) {
676
-		$prepared_item = new stdClass();
677
-
678
-		// Post ID.
679
-		if ( isset( $request['id'] ) ) {
680
-			$existing_item = $this->get_post( $request['id'] );
681
-			if ( is_wp_error( $existing_item ) ) {
682
-				return $existing_item;
683
-			}
684
-
685
-			$prepared_item->ID 		  = $existing_item->ID;
686
-		}
687
-
688
-		$schema = $this->get_item_schema();
689
-
690
-		// item title.
691
-		if ( ! empty( $schema['properties']['name'] ) && isset( $request['name'] ) ) {
692
-			$prepared_item->title = sanitize_text_field( $request['name'] );
693
-		}
694
-
695
-		// item summary.
696
-		if ( ! empty( $schema['properties']['summary'] ) && isset( $request['summary'] ) ) {
697
-			$prepared_item->excerpt = wp_kses_post( $request['summary'] );
698
-		}
699
-
700
-		// item price.
701
-		if ( ! empty( $schema['properties']['price'] ) && isset( $request['price'] ) ) {
702
-			$prepared_item->price = floatval( $request['price'] );
703
-		}
704
-
705
-		// minimum price (for dynamc items).
706
-		if ( ! empty( $schema['properties']['minimum_price'] ) && isset( $request['minimum_price'] ) ) {
707
-			$prepared_item->minimum_price = floatval( $request['minimum_price'] );
708
-		}
709
-
710
-		// item status.
711
-		if ( ! empty( $schema['properties']['status'] ) && isset( $request['status'] ) ) {
712
-			$prepared_item->status = 'publish' === $request['status'] ? 'publish' : 'pending';
713
-		}
714
-
715
-		// item type.
716
-		if ( ! empty( $schema['properties']['type'] ) && isset( $request['type'] ) ) {
717
-			$prepared_item->type = in_array( $request['type'], wpinv_item_types() ) ? trim( strtolower( $request['type'] ) ) : 'custom';
718
-		}
719
-
720
-		// VAT rule.
721
-		if ( ! empty( $schema['properties']['vat_rule'] ) && isset( $request['vat_rule'] ) ) {
722
-			$prepared_item->vat_rule = 'digital' === $request['vat_rule'] ? 'digital' : 'physical';
723
-		}
724
-
725
-		// Simple strings.
726
-		foreach( array( 'custom_id', 'custom_name', 'custom_singular_name' ) as $property ) {
727
-
728
-			if ( ! empty( $schema['properties'][$property] ) && isset( $request[$property] ) ) {
729
-				$prepared_item->$property = sanitize_text_field( $request[$property] );
730
-			}
731
-
732
-		}
733
-
734
-		// Simple integers.
735
-		foreach( array( 'is_recurring', 'recurring_interval', 'recurring_limit', 'free_trial', 'trial_interval', 'dynamic_pricing', 'editable' ) as $property ) {
736
-
737
-			if ( ! empty( $schema['properties'][$property] ) && isset( $request[$property] ) ) {
738
-				$prepared_item->$property = intval( $request[$property] );
739
-			}
740
-
741
-		}
742
-
743
-		// Time periods.
744
-		foreach( array( 'recurring_period',  'trial_period' ) as $property ) {
745
-
746
-			if ( ! empty( $schema['properties'][$property] ) && isset( $request[$property] ) ) {
747
-				$prepared_item->$property = in_array( $request[$property], array( 'D', 'W', 'M', 'Y' ) ) ? trim( strtoupper( $request[$property] ) ) : 'D';
748
-			}
749
-
750
-		}
751
-
752
-		$item_data = (array) wp_unslash( $prepared_item );
753
-
754
-		/**
755
-		 * Filters an item before it is inserted via the REST API.
756
-		 *
757
-		 * @since 1.0.13
758
-		 *
759
-		 * @param array        $item_data An array of item data
760
-		 * @param WP_REST_Request $request       Request object.
761
-		 */
762
-		return apply_filters( "wpinv_rest_pre_insert_item", $item_data, $request );
763
-
764
-	}
765
-
766
-	/**
767
-	 * Prepares a single item output for response.
768
-	 *
769
-	 * @since 1.0.13
770
-	 *
771
-	 * @param WPInv_Item   $item    item object.
772
-	 * @param WP_REST_Request $request Request object.
773
-	 * @return WP_REST_Response Response object.
774
-	 */
775
-	public function prepare_item_for_response( $item, $request ) {
656
+     * Checks if a given post type can be viewed or managed.
657
+     *
658
+     * @since 1.0.13
659
+     *
660
+     * @param object|string $post_type Post type name or object.
661
+     * @return bool Whether the post type is allowed in REST.
662
+     */
663
+    protected function check_is_post_type_allowed( $post_type ) {
664
+        return true;
665
+    }
776 666
 
777
-		$GLOBALS['post'] = get_post( $item->get_ID() );
667
+    /**
668
+     * Prepares a single item for create or update.
669
+     *
670
+     * @since 1.0.13
671
+     *
672
+     * @param WP_REST_Request $request Request object.
673
+     * @return array|WP_Error Invoice Properties or WP_Error.
674
+     */
675
+    protected function prepare_item_for_database( $request ) {
676
+        $prepared_item = new stdClass();
677
+
678
+        // Post ID.
679
+        if ( isset( $request['id'] ) ) {
680
+            $existing_item = $this->get_post( $request['id'] );
681
+            if ( is_wp_error( $existing_item ) ) {
682
+                return $existing_item;
683
+            }
778 684
 
779
-		setup_postdata( $item->get_ID() );
685
+            $prepared_item->ID 		  = $existing_item->ID;
686
+        }
780 687
 
781
-		// Fetch the fields to include in this response.
782
-		$fields = $this->get_fields_for_response( $request );
688
+        $schema = $this->get_item_schema();
783 689
 
784
-		// Base fields for every item.
785
-		$data = array();
690
+        // item title.
691
+        if ( ! empty( $schema['properties']['name'] ) && isset( $request['name'] ) ) {
692
+            $prepared_item->title = sanitize_text_field( $request['name'] );
693
+        }
786 694
 
787
-		// Set up ID
788
-		if ( rest_is_field_included( 'id', $fields ) ) {
789
-			$data['id'] = $item->get_ID();
790
-		}
695
+        // item summary.
696
+        if ( ! empty( $schema['properties']['summary'] ) && isset( $request['summary'] ) ) {
697
+            $prepared_item->excerpt = wp_kses_post( $request['summary'] );
698
+        }
791 699
 
700
+        // item price.
701
+        if ( ! empty( $schema['properties']['price'] ) && isset( $request['price'] ) ) {
702
+            $prepared_item->price = floatval( $request['price'] );
703
+        }
792 704
 
793
-		// Item properties
794
-		$item_properties = array(
795
-			'name', 'summary', 'price', 'status', 'type',
796
-			'vat_rule', 'vat_class',
797
-			'custom_id', 'custom_name', 'custom_singular_name', 
798
-			'editable'
799
-		);
705
+        // minimum price (for dynamc items).
706
+        if ( ! empty( $schema['properties']['minimum_price'] ) && isset( $request['minimum_price'] ) ) {
707
+            $prepared_item->minimum_price = floatval( $request['minimum_price'] );
708
+        }
709
+
710
+        // item status.
711
+        if ( ! empty( $schema['properties']['status'] ) && isset( $request['status'] ) ) {
712
+            $prepared_item->status = 'publish' === $request['status'] ? 'publish' : 'pending';
713
+        }
800 714
 
801
-		foreach( $item_properties as $property ) {
715
+        // item type.
716
+        if ( ! empty( $schema['properties']['type'] ) && isset( $request['type'] ) ) {
717
+            $prepared_item->type = in_array( $request['type'], wpinv_item_types() ) ? trim( strtolower( $request['type'] ) ) : 'custom';
718
+        }
802 719
 
803
-			if ( rest_is_field_included( $property, $fields ) && method_exists( $item, 'get_' . $property ) ) {
804
-				$data[$property] = call_user_func( array( $item, 'get_' . $property ) );
805
-			}
720
+        // VAT rule.
721
+        if ( ! empty( $schema['properties']['vat_rule'] ) && isset( $request['vat_rule'] ) ) {
722
+            $prepared_item->vat_rule = 'digital' === $request['vat_rule'] ? 'digital' : 'physical';
723
+        }
806 724
 
807
-		}
725
+        // Simple strings.
726
+        foreach( array( 'custom_id', 'custom_name', 'custom_singular_name' ) as $property ) {
808 727
 
809
-		// Dynamic pricing.
810
-		if( $item->supports_dynamic_pricing() ) {
728
+            if ( ! empty( $schema['properties'][$property] ) && isset( $request[$property] ) ) {
729
+                $prepared_item->$property = sanitize_text_field( $request[$property] );
730
+            }
811 731
 
812
-			if( rest_is_field_included( 'dynamic_pricing', $fields ) ) {
813
-				$data['dynamic_pricing'] = $item->get_is_dynamic_pricing();
814
-			}
732
+        }
815 733
 
816
-			if( rest_is_field_included( 'minimum_price', $fields ) ) {
817
-				$data['minimum_price'] = $item->get_minimum_price();
818
-			}
819
-		}
734
+        // Simple integers.
735
+        foreach( array( 'is_recurring', 'recurring_interval', 'recurring_limit', 'free_trial', 'trial_interval', 'dynamic_pricing', 'editable' ) as $property ) {
820 736
 
821
-		// Subscriptions.
822
-		if( rest_is_field_included( 'is_recurring', $fields ) ) {
823
-			$data['is_recurring'] = $item->get_is_recurring();
824
-		}
737
+            if ( ! empty( $schema['properties'][$property] ) && isset( $request[$property] ) ) {
738
+                $prepared_item->$property = intval( $request[$property] );
739
+            }
825 740
 
826
-		if( $item->is_recurring() ) {
741
+        }
827 742
 
828
-			$recurring_fields = array( 'is_recurring', 'recurring_period', 'recurring_interval', 'recurring_limit', 'free_trial' );
829
-			foreach( $recurring_fields as $field ) {
743
+        // Time periods.
744
+        foreach( array( 'recurring_period',  'trial_period' ) as $property ) {
830 745
 
831
-				if ( rest_is_field_included( $field, $fields ) && method_exists( $item, 'get_' . $field ) ) {
832
-					$data[$field] = call_user_func( array( $item, 'get_' . $field ) );
833
-				}
746
+            if ( ! empty( $schema['properties'][$property] ) && isset( $request[$property] ) ) {
747
+                $prepared_item->$property = in_array( $request[$property], array( 'D', 'W', 'M', 'Y' ) ) ? trim( strtoupper( $request[$property] ) ) : 'D';
748
+            }
749
+
750
+        }
751
+
752
+        $item_data = (array) wp_unslash( $prepared_item );
753
+
754
+        /**
755
+         * Filters an item before it is inserted via the REST API.
756
+         *
757
+         * @since 1.0.13
758
+         *
759
+         * @param array        $item_data An array of item data
760
+         * @param WP_REST_Request $request       Request object.
761
+         */
762
+        return apply_filters( "wpinv_rest_pre_insert_item", $item_data, $request );
763
+
764
+    }
765
+
766
+    /**
767
+     * Prepares a single item output for response.
768
+     *
769
+     * @since 1.0.13
770
+     *
771
+     * @param WPInv_Item   $item    item object.
772
+     * @param WP_REST_Request $request Request object.
773
+     * @return WP_REST_Response Response object.
774
+     */
775
+    public function prepare_item_for_response( $item, $request ) {
776
+
777
+        $GLOBALS['post'] = get_post( $item->get_ID() );
778
+
779
+        setup_postdata( $item->get_ID() );
780
+
781
+        // Fetch the fields to include in this response.
782
+        $fields = $this->get_fields_for_response( $request );
783
+
784
+        // Base fields for every item.
785
+        $data = array();
786
+
787
+        // Set up ID
788
+        if ( rest_is_field_included( 'id', $fields ) ) {
789
+            $data['id'] = $item->get_ID();
790
+        }
791
+
792
+
793
+        // Item properties
794
+        $item_properties = array(
795
+            'name', 'summary', 'price', 'status', 'type',
796
+            'vat_rule', 'vat_class',
797
+            'custom_id', 'custom_name', 'custom_singular_name', 
798
+            'editable'
799
+        );
800
+
801
+        foreach( $item_properties as $property ) {
802
+
803
+            if ( rest_is_field_included( $property, $fields ) && method_exists( $item, 'get_' . $property ) ) {
804
+                $data[$property] = call_user_func( array( $item, 'get_' . $property ) );
805
+            }
806
+
807
+        }
808
+
809
+        // Dynamic pricing.
810
+        if( $item->supports_dynamic_pricing() ) {
811
+
812
+            if( rest_is_field_included( 'dynamic_pricing', $fields ) ) {
813
+                $data['dynamic_pricing'] = $item->get_is_dynamic_pricing();
814
+            }
815
+
816
+            if( rest_is_field_included( 'minimum_price', $fields ) ) {
817
+                $data['minimum_price'] = $item->get_minimum_price();
818
+            }
819
+        }
820
+
821
+        // Subscriptions.
822
+        if( rest_is_field_included( 'is_recurring', $fields ) ) {
823
+            $data['is_recurring'] = $item->get_is_recurring();
824
+        }
825
+
826
+        if( $item->is_recurring() ) {
827
+
828
+            $recurring_fields = array( 'is_recurring', 'recurring_period', 'recurring_interval', 'recurring_limit', 'free_trial' );
829
+            foreach( $recurring_fields as $field ) {
830
+
831
+                if ( rest_is_field_included( $field, $fields ) && method_exists( $item, 'get_' . $field ) ) {
832
+                    $data[$field] = call_user_func( array( $item, 'get_' . $field ) );
833
+                }
834 834
 	
835
-			}
835
+            }
836 836
 
837
-			if( $item->has_free_trial() ) {
837
+            if( $item->has_free_trial() ) {
838 838
 
839
-				$trial_fields = array( 'trial_period', 'trial_interval' );
840
-				foreach( $trial_fields as $field ) {
839
+                $trial_fields = array( 'trial_period', 'trial_interval' );
840
+                foreach( $trial_fields as $field ) {
841 841
 
842
-					if ( rest_is_field_included( $field, $fields ) && method_exists( $item, 'get_' . $field ) ) {
843
-						$data[$field] = call_user_func( array( $item, 'get_' . $field ) );
844
-					}
842
+                    if ( rest_is_field_included( $field, $fields ) && method_exists( $item, 'get_' . $field ) ) {
843
+                        $data[$field] = call_user_func( array( $item, 'get_' . $field ) );
844
+                    }
845 845
 	
846
-				}
847
-
848
-			}
849
-
850
-		}
851
-
852
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
853
-		$data    = $this->add_additional_fields_to_object( $data, $request );
854
-		$data    = $this->filter_response_by_context( $data, $context );
855
-
856
-		// Wrap the data in a response object.
857
-		$response = rest_ensure_response( $data );
858
-
859
-		$links = $this->prepare_links( $item );
860
-		$response->add_links( $links );
861
-
862
-		if ( ! empty( $links['self']['href'] ) ) {
863
-			$actions = $this->get_available_actions( $item, $request );
864
-
865
-			$self = $links['self']['href'];
866
-
867
-			foreach ( $actions as $rel ) {
868
-				$response->add_link( $rel, $self );
869
-			}
870
-		}
871
-
872
-		/**
873
-		 * Filters the item data for a response.
874
-		 *
875
-		 * @since 1.0.13
876
-		 *
877
-		 * @param WP_REST_Response $response The response object.
878
-		 * @param WPInv_Item    $item  The item object.
879
-		 * @param WP_REST_Request  $request  Request object.
880
-		 */
881
-		return apply_filters( "wpinv_rest_prepare_item", $response, $item, $request );
882
-	}
883
-
884
-	/**
885
-	 * Gets an array of fields to be included on the response.
886
-	 *
887
-	 * Included fields are based on item schema and `_fields=` request argument.
888
-	 *
889
-	 * @since 1.0.13
890
-	 *
891
-	 * @param WP_REST_Request $request Full details about the request.
892
-	 * @return array Fields to be included in the response.
893
-	 */
894
-	public function get_fields_for_response( $request ) {
895
-		$schema     = $this->get_item_schema();
896
-		$properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
897
-
898
-		$additional_fields = $this->get_additional_fields();
899
-		foreach ( $additional_fields as $field_name => $field_options ) {
900
-			// For back-compat, include any field with an empty schema
901
-			// because it won't be present in $this->get_item_schema().
902
-			if ( is_null( $field_options['schema'] ) ) {
903
-				$properties[ $field_name ] = $field_options;
904
-			}
905
-		}
906
-
907
-		// Exclude fields that specify a different context than the request context.
908
-		$context = $request['context'];
909
-		if ( $context ) {
910
-			foreach ( $properties as $name => $options ) {
911
-				if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
912
-					unset( $properties[ $name ] );
913
-				}
914
-			}
915
-		}
916
-
917
-		$fields = array_keys( $properties );
918
-
919
-		if ( ! isset( $request['_fields'] ) ) {
920
-			return $fields;
921
-		}
922
-		$requested_fields = wpinv_parse_list( $request['_fields'] );
923
-		if ( 0 === count( $requested_fields ) ) {
924
-			return $fields;
925
-		}
926
-		// Trim off outside whitespace from the comma delimited list.
927
-		$requested_fields = array_map( 'trim', $requested_fields );
928
-		// Always persist 'id', because it can be needed for add_additional_fields_to_object().
929
-		if ( in_array( 'id', $fields, true ) ) {
930
-			$requested_fields[] = 'id';
931
-		}
932
-		// Return the list of all requested fields which appear in the schema.
933
-		return array_reduce(
934
-			$requested_fields,
935
-			function( $response_fields, $field ) use ( $fields ) {
936
-				if ( in_array( $field, $fields, true ) ) {
937
-					$response_fields[] = $field;
938
-					return $response_fields;
939
-				}
940
-				// Check for nested fields if $field is not a direct match.
941
-				$nested_fields = explode( '.', $field );
942
-				// A nested field is included so long as its top-level property is
943
-				// present in the schema.
944
-				if ( in_array( $nested_fields[0], $fields, true ) ) {
945
-					$response_fields[] = $field;
946
-				}
947
-				return $response_fields;
948
-			},
949
-			array()
950
-		);
951
-	}
952
-
953
-	/**
954
-	 * Retrieves the item's schema, conforming to JSON Schema.
955
-	 *
956
-	 * @since 1.0.13
957
-	 *
958
-	 * @return array Item schema data.
959
-	 */
960
-	public function get_item_schema() {
961
-
962
-		// Maybe retrieve the schema from cache.
963
-		if ( $this->schema ) {
964
-			return $this->add_additional_fields_schema( $this->schema );
965
-		}
966
-
967
-		$schema = array(
968
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
969
-			'title'      => $this->post_type,
970
-			'type'       => 'object',
971
-
972
-			// Base properties for every Item.
973
-			'properties' 		  => array(
974
-
975
-				'id'           => array(
976
-					'description' => __( 'Unique identifier for the item.', 'invoicing' ),
977
-					'type'        => 'integer',
978
-					'context'     => array( 'view', 'edit', 'embed' ),
979
-					'readonly'    => true,
980
-				),
981
-
982
-				'name'			  => array(
983
-					'description' => __( 'The name for the item.', 'invoicing' ),
984
-					'type'        => 'string',
985
-					'context'     => array( 'view', 'edit', 'embed' ),
986
-				),
987
-
988
-				'summary'        => array(
989
-					'description' => __( 'A summary for the item.', 'invoicing' ),
990
-					'type'        => 'string',
991
-					'context'     => array( 'view', 'edit', 'embed' ),
992
-				),
993
-
994
-				'price'        => array(
995
-					'description' => __( 'The price for the item.', 'invoicing' ),
996
-					'type'        => 'number',
997
-					'context'     => array( 'view', 'edit', 'embed' ),
998
-				),
999
-
1000
-				'status'       => array(
1001
-					'description' => __( 'A named status for the item.', 'invoicing' ),
1002
-					'type'        => 'string',
1003
-					'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
1004
-					'context'     => array( 'view', 'edit' ),
1005
-				),
1006
-
1007
-				'type'       => array(
1008
-					'description' => __( 'The item type.', 'invoicing' ),
1009
-					'type'        => 'string',
1010
-					'enum'        => wpinv_item_types(),
1011
-					'context'     => array( 'view', 'edit', 'embed' ),
1012
-				),
1013
-
1014
-				'vat_rule'       => array(
1015
-					'description' => __( 'VAT rule applied to the item.', 'invoicing' ),
1016
-					'type'        => 'string',
1017
-					'enum'        => array( 'digital', 'physical' ),
1018
-					'context'     => array( 'view', 'edit' ),
1019
-				),
1020
-
1021
-				'vat_class'       => array(
1022
-					'description' => __( 'VAT class for the item.', 'invoicing' ),
1023
-					'type'        => 'string',
1024
-					'context'     => array( 'view', 'edit' ),
1025
-					'readonly'    => true,
1026
-				),
1027
-
1028
-				'custom_id'       => array(
1029
-					'description' => __( 'Custom id for the item.', 'invoicing' ),
1030
-					'type'        => 'string',
1031
-					'context'     => array( 'view', 'edit', 'embed' ),
1032
-				),
846
+                }
847
+
848
+            }
849
+
850
+        }
851
+
852
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
853
+        $data    = $this->add_additional_fields_to_object( $data, $request );
854
+        $data    = $this->filter_response_by_context( $data, $context );
855
+
856
+        // Wrap the data in a response object.
857
+        $response = rest_ensure_response( $data );
858
+
859
+        $links = $this->prepare_links( $item );
860
+        $response->add_links( $links );
861
+
862
+        if ( ! empty( $links['self']['href'] ) ) {
863
+            $actions = $this->get_available_actions( $item, $request );
864
+
865
+            $self = $links['self']['href'];
866
+
867
+            foreach ( $actions as $rel ) {
868
+                $response->add_link( $rel, $self );
869
+            }
870
+        }
871
+
872
+        /**
873
+         * Filters the item data for a response.
874
+         *
875
+         * @since 1.0.13
876
+         *
877
+         * @param WP_REST_Response $response The response object.
878
+         * @param WPInv_Item    $item  The item object.
879
+         * @param WP_REST_Request  $request  Request object.
880
+         */
881
+        return apply_filters( "wpinv_rest_prepare_item", $response, $item, $request );
882
+    }
883
+
884
+    /**
885
+     * Gets an array of fields to be included on the response.
886
+     *
887
+     * Included fields are based on item schema and `_fields=` request argument.
888
+     *
889
+     * @since 1.0.13
890
+     *
891
+     * @param WP_REST_Request $request Full details about the request.
892
+     * @return array Fields to be included in the response.
893
+     */
894
+    public function get_fields_for_response( $request ) {
895
+        $schema     = $this->get_item_schema();
896
+        $properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
897
+
898
+        $additional_fields = $this->get_additional_fields();
899
+        foreach ( $additional_fields as $field_name => $field_options ) {
900
+            // For back-compat, include any field with an empty schema
901
+            // because it won't be present in $this->get_item_schema().
902
+            if ( is_null( $field_options['schema'] ) ) {
903
+                $properties[ $field_name ] = $field_options;
904
+            }
905
+        }
906
+
907
+        // Exclude fields that specify a different context than the request context.
908
+        $context = $request['context'];
909
+        if ( $context ) {
910
+            foreach ( $properties as $name => $options ) {
911
+                if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
912
+                    unset( $properties[ $name ] );
913
+                }
914
+            }
915
+        }
916
+
917
+        $fields = array_keys( $properties );
918
+
919
+        if ( ! isset( $request['_fields'] ) ) {
920
+            return $fields;
921
+        }
922
+        $requested_fields = wpinv_parse_list( $request['_fields'] );
923
+        if ( 0 === count( $requested_fields ) ) {
924
+            return $fields;
925
+        }
926
+        // Trim off outside whitespace from the comma delimited list.
927
+        $requested_fields = array_map( 'trim', $requested_fields );
928
+        // Always persist 'id', because it can be needed for add_additional_fields_to_object().
929
+        if ( in_array( 'id', $fields, true ) ) {
930
+            $requested_fields[] = 'id';
931
+        }
932
+        // Return the list of all requested fields which appear in the schema.
933
+        return array_reduce(
934
+            $requested_fields,
935
+            function( $response_fields, $field ) use ( $fields ) {
936
+                if ( in_array( $field, $fields, true ) ) {
937
+                    $response_fields[] = $field;
938
+                    return $response_fields;
939
+                }
940
+                // Check for nested fields if $field is not a direct match.
941
+                $nested_fields = explode( '.', $field );
942
+                // A nested field is included so long as its top-level property is
943
+                // present in the schema.
944
+                if ( in_array( $nested_fields[0], $fields, true ) ) {
945
+                    $response_fields[] = $field;
946
+                }
947
+                return $response_fields;
948
+            },
949
+            array()
950
+        );
951
+    }
952
+
953
+    /**
954
+     * Retrieves the item's schema, conforming to JSON Schema.
955
+     *
956
+     * @since 1.0.13
957
+     *
958
+     * @return array Item schema data.
959
+     */
960
+    public function get_item_schema() {
961
+
962
+        // Maybe retrieve the schema from cache.
963
+        if ( $this->schema ) {
964
+            return $this->add_additional_fields_schema( $this->schema );
965
+        }
966
+
967
+        $schema = array(
968
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
969
+            'title'      => $this->post_type,
970
+            'type'       => 'object',
971
+
972
+            // Base properties for every Item.
973
+            'properties' 		  => array(
974
+
975
+                'id'           => array(
976
+                    'description' => __( 'Unique identifier for the item.', 'invoicing' ),
977
+                    'type'        => 'integer',
978
+                    'context'     => array( 'view', 'edit', 'embed' ),
979
+                    'readonly'    => true,
980
+                ),
981
+
982
+                'name'			  => array(
983
+                    'description' => __( 'The name for the item.', 'invoicing' ),
984
+                    'type'        => 'string',
985
+                    'context'     => array( 'view', 'edit', 'embed' ),
986
+                ),
987
+
988
+                'summary'        => array(
989
+                    'description' => __( 'A summary for the item.', 'invoicing' ),
990
+                    'type'        => 'string',
991
+                    'context'     => array( 'view', 'edit', 'embed' ),
992
+                ),
993
+
994
+                'price'        => array(
995
+                    'description' => __( 'The price for the item.', 'invoicing' ),
996
+                    'type'        => 'number',
997
+                    'context'     => array( 'view', 'edit', 'embed' ),
998
+                ),
999
+
1000
+                'status'       => array(
1001
+                    'description' => __( 'A named status for the item.', 'invoicing' ),
1002
+                    'type'        => 'string',
1003
+                    'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
1004
+                    'context'     => array( 'view', 'edit' ),
1005
+                ),
1006
+
1007
+                'type'       => array(
1008
+                    'description' => __( 'The item type.', 'invoicing' ),
1009
+                    'type'        => 'string',
1010
+                    'enum'        => wpinv_item_types(),
1011
+                    'context'     => array( 'view', 'edit', 'embed' ),
1012
+                ),
1013
+
1014
+                'vat_rule'       => array(
1015
+                    'description' => __( 'VAT rule applied to the item.', 'invoicing' ),
1016
+                    'type'        => 'string',
1017
+                    'enum'        => array( 'digital', 'physical' ),
1018
+                    'context'     => array( 'view', 'edit' ),
1019
+                ),
1020
+
1021
+                'vat_class'       => array(
1022
+                    'description' => __( 'VAT class for the item.', 'invoicing' ),
1023
+                    'type'        => 'string',
1024
+                    'context'     => array( 'view', 'edit' ),
1025
+                    'readonly'    => true,
1026
+                ),
1027
+
1028
+                'custom_id'       => array(
1029
+                    'description' => __( 'Custom id for the item.', 'invoicing' ),
1030
+                    'type'        => 'string',
1031
+                    'context'     => array( 'view', 'edit', 'embed' ),
1032
+                ),
1033 1033
 				
1034
-				'custom_name'       => array(
1035
-					'description' => __( 'Custom name for the item.', 'invoicing' ),
1036
-					'type'        => 'string',
1037
-					'context'     => array( 'view', 'edit', 'embed' ),
1038
-				),
1039
-
1040
-				'custom_singular_name'       => array(
1041
-					'description' => __( 'Custom singular name for the item.', 'invoicing' ),
1042
-					'type'        => 'string',
1043
-					'context'     => array( 'view', 'edit', 'embed' ),
1044
-				),
1045
-
1046
-				'dynamic_pricing'        => array(
1047
-					'description' => __( 'Whether the item allows a user to set their own price.', 'invoicing' ),
1048
-					'type'        => 'integer',
1049
-					'context'     => array( 'view', 'edit', 'embed' ),
1050
-				),
1051
-
1052
-				'minimum_price'        => array(
1053
-					'description' => __( 'For dynamic prices, this is the minimum price that a user can set.', 'invoicing' ),
1054
-					'type'        => 'number',
1055
-					'context'     => array( 'view', 'edit', 'embed' ),
1056
-				),
1057
-
1058
-				'is_recurring'        => array(
1059
-					'description' => __( 'Whether the item is a subscription item.', 'invoicing' ),
1060
-					'type'        => 'integer',
1061
-					'context'     => array( 'view', 'edit', 'embed' ),
1062
-				),
1063
-
1064
-				'recurring_period'        => array(
1065
-					'description' => __( 'The recurring period for a recurring item.', 'invoicing' ),
1066
-					'type'        => 'string',
1067
-					'context'     => array( 'view', 'edit', 'embed' ),
1068
-					'enum'        => array( 'D', 'W', 'M', 'Y' ),
1069
-				),
1070
-
1071
-				'recurring_interval'        => array(
1072
-					'description' => __( 'The recurring interval for a subscription item.', 'invoicing' ),
1073
-					'type'        => 'integer',
1074
-					'context'     => array( 'view', 'edit', 'embed' ),
1075
-				),
1076
-
1077
-				'recurring_limit'        => array(
1078
-					'description' => __( 'The maximum number of renewals for a subscription item.', 'invoicing' ),
1079
-					'type'        => 'integer',
1080
-					'context'     => array( 'view', 'edit', 'embed' ),
1081
-				),
1082
-
1083
-				'free_trial'        => array(
1084
-					'description' => __( 'Whether the item has a free trial period.', 'invoicing' ),
1085
-					'type'        => 'integer',
1086
-					'context'     => array( 'view', 'edit', 'embed' ),
1087
-				),
1088
-
1089
-				'trial_period'        => array(
1090
-					'description' => __( 'The trial period of a recurring item.', 'invoicing' ),
1091
-					'type'        => 'string',
1092
-					'context'     => array( 'view', 'edit', 'embed' ),
1093
-					'enum'        => array( 'D', 'W', 'M', 'Y' ),
1094
-				),
1095
-
1096
-				'trial_interval'        => array(
1097
-					'description' => __( 'The trial interval for a subscription item.', 'invoicing' ),
1098
-					'type'        => 'integer',
1099
-					'context'     => array( 'view', 'edit', 'embed' ),
1100
-				),
1101
-
1102
-				'editable'        => array(
1103
-					'description' => __( 'Whether or not the item is editable.', 'invoicing' ),
1104
-					'type'        => 'integer',
1105
-					'context'     => array( 'view', 'edit' ),
1106
-				),
1107
-
1108
-			),
1109
-		);
1110
-
1111
-		// Add helpful links to the item schem.
1112
-		$schema['links'] = $this->get_schema_links();
1113
-
1114
-		/**
1115
-		 * Filters the item schema for the REST API.
1116
-		 *
1117
-		 * Enables adding extra properties to items.
1118
-		 *
1119
-		 * @since 1.0.13
1120
-		 *
1121
-		 * @param array   $schema    The item schema.
1122
-		 */
1034
+                'custom_name'       => array(
1035
+                    'description' => __( 'Custom name for the item.', 'invoicing' ),
1036
+                    'type'        => 'string',
1037
+                    'context'     => array( 'view', 'edit', 'embed' ),
1038
+                ),
1039
+
1040
+                'custom_singular_name'       => array(
1041
+                    'description' => __( 'Custom singular name for the item.', 'invoicing' ),
1042
+                    'type'        => 'string',
1043
+                    'context'     => array( 'view', 'edit', 'embed' ),
1044
+                ),
1045
+
1046
+                'dynamic_pricing'        => array(
1047
+                    'description' => __( 'Whether the item allows a user to set their own price.', 'invoicing' ),
1048
+                    'type'        => 'integer',
1049
+                    'context'     => array( 'view', 'edit', 'embed' ),
1050
+                ),
1051
+
1052
+                'minimum_price'        => array(
1053
+                    'description' => __( 'For dynamic prices, this is the minimum price that a user can set.', 'invoicing' ),
1054
+                    'type'        => 'number',
1055
+                    'context'     => array( 'view', 'edit', 'embed' ),
1056
+                ),
1057
+
1058
+                'is_recurring'        => array(
1059
+                    'description' => __( 'Whether the item is a subscription item.', 'invoicing' ),
1060
+                    'type'        => 'integer',
1061
+                    'context'     => array( 'view', 'edit', 'embed' ),
1062
+                ),
1063
+
1064
+                'recurring_period'        => array(
1065
+                    'description' => __( 'The recurring period for a recurring item.', 'invoicing' ),
1066
+                    'type'        => 'string',
1067
+                    'context'     => array( 'view', 'edit', 'embed' ),
1068
+                    'enum'        => array( 'D', 'W', 'M', 'Y' ),
1069
+                ),
1070
+
1071
+                'recurring_interval'        => array(
1072
+                    'description' => __( 'The recurring interval for a subscription item.', 'invoicing' ),
1073
+                    'type'        => 'integer',
1074
+                    'context'     => array( 'view', 'edit', 'embed' ),
1075
+                ),
1076
+
1077
+                'recurring_limit'        => array(
1078
+                    'description' => __( 'The maximum number of renewals for a subscription item.', 'invoicing' ),
1079
+                    'type'        => 'integer',
1080
+                    'context'     => array( 'view', 'edit', 'embed' ),
1081
+                ),
1082
+
1083
+                'free_trial'        => array(
1084
+                    'description' => __( 'Whether the item has a free trial period.', 'invoicing' ),
1085
+                    'type'        => 'integer',
1086
+                    'context'     => array( 'view', 'edit', 'embed' ),
1087
+                ),
1088
+
1089
+                'trial_period'        => array(
1090
+                    'description' => __( 'The trial period of a recurring item.', 'invoicing' ),
1091
+                    'type'        => 'string',
1092
+                    'context'     => array( 'view', 'edit', 'embed' ),
1093
+                    'enum'        => array( 'D', 'W', 'M', 'Y' ),
1094
+                ),
1095
+
1096
+                'trial_interval'        => array(
1097
+                    'description' => __( 'The trial interval for a subscription item.', 'invoicing' ),
1098
+                    'type'        => 'integer',
1099
+                    'context'     => array( 'view', 'edit', 'embed' ),
1100
+                ),
1101
+
1102
+                'editable'        => array(
1103
+                    'description' => __( 'Whether or not the item is editable.', 'invoicing' ),
1104
+                    'type'        => 'integer',
1105
+                    'context'     => array( 'view', 'edit' ),
1106
+                ),
1107
+
1108
+            ),
1109
+        );
1110
+
1111
+        // Add helpful links to the item schem.
1112
+        $schema['links'] = $this->get_schema_links();
1113
+
1114
+        /**
1115
+         * Filters the item schema for the REST API.
1116
+         *
1117
+         * Enables adding extra properties to items.
1118
+         *
1119
+         * @since 1.0.13
1120
+         *
1121
+         * @param array   $schema    The item schema.
1122
+         */
1123 1123
         $schema = apply_filters( "wpinv_rest_item_schema", $schema );
1124 1124
 
1125
-		//  Cache the item schema.
1126
-		$this->schema = $schema;
1125
+        //  Cache the item schema.
1126
+        $this->schema = $schema;
1127 1127
 		
1128
-		return $this->add_additional_fields_schema( $this->schema );
1129
-	}
1130
-
1131
-	/**
1132
-	 * Retrieve Link Description Objects that should be added to the Schema for the invoices collection.
1133
-	 *
1134
-	 * @since 1.0.13
1135
-	 *
1136
-	 * @return array
1137
-	 */
1138
-	protected function get_schema_links() {
1139
-
1140
-		$href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
1141
-
1142
-		$links = array();
1143
-
1144
-		$links[] = array(
1145
-			'rel'          => 'https://api.w.org/action-publish',
1146
-			'title'        => __( 'The current user can publish this item.' ),
1147
-			'href'         => $href,
1148
-			'targetSchema' => array(
1149
-				'type'       => 'object',
1150
-				'properties' => array(
1151
-					'status' => array(
1152
-						'type' => 'string',
1153
-						'enum' => array( 'publish', 'future' ),
1154
-					),
1155
-				),
1156
-			),
1157
-		);
1158
-
1159
-		return $links;
1160
-	}
1161
-
1162
-	/**
1163
-	 * Prepares links for the request.
1164
-	 *
1165
-	 * @since 1.0.13
1166
-	 *
1167
-	 * @param WPInv_Item $item Item Object.
1168
-	 * @return array Links for the given item.
1169
-	 */
1170
-	protected function prepare_links( $item ) {
1171
-
1172
-		// Prepare the base REST API endpoint for items.
1173
-		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
1174
-
1175
-		// Entity meta.
1176
-		$links = array(
1177
-			'self'       => array(
1178
-				'href' => rest_url( trailingslashit( $base ) . $item->ID ),
1179
-			),
1180
-			'collection' => array(
1181
-				'href' => rest_url( $base ),
1182
-			),
1183
-		);
1184
-
1185
-		/**
1186
-		 * Filters the returned item links for the REST API.
1187
-		 *
1188
-		 * Enables adding extra links to item API responses.
1189
-		 *
1190
-		 * @since 1.0.13
1191
-		 *
1192
-		 * @param array   $links    Rest links.
1193
-		 */
1194
-		return apply_filters( "wpinv_rest_item_links", $links );
1195
-
1196
-	}
1197
-
1198
-	/**
1199
-	 * Get the link relations available for the post and current user.
1200
-	 *
1201
-	 * @since 1.0.13
1202
-	 *
1203
-	 * @param WPInv_Item   $item    Item object.
1204
-	 * @param WP_REST_Request $request Request object.
1205
-	 * @return array List of link relations.
1206
-	 */
1207
-	protected function get_available_actions( $item, $request ) {
1208
-
1209
-		if ( 'edit' !== $request['context'] ) {
1210
-			return array();
1211
-		}
1212
-
1213
-		$rels = array();
1214
-
1215
-		// Retrieve the post type object.
1216
-		$post_type = get_post_type_object( $item->post_type );
1217
-
1218
-		// Mark item as published.
1219
-		if ( current_user_can( $post_type->cap->publish_posts ) ) {
1220
-			$rels[] = 'https://api.w.org/action-publish';
1221
-		}
1222
-
1223
-		/**
1224
-		 * Filters the available item link relations for the REST API.
1225
-		 *
1226
-		 * Enables adding extra link relation for the current user and request to item responses.
1227
-		 *
1228
-		 * @since 1.0.13
1229
-		 *
1230
-		 * @param array   $rels    Available link relations.
1231
-		 */
1232
-		return apply_filters( "wpinv_rest_item_link_relations", $rels );
1233
-	}
1234
-
1235
-	/**
1236
-	 * Handles rest requests for item types.
1237
-	 *
1238
-	 * @since 1.0.13
1239
-	 * 
1240
-	 * 
1241
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1242
-	 */
1243
-	public function get_item_types() {
1244
-		return rest_ensure_response( wpinv_get_item_types() );
1245
-	}
1128
+        return $this->add_additional_fields_schema( $this->schema );
1129
+    }
1130
+
1131
+    /**
1132
+     * Retrieve Link Description Objects that should be added to the Schema for the invoices collection.
1133
+     *
1134
+     * @since 1.0.13
1135
+     *
1136
+     * @return array
1137
+     */
1138
+    protected function get_schema_links() {
1139
+
1140
+        $href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
1141
+
1142
+        $links = array();
1143
+
1144
+        $links[] = array(
1145
+            'rel'          => 'https://api.w.org/action-publish',
1146
+            'title'        => __( 'The current user can publish this item.' ),
1147
+            'href'         => $href,
1148
+            'targetSchema' => array(
1149
+                'type'       => 'object',
1150
+                'properties' => array(
1151
+                    'status' => array(
1152
+                        'type' => 'string',
1153
+                        'enum' => array( 'publish', 'future' ),
1154
+                    ),
1155
+                ),
1156
+            ),
1157
+        );
1158
+
1159
+        return $links;
1160
+    }
1161
+
1162
+    /**
1163
+     * Prepares links for the request.
1164
+     *
1165
+     * @since 1.0.13
1166
+     *
1167
+     * @param WPInv_Item $item Item Object.
1168
+     * @return array Links for the given item.
1169
+     */
1170
+    protected function prepare_links( $item ) {
1171
+
1172
+        // Prepare the base REST API endpoint for items.
1173
+        $base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
1174
+
1175
+        // Entity meta.
1176
+        $links = array(
1177
+            'self'       => array(
1178
+                'href' => rest_url( trailingslashit( $base ) . $item->ID ),
1179
+            ),
1180
+            'collection' => array(
1181
+                'href' => rest_url( $base ),
1182
+            ),
1183
+        );
1184
+
1185
+        /**
1186
+         * Filters the returned item links for the REST API.
1187
+         *
1188
+         * Enables adding extra links to item API responses.
1189
+         *
1190
+         * @since 1.0.13
1191
+         *
1192
+         * @param array   $links    Rest links.
1193
+         */
1194
+        return apply_filters( "wpinv_rest_item_links", $links );
1195
+
1196
+    }
1197
+
1198
+    /**
1199
+     * Get the link relations available for the post and current user.
1200
+     *
1201
+     * @since 1.0.13
1202
+     *
1203
+     * @param WPInv_Item   $item    Item object.
1204
+     * @param WP_REST_Request $request Request object.
1205
+     * @return array List of link relations.
1206
+     */
1207
+    protected function get_available_actions( $item, $request ) {
1208
+
1209
+        if ( 'edit' !== $request['context'] ) {
1210
+            return array();
1211
+        }
1212
+
1213
+        $rels = array();
1214
+
1215
+        // Retrieve the post type object.
1216
+        $post_type = get_post_type_object( $item->post_type );
1217
+
1218
+        // Mark item as published.
1219
+        if ( current_user_can( $post_type->cap->publish_posts ) ) {
1220
+            $rels[] = 'https://api.w.org/action-publish';
1221
+        }
1222
+
1223
+        /**
1224
+         * Filters the available item link relations for the REST API.
1225
+         *
1226
+         * Enables adding extra link relation for the current user and request to item responses.
1227
+         *
1228
+         * @since 1.0.13
1229
+         *
1230
+         * @param array   $rels    Available link relations.
1231
+         */
1232
+        return apply_filters( "wpinv_rest_item_link_relations", $rels );
1233
+    }
1234
+
1235
+    /**
1236
+     * Handles rest requests for item types.
1237
+     *
1238
+     * @since 1.0.13
1239
+     * 
1240
+     * 
1241
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1242
+     */
1243
+    public function get_item_types() {
1244
+        return rest_ensure_response( wpinv_get_item_types() );
1245
+    }
1246 1246
 
1247 1247
     
1248 1248
 }
1249 1249
\ No newline at end of file
Please login to merge, or discard this patch.
includes/gateways/paypal.php 1 patch
Indentation   +255 added lines, -255 removed lines patch added patch discarded remove patch
@@ -219,262 +219,262 @@  discard block
 block discarded – undo
219 219
 add_filter( 'wpinv_paypal_args', 'wpinv_get_paypal_recurring_args', 10, 3 );
220 220
 
221 221
 function wpinv_process_paypal_ipn() {
222
-	// Check the request method is POST
223
-	if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] != 'POST' ) {
224
-		return;
225
-	}
226
-
227
-	// Set initial post data to empty string
228
-	$post_data = '';
229
-
230
-	// Fallback just in case post_max_size is lower than needed
231
-	if ( ini_get( 'allow_url_fopen' ) ) {
232
-		$post_data = file_get_contents( 'php://input' );
233
-	} else {
234
-		// If allow_url_fopen is not enabled, then make sure that post_max_size is large enough
235
-		ini_set( 'post_max_size', '12M' );
236
-	}
237
-	// Start the encoded data collection with notification command
238
-	$encoded_data = 'cmd=_notify-validate';
239
-
240
-	// Get current arg separator
241
-	$arg_separator = wpinv_get_php_arg_separator_output();
242
-
243
-	// Verify there is a post_data
244
-	if ( $post_data || strlen( $post_data ) > 0 ) {
245
-		// Append the data
246
-		$encoded_data .= $arg_separator.$post_data;
247
-	} else {
248
-		// Check if POST is empty
249
-		if ( empty( $_POST ) ) {
250
-			// Nothing to do
251
-			return;
252
-		} else {
253
-			// Loop through each POST
254
-			foreach ( $_POST as $key => $value ) {
255
-				// Encode the value and append the data
256
-				$encoded_data .= $arg_separator."$key=" . urlencode( $value );
257
-			}
258
-		}
259
-	}
260
-
261
-	// Convert collected post data to an array
262
-	wp_parse_str( $encoded_data, $encoded_data_array );
263
-
264
-	foreach ( $encoded_data_array as $key => $value ) {
265
-		if ( false !== strpos( $key, 'amp;' ) ) {
266
-			$new_key = str_replace( '&amp;', '&', $key );
267
-			$new_key = str_replace( 'amp;', '&' , $new_key );
268
-
269
-			unset( $encoded_data_array[ $key ] );
270
-			$encoded_data_array[ $new_key ] = $value;
271
-		}
272
-	}
273
-
274
-	// Get the PayPal redirect uri
275
-	$paypal_redirect = wpinv_get_paypal_redirect( true );
276
-
277
-	if ( !wpinv_get_option( 'disable_paypal_verification', false ) ) {
278
-		// Validate the IPN
279
-
280
-		$remote_post_vars      = array(
281
-			'method'           => 'POST',
282
-			'timeout'          => 45,
283
-			'redirection'      => 5,
284
-			'httpversion'      => '1.1',
285
-			'blocking'         => true,
286
-			'headers'          => array(
287
-				'host'         => 'www.paypal.com',
288
-				'connection'   => 'close',
289
-				'content-type' => 'application/x-www-form-urlencoded',
290
-				'post'         => '/cgi-bin/webscr HTTP/1.1',
291
-
292
-			),
293
-			'sslverify'        => false,
294
-			'body'             => $encoded_data_array
295
-		);
296
-
297
-		// Get response
298
-		$api_response = wp_remote_post( wpinv_get_paypal_redirect(), $remote_post_vars );
299
-
300
-		if ( is_wp_error( $api_response ) ) {
301
-			wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid IPN verification response. IPN data: %s', 'invoicing' ), json_encode( $api_response ) ) );
302
-			return; // Something went wrong
303
-		}
304
-
305
-		if ( $api_response['body'] !== 'VERIFIED' && wpinv_get_option( 'disable_paypal_verification', false ) ) {
306
-			wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid IPN verification response. IPN data: %s', 'invoicing' ), json_encode( $api_response ) ) );
307
-			return; // Response not okay
308
-		}
309
-	}
310
-
311
-	// Check if $post_data_array has been populated
312
-	if ( !is_array( $encoded_data_array ) && !empty( $encoded_data_array ) )
313
-		return;
314
-
315
-	$defaults = array(
316
-		'txn_type'       => '',
317
-		'payment_status' => ''
318
-	);
319
-
320
-	$encoded_data_array = wp_parse_args( $encoded_data_array, $defaults );
321
-
322
-	$invoice_id = isset( $encoded_data_array['custom'] ) ? absint( $encoded_data_array['custom'] ) : 0;
222
+    // Check the request method is POST
223
+    if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] != 'POST' ) {
224
+        return;
225
+    }
226
+
227
+    // Set initial post data to empty string
228
+    $post_data = '';
229
+
230
+    // Fallback just in case post_max_size is lower than needed
231
+    if ( ini_get( 'allow_url_fopen' ) ) {
232
+        $post_data = file_get_contents( 'php://input' );
233
+    } else {
234
+        // If allow_url_fopen is not enabled, then make sure that post_max_size is large enough
235
+        ini_set( 'post_max_size', '12M' );
236
+    }
237
+    // Start the encoded data collection with notification command
238
+    $encoded_data = 'cmd=_notify-validate';
239
+
240
+    // Get current arg separator
241
+    $arg_separator = wpinv_get_php_arg_separator_output();
242
+
243
+    // Verify there is a post_data
244
+    if ( $post_data || strlen( $post_data ) > 0 ) {
245
+        // Append the data
246
+        $encoded_data .= $arg_separator.$post_data;
247
+    } else {
248
+        // Check if POST is empty
249
+        if ( empty( $_POST ) ) {
250
+            // Nothing to do
251
+            return;
252
+        } else {
253
+            // Loop through each POST
254
+            foreach ( $_POST as $key => $value ) {
255
+                // Encode the value and append the data
256
+                $encoded_data .= $arg_separator."$key=" . urlencode( $value );
257
+            }
258
+        }
259
+    }
260
+
261
+    // Convert collected post data to an array
262
+    wp_parse_str( $encoded_data, $encoded_data_array );
263
+
264
+    foreach ( $encoded_data_array as $key => $value ) {
265
+        if ( false !== strpos( $key, 'amp;' ) ) {
266
+            $new_key = str_replace( '&amp;', '&', $key );
267
+            $new_key = str_replace( 'amp;', '&' , $new_key );
268
+
269
+            unset( $encoded_data_array[ $key ] );
270
+            $encoded_data_array[ $new_key ] = $value;
271
+        }
272
+    }
273
+
274
+    // Get the PayPal redirect uri
275
+    $paypal_redirect = wpinv_get_paypal_redirect( true );
276
+
277
+    if ( !wpinv_get_option( 'disable_paypal_verification', false ) ) {
278
+        // Validate the IPN
279
+
280
+        $remote_post_vars      = array(
281
+            'method'           => 'POST',
282
+            'timeout'          => 45,
283
+            'redirection'      => 5,
284
+            'httpversion'      => '1.1',
285
+            'blocking'         => true,
286
+            'headers'          => array(
287
+                'host'         => 'www.paypal.com',
288
+                'connection'   => 'close',
289
+                'content-type' => 'application/x-www-form-urlencoded',
290
+                'post'         => '/cgi-bin/webscr HTTP/1.1',
291
+
292
+            ),
293
+            'sslverify'        => false,
294
+            'body'             => $encoded_data_array
295
+        );
296
+
297
+        // Get response
298
+        $api_response = wp_remote_post( wpinv_get_paypal_redirect(), $remote_post_vars );
299
+
300
+        if ( is_wp_error( $api_response ) ) {
301
+            wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid IPN verification response. IPN data: %s', 'invoicing' ), json_encode( $api_response ) ) );
302
+            return; // Something went wrong
303
+        }
304
+
305
+        if ( $api_response['body'] !== 'VERIFIED' && wpinv_get_option( 'disable_paypal_verification', false ) ) {
306
+            wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid IPN verification response. IPN data: %s', 'invoicing' ), json_encode( $api_response ) ) );
307
+            return; // Response not okay
308
+        }
309
+    }
310
+
311
+    // Check if $post_data_array has been populated
312
+    if ( !is_array( $encoded_data_array ) && !empty( $encoded_data_array ) )
313
+        return;
314
+
315
+    $defaults = array(
316
+        'txn_type'       => '',
317
+        'payment_status' => ''
318
+    );
319
+
320
+    $encoded_data_array = wp_parse_args( $encoded_data_array, $defaults );
321
+
322
+    $invoice_id = isset( $encoded_data_array['custom'] ) ? absint( $encoded_data_array['custom'] ) : 0;
323 323
     
324
-	wpinv_error_log( $encoded_data_array['txn_type'], 'PayPal txn_type', __FILE__, __LINE__ );
325
-	wpinv_error_log( $encoded_data_array, 'PayPal IPN response', __FILE__, __LINE__ );
326
-
327
-	if ( has_action( 'wpinv_paypal_' . $encoded_data_array['txn_type'] ) ) {
328
-		// Allow PayPal IPN types to be processed separately
329
-		do_action( 'wpinv_paypal_' . $encoded_data_array['txn_type'], $encoded_data_array, $invoice_id );
330
-	} else {
331
-		// Fallback to web accept just in case the txn_type isn't present
332
-		do_action( 'wpinv_paypal_web_accept', $encoded_data_array, $invoice_id );
333
-	}
334
-	exit;
324
+    wpinv_error_log( $encoded_data_array['txn_type'], 'PayPal txn_type', __FILE__, __LINE__ );
325
+    wpinv_error_log( $encoded_data_array, 'PayPal IPN response', __FILE__, __LINE__ );
326
+
327
+    if ( has_action( 'wpinv_paypal_' . $encoded_data_array['txn_type'] ) ) {
328
+        // Allow PayPal IPN types to be processed separately
329
+        do_action( 'wpinv_paypal_' . $encoded_data_array['txn_type'], $encoded_data_array, $invoice_id );
330
+    } else {
331
+        // Fallback to web accept just in case the txn_type isn't present
332
+        do_action( 'wpinv_paypal_web_accept', $encoded_data_array, $invoice_id );
333
+    }
334
+    exit;
335 335
 }
336 336
 add_action( 'wpinv_verify_paypal_ipn', 'wpinv_process_paypal_ipn' );
337 337
 
338 338
 function wpinv_process_paypal_web_accept_and_cart( $data, $invoice_id ) {
339
-	if ( $data['txn_type'] != 'web_accept' && $data['txn_type'] != 'cart' && $data['payment_status'] != 'Refunded' ) {
340
-		return;
341
-	}
342
-
343
-	if( empty( $invoice_id ) ) {
344
-		return;
345
-	}
346
-
347
-	// Collect payment details
348
-	$purchase_key   = isset( $data['invoice'] ) ? $data['invoice'] : $data['item_number'];
349
-	$paypal_amount  = $data['mc_gross'];
350
-	$payment_status = strtolower( $data['payment_status'] );
351
-	$currency_code  = strtolower( $data['mc_currency'] );
352
-	$business_email = isset( $data['business'] ) && is_email( $data['business'] ) ? trim( $data['business'] ) : trim( $data['receiver_email'] );
353
-	$payment_meta   = wpinv_get_invoice_meta( $invoice_id );
354
-
355
-	if ( wpinv_get_payment_gateway( $invoice_id ) != 'paypal' ) {
356
-		return; // this isn't a PayPal standard IPN
357
-	}
358
-
359
-	// Verify payment recipient
360
-	if ( strcasecmp( $business_email, trim( wpinv_get_option( 'paypal_email', false ) ) ) != 0 ) {
361
-		wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid business email in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
362
-		wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
363
-		wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid PayPal business email.', 'invoicing' ), '', '', true );
364
-		return;
365
-	}
366
-
367
-	// Verify payment currency
368
-	if ( $currency_code != strtolower( $payment_meta['currency'] ) ) {
369
-		wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid currency in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
370
-		wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
371
-		wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid currency in PayPal IPN.', 'invoicing' ), '', '', true );
372
-		return;
373
-	}
374
-
375
-	if ( !wpinv_get_payment_user_email( $invoice_id ) ) {
376
-		// This runs when a Buy Now purchase was made. It bypasses checkout so no personal info is collected until PayPal
377
-		// No email associated with purchase, so store from PayPal
378
-		wpinv_update_invoice_meta( $invoice_id, '_wpinv_email', $data['payer_email'] );
379
-
380
-		// Setup and store the customer's details
381
-		$user_info = array(
382
-			'user_id'    => '-1',
383
-			'email'      => sanitize_text_field( $data['payer_email'] ),
384
-			'first_name' => sanitize_text_field( $data['first_name'] ),
385
-			'last_name'  => sanitize_text_field( $data['last_name'] ),
386
-			'discount'   => '',
387
-		);
388
-		$user_info['address'] = ! empty( $data['address_street']       ) ? sanitize_text_field( $data['address_street'] )       : false;
389
-		$user_info['city']    = ! empty( $data['address_city']         ) ? sanitize_text_field( $data['address_city'] )         : false;
390
-		$user_info['state']   = ! empty( $data['address_state']        ) ? sanitize_text_field( $data['address_state'] )        : false;
391
-		$user_info['country'] = ! empty( $data['address_country_code'] ) ? sanitize_text_field( $data['address_country_code'] ) : false;
392
-		$user_info['zip']     = ! empty( $data['address_zip']          ) ? sanitize_text_field( $data['address_zip'] )          : false;
393
-
394
-		$payment_meta['user_info'] = $user_info;
395
-		wpinv_update_invoice_meta( $invoice_id, '_wpinv_payment_meta', $payment_meta );
396
-	}
397
-
398
-	if ( $payment_status == 'refunded' || $payment_status == 'reversed' ) {
399
-		// Process a refund
400
-		wpinv_process_paypal_refund( $data, $invoice_id );
401
-	} else {
402
-		if ( get_post_status( $invoice_id ) == 'publish' ) {
403
-			return; // Only paid payments once
404
-		}
405
-
406
-		// Retrieve the total purchase amount (before PayPal)
407
-		$payment_amount = wpinv_payment_total( $invoice_id );
408
-
409
-		if ( number_format( (float) $paypal_amount, 2 ) < number_format( (float) $payment_amount, 2 ) ) {
410
-			// The prices don't match
411
-			wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid payment amount in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
412
-			wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
413
-			wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid amount in PayPal IPN.', 'invoicing' ), '', '', true );
414
-			return;
415
-		}
416
-		if ( $purchase_key != wpinv_get_payment_key( $invoice_id ) ) {
417
-			// Purchase keys don't match
418
-			wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid purchase key in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
419
-			wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
420
-			wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid purchase key in PayPal IPN.', 'invoicing' ), '', '', true );
421
-			return;
422
-		}
423
-
424
-		if ( 'complete' == $payment_status || 'completed' == $payment_status || 'processed' == $payment_status || wpinv_is_test_mode( 'paypal' ) ) {
425
-			wpinv_insert_payment_note( $invoice_id, sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ) , $data['txn_id'] ), '', '', true );
426
-			wpinv_set_payment_transaction_id( $invoice_id, $data['txn_id'] );
427
-			wpinv_update_payment_status( $invoice_id, 'publish' );
428
-		} else if ( 'pending' == $payment_status && isset( $data['pending_reason'] ) ) {
429
-			// Look for possible pending reasons, such as an echeck
430
-			$note = '';
431
-
432
-			switch( strtolower( $data['pending_reason'] ) ) {
433
-				case 'echeck' :
434
-					$note = __( 'Payment made via eCheck and will clear automatically in 5-8 days', 'invoicing' );
435
-					break;
339
+    if ( $data['txn_type'] != 'web_accept' && $data['txn_type'] != 'cart' && $data['payment_status'] != 'Refunded' ) {
340
+        return;
341
+    }
342
+
343
+    if( empty( $invoice_id ) ) {
344
+        return;
345
+    }
346
+
347
+    // Collect payment details
348
+    $purchase_key   = isset( $data['invoice'] ) ? $data['invoice'] : $data['item_number'];
349
+    $paypal_amount  = $data['mc_gross'];
350
+    $payment_status = strtolower( $data['payment_status'] );
351
+    $currency_code  = strtolower( $data['mc_currency'] );
352
+    $business_email = isset( $data['business'] ) && is_email( $data['business'] ) ? trim( $data['business'] ) : trim( $data['receiver_email'] );
353
+    $payment_meta   = wpinv_get_invoice_meta( $invoice_id );
354
+
355
+    if ( wpinv_get_payment_gateway( $invoice_id ) != 'paypal' ) {
356
+        return; // this isn't a PayPal standard IPN
357
+    }
358
+
359
+    // Verify payment recipient
360
+    if ( strcasecmp( $business_email, trim( wpinv_get_option( 'paypal_email', false ) ) ) != 0 ) {
361
+        wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid business email in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
362
+        wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
363
+        wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid PayPal business email.', 'invoicing' ), '', '', true );
364
+        return;
365
+    }
366
+
367
+    // Verify payment currency
368
+    if ( $currency_code != strtolower( $payment_meta['currency'] ) ) {
369
+        wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid currency in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
370
+        wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
371
+        wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid currency in PayPal IPN.', 'invoicing' ), '', '', true );
372
+        return;
373
+    }
374
+
375
+    if ( !wpinv_get_payment_user_email( $invoice_id ) ) {
376
+        // This runs when a Buy Now purchase was made. It bypasses checkout so no personal info is collected until PayPal
377
+        // No email associated with purchase, so store from PayPal
378
+        wpinv_update_invoice_meta( $invoice_id, '_wpinv_email', $data['payer_email'] );
379
+
380
+        // Setup and store the customer's details
381
+        $user_info = array(
382
+            'user_id'    => '-1',
383
+            'email'      => sanitize_text_field( $data['payer_email'] ),
384
+            'first_name' => sanitize_text_field( $data['first_name'] ),
385
+            'last_name'  => sanitize_text_field( $data['last_name'] ),
386
+            'discount'   => '',
387
+        );
388
+        $user_info['address'] = ! empty( $data['address_street']       ) ? sanitize_text_field( $data['address_street'] )       : false;
389
+        $user_info['city']    = ! empty( $data['address_city']         ) ? sanitize_text_field( $data['address_city'] )         : false;
390
+        $user_info['state']   = ! empty( $data['address_state']        ) ? sanitize_text_field( $data['address_state'] )        : false;
391
+        $user_info['country'] = ! empty( $data['address_country_code'] ) ? sanitize_text_field( $data['address_country_code'] ) : false;
392
+        $user_info['zip']     = ! empty( $data['address_zip']          ) ? sanitize_text_field( $data['address_zip'] )          : false;
393
+
394
+        $payment_meta['user_info'] = $user_info;
395
+        wpinv_update_invoice_meta( $invoice_id, '_wpinv_payment_meta', $payment_meta );
396
+    }
397
+
398
+    if ( $payment_status == 'refunded' || $payment_status == 'reversed' ) {
399
+        // Process a refund
400
+        wpinv_process_paypal_refund( $data, $invoice_id );
401
+    } else {
402
+        if ( get_post_status( $invoice_id ) == 'publish' ) {
403
+            return; // Only paid payments once
404
+        }
405
+
406
+        // Retrieve the total purchase amount (before PayPal)
407
+        $payment_amount = wpinv_payment_total( $invoice_id );
408
+
409
+        if ( number_format( (float) $paypal_amount, 2 ) < number_format( (float) $payment_amount, 2 ) ) {
410
+            // The prices don't match
411
+            wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid payment amount in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
412
+            wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
413
+            wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid amount in PayPal IPN.', 'invoicing' ), '', '', true );
414
+            return;
415
+        }
416
+        if ( $purchase_key != wpinv_get_payment_key( $invoice_id ) ) {
417
+            // Purchase keys don't match
418
+            wpinv_record_gateway_error( __( 'IPN Error', 'invoicing' ), sprintf( __( 'Invalid purchase key in IPN response. IPN data: %s', 'invoicing' ), json_encode( $data ) ), $invoice_id );
419
+            wpinv_update_payment_status( $invoice_id, 'wpi-failed' );
420
+            wpinv_insert_payment_note( $invoice_id, __( 'Payment failed due to invalid purchase key in PayPal IPN.', 'invoicing' ), '', '', true );
421
+            return;
422
+        }
423
+
424
+        if ( 'complete' == $payment_status || 'completed' == $payment_status || 'processed' == $payment_status || wpinv_is_test_mode( 'paypal' ) ) {
425
+            wpinv_insert_payment_note( $invoice_id, sprintf( __( 'PayPal Transaction ID: %s', 'invoicing' ) , $data['txn_id'] ), '', '', true );
426
+            wpinv_set_payment_transaction_id( $invoice_id, $data['txn_id'] );
427
+            wpinv_update_payment_status( $invoice_id, 'publish' );
428
+        } else if ( 'pending' == $payment_status && isset( $data['pending_reason'] ) ) {
429
+            // Look for possible pending reasons, such as an echeck
430
+            $note = '';
431
+
432
+            switch( strtolower( $data['pending_reason'] ) ) {
433
+                case 'echeck' :
434
+                    $note = __( 'Payment made via eCheck and will clear automatically in 5-8 days', 'invoicing' );
435
+                    break;
436 436
 				
437 437
                 case 'address' :
438
-					$note = __( 'Payment requires a confirmed customer address and must be accepted manually through PayPal', 'invoicing' );
439
-					break;
438
+                    $note = __( 'Payment requires a confirmed customer address and must be accepted manually through PayPal', 'invoicing' );
439
+                    break;
440 440
 				
441 441
                 case 'intl' :
442
-					$note = __( 'Payment must be accepted manually through PayPal due to international account regulations', 'invoicing' );
443
-					break;
442
+                    $note = __( 'Payment must be accepted manually through PayPal due to international account regulations', 'invoicing' );
443
+                    break;
444 444
 				
445 445
                 case 'multi-currency' :
446
-					$note = __( 'Payment received in non-shop currency and must be accepted manually through PayPal', 'invoicing' );
447
-					break;
446
+                    $note = __( 'Payment received in non-shop currency and must be accepted manually through PayPal', 'invoicing' );
447
+                    break;
448 448
 				
449 449
                 case 'paymentreview' :
450 450
                 case 'regulatory_review' :
451
-					$note = __( 'Payment is being reviewed by PayPal staff as high-risk or in possible violation of government regulations', 'invoicing' );
452
-					break;
451
+                    $note = __( 'Payment is being reviewed by PayPal staff as high-risk or in possible violation of government regulations', 'invoicing' );
452
+                    break;
453 453
 				
454 454
                 case 'unilateral' :
455
-					$note = __( 'Payment was sent to non-confirmed or non-registered email address.', 'invoicing' );
456
-					break;
455
+                    $note = __( 'Payment was sent to non-confirmed or non-registered email address.', 'invoicing' );
456
+                    break;
457 457
 				
458 458
                 case 'upgrade' :
459
-					$note = __( 'PayPal account must be upgraded before this payment can be accepted', 'invoicing' );
460
-					break;
459
+                    $note = __( 'PayPal account must be upgraded before this payment can be accepted', 'invoicing' );
460
+                    break;
461 461
 				
462 462
                 case 'verify' :
463
-					$note = __( 'PayPal account is not verified. Verify account in order to accept this payment', 'invoicing' );
464
-					break;
465
-
466
-				case 'other' :
467
-					$note = __( 'Payment is pending for unknown reasons. Contact PayPal support for assistance', 'invoicing' );
468
-					break;
469
-			}
470
-
471
-			if ( ! empty( $note ) ) {
472
-				wpinv_insert_payment_note( $invoice_id, $note, '', '', true );
473
-			}
474
-		} else {
475
-			wpinv_insert_payment_note( $invoice_id, wp_sprintf( __( 'PayPal IPN has been received with invalid payment status: %s', 'invoicing' ), $payment_status ), '', '', true );
476
-		}
477
-	}
463
+                    $note = __( 'PayPal account is not verified. Verify account in order to accept this payment', 'invoicing' );
464
+                    break;
465
+
466
+                case 'other' :
467
+                    $note = __( 'Payment is pending for unknown reasons. Contact PayPal support for assistance', 'invoicing' );
468
+                    break;
469
+            }
470
+
471
+            if ( ! empty( $note ) ) {
472
+                wpinv_insert_payment_note( $invoice_id, $note, '', '', true );
473
+            }
474
+        } else {
475
+            wpinv_insert_payment_note( $invoice_id, wp_sprintf( __( 'PayPal IPN has been received with invalid payment status: %s', 'invoicing' ), $payment_status ), '', '', true );
476
+        }
477
+    }
478 478
 }
479 479
 add_action( 'wpinv_paypal_web_accept', 'wpinv_process_paypal_web_accept_and_cart', 10, 2 );
480 480
 
@@ -668,34 +668,34 @@  discard block
 block discarded – undo
668 668
 }
669 669
 
670 670
 function wpinv_process_paypal_refund( $data, $invoice_id = 0 ) {
671
-	// Collect payment details
671
+    // Collect payment details
672 672
 
673
-	if( empty( $invoice_id ) ) {
674
-		return;
675
-	}
673
+    if( empty( $invoice_id ) ) {
674
+        return;
675
+    }
676 676
 
677
-	if ( get_post_status( $invoice_id ) == 'wpi-refunded' ) {
678
-		return; // Only refund payments once
679
-	}
677
+    if ( get_post_status( $invoice_id ) == 'wpi-refunded' ) {
678
+        return; // Only refund payments once
679
+    }
680 680
 
681
-	$payment_amount = wpinv_payment_total( $invoice_id );
682
-	$refund_amount  = $data['mc_gross'] * -1;
681
+    $payment_amount = wpinv_payment_total( $invoice_id );
682
+    $refund_amount  = $data['mc_gross'] * -1;
683 683
 
684
-	do_action( 'wpinv_paypal_refund_request', $data, $invoice_id );
684
+    do_action( 'wpinv_paypal_refund_request', $data, $invoice_id );
685 685
 
686
-	if ( number_format( (float) $refund_amount, 2 ) < number_format( (float) $payment_amount, 2 ) ) {
687
-		wpinv_insert_payment_note( $invoice_id, wp_sprintf( __( 'PayPal partial refund of %s processed for transaction #%s for reason: %s', 'invoicing' ), (float)$refund_amount . ' '. $data['mc_currency'], $data['parent_txn_id'], $data['reason_code'] ), '', '', true );
686
+    if ( number_format( (float) $refund_amount, 2 ) < number_format( (float) $payment_amount, 2 ) ) {
687
+        wpinv_insert_payment_note( $invoice_id, wp_sprintf( __( 'PayPal partial refund of %s processed for transaction #%s for reason: %s', 'invoicing' ), (float)$refund_amount . ' '. $data['mc_currency'], $data['parent_txn_id'], $data['reason_code'] ), '', '', true );
688 688
 
689
-		do_action( 'wpinv_paypal_invoice_partially_refunded', $data, $invoice_id, $refund_amount );
689
+        do_action( 'wpinv_paypal_invoice_partially_refunded', $data, $invoice_id, $refund_amount );
690 690
 
691
-		return; // This is a partial refund
692
-	}
691
+        return; // This is a partial refund
692
+    }
693 693
 
694
-	wpinv_insert_payment_note( $invoice_id, sprintf( __( 'PayPal Payment #%s Refunded for reason: %s', 'invoicing' ), $data['parent_txn_id'], $data['reason_code'] ), '', '', true );
695
-	wpinv_insert_payment_note( $invoice_id, sprintf( __( 'PayPal Refund Transaction ID: %s', 'invoicing' ), $data['txn_id'] ), '', '', true );
696
-	wpinv_update_payment_status( $invoice_id, 'wpi-refunded' );
694
+    wpinv_insert_payment_note( $invoice_id, sprintf( __( 'PayPal Payment #%s Refunded for reason: %s', 'invoicing' ), $data['parent_txn_id'], $data['reason_code'] ), '', '', true );
695
+    wpinv_insert_payment_note( $invoice_id, sprintf( __( 'PayPal Refund Transaction ID: %s', 'invoicing' ), $data['txn_id'] ), '', '', true );
696
+    wpinv_update_payment_status( $invoice_id, 'wpi-refunded' );
697 697
 
698
-	do_action( 'wpinv_paypal_invoice_fully_refunded', $data, $invoice_id );
698
+    do_action( 'wpinv_paypal_invoice_fully_refunded', $data, $invoice_id );
699 699
 }
700 700
 
701 701
 function wpinv_get_paypal_redirect( $ssl_check = false ) {
Please login to merge, or discard this patch.
includes/api/class-wpinv-rest-discounts-controller.php 1 patch
Indentation   +970 added lines, -970 removed lines patch added patch discarded remove patch
@@ -20,91 +20,91 @@  discard block
 block discarded – undo
20 20
 class WPInv_REST_Discounts_Controller extends WP_REST_Posts_Controller {
21 21
 
22 22
     /**
23
-	 * Post type.
24
-	 *
25
-	 * @var string
26
-	 */
27
-	protected $post_type = 'wpi_discount';
23
+     * Post type.
24
+     *
25
+     * @var string
26
+     */
27
+    protected $post_type = 'wpi_discount';
28 28
 	
29
-	/**
30
-	 * Cached results of get_item_schema.
31
-	 *
32
-	 * @since 1.0.13
33
-	 * @var array
34
-	 */
35
-	protected $schema;
29
+    /**
30
+     * Cached results of get_item_schema.
31
+     *
32
+     * @since 1.0.13
33
+     * @var array
34
+     */
35
+    protected $schema;
36 36
 
37 37
     /**
38
-	 * Constructor.
39
-	 *
40
-	 * @since 1.0.13
41
-	 *
42
-	 * @param string $namespace Api Namespace
43
-	 */
44
-	public function __construct( $namespace ) {
38
+     * Constructor.
39
+     *
40
+     * @since 1.0.13
41
+     *
42
+     * @param string $namespace Api Namespace
43
+     */
44
+    public function __construct( $namespace ) {
45 45
         
46 46
         // Set api namespace...
47
-		$this->namespace = $namespace;
47
+        $this->namespace = $namespace;
48 48
 
49 49
         // ... and the rest base
50 50
         $this->rest_base = 'discounts';
51 51
 		
52 52
     }
53 53
 	
54
-	/**
55
-	 * Registers the routes for the objects of the controller.
56
-	 *
57
-	 * @since 1.0.13
58
-	 *
59
-	 * @see register_rest_route()
60
-	 */
61
-	public function register_routes() {
62
-
63
-		parent::register_routes();
64
-
65
-		register_rest_route(
66
-			$this->namespace,
67
-			'/' . $this->rest_base . '/discount-types',
68
-			array(
69
-				array(
70
-					'methods'             => WP_REST_Server::READABLE,
71
-					'callback'            => array( $this, 'get_discount_types' ),
72
-				),
73
-			)
74
-		);
75
-
76
-	}
54
+    /**
55
+     * Registers the routes for the objects of the controller.
56
+     *
57
+     * @since 1.0.13
58
+     *
59
+     * @see register_rest_route()
60
+     */
61
+    public function register_routes() {
62
+
63
+        parent::register_routes();
64
+
65
+        register_rest_route(
66
+            $this->namespace,
67
+            '/' . $this->rest_base . '/discount-types',
68
+            array(
69
+                array(
70
+                    'methods'             => WP_REST_Server::READABLE,
71
+                    'callback'            => array( $this, 'get_discount_types' ),
72
+                ),
73
+            )
74
+        );
75
+
76
+    }
77 77
 
78 78
     /**
79
-	 * Checks if a given request has access to read discounts.
79
+     * Checks if a given request has access to read discounts.
80 80
      * 
81
-	 *
82
-	 * @since 1.0.13
83
-	 *
84
-	 * @param WP_REST_Request $request Full details about the request.
85
-	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
86
-	 */
87
-	public function get_items_permissions_check( $request ) {
81
+     *
82
+     * @since 1.0.13
83
+     *
84
+     * @param WP_REST_Request $request Full details about the request.
85
+     * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
86
+     */
87
+    public function get_items_permissions_check( $request ) {
88 88
 	
89
-		if ( wpinv_current_user_can_manage_invoicing() ) {
90
-			return true;
91
-		}
89
+        if ( wpinv_current_user_can_manage_invoicing() ) {
90
+            return true;
91
+        }
92 92
 
93
-		return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to view invoice discounts.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
93
+        return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to view invoice discounts.', 'invoicing' ), array( 'status' => rest_authorization_required_code() ) );
94 94
 
95 95
     }
96 96
     
97 97
     /**
98
-	 * Retrieves a collection of discounts.
99
-	 *
100
-	 * @since 1.0.13
101
-	 *
102
-	 * @param WP_REST_Request $request Full details about the request.
103
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
104
-	 */
105
-	public function get_items( $request ) {
98
+     * Retrieves a collection of discounts.
99
+     *
100
+     * @since 1.0.13
101
+     *
102
+     * @param WP_REST_Request $request Full details about the request.
103
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
104
+     */
105
+    public function get_items( $request ) {
106 106
 		
107
-		// Retrieve the list of registered item query parameters.
107
+        // Retrieve the list of registered item query parameters.
108 108
         $registered = $this->get_collection_params();
109 109
         
110 110
         $args       = array();
@@ -115,52 +115,52 @@  discard block
 block discarded – undo
115 115
                 $args[ $key ] = $request[ $key];
116 116
             }
117 117
 
118
-		} 
119
-
120
-		/**
121
-		 * Filters the wpinv_get_all_discounts arguments for discounts rest requests.
122
-		 *
123
-		 *
124
-		 * @since 1.0.13
125
-		 *
126
-		 *
127
-		 * @param array           $args    Key value array of query var to query value.
128
-		 * @param WP_REST_Request $request The request used.
129
-		 */
118
+        } 
119
+
120
+        /**
121
+         * Filters the wpinv_get_all_discounts arguments for discounts rest requests.
122
+         *
123
+         *
124
+         * @since 1.0.13
125
+         *
126
+         *
127
+         * @param array           $args    Key value array of query var to query value.
128
+         * @param WP_REST_Request $request The request used.
129
+         */
130 130
         $args       = apply_filters( "wpinv_rest_get_discounts_arguments", $args, $request, $this );
131 131
 		
132
-		// Special args
133
-		$args[ 'return' ]   = 'objects';
134
-		$args[ 'paginate' ] = true;
132
+        // Special args
133
+        $args[ 'return' ]   = 'objects';
134
+        $args[ 'paginate' ] = true;
135 135
 
136 136
         // Run the query.
137
-		$query = wpinv_get_all_discounts( $args );
137
+        $query = wpinv_get_all_discounts( $args );
138 138
 		
139
-		// Prepare the retrieved discounts
140
-		$discounts = array();
141
-		foreach( $query->discounts as $discount ) {
142
-
143
-			$data       = $this->prepare_item_for_response( $discount, $request );
144
-			$discounts[]    = $this->prepare_response_for_collection( $data );
145
-
146
-		}
147
-
148
-		// Prepare the response.
149
-		$response = rest_ensure_response( $discounts );
150
-		$response->header( 'X-WP-Total', (int) $query->total );
151
-		$response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
152
-
153
-		/**
154
-		 * Filters the responses for discount requests.
155
-		 *
156
-		 *
157
-		 * @since 1.0.13
158
-		 *
159
-		 *
160
-		 * @param arrWP_REST_Response $response    Response object.
161
-		 * @param WP_REST_Request     $request The request used.
139
+        // Prepare the retrieved discounts
140
+        $discounts = array();
141
+        foreach( $query->discounts as $discount ) {
142
+
143
+            $data       = $this->prepare_item_for_response( $discount, $request );
144
+            $discounts[]    = $this->prepare_response_for_collection( $data );
145
+
146
+        }
147
+
148
+        // Prepare the response.
149
+        $response = rest_ensure_response( $discounts );
150
+        $response->header( 'X-WP-Total', (int) $query->total );
151
+        $response->header( 'X-WP-TotalPages', (int) $query->max_num_pages );
152
+
153
+        /**
154
+         * Filters the responses for discount requests.
155
+         *
156
+         *
157
+         * @since 1.0.13
158
+         *
159
+         *
160
+         * @param arrWP_REST_Response $response    Response object.
161
+         * @param WP_REST_Request     $request The request used.
162 162
          * @param array               $args Array of args used to retrieve the discounts
163
-		 */
163
+         */
164 164
         $response       = apply_filters( "wpinv_rest_discounts_response", $response, $request, $args );
165 165
 
166 166
         return rest_ensure_response( $response );
@@ -168,25 +168,25 @@  discard block
 block discarded – undo
168 168
     }
169 169
 
170 170
     /**
171
-	 * Get the post, if the ID is valid.
172
-	 *
173
-	 * @since 1.0.13
174
-	 *
175
-	 * @param int $discount_id Supplied ID.
176
-	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
177
-	 */
178
-	protected function get_post( $discount_id ) {
171
+     * Get the post, if the ID is valid.
172
+     *
173
+     * @since 1.0.13
174
+     *
175
+     * @param int $discount_id Supplied ID.
176
+     * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
177
+     */
178
+    protected function get_post( $discount_id ) {
179 179
 		
180
-		$error     = new WP_Error( 'rest_item_invalid_id', __( 'Invalid discount ID.', 'invoicing' ), array( 'status' => 404 ) );
180
+        $error     = new WP_Error( 'rest_item_invalid_id', __( 'Invalid discount ID.', 'invoicing' ), array( 'status' => 404 ) );
181 181
 
182 182
         // Ids start from 1
183 183
         if ( (int) $discount_id <= 0 ) {
184
-			return $error;
185
-		}
184
+            return $error;
185
+        }
186 186
 
187
-		$discount = wpinv_get_discount( (int) $discount_id );
188
-		if ( empty( $discount ) ) {
189
-			return $error;
187
+        $discount = wpinv_get_discount( (int) $discount_id );
188
+        if ( empty( $discount ) ) {
189
+            return $error;
190 190
         }
191 191
 
192 192
         return $discount;
@@ -194,25 +194,25 @@  discard block
 block discarded – undo
194 194
     }
195 195
 
196 196
     /**
197
-	 * Checks if a given request has access to read a discount.
198
-	 *
199
-	 * @since 1.0.13
200
-	 *
201
-	 * @param WP_REST_Request $request Full details about the request.
202
-	 * @return bool|WP_Error True if the request has read access for the invoice item, WP_Error object otherwise.
203
-	 */
204
-	public function get_item_permissions_check( $request ) {
197
+     * Checks if a given request has access to read a discount.
198
+     *
199
+     * @since 1.0.13
200
+     *
201
+     * @param WP_REST_Request $request Full details about the request.
202
+     * @return bool|WP_Error True if the request has read access for the invoice item, WP_Error object otherwise.
203
+     */
204
+    public function get_item_permissions_check( $request ) {
205 205
 
206 206
         // Retrieve the discount object.
207 207
         $discount = $this->get_post( $request['id'] );
208 208
         
209 209
         // Ensure it is valid.
210
-		if ( is_wp_error( $discount ) ) {
211
-			return $discount;
212
-		}
210
+        if ( is_wp_error( $discount ) ) {
211
+            return $discount;
212
+        }
213 213
 
214
-		if ( ! wpinv_current_user_can_manage_invoicing() ) {
215
-			return new WP_Error(
214
+        if ( ! wpinv_current_user_can_manage_invoicing() ) {
215
+            return new WP_Error(
216 216
                 'rest_cannot_view', 
217 217
                 __( 'Sorry, you are not allowed to view this discount.', 'invoicing' ), 
218 218
                 array( 
@@ -221,40 +221,40 @@  discard block
 block discarded – undo
221 221
             );
222 222
         }
223 223
 
224
-		return true;
224
+        return true;
225 225
     }
226 226
     
227 227
     /**
228
-	 * Retrieves a single invoice item.
229
-	 *
230
-	 * @since 1.0.13
231
-	 *
232
-	 * @param WP_REST_Request $request Full details about the request.
233
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
234
-	 */
235
-	public function get_item( $request ) {
228
+     * Retrieves a single invoice item.
229
+     *
230
+     * @since 1.0.13
231
+     *
232
+     * @param WP_REST_Request $request Full details about the request.
233
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
234
+     */
235
+    public function get_item( $request ) {
236 236
 
237 237
         // Fetch the discount.
238 238
         $discount = $this->get_post( $request['id'] );
239 239
         
240 240
         // Abort early if it does not exist
241
-		if ( is_wp_error( $discount ) ) {
242
-			return $discount;
243
-		}
244
-
245
-		// Prepare the response
246
-		$response = $this->prepare_item_for_response( $discount, $request );
247
-
248
-		/**
249
-		 * Filters the responses for single discount requests.
250
-		 *
251
-		 *
252
-		 * @since 1.0.13
253
-		 * @var WP_HTTP_Response
254
-		 *
255
-		 * @param WP_HTTP_Response $response Response.
256
-		 * @param WP_REST_Request  $request The request used.
257
-		 */
241
+        if ( is_wp_error( $discount ) ) {
242
+            return $discount;
243
+        }
244
+
245
+        // Prepare the response
246
+        $response = $this->prepare_item_for_response( $discount, $request );
247
+
248
+        /**
249
+         * Filters the responses for single discount requests.
250
+         *
251
+         *
252
+         * @since 1.0.13
253
+         * @var WP_HTTP_Response
254
+         *
255
+         * @param WP_HTTP_Response $response Response.
256
+         * @param WP_REST_Request  $request The request used.
257
+         */
258 258
         $response       = apply_filters( "wpinv_rest_get_discount_response", $response, $request );
259 259
 
260 260
         return rest_ensure_response( $response );
@@ -262,26 +262,26 @@  discard block
 block discarded – undo
262 262
     }
263 263
     
264 264
     /**
265
-	 * Checks if a given request has access to create an invoice item.
266
-	 *
267
-	 * @since 1.0.13
268
-	 *
269
-	 * @param WP_REST_Request $request Full details about the request.
270
-	 * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
271
-	 */
272
-	public function create_item_permissions_check( $request ) {
265
+     * Checks if a given request has access to create an invoice item.
266
+     *
267
+     * @since 1.0.13
268
+     *
269
+     * @param WP_REST_Request $request Full details about the request.
270
+     * @return true|WP_Error True if the request has access to create items, WP_Error object otherwise.
271
+     */
272
+    public function create_item_permissions_check( $request ) {
273 273
 	
274
-		if ( ! empty( $request['id'] ) ) {
275
-			return new WP_Error( 'rest_item_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
276
-		}
274
+        if ( ! empty( $request['id'] ) ) {
275
+            return new WP_Error( 'rest_item_exists', __( 'Cannot create existing item.', 'invoicing' ), array( 'status' => 400 ) );
276
+        }
277 277
 
278
-		if ( wpinv_current_user_can_manage_invoicing() ) {
279
-			return true;
280
-		}
278
+        if ( wpinv_current_user_can_manage_invoicing() ) {
279
+            return true;
280
+        }
281 281
 
282
-		$post_type = get_post_type_object( $this->post_type );
283
-		if ( ! current_user_can( $post_type->cap->create_posts ) ) {
284
-			return new WP_Error( 
282
+        $post_type = get_post_type_object( $this->post_type );
283
+        if ( ! current_user_can( $post_type->cap->create_posts ) ) {
284
+            return new WP_Error( 
285 285
                 'rest_cannot_create', 
286 286
                 __( 'Sorry, you are not allowed to create discounts as this user.', 'invoicing' ), 
287 287
                 array( 
@@ -290,261 +290,261 @@  discard block
 block discarded – undo
290 290
             );
291 291
         }
292 292
 
293
-		return true;
293
+        return true;
294 294
     }
295 295
     
296 296
     /**
297
-	 * Creates a single discount.
298
-	 *
299
-	 * @since 1.0.13
300
-	 *
301
-	 * @param WP_REST_Request $request Full details about the request.
302
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
303
-	 */
304
-	public function create_item( $request ) {
305
-
306
-		if ( ! empty( $request['id'] ) ) {
307
-			return new WP_Error( 'rest_item_exists', __( 'Cannot create existing discount.', 'invoicing' ), array( 'status' => 400 ) );
308
-		}
297
+     * Creates a single discount.
298
+     *
299
+     * @since 1.0.13
300
+     *
301
+     * @param WP_REST_Request $request Full details about the request.
302
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
303
+     */
304
+    public function create_item( $request ) {
305
+
306
+        if ( ! empty( $request['id'] ) ) {
307
+            return new WP_Error( 'rest_item_exists', __( 'Cannot create existing discount.', 'invoicing' ), array( 'status' => 400 ) );
308
+        }
309 309
 
310
-		$request->set_param( 'context', 'edit' );
310
+        $request->set_param( 'context', 'edit' );
311 311
 
312
-		// Prepare the updated data.
313
-		$discount_data = $this->prepare_item_for_database( $request );
312
+        // Prepare the updated data.
313
+        $discount_data = $this->prepare_item_for_database( $request );
314 314
 
315
-		if ( is_wp_error( $discount_data ) ) {
316
-			return $discount_data;
317
-		}
315
+        if ( is_wp_error( $discount_data ) ) {
316
+            return $discount_data;
317
+        }
318 318
 
319
-		$discount_data['post_type'] = $this->post_type;
319
+        $discount_data['post_type'] = $this->post_type;
320 320
 
321
-		// Try creating the discount.
321
+        // Try creating the discount.
322 322
         $discount = wp_insert_post( $discount_data, true );
323 323
 
324
-		if ( is_wp_error( $discount ) ) {
324
+        if ( is_wp_error( $discount ) ) {
325 325
             return $discount;
326
-		}
327
-
328
-		// Prepare the response
329
-		$response = $this->prepare_item_for_response( $discount, $request );
330
-
331
-		/**
332
-		 * Fires after a single discount is created or updated via the REST API.
333
-		 *
334
-		 * @since 1.0.13
335
-		 *
336
-		 * @param WP_Post   $discount  Inserted or updated discount object.
337
-		 * @param WP_REST_Request $request  Request object.
338
-		 * @param bool            $creating True when creating a post, false when updating.
339
-		 */
340
-		do_action( "wpinv_rest_insert_discount", $discount, $request, true );
341
-
342
-		/**
343
-		 * Filters the responses for creating single item requests.
344
-		 *
345
-		 *
346
-		 * @since 1.0.13
347
-		 *
348
-		 *
349
-		 * @param array           $response Invoice properties.
350
-		 * @param WP_REST_Request $request The request used.
351
-		 */
326
+        }
327
+
328
+        // Prepare the response
329
+        $response = $this->prepare_item_for_response( $discount, $request );
330
+
331
+        /**
332
+         * Fires after a single discount is created or updated via the REST API.
333
+         *
334
+         * @since 1.0.13
335
+         *
336
+         * @param WP_Post   $discount  Inserted or updated discount object.
337
+         * @param WP_REST_Request $request  Request object.
338
+         * @param bool            $creating True when creating a post, false when updating.
339
+         */
340
+        do_action( "wpinv_rest_insert_discount", $discount, $request, true );
341
+
342
+        /**
343
+         * Filters the responses for creating single item requests.
344
+         *
345
+         *
346
+         * @since 1.0.13
347
+         *
348
+         *
349
+         * @param array           $response Invoice properties.
350
+         * @param WP_REST_Request $request The request used.
351
+         */
352 352
         $response       = apply_filters( "wpinv_rest_create_discount_response", $response, $request );
353 353
 
354 354
         return rest_ensure_response( $response );
355
-	}
356
-
357
-	/**
358
-	 * Checks if a given request has access to update a discount.
359
-	 *
360
-	 * @since 1.0.13
361
-	 *
362
-	 * @param WP_REST_Request $request Full details about the request.
363
-	 * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
364
-	 */
365
-	public function update_item_permissions_check( $request ) {
366
-
367
-		// Retrieve the item.
368
-		$item = $this->get_post( $request['id'] );
369
-		if ( is_wp_error( $item ) ) {
370
-			return $item;
371
-		}
372
-
373
-		if ( wpinv_current_user_can_manage_invoicing() ) {
374
-			return true;
375
-		}
376
-
377
-		return new WP_Error( 
378
-			'rest_cannot_edit', 
379
-			__( 'Sorry, you are not allowed to update this discount.', 'invoicing' ), 
380
-			array( 
381
-				'status' => rest_authorization_required_code(),
382
-			)
383
-		);
384
-
385
-	}
386
-
387
-	/**
388
-	 * Updates a single discount.
389
-	 *
390
-	 * @since 1.0.13
391
-	 *
392
-	 * @param WP_REST_Request $request Full details about the request.
393
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
394
-	 */
395
-	public function update_item( $request ) {
355
+    }
356
+
357
+    /**
358
+     * Checks if a given request has access to update a discount.
359
+     *
360
+     * @since 1.0.13
361
+     *
362
+     * @param WP_REST_Request $request Full details about the request.
363
+     * @return true|WP_Error True if the request has access to update the item, WP_Error object otherwise.
364
+     */
365
+    public function update_item_permissions_check( $request ) {
366
+
367
+        // Retrieve the item.
368
+        $item = $this->get_post( $request['id'] );
369
+        if ( is_wp_error( $item ) ) {
370
+            return $item;
371
+        }
372
+
373
+        if ( wpinv_current_user_can_manage_invoicing() ) {
374
+            return true;
375
+        }
376
+
377
+        return new WP_Error( 
378
+            'rest_cannot_edit', 
379
+            __( 'Sorry, you are not allowed to update this discount.', 'invoicing' ), 
380
+            array( 
381
+                'status' => rest_authorization_required_code(),
382
+            )
383
+        );
384
+
385
+    }
386
+
387
+    /**
388
+     * Updates a single discount.
389
+     *
390
+     * @since 1.0.13
391
+     *
392
+     * @param WP_REST_Request $request Full details about the request.
393
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
394
+     */
395
+    public function update_item( $request ) {
396 396
 		
397
-		// Ensure the item exists.
397
+        // Ensure the item exists.
398 398
         $valid_check = $this->get_post( $request['id'] );
399 399
         
400 400
         // Abort early if it does not exist
401
-		if ( is_wp_error( $valid_check ) ) {
402
-			return $valid_check;
403
-		}
401
+        if ( is_wp_error( $valid_check ) ) {
402
+            return $valid_check;
403
+        }
404 404
 
405
-		$request->set_param( 'context', 'edit' );
405
+        $request->set_param( 'context', 'edit' );
406 406
 
407
-		// Prepare the updated data.
408
-		$data_to_update = $this->prepare_item_for_database( $request );
407
+        // Prepare the updated data.
408
+        $data_to_update = $this->prepare_item_for_database( $request );
409 409
 
410
-		if ( is_wp_error( $data_to_update ) ) {
411
-			return $data_to_update;
412
-		}
410
+        if ( is_wp_error( $data_to_update ) ) {
411
+            return $data_to_update;
412
+        }
413 413
 
414
-		if( empty( $data_to_update['meta_input'] ) ) {
415
-			unset( $data_to_update['meta_input'] );
416
-		}
414
+        if( empty( $data_to_update['meta_input'] ) ) {
415
+            unset( $data_to_update['meta_input'] );
416
+        }
417 417
 
418
-		// Abort if no item data is provided
418
+        // Abort if no item data is provided
419 419
         if( empty( $data_to_update ) ) {
420 420
             return new WP_Error( 'missing_data', __( 'An update request cannot be empty.', 'invoicing' ) );
421
-		}
421
+        }
422 422
 		
423
-		// post_status
424
-		if( ! empty( $data_to_update['post_status'] ) ) {
425
-			wpinv_update_discount_status( $request['id'], $data_to_update['post_status'] );
426
-			unset( $data_to_update['post_status'] );
427
-		}
423
+        // post_status
424
+        if( ! empty( $data_to_update['post_status'] ) ) {
425
+            wpinv_update_discount_status( $request['id'], $data_to_update['post_status'] );
426
+            unset( $data_to_update['post_status'] );
427
+        }
428 428
 
429
-		// Update the item
430
-		if( ! empty( $data_to_update ) ) {
429
+        // Update the item
430
+        if( ! empty( $data_to_update ) ) {
431 431
 
432
-			// Include the item ID
433
-			$data_to_update['ID'] = $request['id'];
432
+            // Include the item ID
433
+            $data_to_update['ID'] = $request['id'];
434 434
 
435
-			$updated = wp_update_post( $data_to_update, true );
435
+            $updated = wp_update_post( $data_to_update, true );
436 436
 
437
-			// Incase the update operation failed...
438
-			if ( is_wp_error( $updated ) ) {
439
-				return $updated;
440
-			}
437
+            // Incase the update operation failed...
438
+            if ( is_wp_error( $updated ) ) {
439
+                return $updated;
440
+            }
441 441
 
442
-		}
442
+        }
443 443
 
444
-		$updated_discount = get_post( $request['id'] );
444
+        $updated_discount = get_post( $request['id'] );
445 445
 
446
-		// Prepare the response
447
-		$response = $this->prepare_item_for_response( $updated_discount, $request );
446
+        // Prepare the response
447
+        $response = $this->prepare_item_for_response( $updated_discount, $request );
448 448
 
449
-		/** This action is documented in includes/class-wpinv-rest-item-controller.php */
450
-		do_action( "wpinv_rest_insert_discount", $updated_discount, $request, false );
449
+        /** This action is documented in includes/class-wpinv-rest-item-controller.php */
450
+        do_action( "wpinv_rest_insert_discount", $updated_discount, $request, false );
451 451
 
452
-		/**
453
-		 * Filters the responses for updating single discount requests.
454
-		 *
455
-		 *
456
-		 * @since 1.0.13
457
-		 *
458
-		 *
459
-		 * @param array           $data_to_update Discount properties.
460
-		 * @param WP_REST_Request $request The request used.
461
-		 */
452
+        /**
453
+         * Filters the responses for updating single discount requests.
454
+         *
455
+         *
456
+         * @since 1.0.13
457
+         *
458
+         *
459
+         * @param array           $data_to_update Discount properties.
460
+         * @param WP_REST_Request $request The request used.
461
+         */
462 462
         $response       = apply_filters( "wpinv_rest_update_discount_response", $response,  $data_to_update, $request );
463 463
 
464 464
         return rest_ensure_response( $response );
465
-	}
466
-
467
-	/**
468
-	 * Checks if a given request has access to delete a discount.
469
-	 *
470
-	 * @since 1.0.13
471
-	 *
472
-	 * @param WP_REST_Request $request Full details about the request.
473
-	 * @return true|WP_Error True if the request has access to delete the discount, WP_Error object otherwise.
474
-	 */
475
-	public function delete_item_permissions_check( $request ) {
476
-
477
-		// Retrieve the discount.
478
-		$discount = $this->get_post( $request['id'] );
479
-		if ( is_wp_error( $discount ) ) {
480
-			return $discount;
481
-		} 
482
-
483
-		// Ensure the current user can delete the discount
484
-		if (! wpinv_current_user_can_manage_invoicing() ) {
485
-			return new WP_Error( 
465
+    }
466
+
467
+    /**
468
+     * Checks if a given request has access to delete a discount.
469
+     *
470
+     * @since 1.0.13
471
+     *
472
+     * @param WP_REST_Request $request Full details about the request.
473
+     * @return true|WP_Error True if the request has access to delete the discount, WP_Error object otherwise.
474
+     */
475
+    public function delete_item_permissions_check( $request ) {
476
+
477
+        // Retrieve the discount.
478
+        $discount = $this->get_post( $request['id'] );
479
+        if ( is_wp_error( $discount ) ) {
480
+            return $discount;
481
+        } 
482
+
483
+        // Ensure the current user can delete the discount
484
+        if (! wpinv_current_user_can_manage_invoicing() ) {
485
+            return new WP_Error( 
486 486
                 'rest_cannot_delete', 
487 487
                 __( 'Sorry, you are not allowed to delete this discount.', 'invoicing' ), 
488 488
                 array( 
489 489
                     'status' => rest_authorization_required_code(),
490 490
                 )
491 491
             );
492
-		}
493
-
494
-		return true;
495
-	}
496
-
497
-	/**
498
-	 * Deletes a single discount.
499
-	 *
500
-	 * @since 1.0.13
501
-	 *
502
-	 * @param WP_REST_Request $request Full details about the request.
503
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
504
-	 */
505
-	public function delete_item( $request ) {
492
+        }
493
+
494
+        return true;
495
+    }
496
+
497
+    /**
498
+     * Deletes a single discount.
499
+     *
500
+     * @since 1.0.13
501
+     *
502
+     * @param WP_REST_Request $request Full details about the request.
503
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
504
+     */
505
+    public function delete_item( $request ) {
506 506
 		
507
-		// Retrieve the discount.
508
-		$discount = $this->get_post( $request['id'] );
509
-		if ( is_wp_error( $discount ) ) {
510
-			return $discount;
511
-		}
507
+        // Retrieve the discount.
508
+        $discount = $this->get_post( $request['id'] );
509
+        if ( is_wp_error( $discount ) ) {
510
+            return $discount;
511
+        }
512 512
 
513
-		$request->set_param( 'context', 'edit' );
513
+        $request->set_param( 'context', 'edit' );
514 514
 
515
-		// Prepare the discount id
516
-		$id    = $discount->ID;
515
+        // Prepare the discount id
516
+        $id    = $discount->ID;
517 517
 
518
-		// Prepare the response
519
-		$response = $this->prepare_item_for_response( $discount, $request );
518
+        // Prepare the response
519
+        $response = $this->prepare_item_for_response( $discount, $request );
520 520
 
521
-		// Delete the discount...
522
-		wpinv_remove_discount( $id );
521
+        // Delete the discount...
522
+        wpinv_remove_discount( $id );
523 523
 
524
-		/**
525
-		 * Fires immediately after a single discount is deleted via the REST API.
526
-		 *
527
-		 *
528
-		 * @since 1.0.13
529
-		 *
530
-		 * @param WP_POST    $discount  The deleted discount.
531
-		 * @param WP_REST_Request  $request  The request sent to the API.
532
-		 */
533
-		do_action( "wpinv_rest_delete_discount", $discount, $request );
524
+        /**
525
+         * Fires immediately after a single discount is deleted via the REST API.
526
+         *
527
+         *
528
+         * @since 1.0.13
529
+         *
530
+         * @param WP_POST    $discount  The deleted discount.
531
+         * @param WP_REST_Request  $request  The request sent to the API.
532
+         */
533
+        do_action( "wpinv_rest_delete_discount", $discount, $request );
534 534
 
535
-		return $response;
535
+        return $response;
536 536
 
537
-	}
537
+    }
538 538
     
539 539
     
540 540
     /**
541
-	 * Retrieves the query params for the discount collection.
542
-	 *
543
-	 * @since 1.0.13
544
-	 *
545
-	 * @return array Collection parameters.
546
-	 */
547
-	public function get_collection_params() {
541
+     * Retrieves the query params for the discount collection.
542
+     *
543
+     * @since 1.0.13
544
+     *
545
+     * @return array Collection parameters.
546
+     */
547
+    public function get_collection_params() {
548 548
         
549 549
         $query_params               = array(
550 550
 
@@ -558,27 +558,27 @@  discard block
 block discarded – undo
558 558
             
559 559
             // Discount types
560 560
             'type'                  => array(
561
-				'description'       => __( 'Type of discounts to fetch.', 'invoicing' ),
562
-				'type'              => 'array',
563
-				'default'           => array_keys( wpinv_get_discount_types() ),
564
-				'items'             => array(
561
+                'description'       => __( 'Type of discounts to fetch.', 'invoicing' ),
562
+                'type'              => 'array',
563
+                'default'           => array_keys( wpinv_get_discount_types() ),
564
+                'items'             => array(
565 565
                     'enum'          => array_keys( wpinv_get_discount_types() ),
566 566
                     'type'          => 'string',
567 567
                 ),
568
-			),
568
+            ),
569 569
 			
570
-			// Number of results per page
570
+            // Number of results per page
571 571
             'limit'                 => array(
572
-				'description'       => __( 'Number of discounts to fetch.', 'invoicing' ),
573
-				'type'              => 'integer',
574
-				'default'           => (int) get_option( 'posts_per_page' ),
572
+                'description'       => __( 'Number of discounts to fetch.', 'invoicing' ),
573
+                'type'              => 'integer',
574
+                'default'           => (int) get_option( 'posts_per_page' ),
575 575
             ),
576 576
 
577 577
             // Pagination
578 578
             'page'     => array(
579
-				'description'       => __( 'Current page to fetch.', 'invoicing' ),
580
-				'type'              => 'integer',
581
-				'default'           => 1,
579
+                'description'       => __( 'Current page to fetch.', 'invoicing' ),
580
+                'type'              => 'integer',
581
+                'default'           => 1,
582 582
             ),
583 583
 
584 584
             // Exclude certain items
@@ -601,9 +601,9 @@  discard block
 block discarded – undo
601 601
                     'date',
602 602
                     'ID',
603 603
                     'modified',
604
-					'title',
605
-					'relevance',
606
-					'rand'
604
+                    'title',
605
+                    'relevance',
606
+                    'rand'
607 607
                 ),
608 608
             ),
609 609
 
@@ -613,598 +613,598 @@  discard block
 block discarded – undo
613 613
                 'type'        => 'string',
614 614
                 'default'     => 'DESC',
615 615
                 'enum'        => array( 'ASC', 'DESC' ),
616
-			),
616
+            ),
617 617
 			
618
-			// Search term
618
+            // Search term
619 619
             'search'                => array(
620
-				'description'       => __( 'Return discounts that match the search term.', 'invoicing' ),
621
-				'type'              => 'string',
620
+                'description'       => __( 'Return discounts that match the search term.', 'invoicing' ),
621
+                'type'              => 'string',
622 622
             ),
623 623
         );
624 624
 
625
-		/**
626
-		 * Filter collection parameters for the discounts controller.
627
-		 *
628
-		 *
629
-		 * @since 1.0.13
630
-		 *
631
-		 * @param array        $query_params JSON Schema-formatted collection parameters.
632
-		 */
633
-		return apply_filters( "wpinv_rest_discounts_collection_params", $query_params );
625
+        /**
626
+         * Filter collection parameters for the discounts controller.
627
+         *
628
+         *
629
+         * @since 1.0.13
630
+         *
631
+         * @param array        $query_params JSON Schema-formatted collection parameters.
632
+         */
633
+        return apply_filters( "wpinv_rest_discounts_collection_params", $query_params );
634 634
     }
635 635
     
636 636
     /**
637
-	 * Checks if a given post type can be viewed or managed.
638
-	 *
639
-	 * @since 1.0.13
640
-	 *
641
-	 * @param object|string $post_type Post type name or object.
642
-	 * @return bool Whether the post type is allowed in REST.
643
-	 */
644
-	protected function check_is_post_type_allowed( $post_type ) {
645
-		return true;
646
-	}
647
-
648
-	/**
649
-	 * Prepares a single item for create or update.
650
-	 *
651
-	 * @since 1.0.13
652
-	 *
653
-	 * @param WP_REST_Request $request Request object.
654
-	 * @return array|WP_Error Discount Properties or WP_Error.
655
-	 */
656
-	protected function prepare_item_for_database( $request ) {
657
-		$prepared_item 		 = new stdClass();
658
-		$prepared_item->meta_input = array();
659
-
660
-		// Post ID.
661
-		if ( isset( $request['id'] ) ) {
662
-			$existing_item = $this->get_post( $request['id'] );
663
-			if ( is_wp_error( $existing_item ) ) {
664
-				return $existing_item;
665
-			}
666
-
667
-			$prepared_item->ID 		  = $existing_item->ID;
668
-		}
669
-
670
-		$schema = $this->get_item_schema();
671
-
672
-		// item title.
673
-		if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
674
-			$prepared_item->post_title = sanitize_text_field( $request['title'] );
675
-		}
676
-
677
-		// item status.
678
-		if ( ! empty( $schema['properties']['status'] ) && isset( $request['status'] ) && in_array( $request['status'], array_keys( get_post_stati( array( 'internal' => false ) ) ) ) ) {
679
-			$prepared_item->post_status = sanitize_text_field( $request['status'] );
680
-		}
681
-
682
-		// Code.
683
-		if ( ! empty( $schema['properties']['code'] ) && isset( $request['code'] ) ) {
684
-			$prepared_item->meta_input['_wpi_discount_code'] = trim( $request['code'] );
685
-		}
686
-
687
-		// Type.
688
-		if ( ! empty( $schema['properties']['type'] ) && isset( $request['type'] )  && in_array( $request['type'], array_keys( wpinv_get_discount_types() ) ) ) {
689
-			$prepared_item->meta_input['_wpi_discount_type'] = trim( $request['type'] );
690
-		}
691
-
692
-		// Amount.
693
-		if ( ! empty( $schema['properties']['amount'] ) && isset( $request['amount'] ) ) {
694
-			$prepared_item->meta_input['_wpi_discount_amount'] = floatval( $request['amount'] );
695
-		}
696
-
697
-		// Items.
698
-		if ( ! empty( $schema['properties']['items'] ) && isset( $request['items'] ) ) {
699
-			$prepared_item->meta_input['_wpi_discount_items'] = wpinv_parse_list( $request['items'] );
700
-		}
701
-
702
-		// Excluded Items.
703
-		if ( ! empty( $schema['properties']['exclude_items'] ) && isset( $request['exclude_items'] ) ) {
704
-			$prepared_item->meta_input['_wpi_discount_excluded_items'] = wpinv_parse_list( $request['exclude_items'] );
705
-		}
706
-
707
-		// Start date.
708
-		if ( ! empty( $schema['properties']['start_date'] ) && isset( $request['start_date'] ) ) {
709
-			$prepared_item->meta_input['_wpi_discount_start'] = trim( $request['start_date'] );
710
-		}
711
-
712
-		// End date.
713
-		if ( ! empty( $schema['properties']['end_date'] ) && isset( $request['end_date'] ) ) {
714
-			$prepared_item->meta_input['_wpi_discount_expiration'] = trim( $request['end_date'] );
715
-		}
716
-
717
-		// Minimum amount.
718
-		if ( ! empty( $schema['properties']['minimum_amount'] ) && isset( $request['minimum_amount'] ) ) {
719
-			$prepared_item->meta_input['_wpi_discount_min_total'] = floatval( $request['minimum_amount'] );
720
-		}
721
-
722
-		// Maximum amount.
723
-		if ( ! empty( $schema['properties']['maximum_amount'] ) && isset( $request['maximum_amount'] ) ) {
724
-			$prepared_item->meta_input['_wpi_discount_max_total'] = floatval( $request['maximum_amount'] );
725
-		}
726
-
727
-		// Recurring.
728
-		if ( ! empty( $schema['properties']['recurring'] ) && isset( $request['recurring'] ) ) {
729
-			$prepared_item->meta_input['_wpi_discount_is_recurring'] = empty( (int) $request['recurring'] ) ? 0 : 1;
730
-		}
731
-
732
-		// Maximum uses.
733
-		if ( ! empty( $schema['properties']['max_uses'] ) && isset( $request['max_uses'] ) ) {
734
-			$prepared_item->meta_input['_wpi_discount_max_uses'] = intval( $request['max_uses'] );
735
-		}
736
-
737
-		// Single use.
738
-		if ( ! empty( $schema['properties']['single_use'] ) && isset( $request['single_use'] ) ) {
739
-			$prepared_item->meta_input['_wpi_discount_is_single_use'] = empty( (int) $request['single_use'] ) ? 0 : 1;
740
-		}
741
-
742
-		$discount_data = (array) wp_unslash( $prepared_item );
743
-
744
-		/**
745
-		 * Filters an item before it is inserted via the REST API.
746
-		 *
747
-		 * @since 1.0.13
748
-		 *
749
-		 * @param array        $discount_data An array of discount data
750
-		 * @param WP_REST_Request $request       Request object.
751
-		 */
752
-		return apply_filters( "wpinv_rest_pre_insert_discount", $discount_data, $request );
753
-
754
-	}
755
-
756
-	/**
757
-	 * Prepares a single discount output for response.
758
-	 *
759
-	 * @since 1.0.13
760
-	 *
761
-	 * @param WP_Post   $discount    WP_Post object.
762
-	 * @param WP_REST_Request $request Request object.
763
-	 * @return WP_REST_Response Response object.
764
-	 */
765
-	public function prepare_item_for_response( $discount, $request ) {
766
-
767
-		$GLOBALS['post'] = get_post( $discount->ID );
768
-
769
-		setup_postdata( $discount->ID );
770
-
771
-		// Fetch the fields to include in this response.
772
-		$fields = $this->get_fields_for_response( $request );
773
-
774
-		// Base fields for every discount.
775
-		$data = array();
776
-
777
-		// Set up ID.
778
-		if ( rest_is_field_included( 'id', $fields ) ) {
779
-			$data['id'] = $discount->ID;
780
-		}
781
-
782
-		// Title.
783
-		if ( rest_is_field_included( 'title', $fields ) ) {
784
-			$data['title'] = get_the_title( $discount->ID );
785
-		}
786
-
787
-		// Code.
788
-		if ( rest_is_field_included( 'code', $fields ) ) {
789
-			$data['code'] = wpinv_get_discount_code( $discount->ID );
790
-		}
791
-
792
-		// Type.
793
-		if ( rest_is_field_included( 'type', $fields ) ) {
794
-			$data['type'] = wpinv_get_discount_type( $discount->ID );
795
-		}
796
-
797
-		// Amount.
798
-		if ( rest_is_field_included( 'amount', $fields ) ) {
799
-			$data['amount'] = wpinv_get_discount_amount( $discount->ID );
800
-		}
801
-
802
-		// Status.
803
-		if ( rest_is_field_included( 'status', $fields ) ) {
804
-			$data['status'] = get_post_status( $discount->ID );
805
-		}
806
-
807
-		// Items.
808
-		if ( rest_is_field_included( 'items', $fields ) ) {
809
-			$data['items'] = wpinv_get_discount_item_reqs( $discount->ID );
810
-		}
811
-
812
-		// Excluded Items.
813
-		if ( rest_is_field_included( 'exclude_items', $fields ) ) {
814
-			$data['exclude_items'] = wpinv_get_discount_excluded_items( $discount->ID );
815
-		}
816
-
817
-		// Start date.
818
-		if ( rest_is_field_included( 'start_date', $fields ) ) {
819
-			$data['start_date'] = wpinv_get_discount_start_date( $discount->ID );
820
-		}
821
-
822
-		// End date.
823
-		if ( rest_is_field_included( 'end_date', $fields ) ) {
824
-			$data['end_date'] = wpinv_get_discount_expiration( $discount->ID );
825
-		}
826
-
827
-		// Minimum amount.
828
-		if ( rest_is_field_included( 'minimum_amount', $fields ) ) {
829
-			$data['minimum_amount'] = wpinv_get_discount_min_total( $discount->ID );
830
-		}
831
-
832
-		// Maximum amount.
833
-		if ( rest_is_field_included( 'maximum_amount', $fields ) ) {
834
-			$data['maximum_amount'] = wpinv_get_discount_max_total( $discount->ID );
835
-		}
836
-
837
-		// Recurring.
838
-		if ( rest_is_field_included( 'recurring', $fields ) ) {
839
-			$data['recurring'] = wpinv_discount_is_recurring( $discount->ID );
840
-		}
841
-
842
-		// Maximum uses.
843
-		if ( rest_is_field_included( 'max_uses', $fields ) ) {
844
-			$data['max_uses'] = wpinv_get_discount_max_uses( $discount->ID );
845
-		}
846
-
847
-		// Single use.
848
-		if ( rest_is_field_included( 'single_use', $fields ) ) {
849
-			$data['single_use'] = wpinv_discount_is_single_use( $discount->ID );
850
-		}
851
-
852
-		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
853
-		$data    = $this->add_additional_fields_to_object( $data, $request );
854
-		$data    = $this->filter_response_by_context( $data, $context );
855
-
856
-		// Wrap the data in a response object.
857
-		$response = rest_ensure_response( $data );
858
-
859
-		$links = $this->prepare_links( $discount );
860
-		$response->add_links( $links );
861
-
862
-		if ( ! empty( $links['self']['href'] ) ) {
863
-			$actions = $this->get_available_actions( $discount, $request );
864
-
865
-			$self = $links['self']['href'];
866
-
867
-			foreach ( $actions as $rel ) {
868
-				$response->add_link( $rel, $self );
869
-			}
870
-		}
871
-
872
-		/**
873
-		 * Filters the discount data for a response.
874
-		 *
875
-		 * @since 1.0.13
876
-		 *
877
-		 * @param WP_REST_Response $response The response object.
878
-		 * @param WP_Post    $discount  The discount post object.
879
-		 * @param WP_REST_Request  $request  Request object.
880
-		 */
881
-		return apply_filters( "wpinv_rest_prepare_discount", $response, $discount, $request );
882
-	}
883
-
884
-	/**
885
-	 * Gets an array of fields to be included on the response.
886
-	 *
887
-	 * Included fields are based on item schema and `_fields=` request argument.
888
-	 *
889
-	 * @since 1.0.13
890
-	 *
891
-	 * @param WP_REST_Request $request Full details about the request.
892
-	 * @return array Fields to be included in the response.
893
-	 */
894
-	public function get_fields_for_response( $request ) {
895
-		$schema     = $this->get_item_schema();
896
-		$properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
897
-
898
-		$additional_fields = $this->get_additional_fields();
899
-		foreach ( $additional_fields as $field_name => $field_options ) {
900
-			// For back-compat, include any field with an empty schema
901
-			// because it won't be present in $this->get_item_schema().
902
-			if ( is_null( $field_options['schema'] ) ) {
903
-				$properties[ $field_name ] = $field_options;
904
-			}
905
-		}
906
-
907
-		// Exclude fields that specify a different context than the request context.
908
-		$context = $request['context'];
909
-		if ( $context ) {
910
-			foreach ( $properties as $name => $options ) {
911
-				if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
912
-					unset( $properties[ $name ] );
913
-				}
914
-			}
915
-		}
916
-
917
-		$fields = array_keys( $properties );
918
-
919
-		if ( ! isset( $request['_fields'] ) ) {
920
-			return $fields;
921
-		}
922
-		$requested_fields = wpinv_parse_list( $request['_fields'] );
923
-		if ( 0 === count( $requested_fields ) ) {
924
-			return $fields;
925
-		}
926
-		// Trim off outside whitespace from the comma delimited list.
927
-		$requested_fields = array_map( 'trim', $requested_fields );
928
-		// Always persist 'id', because it can be needed for add_additional_fields_to_object().
929
-		if ( in_array( 'id', $fields, true ) ) {
930
-			$requested_fields[] = 'id';
931
-		}
932
-		// Return the list of all requested fields which appear in the schema.
933
-		return array_reduce(
934
-			$requested_fields,
935
-			function( $response_fields, $field ) use ( $fields ) {
936
-				if ( in_array( $field, $fields, true ) ) {
937
-					$response_fields[] = $field;
938
-					return $response_fields;
939
-				}
940
-				// Check for nested fields if $field is not a direct match.
941
-				$nested_fields = explode( '.', $field );
942
-				// A nested field is included so long as its top-level property is
943
-				// present in the schema.
944
-				if ( in_array( $nested_fields[0], $fields, true ) ) {
945
-					$response_fields[] = $field;
946
-				}
947
-				return $response_fields;
948
-			},
949
-			array()
950
-		);
951
-	}
952
-
953
-	/**
954
-	 * Retrieves the discount's schema, conforming to JSON Schema.
955
-	 *
956
-	 * @since 1.0.13
957
-	 *
958
-	 * @return array Discount schema data.
959
-	 */
960
-	public function get_item_schema() {
961
-
962
-		// Maybe retrieve the schema from cache.
963
-		if (  empty( $this->schema ) ) {
964
-			return $this->add_additional_fields_schema( $this->schema );
965
-		}
966
-
967
-		$schema = array(
968
-			'$schema'    => 'http://json-schema.org/draft-04/schema#',
969
-			'title'      => $this->post_type,
970
-			'type'       => 'object',
971
-
972
-			// Base properties for every Item.
973
-			'properties' 		  => array(
974
-
975
-				'id'           => array(
976
-					'description' => __( 'Unique identifier for the discount.', 'invoicing' ),
977
-					'type'        => 'integer',
978
-					'context'     => array( 'view', 'edit', 'embed' ),
979
-					'readonly'    => true,
980
-				),
981
-
982
-				'title'			  => array(
983
-					'description' => __( 'The title for the discount.', 'invoicing' ),
984
-					'type'        => 'string',
985
-					'context'     => array( 'view', 'edit' ),
986
-				),
987
-
988
-				'code'        => array(
989
-					'description' => __( 'The discount code.', 'invoicing' ),
990
-					'type'        => 'string',
991
-					'context'     => array( 'view', 'edit', 'embed' ),
992
-					'required'	  => true,
993
-				),
994
-
995
-				'type'        => array(
996
-					'description' => __( 'The type of discount.', 'invoicing' ),
997
-					'type'        => 'string',
998
-					'enum'        => array_keys( wpinv_get_discount_types() ),
999
-					'context'     => array( 'view', 'edit', 'embed' ),
1000
-					'default'	  => 'percentage',
1001
-				),
1002
-
1003
-				'amount'        => array(
1004
-					'description' => __( 'The discount value.', 'invoicing' ),
1005
-					'type'        => 'number',
1006
-					'context'     => array( 'view', 'edit', 'embed' ),
1007
-					'required'	  => true,
1008
-				),
1009
-
1010
-				'status'       => array(
1011
-					'description' => __( 'A named status for the discount.', 'invoicing' ),
1012
-					'type'        => 'string',
1013
-					'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
1014
-					'context'     => array( 'view', 'edit' ),
1015
-				),
1016
-
1017
-				'items'       => array(
1018
-					'description' => __( 'Items which need to be in the cart to use this discount or, for "Item Discounts", which items are discounted. If left blank, this discount will be used on any item.', 'invoicing' ),
1019
-					'type'        => 'array',
1020
-					'context'     => array( 'view', 'edit' ),
1021
-				),
1022
-
1023
-				'exclude_items'   => array(
1024
-					'description' => __( 'Items which are NOT allowed to use this discount.', 'invoicing' ),
1025
-					'type'        => 'array',
1026
-					'context'     => array( 'view', 'edit' ),
1027
-				),
1028
-
1029
-				'start_date'       => array(
1030
-					'description' => __( 'The start date for the discount in the format of yyyy-mm-dd hh:mm:ss  . If provided, the discount can only be used after or on this date.', 'invoicing' ),
1031
-					'type'        => 'string',
1032
-					'context'     => array( 'view', 'edit' ),
1033
-				),
1034
-
1035
-				'end_date'        => array(
1036
-					'description' => __( 'The expiration date for the discount.', 'invoicing' ),
1037
-					'type'        => 'string',
1038
-					'context'     => array( 'view', 'edit', 'embed' ),
1039
-				),
637
+     * Checks if a given post type can be viewed or managed.
638
+     *
639
+     * @since 1.0.13
640
+     *
641
+     * @param object|string $post_type Post type name or object.
642
+     * @return bool Whether the post type is allowed in REST.
643
+     */
644
+    protected function check_is_post_type_allowed( $post_type ) {
645
+        return true;
646
+    }
647
+
648
+    /**
649
+     * Prepares a single item for create or update.
650
+     *
651
+     * @since 1.0.13
652
+     *
653
+     * @param WP_REST_Request $request Request object.
654
+     * @return array|WP_Error Discount Properties or WP_Error.
655
+     */
656
+    protected function prepare_item_for_database( $request ) {
657
+        $prepared_item 		 = new stdClass();
658
+        $prepared_item->meta_input = array();
659
+
660
+        // Post ID.
661
+        if ( isset( $request['id'] ) ) {
662
+            $existing_item = $this->get_post( $request['id'] );
663
+            if ( is_wp_error( $existing_item ) ) {
664
+                return $existing_item;
665
+            }
666
+
667
+            $prepared_item->ID 		  = $existing_item->ID;
668
+        }
669
+
670
+        $schema = $this->get_item_schema();
671
+
672
+        // item title.
673
+        if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
674
+            $prepared_item->post_title = sanitize_text_field( $request['title'] );
675
+        }
676
+
677
+        // item status.
678
+        if ( ! empty( $schema['properties']['status'] ) && isset( $request['status'] ) && in_array( $request['status'], array_keys( get_post_stati( array( 'internal' => false ) ) ) ) ) {
679
+            $prepared_item->post_status = sanitize_text_field( $request['status'] );
680
+        }
681
+
682
+        // Code.
683
+        if ( ! empty( $schema['properties']['code'] ) && isset( $request['code'] ) ) {
684
+            $prepared_item->meta_input['_wpi_discount_code'] = trim( $request['code'] );
685
+        }
686
+
687
+        // Type.
688
+        if ( ! empty( $schema['properties']['type'] ) && isset( $request['type'] )  && in_array( $request['type'], array_keys( wpinv_get_discount_types() ) ) ) {
689
+            $prepared_item->meta_input['_wpi_discount_type'] = trim( $request['type'] );
690
+        }
691
+
692
+        // Amount.
693
+        if ( ! empty( $schema['properties']['amount'] ) && isset( $request['amount'] ) ) {
694
+            $prepared_item->meta_input['_wpi_discount_amount'] = floatval( $request['amount'] );
695
+        }
696
+
697
+        // Items.
698
+        if ( ! empty( $schema['properties']['items'] ) && isset( $request['items'] ) ) {
699
+            $prepared_item->meta_input['_wpi_discount_items'] = wpinv_parse_list( $request['items'] );
700
+        }
701
+
702
+        // Excluded Items.
703
+        if ( ! empty( $schema['properties']['exclude_items'] ) && isset( $request['exclude_items'] ) ) {
704
+            $prepared_item->meta_input['_wpi_discount_excluded_items'] = wpinv_parse_list( $request['exclude_items'] );
705
+        }
706
+
707
+        // Start date.
708
+        if ( ! empty( $schema['properties']['start_date'] ) && isset( $request['start_date'] ) ) {
709
+            $prepared_item->meta_input['_wpi_discount_start'] = trim( $request['start_date'] );
710
+        }
711
+
712
+        // End date.
713
+        if ( ! empty( $schema['properties']['end_date'] ) && isset( $request['end_date'] ) ) {
714
+            $prepared_item->meta_input['_wpi_discount_expiration'] = trim( $request['end_date'] );
715
+        }
716
+
717
+        // Minimum amount.
718
+        if ( ! empty( $schema['properties']['minimum_amount'] ) && isset( $request['minimum_amount'] ) ) {
719
+            $prepared_item->meta_input['_wpi_discount_min_total'] = floatval( $request['minimum_amount'] );
720
+        }
721
+
722
+        // Maximum amount.
723
+        if ( ! empty( $schema['properties']['maximum_amount'] ) && isset( $request['maximum_amount'] ) ) {
724
+            $prepared_item->meta_input['_wpi_discount_max_total'] = floatval( $request['maximum_amount'] );
725
+        }
726
+
727
+        // Recurring.
728
+        if ( ! empty( $schema['properties']['recurring'] ) && isset( $request['recurring'] ) ) {
729
+            $prepared_item->meta_input['_wpi_discount_is_recurring'] = empty( (int) $request['recurring'] ) ? 0 : 1;
730
+        }
731
+
732
+        // Maximum uses.
733
+        if ( ! empty( $schema['properties']['max_uses'] ) && isset( $request['max_uses'] ) ) {
734
+            $prepared_item->meta_input['_wpi_discount_max_uses'] = intval( $request['max_uses'] );
735
+        }
736
+
737
+        // Single use.
738
+        if ( ! empty( $schema['properties']['single_use'] ) && isset( $request['single_use'] ) ) {
739
+            $prepared_item->meta_input['_wpi_discount_is_single_use'] = empty( (int) $request['single_use'] ) ? 0 : 1;
740
+        }
741
+
742
+        $discount_data = (array) wp_unslash( $prepared_item );
743
+
744
+        /**
745
+         * Filters an item before it is inserted via the REST API.
746
+         *
747
+         * @since 1.0.13
748
+         *
749
+         * @param array        $discount_data An array of discount data
750
+         * @param WP_REST_Request $request       Request object.
751
+         */
752
+        return apply_filters( "wpinv_rest_pre_insert_discount", $discount_data, $request );
753
+
754
+    }
755
+
756
+    /**
757
+     * Prepares a single discount output for response.
758
+     *
759
+     * @since 1.0.13
760
+     *
761
+     * @param WP_Post   $discount    WP_Post object.
762
+     * @param WP_REST_Request $request Request object.
763
+     * @return WP_REST_Response Response object.
764
+     */
765
+    public function prepare_item_for_response( $discount, $request ) {
766
+
767
+        $GLOBALS['post'] = get_post( $discount->ID );
768
+
769
+        setup_postdata( $discount->ID );
770
+
771
+        // Fetch the fields to include in this response.
772
+        $fields = $this->get_fields_for_response( $request );
773
+
774
+        // Base fields for every discount.
775
+        $data = array();
776
+
777
+        // Set up ID.
778
+        if ( rest_is_field_included( 'id', $fields ) ) {
779
+            $data['id'] = $discount->ID;
780
+        }
781
+
782
+        // Title.
783
+        if ( rest_is_field_included( 'title', $fields ) ) {
784
+            $data['title'] = get_the_title( $discount->ID );
785
+        }
786
+
787
+        // Code.
788
+        if ( rest_is_field_included( 'code', $fields ) ) {
789
+            $data['code'] = wpinv_get_discount_code( $discount->ID );
790
+        }
791
+
792
+        // Type.
793
+        if ( rest_is_field_included( 'type', $fields ) ) {
794
+            $data['type'] = wpinv_get_discount_type( $discount->ID );
795
+        }
796
+
797
+        // Amount.
798
+        if ( rest_is_field_included( 'amount', $fields ) ) {
799
+            $data['amount'] = wpinv_get_discount_amount( $discount->ID );
800
+        }
801
+
802
+        // Status.
803
+        if ( rest_is_field_included( 'status', $fields ) ) {
804
+            $data['status'] = get_post_status( $discount->ID );
805
+        }
806
+
807
+        // Items.
808
+        if ( rest_is_field_included( 'items', $fields ) ) {
809
+            $data['items'] = wpinv_get_discount_item_reqs( $discount->ID );
810
+        }
811
+
812
+        // Excluded Items.
813
+        if ( rest_is_field_included( 'exclude_items', $fields ) ) {
814
+            $data['exclude_items'] = wpinv_get_discount_excluded_items( $discount->ID );
815
+        }
816
+
817
+        // Start date.
818
+        if ( rest_is_field_included( 'start_date', $fields ) ) {
819
+            $data['start_date'] = wpinv_get_discount_start_date( $discount->ID );
820
+        }
821
+
822
+        // End date.
823
+        if ( rest_is_field_included( 'end_date', $fields ) ) {
824
+            $data['end_date'] = wpinv_get_discount_expiration( $discount->ID );
825
+        }
826
+
827
+        // Minimum amount.
828
+        if ( rest_is_field_included( 'minimum_amount', $fields ) ) {
829
+            $data['minimum_amount'] = wpinv_get_discount_min_total( $discount->ID );
830
+        }
831
+
832
+        // Maximum amount.
833
+        if ( rest_is_field_included( 'maximum_amount', $fields ) ) {
834
+            $data['maximum_amount'] = wpinv_get_discount_max_total( $discount->ID );
835
+        }
836
+
837
+        // Recurring.
838
+        if ( rest_is_field_included( 'recurring', $fields ) ) {
839
+            $data['recurring'] = wpinv_discount_is_recurring( $discount->ID );
840
+        }
841
+
842
+        // Maximum uses.
843
+        if ( rest_is_field_included( 'max_uses', $fields ) ) {
844
+            $data['max_uses'] = wpinv_get_discount_max_uses( $discount->ID );
845
+        }
846
+
847
+        // Single use.
848
+        if ( rest_is_field_included( 'single_use', $fields ) ) {
849
+            $data['single_use'] = wpinv_discount_is_single_use( $discount->ID );
850
+        }
851
+
852
+        $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
853
+        $data    = $this->add_additional_fields_to_object( $data, $request );
854
+        $data    = $this->filter_response_by_context( $data, $context );
855
+
856
+        // Wrap the data in a response object.
857
+        $response = rest_ensure_response( $data );
858
+
859
+        $links = $this->prepare_links( $discount );
860
+        $response->add_links( $links );
861
+
862
+        if ( ! empty( $links['self']['href'] ) ) {
863
+            $actions = $this->get_available_actions( $discount, $request );
864
+
865
+            $self = $links['self']['href'];
866
+
867
+            foreach ( $actions as $rel ) {
868
+                $response->add_link( $rel, $self );
869
+            }
870
+        }
871
+
872
+        /**
873
+         * Filters the discount data for a response.
874
+         *
875
+         * @since 1.0.13
876
+         *
877
+         * @param WP_REST_Response $response The response object.
878
+         * @param WP_Post    $discount  The discount post object.
879
+         * @param WP_REST_Request  $request  Request object.
880
+         */
881
+        return apply_filters( "wpinv_rest_prepare_discount", $response, $discount, $request );
882
+    }
883
+
884
+    /**
885
+     * Gets an array of fields to be included on the response.
886
+     *
887
+     * Included fields are based on item schema and `_fields=` request argument.
888
+     *
889
+     * @since 1.0.13
890
+     *
891
+     * @param WP_REST_Request $request Full details about the request.
892
+     * @return array Fields to be included in the response.
893
+     */
894
+    public function get_fields_for_response( $request ) {
895
+        $schema     = $this->get_item_schema();
896
+        $properties = isset( $schema['properties'] ) ? $schema['properties'] : array();
897
+
898
+        $additional_fields = $this->get_additional_fields();
899
+        foreach ( $additional_fields as $field_name => $field_options ) {
900
+            // For back-compat, include any field with an empty schema
901
+            // because it won't be present in $this->get_item_schema().
902
+            if ( is_null( $field_options['schema'] ) ) {
903
+                $properties[ $field_name ] = $field_options;
904
+            }
905
+        }
906
+
907
+        // Exclude fields that specify a different context than the request context.
908
+        $context = $request['context'];
909
+        if ( $context ) {
910
+            foreach ( $properties as $name => $options ) {
911
+                if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
912
+                    unset( $properties[ $name ] );
913
+                }
914
+            }
915
+        }
916
+
917
+        $fields = array_keys( $properties );
918
+
919
+        if ( ! isset( $request['_fields'] ) ) {
920
+            return $fields;
921
+        }
922
+        $requested_fields = wpinv_parse_list( $request['_fields'] );
923
+        if ( 0 === count( $requested_fields ) ) {
924
+            return $fields;
925
+        }
926
+        // Trim off outside whitespace from the comma delimited list.
927
+        $requested_fields = array_map( 'trim', $requested_fields );
928
+        // Always persist 'id', because it can be needed for add_additional_fields_to_object().
929
+        if ( in_array( 'id', $fields, true ) ) {
930
+            $requested_fields[] = 'id';
931
+        }
932
+        // Return the list of all requested fields which appear in the schema.
933
+        return array_reduce(
934
+            $requested_fields,
935
+            function( $response_fields, $field ) use ( $fields ) {
936
+                if ( in_array( $field, $fields, true ) ) {
937
+                    $response_fields[] = $field;
938
+                    return $response_fields;
939
+                }
940
+                // Check for nested fields if $field is not a direct match.
941
+                $nested_fields = explode( '.', $field );
942
+                // A nested field is included so long as its top-level property is
943
+                // present in the schema.
944
+                if ( in_array( $nested_fields[0], $fields, true ) ) {
945
+                    $response_fields[] = $field;
946
+                }
947
+                return $response_fields;
948
+            },
949
+            array()
950
+        );
951
+    }
952
+
953
+    /**
954
+     * Retrieves the discount's schema, conforming to JSON Schema.
955
+     *
956
+     * @since 1.0.13
957
+     *
958
+     * @return array Discount schema data.
959
+     */
960
+    public function get_item_schema() {
961
+
962
+        // Maybe retrieve the schema from cache.
963
+        if (  empty( $this->schema ) ) {
964
+            return $this->add_additional_fields_schema( $this->schema );
965
+        }
966
+
967
+        $schema = array(
968
+            '$schema'    => 'http://json-schema.org/draft-04/schema#',
969
+            'title'      => $this->post_type,
970
+            'type'       => 'object',
971
+
972
+            // Base properties for every Item.
973
+            'properties' 		  => array(
974
+
975
+                'id'           => array(
976
+                    'description' => __( 'Unique identifier for the discount.', 'invoicing' ),
977
+                    'type'        => 'integer',
978
+                    'context'     => array( 'view', 'edit', 'embed' ),
979
+                    'readonly'    => true,
980
+                ),
981
+
982
+                'title'			  => array(
983
+                    'description' => __( 'The title for the discount.', 'invoicing' ),
984
+                    'type'        => 'string',
985
+                    'context'     => array( 'view', 'edit' ),
986
+                ),
987
+
988
+                'code'        => array(
989
+                    'description' => __( 'The discount code.', 'invoicing' ),
990
+                    'type'        => 'string',
991
+                    'context'     => array( 'view', 'edit', 'embed' ),
992
+                    'required'	  => true,
993
+                ),
994
+
995
+                'type'        => array(
996
+                    'description' => __( 'The type of discount.', 'invoicing' ),
997
+                    'type'        => 'string',
998
+                    'enum'        => array_keys( wpinv_get_discount_types() ),
999
+                    'context'     => array( 'view', 'edit', 'embed' ),
1000
+                    'default'	  => 'percentage',
1001
+                ),
1002
+
1003
+                'amount'        => array(
1004
+                    'description' => __( 'The discount value.', 'invoicing' ),
1005
+                    'type'        => 'number',
1006
+                    'context'     => array( 'view', 'edit', 'embed' ),
1007
+                    'required'	  => true,
1008
+                ),
1009
+
1010
+                'status'       => array(
1011
+                    'description' => __( 'A named status for the discount.', 'invoicing' ),
1012
+                    'type'        => 'string',
1013
+                    'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
1014
+                    'context'     => array( 'view', 'edit' ),
1015
+                ),
1016
+
1017
+                'items'       => array(
1018
+                    'description' => __( 'Items which need to be in the cart to use this discount or, for "Item Discounts", which items are discounted. If left blank, this discount will be used on any item.', 'invoicing' ),
1019
+                    'type'        => 'array',
1020
+                    'context'     => array( 'view', 'edit' ),
1021
+                ),
1022
+
1023
+                'exclude_items'   => array(
1024
+                    'description' => __( 'Items which are NOT allowed to use this discount.', 'invoicing' ),
1025
+                    'type'        => 'array',
1026
+                    'context'     => array( 'view', 'edit' ),
1027
+                ),
1028
+
1029
+                'start_date'       => array(
1030
+                    'description' => __( 'The start date for the discount in the format of yyyy-mm-dd hh:mm:ss  . If provided, the discount can only be used after or on this date.', 'invoicing' ),
1031
+                    'type'        => 'string',
1032
+                    'context'     => array( 'view', 'edit' ),
1033
+                ),
1034
+
1035
+                'end_date'        => array(
1036
+                    'description' => __( 'The expiration date for the discount.', 'invoicing' ),
1037
+                    'type'        => 'string',
1038
+                    'context'     => array( 'view', 'edit', 'embed' ),
1039
+                ),
1040 1040
 				
1041
-				'minimum_amount'       => array(
1042
-					'description' => __( 'Minimum amount needed to use this invoice.', 'invoicing' ),
1043
-					'type'        => 'number',
1044
-					'context'     => array( 'view', 'edit', 'embed' ),
1045
-				),
1046
-
1047
-				'maximum_amount'       => array(
1048
-					'description' => __( 'Maximum amount needed to use this invoice.', 'invoicing' ),
1049
-					'type'        => 'number',
1050
-					'context'     => array( 'view', 'edit', 'embed' ),
1051
-				),
1052
-
1053
-				'recurring'       => array(
1054
-					'description' => __( 'Whether the discount is applied to all recurring payments or only the first recurring payment.', 'invoicing' ),
1055
-					'type'        => 'integer',
1056
-					'context'     => array( 'view', 'edit', 'embed' ),
1057
-				),
1058
-
1059
-				'max_uses'        => array(
1060
-					'description' => __( 'The maximum number of times this discount code can be used.', 'invoicing' ),
1061
-					'type'        => 'number',
1062
-					'context'     => array( 'view', 'edit', 'embed' ),
1063
-				),
1064
-
1065
-				'single_use'       => array(
1066
-					'description' => __( 'Whether or not this discount can only be used once per user.', 'invoicing' ),
1067
-					'type'        => 'integer',
1068
-					'context'     => array( 'view', 'edit', 'embed' ),
1069
-				)
1070
-
1071
-			),
1072
-		);
1073
-
1074
-		// Add helpful links to the discount schem.
1075
-		$schema['links'] = $this->get_schema_links();
1076
-
1077
-		/**
1078
-		 * Filters the discount schema for the REST API.
1079
-		 *
1080
-		 * Enables adding extra properties to discounts.
1081
-		 *
1082
-		 * @since 1.0.13
1083
-		 *
1084
-		 * @param array   $schema    The discount schema.
1085
-		 */
1041
+                'minimum_amount'       => array(
1042
+                    'description' => __( 'Minimum amount needed to use this invoice.', 'invoicing' ),
1043
+                    'type'        => 'number',
1044
+                    'context'     => array( 'view', 'edit', 'embed' ),
1045
+                ),
1046
+
1047
+                'maximum_amount'       => array(
1048
+                    'description' => __( 'Maximum amount needed to use this invoice.', 'invoicing' ),
1049
+                    'type'        => 'number',
1050
+                    'context'     => array( 'view', 'edit', 'embed' ),
1051
+                ),
1052
+
1053
+                'recurring'       => array(
1054
+                    'description' => __( 'Whether the discount is applied to all recurring payments or only the first recurring payment.', 'invoicing' ),
1055
+                    'type'        => 'integer',
1056
+                    'context'     => array( 'view', 'edit', 'embed' ),
1057
+                ),
1058
+
1059
+                'max_uses'        => array(
1060
+                    'description' => __( 'The maximum number of times this discount code can be used.', 'invoicing' ),
1061
+                    'type'        => 'number',
1062
+                    'context'     => array( 'view', 'edit', 'embed' ),
1063
+                ),
1064
+
1065
+                'single_use'       => array(
1066
+                    'description' => __( 'Whether or not this discount can only be used once per user.', 'invoicing' ),
1067
+                    'type'        => 'integer',
1068
+                    'context'     => array( 'view', 'edit', 'embed' ),
1069
+                )
1070
+
1071
+            ),
1072
+        );
1073
+
1074
+        // Add helpful links to the discount schem.
1075
+        $schema['links'] = $this->get_schema_links();
1076
+
1077
+        /**
1078
+         * Filters the discount schema for the REST API.
1079
+         *
1080
+         * Enables adding extra properties to discounts.
1081
+         *
1082
+         * @since 1.0.13
1083
+         *
1084
+         * @param array   $schema    The discount schema.
1085
+         */
1086 1086
         $schema = apply_filters( "wpinv_rest_discount_schema", $schema );
1087 1087
 
1088
-		//  Cache the discount schema.
1089
-		$this->schema = $schema;
1088
+        //  Cache the discount schema.
1089
+        $this->schema = $schema;
1090 1090
 		
1091
-		return $this->add_additional_fields_schema( $this->schema );
1092
-	}
1093
-
1094
-	/**
1095
-	 * Retrieve Link Description Objects that should be added to the Schema for the discounts collection.
1096
-	 *
1097
-	 * @since 1.0.13
1098
-	 *
1099
-	 * @return array
1100
-	 */
1101
-	protected function get_schema_links() {
1102
-
1103
-		$href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
1104
-
1105
-		$links = array();
1106
-
1107
-		$links[] = array(
1108
-			'rel'          => 'https://api.w.org/action-publish',
1109
-			'title'        => __( 'The current user can publish this discount.', 'invoicing' ),
1110
-			'href'         => $href,
1111
-			'targetSchema' => array(
1112
-				'type'       => 'object',
1113
-				'properties' => array(
1114
-					'status' => array(
1115
-						'type' => 'string',
1116
-						'enum' => array( 'publish', 'future' ),
1117
-					),
1118
-				),
1119
-			),
1120
-		);
1121
-
1122
-		return $links;
1123
-	}
1124
-
1125
-	/**
1126
-	 * Prepares links for the request.
1127
-	 *
1128
-	 * @since 1.0.13
1129
-	 *
1130
-	 * @param WP_Post $discount Post Object.
1131
-	 * @return array Links for the given discount.
1132
-	 */
1133
-	protected function prepare_links( $discount ) {
1134
-
1135
-		// Prepare the base REST API endpoint for discounts.
1136
-		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
1137
-
1138
-		// Entity meta.
1139
-		$links = array(
1140
-			'self'       => array(
1141
-				'href' => rest_url( trailingslashit( $base ) . $discount->ID ),
1142
-			),
1143
-			'collection' => array(
1144
-				'href' => rest_url( $base ),
1145
-			),
1146
-		);
1147
-
1148
-		/**
1149
-		 * Filters the returned discount links for the REST API.
1150
-		 *
1151
-		 * Enables adding extra links to discount API responses.
1152
-		 *
1153
-		 * @since 1.0.13
1154
-		 *
1155
-		 * @param array   $links    Rest links.
1156
-		 */
1157
-		return apply_filters( "wpinv_rest_discount_links", $links );
1158
-
1159
-	}
1160
-
1161
-	/**
1162
-	 * Get the link relations available for the post and current user.
1163
-	 *
1164
-	 * @since 1.0.13
1165
-	 *
1166
-	 * @param WP_Post   $discount    WP_Post object.
1167
-	 * @param WP_REST_Request $request Request object.
1168
-	 * @return array List of link relations.
1169
-	 */
1170
-	protected function get_available_actions( $discount, $request ) {
1171
-
1172
-		if ( 'edit' !== $request['context'] ) {
1173
-			return array();
1174
-		}
1175
-
1176
-		$rels = array();
1177
-
1178
-		// Retrieve the post type object.
1179
-		$post_type = get_post_type_object( $discount->post_type );
1180
-
1181
-		// Mark discount as published.
1182
-		if ( current_user_can( $post_type->cap->publish_posts ) ) {
1183
-			$rels[] = 'https://api.w.org/action-publish';
1184
-		}
1185
-
1186
-		/**
1187
-		 * Filters the available discount link relations for the REST API.
1188
-		 *
1189
-		 * Enables adding extra link relation for the current user and request to discount responses.
1190
-		 *
1191
-		 * @since 1.0.13
1192
-		 *
1193
-		 * @param array   $rels    Available link relations.
1194
-		 */
1195
-		return apply_filters( "wpinv_rest_discount_link_relations", $rels );
1196
-	}
1197
-
1198
-	/**
1199
-	 * Handles rest requests for discount types.
1200
-	 *
1201
-	 * @since 1.0.13
1202
-	 * 
1203
-	 * 
1204
-	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1205
-	 */
1206
-	public function get_discount_types() {
1207
-		return rest_ensure_response( wpinv_get_discount_types() );
1208
-	}
1091
+        return $this->add_additional_fields_schema( $this->schema );
1092
+    }
1093
+
1094
+    /**
1095
+     * Retrieve Link Description Objects that should be added to the Schema for the discounts collection.
1096
+     *
1097
+     * @since 1.0.13
1098
+     *
1099
+     * @return array
1100
+     */
1101
+    protected function get_schema_links() {
1102
+
1103
+        $href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
1104
+
1105
+        $links = array();
1106
+
1107
+        $links[] = array(
1108
+            'rel'          => 'https://api.w.org/action-publish',
1109
+            'title'        => __( 'The current user can publish this discount.', 'invoicing' ),
1110
+            'href'         => $href,
1111
+            'targetSchema' => array(
1112
+                'type'       => 'object',
1113
+                'properties' => array(
1114
+                    'status' => array(
1115
+                        'type' => 'string',
1116
+                        'enum' => array( 'publish', 'future' ),
1117
+                    ),
1118
+                ),
1119
+            ),
1120
+        );
1121
+
1122
+        return $links;
1123
+    }
1124
+
1125
+    /**
1126
+     * Prepares links for the request.
1127
+     *
1128
+     * @since 1.0.13
1129
+     *
1130
+     * @param WP_Post $discount Post Object.
1131
+     * @return array Links for the given discount.
1132
+     */
1133
+    protected function prepare_links( $discount ) {
1134
+
1135
+        // Prepare the base REST API endpoint for discounts.
1136
+        $base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
1137
+
1138
+        // Entity meta.
1139
+        $links = array(
1140
+            'self'       => array(
1141
+                'href' => rest_url( trailingslashit( $base ) . $discount->ID ),
1142
+            ),
1143
+            'collection' => array(
1144
+                'href' => rest_url( $base ),
1145
+            ),
1146
+        );
1147
+
1148
+        /**
1149
+         * Filters the returned discount links for the REST API.
1150
+         *
1151
+         * Enables adding extra links to discount API responses.
1152
+         *
1153
+         * @since 1.0.13
1154
+         *
1155
+         * @param array   $links    Rest links.
1156
+         */
1157
+        return apply_filters( "wpinv_rest_discount_links", $links );
1158
+
1159
+    }
1160
+
1161
+    /**
1162
+     * Get the link relations available for the post and current user.
1163
+     *
1164
+     * @since 1.0.13
1165
+     *
1166
+     * @param WP_Post   $discount    WP_Post object.
1167
+     * @param WP_REST_Request $request Request object.
1168
+     * @return array List of link relations.
1169
+     */
1170
+    protected function get_available_actions( $discount, $request ) {
1171
+
1172
+        if ( 'edit' !== $request['context'] ) {
1173
+            return array();
1174
+        }
1175
+
1176
+        $rels = array();
1177
+
1178
+        // Retrieve the post type object.
1179
+        $post_type = get_post_type_object( $discount->post_type );
1180
+
1181
+        // Mark discount as published.
1182
+        if ( current_user_can( $post_type->cap->publish_posts ) ) {
1183
+            $rels[] = 'https://api.w.org/action-publish';
1184
+        }
1185
+
1186
+        /**
1187
+         * Filters the available discount link relations for the REST API.
1188
+         *
1189
+         * Enables adding extra link relation for the current user and request to discount responses.
1190
+         *
1191
+         * @since 1.0.13
1192
+         *
1193
+         * @param array   $rels    Available link relations.
1194
+         */
1195
+        return apply_filters( "wpinv_rest_discount_link_relations", $rels );
1196
+    }
1197
+
1198
+    /**
1199
+     * Handles rest requests for discount types.
1200
+     *
1201
+     * @since 1.0.13
1202
+     * 
1203
+     * 
1204
+     * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
1205
+     */
1206
+    public function get_discount_types() {
1207
+        return rest_ensure_response( wpinv_get_discount_types() );
1208
+    }
1209 1209
     
1210 1210
 }
1211 1211
\ No newline at end of file
Please login to merge, or discard this patch.
vendor/ayecode/wp-super-duper/wp-super-duper.php 1 patch
Indentation   +1661 added lines, -1661 removed lines patch added patch discarded remove patch
@@ -1,243 +1,243 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 if ( ! defined( 'ABSPATH' ) ) {
3
-	exit;
3
+    exit;
4 4
 }
5 5
 
6 6
 if ( ! class_exists( 'WP_Super_Duper' ) ) {
7 7
 
8 8
 
9
-	/**
10
-	 * A Class to be able to create a Widget, Shortcode or Block to be able to output content for WordPress.
11
-	 *
12
-	 * Should not be called direct but extended instead.
13
-	 *
14
-	 * Class WP_Super_Duper
15
-	 * @since 1.0.16 change log moved to file change-log.txt - CHANGED
16
-	 * @ver 1.0.16
17
-	 */
18
-	class WP_Super_Duper extends WP_Widget {
19
-
20
-		public $version = "1.0.16";
21
-		public $font_awesome_icon_version = "5.11.2";
22
-		public $block_code;
23
-		public $options;
24
-		public $base_id;
25
-		public $arguments = array();
26
-		public $instance = array();
27
-		private $class_name;
28
-
29
-		/**
30
-		 * The relative url to the current folder.
31
-		 *
32
-		 * @var string
33
-		 */
34
-		public $url = '';
35
-
36
-		/**
37
-		 * Take the array options and use them to build.
38
-		 */
39
-		public function __construct( $options ) {
40
-			global $sd_widgets;
41
-
42
-			$sd_widgets[ $options['base_id'] ] = array(
43
-				'name'       => $options['name'],
44
-				'class_name' => $options['class_name']
45
-			);
46
-			$this->base_id                     = $options['base_id'];
47
-			// lets filter the options before we do anything
48
-			$options       = apply_filters( "wp_super_duper_options", $options );
49
-			$options       = apply_filters( "wp_super_duper_options_{$this->base_id}", $options );
50
-			$options       = $this->add_name_from_key( $options );
51
-			$this->options = $options;
52
-
53
-			$this->base_id   = $options['base_id'];
54
-			$this->arguments = isset( $options['arguments'] ) ? $options['arguments'] : array();
55
-
56
-			// init parent
57
-			parent::__construct( $options['base_id'], $options['name'], $options['widget_ops'] );
58
-
59
-			if ( isset( $options['class_name'] ) ) {
60
-				// register widget
61
-				$this->class_name = $options['class_name'];
62
-
63
-				// register shortcode
64
-				$this->register_shortcode();
65
-
66
-				// Fusion Builder (avada) support
67
-				if( function_exists('fusion_builder_map') ){ $this->register_fusion_element(); }
68
-
69
-				// register block
70
-				add_action( 'admin_enqueue_scripts', array( $this, 'register_block' ) );
71
-			}
72
-
73
-			// add the CSS and JS we need ONCE
74
-			global $sd_widget_scripts;
75
-
76
-			if ( ! $sd_widget_scripts ) {
77
-				wp_add_inline_script( 'admin-widgets', $this->widget_js() );
78
-				wp_add_inline_script( 'customize-controls', $this->widget_js() );
79
-				wp_add_inline_style( 'widgets', $this->widget_css() );
80
-
81
-				$sd_widget_scripts = true;
82
-
83
-				// add shortcode insert button once
84
-				add_action( 'media_buttons', array( $this, 'shortcode_insert_button' ) );
85
-				// generatepress theme sections compatibility
86
-				if ( function_exists( 'generate_sections_sections_metabox' ) ) {
87
-					add_action( 'generate_sections_metabox', array( $this, 'shortcode_insert_button_script' ) );
88
-				}
89
-				if ( $this->is_preview() ) {
90
-					add_action( 'wp_footer', array( $this, 'shortcode_insert_button_script' ) );
91
-					// this makes the insert button work for elementor
92
-					add_action( 'elementor/editor/after_enqueue_scripts', array(
93
-						$this,
94
-						'shortcode_insert_button_script'
95
-					) ); // for elementor
96
-				}
97
-				// this makes the insert button work for cornerstone
98
-				add_action('wp_print_footer_scripts',array( __CLASS__, 'maybe_cornerstone_builder' ));
99
-
100
-				add_action( 'wp_ajax_super_duper_get_widget_settings', array( __CLASS__, 'get_widget_settings' ) );
101
-				add_action( 'wp_ajax_super_duper_get_picker', array( __CLASS__, 'get_picker' ) );
102
-
103
-				// add generator text to admin head
104
-				add_action( 'admin_head', array( $this, 'generator' ) );
105
-			}
106
-
107
-			do_action( 'wp_super_duper_widget_init', $options, $this );
108
-		}
109
-
110
-		public function register_fusion_element(){
111
-
112
-			$options = $this->options;
113
-
114
-			if($this->base_id){
115
-
116
-				$params = $this->get_fusion_params();
117
-
118
-				$args = array(
119
-					'name'            => $options['name'],
120
-					'shortcode'       => $this->base_id,
121
-					'icon'            => $options['block-icon'] ? $options['block-icon'] : 'far fa-square',
122
-					'allow_generator' => true,
123
-				);
124
-
125
-				if(!empty($params)){
126
-					$args['params'] = $params;
127
-				}
128
-
129
-				fusion_builder_map($args);
130
-			}
131
-
132
-		}
133
-
134
-		public function get_fusion_params(){
135
-			$params = array();
136
-			$arguments = $this->get_arguments();
137
-
138
-			if(!empty($arguments)){
139
-				foreach($arguments as $key => $val){
140
-					$param = array();
141
-					// type
142
-					$param['type'] = str_replace(
143
-						array(
144
-							"text",
145
-							"number",
146
-							"email",
147
-							"color",
148
-							"checkbox"
149
-						),
150
-						array(
151
-							"textfield",
152
-							"textfield",
153
-							"textfield",
154
-							"colorpicker",
155
-							"select",
156
-
157
-						),
158
-						$val['type']);
159
-
160
-					// heading
161
-					$param['heading'] = $val['title'];
162
-
163
-					// description
164
-					$param['description'] = isset($val['desc']) ? $val['desc'] : '';
165
-
166
-					// param_name
167
-					$param['param_name'] = $key;
168
-
169
-					// Default 
170
-					$param['default'] = isset($val['default']) ? $val['default'] : '';
171
-
172
-					// Group
173
-					if(isset($val['group'])){
174
-						$param['group'] = $val['group'];
175
-					}
176
-
177
-					// value
178
-					if($val['type'] == 'checkbox'){
179
-						if(isset($val['default']) && $val['default'] == '0'){
180
-							unset($param['default']);
181
-						}
182
-						$param['value'] = array(''=>__("No"),'1'=>__("Yes"));
183
-					}elseif($param['type'] == 'select'){
184
-						$param['value'] = isset($val['options']) ? $val['options'] : array();
185
-					}else{
186
-						$param['value'] = isset($val['default']) ? $val['default'] : '';
187
-					}
188
-
189
-					// setup the param
190
-					$params[] = $param;
191
-
192
-				}
193
-			}
194
-
195
-
196
-			return $params;
197
-		}
198
-
199
-		/**
200
-		 * Maybe insert the shortcode inserter button in the footer if we are in the cornerstone builder
201
-		 */
202
-		public static function maybe_cornerstone_builder(){
203
-			if(did_action('cornerstone_before_boot_app')){
204
-				self::shortcode_insert_button_script();
205
-			}
206
-		}
207
-
208
-		/**
209
-		 * A function to ge the shortcode builder picker html.
210
-		 *
211
-		 * @param string $editor_id
212
-		 *
213
-		 * @return string
214
-		 */
215
-		public static function get_picker( $editor_id = '' ) {
216
-
217
-			ob_start();
218
-			if ( isset( $_POST['editor_id'] ) ) {
219
-				$editor_id = esc_attr( $_POST['editor_id'] );
220
-			} elseif ( isset( $_REQUEST['et_fb'] ) ) {
221
-				$editor_id = 'main_content_content_vb_tiny_mce';
222
-			}
223
-
224
-			global $sd_widgets;
225
-			?>
9
+    /**
10
+     * A Class to be able to create a Widget, Shortcode or Block to be able to output content for WordPress.
11
+     *
12
+     * Should not be called direct but extended instead.
13
+     *
14
+     * Class WP_Super_Duper
15
+     * @since 1.0.16 change log moved to file change-log.txt - CHANGED
16
+     * @ver 1.0.16
17
+     */
18
+    class WP_Super_Duper extends WP_Widget {
19
+
20
+        public $version = "1.0.16";
21
+        public $font_awesome_icon_version = "5.11.2";
22
+        public $block_code;
23
+        public $options;
24
+        public $base_id;
25
+        public $arguments = array();
26
+        public $instance = array();
27
+        private $class_name;
28
+
29
+        /**
30
+         * The relative url to the current folder.
31
+         *
32
+         * @var string
33
+         */
34
+        public $url = '';
35
+
36
+        /**
37
+         * Take the array options and use them to build.
38
+         */
39
+        public function __construct( $options ) {
40
+            global $sd_widgets;
41
+
42
+            $sd_widgets[ $options['base_id'] ] = array(
43
+                'name'       => $options['name'],
44
+                'class_name' => $options['class_name']
45
+            );
46
+            $this->base_id                     = $options['base_id'];
47
+            // lets filter the options before we do anything
48
+            $options       = apply_filters( "wp_super_duper_options", $options );
49
+            $options       = apply_filters( "wp_super_duper_options_{$this->base_id}", $options );
50
+            $options       = $this->add_name_from_key( $options );
51
+            $this->options = $options;
52
+
53
+            $this->base_id   = $options['base_id'];
54
+            $this->arguments = isset( $options['arguments'] ) ? $options['arguments'] : array();
55
+
56
+            // init parent
57
+            parent::__construct( $options['base_id'], $options['name'], $options['widget_ops'] );
58
+
59
+            if ( isset( $options['class_name'] ) ) {
60
+                // register widget
61
+                $this->class_name = $options['class_name'];
62
+
63
+                // register shortcode
64
+                $this->register_shortcode();
65
+
66
+                // Fusion Builder (avada) support
67
+                if( function_exists('fusion_builder_map') ){ $this->register_fusion_element(); }
68
+
69
+                // register block
70
+                add_action( 'admin_enqueue_scripts', array( $this, 'register_block' ) );
71
+            }
72
+
73
+            // add the CSS and JS we need ONCE
74
+            global $sd_widget_scripts;
75
+
76
+            if ( ! $sd_widget_scripts ) {
77
+                wp_add_inline_script( 'admin-widgets', $this->widget_js() );
78
+                wp_add_inline_script( 'customize-controls', $this->widget_js() );
79
+                wp_add_inline_style( 'widgets', $this->widget_css() );
80
+
81
+                $sd_widget_scripts = true;
82
+
83
+                // add shortcode insert button once
84
+                add_action( 'media_buttons', array( $this, 'shortcode_insert_button' ) );
85
+                // generatepress theme sections compatibility
86
+                if ( function_exists( 'generate_sections_sections_metabox' ) ) {
87
+                    add_action( 'generate_sections_metabox', array( $this, 'shortcode_insert_button_script' ) );
88
+                }
89
+                if ( $this->is_preview() ) {
90
+                    add_action( 'wp_footer', array( $this, 'shortcode_insert_button_script' ) );
91
+                    // this makes the insert button work for elementor
92
+                    add_action( 'elementor/editor/after_enqueue_scripts', array(
93
+                        $this,
94
+                        'shortcode_insert_button_script'
95
+                    ) ); // for elementor
96
+                }
97
+                // this makes the insert button work for cornerstone
98
+                add_action('wp_print_footer_scripts',array( __CLASS__, 'maybe_cornerstone_builder' ));
99
+
100
+                add_action( 'wp_ajax_super_duper_get_widget_settings', array( __CLASS__, 'get_widget_settings' ) );
101
+                add_action( 'wp_ajax_super_duper_get_picker', array( __CLASS__, 'get_picker' ) );
102
+
103
+                // add generator text to admin head
104
+                add_action( 'admin_head', array( $this, 'generator' ) );
105
+            }
106
+
107
+            do_action( 'wp_super_duper_widget_init', $options, $this );
108
+        }
109
+
110
+        public function register_fusion_element(){
111
+
112
+            $options = $this->options;
113
+
114
+            if($this->base_id){
115
+
116
+                $params = $this->get_fusion_params();
117
+
118
+                $args = array(
119
+                    'name'            => $options['name'],
120
+                    'shortcode'       => $this->base_id,
121
+                    'icon'            => $options['block-icon'] ? $options['block-icon'] : 'far fa-square',
122
+                    'allow_generator' => true,
123
+                );
124
+
125
+                if(!empty($params)){
126
+                    $args['params'] = $params;
127
+                }
128
+
129
+                fusion_builder_map($args);
130
+            }
131
+
132
+        }
133
+
134
+        public function get_fusion_params(){
135
+            $params = array();
136
+            $arguments = $this->get_arguments();
137
+
138
+            if(!empty($arguments)){
139
+                foreach($arguments as $key => $val){
140
+                    $param = array();
141
+                    // type
142
+                    $param['type'] = str_replace(
143
+                        array(
144
+                            "text",
145
+                            "number",
146
+                            "email",
147
+                            "color",
148
+                            "checkbox"
149
+                        ),
150
+                        array(
151
+                            "textfield",
152
+                            "textfield",
153
+                            "textfield",
154
+                            "colorpicker",
155
+                            "select",
156
+
157
+                        ),
158
+                        $val['type']);
159
+
160
+                    // heading
161
+                    $param['heading'] = $val['title'];
162
+
163
+                    // description
164
+                    $param['description'] = isset($val['desc']) ? $val['desc'] : '';
165
+
166
+                    // param_name
167
+                    $param['param_name'] = $key;
168
+
169
+                    // Default 
170
+                    $param['default'] = isset($val['default']) ? $val['default'] : '';
171
+
172
+                    // Group
173
+                    if(isset($val['group'])){
174
+                        $param['group'] = $val['group'];
175
+                    }
176
+
177
+                    // value
178
+                    if($val['type'] == 'checkbox'){
179
+                        if(isset($val['default']) && $val['default'] == '0'){
180
+                            unset($param['default']);
181
+                        }
182
+                        $param['value'] = array(''=>__("No"),'1'=>__("Yes"));
183
+                    }elseif($param['type'] == 'select'){
184
+                        $param['value'] = isset($val['options']) ? $val['options'] : array();
185
+                    }else{
186
+                        $param['value'] = isset($val['default']) ? $val['default'] : '';
187
+                    }
188
+
189
+                    // setup the param
190
+                    $params[] = $param;
191
+
192
+                }
193
+            }
194
+
195
+
196
+            return $params;
197
+        }
198
+
199
+        /**
200
+         * Maybe insert the shortcode inserter button in the footer if we are in the cornerstone builder
201
+         */
202
+        public static function maybe_cornerstone_builder(){
203
+            if(did_action('cornerstone_before_boot_app')){
204
+                self::shortcode_insert_button_script();
205
+            }
206
+        }
207
+
208
+        /**
209
+         * A function to ge the shortcode builder picker html.
210
+         *
211
+         * @param string $editor_id
212
+         *
213
+         * @return string
214
+         */
215
+        public static function get_picker( $editor_id = '' ) {
216
+
217
+            ob_start();
218
+            if ( isset( $_POST['editor_id'] ) ) {
219
+                $editor_id = esc_attr( $_POST['editor_id'] );
220
+            } elseif ( isset( $_REQUEST['et_fb'] ) ) {
221
+                $editor_id = 'main_content_content_vb_tiny_mce';
222
+            }
223
+
224
+            global $sd_widgets;
225
+            ?>
226 226
 
227 227
 			<div class="sd-shortcode-left-wrap">
228 228
 				<?php
229
-				ksort( $sd_widgets );
230
-				//				print_r($sd_widgets);exit;
231
-				if ( ! empty( $sd_widgets ) ) {
232
-					echo '<select class="widefat" onchange="sd_get_shortcode_options(this);">';
233
-					echo "<option>" . __( 'Select shortcode' ) . "</option>";
234
-					foreach ( $sd_widgets as $shortcode => $class ) {
235
-						echo "<option value='" . esc_attr( $shortcode ) . "'>" . esc_attr( $shortcode ) . " (" . esc_attr( $class['name'] ) . ")</option>";
236
-					}
237
-					echo "</select>";
238
-
239
-				}
240
-				?>
229
+                ksort( $sd_widgets );
230
+                //				print_r($sd_widgets);exit;
231
+                if ( ! empty( $sd_widgets ) ) {
232
+                    echo '<select class="widefat" onchange="sd_get_shortcode_options(this);">';
233
+                    echo "<option>" . __( 'Select shortcode' ) . "</option>";
234
+                    foreach ( $sd_widgets as $shortcode => $class ) {
235
+                        echo "<option value='" . esc_attr( $shortcode ) . "'>" . esc_attr( $shortcode ) . " (" . esc_attr( $class['name'] ) . ")</option>";
236
+                    }
237
+                    echo "</select>";
238
+
239
+                }
240
+                ?>
241 241
 				<div class="sd-shortcode-settings"></div>
242 242
 
243 243
 			</div>
@@ -248,8 +248,8 @@  discard block
 block discarded – undo
248 248
 					<?php if ( $editor_id != '' ) { ?>
249 249
 						<button class="button sd-insert-shortcode-button"
250 250
 						        onclick="sd_insert_shortcode(<?php if ( ! empty( $editor_id ) ) {
251
-							        echo "'" . $editor_id . "'";
252
-						        } ?>)"><?php _e( 'Insert shortcode' ); ?></button>
251
+                                    echo "'" . $editor_id . "'";
252
+                                } ?>)"><?php _e( 'Insert shortcode' ); ?></button>
253 253
 					<?php } ?>
254 254
 					<button class="button"
255 255
 					        onclick="sd_copy_to_clipboard()"><?php _e( 'Copy shortcode' ); ?></button>
@@ -257,134 +257,134 @@  discard block
 block discarded – undo
257 257
 			</div>
258 258
 			<?php
259 259
 
260
-			$html = ob_get_clean();
261
-
262
-			if ( wp_doing_ajax() ) {
263
-				echo $html;
264
-				$should_die = true;
265
-
266
-				// some builder get the editor via ajax so we should not die on those ocasions
267
-				$dont_die = array(
268
-					'parent_tag',// WP Bakery
269
-					'avia_request' // enfold
270
-				);
271
-
272
-				foreach ( $dont_die as $request ) {
273
-					if ( isset( $_REQUEST[ $request ] ) ) {
274
-						$should_die = false;
275
-					}
276
-				}
277
-
278
-				if ( $should_die ) {
279
-					wp_die();
280
-				}
281
-
282
-			} else {
283
-				return $html;
284
-			}
285
-
286
-			return '';
287
-
288
-		}
289
-
290
-		/**
291
-		 * Output the version in the admin header.
292
-		 */
293
-		public function generator() {
294
-			echo '<meta name="generator" content="WP Super Duper v' . $this->version . '" />';
295
-		}
296
-
297
-		/**
298
-		 * Get widget settings.
299
-		 *
300
-		 * @since 1.0.0
301
-		 */
302
-		public static function get_widget_settings() {
303
-			global $sd_widgets;
304
-
305
-			$shortcode = isset( $_REQUEST['shortcode'] ) && $_REQUEST['shortcode'] ? sanitize_title_with_dashes( $_REQUEST['shortcode'] ) : '';
306
-			if ( ! $shortcode ) {
307
-				wp_die();
308
-			}
309
-			$widget_args = isset( $sd_widgets[ $shortcode ] ) ? $sd_widgets[ $shortcode ] : '';
310
-			if ( ! $widget_args ) {
311
-				wp_die();
312
-			}
313
-			$class_name = isset( $widget_args['class_name'] ) && $widget_args['class_name'] ? $widget_args['class_name'] : '';
314
-			if ( ! $class_name ) {
315
-				wp_die();
316
-			}
317
-
318
-			// invoke an instance method
319
-			$widget = new $class_name;
320
-
321
-			ob_start();
322
-			$widget->form( array() );
323
-			$form = ob_get_clean();
324
-			echo "<form id='$shortcode'>" . $form . "<div class=\"widget-control-save\"></div></form>";
325
-			echo "<style>" . $widget->widget_css() . "</style>";
326
-			echo "<script>" . $widget->widget_js() . "</script>";
327
-			?>
260
+            $html = ob_get_clean();
261
+
262
+            if ( wp_doing_ajax() ) {
263
+                echo $html;
264
+                $should_die = true;
265
+
266
+                // some builder get the editor via ajax so we should not die on those ocasions
267
+                $dont_die = array(
268
+                    'parent_tag',// WP Bakery
269
+                    'avia_request' // enfold
270
+                );
271
+
272
+                foreach ( $dont_die as $request ) {
273
+                    if ( isset( $_REQUEST[ $request ] ) ) {
274
+                        $should_die = false;
275
+                    }
276
+                }
277
+
278
+                if ( $should_die ) {
279
+                    wp_die();
280
+                }
281
+
282
+            } else {
283
+                return $html;
284
+            }
285
+
286
+            return '';
287
+
288
+        }
289
+
290
+        /**
291
+         * Output the version in the admin header.
292
+         */
293
+        public function generator() {
294
+            echo '<meta name="generator" content="WP Super Duper v' . $this->version . '" />';
295
+        }
296
+
297
+        /**
298
+         * Get widget settings.
299
+         *
300
+         * @since 1.0.0
301
+         */
302
+        public static function get_widget_settings() {
303
+            global $sd_widgets;
304
+
305
+            $shortcode = isset( $_REQUEST['shortcode'] ) && $_REQUEST['shortcode'] ? sanitize_title_with_dashes( $_REQUEST['shortcode'] ) : '';
306
+            if ( ! $shortcode ) {
307
+                wp_die();
308
+            }
309
+            $widget_args = isset( $sd_widgets[ $shortcode ] ) ? $sd_widgets[ $shortcode ] : '';
310
+            if ( ! $widget_args ) {
311
+                wp_die();
312
+            }
313
+            $class_name = isset( $widget_args['class_name'] ) && $widget_args['class_name'] ? $widget_args['class_name'] : '';
314
+            if ( ! $class_name ) {
315
+                wp_die();
316
+            }
317
+
318
+            // invoke an instance method
319
+            $widget = new $class_name;
320
+
321
+            ob_start();
322
+            $widget->form( array() );
323
+            $form = ob_get_clean();
324
+            echo "<form id='$shortcode'>" . $form . "<div class=\"widget-control-save\"></div></form>";
325
+            echo "<style>" . $widget->widget_css() . "</style>";
326
+            echo "<script>" . $widget->widget_js() . "</script>";
327
+            ?>
328 328
 			<?php
329
-			wp_die();
330
-		}
331
-
332
-		/**
333
-		 * Insert shortcode builder button to classic editor (not inside Gutenberg, not needed).
334
-		 *
335
-		 * @since 1.0.0
336
-		 *
337
-		 * @param string $editor_id Optional. Shortcode editor id. Default null.
338
-		 * @param string $insert_shortcode_function Optional. Insert shotcode function. Default null.
339
-		 */
340
-		public static function shortcode_insert_button( $editor_id = '', $insert_shortcode_function = '' ) {
341
-			global $sd_widgets, $shortcode_insert_button_once;
342
-			if ( $shortcode_insert_button_once ) {
343
-				return;
344
-			}
345
-			add_thickbox();
346
-
347
-
348
-			/**
349
-			 * Cornerstone makes us play dirty tricks :/
350
-			 * All media_buttons are removed via JS unless they are two specific id's so we wrap our content in this ID so it is not removed.
351
-			 */
352
-			if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
353
-				echo '<span id="insert-media-button">';
354
-			}
355
-
356
-			echo self::shortcode_button( 'this', 'true' );
357
-
358
-			// see opening note
359
-			if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
360
-				echo '</span>'; // end #insert-media-button
361
-			}
362
-
363
-			// Add separate script for generatepress theme sections
364
-			if ( function_exists( 'generate_sections_sections_metabox' ) && did_action( 'generate_sections_metabox' ) ) {
365
-			} else {
366
-				self::shortcode_insert_button_script( $editor_id, $insert_shortcode_function );
367
-			}
368
-
369
-			$shortcode_insert_button_once = true;
370
-		}
371
-
372
-		/**
373
-		 * Gets the shortcode insert button html.
374
-		 *
375
-		 * @param string $id
376
-		 * @param string $search_for_id
377
-		 *
378
-		 * @return mixed
379
-		 */
380
-		public static function shortcode_button( $id = '', $search_for_id = '' ) {
381
-			ob_start();
382
-			?>
329
+            wp_die();
330
+        }
331
+
332
+        /**
333
+         * Insert shortcode builder button to classic editor (not inside Gutenberg, not needed).
334
+         *
335
+         * @since 1.0.0
336
+         *
337
+         * @param string $editor_id Optional. Shortcode editor id. Default null.
338
+         * @param string $insert_shortcode_function Optional. Insert shotcode function. Default null.
339
+         */
340
+        public static function shortcode_insert_button( $editor_id = '', $insert_shortcode_function = '' ) {
341
+            global $sd_widgets, $shortcode_insert_button_once;
342
+            if ( $shortcode_insert_button_once ) {
343
+                return;
344
+            }
345
+            add_thickbox();
346
+
347
+
348
+            /**
349
+             * Cornerstone makes us play dirty tricks :/
350
+             * All media_buttons are removed via JS unless they are two specific id's so we wrap our content in this ID so it is not removed.
351
+             */
352
+            if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
353
+                echo '<span id="insert-media-button">';
354
+            }
355
+
356
+            echo self::shortcode_button( 'this', 'true' );
357
+
358
+            // see opening note
359
+            if ( function_exists( 'cornerstone_plugin_init' ) && ! is_admin() ) {
360
+                echo '</span>'; // end #insert-media-button
361
+            }
362
+
363
+            // Add separate script for generatepress theme sections
364
+            if ( function_exists( 'generate_sections_sections_metabox' ) && did_action( 'generate_sections_metabox' ) ) {
365
+            } else {
366
+                self::shortcode_insert_button_script( $editor_id, $insert_shortcode_function );
367
+            }
368
+
369
+            $shortcode_insert_button_once = true;
370
+        }
371
+
372
+        /**
373
+         * Gets the shortcode insert button html.
374
+         *
375
+         * @param string $id
376
+         * @param string $search_for_id
377
+         *
378
+         * @return mixed
379
+         */
380
+        public static function shortcode_button( $id = '', $search_for_id = '' ) {
381
+            ob_start();
382
+            ?>
383 383
 			<span class="sd-lable-shortcode-inserter">
384 384
 				<a onclick="sd_ajax_get_picker(<?php echo $id;
385
-				if ( $search_for_id ) {
386
-					echo "," . $search_for_id;
387
-				} ?>);" href="#TB_inline?width=100%&height=550&inlineId=super-duper-content-ajaxed"
385
+                if ( $search_for_id ) {
386
+                    echo "," . $search_for_id;
387
+                } ?>);" href="#TB_inline?width=100%&height=550&inlineId=super-duper-content-ajaxed"
388 388
 				   class="thickbox button super-duper-content-open" title="Add Shortcode">
389 389
 					<span style="vertical-align: middle;line-height: 18px;font-size: 20px;"
390 390
 					      class="dashicons dashicons-screenoptions"></span>
@@ -395,21 +395,21 @@  discard block
 block discarded – undo
395 395
 			</span>
396 396
 
397 397
 			<?php
398
-			$html = ob_get_clean();
399
-
400
-			// remove line breaks so we can use it in js
401
-			return preg_replace( "/\r|\n/", "", trim( $html ) );
402
-		}
403
-
404
-		/**
405
-		 * Makes SD work with the siteOrigin page builder.
406
-		 *
407
-		 * @since 1.0.6
408
-		 * @return mixed
409
-		 */
410
-		public static function siteorigin_js() {
411
-			ob_start();
412
-			?>
398
+            $html = ob_get_clean();
399
+
400
+            // remove line breaks so we can use it in js
401
+            return preg_replace( "/\r|\n/", "", trim( $html ) );
402
+        }
403
+
404
+        /**
405
+         * Makes SD work with the siteOrigin page builder.
406
+         *
407
+         * @since 1.0.6
408
+         * @return mixed
409
+         */
410
+        public static function siteorigin_js() {
411
+            ob_start();
412
+            ?>
413 413
 			<script>
414 414
 				/**
415 415
 				 * Check a form to see what items shoudl be shown or hidden.
@@ -487,28 +487,28 @@  discard block
 block discarded – undo
487 487
 				});
488 488
 			</script>
489 489
 			<?php
490
-			$output = ob_get_clean();
490
+            $output = ob_get_clean();
491 491
 
492
-			/*
492
+            /*
493 493
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
494 494
 			 */
495 495
 
496
-			return str_replace( array(
497
-				'<script>',
498
-				'</script>'
499
-			), '', $output );
500
-		}
501
-
502
-		/**
503
-		 * Output the JS and CSS for the shortcode insert button.
504
-		 *
505
-		 * @since 1.0.6
506
-		 *
507
-		 * @param string $editor_id
508
-		 * @param string $insert_shortcode_function
509
-		 */
510
-		public static function shortcode_insert_button_script( $editor_id = '', $insert_shortcode_function = '' ) {
511
-			?>
496
+            return str_replace( array(
497
+                '<script>',
498
+                '</script>'
499
+            ), '', $output );
500
+        }
501
+
502
+        /**
503
+         * Output the JS and CSS for the shortcode insert button.
504
+         *
505
+         * @since 1.0.6
506
+         *
507
+         * @param string $editor_id
508
+         * @param string $insert_shortcode_function
509
+         */
510
+        public static function shortcode_insert_button_script( $editor_id = '', $insert_shortcode_function = '' ) {
511
+            ?>
512 512
 			<style>
513 513
 				.sd-shortcode-left-wrap {
514 514
 					float: left;
@@ -632,35 +632,35 @@  discard block
 block discarded – undo
632 632
 				<?php } ?>
633 633
 			</style>
634 634
 			<?php
635
-			if ( class_exists( 'SiteOrigin_Panels' ) ) {
636
-				echo "<script>" . self::siteorigin_js() . "</script>";
637
-			}
638
-			?>
635
+            if ( class_exists( 'SiteOrigin_Panels' ) ) {
636
+                echo "<script>" . self::siteorigin_js() . "</script>";
637
+            }
638
+            ?>
639 639
 			<script>
640 640
 				<?php
641
-				if(! empty( $insert_shortcode_function )){
642
-					echo $insert_shortcode_function;
643
-				}else{
644
-
645
-				/**
646
-				 * Function for super duper insert shortcode.
647
-				 *
648
-				 * @since 1.0.0
649
-				 */
650
-				?>
641
+                if(! empty( $insert_shortcode_function )){
642
+                    echo $insert_shortcode_function;
643
+                }else{
644
+
645
+                /**
646
+                 * Function for super duper insert shortcode.
647
+                 *
648
+                 * @since 1.0.0
649
+                 */
650
+                ?>
651 651
 				function sd_insert_shortcode($editor_id) {
652 652
 					$shortcode = jQuery('#TB_ajaxContent #sd-shortcode-output').val();
653 653
 					if ($shortcode) {
654 654
 						if (!$editor_id) {
655 655
 							<?php
656
-							if ( isset( $_REQUEST['et_fb'] ) ) {
657
-								echo '$editor_id = "#main_content_content_vb_tiny_mce";';
658
-							} elseif ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) {
659
-								echo '$editor_id = "#elementor-controls .wp-editor-container textarea";';
660
-							} else {
661
-								echo '$editor_id = "#wp-content-editor-container textarea";';
662
-							}
663
-							?>
656
+                            if ( isset( $_REQUEST['et_fb'] ) ) {
657
+                                echo '$editor_id = "#main_content_content_vb_tiny_mce";';
658
+                            } elseif ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) {
659
+                                echo '$editor_id = "#elementor-controls .wp-editor-container textarea";';
660
+                            } else {
661
+                                echo '$editor_id = "#wp-content-editor-container textarea";';
662
+                            }
663
+                            ?>
664 664
 						} else {
665 665
 							$editor_id = '#' + $editor_id;
666 666
 						}
@@ -986,16 +986,16 @@  discard block
 block discarded – undo
986 986
 
987 987
 			</script>
988 988
 			<?php
989
-		}
990
-
991
-		/**
992
-		 * Gets some CSS for the widgets screen.
993
-		 *
994
-		 * @return mixed
995
-		 */
996
-		public function widget_css() {
997
-			ob_start();
998
-			?>
989
+        }
990
+
991
+        /**
992
+         * Gets some CSS for the widgets screen.
993
+         *
994
+         * @return mixed
995
+         */
996
+        public function widget_css() {
997
+            ob_start();
998
+            ?>
999 999
 			<style>
1000 1000
 				.sd-advanced-setting {
1001 1001
 					display: none;
@@ -1030,26 +1030,26 @@  discard block
 block discarded – undo
1030 1030
 				}
1031 1031
 			</style>
1032 1032
 			<?php
1033
-			$output = ob_get_clean();
1033
+            $output = ob_get_clean();
1034 1034
 
1035
-			/*
1035
+            /*
1036 1036
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1037 1037
 			 */
1038 1038
 
1039
-			return str_replace( array(
1040
-				'<style>',
1041
-				'</style>'
1042
-			), '', $output );
1043
-		}
1044
-
1045
-		/**
1046
-		 * Gets some JS for the widgets screen.
1047
-		 *
1048
-		 * @return mixed
1049
-		 */
1050
-		public function widget_js() {
1051
-			ob_start();
1052
-			?>
1039
+            return str_replace( array(
1040
+                '<style>',
1041
+                '</style>'
1042
+            ), '', $output );
1043
+        }
1044
+
1045
+        /**
1046
+         * Gets some JS for the widgets screen.
1047
+         *
1048
+         * @return mixed
1049
+         */
1050
+        public function widget_js() {
1051
+            ob_start();
1052
+            ?>
1053 1053
 			<script>
1054 1054
 
1055 1055
 				/**
@@ -1204,397 +1204,397 @@  discard block
 block discarded – undo
1204 1204
 				<?php do_action( 'wp_super_duper_widget_js', $this ); ?>
1205 1205
 			</script>
1206 1206
 			<?php
1207
-			$output = ob_get_clean();
1207
+            $output = ob_get_clean();
1208 1208
 
1209
-			/*
1209
+            /*
1210 1210
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1211 1211
 			 */
1212 1212
 
1213
-			return str_replace( array(
1214
-				'<script>',
1215
-				'</script>'
1216
-			), '', $output );
1217
-		}
1218
-
1219
-
1220
-		/**
1221
-		 * Set the name from the argument key.
1222
-		 *
1223
-		 * @param $options
1224
-		 *
1225
-		 * @return mixed
1226
-		 */
1227
-		private function add_name_from_key( $options, $arguments = false ) {
1228
-			if ( ! empty( $options['arguments'] ) ) {
1229
-				foreach ( $options['arguments'] as $key => $val ) {
1230
-					$options['arguments'][ $key ]['name'] = $key;
1231
-				}
1232
-			} elseif ( $arguments && is_array( $options ) && ! empty( $options ) ) {
1233
-				foreach ( $options as $key => $val ) {
1234
-					$options[ $key ]['name'] = $key;
1235
-				}
1236
-			}
1237
-
1238
-			return $options;
1239
-		}
1240
-
1241
-		/**
1242
-		 * Register the parent shortcode.
1243
-		 *
1244
-		 * @since 1.0.0
1245
-		 */
1246
-		public function register_shortcode() {
1247
-			add_shortcode( $this->base_id, array( $this, 'shortcode_output' ) );
1248
-			add_action( 'wp_ajax_super_duper_output_shortcode', array( __CLASS__, 'render_shortcode' ) );
1249
-		}
1250
-
1251
-		/**
1252
-		 * Render the shortcode via ajax so we can return it to Gutenberg.
1253
-		 *
1254
-		 * @since 1.0.0
1255
-		 */
1256
-		public static function render_shortcode() {
1257
-
1258
-			check_ajax_referer( 'super_duper_output_shortcode', '_ajax_nonce', true );
1259
-			if ( ! current_user_can( 'manage_options' ) ) {
1260
-				wp_die();
1261
-			}
1262
-
1263
-			// we might need the $post value here so lets set it.
1264
-			if ( isset( $_POST['post_id'] ) && $_POST['post_id'] ) {
1265
-				$post_obj = get_post( absint( $_POST['post_id'] ) );
1266
-				if ( ! empty( $post_obj ) && empty( $post ) ) {
1267
-					global $post;
1268
-					$post = $post_obj;
1269
-				}
1270
-			}
1271
-
1272
-			if ( isset( $_POST['shortcode'] ) && $_POST['shortcode'] ) {
1273
-				$shortcode_name   = sanitize_title_with_dashes( $_POST['shortcode'] );
1274
-				$attributes_array = isset( $_POST['attributes'] ) && $_POST['attributes'] ? $_POST['attributes'] : array();
1275
-				$attributes       = '';
1276
-				if ( ! empty( $attributes_array ) ) {
1277
-					foreach ( $attributes_array as $key => $value ) {
1278
-						$attributes .= " " . sanitize_title_with_dashes( $key ) . "='" . wp_slash( $value ) . "' ";
1279
-					}
1280
-				}
1281
-
1282
-				$shortcode = "[" . $shortcode_name . " " . $attributes . "]";
1283
-
1284
-				echo do_shortcode( $shortcode );
1285
-
1286
-			}
1287
-			wp_die();
1288
-		}
1289
-
1290
-		/**
1291
-		 * Output the shortcode.
1292
-		 *
1293
-		 * @param array $args
1294
-		 * @param string $content
1295
-		 *
1296
-		 * @return string
1297
-		 */
1298
-		public function shortcode_output( $args = array(), $content = '' ) {
1299
-			$args = self::argument_values( $args );
1300
-
1301
-			// add extra argument so we know its a output to gutenberg
1302
-			//$args
1303
-			$args = $this->string_to_bool( $args );
1304
-
1305
-			// if we have a enclosed shortcode we add it to the special `html` argument
1306
-			if(!empty($content)){
1307
-				$args['html'] = $content;
1308
-			}
1309
-
1310
-			$class = isset( $this->options['widget_ops']['classname'] ) ? esc_attr( $this->options['widget_ops']['classname'] ) : '';
1311
-
1312
-			$class = apply_filters( 'wp_super_duper_div_classname', $class, $args, $this );
1313
-			$class = apply_filters( 'wp_super_duper_div_classname_' . $this->base_id, $class, $args, $this );
1314
-
1315
-			$attrs = apply_filters( 'wp_super_duper_div_attrs', '', $args, $this );
1316
-			$attrs = apply_filters( 'wp_super_duper_div_attrs_' . $this->base_id, '', $args, $this ); //@todo this does not seem right @kiran?
1317
-
1318
-			$shortcode_args = array();
1319
-			$output         = '';
1320
-			$no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1321
-			if( isset( $args['no_wrap'] ) && $args['no_wrap'] ){ $no_wrap = true; }
1322
-			$main_content   = $this->output( $args, $shortcode_args, $content );
1323
-			if ( $main_content && ! $no_wrap ) {
1324
-				// wrap the shortcode in a div with the same class as the widget
1325
-				$output .= '<div class="' . $class . '" ' . $attrs . '>';
1326
-				if ( ! empty( $args['title'] ) ) {
1327
-					// if its a shortcode and there is a title try to grab the title wrappers
1328
-					$shortcode_args = array( 'before_title' => '', 'after_title' => '' );
1329
-					if ( empty( $instance ) ) {
1330
-						global $wp_registered_sidebars;
1331
-						if ( ! empty( $wp_registered_sidebars ) ) {
1332
-							foreach ( $wp_registered_sidebars as $sidebar ) {
1333
-								if ( ! empty( $sidebar['before_title'] ) ) {
1334
-									$shortcode_args['before_title'] = $sidebar['before_title'];
1335
-									$shortcode_args['after_title']  = $sidebar['after_title'];
1336
-									break;
1337
-								}
1338
-							}
1339
-						}
1340
-					}
1341
-					$output .= $this->output_title( $shortcode_args, $args );
1342
-				}
1343
-				$output .= $main_content;
1344
-				$output .= '</div>';
1345
-			} elseif ( $main_content && $no_wrap ) {
1346
-				$output .= $main_content;
1347
-			}
1348
-
1349
-			// if preview show a placeholder if empty
1350
-			if ( $this->is_preview() && $output == '' ) {
1351
-				$output = $this->preview_placeholder_text( "[{" . $this->base_id . "}]" );
1352
-			}
1353
-
1354
-			return apply_filters( 'wp_super_duper_widget_output', $output, $args, $shortcode_args, $this );
1355
-		}
1356
-
1357
-		/**
1358
-		 * Placeholder text to show if output is empty and we are on a preview/builder page.
1359
-		 *
1360
-		 * @param string $name
1361
-		 *
1362
-		 * @return string
1363
-		 */
1364
-		public function preview_placeholder_text( $name = '' ) {
1365
-			return "<div style='background:#0185ba33;padding: 10px;border: 4px #ccc dashed;'>" . sprintf( __( 'Placeholder for: %s' ), $name ) . "</div>";
1366
-		}
1367
-
1368
-		/**
1369
-		 * Sometimes booleans values can be turned to strings, so we fix that.
1370
-		 *
1371
-		 * @param $options
1372
-		 *
1373
-		 * @return mixed
1374
-		 */
1375
-		public function string_to_bool( $options ) {
1376
-			// convert bool strings to booleans
1377
-			foreach ( $options as $key => $val ) {
1378
-				if ( $val == 'false' ) {
1379
-					$options[ $key ] = false;
1380
-				} elseif ( $val == 'true' ) {
1381
-					$options[ $key ] = true;
1382
-				}
1383
-			}
1384
-
1385
-			return $options;
1386
-		}
1387
-
1388
-		/**
1389
-		 * Get the argument values that are also filterable.
1390
-		 *
1391
-		 * @param $instance
1392
-		 *
1393
-		 * @since 1.0.12 Don't set checkbox default value if the value is empty.
1394
-		 *
1395
-		 * @return array
1396
-		 */
1397
-		public function argument_values( $instance ) {
1398
-			$argument_values = array();
1399
-
1400
-			// set widget instance
1401
-			$this->instance = $instance;
1402
-
1403
-			if ( empty( $this->arguments ) ) {
1404
-				$this->arguments = $this->get_arguments();
1405
-			}
1406
-
1407
-			if ( ! empty( $this->arguments ) ) {
1408
-				foreach ( $this->arguments as $key => $args ) {
1409
-					// set the input name from the key
1410
-					$args['name'] = $key;
1411
-					//
1412
-					$argument_values[ $key ] = isset( $instance[ $key ] ) ? $instance[ $key ] : '';
1413
-					if($args['type']=='checkbox' && $argument_values[ $key ] == ''){
1414
-						// don't set default for an empty checkbox
1415
-					}
1416
-					elseif ( $argument_values[ $key ] == '' && isset( $args['default'] ) ) {
1417
-						$argument_values[ $key ] = $args['default'];
1418
-					}
1419
-				}
1420
-			}
1421
-
1422
-			return $argument_values;
1423
-		}
1424
-
1425
-		/**
1426
-		 * Set arguments in super duper.
1427
-		 *
1428
-		 * @since 1.0.0
1429
-		 *
1430
-		 * @return array Set arguments.
1431
-		 */
1432
-		public function set_arguments() {
1433
-			return $this->arguments;
1434
-		}
1435
-
1436
-		/**
1437
-		 * Get arguments in super duper.
1438
-		 *
1439
-		 * @since 1.0.0
1440
-		 *
1441
-		 * @return array Get arguments.
1442
-		 */
1443
-		public function get_arguments() {
1444
-			if ( empty( $this->arguments ) ) {
1445
-				$this->arguments = $this->set_arguments();
1446
-			}
1447
-
1448
-			$this->arguments = apply_filters( 'wp_super_duper_arguments', $this->arguments, $this->options, $this->instance );
1449
-			$this->arguments = $this->add_name_from_key( $this->arguments, true );
1450
-
1451
-			return $this->arguments;
1452
-		}
1453
-
1454
-		/**
1455
-		 * This is the main output class for all 3 items, widget, shortcode and block, it is extended in the calling class.
1456
-		 *
1457
-		 * @param array $args
1458
-		 * @param array $widget_args
1459
-		 * @param string $content
1460
-		 */
1461
-		public function output( $args = array(), $widget_args = array(), $content = '' ) {
1462
-
1463
-		}
1464
-
1465
-		/**
1466
-		 * Add the dynamic block code inline when the wp-block in enqueued.
1467
-		 */
1468
-		public function register_block() {
1469
-			wp_add_inline_script( 'wp-blocks', $this->block() );
1470
-			if ( class_exists( 'SiteOrigin_Panels' ) ) {
1471
-
1472
-				wp_add_inline_script( 'wp-blocks', $this->siteorigin_js() );
1473
-
1474
-			}
1475
-		}
1476
-
1477
-		/**
1478
-		 * Check if we need to show advanced options.
1479
-		 *
1480
-		 * @return bool
1481
-		 */
1482
-		public function block_show_advanced() {
1483
-
1484
-			$show      = false;
1485
-			$arguments = $this->arguments;
1486
-
1487
-			if ( empty( $arguments ) ) {
1488
-				$arguments = $this->get_arguments();
1489
-			}
1490
-
1491
-			if ( ! empty( $arguments ) ) {
1492
-				foreach ( $arguments as $argument ) {
1493
-					if ( isset( $argument['advanced'] ) && $argument['advanced'] ) {
1494
-						$show = true;
1495
-						break; // no need to continue if we know we have it
1496
-					}
1497
-				}
1498
-			}
1499
-
1500
-			return $show;
1501
-		}
1502
-
1503
-		/**
1504
-		 * Get the url path to the current folder.
1505
-		 *
1506
-		 * @return string
1507
-		 */
1508
-		public function get_url() {
1509
-
1510
-			$url = $this->url;
1511
-
1512
-			if(!$url){
1513
-				// check if we are inside a plugin
1514
-				$file_dir = str_replace("/includes","", dirname( __FILE__ ));
1515
-
1516
-				$dir_parts = explode("/wp-content/",$file_dir);
1517
-				$url_parts = explode("/wp-content/",plugins_url());
1518
-
1519
-				if(!empty($url_parts[0]) && !empty($dir_parts[1])){
1520
-					$url = trailingslashit( $url_parts[0]."/wp-content/".$dir_parts[1] );
1521
-					$this->url = $url;
1522
-				}
1523
-			}
1524
-
1525
-
1526
-			return $url;
1527
-		}
1528
-
1529
-		/**
1530
-		 * Generate the block icon.
1531
-		 *
1532
-		 * Enables the use of Font Awesome icons.
1533
-		 *
1534
-		 * @note xlink:href is actually deprecated but href is not supported by all so we use both.
1535
-		 * @param $icon
1536
-		 * @since 1.1.0
1537
-		 * @return string
1538
-		 */
1539
-		public function get_block_icon($icon){
1540
-
1541
-			// check if we have a Font Awesome icon
1542
-			$fa_type = '';
1543
-			if(substr( $icon, 0, 7 ) === "fas fa-"){
1544
-				$fa_type = 'solid';
1545
-			}elseif(substr( $icon, 0, 7 ) === "far fa-"){
1546
-				$fa_type = 'regular';
1547
-			}elseif(substr( $icon, 0, 7 ) === "fab fa-"){
1548
-				$fa_type = 'brands';
1549
-			}else{
1550
-				$icon = "'".$icon."'";
1551
-			}
1552
-
1553
-			// set the icon if we found one
1554
-			if($fa_type){
1555
-				$fa_icon = str_replace(array("fas fa-","far fa-","fab fa-"),"",$icon);
1556
-				$icon  = "el('svg',{width: 20, height: 20, viewBox: '0 0 20 20'},el('use', {'xlink:href': '".$this->get_url()."icons/".$fa_type.".svg#".$fa_icon."','href': '".$this->get_url()."icons/".$fa_type.".svg#".$fa_icon."'}))";
1557
-			}
1558
-
1559
-			return $icon;
1560
-		}
1561
-
1562
-		public function group_arguments($arguments){
1213
+            return str_replace( array(
1214
+                '<script>',
1215
+                '</script>'
1216
+            ), '', $output );
1217
+        }
1218
+
1219
+
1220
+        /**
1221
+         * Set the name from the argument key.
1222
+         *
1223
+         * @param $options
1224
+         *
1225
+         * @return mixed
1226
+         */
1227
+        private function add_name_from_key( $options, $arguments = false ) {
1228
+            if ( ! empty( $options['arguments'] ) ) {
1229
+                foreach ( $options['arguments'] as $key => $val ) {
1230
+                    $options['arguments'][ $key ]['name'] = $key;
1231
+                }
1232
+            } elseif ( $arguments && is_array( $options ) && ! empty( $options ) ) {
1233
+                foreach ( $options as $key => $val ) {
1234
+                    $options[ $key ]['name'] = $key;
1235
+                }
1236
+            }
1237
+
1238
+            return $options;
1239
+        }
1240
+
1241
+        /**
1242
+         * Register the parent shortcode.
1243
+         *
1244
+         * @since 1.0.0
1245
+         */
1246
+        public function register_shortcode() {
1247
+            add_shortcode( $this->base_id, array( $this, 'shortcode_output' ) );
1248
+            add_action( 'wp_ajax_super_duper_output_shortcode', array( __CLASS__, 'render_shortcode' ) );
1249
+        }
1250
+
1251
+        /**
1252
+         * Render the shortcode via ajax so we can return it to Gutenberg.
1253
+         *
1254
+         * @since 1.0.0
1255
+         */
1256
+        public static function render_shortcode() {
1257
+
1258
+            check_ajax_referer( 'super_duper_output_shortcode', '_ajax_nonce', true );
1259
+            if ( ! current_user_can( 'manage_options' ) ) {
1260
+                wp_die();
1261
+            }
1262
+
1263
+            // we might need the $post value here so lets set it.
1264
+            if ( isset( $_POST['post_id'] ) && $_POST['post_id'] ) {
1265
+                $post_obj = get_post( absint( $_POST['post_id'] ) );
1266
+                if ( ! empty( $post_obj ) && empty( $post ) ) {
1267
+                    global $post;
1268
+                    $post = $post_obj;
1269
+                }
1270
+            }
1271
+
1272
+            if ( isset( $_POST['shortcode'] ) && $_POST['shortcode'] ) {
1273
+                $shortcode_name   = sanitize_title_with_dashes( $_POST['shortcode'] );
1274
+                $attributes_array = isset( $_POST['attributes'] ) && $_POST['attributes'] ? $_POST['attributes'] : array();
1275
+                $attributes       = '';
1276
+                if ( ! empty( $attributes_array ) ) {
1277
+                    foreach ( $attributes_array as $key => $value ) {
1278
+                        $attributes .= " " . sanitize_title_with_dashes( $key ) . "='" . wp_slash( $value ) . "' ";
1279
+                    }
1280
+                }
1281
+
1282
+                $shortcode = "[" . $shortcode_name . " " . $attributes . "]";
1283
+
1284
+                echo do_shortcode( $shortcode );
1285
+
1286
+            }
1287
+            wp_die();
1288
+        }
1289
+
1290
+        /**
1291
+         * Output the shortcode.
1292
+         *
1293
+         * @param array $args
1294
+         * @param string $content
1295
+         *
1296
+         * @return string
1297
+         */
1298
+        public function shortcode_output( $args = array(), $content = '' ) {
1299
+            $args = self::argument_values( $args );
1300
+
1301
+            // add extra argument so we know its a output to gutenberg
1302
+            //$args
1303
+            $args = $this->string_to_bool( $args );
1304
+
1305
+            // if we have a enclosed shortcode we add it to the special `html` argument
1306
+            if(!empty($content)){
1307
+                $args['html'] = $content;
1308
+            }
1309
+
1310
+            $class = isset( $this->options['widget_ops']['classname'] ) ? esc_attr( $this->options['widget_ops']['classname'] ) : '';
1311
+
1312
+            $class = apply_filters( 'wp_super_duper_div_classname', $class, $args, $this );
1313
+            $class = apply_filters( 'wp_super_duper_div_classname_' . $this->base_id, $class, $args, $this );
1314
+
1315
+            $attrs = apply_filters( 'wp_super_duper_div_attrs', '', $args, $this );
1316
+            $attrs = apply_filters( 'wp_super_duper_div_attrs_' . $this->base_id, '', $args, $this ); //@todo this does not seem right @kiran?
1317
+
1318
+            $shortcode_args = array();
1319
+            $output         = '';
1320
+            $no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1321
+            if( isset( $args['no_wrap'] ) && $args['no_wrap'] ){ $no_wrap = true; }
1322
+            $main_content   = $this->output( $args, $shortcode_args, $content );
1323
+            if ( $main_content && ! $no_wrap ) {
1324
+                // wrap the shortcode in a div with the same class as the widget
1325
+                $output .= '<div class="' . $class . '" ' . $attrs . '>';
1326
+                if ( ! empty( $args['title'] ) ) {
1327
+                    // if its a shortcode and there is a title try to grab the title wrappers
1328
+                    $shortcode_args = array( 'before_title' => '', 'after_title' => '' );
1329
+                    if ( empty( $instance ) ) {
1330
+                        global $wp_registered_sidebars;
1331
+                        if ( ! empty( $wp_registered_sidebars ) ) {
1332
+                            foreach ( $wp_registered_sidebars as $sidebar ) {
1333
+                                if ( ! empty( $sidebar['before_title'] ) ) {
1334
+                                    $shortcode_args['before_title'] = $sidebar['before_title'];
1335
+                                    $shortcode_args['after_title']  = $sidebar['after_title'];
1336
+                                    break;
1337
+                                }
1338
+                            }
1339
+                        }
1340
+                    }
1341
+                    $output .= $this->output_title( $shortcode_args, $args );
1342
+                }
1343
+                $output .= $main_content;
1344
+                $output .= '</div>';
1345
+            } elseif ( $main_content && $no_wrap ) {
1346
+                $output .= $main_content;
1347
+            }
1348
+
1349
+            // if preview show a placeholder if empty
1350
+            if ( $this->is_preview() && $output == '' ) {
1351
+                $output = $this->preview_placeholder_text( "[{" . $this->base_id . "}]" );
1352
+            }
1353
+
1354
+            return apply_filters( 'wp_super_duper_widget_output', $output, $args, $shortcode_args, $this );
1355
+        }
1356
+
1357
+        /**
1358
+         * Placeholder text to show if output is empty and we are on a preview/builder page.
1359
+         *
1360
+         * @param string $name
1361
+         *
1362
+         * @return string
1363
+         */
1364
+        public function preview_placeholder_text( $name = '' ) {
1365
+            return "<div style='background:#0185ba33;padding: 10px;border: 4px #ccc dashed;'>" . sprintf( __( 'Placeholder for: %s' ), $name ) . "</div>";
1366
+        }
1367
+
1368
+        /**
1369
+         * Sometimes booleans values can be turned to strings, so we fix that.
1370
+         *
1371
+         * @param $options
1372
+         *
1373
+         * @return mixed
1374
+         */
1375
+        public function string_to_bool( $options ) {
1376
+            // convert bool strings to booleans
1377
+            foreach ( $options as $key => $val ) {
1378
+                if ( $val == 'false' ) {
1379
+                    $options[ $key ] = false;
1380
+                } elseif ( $val == 'true' ) {
1381
+                    $options[ $key ] = true;
1382
+                }
1383
+            }
1384
+
1385
+            return $options;
1386
+        }
1387
+
1388
+        /**
1389
+         * Get the argument values that are also filterable.
1390
+         *
1391
+         * @param $instance
1392
+         *
1393
+         * @since 1.0.12 Don't set checkbox default value if the value is empty.
1394
+         *
1395
+         * @return array
1396
+         */
1397
+        public function argument_values( $instance ) {
1398
+            $argument_values = array();
1399
+
1400
+            // set widget instance
1401
+            $this->instance = $instance;
1402
+
1403
+            if ( empty( $this->arguments ) ) {
1404
+                $this->arguments = $this->get_arguments();
1405
+            }
1406
+
1407
+            if ( ! empty( $this->arguments ) ) {
1408
+                foreach ( $this->arguments as $key => $args ) {
1409
+                    // set the input name from the key
1410
+                    $args['name'] = $key;
1411
+                    //
1412
+                    $argument_values[ $key ] = isset( $instance[ $key ] ) ? $instance[ $key ] : '';
1413
+                    if($args['type']=='checkbox' && $argument_values[ $key ] == ''){
1414
+                        // don't set default for an empty checkbox
1415
+                    }
1416
+                    elseif ( $argument_values[ $key ] == '' && isset( $args['default'] ) ) {
1417
+                        $argument_values[ $key ] = $args['default'];
1418
+                    }
1419
+                }
1420
+            }
1421
+
1422
+            return $argument_values;
1423
+        }
1424
+
1425
+        /**
1426
+         * Set arguments in super duper.
1427
+         *
1428
+         * @since 1.0.0
1429
+         *
1430
+         * @return array Set arguments.
1431
+         */
1432
+        public function set_arguments() {
1433
+            return $this->arguments;
1434
+        }
1435
+
1436
+        /**
1437
+         * Get arguments in super duper.
1438
+         *
1439
+         * @since 1.0.0
1440
+         *
1441
+         * @return array Get arguments.
1442
+         */
1443
+        public function get_arguments() {
1444
+            if ( empty( $this->arguments ) ) {
1445
+                $this->arguments = $this->set_arguments();
1446
+            }
1447
+
1448
+            $this->arguments = apply_filters( 'wp_super_duper_arguments', $this->arguments, $this->options, $this->instance );
1449
+            $this->arguments = $this->add_name_from_key( $this->arguments, true );
1450
+
1451
+            return $this->arguments;
1452
+        }
1453
+
1454
+        /**
1455
+         * This is the main output class for all 3 items, widget, shortcode and block, it is extended in the calling class.
1456
+         *
1457
+         * @param array $args
1458
+         * @param array $widget_args
1459
+         * @param string $content
1460
+         */
1461
+        public function output( $args = array(), $widget_args = array(), $content = '' ) {
1462
+
1463
+        }
1464
+
1465
+        /**
1466
+         * Add the dynamic block code inline when the wp-block in enqueued.
1467
+         */
1468
+        public function register_block() {
1469
+            wp_add_inline_script( 'wp-blocks', $this->block() );
1470
+            if ( class_exists( 'SiteOrigin_Panels' ) ) {
1471
+
1472
+                wp_add_inline_script( 'wp-blocks', $this->siteorigin_js() );
1473
+
1474
+            }
1475
+        }
1476
+
1477
+        /**
1478
+         * Check if we need to show advanced options.
1479
+         *
1480
+         * @return bool
1481
+         */
1482
+        public function block_show_advanced() {
1483
+
1484
+            $show      = false;
1485
+            $arguments = $this->arguments;
1486
+
1487
+            if ( empty( $arguments ) ) {
1488
+                $arguments = $this->get_arguments();
1489
+            }
1490
+
1491
+            if ( ! empty( $arguments ) ) {
1492
+                foreach ( $arguments as $argument ) {
1493
+                    if ( isset( $argument['advanced'] ) && $argument['advanced'] ) {
1494
+                        $show = true;
1495
+                        break; // no need to continue if we know we have it
1496
+                    }
1497
+                }
1498
+            }
1499
+
1500
+            return $show;
1501
+        }
1502
+
1503
+        /**
1504
+         * Get the url path to the current folder.
1505
+         *
1506
+         * @return string
1507
+         */
1508
+        public function get_url() {
1509
+
1510
+            $url = $this->url;
1511
+
1512
+            if(!$url){
1513
+                // check if we are inside a plugin
1514
+                $file_dir = str_replace("/includes","", dirname( __FILE__ ));
1515
+
1516
+                $dir_parts = explode("/wp-content/",$file_dir);
1517
+                $url_parts = explode("/wp-content/",plugins_url());
1518
+
1519
+                if(!empty($url_parts[0]) && !empty($dir_parts[1])){
1520
+                    $url = trailingslashit( $url_parts[0]."/wp-content/".$dir_parts[1] );
1521
+                    $this->url = $url;
1522
+                }
1523
+            }
1524
+
1525
+
1526
+            return $url;
1527
+        }
1528
+
1529
+        /**
1530
+         * Generate the block icon.
1531
+         *
1532
+         * Enables the use of Font Awesome icons.
1533
+         *
1534
+         * @note xlink:href is actually deprecated but href is not supported by all so we use both.
1535
+         * @param $icon
1536
+         * @since 1.1.0
1537
+         * @return string
1538
+         */
1539
+        public function get_block_icon($icon){
1540
+
1541
+            // check if we have a Font Awesome icon
1542
+            $fa_type = '';
1543
+            if(substr( $icon, 0, 7 ) === "fas fa-"){
1544
+                $fa_type = 'solid';
1545
+            }elseif(substr( $icon, 0, 7 ) === "far fa-"){
1546
+                $fa_type = 'regular';
1547
+            }elseif(substr( $icon, 0, 7 ) === "fab fa-"){
1548
+                $fa_type = 'brands';
1549
+            }else{
1550
+                $icon = "'".$icon."'";
1551
+            }
1552
+
1553
+            // set the icon if we found one
1554
+            if($fa_type){
1555
+                $fa_icon = str_replace(array("fas fa-","far fa-","fab fa-"),"",$icon);
1556
+                $icon  = "el('svg',{width: 20, height: 20, viewBox: '0 0 20 20'},el('use', {'xlink:href': '".$this->get_url()."icons/".$fa_type.".svg#".$fa_icon."','href': '".$this->get_url()."icons/".$fa_type.".svg#".$fa_icon."'}))";
1557
+            }
1558
+
1559
+            return $icon;
1560
+        }
1561
+
1562
+        public function group_arguments($arguments){
1563 1563
 //			echo '###';print_r($arguments);
1564
-			if(!empty($arguments)){
1565
-				$temp_arguments = array();
1566
-				$general = __("General");
1567
-				$add_sections = false;
1568
-				foreach($arguments as $key => $args){
1569
-					if(isset($args['group'])){
1570
-						$temp_arguments[$args['group']][$key] = $args;
1571
-						$add_sections = true;
1572
-					}else{
1573
-						$temp_arguments[$general][$key] = $args;
1574
-					}
1575
-				}
1576
-
1577
-				// only add sections if more than one
1578
-				if($add_sections){
1579
-					$arguments = $temp_arguments;
1580
-				}
1581
-			}
1564
+            if(!empty($arguments)){
1565
+                $temp_arguments = array();
1566
+                $general = __("General");
1567
+                $add_sections = false;
1568
+                foreach($arguments as $key => $args){
1569
+                    if(isset($args['group'])){
1570
+                        $temp_arguments[$args['group']][$key] = $args;
1571
+                        $add_sections = true;
1572
+                    }else{
1573
+                        $temp_arguments[$general][$key] = $args;
1574
+                    }
1575
+                }
1576
+
1577
+                // only add sections if more than one
1578
+                if($add_sections){
1579
+                    $arguments = $temp_arguments;
1580
+                }
1581
+            }
1582 1582
 //			echo '###';print_r($arguments);
1583
-			return $arguments;
1584
-		}
1585
-
1586
-
1587
-		/**
1588
-		 * Output the JS for building the dynamic Guntenberg block.
1589
-		 *
1590
-		 * @since 1.0.4 Added block_wrap property which will set the block wrapping output element ie: div, span, p or empty for no wrap.
1591
-		 * @since 1.0.9 Save numbers as numbers and not strings.
1592
-		 * @since 1.1.0 Font Awesome classes can be used for icons.
1593
-		 * @return mixed
1594
-		 */
1595
-		public function block() {
1596
-			ob_start();
1597
-			?>
1583
+            return $arguments;
1584
+        }
1585
+
1586
+
1587
+        /**
1588
+         * Output the JS for building the dynamic Guntenberg block.
1589
+         *
1590
+         * @since 1.0.4 Added block_wrap property which will set the block wrapping output element ie: div, span, p or empty for no wrap.
1591
+         * @since 1.0.9 Save numbers as numbers and not strings.
1592
+         * @since 1.1.0 Font Awesome classes can be used for icons.
1593
+         * @return mixed
1594
+         */
1595
+        public function block() {
1596
+            ob_start();
1597
+            ?>
1598 1598
 			<script>
1599 1599
 				/**
1600 1600
 				 * BLOCK: Basic
@@ -1633,93 +1633,93 @@  discard block
 block discarded – undo
1633 1633
 						icon: <?php echo $this->get_block_icon($this->options['block-icon']);?>,//'<?php echo isset( $this->options['block-icon'] ) ? esc_attr( $this->options['block-icon'] ) : 'shield-alt';?>', // Block icon from Dashicons → https://developer.wordpress.org/resource/dashicons/.
1634 1634
 						supports: {
1635 1635
 							<?php
1636
-							if(isset($this->options['block-supports'])){
1637
-								echo $this->array_to_attributes( $this->options['block-supports'] );
1638
-							}
1639
-							?>
1636
+                            if(isset($this->options['block-supports'])){
1637
+                                echo $this->array_to_attributes( $this->options['block-supports'] );
1638
+                            }
1639
+                            ?>
1640 1640
 						},
1641 1641
 						category: '<?php echo isset( $this->options['block-category'] ) ? esc_attr( $this->options['block-category'] ) : 'common';?>', // Block category — Group blocks together based on common traits E.g. common, formatting, layout widgets, embed.
1642 1642
 						<?php if ( isset( $this->options['block-keywords'] ) ) {
1643
-						echo "keywords : " . $this->options['block-keywords'] . ",";
1644
-					}?>
1643
+                        echo "keywords : " . $this->options['block-keywords'] . ",";
1644
+                    }?>
1645 1645
 
1646 1646
 						<?php
1647 1647
 
1648
-						// maybe set no_wrap
1649
-						$no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1650
-						if( isset( $this->arguments['no_wrap'] ) && $this->arguments['no_wrap'] ){ $no_wrap = true; }
1651
-						if( $no_wrap ){ $this->options['block-wrap'] = ''; }
1648
+                        // maybe set no_wrap
1649
+                        $no_wrap        = isset( $this->options['no_wrap'] ) && $this->options['no_wrap'] ? true : false;
1650
+                        if( isset( $this->arguments['no_wrap'] ) && $this->arguments['no_wrap'] ){ $no_wrap = true; }
1651
+                        if( $no_wrap ){ $this->options['block-wrap'] = ''; }
1652 1652
 
1653
-						$show_advanced = $this->block_show_advanced();
1653
+                        $show_advanced = $this->block_show_advanced();
1654 1654
 
1655
-						$show_alignment = false;
1656
-						// align feature
1657
-						/*echo "supports: {";
1655
+                        $show_alignment = false;
1656
+                        // align feature
1657
+                        /*echo "supports: {";
1658 1658
 						echo "	align: true,";
1659 1659
 						echo "  html: false";
1660 1660
 						echo "},";*/
1661 1661
 
1662
-						if ( ! empty( $this->arguments ) ) {
1663
-							echo "attributes : {";
1664
-
1665
-							if ( $show_advanced ) {
1666
-								echo "show_advanced: {";
1667
-								echo "	type: 'boolean',";
1668
-								echo "  default: false,";
1669
-								echo "},";
1670
-							}
1671
-
1672
-							// block wrap element
1673
-							if ( !empty( $this->options['block-wrap'] ) ) { //@todo we should validate this?
1674
-								echo "block_wrap: {";
1675
-								echo "	type: 'string',";
1676
-								echo "  default: '" . esc_attr( $this->options['block-wrap'] ) . "',";
1677
-								echo "},";
1678
-							}
1679
-
1680
-							foreach ( $this->arguments as $key => $args ) {
1681
-
1682
-								// set if we should show alignment
1683
-								if ( $key == 'alignment' ) {
1684
-									$show_alignment = true;
1685
-								}
1686
-
1687
-								$extra = '';
1688
-
1689
-								if ( $args['type'] == 'checkbox' ) {
1690
-									$type    = 'boolean';
1691
-									$default = isset( $args['default'] ) && $args['default'] ? 'true' : 'false';
1692
-								} elseif ( $args['type'] == 'number' ) {
1693
-									$type    = 'number';
1694
-									$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1695
-								} elseif ( $args['type'] == 'select' && ! empty( $args['multiple'] ) ) {
1696
-									$type = 'array';
1697
-									if ( is_array( $args['default'] ) ) {
1698
-										$default = isset( $args['default'] ) ? "['" . implode( "','", $args['default'] ) . "']" : "[]";
1699
-									} else {
1700
-										$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1701
-									}
1702
-								} elseif ( $args['type'] == 'multiselect' ) {
1703
-									$type    = 'array';
1704
-									$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1705
-								} else {
1706
-									$type    = 'string';
1707
-									$default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1708
-								}
1709
-								echo $key . " : {";
1710
-								echo "type : '$type',";
1711
-								echo "default : $default,";
1712
-								echo "},";
1713
-							}
1714
-
1715
-							echo "content : {type : 'string',default: 'Please select the attributes in the block settings'},";
1716
-							echo "className: { type: 'string', default: '' },";
1717
-
1718
-							echo "},";
1719
-
1720
-						}
1721
-
1722
-						?>
1662
+                        if ( ! empty( $this->arguments ) ) {
1663
+                            echo "attributes : {";
1664
+
1665
+                            if ( $show_advanced ) {
1666
+                                echo "show_advanced: {";
1667
+                                echo "	type: 'boolean',";
1668
+                                echo "  default: false,";
1669
+                                echo "},";
1670
+                            }
1671
+
1672
+                            // block wrap element
1673
+                            if ( !empty( $this->options['block-wrap'] ) ) { //@todo we should validate this?
1674
+                                echo "block_wrap: {";
1675
+                                echo "	type: 'string',";
1676
+                                echo "  default: '" . esc_attr( $this->options['block-wrap'] ) . "',";
1677
+                                echo "},";
1678
+                            }
1679
+
1680
+                            foreach ( $this->arguments as $key => $args ) {
1681
+
1682
+                                // set if we should show alignment
1683
+                                if ( $key == 'alignment' ) {
1684
+                                    $show_alignment = true;
1685
+                                }
1686
+
1687
+                                $extra = '';
1688
+
1689
+                                if ( $args['type'] == 'checkbox' ) {
1690
+                                    $type    = 'boolean';
1691
+                                    $default = isset( $args['default'] ) && $args['default'] ? 'true' : 'false';
1692
+                                } elseif ( $args['type'] == 'number' ) {
1693
+                                    $type    = 'number';
1694
+                                    $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1695
+                                } elseif ( $args['type'] == 'select' && ! empty( $args['multiple'] ) ) {
1696
+                                    $type = 'array';
1697
+                                    if ( is_array( $args['default'] ) ) {
1698
+                                        $default = isset( $args['default'] ) ? "['" . implode( "','", $args['default'] ) . "']" : "[]";
1699
+                                    } else {
1700
+                                        $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1701
+                                    }
1702
+                                } elseif ( $args['type'] == 'multiselect' ) {
1703
+                                    $type    = 'array';
1704
+                                    $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1705
+                                } else {
1706
+                                    $type    = 'string';
1707
+                                    $default = isset( $args['default'] ) ? "'" . $args['default'] . "'" : "''";
1708
+                                }
1709
+                                echo $key . " : {";
1710
+                                echo "type : '$type',";
1711
+                                echo "default : $default,";
1712
+                                echo "},";
1713
+                            }
1714
+
1715
+                            echo "content : {type : 'string',default: 'Please select the attributes in the block settings'},";
1716
+                            echo "className: { type: 'string', default: '' },";
1717
+
1718
+                            echo "},";
1719
+
1720
+                        }
1721
+
1722
+                        ?>
1723 1723
 
1724 1724
 						// The "edit" property must be a valid function.
1725 1725
 						edit: function (props) {
@@ -1738,8 +1738,8 @@  discard block
 block discarded – undo
1738 1738
 										'shortcode': '<?php echo $this->options['base_id'];?>',
1739 1739
 										'attributes': props.attributes,
1740 1740
 										'post_id': <?php global $post; if ( isset( $post->ID ) ) {
1741
-										echo $post->ID;
1742
-									}?>,
1741
+                                        echo $post->ID;
1742
+                                    }?>,
1743 1743
 										'_ajax_nonce': '<?php echo wp_create_nonce( 'super_duper_output_shortcode' );?>'
1744 1744
 									};
1745 1745
 
@@ -1786,10 +1786,10 @@  discard block
 block discarded – undo
1786 1786
 
1787 1787
 									<?php
1788 1788
 
1789
-									if(! empty( $this->arguments )){
1789
+                                    if(! empty( $this->arguments )){
1790 1790
 
1791
-									if ( $show_advanced ) {
1792
-									?>
1791
+                                    if ( $show_advanced ) {
1792
+                                    ?>
1793 1793
 									el(
1794 1794
 										wp.components.ToggleControl,
1795 1795
 										{
@@ -1802,61 +1802,61 @@  discard block
 block discarded – undo
1802 1802
 									),
1803 1803
 									<?php
1804 1804
 
1805
-									}
1805
+                                    }
1806 1806
 
1807
-									$arguments = $this->group_arguments($this->arguments);
1807
+                                    $arguments = $this->group_arguments($this->arguments);
1808 1808
 
1809
-									// Do we have sections?
1810
-									$has_sections = $arguments == $this->arguments ? false : true;
1809
+                                    // Do we have sections?
1810
+                                    $has_sections = $arguments == $this->arguments ? false : true;
1811 1811
 
1812 1812
 
1813
-									if($has_sections){
1814
-									$panel_count = 0;
1815
-									foreach($arguments as $key => $args){
1816
-									?>
1813
+                                    if($has_sections){
1814
+                                    $panel_count = 0;
1815
+                                    foreach($arguments as $key => $args){
1816
+                                    ?>
1817 1817
 									el(wp.components.PanelBody, {
1818 1818
 											title: '<?php esc_attr_e($key); ?>',
1819 1819
 											initialOpen: <?php if($panel_count){echo "false";}else{echo "true";}?>
1820 1820
 										},
1821 1821
 										<?php
1822 1822
 
1823
-										foreach($args as $k => $a){
1824
-											$this->build_block_arguments($k, $a);
1825
-										}
1826
-										?>
1823
+                                        foreach($args as $k => $a){
1824
+                                            $this->build_block_arguments($k, $a);
1825
+                                        }
1826
+                                        ?>
1827 1827
 									),
1828 1828
 									<?php
1829
-									$panel_count++;
1829
+                                    $panel_count++;
1830 1830
 
1831
-									}
1832
-									}else{
1833
-										foreach($this->arguments as $key => $args){
1834
-											$this->build_block_arguments($key, $args);
1835
-										}
1836
-									}
1831
+                                    }
1832
+                                    }else{
1833
+                                        foreach($this->arguments as $key => $args){
1834
+                                            $this->build_block_arguments($key, $args);
1835
+                                        }
1836
+                                    }
1837 1837
 
1838 1838
 
1839 1839
 
1840
-									}
1841
-									?>
1840
+                                    }
1841
+                                    ?>
1842 1842
 
1843 1843
 								),
1844 1844
 
1845 1845
 								<?php
1846
-								// If the user sets block-output array then build it
1847
-								if ( ! empty( $this->options['block-output'] ) ) {
1848
-								$this->block_element( $this->options['block-output'] );
1849
-							}else{
1850
-								// if no block-output is set then we try and get the shortcode html output via ajax.
1851
-								?>
1846
+                                // If the user sets block-output array then build it
1847
+                                if ( ! empty( $this->options['block-output'] ) ) {
1848
+                                $this->block_element( $this->options['block-output'] );
1849
+                            }else{
1850
+                                // if no block-output is set then we try and get the shortcode html output via ajax.
1851
+                                ?>
1852 1852
 								el('div', {
1853 1853
 									dangerouslySetInnerHTML: {__html: onChangeContent()},
1854 1854
 									className: props.className,
1855 1855
 									style: {'min-height': '30px'}
1856 1856
 								})
1857 1857
 								<?php
1858
-								}
1859
-								?>
1858
+                                }
1859
+                                ?>
1860 1860
 							]; // end return
1861 1861
 						},
1862 1862
 
@@ -1874,10 +1874,10 @@  discard block
 block discarded – undo
1874 1874
 							$html = '';
1875 1875
 							<?php
1876 1876
 
1877
-							if(! empty( $this->arguments )){
1877
+                            if(! empty( $this->arguments )){
1878 1878
 
1879
-							foreach($this->arguments as $key => $args){
1880
-							?>
1879
+                            foreach($this->arguments as $key => $args){
1880
+                            ?>
1881 1881
 							if (attr.hasOwnProperty("<?php echo esc_attr( $key );?>")) {
1882 1882
 								if('<?php echo esc_attr( $key );?>' == 'html'){
1883 1883
 									$html = attr.<?php echo esc_attr( $key );?>;
@@ -1886,10 +1886,10 @@  discard block
 block discarded – undo
1886 1886
 								}
1887 1887
 							}
1888 1888
 							<?php
1889
-							}
1890
-							}
1889
+                            }
1890
+                            }
1891 1891
 
1892
-							?>
1892
+                            ?>
1893 1893
 							content += "]";
1894 1894
 							
1895 1895
 							// if has html element
@@ -1912,20 +1912,20 @@  discard block
 block discarded – undo
1912 1912
 							}
1913 1913
 
1914 1914
 							<?php
1915
-							if(isset( $this->options['block-wrap'] ) && $this->options['block-wrap'] == ''){
1916
-							?>
1915
+                            if(isset( $this->options['block-wrap'] ) && $this->options['block-wrap'] == ''){
1916
+                            ?>
1917 1917
 							return content;
1918 1918
 							<?php
1919
-							}else{
1920
-							?>
1919
+                            }else{
1920
+                            ?>
1921 1921
 							var block_wrap = 'div';
1922 1922
 							if (attr.hasOwnProperty("block_wrap")) {
1923 1923
 								block_wrap = attr.block_wrap;
1924 1924
 							}
1925 1925
 							return el(block_wrap, {dangerouslySetInnerHTML: {__html: content}, className: align});
1926 1926
 							<?php
1927
-							}
1928
-							?>
1927
+                            }
1928
+                            ?>
1929 1929
 
1930 1930
 
1931 1931
 						}
@@ -1933,89 +1933,89 @@  discard block
 block discarded – undo
1933 1933
 				})();
1934 1934
 			</script>
1935 1935
 			<?php
1936
-			$output = ob_get_clean();
1936
+            $output = ob_get_clean();
1937 1937
 
1938
-			/*
1938
+            /*
1939 1939
 			 * We only add the <script> tags for code highlighting, so we strip them from the output.
1940 1940
 			 */
1941 1941
 
1942
-			return str_replace( array(
1943
-				'<script>',
1944
-				'</script>'
1945
-			), '', $output );
1946
-		}
1947
-
1948
-		public function build_block_arguments($key,$args){
1949
-			$custom_attributes = ! empty( $args['custom_attributes'] ) ? $this->array_to_attributes( $args['custom_attributes'] ) : '';
1950
-			$options = '';
1951
-			$extra = '';
1952
-			$require = '';
1953
-
1954
-			// `content` is a protected and special argument
1955
-			if($key == 'content'){return;}
1956
-
1957
-			$onchange = "props.setAttributes({ $key: $key } )";
1958
-			$value = "props.attributes.$key";
1959
-			$text_type = array( 'text', 'password', 'number', 'email', 'tel', 'url', 'color' );
1960
-			if ( in_array( $args['type'], $text_type ) ) {
1961
-				$type = 'TextControl';
1962
-				// Save numbers as numbers and not strings
1963
-				if ( $args['type'] == 'number' ) {
1964
-					$onchange = "props.setAttributes({ $key: Number($key) } )";
1965
-				}
1966
-			}
1967
-			//									elseif ( $args['type'] == 'color' ) { //@todo ColorPicker labels are not shown yet, we use html5 color input for now https://github.com/WordPress/gutenberg/issues/14378
1968
-			//										$type = 'ColorPicker';
1969
-			//									}
1970
-			elseif ( $args['type'] == 'checkbox' ) {
1971
-				$type = 'CheckboxControl';
1972
-				$extra .= "checked: props.attributes.$key,";
1973
-				$onchange = "props.setAttributes({ $key: ! props.attributes.$key } )";
1974
-			}elseif ( $args['type'] == 'textarea' ) {
1975
-				$type = 'TextareaControl';
1976
-			} elseif ( $args['type'] == 'select' || $args['type'] == 'multiselect' ) {
1977
-				$type = 'SelectControl';
1978
-				if ( ! empty( $args['options'] ) ) {
1979
-					$options .= "options  : [";
1980
-					foreach ( $args['options'] as $option_val => $option_label ) {
1981
-						$options .= "{ value : '" . esc_attr( $option_val ) . "',     label : '" . esc_attr( $option_label ) . "'     },";
1982
-					}
1983
-					$options .= "],";
1984
-				}
1985
-				if ( isset( $args['multiple'] ) && $args['multiple'] ) { //@todo multiselect does not work at the moment: https://github.com/WordPress/gutenberg/issues/5550
1986
-					$extra .= ' multiple: true, ';
1987
-					//$onchange = "props.setAttributes({ $key: ['edit'] } )";
1988
-					//$value = "['edit', 'delete']";
1989
-				}
1990
-			} elseif ( $args['type'] == 'alignment' ) {
1991
-				$type = 'AlignmentToolbar'; // @todo this does not seem to work but cant find a example
1992
-			} else {
1993
-				return;// if we have not implemented the control then don't break the JS.
1994
-			}
1995
-
1996
-			// add show only if advanced
1997
-			if ( ! empty( $args['advanced'] ) ) {
1998
-				echo "props.attributes.show_advanced && ";
1999
-			}
2000
-			// add setting require if defined
2001
-			if ( ! empty( $args['element_require'] ) ) {
2002
-				echo $this->block_props_replace( $args['element_require'], true ) . " && ";
2003
-			}
2004
-			?>
1942
+            return str_replace( array(
1943
+                '<script>',
1944
+                '</script>'
1945
+            ), '', $output );
1946
+        }
1947
+
1948
+        public function build_block_arguments($key,$args){
1949
+            $custom_attributes = ! empty( $args['custom_attributes'] ) ? $this->array_to_attributes( $args['custom_attributes'] ) : '';
1950
+            $options = '';
1951
+            $extra = '';
1952
+            $require = '';
1953
+
1954
+            // `content` is a protected and special argument
1955
+            if($key == 'content'){return;}
1956
+
1957
+            $onchange = "props.setAttributes({ $key: $key } )";
1958
+            $value = "props.attributes.$key";
1959
+            $text_type = array( 'text', 'password', 'number', 'email', 'tel', 'url', 'color' );
1960
+            if ( in_array( $args['type'], $text_type ) ) {
1961
+                $type = 'TextControl';
1962
+                // Save numbers as numbers and not strings
1963
+                if ( $args['type'] == 'number' ) {
1964
+                    $onchange = "props.setAttributes({ $key: Number($key) } )";
1965
+                }
1966
+            }
1967
+            //									elseif ( $args['type'] == 'color' ) { //@todo ColorPicker labels are not shown yet, we use html5 color input for now https://github.com/WordPress/gutenberg/issues/14378
1968
+            //										$type = 'ColorPicker';
1969
+            //									}
1970
+            elseif ( $args['type'] == 'checkbox' ) {
1971
+                $type = 'CheckboxControl';
1972
+                $extra .= "checked: props.attributes.$key,";
1973
+                $onchange = "props.setAttributes({ $key: ! props.attributes.$key } )";
1974
+            }elseif ( $args['type'] == 'textarea' ) {
1975
+                $type = 'TextareaControl';
1976
+            } elseif ( $args['type'] == 'select' || $args['type'] == 'multiselect' ) {
1977
+                $type = 'SelectControl';
1978
+                if ( ! empty( $args['options'] ) ) {
1979
+                    $options .= "options  : [";
1980
+                    foreach ( $args['options'] as $option_val => $option_label ) {
1981
+                        $options .= "{ value : '" . esc_attr( $option_val ) . "',     label : '" . esc_attr( $option_label ) . "'     },";
1982
+                    }
1983
+                    $options .= "],";
1984
+                }
1985
+                if ( isset( $args['multiple'] ) && $args['multiple'] ) { //@todo multiselect does not work at the moment: https://github.com/WordPress/gutenberg/issues/5550
1986
+                    $extra .= ' multiple: true, ';
1987
+                    //$onchange = "props.setAttributes({ $key: ['edit'] } )";
1988
+                    //$value = "['edit', 'delete']";
1989
+                }
1990
+            } elseif ( $args['type'] == 'alignment' ) {
1991
+                $type = 'AlignmentToolbar'; // @todo this does not seem to work but cant find a example
1992
+            } else {
1993
+                return;// if we have not implemented the control then don't break the JS.
1994
+            }
1995
+
1996
+            // add show only if advanced
1997
+            if ( ! empty( $args['advanced'] ) ) {
1998
+                echo "props.attributes.show_advanced && ";
1999
+            }
2000
+            // add setting require if defined
2001
+            if ( ! empty( $args['element_require'] ) ) {
2002
+                echo $this->block_props_replace( $args['element_require'], true ) . " && ";
2003
+            }
2004
+            ?>
2005 2005
 			el(
2006 2006
 			wp.components.<?php echo esc_attr( $type );?>,
2007 2007
 			{
2008 2008
 			label: '<?php echo esc_attr( $args['title'] );?>',
2009 2009
 			help: '<?php if ( isset( $args['desc'] ) ) {
2010
-				echo esc_attr( $args['desc'] );
2011
-			}?>',
2010
+                echo esc_attr( $args['desc'] );
2011
+            }?>',
2012 2012
 			value: <?php echo $value;?>,
2013 2013
 			<?php if ( $type == 'TextControl' && $args['type'] != 'text' ) {
2014
-				echo "type: '" . esc_attr( $args['type'] ) . "',";
2015
-			}?>
2014
+                echo "type: '" . esc_attr( $args['type'] ) . "',";
2015
+            }?>
2016 2016
 			<?php if ( ! empty( $args['placeholder'] ) ) {
2017
-				echo "placeholder: '" . esc_attr( $args['placeholder'] ) . "',";
2018
-			}?>
2017
+                echo "placeholder: '" . esc_attr( $args['placeholder'] ) . "',";
2018
+            }?>
2019 2019
 			<?php echo $options;?>
2020 2020
 			<?php echo $extra;?>
2021 2021
 			<?php echo $custom_attributes;?>
@@ -2025,508 +2025,508 @@  discard block
 block discarded – undo
2025 2025
 			}
2026 2026
 			),
2027 2027
 			<?php
2028
-		}
2029
-
2030
-		/**
2031
-		 * Convert an array of attributes to block string.
2032
-		 *
2033
-		 * @todo there is prob a faster way to do this, also we could add some validation here.
2034
-		 *
2035
-		 * @param $custom_attributes
2036
-		 *
2037
-		 * @return string
2038
-		 */
2039
-		public function array_to_attributes( $custom_attributes, $html = false ) {
2040
-			$attributes = '';
2041
-			if ( ! empty( $custom_attributes ) ) {
2042
-
2043
-				if ( $html ) {
2044
-					foreach ( $custom_attributes as $key => $val ) {
2045
-						$attributes .= " $key='$val' ";
2046
-					}
2047
-				} else {
2048
-					foreach ( $custom_attributes as $key => $val ) {
2049
-						$attributes .= "'$key': '$val',";
2050
-					}
2051
-				}
2052
-			}
2053
-
2054
-			return $attributes;
2055
-		}
2056
-
2057
-		/**
2058
-		 * A self looping function to create the output for JS block elements.
2059
-		 *
2060
-		 * This is what is output in the WP Editor visual view.
2061
-		 *
2062
-		 * @param $args
2063
-		 */
2064
-		public function block_element( $args ) {
2065
-
2066
-
2067
-			if ( ! empty( $args ) ) {
2068
-				foreach ( $args as $element => $new_args ) {
2069
-
2070
-					if ( is_array( $new_args ) ) { // its an element
2071
-
2072
-
2073
-						if ( isset( $new_args['element'] ) ) {
2074
-
2075
-							if ( isset( $new_args['element_require'] ) ) {
2076
-								echo str_replace( array(
2077
-										"'+",
2078
-										"+'"
2079
-									), '', $this->block_props_replace( $new_args['element_require'] ) ) . " &&  ";
2080
-								unset( $new_args['element_require'] );
2081
-							}
2082
-
2083
-							echo "\n el( '" . $new_args['element'] . "', {";
2084
-
2085
-							// get the attributes
2086
-							foreach ( $new_args as $new_key => $new_value ) {
2087
-
2088
-
2089
-								if ( $new_key == 'element' || $new_key == 'content' || $new_key == 'element_require' || $new_key == 'element_repeat' || is_array( $new_value ) ) {
2090
-									// do nothing
2091
-								} else {
2092
-									echo $this->block_element( array( $new_key => $new_value ) );
2093
-								}
2094
-							}
2095
-
2096
-							echo "},";// end attributes
2097
-
2098
-							// get the content
2099
-							$first_item = 0;
2100
-							foreach ( $new_args as $new_key => $new_value ) {
2101
-								if ( $new_key === 'content' || is_array( $new_value ) ) {
2102
-
2103
-									if ( $new_key === 'content' ) {
2104
-										echo "'" . $this->block_props_replace( wp_slash( $new_value ) ) . "'";
2105
-									}
2106
-
2107
-									if ( is_array( $new_value ) ) {
2108
-
2109
-										if ( isset( $new_value['element_require'] ) ) {
2110
-											echo str_replace( array(
2111
-													"'+",
2112
-													"+'"
2113
-												), '', $this->block_props_replace( $new_value['element_require'] ) ) . " &&  ";
2114
-											unset( $new_value['element_require'] );
2115
-										}
2116
-
2117
-										if ( isset( $new_value['element_repeat'] ) ) {
2118
-											$x = 1;
2119
-											while ( $x <= absint( $new_value['element_repeat'] ) ) {
2120
-												$this->block_element( array( '' => $new_value ) );
2121
-												$x ++;
2122
-											}
2123
-										} else {
2124
-											$this->block_element( array( '' => $new_value ) );
2125
-										}
2126
-									}
2127
-									$first_item ++;
2128
-								}
2129
-							}
2130
-
2131
-							echo ")";// end content
2132
-
2133
-							echo ", \n";
2134
-
2135
-						}
2136
-					} else {
2137
-
2138
-						if ( substr( $element, 0, 3 ) === "if_" ) {
2139
-							echo str_replace( "if_", "", $element ) . ": " . $this->block_props_replace( $new_args, true ) . ",";
2140
-						} elseif ( $element == 'style' ) {
2141
-							echo $element . ": " . $this->block_props_replace( $new_args ) . ",";
2142
-						} else {
2143
-							echo $element . ": '" . $this->block_props_replace( $new_args ) . "',";
2144
-						}
2145
-
2146
-					}
2147
-				}
2148
-			}
2149
-		}
2150
-
2151
-		/**
2152
-		 * Replace block attributes placeholders with the proper naming.
2153
-		 *
2154
-		 * @param $string
2155
-		 *
2156
-		 * @return mixed
2157
-		 */
2158
-		public function block_props_replace( $string, $no_wrap = false ) {
2159
-
2160
-			if ( $no_wrap ) {
2161
-				$string = str_replace( array( "[%", "%]" ), array( "props.attributes.", "" ), $string );
2162
-			} else {
2163
-				$string = str_replace( array( "[%", "%]" ), array( "'+props.attributes.", "+'" ), $string );
2164
-			}
2165
-
2166
-			return $string;
2167
-		}
2168
-
2169
-		/**
2170
-		 * Outputs the content of the widget
2171
-		 *
2172
-		 * @param array $args
2173
-		 * @param array $instance
2174
-		 */
2175
-		public function widget( $args, $instance ) {
2176
-
2177
-			// get the filtered values
2178
-			$argument_values = $this->argument_values( $instance );
2179
-			$argument_values = $this->string_to_bool( $argument_values );
2180
-			$output          = $this->output( $argument_values, $args );
2181
-
2182
-			$no_wrap = false;
2183
-			if( isset( $argument_values['no_wrap'] ) && $argument_values['no_wrap'] ){ $no_wrap = true; }
2184
-
2185
-			ob_start();
2186
-			if ( $output && !$no_wrap) {
2187
-				// Before widget
2188
-				$before_widget = $args['before_widget'];
2189
-				$before_widget = apply_filters( 'wp_super_duper_before_widget', $before_widget, $args, $instance, $this );
2190
-				$before_widget = apply_filters( 'wp_super_duper_before_widget_' . $this->base_id, $before_widget, $args, $instance, $this );
2191
-
2192
-				// After widget
2193
-				$after_widget = $args['after_widget'];
2194
-				$after_widget = apply_filters( 'wp_super_duper_after_widget', $after_widget, $args, $instance, $this );
2195
-				$after_widget = apply_filters( 'wp_super_duper_after_widget_' . $this->base_id, $after_widget, $args, $instance, $this );
2196
-
2197
-				echo $before_widget;
2198
-				// elementor strips the widget wrapping div so we check for and add it back if needed
2199
-				if ( $this->is_elementor_widget_output() ) {
2200
-					echo ! empty( $this->options['widget_ops']['classname'] ) ? "<span class='" . esc_attr( $this->options['widget_ops']['classname'] ) . "'>" : '';
2201
-				}
2202
-				echo $this->output_title( $args, $instance );
2203
-				echo $output;
2204
-				if ( $this->is_elementor_widget_output() ) {
2205
-					echo ! empty( $this->options['widget_ops']['classname'] ) ? "</span>" : '';
2206
-				}
2207
-				echo $after_widget;
2208
-			} elseif ( $this->is_preview() && $output == '' ) {// if preview show a placeholder if empty
2209
-				$output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
2210
-				echo $output;
2211
-			} elseif($output && $no_wrap){
2212
-				echo $output;
2213
-			}
2214
-			$output = ob_get_clean();
2215
-
2216
-			$output = apply_filters( 'wp_super_duper_widget_output', $output, $instance, $args, $this );
2217
-
2218
-			echo $output;
2219
-		}
2220
-
2221
-		/**
2222
-		 * Tests if the current output is inside a elementor container.
2223
-		 *
2224
-		 * @since 1.0.4
2225
-		 * @return bool
2226
-		 */
2227
-		public function is_elementor_widget_output() {
2228
-			$result = false;
2229
-			if ( defined( 'ELEMENTOR_VERSION' ) && isset( $this->number ) && $this->number == 'REPLACE_TO_ID' ) {
2230
-				$result = true;
2231
-			}
2232
-
2233
-			return $result;
2234
-		}
2235
-
2236
-		/**
2237
-		 * Tests if the current output is inside a elementor preview.
2238
-		 *
2239
-		 * @since 1.0.4
2240
-		 * @return bool
2241
-		 */
2242
-		public function is_elementor_preview() {
2243
-			$result = false;
2244
-			if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
2245
-				$result = true;
2246
-			}
2247
-
2248
-			return $result;
2249
-		}
2250
-
2251
-		/**
2252
-		 * Tests if the current output is inside a Divi preview.
2253
-		 *
2254
-		 * @since 1.0.6
2255
-		 * @return bool
2256
-		 */
2257
-		public function is_divi_preview() {
2258
-			$result = false;
2259
-			if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
2260
-				$result = true;
2261
-			}
2262
-
2263
-			return $result;
2264
-		}
2265
-
2266
-		/**
2267
-		 * Tests if the current output is inside a Beaver builder preview.
2268
-		 *
2269
-		 * @since 1.0.6
2270
-		 * @return bool
2271
-		 */
2272
-		public function is_beaver_preview() {
2273
-			$result = false;
2274
-			if ( isset( $_REQUEST['fl_builder'] ) ) {
2275
-				$result = true;
2276
-			}
2277
-
2278
-			return $result;
2279
-		}
2280
-
2281
-		/**
2282
-		 * Tests if the current output is inside a siteorigin builder preview.
2283
-		 *
2284
-		 * @since 1.0.6
2285
-		 * @return bool
2286
-		 */
2287
-		public function is_siteorigin_preview() {
2288
-			$result = false;
2289
-			if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
2290
-				$result = true;
2291
-			}
2292
-
2293
-			return $result;
2294
-		}
2295
-
2296
-		/**
2297
-		 * Tests if the current output is inside a cornerstone builder preview.
2298
-		 *
2299
-		 * @since 1.0.8
2300
-		 * @return bool
2301
-		 */
2302
-		public function is_cornerstone_preview() {
2303
-			$result = false;
2304
-			if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
2305
-				$result = true;
2306
-			}
2307
-
2308
-			return $result;
2309
-		}
2310
-
2311
-		/**
2312
-		 * Tests if the current output is inside a fusion builder preview.
2313
-		 *
2314
-		 * @since 1.1.0
2315
-		 * @return bool
2316
-		 */
2317
-		public function is_fusion_preview() {
2318
-			$result = false;
2319
-			if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
2320
-				$result = true;
2321
-			}
2322
-
2323
-			return $result;
2324
-		}
2325
-
2326
-		/**
2327
-		 * General function to check if we are in a preview situation.
2328
-		 *
2329
-		 * @since 1.0.6
2330
-		 * @return bool
2331
-		 */
2332
-		public function is_preview() {
2333
-			$preview = false;
2334
-			if ( $this->is_divi_preview() ) {
2335
-				$preview = true;
2336
-			} elseif ( $this->is_elementor_preview() ) {
2337
-				$preview = true;
2338
-			} elseif ( $this->is_beaver_preview() ) {
2339
-				$preview = true;
2340
-			} elseif ( $this->is_siteorigin_preview() ) {
2341
-				$preview = true;
2342
-			} elseif ( $this->is_cornerstone_preview() ) {
2343
-				$preview = true;
2344
-			} elseif ( $this->is_fusion_preview() ) {
2345
-				$preview = true;
2346
-			}
2347
-
2348
-			return $preview;
2349
-		}
2350
-
2351
-		/**
2352
-		 * Output the super title.
2353
-		 *
2354
-		 * @param $args
2355
-		 * @param array $instance
2356
-		 *
2357
-		 * @return string
2358
-		 */
2359
-		public function output_title( $args, $instance = array() ) {
2360
-			$output = '';
2361
-			if ( ! empty( $instance['title'] ) ) {
2362
-				/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
2363
-				$title  = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
2364
-				$output = $args['before_title'] . $title . $args['after_title'];
2365
-			}
2366
-
2367
-			return $output;
2368
-		}
2369
-
2370
-		/**
2371
-		 * Outputs the options form inputs for the widget.
2372
-		 *
2373
-		 * @param array $instance The widget options.
2374
-		 */
2375
-		public function form( $instance ) {
2376
-
2377
-			// set widget instance
2378
-			$this->instance = $instance;
2379
-
2380
-			// set it as a SD widget
2381
-			echo $this->widget_advanced_toggle();
2382
-
2383
-			echo "<p>" . esc_attr( $this->options['widget_ops']['description'] ) . "</p>";
2384
-			$arguments_raw = $this->get_arguments();
2385
-
2386
-			if ( is_array( $arguments_raw ) ) {
2387
-
2388
-				$arguments = $this->group_arguments($arguments_raw);
2389
-
2390
-				// Do we have sections?
2391
-				$has_sections = $arguments == $arguments_raw ? false : true;
2392
-
2393
-
2394
-				if($has_sections){
2395
-					$panel_count = 0;
2396
-					foreach($arguments as $key => $args){
2397
-
2398
-						?>
2028
+        }
2029
+
2030
+        /**
2031
+         * Convert an array of attributes to block string.
2032
+         *
2033
+         * @todo there is prob a faster way to do this, also we could add some validation here.
2034
+         *
2035
+         * @param $custom_attributes
2036
+         *
2037
+         * @return string
2038
+         */
2039
+        public function array_to_attributes( $custom_attributes, $html = false ) {
2040
+            $attributes = '';
2041
+            if ( ! empty( $custom_attributes ) ) {
2042
+
2043
+                if ( $html ) {
2044
+                    foreach ( $custom_attributes as $key => $val ) {
2045
+                        $attributes .= " $key='$val' ";
2046
+                    }
2047
+                } else {
2048
+                    foreach ( $custom_attributes as $key => $val ) {
2049
+                        $attributes .= "'$key': '$val',";
2050
+                    }
2051
+                }
2052
+            }
2053
+
2054
+            return $attributes;
2055
+        }
2056
+
2057
+        /**
2058
+         * A self looping function to create the output for JS block elements.
2059
+         *
2060
+         * This is what is output in the WP Editor visual view.
2061
+         *
2062
+         * @param $args
2063
+         */
2064
+        public function block_element( $args ) {
2065
+
2066
+
2067
+            if ( ! empty( $args ) ) {
2068
+                foreach ( $args as $element => $new_args ) {
2069
+
2070
+                    if ( is_array( $new_args ) ) { // its an element
2071
+
2072
+
2073
+                        if ( isset( $new_args['element'] ) ) {
2074
+
2075
+                            if ( isset( $new_args['element_require'] ) ) {
2076
+                                echo str_replace( array(
2077
+                                        "'+",
2078
+                                        "+'"
2079
+                                    ), '', $this->block_props_replace( $new_args['element_require'] ) ) . " &&  ";
2080
+                                unset( $new_args['element_require'] );
2081
+                            }
2082
+
2083
+                            echo "\n el( '" . $new_args['element'] . "', {";
2084
+
2085
+                            // get the attributes
2086
+                            foreach ( $new_args as $new_key => $new_value ) {
2087
+
2088
+
2089
+                                if ( $new_key == 'element' || $new_key == 'content' || $new_key == 'element_require' || $new_key == 'element_repeat' || is_array( $new_value ) ) {
2090
+                                    // do nothing
2091
+                                } else {
2092
+                                    echo $this->block_element( array( $new_key => $new_value ) );
2093
+                                }
2094
+                            }
2095
+
2096
+                            echo "},";// end attributes
2097
+
2098
+                            // get the content
2099
+                            $first_item = 0;
2100
+                            foreach ( $new_args as $new_key => $new_value ) {
2101
+                                if ( $new_key === 'content' || is_array( $new_value ) ) {
2102
+
2103
+                                    if ( $new_key === 'content' ) {
2104
+                                        echo "'" . $this->block_props_replace( wp_slash( $new_value ) ) . "'";
2105
+                                    }
2106
+
2107
+                                    if ( is_array( $new_value ) ) {
2108
+
2109
+                                        if ( isset( $new_value['element_require'] ) ) {
2110
+                                            echo str_replace( array(
2111
+                                                    "'+",
2112
+                                                    "+'"
2113
+                                                ), '', $this->block_props_replace( $new_value['element_require'] ) ) . " &&  ";
2114
+                                            unset( $new_value['element_require'] );
2115
+                                        }
2116
+
2117
+                                        if ( isset( $new_value['element_repeat'] ) ) {
2118
+                                            $x = 1;
2119
+                                            while ( $x <= absint( $new_value['element_repeat'] ) ) {
2120
+                                                $this->block_element( array( '' => $new_value ) );
2121
+                                                $x ++;
2122
+                                            }
2123
+                                        } else {
2124
+                                            $this->block_element( array( '' => $new_value ) );
2125
+                                        }
2126
+                                    }
2127
+                                    $first_item ++;
2128
+                                }
2129
+                            }
2130
+
2131
+                            echo ")";// end content
2132
+
2133
+                            echo ", \n";
2134
+
2135
+                        }
2136
+                    } else {
2137
+
2138
+                        if ( substr( $element, 0, 3 ) === "if_" ) {
2139
+                            echo str_replace( "if_", "", $element ) . ": " . $this->block_props_replace( $new_args, true ) . ",";
2140
+                        } elseif ( $element == 'style' ) {
2141
+                            echo $element . ": " . $this->block_props_replace( $new_args ) . ",";
2142
+                        } else {
2143
+                            echo $element . ": '" . $this->block_props_replace( $new_args ) . "',";
2144
+                        }
2145
+
2146
+                    }
2147
+                }
2148
+            }
2149
+        }
2150
+
2151
+        /**
2152
+         * Replace block attributes placeholders with the proper naming.
2153
+         *
2154
+         * @param $string
2155
+         *
2156
+         * @return mixed
2157
+         */
2158
+        public function block_props_replace( $string, $no_wrap = false ) {
2159
+
2160
+            if ( $no_wrap ) {
2161
+                $string = str_replace( array( "[%", "%]" ), array( "props.attributes.", "" ), $string );
2162
+            } else {
2163
+                $string = str_replace( array( "[%", "%]" ), array( "'+props.attributes.", "+'" ), $string );
2164
+            }
2165
+
2166
+            return $string;
2167
+        }
2168
+
2169
+        /**
2170
+         * Outputs the content of the widget
2171
+         *
2172
+         * @param array $args
2173
+         * @param array $instance
2174
+         */
2175
+        public function widget( $args, $instance ) {
2176
+
2177
+            // get the filtered values
2178
+            $argument_values = $this->argument_values( $instance );
2179
+            $argument_values = $this->string_to_bool( $argument_values );
2180
+            $output          = $this->output( $argument_values, $args );
2181
+
2182
+            $no_wrap = false;
2183
+            if( isset( $argument_values['no_wrap'] ) && $argument_values['no_wrap'] ){ $no_wrap = true; }
2184
+
2185
+            ob_start();
2186
+            if ( $output && !$no_wrap) {
2187
+                // Before widget
2188
+                $before_widget = $args['before_widget'];
2189
+                $before_widget = apply_filters( 'wp_super_duper_before_widget', $before_widget, $args, $instance, $this );
2190
+                $before_widget = apply_filters( 'wp_super_duper_before_widget_' . $this->base_id, $before_widget, $args, $instance, $this );
2191
+
2192
+                // After widget
2193
+                $after_widget = $args['after_widget'];
2194
+                $after_widget = apply_filters( 'wp_super_duper_after_widget', $after_widget, $args, $instance, $this );
2195
+                $after_widget = apply_filters( 'wp_super_duper_after_widget_' . $this->base_id, $after_widget, $args, $instance, $this );
2196
+
2197
+                echo $before_widget;
2198
+                // elementor strips the widget wrapping div so we check for and add it back if needed
2199
+                if ( $this->is_elementor_widget_output() ) {
2200
+                    echo ! empty( $this->options['widget_ops']['classname'] ) ? "<span class='" . esc_attr( $this->options['widget_ops']['classname'] ) . "'>" : '';
2201
+                }
2202
+                echo $this->output_title( $args, $instance );
2203
+                echo $output;
2204
+                if ( $this->is_elementor_widget_output() ) {
2205
+                    echo ! empty( $this->options['widget_ops']['classname'] ) ? "</span>" : '';
2206
+                }
2207
+                echo $after_widget;
2208
+            } elseif ( $this->is_preview() && $output == '' ) {// if preview show a placeholder if empty
2209
+                $output = $this->preview_placeholder_text( "{{" . $this->base_id . "}}" );
2210
+                echo $output;
2211
+            } elseif($output && $no_wrap){
2212
+                echo $output;
2213
+            }
2214
+            $output = ob_get_clean();
2215
+
2216
+            $output = apply_filters( 'wp_super_duper_widget_output', $output, $instance, $args, $this );
2217
+
2218
+            echo $output;
2219
+        }
2220
+
2221
+        /**
2222
+         * Tests if the current output is inside a elementor container.
2223
+         *
2224
+         * @since 1.0.4
2225
+         * @return bool
2226
+         */
2227
+        public function is_elementor_widget_output() {
2228
+            $result = false;
2229
+            if ( defined( 'ELEMENTOR_VERSION' ) && isset( $this->number ) && $this->number == 'REPLACE_TO_ID' ) {
2230
+                $result = true;
2231
+            }
2232
+
2233
+            return $result;
2234
+        }
2235
+
2236
+        /**
2237
+         * Tests if the current output is inside a elementor preview.
2238
+         *
2239
+         * @since 1.0.4
2240
+         * @return bool
2241
+         */
2242
+        public function is_elementor_preview() {
2243
+            $result = false;
2244
+            if ( isset( $_REQUEST['elementor-preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) || ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor_ajax' ) ) {
2245
+                $result = true;
2246
+            }
2247
+
2248
+            return $result;
2249
+        }
2250
+
2251
+        /**
2252
+         * Tests if the current output is inside a Divi preview.
2253
+         *
2254
+         * @since 1.0.6
2255
+         * @return bool
2256
+         */
2257
+        public function is_divi_preview() {
2258
+            $result = false;
2259
+            if ( isset( $_REQUEST['et_fb'] ) || isset( $_REQUEST['et_pb_preview'] ) || ( is_admin() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'elementor' ) ) {
2260
+                $result = true;
2261
+            }
2262
+
2263
+            return $result;
2264
+        }
2265
+
2266
+        /**
2267
+         * Tests if the current output is inside a Beaver builder preview.
2268
+         *
2269
+         * @since 1.0.6
2270
+         * @return bool
2271
+         */
2272
+        public function is_beaver_preview() {
2273
+            $result = false;
2274
+            if ( isset( $_REQUEST['fl_builder'] ) ) {
2275
+                $result = true;
2276
+            }
2277
+
2278
+            return $result;
2279
+        }
2280
+
2281
+        /**
2282
+         * Tests if the current output is inside a siteorigin builder preview.
2283
+         *
2284
+         * @since 1.0.6
2285
+         * @return bool
2286
+         */
2287
+        public function is_siteorigin_preview() {
2288
+            $result = false;
2289
+            if ( ! empty( $_REQUEST['siteorigin_panels_live_editor'] ) ) {
2290
+                $result = true;
2291
+            }
2292
+
2293
+            return $result;
2294
+        }
2295
+
2296
+        /**
2297
+         * Tests if the current output is inside a cornerstone builder preview.
2298
+         *
2299
+         * @since 1.0.8
2300
+         * @return bool
2301
+         */
2302
+        public function is_cornerstone_preview() {
2303
+            $result = false;
2304
+            if ( ! empty( $_REQUEST['cornerstone_preview'] ) || basename( $_SERVER['REQUEST_URI'] ) == 'cornerstone-endpoint' ) {
2305
+                $result = true;
2306
+            }
2307
+
2308
+            return $result;
2309
+        }
2310
+
2311
+        /**
2312
+         * Tests if the current output is inside a fusion builder preview.
2313
+         *
2314
+         * @since 1.1.0
2315
+         * @return bool
2316
+         */
2317
+        public function is_fusion_preview() {
2318
+            $result = false;
2319
+            if ( ! empty( $_REQUEST['fb-edit'] ) || ! empty( $_REQUEST['fusion_load_nonce'] ) ) {
2320
+                $result = true;
2321
+            }
2322
+
2323
+            return $result;
2324
+        }
2325
+
2326
+        /**
2327
+         * General function to check if we are in a preview situation.
2328
+         *
2329
+         * @since 1.0.6
2330
+         * @return bool
2331
+         */
2332
+        public function is_preview() {
2333
+            $preview = false;
2334
+            if ( $this->is_divi_preview() ) {
2335
+                $preview = true;
2336
+            } elseif ( $this->is_elementor_preview() ) {
2337
+                $preview = true;
2338
+            } elseif ( $this->is_beaver_preview() ) {
2339
+                $preview = true;
2340
+            } elseif ( $this->is_siteorigin_preview() ) {
2341
+                $preview = true;
2342
+            } elseif ( $this->is_cornerstone_preview() ) {
2343
+                $preview = true;
2344
+            } elseif ( $this->is_fusion_preview() ) {
2345
+                $preview = true;
2346
+            }
2347
+
2348
+            return $preview;
2349
+        }
2350
+
2351
+        /**
2352
+         * Output the super title.
2353
+         *
2354
+         * @param $args
2355
+         * @param array $instance
2356
+         *
2357
+         * @return string
2358
+         */
2359
+        public function output_title( $args, $instance = array() ) {
2360
+            $output = '';
2361
+            if ( ! empty( $instance['title'] ) ) {
2362
+                /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
2363
+                $title  = apply_filters( 'widget_title', $instance['title'], $instance, $this->id_base );
2364
+                $output = $args['before_title'] . $title . $args['after_title'];
2365
+            }
2366
+
2367
+            return $output;
2368
+        }
2369
+
2370
+        /**
2371
+         * Outputs the options form inputs for the widget.
2372
+         *
2373
+         * @param array $instance The widget options.
2374
+         */
2375
+        public function form( $instance ) {
2376
+
2377
+            // set widget instance
2378
+            $this->instance = $instance;
2379
+
2380
+            // set it as a SD widget
2381
+            echo $this->widget_advanced_toggle();
2382
+
2383
+            echo "<p>" . esc_attr( $this->options['widget_ops']['description'] ) . "</p>";
2384
+            $arguments_raw = $this->get_arguments();
2385
+
2386
+            if ( is_array( $arguments_raw ) ) {
2387
+
2388
+                $arguments = $this->group_arguments($arguments_raw);
2389
+
2390
+                // Do we have sections?
2391
+                $has_sections = $arguments == $arguments_raw ? false : true;
2392
+
2393
+
2394
+                if($has_sections){
2395
+                    $panel_count = 0;
2396
+                    foreach($arguments as $key => $args){
2397
+
2398
+                        ?>
2399 2399
 						<script>
2400 2400
 							//							jQuery(this).find("i").toggleClass("fas fa-chevron-up fas fa-chevron-down");jQuery(this).next().toggle();
2401 2401
 						</script>
2402 2402
 						<?php
2403 2403
 
2404
-						$hide = $panel_count ? ' style="display:none;" ' : '';
2405
-						$icon_class = $panel_count ? 'fas fa-chevron-up' : 'fas fa-chevron-down';
2406
-						echo "<button onclick='jQuery(this).find(\"i\").toggleClass(\"fas fa-chevron-up fas fa-chevron-down\");jQuery(this).next().slideToggle();' type='button' class='sd-toggle-group-button sd-input-group-toggle".sanitize_title_with_dashes($key)."'>".esc_attr($key)." <i style='float:right;' class='".$icon_class."'></i></button>";
2407
-						echo "<div class='sd-toggle-group sd-input-group-".sanitize_title_with_dashes($key)."' $hide>";
2408
-
2409
-						foreach($args as $k => $a){
2410
-							$this->widget_inputs($a, $instance);
2411
-						}
2412
-
2413
-						echo "</div>";
2414
-
2415
-						$panel_count++;
2416
-
2417
-					}
2418
-				}else{
2419
-					foreach ( $arguments as $key => $args ) {
2420
-						$this->widget_inputs( $args, $instance );
2421
-					}
2422
-				}
2423
-
2424
-			}
2425
-		}
2426
-
2427
-		/**
2428
-		 * Get the hidden input that when added makes the advanced button show on widget settings.
2429
-		 *
2430
-		 * @return string
2431
-		 */
2432
-		public function widget_advanced_toggle() {
2433
-
2434
-			$output = '';
2435
-			if ( $this->block_show_advanced() ) {
2436
-				$val = 1;
2437
-			} else {
2438
-				$val = 0;
2439
-			}
2440
-
2441
-			$output .= "<input type='hidden'  class='sd-show-advanced' value='$val' />";
2442
-
2443
-			return $output;
2444
-		}
2445
-
2446
-		/**
2447
-		 * Convert require element.
2448
-		 *
2449
-		 * @since 1.0.0
2450
-		 *
2451
-		 * @param string $input Input element.
2452
-		 *
2453
-		 * @return string $output
2454
-		 */
2455
-		public function convert_element_require( $input ) {
2456
-
2457
-			$input = str_replace( "'", '"', $input );// we only want double quotes
2458
-
2459
-			$output = esc_attr( str_replace( array( "[%", "%]" ), array(
2460
-				"jQuery(form).find('[data-argument=\"",
2461
-				"\"]').find('input,select,textarea').val()"
2462
-			), $input ) );
2463
-
2464
-			return $output;
2465
-		}
2466
-
2467
-		/**
2468
-		 * Builds the inputs for the widget options.
2469
-		 *
2470
-		 * @param $args
2471
-		 * @param $instance
2472
-		 */
2473
-		public function widget_inputs( $args, $instance ) {
2474
-
2475
-			$class             = "";
2476
-			$element_require   = "";
2477
-			$custom_attributes = "";
2478
-
2479
-			// get value
2480
-			if ( isset( $instance[ $args['name'] ] ) ) {
2481
-				$value = $instance[ $args['name'] ];
2482
-			} elseif ( ! isset( $instance[ $args['name'] ] ) && ! empty( $args['default'] ) ) {
2483
-				$value = is_array( $args['default'] ) ? array_map( "esc_html", $args['default'] ) : esc_html( $args['default'] );
2484
-			} else {
2485
-				$value = '';
2486
-			}
2487
-
2488
-			// get placeholder
2489
-			if ( ! empty( $args['placeholder'] ) ) {
2490
-				$placeholder = "placeholder='" . esc_html( $args['placeholder'] ) . "'";
2491
-			} else {
2492
-				$placeholder = '';
2493
-			}
2494
-
2495
-			// get if advanced
2496
-			if ( isset( $args['advanced'] ) && $args['advanced'] ) {
2497
-				$class .= " sd-advanced-setting ";
2498
-			}
2499
-
2500
-			// element_require
2501
-			if ( isset( $args['element_require'] ) && $args['element_require'] ) {
2502
-				$element_require = $args['element_require'];
2503
-			}
2504
-
2505
-			// custom_attributes
2506
-			if ( isset( $args['custom_attributes'] ) && $args['custom_attributes'] ) {
2507
-				$custom_attributes = $this->array_to_attributes( $args['custom_attributes'], true );
2508
-			}
2509
-
2510
-			// before wrapper
2511
-			?>
2404
+                        $hide = $panel_count ? ' style="display:none;" ' : '';
2405
+                        $icon_class = $panel_count ? 'fas fa-chevron-up' : 'fas fa-chevron-down';
2406
+                        echo "<button onclick='jQuery(this).find(\"i\").toggleClass(\"fas fa-chevron-up fas fa-chevron-down\");jQuery(this).next().slideToggle();' type='button' class='sd-toggle-group-button sd-input-group-toggle".sanitize_title_with_dashes($key)."'>".esc_attr($key)." <i style='float:right;' class='".$icon_class."'></i></button>";
2407
+                        echo "<div class='sd-toggle-group sd-input-group-".sanitize_title_with_dashes($key)."' $hide>";
2408
+
2409
+                        foreach($args as $k => $a){
2410
+                            $this->widget_inputs($a, $instance);
2411
+                        }
2412
+
2413
+                        echo "</div>";
2414
+
2415
+                        $panel_count++;
2416
+
2417
+                    }
2418
+                }else{
2419
+                    foreach ( $arguments as $key => $args ) {
2420
+                        $this->widget_inputs( $args, $instance );
2421
+                    }
2422
+                }
2423
+
2424
+            }
2425
+        }
2426
+
2427
+        /**
2428
+         * Get the hidden input that when added makes the advanced button show on widget settings.
2429
+         *
2430
+         * @return string
2431
+         */
2432
+        public function widget_advanced_toggle() {
2433
+
2434
+            $output = '';
2435
+            if ( $this->block_show_advanced() ) {
2436
+                $val = 1;
2437
+            } else {
2438
+                $val = 0;
2439
+            }
2440
+
2441
+            $output .= "<input type='hidden'  class='sd-show-advanced' value='$val' />";
2442
+
2443
+            return $output;
2444
+        }
2445
+
2446
+        /**
2447
+         * Convert require element.
2448
+         *
2449
+         * @since 1.0.0
2450
+         *
2451
+         * @param string $input Input element.
2452
+         *
2453
+         * @return string $output
2454
+         */
2455
+        public function convert_element_require( $input ) {
2456
+
2457
+            $input = str_replace( "'", '"', $input );// we only want double quotes
2458
+
2459
+            $output = esc_attr( str_replace( array( "[%", "%]" ), array(
2460
+                "jQuery(form).find('[data-argument=\"",
2461
+                "\"]').find('input,select,textarea').val()"
2462
+            ), $input ) );
2463
+
2464
+            return $output;
2465
+        }
2466
+
2467
+        /**
2468
+         * Builds the inputs for the widget options.
2469
+         *
2470
+         * @param $args
2471
+         * @param $instance
2472
+         */
2473
+        public function widget_inputs( $args, $instance ) {
2474
+
2475
+            $class             = "";
2476
+            $element_require   = "";
2477
+            $custom_attributes = "";
2478
+
2479
+            // get value
2480
+            if ( isset( $instance[ $args['name'] ] ) ) {
2481
+                $value = $instance[ $args['name'] ];
2482
+            } elseif ( ! isset( $instance[ $args['name'] ] ) && ! empty( $args['default'] ) ) {
2483
+                $value = is_array( $args['default'] ) ? array_map( "esc_html", $args['default'] ) : esc_html( $args['default'] );
2484
+            } else {
2485
+                $value = '';
2486
+            }
2487
+
2488
+            // get placeholder
2489
+            if ( ! empty( $args['placeholder'] ) ) {
2490
+                $placeholder = "placeholder='" . esc_html( $args['placeholder'] ) . "'";
2491
+            } else {
2492
+                $placeholder = '';
2493
+            }
2494
+
2495
+            // get if advanced
2496
+            if ( isset( $args['advanced'] ) && $args['advanced'] ) {
2497
+                $class .= " sd-advanced-setting ";
2498
+            }
2499
+
2500
+            // element_require
2501
+            if ( isset( $args['element_require'] ) && $args['element_require'] ) {
2502
+                $element_require = $args['element_require'];
2503
+            }
2504
+
2505
+            // custom_attributes
2506
+            if ( isset( $args['custom_attributes'] ) && $args['custom_attributes'] ) {
2507
+                $custom_attributes = $this->array_to_attributes( $args['custom_attributes'], true );
2508
+            }
2509
+
2510
+            // before wrapper
2511
+            ?>
2512 2512
 			<p class="sd-argument <?php echo esc_attr( $class ); ?>"
2513 2513
 			   data-argument='<?php echo esc_attr( $args['name'] ); ?>'
2514 2514
 			   data-element_require='<?php if ( $element_require ) {
2515
-				   echo $this->convert_element_require( $element_require );
2516
-			   } ?>'
2515
+                    echo $this->convert_element_require( $element_require );
2516
+                } ?>'
2517 2517
 			>
2518 2518
 				<?php
2519 2519
 
2520
-				switch ( $args['type'] ) {
2521
-					//array('text','password','number','email','tel','url','color')
2522
-					case "text":
2523
-					case "password":
2524
-					case "number":
2525
-					case "email":
2526
-					case "tel":
2527
-					case "url":
2528
-					case "color":
2529
-						?>
2520
+                switch ( $args['type'] ) {
2521
+                    //array('text','password','number','email','tel','url','color')
2522
+                    case "text":
2523
+                    case "password":
2524
+                    case "number":
2525
+                    case "email":
2526
+                    case "tel":
2527
+                    case "url":
2528
+                    case "color":
2529
+                        ?>
2530 2530
 						<label
2531 2531
 							for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo esc_attr( $args['title'] ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
2532 2532
 						<input <?php echo $placeholder; ?> class="widefat"
@@ -2537,47 +2537,47 @@  discard block
 block discarded – undo
2537 2537
 							                               value="<?php echo esc_attr( $value ); ?>">
2538 2538
 						<?php
2539 2539
 
2540
-						break;
2541
-					case "select":
2542
-						$multiple = isset( $args['multiple'] ) && $args['multiple'] ? true : false;
2543
-						if ( $multiple ) {
2544
-							if ( empty( $value ) ) {
2545
-								$value = array();
2546
-							}
2547
-						}
2548
-						?>
2540
+                        break;
2541
+                    case "select":
2542
+                        $multiple = isset( $args['multiple'] ) && $args['multiple'] ? true : false;
2543
+                        if ( $multiple ) {
2544
+                            if ( empty( $value ) ) {
2545
+                                $value = array();
2546
+                            }
2547
+                        }
2548
+                        ?>
2549 2549
 						<label
2550 2550
 							for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo esc_attr( $args['title'] ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
2551 2551
 						<select <?php echo $placeholder; ?> class="widefat"
2552 2552
 							<?php echo $custom_attributes; ?>
2553 2553
 							                                id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"
2554 2554
 							                                name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) );
2555
-							                                if ( $multiple ) {
2556
-								                                echo "[]";
2557
-							                                } ?>"
2555
+                                                            if ( $multiple ) {
2556
+                                                                echo "[]";
2557
+                                                            } ?>"
2558 2558
 							<?php if ( $multiple ) {
2559
-								echo "multiple";
2560
-							} //@todo not implemented yet due to gutenberg not supporting it
2561
-							?>
2559
+                                echo "multiple";
2560
+                            } //@todo not implemented yet due to gutenberg not supporting it
2561
+                            ?>
2562 2562
 						>
2563 2563
 							<?php
2564 2564
 
2565
-							if ( ! empty( $args['options'] ) ) {
2566
-								foreach ( $args['options'] as $val => $label ) {
2567
-									if ( $multiple ) {
2568
-										$selected = in_array( $val, $value ) ? 'selected="selected"' : '';
2569
-									} else {
2570
-										$selected = selected( $value, $val, false );
2571
-									}
2572
-									echo "<option value='$val' " . $selected . ">$label</option>";
2573
-								}
2574
-							}
2575
-							?>
2565
+                            if ( ! empty( $args['options'] ) ) {
2566
+                                foreach ( $args['options'] as $val => $label ) {
2567
+                                    if ( $multiple ) {
2568
+                                        $selected = in_array( $val, $value ) ? 'selected="selected"' : '';
2569
+                                    } else {
2570
+                                        $selected = selected( $value, $val, false );
2571
+                                    }
2572
+                                    echo "<option value='$val' " . $selected . ">$label</option>";
2573
+                                }
2574
+                            }
2575
+                            ?>
2576 2576
 						</select>
2577 2577
 						<?php
2578
-						break;
2579
-					case "checkbox":
2580
-						?>
2578
+                        break;
2579
+                    case "checkbox":
2580
+                        ?>
2581 2581
 						<input <?php echo $placeholder; ?>
2582 2582
 							<?php checked( 1, $value, true ) ?>
2583 2583
 							<?php echo $custom_attributes; ?>
@@ -2587,9 +2587,9 @@  discard block
 block discarded – undo
2587 2587
 						<label
2588 2588
 							for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo esc_attr( $args['title'] ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
2589 2589
 						<?php
2590
-						break;
2591
-					case "textarea":
2592
-						?>
2590
+                        break;
2591
+                    case "textarea":
2592
+                        ?>
2593 2593
 						<label
2594 2594
 							for="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"><?php echo esc_attr( $args['title'] ); ?><?php echo $this->widget_field_desc( $args ); ?></label>
2595 2595
 						<textarea <?php echo $placeholder; ?> class="widefat"
@@ -2599,136 +2599,136 @@  discard block
 block discarded – undo
2599 2599
 							                               ><?php echo esc_attr( $value ); ?></textarea>
2600 2600
 						<?php
2601 2601
 
2602
-						break;
2603
-					case "hidden":
2604
-						?>
2602
+                        break;
2603
+                    case "hidden":
2604
+                        ?>
2605 2605
 						<input id="<?php echo esc_attr( $this->get_field_id( $args['name'] ) ); ?>"
2606 2606
 						       name="<?php echo esc_attr( $this->get_field_name( $args['name'] ) ); ?>" type="hidden"
2607 2607
 						       value="<?php echo esc_attr( $value ); ?>">
2608 2608
 						<?php
2609
-						break;
2610
-					default:
2611
-						echo "No input type found!"; // @todo we need to add more input types.
2612
-				}
2609
+                        break;
2610
+                    default:
2611
+                        echo "No input type found!"; // @todo we need to add more input types.
2612
+                }
2613 2613
 
2614
-				// after wrapper
2615
-				?>
2614
+                // after wrapper
2615
+                ?>
2616 2616
 			</p>
2617 2617
 			<?php
2618 2618
 
2619
-		}
2620
-
2621
-		/**
2622
-		 * Get the widget input description html.
2623
-		 *
2624
-		 * @param $args
2625
-		 *
2626
-		 * @return string
2627
-		 * @todo, need to make its own tooltip script
2628
-		 */
2629
-		public function widget_field_desc( $args ) {
2630
-
2631
-			$description = '';
2632
-			if ( isset( $args['desc'] ) && $args['desc'] ) {
2633
-				if ( isset( $args['desc_tip'] ) && $args['desc_tip'] ) {
2634
-					$description = $this->desc_tip( $args['desc'] );
2635
-				} else {
2636
-					$description = '<span class="description">' . wp_kses_post( $args['desc'] ) . '</span>';
2637
-				}
2638
-			}
2639
-
2640
-			return $description;
2641
-		}
2642
-
2643
-		/**
2644
-		 * Get the tool tip html.
2645
-		 *
2646
-		 * @param $tip
2647
-		 * @param bool $allow_html
2648
-		 *
2649
-		 * @return string
2650
-		 */
2651
-		function desc_tip( $tip, $allow_html = false ) {
2652
-			if ( $allow_html ) {
2653
-				$tip = $this->sanitize_tooltip( $tip );
2654
-			} else {
2655
-				$tip = esc_attr( $tip );
2656
-			}
2657
-
2658
-			return '<span class="gd-help-tip dashicons dashicons-editor-help" title="' . $tip . '"></span>';
2659
-		}
2660
-
2661
-		/**
2662
-		 * Sanitize a string destined to be a tooltip.
2663
-		 *
2664
-		 * @param string $var
2665
-		 *
2666
-		 * @return string
2667
-		 */
2668
-		public function sanitize_tooltip( $var ) {
2669
-			return htmlspecialchars( wp_kses( html_entity_decode( $var ), array(
2670
-				'br'     => array(),
2671
-				'em'     => array(),
2672
-				'strong' => array(),
2673
-				'small'  => array(),
2674
-				'span'   => array(),
2675
-				'ul'     => array(),
2676
-				'li'     => array(),
2677
-				'ol'     => array(),
2678
-				'p'      => array(),
2679
-			) ) );
2680
-		}
2681
-
2682
-		/**
2683
-		 * Processing widget options on save
2684
-		 *
2685
-		 * @param array $new_instance The new options
2686
-		 * @param array $old_instance The previous options
2687
-		 *
2688
-		 * @return array
2689
-		 * @todo we should add some sanitation here.
2690
-		 */
2691
-		public function update( $new_instance, $old_instance ) {
2692
-
2693
-			//save the widget
2694
-			$instance = array_merge( (array) $old_instance, (array) $new_instance );
2695
-
2696
-			// set widget instance
2697
-			$this->instance = $instance;
2698
-
2699
-			if ( empty( $this->arguments ) ) {
2700
-				$this->get_arguments();
2701
-			}
2702
-
2703
-			// check for checkboxes
2704
-			if ( ! empty( $this->arguments ) ) {
2705
-				foreach ( $this->arguments as $argument ) {
2706
-					if ( isset( $argument['type'] ) && $argument['type'] == 'checkbox' && ! isset( $new_instance[ $argument['name'] ] ) ) {
2707
-						$instance[ $argument['name'] ] = '0';
2708
-					}
2709
-				}
2710
-			}
2711
-
2712
-			return $instance;
2713
-		}
2714
-
2715
-		/**
2716
-		 * Checks if the current call is a ajax call to get the block content.
2717
-		 *
2718
-		 * This can be used in your widget to return different content as the block content.
2719
-		 *
2720
-		 * @since 1.0.3
2721
-		 * @return bool
2722
-		 */
2723
-		public function is_block_content_call() {
2724
-			$result = false;
2725
-			if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
2726
-				$result = true;
2727
-			}
2728
-
2729
-			return $result;
2730
-		}
2731
-
2732
-	}
2619
+        }
2620
+
2621
+        /**
2622
+         * Get the widget input description html.
2623
+         *
2624
+         * @param $args
2625
+         *
2626
+         * @return string
2627
+         * @todo, need to make its own tooltip script
2628
+         */
2629
+        public function widget_field_desc( $args ) {
2630
+
2631
+            $description = '';
2632
+            if ( isset( $args['desc'] ) && $args['desc'] ) {
2633
+                if ( isset( $args['desc_tip'] ) && $args['desc_tip'] ) {
2634
+                    $description = $this->desc_tip( $args['desc'] );
2635
+                } else {
2636
+                    $description = '<span class="description">' . wp_kses_post( $args['desc'] ) . '</span>';
2637
+                }
2638
+            }
2639
+
2640
+            return $description;
2641
+        }
2642
+
2643
+        /**
2644
+         * Get the tool tip html.
2645
+         *
2646
+         * @param $tip
2647
+         * @param bool $allow_html
2648
+         *
2649
+         * @return string
2650
+         */
2651
+        function desc_tip( $tip, $allow_html = false ) {
2652
+            if ( $allow_html ) {
2653
+                $tip = $this->sanitize_tooltip( $tip );
2654
+            } else {
2655
+                $tip = esc_attr( $tip );
2656
+            }
2657
+
2658
+            return '<span class="gd-help-tip dashicons dashicons-editor-help" title="' . $tip . '"></span>';
2659
+        }
2660
+
2661
+        /**
2662
+         * Sanitize a string destined to be a tooltip.
2663
+         *
2664
+         * @param string $var
2665
+         *
2666
+         * @return string
2667
+         */
2668
+        public function sanitize_tooltip( $var ) {
2669
+            return htmlspecialchars( wp_kses( html_entity_decode( $var ), array(
2670
+                'br'     => array(),
2671
+                'em'     => array(),
2672
+                'strong' => array(),
2673
+                'small'  => array(),
2674
+                'span'   => array(),
2675
+                'ul'     => array(),
2676
+                'li'     => array(),
2677
+                'ol'     => array(),
2678
+                'p'      => array(),
2679
+            ) ) );
2680
+        }
2681
+
2682
+        /**
2683
+         * Processing widget options on save
2684
+         *
2685
+         * @param array $new_instance The new options
2686
+         * @param array $old_instance The previous options
2687
+         *
2688
+         * @return array
2689
+         * @todo we should add some sanitation here.
2690
+         */
2691
+        public function update( $new_instance, $old_instance ) {
2692
+
2693
+            //save the widget
2694
+            $instance = array_merge( (array) $old_instance, (array) $new_instance );
2695
+
2696
+            // set widget instance
2697
+            $this->instance = $instance;
2698
+
2699
+            if ( empty( $this->arguments ) ) {
2700
+                $this->get_arguments();
2701
+            }
2702
+
2703
+            // check for checkboxes
2704
+            if ( ! empty( $this->arguments ) ) {
2705
+                foreach ( $this->arguments as $argument ) {
2706
+                    if ( isset( $argument['type'] ) && $argument['type'] == 'checkbox' && ! isset( $new_instance[ $argument['name'] ] ) ) {
2707
+                        $instance[ $argument['name'] ] = '0';
2708
+                    }
2709
+                }
2710
+            }
2711
+
2712
+            return $instance;
2713
+        }
2714
+
2715
+        /**
2716
+         * Checks if the current call is a ajax call to get the block content.
2717
+         *
2718
+         * This can be used in your widget to return different content as the block content.
2719
+         *
2720
+         * @since 1.0.3
2721
+         * @return bool
2722
+         */
2723
+        public function is_block_content_call() {
2724
+            $result = false;
2725
+            if ( wp_doing_ajax() && isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'super_duper_output_shortcode' ) {
2726
+                $result = true;
2727
+            }
2728
+
2729
+            return $result;
2730
+        }
2731
+
2732
+    }
2733 2733
 
2734 2734
 }
2735 2735
\ No newline at end of file
Please login to merge, or discard this patch.
includes/wpinv-template-functions.php 1 patch
Indentation   +104 added lines, -104 removed lines patch added patch discarded remove patch
@@ -103,29 +103,29 @@  discard block
 block discarded – undo
103 103
 
104 104
 function wpinv_get_template( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
105 105
     if ( ! empty( $args ) && is_array( $args ) ) {
106
-		extract( $args );
107
-	}
106
+        extract( $args );
107
+    }
108 108
 
109
-	$located = wpinv_locate_template( $template_name, $template_path, $default_path );
110
-	// Allow 3rd party plugin filter template file from their plugin.
111
-	$located = apply_filters( 'wpinv_get_template', $located, $template_name, $args, $template_path, $default_path );
109
+    $located = wpinv_locate_template( $template_name, $template_path, $default_path );
110
+    // Allow 3rd party plugin filter template file from their plugin.
111
+    $located = apply_filters( 'wpinv_get_template', $located, $template_name, $args, $template_path, $default_path );
112 112
 
113
-	if ( ! file_exists( $located ) ) {
113
+    if ( ! file_exists( $located ) ) {
114 114
         _doing_it_wrong( __FUNCTION__, sprintf( '<code>%s</code> does not exist.', $located ), '2.1' );
115
-		return;
116
-	}
115
+        return;
116
+    }
117 117
 
118
-	do_action( 'wpinv_before_template_part', $template_name, $template_path, $located, $args );
118
+    do_action( 'wpinv_before_template_part', $template_name, $template_path, $located, $args );
119 119
 
120
-	include( $located );
120
+    include( $located );
121 121
 
122
-	do_action( 'wpinv_after_template_part', $template_name, $template_path, $located, $args );
122
+    do_action( 'wpinv_after_template_part', $template_name, $template_path, $located, $args );
123 123
 }
124 124
 
125 125
 function wpinv_get_template_html( $template_name, $args = array(), $template_path = '', $default_path = '' ) {
126
-	ob_start();
127
-	wpinv_get_template( $template_name, $args, $template_path, $default_path );
128
-	return ob_get_clean();
126
+    ob_start();
127
+    wpinv_get_template( $template_name, $args, $template_path, $default_path );
128
+    return ob_get_clean();
129 129
 }
130 130
 
131 131
 function wpinv_locate_template( $template_name, $template_path = '', $default_path = '' ) {
@@ -155,126 +155,126 @@  discard block
 block discarded – undo
155 155
 }
156 156
 
157 157
 function wpinv_get_template_part( $slug, $name = null, $load = true ) {
158
-	do_action( 'get_template_part_' . $slug, $slug, $name );
158
+    do_action( 'get_template_part_' . $slug, $slug, $name );
159 159
 
160
-	// Setup possible parts
161
-	$templates = array();
162
-	if ( isset( $name ) )
163
-		$templates[] = $slug . '-' . $name . '.php';
164
-	$templates[] = $slug . '.php';
160
+    // Setup possible parts
161
+    $templates = array();
162
+    if ( isset( $name ) )
163
+        $templates[] = $slug . '-' . $name . '.php';
164
+    $templates[] = $slug . '.php';
165 165
 
166
-	// Allow template parts to be filtered
167
-	$templates = apply_filters( 'wpinv_get_template_part', $templates, $slug, $name );
166
+    // Allow template parts to be filtered
167
+    $templates = apply_filters( 'wpinv_get_template_part', $templates, $slug, $name );
168 168
 
169
-	// Return the part that is found
170
-	return wpinv_locate_tmpl( $templates, $load, false );
169
+    // Return the part that is found
170
+    return wpinv_locate_tmpl( $templates, $load, false );
171 171
 }
172 172
 
173 173
 function wpinv_locate_tmpl( $template_names, $load = false, $require_once = true ) {
174
-	// No file found yet
175
-	$located = false;
174
+    // No file found yet
175
+    $located = false;
176 176
 
177
-	// Try to find a template file
178
-	foreach ( (array)$template_names as $template_name ) {
177
+    // Try to find a template file
178
+    foreach ( (array)$template_names as $template_name ) {
179 179
 
180
-		// Continue if template is empty
181
-		if ( empty( $template_name ) )
182
-			continue;
180
+        // Continue if template is empty
181
+        if ( empty( $template_name ) )
182
+            continue;
183 183
 
184
-		// Trim off any slashes from the template name
185
-		$template_name = ltrim( $template_name, '/' );
184
+        // Trim off any slashes from the template name
185
+        $template_name = ltrim( $template_name, '/' );
186 186
 
187
-		// try locating this template file by looping through the template paths
188
-		foreach( wpinv_get_theme_template_paths() as $template_path ) {
187
+        // try locating this template file by looping through the template paths
188
+        foreach( wpinv_get_theme_template_paths() as $template_path ) {
189 189
 
190
-			if( file_exists( $template_path . $template_name ) ) {
191
-				$located = $template_path . $template_name;
192
-				break;
193
-			}
194
-		}
190
+            if( file_exists( $template_path . $template_name ) ) {
191
+                $located = $template_path . $template_name;
192
+                break;
193
+            }
194
+        }
195 195
 
196
-		if( !empty( $located ) ) {
197
-			break;
198
-		}
199
-	}
196
+        if( !empty( $located ) ) {
197
+            break;
198
+        }
199
+    }
200 200
 
201
-	if ( ( true == $load ) && ! empty( $located ) )
202
-		load_template( $located, $require_once );
201
+    if ( ( true == $load ) && ! empty( $located ) )
202
+        load_template( $located, $require_once );
203 203
 
204
-	return $located;
204
+    return $located;
205 205
 }
206 206
 
207 207
 function wpinv_get_theme_template_paths() {
208
-	$template_dir = wpinv_get_theme_template_dir_name();
208
+    $template_dir = wpinv_get_theme_template_dir_name();
209 209
 
210
-	$file_paths = array(
211
-		1 => trailingslashit( get_stylesheet_directory() ) . $template_dir,
212
-		10 => trailingslashit( get_template_directory() ) . $template_dir,
213
-		100 => wpinv_get_templates_dir()
214
-	);
210
+    $file_paths = array(
211
+        1 => trailingslashit( get_stylesheet_directory() ) . $template_dir,
212
+        10 => trailingslashit( get_template_directory() ) . $template_dir,
213
+        100 => wpinv_get_templates_dir()
214
+    );
215 215
 
216
-	$file_paths = apply_filters( 'wpinv_template_paths', $file_paths );
216
+    $file_paths = apply_filters( 'wpinv_template_paths', $file_paths );
217 217
 
218
-	// sort the file paths based on priority
219
-	ksort( $file_paths, SORT_NUMERIC );
218
+    // sort the file paths based on priority
219
+    ksort( $file_paths, SORT_NUMERIC );
220 220
 
221
-	return array_map( 'trailingslashit', $file_paths );
221
+    return array_map( 'trailingslashit', $file_paths );
222 222
 }
223 223
 
224 224
 function wpinv_get_theme_template_dir_name() {
225
-	return trailingslashit( apply_filters( 'wpinv_templates_dir', 'invoicing' ) );
225
+    return trailingslashit( apply_filters( 'wpinv_templates_dir', 'invoicing' ) );
226 226
 }
227 227
 
228 228
 function wpinv_checkout_meta_tags() {
229 229
 
230
-	$pages   = array();
231
-	$pages[] = wpinv_get_option( 'success_page' );
232
-	$pages[] = wpinv_get_option( 'failure_page' );
233
-	$pages[] = wpinv_get_option( 'invoice_history_page' );
234
-	$pages[] = wpinv_get_option( 'invoice_subscription_page' );
230
+    $pages   = array();
231
+    $pages[] = wpinv_get_option( 'success_page' );
232
+    $pages[] = wpinv_get_option( 'failure_page' );
233
+    $pages[] = wpinv_get_option( 'invoice_history_page' );
234
+    $pages[] = wpinv_get_option( 'invoice_subscription_page' );
235 235
 
236
-	if( !wpinv_is_checkout() && !is_page( $pages ) ) {
237
-		return;
238
-	}
236
+    if( !wpinv_is_checkout() && !is_page( $pages ) ) {
237
+        return;
238
+    }
239 239
 
240
-	echo '<meta name="robots" content="noindex,nofollow" />' . "\n";
240
+    echo '<meta name="robots" content="noindex,nofollow" />' . "\n";
241 241
 }
242 242
 add_action( 'wp_head', 'wpinv_checkout_meta_tags' );
243 243
 
244 244
 function wpinv_add_body_classes( $class ) {
245
-	$classes = (array)$class;
245
+    $classes = (array)$class;
246 246
 
247
-	if( wpinv_is_checkout() ) {
248
-		$classes[] = 'wpinv-checkout';
249
-		$classes[] = 'wpinv-page';
250
-	}
247
+    if( wpinv_is_checkout() ) {
248
+        $classes[] = 'wpinv-checkout';
249
+        $classes[] = 'wpinv-page';
250
+    }
251 251
 
252
-	if( wpinv_is_success_page() ) {
253
-		$classes[] = 'wpinv-success';
254
-		$classes[] = 'wpinv-page';
255
-	}
252
+    if( wpinv_is_success_page() ) {
253
+        $classes[] = 'wpinv-success';
254
+        $classes[] = 'wpinv-page';
255
+    }
256 256
 
257
-	if( wpinv_is_failed_transaction_page() ) {
258
-		$classes[] = 'wpinv-failed-transaction';
259
-		$classes[] = 'wpinv-page';
260
-	}
257
+    if( wpinv_is_failed_transaction_page() ) {
258
+        $classes[] = 'wpinv-failed-transaction';
259
+        $classes[] = 'wpinv-page';
260
+    }
261 261
 
262
-	if( wpinv_is_invoice_history_page() ) {
263
-		$classes[] = 'wpinv-history';
264
-		$classes[] = 'wpinv-page';
265
-	}
262
+    if( wpinv_is_invoice_history_page() ) {
263
+        $classes[] = 'wpinv-history';
264
+        $classes[] = 'wpinv-page';
265
+    }
266 266
 
267
-	if( wpinv_is_subscriptions_history_page() ) {
268
-		$classes[] = 'wpinv-subscription';
269
-		$classes[] = 'wpinv-page';
270
-	}
267
+    if( wpinv_is_subscriptions_history_page() ) {
268
+        $classes[] = 'wpinv-subscription';
269
+        $classes[] = 'wpinv-page';
270
+    }
271 271
 
272
-	if( wpinv_is_test_mode() ) {
273
-		$classes[] = 'wpinv-test-mode';
274
-		$classes[] = 'wpinv-page';
275
-	}
272
+    if( wpinv_is_test_mode() ) {
273
+        $classes[] = 'wpinv-test-mode';
274
+        $classes[] = 'wpinv-page';
275
+    }
276 276
 
277
-	return array_unique( $classes );
277
+    return array_unique( $classes );
278 278
 }
279 279
 add_filter( 'body_class', 'wpinv_add_body_classes' );
280 280
 
@@ -947,21 +947,21 @@  discard block
 block discarded – undo
947 947
 
948 948
     $formatted_address = str_ireplace( array_keys( $replacements ), $replacements, $format );
949 949
     
950
-	// Remove unavailable tags.
950
+    // Remove unavailable tags.
951 951
     $formatted_address = preg_replace( "/\{\{\w+\}\}/", '', $formatted_address );
952 952
 
953 953
     // Clean up white space.
954
-	$formatted_address = preg_replace( '/  +/', ' ', trim( $formatted_address ) );
954
+    $formatted_address = preg_replace( '/  +/', ' ', trim( $formatted_address ) );
955 955
     $formatted_address = preg_replace( '/\n\n+/', "\n", $formatted_address );
956 956
     
957 957
     // Break newlines apart and remove empty lines/trim commas and white space.
958
-	$formatted_address = array_filter( array_map( 'wpinv_trim_formatted_address_line', explode( "\n", $formatted_address ) ) );
958
+    $formatted_address = array_filter( array_map( 'wpinv_trim_formatted_address_line', explode( "\n", $formatted_address ) ) );
959 959
 
960 960
     // Add html breaks.
961
-	$formatted_address = implode( $separator, $formatted_address );
961
+    $formatted_address = implode( $separator, $formatted_address );
962 962
 
963
-	// We're done!
964
-	return $formatted_address;
963
+    // We're done!
964
+    return $formatted_address;
965 965
     
966 966
 }
967 967
 
@@ -1048,7 +1048,7 @@  discard block
 block discarded – undo
1048 1048
 
1049 1049
                     $item       = $item_id ? new WPInv_Item( $item_id ) : NULL;
1050 1050
                     $summary    = '';
1051
-	                $item_name    = '';
1051
+                    $item_name    = '';
1052 1052
                     $cols       = 3;
1053 1053
                     if ( !empty($item) ) {
1054 1054
                         $item_name  = $item->get_name();
@@ -1426,7 +1426,7 @@  discard block
 block discarded – undo
1426 1426
     $form_action  = esc_url( wpinv_get_checkout_uri() );
1427 1427
 
1428 1428
     ob_start();
1429
-	    do_action( 'wpinv_checkout_content_before' );
1429
+        do_action( 'wpinv_checkout_content_before' );
1430 1430
         echo '<div id="wpinv_checkout_wrap">';
1431 1431
 
1432 1432
         if ( wpinv_get_cart_contents() || wpinv_cart_has_fees() ) {
@@ -1449,7 +1449,7 @@  discard block
 block discarded – undo
1449 1449
             do_action( 'wpinv_cart_empty' );
1450 1450
         }
1451 1451
         echo '</div><!--end #wpinv_checkout_wrap-->';
1452
-	    do_action( 'wpinv_checkout_content_after' );
1452
+        do_action( 'wpinv_checkout_content_after' );
1453 1453
     return ob_get_clean();
1454 1454
 }
1455 1455
 
@@ -1476,7 +1476,7 @@  discard block
 block discarded – undo
1476 1476
 add_action( 'wpinv_checkout_cart', 'wpinv_checkout_cart', 10 );
1477 1477
 
1478 1478
 function wpinv_empty_cart_message() {
1479
-	return apply_filters( 'wpinv_empty_cart_message', '<span class="wpinv_empty_cart">' . __( 'Your cart is empty.', 'invoicing' ) . '</span>' );
1479
+    return apply_filters( 'wpinv_empty_cart_message', '<span class="wpinv_empty_cart">' . __( 'Your cart is empty.', 'invoicing' ) . '</span>' );
1480 1480
 }
1481 1481
 
1482 1482
 /**
@@ -1486,7 +1486,7 @@  discard block
 block discarded – undo
1486 1486
  * @return void
1487 1487
  */
1488 1488
 function wpinv_empty_checkout_cart() {
1489
-	echo wpinv_empty_cart_message();
1489
+    echo wpinv_empty_cart_message();
1490 1490
 }
1491 1491
 add_action( 'wpinv_cart_empty', 'wpinv_empty_checkout_cart' );
1492 1492
 
Please login to merge, or discard this patch.
includes/data/continents.php 1 patch
Indentation   +285 added lines, -285 removed lines patch added patch discarded remove patch
@@ -11,289 +11,289 @@
 block discarded – undo
11 11
 defined( 'ABSPATH' ) || exit;
12 12
 
13 13
 return array(
14
-	'AF' => array(
15
-		'name'      => __( 'Africa', 'invoicing' ),
16
-		'countries' => array(
17
-			'AO',
18
-			'BF',
19
-			'BI',
20
-			'BJ',
21
-			'BW',
22
-			'CD',
23
-			'CF',
24
-			'CG',
25
-			'CI',
26
-			'CM',
27
-			'CV',
28
-			'DJ',
29
-			'DZ',
30
-			'EG',
31
-			'EH',
32
-			'ER',
33
-			'ET',
34
-			'GA',
35
-			'GH',
36
-			'GM',
37
-			'GN',
38
-			'GQ',
39
-			'GW',
40
-			'KE',
41
-			'KM',
42
-			'LR',
43
-			'LS',
44
-			'LY',
45
-			'MA',
46
-			'MG',
47
-			'ML',
48
-			'MR',
49
-			'MU',
50
-			'MW',
51
-			'MZ',
52
-			'NA',
53
-			'NE',
54
-			'NG',
55
-			'RE',
56
-			'RW',
57
-			'SC',
58
-			'SD',
59
-			'SH',
60
-			'SL',
61
-			'SN',
62
-			'SO',
63
-			'SS',
64
-			'ST',
65
-			'SZ',
66
-			'TD',
67
-			'TG',
68
-			'TN',
69
-			'TZ',
70
-			'UG',
71
-			'YT',
72
-			'ZA',
73
-			'ZM',
74
-			'ZW',
75
-		),
76
-	),
77
-	'AN' => array(
78
-		'name'      => __( 'Antarctica', 'invoicing' ),
79
-		'countries' => array(
80
-			'AQ',
81
-			'BV',
82
-			'GS',
83
-			'HM',
84
-			'TF',
85
-		),
86
-	),
87
-	'AS' => array(
88
-		'name'      => __( 'Asia', 'invoicing' ),
89
-		'countries' => array(
90
-			'AE',
91
-			'AF',
92
-			'AM',
93
-			'AZ',
94
-			'BD',
95
-			'BH',
96
-			'BN',
97
-			'BT',
98
-			'CC',
99
-			'CN',
100
-			'CX',
101
-			'CY',
102
-			'GE',
103
-			'HK',
104
-			'ID',
105
-			'IL',
106
-			'IN',
107
-			'IO',
108
-			'IQ',
109
-			'IR',
110
-			'JO',
111
-			'JP',
112
-			'KG',
113
-			'KH',
114
-			'KP',
115
-			'KR',
116
-			'KW',
117
-			'KZ',
118
-			'LA',
119
-			'LB',
120
-			'LK',
121
-			'MM',
122
-			'MN',
123
-			'MO',
124
-			'MV',
125
-			'MY',
126
-			'NP',
127
-			'OM',
128
-			'PH',
129
-			'PK',
130
-			'PS',
131
-			'QA',
132
-			'SA',
133
-			'SG',
134
-			'SY',
135
-			'TH',
136
-			'TJ',
137
-			'TL',
138
-			'TM',
139
-			'TW',
140
-			'UZ',
141
-			'VN',
142
-			'YE',
143
-		),
144
-	),
145
-	'EU' => array(
146
-		'name'      => __( 'Europe', 'invoicing' ),
147
-		'countries' => array(
148
-			'AD',
149
-			'AL',
150
-			'AT',
151
-			'AX',
152
-			'BA',
153
-			'BE',
154
-			'BG',
155
-			'BY',
156
-			'CH',
157
-			'CY',
158
-			'CZ',
159
-			'DE',
160
-			'DK',
161
-			'EE',
162
-			'ES',
163
-			'FI',
164
-			'FO',
165
-			'FR',
166
-			'GB',
167
-			'GG',
168
-			'GI',
169
-			'GR',
170
-			'HR',
171
-			'HU',
172
-			'IE',
173
-			'IM',
174
-			'IS',
175
-			'IT',
176
-			'JE',
177
-			'LI',
178
-			'LT',
179
-			'LU',
180
-			'LV',
181
-			'MC',
182
-			'MD',
183
-			'ME',
184
-			'MK',
185
-			'MT',
186
-			'NL',
187
-			'NO',
188
-			'PL',
189
-			'PT',
190
-			'RO',
191
-			'RS',
192
-			'RU',
193
-			'SE',
194
-			'SI',
195
-			'SJ',
196
-			'SK',
197
-			'SM',
198
-			'TR',
199
-			'UA',
200
-			'VA',
201
-		),
202
-	),
203
-	'NA' => array(
204
-		'name'      => __( 'North America', 'invoicing' ),
205
-		'countries' => array(
206
-			'AG',
207
-			'AI',
208
-			'AW',
209
-			'BB',
210
-			'BL',
211
-			'BM',
212
-			'BQ',
213
-			'BS',
214
-			'BZ',
215
-			'CA',
216
-			'CR',
217
-			'CU',
218
-			'CW',
219
-			'DM',
220
-			'DO',
221
-			'GD',
222
-			'GL',
223
-			'GP',
224
-			'GT',
225
-			'HN',
226
-			'HT',
227
-			'JM',
228
-			'KN',
229
-			'KY',
230
-			'LC',
231
-			'MF',
232
-			'MQ',
233
-			'MS',
234
-			'MX',
235
-			'NI',
236
-			'PA',
237
-			'PM',
238
-			'PR',
239
-			'SV',
240
-			'SX',
241
-			'TC',
242
-			'TT',
243
-			'US',
244
-			'VC',
245
-			'VG',
246
-			'VI',
247
-		),
248
-	),
249
-	'OC' => array(
250
-		'name'      => __( 'Oceania', 'invoicing' ),
251
-		'countries' => array(
252
-			'AS',
253
-			'AU',
254
-			'CK',
255
-			'FJ',
256
-			'FM',
257
-			'GU',
258
-			'KI',
259
-			'MH',
260
-			'MP',
261
-			'NC',
262
-			'NF',
263
-			'NR',
264
-			'NU',
265
-			'NZ',
266
-			'PF',
267
-			'PG',
268
-			'PN',
269
-			'PW',
270
-			'SB',
271
-			'TK',
272
-			'TO',
273
-			'TV',
274
-			'UM',
275
-			'VU',
276
-			'WF',
277
-			'WS',
278
-		),
279
-	),
280
-	'SA' => array(
281
-		'name'      => __( 'South America', 'invoicing' ),
282
-		'countries' => array(
283
-			'AR',
284
-			'BO',
285
-			'BR',
286
-			'CL',
287
-			'CO',
288
-			'EC',
289
-			'FK',
290
-			'GF',
291
-			'GY',
292
-			'PE',
293
-			'PY',
294
-			'SR',
295
-			'UY',
296
-			'VE',
297
-		),
298
-	),
14
+    'AF' => array(
15
+        'name'      => __( 'Africa', 'invoicing' ),
16
+        'countries' => array(
17
+            'AO',
18
+            'BF',
19
+            'BI',
20
+            'BJ',
21
+            'BW',
22
+            'CD',
23
+            'CF',
24
+            'CG',
25
+            'CI',
26
+            'CM',
27
+            'CV',
28
+            'DJ',
29
+            'DZ',
30
+            'EG',
31
+            'EH',
32
+            'ER',
33
+            'ET',
34
+            'GA',
35
+            'GH',
36
+            'GM',
37
+            'GN',
38
+            'GQ',
39
+            'GW',
40
+            'KE',
41
+            'KM',
42
+            'LR',
43
+            'LS',
44
+            'LY',
45
+            'MA',
46
+            'MG',
47
+            'ML',
48
+            'MR',
49
+            'MU',
50
+            'MW',
51
+            'MZ',
52
+            'NA',
53
+            'NE',
54
+            'NG',
55
+            'RE',
56
+            'RW',
57
+            'SC',
58
+            'SD',
59
+            'SH',
60
+            'SL',
61
+            'SN',
62
+            'SO',
63
+            'SS',
64
+            'ST',
65
+            'SZ',
66
+            'TD',
67
+            'TG',
68
+            'TN',
69
+            'TZ',
70
+            'UG',
71
+            'YT',
72
+            'ZA',
73
+            'ZM',
74
+            'ZW',
75
+        ),
76
+    ),
77
+    'AN' => array(
78
+        'name'      => __( 'Antarctica', 'invoicing' ),
79
+        'countries' => array(
80
+            'AQ',
81
+            'BV',
82
+            'GS',
83
+            'HM',
84
+            'TF',
85
+        ),
86
+    ),
87
+    'AS' => array(
88
+        'name'      => __( 'Asia', 'invoicing' ),
89
+        'countries' => array(
90
+            'AE',
91
+            'AF',
92
+            'AM',
93
+            'AZ',
94
+            'BD',
95
+            'BH',
96
+            'BN',
97
+            'BT',
98
+            'CC',
99
+            'CN',
100
+            'CX',
101
+            'CY',
102
+            'GE',
103
+            'HK',
104
+            'ID',
105
+            'IL',
106
+            'IN',
107
+            'IO',
108
+            'IQ',
109
+            'IR',
110
+            'JO',
111
+            'JP',
112
+            'KG',
113
+            'KH',
114
+            'KP',
115
+            'KR',
116
+            'KW',
117
+            'KZ',
118
+            'LA',
119
+            'LB',
120
+            'LK',
121
+            'MM',
122
+            'MN',
123
+            'MO',
124
+            'MV',
125
+            'MY',
126
+            'NP',
127
+            'OM',
128
+            'PH',
129
+            'PK',
130
+            'PS',
131
+            'QA',
132
+            'SA',
133
+            'SG',
134
+            'SY',
135
+            'TH',
136
+            'TJ',
137
+            'TL',
138
+            'TM',
139
+            'TW',
140
+            'UZ',
141
+            'VN',
142
+            'YE',
143
+        ),
144
+    ),
145
+    'EU' => array(
146
+        'name'      => __( 'Europe', 'invoicing' ),
147
+        'countries' => array(
148
+            'AD',
149
+            'AL',
150
+            'AT',
151
+            'AX',
152
+            'BA',
153
+            'BE',
154
+            'BG',
155
+            'BY',
156
+            'CH',
157
+            'CY',
158
+            'CZ',
159
+            'DE',
160
+            'DK',
161
+            'EE',
162
+            'ES',
163
+            'FI',
164
+            'FO',
165
+            'FR',
166
+            'GB',
167
+            'GG',
168
+            'GI',
169
+            'GR',
170
+            'HR',
171
+            'HU',
172
+            'IE',
173
+            'IM',
174
+            'IS',
175
+            'IT',
176
+            'JE',
177
+            'LI',
178
+            'LT',
179
+            'LU',
180
+            'LV',
181
+            'MC',
182
+            'MD',
183
+            'ME',
184
+            'MK',
185
+            'MT',
186
+            'NL',
187
+            'NO',
188
+            'PL',
189
+            'PT',
190
+            'RO',
191
+            'RS',
192
+            'RU',
193
+            'SE',
194
+            'SI',
195
+            'SJ',
196
+            'SK',
197
+            'SM',
198
+            'TR',
199
+            'UA',
200
+            'VA',
201
+        ),
202
+    ),
203
+    'NA' => array(
204
+        'name'      => __( 'North America', 'invoicing' ),
205
+        'countries' => array(
206
+            'AG',
207
+            'AI',
208
+            'AW',
209
+            'BB',
210
+            'BL',
211
+            'BM',
212
+            'BQ',
213
+            'BS',
214
+            'BZ',
215
+            'CA',
216
+            'CR',
217
+            'CU',
218
+            'CW',
219
+            'DM',
220
+            'DO',
221
+            'GD',
222
+            'GL',
223
+            'GP',
224
+            'GT',
225
+            'HN',
226
+            'HT',
227
+            'JM',
228
+            'KN',
229
+            'KY',
230
+            'LC',
231
+            'MF',
232
+            'MQ',
233
+            'MS',
234
+            'MX',
235
+            'NI',
236
+            'PA',
237
+            'PM',
238
+            'PR',
239
+            'SV',
240
+            'SX',
241
+            'TC',
242
+            'TT',
243
+            'US',
244
+            'VC',
245
+            'VG',
246
+            'VI',
247
+        ),
248
+    ),
249
+    'OC' => array(
250
+        'name'      => __( 'Oceania', 'invoicing' ),
251
+        'countries' => array(
252
+            'AS',
253
+            'AU',
254
+            'CK',
255
+            'FJ',
256
+            'FM',
257
+            'GU',
258
+            'KI',
259
+            'MH',
260
+            'MP',
261
+            'NC',
262
+            'NF',
263
+            'NR',
264
+            'NU',
265
+            'NZ',
266
+            'PF',
267
+            'PG',
268
+            'PN',
269
+            'PW',
270
+            'SB',
271
+            'TK',
272
+            'TO',
273
+            'TV',
274
+            'UM',
275
+            'VU',
276
+            'WF',
277
+            'WS',
278
+        ),
279
+    ),
280
+    'SA' => array(
281
+        'name'      => __( 'South America', 'invoicing' ),
282
+        'countries' => array(
283
+            'AR',
284
+            'BO',
285
+            'BR',
286
+            'CL',
287
+            'CO',
288
+            'EC',
289
+            'FK',
290
+            'GF',
291
+            'GY',
292
+            'PE',
293
+            'PY',
294
+            'SR',
295
+            'UY',
296
+            'VE',
297
+        ),
298
+    ),
299 299
 );
Please login to merge, or discard this patch.
includes/data/states.php 1 patch
Indentation   +1531 added lines, -1531 removed lines patch added patch discarded remove patch
@@ -14,1537 +14,1537 @@
 block discarded – undo
14 14
 defined( 'ABSPATH' ) || exit;
15 15
 
16 16
 return array(
17
-	'AF' => array(),
18
-	'AO' => array( // Angola states.
19
-		'BGO' => __( 'Bengo', 'invoicing' ),
20
-		'BLU' => __( 'Benguela', 'invoicing' ),
21
-		'BIE' => __( 'Bié', 'invoicing' ),
22
-		'CAB' => __( 'Cabinda', 'invoicing' ),
23
-		'CNN' => __( 'Cunene', 'invoicing' ),
24
-		'HUA' => __( 'Huambo', 'invoicing' ),
25
-		'HUI' => __( 'Huíla', 'invoicing' ),
26
-		'CCU' => __( 'Kuando Kubango', 'invoicing' ),
27
-		'CNO' => __( 'Kwanza-Norte', 'invoicing' ),
28
-		'CUS' => __( 'Kwanza-Sul', 'invoicing' ),
29
-		'LUA' => __( 'Luanda', 'invoicing' ),
30
-		'LNO' => __( 'Lunda-Norte', 'invoicing' ),
31
-		'LSU' => __( 'Lunda-Sul', 'invoicing' ),
32
-		'MAL' => __( 'Malanje', 'invoicing' ),
33
-		'MOX' => __( 'Moxico', 'invoicing' ),
34
-		'NAM' => __( 'Namibe', 'invoicing' ),
35
-		'UIG' => __( 'Uíge', 'invoicing' ),
36
-		'ZAI' => __( 'Zaire', 'invoicing' ),
37
-	),
38
-	'AR' => array( // Argentinian provinces.
39
-		'C' => __( 'Ciudad Aut&oacute;noma de Buenos Aires', 'invoicing' ),
40
-		'B' => __( 'Buenos Aires', 'invoicing' ),
41
-		'K' => __( 'Catamarca', 'invoicing' ),
42
-		'H' => __( 'Chaco', 'invoicing' ),
43
-		'U' => __( 'Chubut', 'invoicing' ),
44
-		'X' => __( 'C&oacute;rdoba', 'invoicing' ),
45
-		'W' => __( 'Corrientes', 'invoicing' ),
46
-		'E' => __( 'Entre R&iacute;os', 'invoicing' ),
47
-		'P' => __( 'Formosa', 'invoicing' ),
48
-		'Y' => __( 'Jujuy', 'invoicing' ),
49
-		'L' => __( 'La Pampa', 'invoicing' ),
50
-		'F' => __( 'La Rioja', 'invoicing' ),
51
-		'M' => __( 'Mendoza', 'invoicing' ),
52
-		'N' => __( 'Misiones', 'invoicing' ),
53
-		'Q' => __( 'Neuqu&eacute;n', 'invoicing' ),
54
-		'R' => __( 'R&iacute;o Negro', 'invoicing' ),
55
-		'A' => __( 'Salta', 'invoicing' ),
56
-		'J' => __( 'San Juan', 'invoicing' ),
57
-		'D' => __( 'San Luis', 'invoicing' ),
58
-		'Z' => __( 'Santa Cruz', 'invoicing' ),
59
-		'S' => __( 'Santa Fe', 'invoicing' ),
60
-		'G' => __( 'Santiago del Estero', 'invoicing' ),
61
-		'V' => __( 'Tierra del Fuego', 'invoicing' ),
62
-		'T' => __( 'Tucum&aacute;n', 'invoicing' ),
63
-	),
64
-	'AT' => array(),
65
-	'AU' => array( // Australian states.
66
-		'ACT' => __( 'Australian Capital Territory', 'invoicing' ),
67
-		'NSW' => __( 'New South Wales', 'invoicing' ),
68
-		'NT'  => __( 'Northern Territory', 'invoicing' ),
69
-		'QLD' => __( 'Queensland', 'invoicing' ),
70
-		'SA'  => __( 'South Australia', 'invoicing' ),
71
-		'TAS' => __( 'Tasmania', 'invoicing' ),
72
-		'VIC' => __( 'Victoria', 'invoicing' ),
73
-		'WA'  => __( 'Western Australia', 'invoicing' ),
74
-	),
75
-	'AX' => array(),
76
-	'BD' => array( // Bangladeshi states (districts).
77
-		'BD-05' => __( 'Bagerhat', 'invoicing' ),
78
-		'BD-01' => __( 'Bandarban', 'invoicing' ),
79
-		'BD-02' => __( 'Barguna', 'invoicing' ),
80
-		'BD-06' => __( 'Barishal', 'invoicing' ),
81
-		'BD-07' => __( 'Bhola', 'invoicing' ),
82
-		'BD-03' => __( 'Bogura', 'invoicing' ),
83
-		'BD-04' => __( 'Brahmanbaria', 'invoicing' ),
84
-		'BD-09' => __( 'Chandpur', 'invoicing' ),
85
-		'BD-10' => __( 'Chattogram', 'invoicing' ),
86
-		'BD-12' => __( 'Chuadanga', 'invoicing' ),
87
-		'BD-11' => __( "Cox's Bazar", 'invoicing' ),
88
-		'BD-08' => __( 'Cumilla', 'invoicing' ),
89
-		'BD-13' => __( 'Dhaka', 'invoicing' ),
90
-		'BD-14' => __( 'Dinajpur', 'invoicing' ),
91
-		'BD-15' => __( 'Faridpur ', 'invoicing' ),
92
-		'BD-16' => __( 'Feni', 'invoicing' ),
93
-		'BD-19' => __( 'Gaibandha', 'invoicing' ),
94
-		'BD-18' => __( 'Gazipur', 'invoicing' ),
95
-		'BD-17' => __( 'Gopalganj', 'invoicing' ),
96
-		'BD-20' => __( 'Habiganj', 'invoicing' ),
97
-		'BD-21' => __( 'Jamalpur', 'invoicing' ),
98
-		'BD-22' => __( 'Jashore', 'invoicing' ),
99
-		'BD-25' => __( 'Jhalokati', 'invoicing' ),
100
-		'BD-23' => __( 'Jhenaidah', 'invoicing' ),
101
-		'BD-24' => __( 'Joypurhat', 'invoicing' ),
102
-		'BD-29' => __( 'Khagrachhari', 'invoicing' ),
103
-		'BD-27' => __( 'Khulna', 'invoicing' ),
104
-		'BD-26' => __( 'Kishoreganj', 'invoicing' ),
105
-		'BD-28' => __( 'Kurigram', 'invoicing' ),
106
-		'BD-30' => __( 'Kushtia', 'invoicing' ),
107
-		'BD-31' => __( 'Lakshmipur', 'invoicing' ),
108
-		'BD-32' => __( 'Lalmonirhat', 'invoicing' ),
109
-		'BD-36' => __( 'Madaripur', 'invoicing' ),
110
-		'BD-37' => __( 'Magura', 'invoicing' ),
111
-		'BD-33' => __( 'Manikganj ', 'invoicing' ),
112
-		'BD-39' => __( 'Meherpur', 'invoicing' ),
113
-		'BD-38' => __( 'Moulvibazar', 'invoicing' ),
114
-		'BD-35' => __( 'Munshiganj', 'invoicing' ),
115
-		'BD-34' => __( 'Mymensingh', 'invoicing' ),
116
-		'BD-48' => __( 'Naogaon', 'invoicing' ),
117
-		'BD-43' => __( 'Narail', 'invoicing' ),
118
-		'BD-40' => __( 'Narayanganj', 'invoicing' ),
119
-		'BD-42' => __( 'Narsingdi', 'invoicing' ),
120
-		'BD-44' => __( 'Natore', 'invoicing' ),
121
-		'BD-45' => __( 'Nawabganj', 'invoicing' ),
122
-		'BD-41' => __( 'Netrakona', 'invoicing' ),
123
-		'BD-46' => __( 'Nilphamari', 'invoicing' ),
124
-		'BD-47' => __( 'Noakhali', 'invoicing' ),
125
-		'BD-49' => __( 'Pabna', 'invoicing' ),
126
-		'BD-52' => __( 'Panchagarh', 'invoicing' ),
127
-		'BD-51' => __( 'Patuakhali', 'invoicing' ),
128
-		'BD-50' => __( 'Pirojpur', 'invoicing' ),
129
-		'BD-53' => __( 'Rajbari', 'invoicing' ),
130
-		'BD-54' => __( 'Rajshahi', 'invoicing' ),
131
-		'BD-56' => __( 'Rangamati', 'invoicing' ),
132
-		'BD-55' => __( 'Rangpur', 'invoicing' ),
133
-		'BD-58' => __( 'Satkhira', 'invoicing' ),
134
-		'BD-62' => __( 'Shariatpur', 'invoicing' ),
135
-		'BD-57' => __( 'Sherpur', 'invoicing' ),
136
-		'BD-59' => __( 'Sirajganj', 'invoicing' ),
137
-		'BD-61' => __( 'Sunamganj', 'invoicing' ),
138
-		'BD-60' => __( 'Sylhet', 'invoicing' ),
139
-		'BD-63' => __( 'Tangail', 'invoicing' ),
140
-		'BD-64' => __( 'Thakurgaon', 'invoicing' ),
141
-	),
142
-	'BE' => array(),
143
-	'BG' => array( // Bulgarian states.
144
-		'BG-01' => __( 'Blagoevgrad', 'invoicing' ),
145
-		'BG-02' => __( 'Burgas', 'invoicing' ),
146
-		'BG-08' => __( 'Dobrich', 'invoicing' ),
147
-		'BG-07' => __( 'Gabrovo', 'invoicing' ),
148
-		'BG-26' => __( 'Haskovo', 'invoicing' ),
149
-		'BG-09' => __( 'Kardzhali', 'invoicing' ),
150
-		'BG-10' => __( 'Kyustendil', 'invoicing' ),
151
-		'BG-11' => __( 'Lovech', 'invoicing' ),
152
-		'BG-12' => __( 'Montana', 'invoicing' ),
153
-		'BG-13' => __( 'Pazardzhik', 'invoicing' ),
154
-		'BG-14' => __( 'Pernik', 'invoicing' ),
155
-		'BG-15' => __( 'Pleven', 'invoicing' ),
156
-		'BG-16' => __( 'Plovdiv', 'invoicing' ),
157
-		'BG-17' => __( 'Razgrad', 'invoicing' ),
158
-		'BG-18' => __( 'Ruse', 'invoicing' ),
159
-		'BG-27' => __( 'Shumen', 'invoicing' ),
160
-		'BG-19' => __( 'Silistra', 'invoicing' ),
161
-		'BG-20' => __( 'Sliven', 'invoicing' ),
162
-		'BG-21' => __( 'Smolyan', 'invoicing' ),
163
-		'BG-23' => __( 'Sofia', 'invoicing' ),
164
-		'BG-22' => __( 'Sofia-Grad', 'invoicing' ),
165
-		'BG-24' => __( 'Stara Zagora', 'invoicing' ),
166
-		'BG-25' => __( 'Targovishte', 'invoicing' ),
167
-		'BG-03' => __( 'Varna', 'invoicing' ),
168
-		'BG-04' => __( 'Veliko Tarnovo', 'invoicing' ),
169
-		'BG-05' => __( 'Vidin', 'invoicing' ),
170
-		'BG-06' => __( 'Vratsa', 'invoicing' ),
171
-		'BG-28' => __( 'Yambol', 'invoicing' ),
172
-	),
173
-	'BH' => array(),
174
-	'BI' => array(),
175
-	'BO' => array( // Bolivian states.
176
-		'B' => __( 'Chuquisaca', 'invoicing' ),
177
-		'H' => __( 'Beni', 'invoicing' ),
178
-		'C' => __( 'Cochabamba', 'invoicing' ),
179
-		'L' => __( 'La Paz', 'invoicing' ),
180
-		'O' => __( 'Oruro', 'invoicing' ),
181
-		'N' => __( 'Pando', 'invoicing' ),
182
-		'P' => __( 'Potosí', 'invoicing' ),
183
-		'S' => __( 'Santa Cruz', 'invoicing' ),
184
-		'T' => __( 'Tarija', 'invoicing' ),
185
-	),
186
-	'BR' => array( // Brazillian states.
187
-		'AC' => __( 'Acre', 'invoicing' ),
188
-		'AL' => __( 'Alagoas', 'invoicing' ),
189
-		'AP' => __( 'Amap&aacute;', 'invoicing' ),
190
-		'AM' => __( 'Amazonas', 'invoicing' ),
191
-		'BA' => __( 'Bahia', 'invoicing' ),
192
-		'CE' => __( 'Cear&aacute;', 'invoicing' ),
193
-		'DF' => __( 'Distrito Federal', 'invoicing' ),
194
-		'ES' => __( 'Esp&iacute;rito Santo', 'invoicing' ),
195
-		'GO' => __( 'Goi&aacute;s', 'invoicing' ),
196
-		'MA' => __( 'Maranh&atilde;o', 'invoicing' ),
197
-		'MT' => __( 'Mato Grosso', 'invoicing' ),
198
-		'MS' => __( 'Mato Grosso do Sul', 'invoicing' ),
199
-		'MG' => __( 'Minas Gerais', 'invoicing' ),
200
-		'PA' => __( 'Par&aacute;', 'invoicing' ),
201
-		'PB' => __( 'Para&iacute;ba', 'invoicing' ),
202
-		'PR' => __( 'Paran&aacute;', 'invoicing' ),
203
-		'PE' => __( 'Pernambuco', 'invoicing' ),
204
-		'PI' => __( 'Piau&iacute;', 'invoicing' ),
205
-		'RJ' => __( 'Rio de Janeiro', 'invoicing' ),
206
-		'RN' => __( 'Rio Grande do Norte', 'invoicing' ),
207
-		'RS' => __( 'Rio Grande do Sul', 'invoicing' ),
208
-		'RO' => __( 'Rond&ocirc;nia', 'invoicing' ),
209
-		'RR' => __( 'Roraima', 'invoicing' ),
210
-		'SC' => __( 'Santa Catarina', 'invoicing' ),
211
-		'SP' => __( 'S&atilde;o Paulo', 'invoicing' ),
212
-		'SE' => __( 'Sergipe', 'invoicing' ),
213
-		'TO' => __( 'Tocantins', 'invoicing' ),
214
-	),
215
-	'CA' => array( // Canadian states.
216
-		'AB' => __( 'Alberta', 'invoicing' ),
217
-		'BC' => __( 'British Columbia', 'invoicing' ),
218
-		'MB' => __( 'Manitoba', 'invoicing' ),
219
-		'NB' => __( 'New Brunswick', 'invoicing' ),
220
-		'NL' => __( 'Newfoundland and Labrador', 'invoicing' ),
221
-		'NT' => __( 'Northwest Territories', 'invoicing' ),
222
-		'NS' => __( 'Nova Scotia', 'invoicing' ),
223
-		'NU' => __( 'Nunavut', 'invoicing' ),
224
-		'ON' => __( 'Ontario', 'invoicing' ),
225
-		'PE' => __( 'Prince Edward Island', 'invoicing' ),
226
-		'QC' => __( 'Quebec', 'invoicing' ),
227
-		'SK' => __( 'Saskatchewan', 'invoicing' ),
228
-		'YT' => __( 'Yukon Territory', 'invoicing' ),
229
-	),
230
-	'CH' => array( // Cantons of Switzerland.
231
-		'AG' => __( 'Aargau', 'invoicing' ),
232
-		'AR' => __( 'Appenzell Ausserrhoden', 'invoicing' ),
233
-		'AI' => __( 'Appenzell Innerrhoden', 'invoicing' ),
234
-		'BL' => __( 'Basel-Landschaft', 'invoicing' ),
235
-		'BS' => __( 'Basel-Stadt', 'invoicing' ),
236
-		'BE' => __( 'Bern', 'invoicing' ),
237
-		'FR' => __( 'Fribourg', 'invoicing' ),
238
-		'GE' => __( 'Geneva', 'invoicing' ),
239
-		'GL' => __( 'Glarus', 'invoicing' ),
240
-		'GR' => __( 'Graub&uuml;nden', 'invoicing' ),
241
-		'JU' => __( 'Jura', 'invoicing' ),
242
-		'LU' => __( 'Luzern', 'invoicing' ),
243
-		'NE' => __( 'Neuch&acirc;tel', 'invoicing' ),
244
-		'NW' => __( 'Nidwalden', 'invoicing' ),
245
-		'OW' => __( 'Obwalden', 'invoicing' ),
246
-		'SH' => __( 'Schaffhausen', 'invoicing' ),
247
-		'SZ' => __( 'Schwyz', 'invoicing' ),
248
-		'SO' => __( 'Solothurn', 'invoicing' ),
249
-		'SG' => __( 'St. Gallen', 'invoicing' ),
250
-		'TG' => __( 'Thurgau', 'invoicing' ),
251
-		'TI' => __( 'Ticino', 'invoicing' ),
252
-		'UR' => __( 'Uri', 'invoicing' ),
253
-		'VS' => __( 'Valais', 'invoicing' ),
254
-		'VD' => __( 'Vaud', 'invoicing' ),
255
-		'ZG' => __( 'Zug', 'invoicing' ),
256
-		'ZH' => __( 'Z&uuml;rich', 'invoicing' ),
257
-	),
258
-	'CN' => array( // Chinese states.
259
-		'CN1'  => __( 'Yunnan / &#20113;&#21335;', 'invoicing' ),
260
-		'CN2'  => __( 'Beijing / &#21271;&#20140;', 'invoicing' ),
261
-		'CN3'  => __( 'Tianjin / &#22825;&#27941;', 'invoicing' ),
262
-		'CN4'  => __( 'Hebei / &#27827;&#21271;', 'invoicing' ),
263
-		'CN5'  => __( 'Shanxi / &#23665;&#35199;', 'invoicing' ),
264
-		'CN6'  => __( 'Inner Mongolia / &#20839;&#33945;&#21476;', 'invoicing' ),
265
-		'CN7'  => __( 'Liaoning / &#36797;&#23425;', 'invoicing' ),
266
-		'CN8'  => __( 'Jilin / &#21513;&#26519;', 'invoicing' ),
267
-		'CN9'  => __( 'Heilongjiang / &#40657;&#40857;&#27743;', 'invoicing' ),
268
-		'CN10' => __( 'Shanghai / &#19978;&#28023;', 'invoicing' ),
269
-		'CN11' => __( 'Jiangsu / &#27743;&#33487;', 'invoicing' ),
270
-		'CN12' => __( 'Zhejiang / &#27993;&#27743;', 'invoicing' ),
271
-		'CN13' => __( 'Anhui / &#23433;&#24509;', 'invoicing' ),
272
-		'CN14' => __( 'Fujian / &#31119;&#24314;', 'invoicing' ),
273
-		'CN15' => __( 'Jiangxi / &#27743;&#35199;', 'invoicing' ),
274
-		'CN16' => __( 'Shandong / &#23665;&#19996;', 'invoicing' ),
275
-		'CN17' => __( 'Henan / &#27827;&#21335;', 'invoicing' ),
276
-		'CN18' => __( 'Hubei / &#28246;&#21271;', 'invoicing' ),
277
-		'CN19' => __( 'Hunan / &#28246;&#21335;', 'invoicing' ),
278
-		'CN20' => __( 'Guangdong / &#24191;&#19996;', 'invoicing' ),
279
-		'CN21' => __( 'Guangxi Zhuang / &#24191;&#35199;&#22766;&#26063;', 'invoicing' ),
280
-		'CN22' => __( 'Hainan / &#28023;&#21335;', 'invoicing' ),
281
-		'CN23' => __( 'Chongqing / &#37325;&#24198;', 'invoicing' ),
282
-		'CN24' => __( 'Sichuan / &#22235;&#24029;', 'invoicing' ),
283
-		'CN25' => __( 'Guizhou / &#36149;&#24030;', 'invoicing' ),
284
-		'CN26' => __( 'Shaanxi / &#38485;&#35199;', 'invoicing' ),
285
-		'CN27' => __( 'Gansu / &#29976;&#32899;', 'invoicing' ),
286
-		'CN28' => __( 'Qinghai / &#38738;&#28023;', 'invoicing' ),
287
-		'CN29' => __( 'Ningxia Hui / &#23425;&#22799;', 'invoicing' ),
288
-		'CN30' => __( 'Macao / &#28595;&#38376;', 'invoicing' ),
289
-		'CN31' => __( 'Tibet / &#35199;&#34255;', 'invoicing' ),
290
-		'CN32' => __( 'Xinjiang / &#26032;&#30086;', 'invoicing' ),
291
-	),
292
-	'CZ' => array(),
293
-	'DE' => array(),
294
-	'DK' => array(),
295
-	'EE' => array(),
296
-	'ES' => array( // Spanish states.
297
-		'C'  => __( 'A Coru&ntilde;a', 'invoicing' ),
298
-		'VI' => __( 'Araba/&Aacute;lava', 'invoicing' ),
299
-		'AB' => __( 'Albacete', 'invoicing' ),
300
-		'A'  => __( 'Alicante', 'invoicing' ),
301
-		'AL' => __( 'Almer&iacute;a', 'invoicing' ),
302
-		'O'  => __( 'Asturias', 'invoicing' ),
303
-		'AV' => __( '&Aacute;vila', 'invoicing' ),
304
-		'BA' => __( 'Badajoz', 'invoicing' ),
305
-		'PM' => __( 'Baleares', 'invoicing' ),
306
-		'B'  => __( 'Barcelona', 'invoicing' ),
307
-		'BU' => __( 'Burgos', 'invoicing' ),
308
-		'CC' => __( 'C&aacute;ceres', 'invoicing' ),
309
-		'CA' => __( 'C&aacute;diz', 'invoicing' ),
310
-		'S'  => __( 'Cantabria', 'invoicing' ),
311
-		'CS' => __( 'Castell&oacute;n', 'invoicing' ),
312
-		'CE' => __( 'Ceuta', 'invoicing' ),
313
-		'CR' => __( 'Ciudad Real', 'invoicing' ),
314
-		'CO' => __( 'C&oacute;rdoba', 'invoicing' ),
315
-		'CU' => __( 'Cuenca', 'invoicing' ),
316
-		'GI' => __( 'Girona', 'invoicing' ),
317
-		'GR' => __( 'Granada', 'invoicing' ),
318
-		'GU' => __( 'Guadalajara', 'invoicing' ),
319
-		'SS' => __( 'Gipuzkoa', 'invoicing' ),
320
-		'H'  => __( 'Huelva', 'invoicing' ),
321
-		'HU' => __( 'Huesca', 'invoicing' ),
322
-		'J'  => __( 'Ja&eacute;n', 'invoicing' ),
323
-		'LO' => __( 'La Rioja', 'invoicing' ),
324
-		'GC' => __( 'Las Palmas', 'invoicing' ),
325
-		'LE' => __( 'Le&oacute;n', 'invoicing' ),
326
-		'L'  => __( 'Lleida', 'invoicing' ),
327
-		'LU' => __( 'Lugo', 'invoicing' ),
328
-		'M'  => __( 'Madrid', 'invoicing' ),
329
-		'MA' => __( 'M&aacute;laga', 'invoicing' ),
330
-		'ML' => __( 'Melilla', 'invoicing' ),
331
-		'MU' => __( 'Murcia', 'invoicing' ),
332
-		'NA' => __( 'Navarra', 'invoicing' ),
333
-		'OR' => __( 'Ourense', 'invoicing' ),
334
-		'P'  => __( 'Palencia', 'invoicing' ),
335
-		'PO' => __( 'Pontevedra', 'invoicing' ),
336
-		'SA' => __( 'Salamanca', 'invoicing' ),
337
-		'TF' => __( 'Santa Cruz de Tenerife', 'invoicing' ),
338
-		'SG' => __( 'Segovia', 'invoicing' ),
339
-		'SE' => __( 'Sevilla', 'invoicing' ),
340
-		'SO' => __( 'Soria', 'invoicing' ),
341
-		'T'  => __( 'Tarragona', 'invoicing' ),
342
-		'TE' => __( 'Teruel', 'invoicing' ),
343
-		'TO' => __( 'Toledo', 'invoicing' ),
344
-		'V'  => __( 'Valencia', 'invoicing' ),
345
-		'VA' => __( 'Valladolid', 'invoicing' ),
346
-		'BI' => __( 'Bizkaia', 'invoicing' ),
347
-		'ZA' => __( 'Zamora', 'invoicing' ),
348
-		'Z'  => __( 'Zaragoza', 'invoicing' ),
349
-	),
350
-	'FI' => array(),
351
-	'FR' => array(),
352
-	'GP' => array(),
353
-	'GR' => array( // Greek Regions.
354
-		'I' => __( 'Αττική', 'invoicing' ),
355
-		'A' => __( 'Ανατολική Μακεδονία και Θράκη', 'invoicing' ),
356
-		'B' => __( 'Κεντρική Μακεδονία', 'invoicing' ),
357
-		'C' => __( 'Δυτική Μακεδονία', 'invoicing' ),
358
-		'D' => __( 'Ήπειρος', 'invoicing' ),
359
-		'E' => __( 'Θεσσαλία', 'invoicing' ),
360
-		'F' => __( 'Ιόνιοι Νήσοι', 'invoicing' ),
361
-		'G' => __( 'Δυτική Ελλάδα', 'invoicing' ),
362
-		'H' => __( 'Στερεά Ελλάδα', 'invoicing' ),
363
-		'J' => __( 'Πελοπόννησος', 'invoicing' ),
364
-		'K' => __( 'Βόρειο Αιγαίο', 'invoicing' ),
365
-		'L' => __( 'Νότιο Αιγαίο', 'invoicing' ),
366
-		'M' => __( 'Κρήτη', 'invoicing' ),
367
-	),
368
-	'GF' => array(),
369
-	'HK' => array( // Hong Kong states.
370
-		'HONG KONG'       => __( 'Hong Kong Island', 'invoicing' ),
371
-		'KOWLOON'         => __( 'Kowloon', 'invoicing' ),
372
-		'NEW TERRITORIES' => __( 'New Territories', 'invoicing' ),
373
-	),
374
-	'HU' => array( // Hungary states.
375
-		'BK' => __( 'Bács-Kiskun', 'invoicing' ),
376
-		'BE' => __( 'Békés', 'invoicing' ),
377
-		'BA' => __( 'Baranya', 'invoicing' ),
378
-		'BZ' => __( 'Borsod-Abaúj-Zemplén', 'invoicing' ),
379
-		'BU' => __( 'Budapest', 'invoicing' ),
380
-		'CS' => __( 'Csongrád', 'invoicing' ),
381
-		'FE' => __( 'Fejér', 'invoicing' ),
382
-		'GS' => __( 'Győr-Moson-Sopron', 'invoicing' ),
383
-		'HB' => __( 'Hajdú-Bihar', 'invoicing' ),
384
-		'HE' => __( 'Heves', 'invoicing' ),
385
-		'JN' => __( 'Jász-Nagykun-Szolnok', 'invoicing' ),
386
-		'KE' => __( 'Komárom-Esztergom', 'invoicing' ),
387
-		'NO' => __( 'Nógrád', 'invoicing' ),
388
-		'PE' => __( 'Pest', 'invoicing' ),
389
-		'SO' => __( 'Somogy', 'invoicing' ),
390
-		'SZ' => __( 'Szabolcs-Szatmár-Bereg', 'invoicing' ),
391
-		'TO' => __( 'Tolna', 'invoicing' ),
392
-		'VA' => __( 'Vas', 'invoicing' ),
393
-		'VE' => __( 'Veszprém', 'invoicing' ),
394
-		'ZA' => __( 'Zala', 'invoicing' ),
395
-	),
396
-	'ID' => array( // Indonesia Provinces.
397
-		'AC' => __( 'Daerah Istimewa Aceh', 'invoicing' ),
398
-		'SU' => __( 'Sumatera Utara', 'invoicing' ),
399
-		'SB' => __( 'Sumatera Barat', 'invoicing' ),
400
-		'RI' => __( 'Riau', 'invoicing' ),
401
-		'KR' => __( 'Kepulauan Riau', 'invoicing' ),
402
-		'JA' => __( 'Jambi', 'invoicing' ),
403
-		'SS' => __( 'Sumatera Selatan', 'invoicing' ),
404
-		'BB' => __( 'Bangka Belitung', 'invoicing' ),
405
-		'BE' => __( 'Bengkulu', 'invoicing' ),
406
-		'LA' => __( 'Lampung', 'invoicing' ),
407
-		'JK' => __( 'DKI Jakarta', 'invoicing' ),
408
-		'JB' => __( 'Jawa Barat', 'invoicing' ),
409
-		'BT' => __( 'Banten', 'invoicing' ),
410
-		'JT' => __( 'Jawa Tengah', 'invoicing' ),
411
-		'JI' => __( 'Jawa Timur', 'invoicing' ),
412
-		'YO' => __( 'Daerah Istimewa Yogyakarta', 'invoicing' ),
413
-		'BA' => __( 'Bali', 'invoicing' ),
414
-		'NB' => __( 'Nusa Tenggara Barat', 'invoicing' ),
415
-		'NT' => __( 'Nusa Tenggara Timur', 'invoicing' ),
416
-		'KB' => __( 'Kalimantan Barat', 'invoicing' ),
417
-		'KT' => __( 'Kalimantan Tengah', 'invoicing' ),
418
-		'KI' => __( 'Kalimantan Timur', 'invoicing' ),
419
-		'KS' => __( 'Kalimantan Selatan', 'invoicing' ),
420
-		'KU' => __( 'Kalimantan Utara', 'invoicing' ),
421
-		'SA' => __( 'Sulawesi Utara', 'invoicing' ),
422
-		'ST' => __( 'Sulawesi Tengah', 'invoicing' ),
423
-		'SG' => __( 'Sulawesi Tenggara', 'invoicing' ),
424
-		'SR' => __( 'Sulawesi Barat', 'invoicing' ),
425
-		'SN' => __( 'Sulawesi Selatan', 'invoicing' ),
426
-		'GO' => __( 'Gorontalo', 'invoicing' ),
427
-		'MA' => __( 'Maluku', 'invoicing' ),
428
-		'MU' => __( 'Maluku Utara', 'invoicing' ),
429
-		'PA' => __( 'Papua', 'invoicing' ),
430
-		'PB' => __( 'Papua Barat', 'invoicing' ),
431
-	),
432
-	'IE' => array( // Republic of Ireland.
433
-		'CW' => __( 'Carlow', 'invoicing' ),
434
-		'CN' => __( 'Cavan', 'invoicing' ),
435
-		'CE' => __( 'Clare', 'invoicing' ),
436
-		'CO' => __( 'Cork', 'invoicing' ),
437
-		'DL' => __( 'Donegal', 'invoicing' ),
438
-		'D'  => __( 'Dublin', 'invoicing' ),
439
-		'G'  => __( 'Galway', 'invoicing' ),
440
-		'KY' => __( 'Kerry', 'invoicing' ),
441
-		'KE' => __( 'Kildare', 'invoicing' ),
442
-		'KK' => __( 'Kilkenny', 'invoicing' ),
443
-		'LS' => __( 'Laois', 'invoicing' ),
444
-		'LM' => __( 'Leitrim', 'invoicing' ),
445
-		'LK' => __( 'Limerick', 'invoicing' ),
446
-		'LD' => __( 'Longford', 'invoicing' ),
447
-		'LH' => __( 'Louth', 'invoicing' ),
448
-		'MO' => __( 'Mayo', 'invoicing' ),
449
-		'MH' => __( 'Meath', 'invoicing' ),
450
-		'MN' => __( 'Monaghan', 'invoicing' ),
451
-		'OY' => __( 'Offaly', 'invoicing' ),
452
-		'RN' => __( 'Roscommon', 'invoicing' ),
453
-		'SO' => __( 'Sligo', 'invoicing' ),
454
-		'TA' => __( 'Tipperary', 'invoicing' ),
455
-		'WD' => __( 'Waterford', 'invoicing' ),
456
-		'WH' => __( 'Westmeath', 'invoicing' ),
457
-		'WX' => __( 'Wexford', 'invoicing' ),
458
-		'WW' => __( 'Wicklow', 'invoicing' ),
459
-	),
460
-	'IN' => array( // Indian states.
461
-		'AP' => __( 'Andhra Pradesh', 'invoicing' ),
462
-		'AR' => __( 'Arunachal Pradesh', 'invoicing' ),
463
-		'AS' => __( 'Assam', 'invoicing' ),
464
-		'BR' => __( 'Bihar', 'invoicing' ),
465
-		'CT' => __( 'Chhattisgarh', 'invoicing' ),
466
-		'GA' => __( 'Goa', 'invoicing' ),
467
-		'GJ' => __( 'Gujarat', 'invoicing' ),
468
-		'HR' => __( 'Haryana', 'invoicing' ),
469
-		'HP' => __( 'Himachal Pradesh', 'invoicing' ),
470
-		'JK' => __( 'Jammu and Kashmir', 'invoicing' ),
471
-		'JH' => __( 'Jharkhand', 'invoicing' ),
472
-		'KA' => __( 'Karnataka', 'invoicing' ),
473
-		'KL' => __( 'Kerala', 'invoicing' ),
474
-		'MP' => __( 'Madhya Pradesh', 'invoicing' ),
475
-		'MH' => __( 'Maharashtra', 'invoicing' ),
476
-		'MN' => __( 'Manipur', 'invoicing' ),
477
-		'ML' => __( 'Meghalaya', 'invoicing' ),
478
-		'MZ' => __( 'Mizoram', 'invoicing' ),
479
-		'NL' => __( 'Nagaland', 'invoicing' ),
480
-		'OR' => __( 'Orissa', 'invoicing' ),
481
-		'PB' => __( 'Punjab', 'invoicing' ),
482
-		'RJ' => __( 'Rajasthan', 'invoicing' ),
483
-		'SK' => __( 'Sikkim', 'invoicing' ),
484
-		'TN' => __( 'Tamil Nadu', 'invoicing' ),
485
-		'TS' => __( 'Telangana', 'invoicing' ),
486
-		'TR' => __( 'Tripura', 'invoicing' ),
487
-		'UK' => __( 'Uttarakhand', 'invoicing' ),
488
-		'UP' => __( 'Uttar Pradesh', 'invoicing' ),
489
-		'WB' => __( 'West Bengal', 'invoicing' ),
490
-		'AN' => __( 'Andaman and Nicobar Islands', 'invoicing' ),
491
-		'CH' => __( 'Chandigarh', 'invoicing' ),
492
-		'DN' => __( 'Dadra and Nagar Haveli', 'invoicing' ),
493
-		'DD' => __( 'Daman and Diu', 'invoicing' ),
494
-		'DL' => __( 'Delhi', 'invoicing' ),
495
-		'LD' => __( 'Lakshadeep', 'invoicing' ),
496
-		'PY' => __( 'Pondicherry (Puducherry)', 'invoicing' ),
497
-	),
498
-	'IR' => array( // Iran States.
499
-		'KHZ' => __( 'Khuzestan  (خوزستان)', 'invoicing' ),
500
-		'THR' => __( 'Tehran  (تهران)', 'invoicing' ),
501
-		'ILM' => __( 'Ilaam (ایلام)', 'invoicing' ),
502
-		'BHR' => __( 'Bushehr (بوشهر)', 'invoicing' ),
503
-		'ADL' => __( 'Ardabil (اردبیل)', 'invoicing' ),
504
-		'ESF' => __( 'Isfahan (اصفهان)', 'invoicing' ),
505
-		'YZD' => __( 'Yazd (یزد)', 'invoicing' ),
506
-		'KRH' => __( 'Kermanshah (کرمانشاه)', 'invoicing' ),
507
-		'KRN' => __( 'Kerman (کرمان)', 'invoicing' ),
508
-		'HDN' => __( 'Hamadan (همدان)', 'invoicing' ),
509
-		'GZN' => __( 'Ghazvin (قزوین)', 'invoicing' ),
510
-		'ZJN' => __( 'Zanjan (زنجان)', 'invoicing' ),
511
-		'LRS' => __( 'Luristan (لرستان)', 'invoicing' ),
512
-		'ABZ' => __( 'Alborz (البرز)', 'invoicing' ),
513
-		'EAZ' => __( 'East Azarbaijan (آذربایجان شرقی)', 'invoicing' ),
514
-		'WAZ' => __( 'West Azarbaijan (آذربایجان غربی)', 'invoicing' ),
515
-		'CHB' => __( 'Chaharmahal and Bakhtiari (چهارمحال و بختیاری)', 'invoicing' ),
516
-		'SKH' => __( 'South Khorasan (خراسان جنوبی)', 'invoicing' ),
517
-		'RKH' => __( 'Razavi Khorasan (خراسان رضوی)', 'invoicing' ),
518
-		'NKH' => __( 'North Khorasan (خراسان شمالی)', 'invoicing' ),
519
-		'SMN' => __( 'Semnan (سمنان)', 'invoicing' ),
520
-		'FRS' => __( 'Fars (فارس)', 'invoicing' ),
521
-		'QHM' => __( 'Qom (قم)', 'invoicing' ),
522
-		'KRD' => __( 'Kurdistan / کردستان)', 'invoicing' ),
523
-		'KBD' => __( 'Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)', 'invoicing' ),
524
-		'GLS' => __( 'Golestan (گلستان)', 'invoicing' ),
525
-		'GIL' => __( 'Gilan (گیلان)', 'invoicing' ),
526
-		'MZN' => __( 'Mazandaran (مازندران)', 'invoicing' ),
527
-		'MKZ' => __( 'Markazi (مرکزی)', 'invoicing' ),
528
-		'HRZ' => __( 'Hormozgan (هرمزگان)', 'invoicing' ),
529
-		'SBN' => __( 'Sistan and Baluchestan (سیستان و بلوچستان)', 'invoicing' ),
530
-	),
531
-	'IS' => array(),
532
-	'IT' => array( // Italy Provinces.
533
-		'AG' => __( 'Agrigento', 'invoicing' ),
534
-		'AL' => __( 'Alessandria', 'invoicing' ),
535
-		'AN' => __( 'Ancona', 'invoicing' ),
536
-		'AO' => __( 'Aosta', 'invoicing' ),
537
-		'AR' => __( 'Arezzo', 'invoicing' ),
538
-		'AP' => __( 'Ascoli Piceno', 'invoicing' ),
539
-		'AT' => __( 'Asti', 'invoicing' ),
540
-		'AV' => __( 'Avellino', 'invoicing' ),
541
-		'BA' => __( 'Bari', 'invoicing' ),
542
-		'BT' => __( 'Barletta-Andria-Trani', 'invoicing' ),
543
-		'BL' => __( 'Belluno', 'invoicing' ),
544
-		'BN' => __( 'Benevento', 'invoicing' ),
545
-		'BG' => __( 'Bergamo', 'invoicing' ),
546
-		'BI' => __( 'Biella', 'invoicing' ),
547
-		'BO' => __( 'Bologna', 'invoicing' ),
548
-		'BZ' => __( 'Bolzano', 'invoicing' ),
549
-		'BS' => __( 'Brescia', 'invoicing' ),
550
-		'BR' => __( 'Brindisi', 'invoicing' ),
551
-		'CA' => __( 'Cagliari', 'invoicing' ),
552
-		'CL' => __( 'Caltanissetta', 'invoicing' ),
553
-		'CB' => __( 'Campobasso', 'invoicing' ),
554
-		'CE' => __( 'Caserta', 'invoicing' ),
555
-		'CT' => __( 'Catania', 'invoicing' ),
556
-		'CZ' => __( 'Catanzaro', 'invoicing' ),
557
-		'CH' => __( 'Chieti', 'invoicing' ),
558
-		'CO' => __( 'Como', 'invoicing' ),
559
-		'CS' => __( 'Cosenza', 'invoicing' ),
560
-		'CR' => __( 'Cremona', 'invoicing' ),
561
-		'KR' => __( 'Crotone', 'invoicing' ),
562
-		'CN' => __( 'Cuneo', 'invoicing' ),
563
-		'EN' => __( 'Enna', 'invoicing' ),
564
-		'FM' => __( 'Fermo', 'invoicing' ),
565
-		'FE' => __( 'Ferrara', 'invoicing' ),
566
-		'FI' => __( 'Firenze', 'invoicing' ),
567
-		'FG' => __( 'Foggia', 'invoicing' ),
568
-		'FC' => __( 'Forlì-Cesena', 'invoicing' ),
569
-		'FR' => __( 'Frosinone', 'invoicing' ),
570
-		'GE' => __( 'Genova', 'invoicing' ),
571
-		'GO' => __( 'Gorizia', 'invoicing' ),
572
-		'GR' => __( 'Grosseto', 'invoicing' ),
573
-		'IM' => __( 'Imperia', 'invoicing' ),
574
-		'IS' => __( 'Isernia', 'invoicing' ),
575
-		'SP' => __( 'La Spezia', 'invoicing' ),
576
-		'AQ' => __( "L'Aquila", 'invoicing' ),
577
-		'LT' => __( 'Latina', 'invoicing' ),
578
-		'LE' => __( 'Lecce', 'invoicing' ),
579
-		'LC' => __( 'Lecco', 'invoicing' ),
580
-		'LI' => __( 'Livorno', 'invoicing' ),
581
-		'LO' => __( 'Lodi', 'invoicing' ),
582
-		'LU' => __( 'Lucca', 'invoicing' ),
583
-		'MC' => __( 'Macerata', 'invoicing' ),
584
-		'MN' => __( 'Mantova', 'invoicing' ),
585
-		'MS' => __( 'Massa-Carrara', 'invoicing' ),
586
-		'MT' => __( 'Matera', 'invoicing' ),
587
-		'ME' => __( 'Messina', 'invoicing' ),
588
-		'MI' => __( 'Milano', 'invoicing' ),
589
-		'MO' => __( 'Modena', 'invoicing' ),
590
-		'MB' => __( 'Monza e della Brianza', 'invoicing' ),
591
-		'NA' => __( 'Napoli', 'invoicing' ),
592
-		'NO' => __( 'Novara', 'invoicing' ),
593
-		'NU' => __( 'Nuoro', 'invoicing' ),
594
-		'OR' => __( 'Oristano', 'invoicing' ),
595
-		'PD' => __( 'Padova', 'invoicing' ),
596
-		'PA' => __( 'Palermo', 'invoicing' ),
597
-		'PR' => __( 'Parma', 'invoicing' ),
598
-		'PV' => __( 'Pavia', 'invoicing' ),
599
-		'PG' => __( 'Perugia', 'invoicing' ),
600
-		'PU' => __( 'Pesaro e Urbino', 'invoicing' ),
601
-		'PE' => __( 'Pescara', 'invoicing' ),
602
-		'PC' => __( 'Piacenza', 'invoicing' ),
603
-		'PI' => __( 'Pisa', 'invoicing' ),
604
-		'PT' => __( 'Pistoia', 'invoicing' ),
605
-		'PN' => __( 'Pordenone', 'invoicing' ),
606
-		'PZ' => __( 'Potenza', 'invoicing' ),
607
-		'PO' => __( 'Prato', 'invoicing' ),
608
-		'RG' => __( 'Ragusa', 'invoicing' ),
609
-		'RA' => __( 'Ravenna', 'invoicing' ),
610
-		'RC' => __( 'Reggio Calabria', 'invoicing' ),
611
-		'RE' => __( 'Reggio Emilia', 'invoicing' ),
612
-		'RI' => __( 'Rieti', 'invoicing' ),
613
-		'RN' => __( 'Rimini', 'invoicing' ),
614
-		'RM' => __( 'Roma', 'invoicing' ),
615
-		'RO' => __( 'Rovigo', 'invoicing' ),
616
-		'SA' => __( 'Salerno', 'invoicing' ),
617
-		'SS' => __( 'Sassari', 'invoicing' ),
618
-		'SV' => __( 'Savona', 'invoicing' ),
619
-		'SI' => __( 'Siena', 'invoicing' ),
620
-		'SR' => __( 'Siracusa', 'invoicing' ),
621
-		'SO' => __( 'Sondrio', 'invoicing' ),
622
-		'SU' => __( 'Sud Sardegna', 'invoicing' ),
623
-		'TA' => __( 'Taranto', 'invoicing' ),
624
-		'TE' => __( 'Teramo', 'invoicing' ),
625
-		'TR' => __( 'Terni', 'invoicing' ),
626
-		'TO' => __( 'Torino', 'invoicing' ),
627
-		'TP' => __( 'Trapani', 'invoicing' ),
628
-		'TN' => __( 'Trento', 'invoicing' ),
629
-		'TV' => __( 'Treviso', 'invoicing' ),
630
-		'TS' => __( 'Trieste', 'invoicing' ),
631
-		'UD' => __( 'Udine', 'invoicing' ),
632
-		'VA' => __( 'Varese', 'invoicing' ),
633
-		'VE' => __( 'Venezia', 'invoicing' ),
634
-		'VB' => __( 'Verbano-Cusio-Ossola', 'invoicing' ),
635
-		'VC' => __( 'Vercelli', 'invoicing' ),
636
-		'VR' => __( 'Verona', 'invoicing' ),
637
-		'VV' => __( 'Vibo Valentia', 'invoicing' ),
638
-		'VI' => __( 'Vicenza', 'invoicing' ),
639
-		'VT' => __( 'Viterbo', 'invoicing' ),
640
-	),
641
-	'IL' => array(),
642
-	'IM' => array(),
17
+    'AF' => array(),
18
+    'AO' => array( // Angola states.
19
+        'BGO' => __( 'Bengo', 'invoicing' ),
20
+        'BLU' => __( 'Benguela', 'invoicing' ),
21
+        'BIE' => __( 'Bié', 'invoicing' ),
22
+        'CAB' => __( 'Cabinda', 'invoicing' ),
23
+        'CNN' => __( 'Cunene', 'invoicing' ),
24
+        'HUA' => __( 'Huambo', 'invoicing' ),
25
+        'HUI' => __( 'Huíla', 'invoicing' ),
26
+        'CCU' => __( 'Kuando Kubango', 'invoicing' ),
27
+        'CNO' => __( 'Kwanza-Norte', 'invoicing' ),
28
+        'CUS' => __( 'Kwanza-Sul', 'invoicing' ),
29
+        'LUA' => __( 'Luanda', 'invoicing' ),
30
+        'LNO' => __( 'Lunda-Norte', 'invoicing' ),
31
+        'LSU' => __( 'Lunda-Sul', 'invoicing' ),
32
+        'MAL' => __( 'Malanje', 'invoicing' ),
33
+        'MOX' => __( 'Moxico', 'invoicing' ),
34
+        'NAM' => __( 'Namibe', 'invoicing' ),
35
+        'UIG' => __( 'Uíge', 'invoicing' ),
36
+        'ZAI' => __( 'Zaire', 'invoicing' ),
37
+    ),
38
+    'AR' => array( // Argentinian provinces.
39
+        'C' => __( 'Ciudad Aut&oacute;noma de Buenos Aires', 'invoicing' ),
40
+        'B' => __( 'Buenos Aires', 'invoicing' ),
41
+        'K' => __( 'Catamarca', 'invoicing' ),
42
+        'H' => __( 'Chaco', 'invoicing' ),
43
+        'U' => __( 'Chubut', 'invoicing' ),
44
+        'X' => __( 'C&oacute;rdoba', 'invoicing' ),
45
+        'W' => __( 'Corrientes', 'invoicing' ),
46
+        'E' => __( 'Entre R&iacute;os', 'invoicing' ),
47
+        'P' => __( 'Formosa', 'invoicing' ),
48
+        'Y' => __( 'Jujuy', 'invoicing' ),
49
+        'L' => __( 'La Pampa', 'invoicing' ),
50
+        'F' => __( 'La Rioja', 'invoicing' ),
51
+        'M' => __( 'Mendoza', 'invoicing' ),
52
+        'N' => __( 'Misiones', 'invoicing' ),
53
+        'Q' => __( 'Neuqu&eacute;n', 'invoicing' ),
54
+        'R' => __( 'R&iacute;o Negro', 'invoicing' ),
55
+        'A' => __( 'Salta', 'invoicing' ),
56
+        'J' => __( 'San Juan', 'invoicing' ),
57
+        'D' => __( 'San Luis', 'invoicing' ),
58
+        'Z' => __( 'Santa Cruz', 'invoicing' ),
59
+        'S' => __( 'Santa Fe', 'invoicing' ),
60
+        'G' => __( 'Santiago del Estero', 'invoicing' ),
61
+        'V' => __( 'Tierra del Fuego', 'invoicing' ),
62
+        'T' => __( 'Tucum&aacute;n', 'invoicing' ),
63
+    ),
64
+    'AT' => array(),
65
+    'AU' => array( // Australian states.
66
+        'ACT' => __( 'Australian Capital Territory', 'invoicing' ),
67
+        'NSW' => __( 'New South Wales', 'invoicing' ),
68
+        'NT'  => __( 'Northern Territory', 'invoicing' ),
69
+        'QLD' => __( 'Queensland', 'invoicing' ),
70
+        'SA'  => __( 'South Australia', 'invoicing' ),
71
+        'TAS' => __( 'Tasmania', 'invoicing' ),
72
+        'VIC' => __( 'Victoria', 'invoicing' ),
73
+        'WA'  => __( 'Western Australia', 'invoicing' ),
74
+    ),
75
+    'AX' => array(),
76
+    'BD' => array( // Bangladeshi states (districts).
77
+        'BD-05' => __( 'Bagerhat', 'invoicing' ),
78
+        'BD-01' => __( 'Bandarban', 'invoicing' ),
79
+        'BD-02' => __( 'Barguna', 'invoicing' ),
80
+        'BD-06' => __( 'Barishal', 'invoicing' ),
81
+        'BD-07' => __( 'Bhola', 'invoicing' ),
82
+        'BD-03' => __( 'Bogura', 'invoicing' ),
83
+        'BD-04' => __( 'Brahmanbaria', 'invoicing' ),
84
+        'BD-09' => __( 'Chandpur', 'invoicing' ),
85
+        'BD-10' => __( 'Chattogram', 'invoicing' ),
86
+        'BD-12' => __( 'Chuadanga', 'invoicing' ),
87
+        'BD-11' => __( "Cox's Bazar", 'invoicing' ),
88
+        'BD-08' => __( 'Cumilla', 'invoicing' ),
89
+        'BD-13' => __( 'Dhaka', 'invoicing' ),
90
+        'BD-14' => __( 'Dinajpur', 'invoicing' ),
91
+        'BD-15' => __( 'Faridpur ', 'invoicing' ),
92
+        'BD-16' => __( 'Feni', 'invoicing' ),
93
+        'BD-19' => __( 'Gaibandha', 'invoicing' ),
94
+        'BD-18' => __( 'Gazipur', 'invoicing' ),
95
+        'BD-17' => __( 'Gopalganj', 'invoicing' ),
96
+        'BD-20' => __( 'Habiganj', 'invoicing' ),
97
+        'BD-21' => __( 'Jamalpur', 'invoicing' ),
98
+        'BD-22' => __( 'Jashore', 'invoicing' ),
99
+        'BD-25' => __( 'Jhalokati', 'invoicing' ),
100
+        'BD-23' => __( 'Jhenaidah', 'invoicing' ),
101
+        'BD-24' => __( 'Joypurhat', 'invoicing' ),
102
+        'BD-29' => __( 'Khagrachhari', 'invoicing' ),
103
+        'BD-27' => __( 'Khulna', 'invoicing' ),
104
+        'BD-26' => __( 'Kishoreganj', 'invoicing' ),
105
+        'BD-28' => __( 'Kurigram', 'invoicing' ),
106
+        'BD-30' => __( 'Kushtia', 'invoicing' ),
107
+        'BD-31' => __( 'Lakshmipur', 'invoicing' ),
108
+        'BD-32' => __( 'Lalmonirhat', 'invoicing' ),
109
+        'BD-36' => __( 'Madaripur', 'invoicing' ),
110
+        'BD-37' => __( 'Magura', 'invoicing' ),
111
+        'BD-33' => __( 'Manikganj ', 'invoicing' ),
112
+        'BD-39' => __( 'Meherpur', 'invoicing' ),
113
+        'BD-38' => __( 'Moulvibazar', 'invoicing' ),
114
+        'BD-35' => __( 'Munshiganj', 'invoicing' ),
115
+        'BD-34' => __( 'Mymensingh', 'invoicing' ),
116
+        'BD-48' => __( 'Naogaon', 'invoicing' ),
117
+        'BD-43' => __( 'Narail', 'invoicing' ),
118
+        'BD-40' => __( 'Narayanganj', 'invoicing' ),
119
+        'BD-42' => __( 'Narsingdi', 'invoicing' ),
120
+        'BD-44' => __( 'Natore', 'invoicing' ),
121
+        'BD-45' => __( 'Nawabganj', 'invoicing' ),
122
+        'BD-41' => __( 'Netrakona', 'invoicing' ),
123
+        'BD-46' => __( 'Nilphamari', 'invoicing' ),
124
+        'BD-47' => __( 'Noakhali', 'invoicing' ),
125
+        'BD-49' => __( 'Pabna', 'invoicing' ),
126
+        'BD-52' => __( 'Panchagarh', 'invoicing' ),
127
+        'BD-51' => __( 'Patuakhali', 'invoicing' ),
128
+        'BD-50' => __( 'Pirojpur', 'invoicing' ),
129
+        'BD-53' => __( 'Rajbari', 'invoicing' ),
130
+        'BD-54' => __( 'Rajshahi', 'invoicing' ),
131
+        'BD-56' => __( 'Rangamati', 'invoicing' ),
132
+        'BD-55' => __( 'Rangpur', 'invoicing' ),
133
+        'BD-58' => __( 'Satkhira', 'invoicing' ),
134
+        'BD-62' => __( 'Shariatpur', 'invoicing' ),
135
+        'BD-57' => __( 'Sherpur', 'invoicing' ),
136
+        'BD-59' => __( 'Sirajganj', 'invoicing' ),
137
+        'BD-61' => __( 'Sunamganj', 'invoicing' ),
138
+        'BD-60' => __( 'Sylhet', 'invoicing' ),
139
+        'BD-63' => __( 'Tangail', 'invoicing' ),
140
+        'BD-64' => __( 'Thakurgaon', 'invoicing' ),
141
+    ),
142
+    'BE' => array(),
143
+    'BG' => array( // Bulgarian states.
144
+        'BG-01' => __( 'Blagoevgrad', 'invoicing' ),
145
+        'BG-02' => __( 'Burgas', 'invoicing' ),
146
+        'BG-08' => __( 'Dobrich', 'invoicing' ),
147
+        'BG-07' => __( 'Gabrovo', 'invoicing' ),
148
+        'BG-26' => __( 'Haskovo', 'invoicing' ),
149
+        'BG-09' => __( 'Kardzhali', 'invoicing' ),
150
+        'BG-10' => __( 'Kyustendil', 'invoicing' ),
151
+        'BG-11' => __( 'Lovech', 'invoicing' ),
152
+        'BG-12' => __( 'Montana', 'invoicing' ),
153
+        'BG-13' => __( 'Pazardzhik', 'invoicing' ),
154
+        'BG-14' => __( 'Pernik', 'invoicing' ),
155
+        'BG-15' => __( 'Pleven', 'invoicing' ),
156
+        'BG-16' => __( 'Plovdiv', 'invoicing' ),
157
+        'BG-17' => __( 'Razgrad', 'invoicing' ),
158
+        'BG-18' => __( 'Ruse', 'invoicing' ),
159
+        'BG-27' => __( 'Shumen', 'invoicing' ),
160
+        'BG-19' => __( 'Silistra', 'invoicing' ),
161
+        'BG-20' => __( 'Sliven', 'invoicing' ),
162
+        'BG-21' => __( 'Smolyan', 'invoicing' ),
163
+        'BG-23' => __( 'Sofia', 'invoicing' ),
164
+        'BG-22' => __( 'Sofia-Grad', 'invoicing' ),
165
+        'BG-24' => __( 'Stara Zagora', 'invoicing' ),
166
+        'BG-25' => __( 'Targovishte', 'invoicing' ),
167
+        'BG-03' => __( 'Varna', 'invoicing' ),
168
+        'BG-04' => __( 'Veliko Tarnovo', 'invoicing' ),
169
+        'BG-05' => __( 'Vidin', 'invoicing' ),
170
+        'BG-06' => __( 'Vratsa', 'invoicing' ),
171
+        'BG-28' => __( 'Yambol', 'invoicing' ),
172
+    ),
173
+    'BH' => array(),
174
+    'BI' => array(),
175
+    'BO' => array( // Bolivian states.
176
+        'B' => __( 'Chuquisaca', 'invoicing' ),
177
+        'H' => __( 'Beni', 'invoicing' ),
178
+        'C' => __( 'Cochabamba', 'invoicing' ),
179
+        'L' => __( 'La Paz', 'invoicing' ),
180
+        'O' => __( 'Oruro', 'invoicing' ),
181
+        'N' => __( 'Pando', 'invoicing' ),
182
+        'P' => __( 'Potosí', 'invoicing' ),
183
+        'S' => __( 'Santa Cruz', 'invoicing' ),
184
+        'T' => __( 'Tarija', 'invoicing' ),
185
+    ),
186
+    'BR' => array( // Brazillian states.
187
+        'AC' => __( 'Acre', 'invoicing' ),
188
+        'AL' => __( 'Alagoas', 'invoicing' ),
189
+        'AP' => __( 'Amap&aacute;', 'invoicing' ),
190
+        'AM' => __( 'Amazonas', 'invoicing' ),
191
+        'BA' => __( 'Bahia', 'invoicing' ),
192
+        'CE' => __( 'Cear&aacute;', 'invoicing' ),
193
+        'DF' => __( 'Distrito Federal', 'invoicing' ),
194
+        'ES' => __( 'Esp&iacute;rito Santo', 'invoicing' ),
195
+        'GO' => __( 'Goi&aacute;s', 'invoicing' ),
196
+        'MA' => __( 'Maranh&atilde;o', 'invoicing' ),
197
+        'MT' => __( 'Mato Grosso', 'invoicing' ),
198
+        'MS' => __( 'Mato Grosso do Sul', 'invoicing' ),
199
+        'MG' => __( 'Minas Gerais', 'invoicing' ),
200
+        'PA' => __( 'Par&aacute;', 'invoicing' ),
201
+        'PB' => __( 'Para&iacute;ba', 'invoicing' ),
202
+        'PR' => __( 'Paran&aacute;', 'invoicing' ),
203
+        'PE' => __( 'Pernambuco', 'invoicing' ),
204
+        'PI' => __( 'Piau&iacute;', 'invoicing' ),
205
+        'RJ' => __( 'Rio de Janeiro', 'invoicing' ),
206
+        'RN' => __( 'Rio Grande do Norte', 'invoicing' ),
207
+        'RS' => __( 'Rio Grande do Sul', 'invoicing' ),
208
+        'RO' => __( 'Rond&ocirc;nia', 'invoicing' ),
209
+        'RR' => __( 'Roraima', 'invoicing' ),
210
+        'SC' => __( 'Santa Catarina', 'invoicing' ),
211
+        'SP' => __( 'S&atilde;o Paulo', 'invoicing' ),
212
+        'SE' => __( 'Sergipe', 'invoicing' ),
213
+        'TO' => __( 'Tocantins', 'invoicing' ),
214
+    ),
215
+    'CA' => array( // Canadian states.
216
+        'AB' => __( 'Alberta', 'invoicing' ),
217
+        'BC' => __( 'British Columbia', 'invoicing' ),
218
+        'MB' => __( 'Manitoba', 'invoicing' ),
219
+        'NB' => __( 'New Brunswick', 'invoicing' ),
220
+        'NL' => __( 'Newfoundland and Labrador', 'invoicing' ),
221
+        'NT' => __( 'Northwest Territories', 'invoicing' ),
222
+        'NS' => __( 'Nova Scotia', 'invoicing' ),
223
+        'NU' => __( 'Nunavut', 'invoicing' ),
224
+        'ON' => __( 'Ontario', 'invoicing' ),
225
+        'PE' => __( 'Prince Edward Island', 'invoicing' ),
226
+        'QC' => __( 'Quebec', 'invoicing' ),
227
+        'SK' => __( 'Saskatchewan', 'invoicing' ),
228
+        'YT' => __( 'Yukon Territory', 'invoicing' ),
229
+    ),
230
+    'CH' => array( // Cantons of Switzerland.
231
+        'AG' => __( 'Aargau', 'invoicing' ),
232
+        'AR' => __( 'Appenzell Ausserrhoden', 'invoicing' ),
233
+        'AI' => __( 'Appenzell Innerrhoden', 'invoicing' ),
234
+        'BL' => __( 'Basel-Landschaft', 'invoicing' ),
235
+        'BS' => __( 'Basel-Stadt', 'invoicing' ),
236
+        'BE' => __( 'Bern', 'invoicing' ),
237
+        'FR' => __( 'Fribourg', 'invoicing' ),
238
+        'GE' => __( 'Geneva', 'invoicing' ),
239
+        'GL' => __( 'Glarus', 'invoicing' ),
240
+        'GR' => __( 'Graub&uuml;nden', 'invoicing' ),
241
+        'JU' => __( 'Jura', 'invoicing' ),
242
+        'LU' => __( 'Luzern', 'invoicing' ),
243
+        'NE' => __( 'Neuch&acirc;tel', 'invoicing' ),
244
+        'NW' => __( 'Nidwalden', 'invoicing' ),
245
+        'OW' => __( 'Obwalden', 'invoicing' ),
246
+        'SH' => __( 'Schaffhausen', 'invoicing' ),
247
+        'SZ' => __( 'Schwyz', 'invoicing' ),
248
+        'SO' => __( 'Solothurn', 'invoicing' ),
249
+        'SG' => __( 'St. Gallen', 'invoicing' ),
250
+        'TG' => __( 'Thurgau', 'invoicing' ),
251
+        'TI' => __( 'Ticino', 'invoicing' ),
252
+        'UR' => __( 'Uri', 'invoicing' ),
253
+        'VS' => __( 'Valais', 'invoicing' ),
254
+        'VD' => __( 'Vaud', 'invoicing' ),
255
+        'ZG' => __( 'Zug', 'invoicing' ),
256
+        'ZH' => __( 'Z&uuml;rich', 'invoicing' ),
257
+    ),
258
+    'CN' => array( // Chinese states.
259
+        'CN1'  => __( 'Yunnan / &#20113;&#21335;', 'invoicing' ),
260
+        'CN2'  => __( 'Beijing / &#21271;&#20140;', 'invoicing' ),
261
+        'CN3'  => __( 'Tianjin / &#22825;&#27941;', 'invoicing' ),
262
+        'CN4'  => __( 'Hebei / &#27827;&#21271;', 'invoicing' ),
263
+        'CN5'  => __( 'Shanxi / &#23665;&#35199;', 'invoicing' ),
264
+        'CN6'  => __( 'Inner Mongolia / &#20839;&#33945;&#21476;', 'invoicing' ),
265
+        'CN7'  => __( 'Liaoning / &#36797;&#23425;', 'invoicing' ),
266
+        'CN8'  => __( 'Jilin / &#21513;&#26519;', 'invoicing' ),
267
+        'CN9'  => __( 'Heilongjiang / &#40657;&#40857;&#27743;', 'invoicing' ),
268
+        'CN10' => __( 'Shanghai / &#19978;&#28023;', 'invoicing' ),
269
+        'CN11' => __( 'Jiangsu / &#27743;&#33487;', 'invoicing' ),
270
+        'CN12' => __( 'Zhejiang / &#27993;&#27743;', 'invoicing' ),
271
+        'CN13' => __( 'Anhui / &#23433;&#24509;', 'invoicing' ),
272
+        'CN14' => __( 'Fujian / &#31119;&#24314;', 'invoicing' ),
273
+        'CN15' => __( 'Jiangxi / &#27743;&#35199;', 'invoicing' ),
274
+        'CN16' => __( 'Shandong / &#23665;&#19996;', 'invoicing' ),
275
+        'CN17' => __( 'Henan / &#27827;&#21335;', 'invoicing' ),
276
+        'CN18' => __( 'Hubei / &#28246;&#21271;', 'invoicing' ),
277
+        'CN19' => __( 'Hunan / &#28246;&#21335;', 'invoicing' ),
278
+        'CN20' => __( 'Guangdong / &#24191;&#19996;', 'invoicing' ),
279
+        'CN21' => __( 'Guangxi Zhuang / &#24191;&#35199;&#22766;&#26063;', 'invoicing' ),
280
+        'CN22' => __( 'Hainan / &#28023;&#21335;', 'invoicing' ),
281
+        'CN23' => __( 'Chongqing / &#37325;&#24198;', 'invoicing' ),
282
+        'CN24' => __( 'Sichuan / &#22235;&#24029;', 'invoicing' ),
283
+        'CN25' => __( 'Guizhou / &#36149;&#24030;', 'invoicing' ),
284
+        'CN26' => __( 'Shaanxi / &#38485;&#35199;', 'invoicing' ),
285
+        'CN27' => __( 'Gansu / &#29976;&#32899;', 'invoicing' ),
286
+        'CN28' => __( 'Qinghai / &#38738;&#28023;', 'invoicing' ),
287
+        'CN29' => __( 'Ningxia Hui / &#23425;&#22799;', 'invoicing' ),
288
+        'CN30' => __( 'Macao / &#28595;&#38376;', 'invoicing' ),
289
+        'CN31' => __( 'Tibet / &#35199;&#34255;', 'invoicing' ),
290
+        'CN32' => __( 'Xinjiang / &#26032;&#30086;', 'invoicing' ),
291
+    ),
292
+    'CZ' => array(),
293
+    'DE' => array(),
294
+    'DK' => array(),
295
+    'EE' => array(),
296
+    'ES' => array( // Spanish states.
297
+        'C'  => __( 'A Coru&ntilde;a', 'invoicing' ),
298
+        'VI' => __( 'Araba/&Aacute;lava', 'invoicing' ),
299
+        'AB' => __( 'Albacete', 'invoicing' ),
300
+        'A'  => __( 'Alicante', 'invoicing' ),
301
+        'AL' => __( 'Almer&iacute;a', 'invoicing' ),
302
+        'O'  => __( 'Asturias', 'invoicing' ),
303
+        'AV' => __( '&Aacute;vila', 'invoicing' ),
304
+        'BA' => __( 'Badajoz', 'invoicing' ),
305
+        'PM' => __( 'Baleares', 'invoicing' ),
306
+        'B'  => __( 'Barcelona', 'invoicing' ),
307
+        'BU' => __( 'Burgos', 'invoicing' ),
308
+        'CC' => __( 'C&aacute;ceres', 'invoicing' ),
309
+        'CA' => __( 'C&aacute;diz', 'invoicing' ),
310
+        'S'  => __( 'Cantabria', 'invoicing' ),
311
+        'CS' => __( 'Castell&oacute;n', 'invoicing' ),
312
+        'CE' => __( 'Ceuta', 'invoicing' ),
313
+        'CR' => __( 'Ciudad Real', 'invoicing' ),
314
+        'CO' => __( 'C&oacute;rdoba', 'invoicing' ),
315
+        'CU' => __( 'Cuenca', 'invoicing' ),
316
+        'GI' => __( 'Girona', 'invoicing' ),
317
+        'GR' => __( 'Granada', 'invoicing' ),
318
+        'GU' => __( 'Guadalajara', 'invoicing' ),
319
+        'SS' => __( 'Gipuzkoa', 'invoicing' ),
320
+        'H'  => __( 'Huelva', 'invoicing' ),
321
+        'HU' => __( 'Huesca', 'invoicing' ),
322
+        'J'  => __( 'Ja&eacute;n', 'invoicing' ),
323
+        'LO' => __( 'La Rioja', 'invoicing' ),
324
+        'GC' => __( 'Las Palmas', 'invoicing' ),
325
+        'LE' => __( 'Le&oacute;n', 'invoicing' ),
326
+        'L'  => __( 'Lleida', 'invoicing' ),
327
+        'LU' => __( 'Lugo', 'invoicing' ),
328
+        'M'  => __( 'Madrid', 'invoicing' ),
329
+        'MA' => __( 'M&aacute;laga', 'invoicing' ),
330
+        'ML' => __( 'Melilla', 'invoicing' ),
331
+        'MU' => __( 'Murcia', 'invoicing' ),
332
+        'NA' => __( 'Navarra', 'invoicing' ),
333
+        'OR' => __( 'Ourense', 'invoicing' ),
334
+        'P'  => __( 'Palencia', 'invoicing' ),
335
+        'PO' => __( 'Pontevedra', 'invoicing' ),
336
+        'SA' => __( 'Salamanca', 'invoicing' ),
337
+        'TF' => __( 'Santa Cruz de Tenerife', 'invoicing' ),
338
+        'SG' => __( 'Segovia', 'invoicing' ),
339
+        'SE' => __( 'Sevilla', 'invoicing' ),
340
+        'SO' => __( 'Soria', 'invoicing' ),
341
+        'T'  => __( 'Tarragona', 'invoicing' ),
342
+        'TE' => __( 'Teruel', 'invoicing' ),
343
+        'TO' => __( 'Toledo', 'invoicing' ),
344
+        'V'  => __( 'Valencia', 'invoicing' ),
345
+        'VA' => __( 'Valladolid', 'invoicing' ),
346
+        'BI' => __( 'Bizkaia', 'invoicing' ),
347
+        'ZA' => __( 'Zamora', 'invoicing' ),
348
+        'Z'  => __( 'Zaragoza', 'invoicing' ),
349
+    ),
350
+    'FI' => array(),
351
+    'FR' => array(),
352
+    'GP' => array(),
353
+    'GR' => array( // Greek Regions.
354
+        'I' => __( 'Αττική', 'invoicing' ),
355
+        'A' => __( 'Ανατολική Μακεδονία και Θράκη', 'invoicing' ),
356
+        'B' => __( 'Κεντρική Μακεδονία', 'invoicing' ),
357
+        'C' => __( 'Δυτική Μακεδονία', 'invoicing' ),
358
+        'D' => __( 'Ήπειρος', 'invoicing' ),
359
+        'E' => __( 'Θεσσαλία', 'invoicing' ),
360
+        'F' => __( 'Ιόνιοι Νήσοι', 'invoicing' ),
361
+        'G' => __( 'Δυτική Ελλάδα', 'invoicing' ),
362
+        'H' => __( 'Στερεά Ελλάδα', 'invoicing' ),
363
+        'J' => __( 'Πελοπόννησος', 'invoicing' ),
364
+        'K' => __( 'Βόρειο Αιγαίο', 'invoicing' ),
365
+        'L' => __( 'Νότιο Αιγαίο', 'invoicing' ),
366
+        'M' => __( 'Κρήτη', 'invoicing' ),
367
+    ),
368
+    'GF' => array(),
369
+    'HK' => array( // Hong Kong states.
370
+        'HONG KONG'       => __( 'Hong Kong Island', 'invoicing' ),
371
+        'KOWLOON'         => __( 'Kowloon', 'invoicing' ),
372
+        'NEW TERRITORIES' => __( 'New Territories', 'invoicing' ),
373
+    ),
374
+    'HU' => array( // Hungary states.
375
+        'BK' => __( 'Bács-Kiskun', 'invoicing' ),
376
+        'BE' => __( 'Békés', 'invoicing' ),
377
+        'BA' => __( 'Baranya', 'invoicing' ),
378
+        'BZ' => __( 'Borsod-Abaúj-Zemplén', 'invoicing' ),
379
+        'BU' => __( 'Budapest', 'invoicing' ),
380
+        'CS' => __( 'Csongrád', 'invoicing' ),
381
+        'FE' => __( 'Fejér', 'invoicing' ),
382
+        'GS' => __( 'Győr-Moson-Sopron', 'invoicing' ),
383
+        'HB' => __( 'Hajdú-Bihar', 'invoicing' ),
384
+        'HE' => __( 'Heves', 'invoicing' ),
385
+        'JN' => __( 'Jász-Nagykun-Szolnok', 'invoicing' ),
386
+        'KE' => __( 'Komárom-Esztergom', 'invoicing' ),
387
+        'NO' => __( 'Nógrád', 'invoicing' ),
388
+        'PE' => __( 'Pest', 'invoicing' ),
389
+        'SO' => __( 'Somogy', 'invoicing' ),
390
+        'SZ' => __( 'Szabolcs-Szatmár-Bereg', 'invoicing' ),
391
+        'TO' => __( 'Tolna', 'invoicing' ),
392
+        'VA' => __( 'Vas', 'invoicing' ),
393
+        'VE' => __( 'Veszprém', 'invoicing' ),
394
+        'ZA' => __( 'Zala', 'invoicing' ),
395
+    ),
396
+    'ID' => array( // Indonesia Provinces.
397
+        'AC' => __( 'Daerah Istimewa Aceh', 'invoicing' ),
398
+        'SU' => __( 'Sumatera Utara', 'invoicing' ),
399
+        'SB' => __( 'Sumatera Barat', 'invoicing' ),
400
+        'RI' => __( 'Riau', 'invoicing' ),
401
+        'KR' => __( 'Kepulauan Riau', 'invoicing' ),
402
+        'JA' => __( 'Jambi', 'invoicing' ),
403
+        'SS' => __( 'Sumatera Selatan', 'invoicing' ),
404
+        'BB' => __( 'Bangka Belitung', 'invoicing' ),
405
+        'BE' => __( 'Bengkulu', 'invoicing' ),
406
+        'LA' => __( 'Lampung', 'invoicing' ),
407
+        'JK' => __( 'DKI Jakarta', 'invoicing' ),
408
+        'JB' => __( 'Jawa Barat', 'invoicing' ),
409
+        'BT' => __( 'Banten', 'invoicing' ),
410
+        'JT' => __( 'Jawa Tengah', 'invoicing' ),
411
+        'JI' => __( 'Jawa Timur', 'invoicing' ),
412
+        'YO' => __( 'Daerah Istimewa Yogyakarta', 'invoicing' ),
413
+        'BA' => __( 'Bali', 'invoicing' ),
414
+        'NB' => __( 'Nusa Tenggara Barat', 'invoicing' ),
415
+        'NT' => __( 'Nusa Tenggara Timur', 'invoicing' ),
416
+        'KB' => __( 'Kalimantan Barat', 'invoicing' ),
417
+        'KT' => __( 'Kalimantan Tengah', 'invoicing' ),
418
+        'KI' => __( 'Kalimantan Timur', 'invoicing' ),
419
+        'KS' => __( 'Kalimantan Selatan', 'invoicing' ),
420
+        'KU' => __( 'Kalimantan Utara', 'invoicing' ),
421
+        'SA' => __( 'Sulawesi Utara', 'invoicing' ),
422
+        'ST' => __( 'Sulawesi Tengah', 'invoicing' ),
423
+        'SG' => __( 'Sulawesi Tenggara', 'invoicing' ),
424
+        'SR' => __( 'Sulawesi Barat', 'invoicing' ),
425
+        'SN' => __( 'Sulawesi Selatan', 'invoicing' ),
426
+        'GO' => __( 'Gorontalo', 'invoicing' ),
427
+        'MA' => __( 'Maluku', 'invoicing' ),
428
+        'MU' => __( 'Maluku Utara', 'invoicing' ),
429
+        'PA' => __( 'Papua', 'invoicing' ),
430
+        'PB' => __( 'Papua Barat', 'invoicing' ),
431
+    ),
432
+    'IE' => array( // Republic of Ireland.
433
+        'CW' => __( 'Carlow', 'invoicing' ),
434
+        'CN' => __( 'Cavan', 'invoicing' ),
435
+        'CE' => __( 'Clare', 'invoicing' ),
436
+        'CO' => __( 'Cork', 'invoicing' ),
437
+        'DL' => __( 'Donegal', 'invoicing' ),
438
+        'D'  => __( 'Dublin', 'invoicing' ),
439
+        'G'  => __( 'Galway', 'invoicing' ),
440
+        'KY' => __( 'Kerry', 'invoicing' ),
441
+        'KE' => __( 'Kildare', 'invoicing' ),
442
+        'KK' => __( 'Kilkenny', 'invoicing' ),
443
+        'LS' => __( 'Laois', 'invoicing' ),
444
+        'LM' => __( 'Leitrim', 'invoicing' ),
445
+        'LK' => __( 'Limerick', 'invoicing' ),
446
+        'LD' => __( 'Longford', 'invoicing' ),
447
+        'LH' => __( 'Louth', 'invoicing' ),
448
+        'MO' => __( 'Mayo', 'invoicing' ),
449
+        'MH' => __( 'Meath', 'invoicing' ),
450
+        'MN' => __( 'Monaghan', 'invoicing' ),
451
+        'OY' => __( 'Offaly', 'invoicing' ),
452
+        'RN' => __( 'Roscommon', 'invoicing' ),
453
+        'SO' => __( 'Sligo', 'invoicing' ),
454
+        'TA' => __( 'Tipperary', 'invoicing' ),
455
+        'WD' => __( 'Waterford', 'invoicing' ),
456
+        'WH' => __( 'Westmeath', 'invoicing' ),
457
+        'WX' => __( 'Wexford', 'invoicing' ),
458
+        'WW' => __( 'Wicklow', 'invoicing' ),
459
+    ),
460
+    'IN' => array( // Indian states.
461
+        'AP' => __( 'Andhra Pradesh', 'invoicing' ),
462
+        'AR' => __( 'Arunachal Pradesh', 'invoicing' ),
463
+        'AS' => __( 'Assam', 'invoicing' ),
464
+        'BR' => __( 'Bihar', 'invoicing' ),
465
+        'CT' => __( 'Chhattisgarh', 'invoicing' ),
466
+        'GA' => __( 'Goa', 'invoicing' ),
467
+        'GJ' => __( 'Gujarat', 'invoicing' ),
468
+        'HR' => __( 'Haryana', 'invoicing' ),
469
+        'HP' => __( 'Himachal Pradesh', 'invoicing' ),
470
+        'JK' => __( 'Jammu and Kashmir', 'invoicing' ),
471
+        'JH' => __( 'Jharkhand', 'invoicing' ),
472
+        'KA' => __( 'Karnataka', 'invoicing' ),
473
+        'KL' => __( 'Kerala', 'invoicing' ),
474
+        'MP' => __( 'Madhya Pradesh', 'invoicing' ),
475
+        'MH' => __( 'Maharashtra', 'invoicing' ),
476
+        'MN' => __( 'Manipur', 'invoicing' ),
477
+        'ML' => __( 'Meghalaya', 'invoicing' ),
478
+        'MZ' => __( 'Mizoram', 'invoicing' ),
479
+        'NL' => __( 'Nagaland', 'invoicing' ),
480
+        'OR' => __( 'Orissa', 'invoicing' ),
481
+        'PB' => __( 'Punjab', 'invoicing' ),
482
+        'RJ' => __( 'Rajasthan', 'invoicing' ),
483
+        'SK' => __( 'Sikkim', 'invoicing' ),
484
+        'TN' => __( 'Tamil Nadu', 'invoicing' ),
485
+        'TS' => __( 'Telangana', 'invoicing' ),
486
+        'TR' => __( 'Tripura', 'invoicing' ),
487
+        'UK' => __( 'Uttarakhand', 'invoicing' ),
488
+        'UP' => __( 'Uttar Pradesh', 'invoicing' ),
489
+        'WB' => __( 'West Bengal', 'invoicing' ),
490
+        'AN' => __( 'Andaman and Nicobar Islands', 'invoicing' ),
491
+        'CH' => __( 'Chandigarh', 'invoicing' ),
492
+        'DN' => __( 'Dadra and Nagar Haveli', 'invoicing' ),
493
+        'DD' => __( 'Daman and Diu', 'invoicing' ),
494
+        'DL' => __( 'Delhi', 'invoicing' ),
495
+        'LD' => __( 'Lakshadeep', 'invoicing' ),
496
+        'PY' => __( 'Pondicherry (Puducherry)', 'invoicing' ),
497
+    ),
498
+    'IR' => array( // Iran States.
499
+        'KHZ' => __( 'Khuzestan  (خوزستان)', 'invoicing' ),
500
+        'THR' => __( 'Tehran  (تهران)', 'invoicing' ),
501
+        'ILM' => __( 'Ilaam (ایلام)', 'invoicing' ),
502
+        'BHR' => __( 'Bushehr (بوشهر)', 'invoicing' ),
503
+        'ADL' => __( 'Ardabil (اردبیل)', 'invoicing' ),
504
+        'ESF' => __( 'Isfahan (اصفهان)', 'invoicing' ),
505
+        'YZD' => __( 'Yazd (یزد)', 'invoicing' ),
506
+        'KRH' => __( 'Kermanshah (کرمانشاه)', 'invoicing' ),
507
+        'KRN' => __( 'Kerman (کرمان)', 'invoicing' ),
508
+        'HDN' => __( 'Hamadan (همدان)', 'invoicing' ),
509
+        'GZN' => __( 'Ghazvin (قزوین)', 'invoicing' ),
510
+        'ZJN' => __( 'Zanjan (زنجان)', 'invoicing' ),
511
+        'LRS' => __( 'Luristan (لرستان)', 'invoicing' ),
512
+        'ABZ' => __( 'Alborz (البرز)', 'invoicing' ),
513
+        'EAZ' => __( 'East Azarbaijan (آذربایجان شرقی)', 'invoicing' ),
514
+        'WAZ' => __( 'West Azarbaijan (آذربایجان غربی)', 'invoicing' ),
515
+        'CHB' => __( 'Chaharmahal and Bakhtiari (چهارمحال و بختیاری)', 'invoicing' ),
516
+        'SKH' => __( 'South Khorasan (خراسان جنوبی)', 'invoicing' ),
517
+        'RKH' => __( 'Razavi Khorasan (خراسان رضوی)', 'invoicing' ),
518
+        'NKH' => __( 'North Khorasan (خراسان شمالی)', 'invoicing' ),
519
+        'SMN' => __( 'Semnan (سمنان)', 'invoicing' ),
520
+        'FRS' => __( 'Fars (فارس)', 'invoicing' ),
521
+        'QHM' => __( 'Qom (قم)', 'invoicing' ),
522
+        'KRD' => __( 'Kurdistan / کردستان)', 'invoicing' ),
523
+        'KBD' => __( 'Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)', 'invoicing' ),
524
+        'GLS' => __( 'Golestan (گلستان)', 'invoicing' ),
525
+        'GIL' => __( 'Gilan (گیلان)', 'invoicing' ),
526
+        'MZN' => __( 'Mazandaran (مازندران)', 'invoicing' ),
527
+        'MKZ' => __( 'Markazi (مرکزی)', 'invoicing' ),
528
+        'HRZ' => __( 'Hormozgan (هرمزگان)', 'invoicing' ),
529
+        'SBN' => __( 'Sistan and Baluchestan (سیستان و بلوچستان)', 'invoicing' ),
530
+    ),
531
+    'IS' => array(),
532
+    'IT' => array( // Italy Provinces.
533
+        'AG' => __( 'Agrigento', 'invoicing' ),
534
+        'AL' => __( 'Alessandria', 'invoicing' ),
535
+        'AN' => __( 'Ancona', 'invoicing' ),
536
+        'AO' => __( 'Aosta', 'invoicing' ),
537
+        'AR' => __( 'Arezzo', 'invoicing' ),
538
+        'AP' => __( 'Ascoli Piceno', 'invoicing' ),
539
+        'AT' => __( 'Asti', 'invoicing' ),
540
+        'AV' => __( 'Avellino', 'invoicing' ),
541
+        'BA' => __( 'Bari', 'invoicing' ),
542
+        'BT' => __( 'Barletta-Andria-Trani', 'invoicing' ),
543
+        'BL' => __( 'Belluno', 'invoicing' ),
544
+        'BN' => __( 'Benevento', 'invoicing' ),
545
+        'BG' => __( 'Bergamo', 'invoicing' ),
546
+        'BI' => __( 'Biella', 'invoicing' ),
547
+        'BO' => __( 'Bologna', 'invoicing' ),
548
+        'BZ' => __( 'Bolzano', 'invoicing' ),
549
+        'BS' => __( 'Brescia', 'invoicing' ),
550
+        'BR' => __( 'Brindisi', 'invoicing' ),
551
+        'CA' => __( 'Cagliari', 'invoicing' ),
552
+        'CL' => __( 'Caltanissetta', 'invoicing' ),
553
+        'CB' => __( 'Campobasso', 'invoicing' ),
554
+        'CE' => __( 'Caserta', 'invoicing' ),
555
+        'CT' => __( 'Catania', 'invoicing' ),
556
+        'CZ' => __( 'Catanzaro', 'invoicing' ),
557
+        'CH' => __( 'Chieti', 'invoicing' ),
558
+        'CO' => __( 'Como', 'invoicing' ),
559
+        'CS' => __( 'Cosenza', 'invoicing' ),
560
+        'CR' => __( 'Cremona', 'invoicing' ),
561
+        'KR' => __( 'Crotone', 'invoicing' ),
562
+        'CN' => __( 'Cuneo', 'invoicing' ),
563
+        'EN' => __( 'Enna', 'invoicing' ),
564
+        'FM' => __( 'Fermo', 'invoicing' ),
565
+        'FE' => __( 'Ferrara', 'invoicing' ),
566
+        'FI' => __( 'Firenze', 'invoicing' ),
567
+        'FG' => __( 'Foggia', 'invoicing' ),
568
+        'FC' => __( 'Forlì-Cesena', 'invoicing' ),
569
+        'FR' => __( 'Frosinone', 'invoicing' ),
570
+        'GE' => __( 'Genova', 'invoicing' ),
571
+        'GO' => __( 'Gorizia', 'invoicing' ),
572
+        'GR' => __( 'Grosseto', 'invoicing' ),
573
+        'IM' => __( 'Imperia', 'invoicing' ),
574
+        'IS' => __( 'Isernia', 'invoicing' ),
575
+        'SP' => __( 'La Spezia', 'invoicing' ),
576
+        'AQ' => __( "L'Aquila", 'invoicing' ),
577
+        'LT' => __( 'Latina', 'invoicing' ),
578
+        'LE' => __( 'Lecce', 'invoicing' ),
579
+        'LC' => __( 'Lecco', 'invoicing' ),
580
+        'LI' => __( 'Livorno', 'invoicing' ),
581
+        'LO' => __( 'Lodi', 'invoicing' ),
582
+        'LU' => __( 'Lucca', 'invoicing' ),
583
+        'MC' => __( 'Macerata', 'invoicing' ),
584
+        'MN' => __( 'Mantova', 'invoicing' ),
585
+        'MS' => __( 'Massa-Carrara', 'invoicing' ),
586
+        'MT' => __( 'Matera', 'invoicing' ),
587
+        'ME' => __( 'Messina', 'invoicing' ),
588
+        'MI' => __( 'Milano', 'invoicing' ),
589
+        'MO' => __( 'Modena', 'invoicing' ),
590
+        'MB' => __( 'Monza e della Brianza', 'invoicing' ),
591
+        'NA' => __( 'Napoli', 'invoicing' ),
592
+        'NO' => __( 'Novara', 'invoicing' ),
593
+        'NU' => __( 'Nuoro', 'invoicing' ),
594
+        'OR' => __( 'Oristano', 'invoicing' ),
595
+        'PD' => __( 'Padova', 'invoicing' ),
596
+        'PA' => __( 'Palermo', 'invoicing' ),
597
+        'PR' => __( 'Parma', 'invoicing' ),
598
+        'PV' => __( 'Pavia', 'invoicing' ),
599
+        'PG' => __( 'Perugia', 'invoicing' ),
600
+        'PU' => __( 'Pesaro e Urbino', 'invoicing' ),
601
+        'PE' => __( 'Pescara', 'invoicing' ),
602
+        'PC' => __( 'Piacenza', 'invoicing' ),
603
+        'PI' => __( 'Pisa', 'invoicing' ),
604
+        'PT' => __( 'Pistoia', 'invoicing' ),
605
+        'PN' => __( 'Pordenone', 'invoicing' ),
606
+        'PZ' => __( 'Potenza', 'invoicing' ),
607
+        'PO' => __( 'Prato', 'invoicing' ),
608
+        'RG' => __( 'Ragusa', 'invoicing' ),
609
+        'RA' => __( 'Ravenna', 'invoicing' ),
610
+        'RC' => __( 'Reggio Calabria', 'invoicing' ),
611
+        'RE' => __( 'Reggio Emilia', 'invoicing' ),
612
+        'RI' => __( 'Rieti', 'invoicing' ),
613
+        'RN' => __( 'Rimini', 'invoicing' ),
614
+        'RM' => __( 'Roma', 'invoicing' ),
615
+        'RO' => __( 'Rovigo', 'invoicing' ),
616
+        'SA' => __( 'Salerno', 'invoicing' ),
617
+        'SS' => __( 'Sassari', 'invoicing' ),
618
+        'SV' => __( 'Savona', 'invoicing' ),
619
+        'SI' => __( 'Siena', 'invoicing' ),
620
+        'SR' => __( 'Siracusa', 'invoicing' ),
621
+        'SO' => __( 'Sondrio', 'invoicing' ),
622
+        'SU' => __( 'Sud Sardegna', 'invoicing' ),
623
+        'TA' => __( 'Taranto', 'invoicing' ),
624
+        'TE' => __( 'Teramo', 'invoicing' ),
625
+        'TR' => __( 'Terni', 'invoicing' ),
626
+        'TO' => __( 'Torino', 'invoicing' ),
627
+        'TP' => __( 'Trapani', 'invoicing' ),
628
+        'TN' => __( 'Trento', 'invoicing' ),
629
+        'TV' => __( 'Treviso', 'invoicing' ),
630
+        'TS' => __( 'Trieste', 'invoicing' ),
631
+        'UD' => __( 'Udine', 'invoicing' ),
632
+        'VA' => __( 'Varese', 'invoicing' ),
633
+        'VE' => __( 'Venezia', 'invoicing' ),
634
+        'VB' => __( 'Verbano-Cusio-Ossola', 'invoicing' ),
635
+        'VC' => __( 'Vercelli', 'invoicing' ),
636
+        'VR' => __( 'Verona', 'invoicing' ),
637
+        'VV' => __( 'Vibo Valentia', 'invoicing' ),
638
+        'VI' => __( 'Vicenza', 'invoicing' ),
639
+        'VT' => __( 'Viterbo', 'invoicing' ),
640
+    ),
641
+    'IL' => array(),
642
+    'IM' => array(),
643 643
 
644
-	/**
645
-	 * Japan States.
646
-	 *
647
-	 * English notation of prefectures conform to the notation of Japan Post.
648
-	 * The suffix corresponds with the Japanese translation file.
649
-	 */
650
-	'JP' => array(
651
-		'JP01' => __( 'Hokkaido', 'invoicing' ),
652
-		'JP02' => __( 'Aomori', 'invoicing' ),
653
-		'JP03' => __( 'Iwate', 'invoicing' ),
654
-		'JP04' => __( 'Miyagi', 'invoicing' ),
655
-		'JP05' => __( 'Akita', 'invoicing' ),
656
-		'JP06' => __( 'Yamagata', 'invoicing' ),
657
-		'JP07' => __( 'Fukushima', 'invoicing' ),
658
-		'JP08' => __( 'Ibaraki', 'invoicing' ),
659
-		'JP09' => __( 'Tochigi', 'invoicing' ),
660
-		'JP10' => __( 'Gunma', 'invoicing' ),
661
-		'JP11' => __( 'Saitama', 'invoicing' ),
662
-		'JP12' => __( 'Chiba', 'invoicing' ),
663
-		'JP13' => __( 'Tokyo', 'invoicing' ),
664
-		'JP14' => __( 'Kanagawa', 'invoicing' ),
665
-		'JP15' => __( 'Niigata', 'invoicing' ),
666
-		'JP16' => __( 'Toyama', 'invoicing' ),
667
-		'JP17' => __( 'Ishikawa', 'invoicing' ),
668
-		'JP18' => __( 'Fukui', 'invoicing' ),
669
-		'JP19' => __( 'Yamanashi', 'invoicing' ),
670
-		'JP20' => __( 'Nagano', 'invoicing' ),
671
-		'JP21' => __( 'Gifu', 'invoicing' ),
672
-		'JP22' => __( 'Shizuoka', 'invoicing' ),
673
-		'JP23' => __( 'Aichi', 'invoicing' ),
674
-		'JP24' => __( 'Mie', 'invoicing' ),
675
-		'JP25' => __( 'Shiga', 'invoicing' ),
676
-		'JP26' => __( 'Kyoto', 'invoicing' ),
677
-		'JP27' => __( 'Osaka', 'invoicing' ),
678
-		'JP28' => __( 'Hyogo', 'invoicing' ),
679
-		'JP29' => __( 'Nara', 'invoicing' ),
680
-		'JP30' => __( 'Wakayama', 'invoicing' ),
681
-		'JP31' => __( 'Tottori', 'invoicing' ),
682
-		'JP32' => __( 'Shimane', 'invoicing' ),
683
-		'JP33' => __( 'Okayama', 'invoicing' ),
684
-		'JP34' => __( 'Hiroshima', 'invoicing' ),
685
-		'JP35' => __( 'Yamaguchi', 'invoicing' ),
686
-		'JP36' => __( 'Tokushima', 'invoicing' ),
687
-		'JP37' => __( 'Kagawa', 'invoicing' ),
688
-		'JP38' => __( 'Ehime', 'invoicing' ),
689
-		'JP39' => __( 'Kochi', 'invoicing' ),
690
-		'JP40' => __( 'Fukuoka', 'invoicing' ),
691
-		'JP41' => __( 'Saga', 'invoicing' ),
692
-		'JP42' => __( 'Nagasaki', 'invoicing' ),
693
-		'JP43' => __( 'Kumamoto', 'invoicing' ),
694
-		'JP44' => __( 'Oita', 'invoicing' ),
695
-		'JP45' => __( 'Miyazaki', 'invoicing' ),
696
-		'JP46' => __( 'Kagoshima', 'invoicing' ),
697
-		'JP47' => __( 'Okinawa', 'invoicing' ),
698
-	),
699
-	'KE' => array( // Kenya Counties.
700
-		'1'  => __( 'Mombasa', 'invoicing' ),
701
-		'2'  => __( 'Kwale', 'invoicing' ),
702
-		'3'  => __( 'Kilifi', 'invoicing' ),
703
-		'4'  => __( 'Tana River', 'invoicing' ),
704
-		'5'  => __( 'Lamu', 'invoicing' ),
705
-		'6'  => __( 'Taita-Taveta', 'invoicing' ),
706
-		'7'  => __( 'Garissa', 'invoicing' ),
707
-		'8'  => __( 'Wajir', 'invoicing' ),
708
-		'9'  => __( 'Mandera', 'invoicing' ),
709
-		'10' => __( 'Marsabit', 'invoicing' ),
710
-		'11' => __( 'Isiolo', 'invoicing' ),
711
-		'12' => __( 'Meru', 'invoicing' ),
712
-		'13' => __( 'Tharaka-Nithi', 'invoicing' ),
713
-		'14' => __( 'Embu', 'invoicing' ),
714
-		'15' => __( 'Kitui', 'invoicing' ),
715
-		'16' => __( 'Machakos', 'invoicing' ),
716
-		'17' => __( 'Makueni', 'invoicing' ),
717
-		'18' => __( 'Nyandarua', 'invoicing' ),
718
-		'19' => __( 'Nyeri', 'invoicing' ),
719
-		'20' => __( 'Kirinyaga', 'invoicing' ),
720
-		'21' => __( "Murang'a", 'invoicing' ),
721
-		'22' => __( 'Kiambu', 'invoicing' ),
722
-		'23' => __( 'Turkana', 'invoicing' ),
723
-		'24' => __( 'West Pokot', 'invoicing' ),
724
-		'25' => __( 'Samburu', 'invoicing' ),
725
-		'26' => __( 'Trans-Nzoia', 'invoicing' ),
726
-		'27' => __( 'Uasin Gishu', 'invoicing' ),
727
-		'28' => __( 'Elgeyo-Marakwet', 'invoicing' ),
728
-		'29' => __( 'Nandi', 'invoicing' ),
729
-		'30' => __( 'Baringo', 'invoicing' ),
730
-		'31' => __( 'Laikipia', 'invoicing' ),
731
-		'32' => __( 'Nakuru', 'invoicing' ),
732
-		'33' => __( 'Narok', 'invoicing' ),
733
-		'34' => __( 'Kajiado', 'invoicing' ),
734
-		'35' => __( 'Kericho', 'invoicing' ),
735
-		'36' => __( 'Bomet', 'invoicing' ),
736
-		'37' => __( 'Kakamega', 'invoicing' ),
737
-		'38' => __( 'Vihiga', 'invoicing' ),
738
-		'39' => __( 'Bungoma', 'invoicing' ),
739
-		'40' => __( 'Busia', 'invoicing' ),
740
-		'41' => __( 'Siaya', 'invoicing' ),
741
-		'42' => __( 'Kisumu', 'invoicing' ),
742
-		'43' => __( 'Homa bay', 'invoicing' ),
743
-		'44' => __( 'Migori', 'invoicing' ),
744
-		'45' => __( 'Kisii', 'invoicing' ),
745
-		'46' => __( 'Nyamira', 'invoicing' ),
746
-		'47' => __( 'Nairobi', 'invoicing' ),
747
-	),
748
-	'KR' => array(),
749
-	'KW' => array(),
750
-	'LB' => array(),
751
-	'LR' => array( // Liberia provinces.
752
-		'BM' => __( 'Bomi', 'invoicing' ),
753
-		'BN' => __( 'Bong', 'invoicing' ),
754
-		'GA' => __( 'Gbarpolu', 'invoicing' ),
755
-		'GB' => __( 'Grand Bassa', 'invoicing' ),
756
-		'GC' => __( 'Grand Cape Mount', 'invoicing' ),
757
-		'GG' => __( 'Grand Gedeh', 'invoicing' ),
758
-		'GK' => __( 'Grand Kru', 'invoicing' ),
759
-		'LO' => __( 'Lofa', 'invoicing' ),
760
-		'MA' => __( 'Margibi', 'invoicing' ),
761
-		'MY' => __( 'Maryland', 'invoicing' ),
762
-		'MO' => __( 'Montserrado', 'invoicing' ),
763
-		'NM' => __( 'Nimba', 'invoicing' ),
764
-		'RV' => __( 'Rivercess', 'invoicing' ),
765
-		'RG' => __( 'River Gee', 'invoicing' ),
766
-		'SN' => __( 'Sinoe', 'invoicing' ),
767
-	),
768
-	'LU' => array(),
769
-	'MD' => array( // Moldova states.
770
-		'C'  => __( 'Chi&#537;in&#259;u', 'invoicing' ),
771
-		'BL' => __( 'B&#259;l&#539;i', 'invoicing' ),
772
-		'AN' => __( 'Anenii Noi', 'invoicing' ),
773
-		'BS' => __( 'Basarabeasca', 'invoicing' ),
774
-		'BR' => __( 'Briceni', 'invoicing' ),
775
-		'CH' => __( 'Cahul', 'invoicing' ),
776
-		'CT' => __( 'Cantemir', 'invoicing' ),
777
-		'CL' => __( 'C&#259;l&#259;ra&#537;i', 'invoicing' ),
778
-		'CS' => __( 'C&#259;u&#537;eni', 'invoicing' ),
779
-		'CM' => __( 'Cimi&#537;lia', 'invoicing' ),
780
-		'CR' => __( 'Criuleni', 'invoicing' ),
781
-		'DN' => __( 'Dondu&#537;eni', 'invoicing' ),
782
-		'DR' => __( 'Drochia', 'invoicing' ),
783
-		'DB' => __( 'Dub&#259;sari', 'invoicing' ),
784
-		'ED' => __( 'Edine&#539;', 'invoicing' ),
785
-		'FL' => __( 'F&#259;le&#537;ti', 'invoicing' ),
786
-		'FR' => __( 'Flore&#537;ti', 'invoicing' ),
787
-		'GE' => __( 'UTA G&#259;g&#259;uzia', 'invoicing' ),
788
-		'GL' => __( 'Glodeni', 'invoicing' ),
789
-		'HN' => __( 'H&icirc;nce&#537;ti', 'invoicing' ),
790
-		'IL' => __( 'Ialoveni', 'invoicing' ),
791
-		'LV' => __( 'Leova', 'invoicing' ),
792
-		'NS' => __( 'Nisporeni', 'invoicing' ),
793
-		'OC' => __( 'Ocni&#539;a', 'invoicing' ),
794
-		'OR' => __( 'Orhei', 'invoicing' ),
795
-		'RZ' => __( 'Rezina', 'invoicing' ),
796
-		'RS' => __( 'R&icirc;&#537;cani', 'invoicing' ),
797
-		'SG' => __( 'S&icirc;ngerei', 'invoicing' ),
798
-		'SR' => __( 'Soroca', 'invoicing' ),
799
-		'ST' => __( 'Str&#259;&#537;eni', 'invoicing' ),
800
-		'SD' => __( '&#536;old&#259;ne&#537;ti', 'invoicing' ),
801
-		'SV' => __( '&#536;tefan Vod&#259;', 'invoicing' ),
802
-		'TR' => __( 'Taraclia', 'invoicing' ),
803
-		'TL' => __( 'Telene&#537;ti', 'invoicing' ),
804
-		'UN' => __( 'Ungheni', 'invoicing' ),
805
-	),
806
-	'MQ' => array(),
807
-	'MT' => array(),
808
-	'MX' => array( // Mexico States.
809
-		'DF' => __( 'Ciudad de M&eacute;xico', 'invoicing' ),
810
-		'JA' => __( 'Jalisco', 'invoicing' ),
811
-		'NL' => __( 'Nuevo Le&oacute;n', 'invoicing' ),
812
-		'AG' => __( 'Aguascalientes', 'invoicing' ),
813
-		'BC' => __( 'Baja California', 'invoicing' ),
814
-		'BS' => __( 'Baja California Sur', 'invoicing' ),
815
-		'CM' => __( 'Campeche', 'invoicing' ),
816
-		'CS' => __( 'Chiapas', 'invoicing' ),
817
-		'CH' => __( 'Chihuahua', 'invoicing' ),
818
-		'CO' => __( 'Coahuila', 'invoicing' ),
819
-		'CL' => __( 'Colima', 'invoicing' ),
820
-		'DG' => __( 'Durango', 'invoicing' ),
821
-		'GT' => __( 'Guanajuato', 'invoicing' ),
822
-		'GR' => __( 'Guerrero', 'invoicing' ),
823
-		'HG' => __( 'Hidalgo', 'invoicing' ),
824
-		'MX' => __( 'Estado de M&eacute;xico', 'invoicing' ),
825
-		'MI' => __( 'Michoac&aacute;n', 'invoicing' ),
826
-		'MO' => __( 'Morelos', 'invoicing' ),
827
-		'NA' => __( 'Nayarit', 'invoicing' ),
828
-		'OA' => __( 'Oaxaca', 'invoicing' ),
829
-		'PU' => __( 'Puebla', 'invoicing' ),
830
-		'QT' => __( 'Quer&eacute;taro', 'invoicing' ),
831
-		'QR' => __( 'Quintana Roo', 'invoicing' ),
832
-		'SL' => __( 'San Luis Potos&iacute;', 'invoicing' ),
833
-		'SI' => __( 'Sinaloa', 'invoicing' ),
834
-		'SO' => __( 'Sonora', 'invoicing' ),
835
-		'TB' => __( 'Tabasco', 'invoicing' ),
836
-		'TM' => __( 'Tamaulipas', 'invoicing' ),
837
-		'TL' => __( 'Tlaxcala', 'invoicing' ),
838
-		'VE' => __( 'Veracruz', 'invoicing' ),
839
-		'YU' => __( 'Yucat&aacute;n', 'invoicing' ),
840
-		'ZA' => __( 'Zacatecas', 'invoicing' ),
841
-	),
842
-	'MY' => array( // Malaysian states.
843
-		'JHR' => __( 'Johor', 'invoicing' ),
844
-		'KDH' => __( 'Kedah', 'invoicing' ),
845
-		'KTN' => __( 'Kelantan', 'invoicing' ),
846
-		'LBN' => __( 'Labuan', 'invoicing' ),
847
-		'MLK' => __( 'Malacca (Melaka)', 'invoicing' ),
848
-		'NSN' => __( 'Negeri Sembilan', 'invoicing' ),
849
-		'PHG' => __( 'Pahang', 'invoicing' ),
850
-		'PNG' => __( 'Penang (Pulau Pinang)', 'invoicing' ),
851
-		'PRK' => __( 'Perak', 'invoicing' ),
852
-		'PLS' => __( 'Perlis', 'invoicing' ),
853
-		'SBH' => __( 'Sabah', 'invoicing' ),
854
-		'SWK' => __( 'Sarawak', 'invoicing' ),
855
-		'SGR' => __( 'Selangor', 'invoicing' ),
856
-		'TRG' => __( 'Terengganu', 'invoicing' ),
857
-		'PJY' => __( 'Putrajaya', 'invoicing' ),
858
-		'KUL' => __( 'Kuala Lumpur', 'invoicing' ),
859
-	),
860
-	'NG' => array( // Nigerian provinces.
861
-		'AB' => __( 'Abia', 'invoicing' ),
862
-		'FC' => __( 'Abuja', 'invoicing' ),
863
-		'AD' => __( 'Adamawa', 'invoicing' ),
864
-		'AK' => __( 'Akwa Ibom', 'invoicing' ),
865
-		'AN' => __( 'Anambra', 'invoicing' ),
866
-		'BA' => __( 'Bauchi', 'invoicing' ),
867
-		'BY' => __( 'Bayelsa', 'invoicing' ),
868
-		'BE' => __( 'Benue', 'invoicing' ),
869
-		'BO' => __( 'Borno', 'invoicing' ),
870
-		'CR' => __( 'Cross River', 'invoicing' ),
871
-		'DE' => __( 'Delta', 'invoicing' ),
872
-		'EB' => __( 'Ebonyi', 'invoicing' ),
873
-		'ED' => __( 'Edo', 'invoicing' ),
874
-		'EK' => __( 'Ekiti', 'invoicing' ),
875
-		'EN' => __( 'Enugu', 'invoicing' ),
876
-		'GO' => __( 'Gombe', 'invoicing' ),
877
-		'IM' => __( 'Imo', 'invoicing' ),
878
-		'JI' => __( 'Jigawa', 'invoicing' ),
879
-		'KD' => __( 'Kaduna', 'invoicing' ),
880
-		'KN' => __( 'Kano', 'invoicing' ),
881
-		'KT' => __( 'Katsina', 'invoicing' ),
882
-		'KE' => __( 'Kebbi', 'invoicing' ),
883
-		'KO' => __( 'Kogi', 'invoicing' ),
884
-		'KW' => __( 'Kwara', 'invoicing' ),
885
-		'LA' => __( 'Lagos', 'invoicing' ),
886
-		'NA' => __( 'Nasarawa', 'invoicing' ),
887
-		'NI' => __( 'Niger', 'invoicing' ),
888
-		'OG' => __( 'Ogun', 'invoicing' ),
889
-		'ON' => __( 'Ondo', 'invoicing' ),
890
-		'OS' => __( 'Osun', 'invoicing' ),
891
-		'OY' => __( 'Oyo', 'invoicing' ),
892
-		'PL' => __( 'Plateau', 'invoicing' ),
893
-		'RI' => __( 'Rivers', 'invoicing' ),
894
-		'SO' => __( 'Sokoto', 'invoicing' ),
895
-		'TA' => __( 'Taraba', 'invoicing' ),
896
-		'YO' => __( 'Yobe', 'invoicing' ),
897
-		'ZA' => __( 'Zamfara', 'invoicing' ),
898
-	),
899
-	'NL' => array(),
900
-	'NO' => array(),
901
-	'NP' => array( // Nepal states (Zones).
902
-		'BAG' => __( 'Bagmati', 'invoicing' ),
903
-		'BHE' => __( 'Bheri', 'invoicing' ),
904
-		'DHA' => __( 'Dhaulagiri', 'invoicing' ),
905
-		'GAN' => __( 'Gandaki', 'invoicing' ),
906
-		'JAN' => __( 'Janakpur', 'invoicing' ),
907
-		'KAR' => __( 'Karnali', 'invoicing' ),
908
-		'KOS' => __( 'Koshi', 'invoicing' ),
909
-		'LUM' => __( 'Lumbini', 'invoicing' ),
910
-		'MAH' => __( 'Mahakali', 'invoicing' ),
911
-		'MEC' => __( 'Mechi', 'invoicing' ),
912
-		'NAR' => __( 'Narayani', 'invoicing' ),
913
-		'RAP' => __( 'Rapti', 'invoicing' ),
914
-		'SAG' => __( 'Sagarmatha', 'invoicing' ),
915
-		'SET' => __( 'Seti', 'invoicing' ),
916
-	),
917
-	'NZ' => array( // New Zealand States.
918
-		'NL' => __( 'Northland', 'invoicing' ),
919
-		'AK' => __( 'Auckland', 'invoicing' ),
920
-		'WA' => __( 'Waikato', 'invoicing' ),
921
-		'BP' => __( 'Bay of Plenty', 'invoicing' ),
922
-		'TK' => __( 'Taranaki', 'invoicing' ),
923
-		'GI' => __( 'Gisborne', 'invoicing' ),
924
-		'HB' => __( 'Hawke&rsquo;s Bay', 'invoicing' ),
925
-		'MW' => __( 'Manawatu-Wanganui', 'invoicing' ),
926
-		'WE' => __( 'Wellington', 'invoicing' ),
927
-		'NS' => __( 'Nelson', 'invoicing' ),
928
-		'MB' => __( 'Marlborough', 'invoicing' ),
929
-		'TM' => __( 'Tasman', 'invoicing' ),
930
-		'WC' => __( 'West Coast', 'invoicing' ),
931
-		'CT' => __( 'Canterbury', 'invoicing' ),
932
-		'OT' => __( 'Otago', 'invoicing' ),
933
-		'SL' => __( 'Southland', 'invoicing' ),
934
-	),
935
-	'PE' => array( // Peru states.
936
-		'CAL' => __( 'El Callao', 'invoicing' ),
937
-		'LMA' => __( 'Municipalidad Metropolitana de Lima', 'invoicing' ),
938
-		'AMA' => __( 'Amazonas', 'invoicing' ),
939
-		'ANC' => __( 'Ancash', 'invoicing' ),
940
-		'APU' => __( 'Apur&iacute;mac', 'invoicing' ),
941
-		'ARE' => __( 'Arequipa', 'invoicing' ),
942
-		'AYA' => __( 'Ayacucho', 'invoicing' ),
943
-		'CAJ' => __( 'Cajamarca', 'invoicing' ),
944
-		'CUS' => __( 'Cusco', 'invoicing' ),
945
-		'HUV' => __( 'Huancavelica', 'invoicing' ),
946
-		'HUC' => __( 'Hu&aacute;nuco', 'invoicing' ),
947
-		'ICA' => __( 'Ica', 'invoicing' ),
948
-		'JUN' => __( 'Jun&iacute;n', 'invoicing' ),
949
-		'LAL' => __( 'La Libertad', 'invoicing' ),
950
-		'LAM' => __( 'Lambayeque', 'invoicing' ),
951
-		'LIM' => __( 'Lima', 'invoicing' ),
952
-		'LOR' => __( 'Loreto', 'invoicing' ),
953
-		'MDD' => __( 'Madre de Dios', 'invoicing' ),
954
-		'MOQ' => __( 'Moquegua', 'invoicing' ),
955
-		'PAS' => __( 'Pasco', 'invoicing' ),
956
-		'PIU' => __( 'Piura', 'invoicing' ),
957
-		'PUN' => __( 'Puno', 'invoicing' ),
958
-		'SAM' => __( 'San Mart&iacute;n', 'invoicing' ),
959
-		'TAC' => __( 'Tacna', 'invoicing' ),
960
-		'TUM' => __( 'Tumbes', 'invoicing' ),
961
-		'UCA' => __( 'Ucayali', 'invoicing' ),
962
-	),
644
+    /**
645
+     * Japan States.
646
+     *
647
+     * English notation of prefectures conform to the notation of Japan Post.
648
+     * The suffix corresponds with the Japanese translation file.
649
+     */
650
+    'JP' => array(
651
+        'JP01' => __( 'Hokkaido', 'invoicing' ),
652
+        'JP02' => __( 'Aomori', 'invoicing' ),
653
+        'JP03' => __( 'Iwate', 'invoicing' ),
654
+        'JP04' => __( 'Miyagi', 'invoicing' ),
655
+        'JP05' => __( 'Akita', 'invoicing' ),
656
+        'JP06' => __( 'Yamagata', 'invoicing' ),
657
+        'JP07' => __( 'Fukushima', 'invoicing' ),
658
+        'JP08' => __( 'Ibaraki', 'invoicing' ),
659
+        'JP09' => __( 'Tochigi', 'invoicing' ),
660
+        'JP10' => __( 'Gunma', 'invoicing' ),
661
+        'JP11' => __( 'Saitama', 'invoicing' ),
662
+        'JP12' => __( 'Chiba', 'invoicing' ),
663
+        'JP13' => __( 'Tokyo', 'invoicing' ),
664
+        'JP14' => __( 'Kanagawa', 'invoicing' ),
665
+        'JP15' => __( 'Niigata', 'invoicing' ),
666
+        'JP16' => __( 'Toyama', 'invoicing' ),
667
+        'JP17' => __( 'Ishikawa', 'invoicing' ),
668
+        'JP18' => __( 'Fukui', 'invoicing' ),
669
+        'JP19' => __( 'Yamanashi', 'invoicing' ),
670
+        'JP20' => __( 'Nagano', 'invoicing' ),
671
+        'JP21' => __( 'Gifu', 'invoicing' ),
672
+        'JP22' => __( 'Shizuoka', 'invoicing' ),
673
+        'JP23' => __( 'Aichi', 'invoicing' ),
674
+        'JP24' => __( 'Mie', 'invoicing' ),
675
+        'JP25' => __( 'Shiga', 'invoicing' ),
676
+        'JP26' => __( 'Kyoto', 'invoicing' ),
677
+        'JP27' => __( 'Osaka', 'invoicing' ),
678
+        'JP28' => __( 'Hyogo', 'invoicing' ),
679
+        'JP29' => __( 'Nara', 'invoicing' ),
680
+        'JP30' => __( 'Wakayama', 'invoicing' ),
681
+        'JP31' => __( 'Tottori', 'invoicing' ),
682
+        'JP32' => __( 'Shimane', 'invoicing' ),
683
+        'JP33' => __( 'Okayama', 'invoicing' ),
684
+        'JP34' => __( 'Hiroshima', 'invoicing' ),
685
+        'JP35' => __( 'Yamaguchi', 'invoicing' ),
686
+        'JP36' => __( 'Tokushima', 'invoicing' ),
687
+        'JP37' => __( 'Kagawa', 'invoicing' ),
688
+        'JP38' => __( 'Ehime', 'invoicing' ),
689
+        'JP39' => __( 'Kochi', 'invoicing' ),
690
+        'JP40' => __( 'Fukuoka', 'invoicing' ),
691
+        'JP41' => __( 'Saga', 'invoicing' ),
692
+        'JP42' => __( 'Nagasaki', 'invoicing' ),
693
+        'JP43' => __( 'Kumamoto', 'invoicing' ),
694
+        'JP44' => __( 'Oita', 'invoicing' ),
695
+        'JP45' => __( 'Miyazaki', 'invoicing' ),
696
+        'JP46' => __( 'Kagoshima', 'invoicing' ),
697
+        'JP47' => __( 'Okinawa', 'invoicing' ),
698
+    ),
699
+    'KE' => array( // Kenya Counties.
700
+        '1'  => __( 'Mombasa', 'invoicing' ),
701
+        '2'  => __( 'Kwale', 'invoicing' ),
702
+        '3'  => __( 'Kilifi', 'invoicing' ),
703
+        '4'  => __( 'Tana River', 'invoicing' ),
704
+        '5'  => __( 'Lamu', 'invoicing' ),
705
+        '6'  => __( 'Taita-Taveta', 'invoicing' ),
706
+        '7'  => __( 'Garissa', 'invoicing' ),
707
+        '8'  => __( 'Wajir', 'invoicing' ),
708
+        '9'  => __( 'Mandera', 'invoicing' ),
709
+        '10' => __( 'Marsabit', 'invoicing' ),
710
+        '11' => __( 'Isiolo', 'invoicing' ),
711
+        '12' => __( 'Meru', 'invoicing' ),
712
+        '13' => __( 'Tharaka-Nithi', 'invoicing' ),
713
+        '14' => __( 'Embu', 'invoicing' ),
714
+        '15' => __( 'Kitui', 'invoicing' ),
715
+        '16' => __( 'Machakos', 'invoicing' ),
716
+        '17' => __( 'Makueni', 'invoicing' ),
717
+        '18' => __( 'Nyandarua', 'invoicing' ),
718
+        '19' => __( 'Nyeri', 'invoicing' ),
719
+        '20' => __( 'Kirinyaga', 'invoicing' ),
720
+        '21' => __( "Murang'a", 'invoicing' ),
721
+        '22' => __( 'Kiambu', 'invoicing' ),
722
+        '23' => __( 'Turkana', 'invoicing' ),
723
+        '24' => __( 'West Pokot', 'invoicing' ),
724
+        '25' => __( 'Samburu', 'invoicing' ),
725
+        '26' => __( 'Trans-Nzoia', 'invoicing' ),
726
+        '27' => __( 'Uasin Gishu', 'invoicing' ),
727
+        '28' => __( 'Elgeyo-Marakwet', 'invoicing' ),
728
+        '29' => __( 'Nandi', 'invoicing' ),
729
+        '30' => __( 'Baringo', 'invoicing' ),
730
+        '31' => __( 'Laikipia', 'invoicing' ),
731
+        '32' => __( 'Nakuru', 'invoicing' ),
732
+        '33' => __( 'Narok', 'invoicing' ),
733
+        '34' => __( 'Kajiado', 'invoicing' ),
734
+        '35' => __( 'Kericho', 'invoicing' ),
735
+        '36' => __( 'Bomet', 'invoicing' ),
736
+        '37' => __( 'Kakamega', 'invoicing' ),
737
+        '38' => __( 'Vihiga', 'invoicing' ),
738
+        '39' => __( 'Bungoma', 'invoicing' ),
739
+        '40' => __( 'Busia', 'invoicing' ),
740
+        '41' => __( 'Siaya', 'invoicing' ),
741
+        '42' => __( 'Kisumu', 'invoicing' ),
742
+        '43' => __( 'Homa bay', 'invoicing' ),
743
+        '44' => __( 'Migori', 'invoicing' ),
744
+        '45' => __( 'Kisii', 'invoicing' ),
745
+        '46' => __( 'Nyamira', 'invoicing' ),
746
+        '47' => __( 'Nairobi', 'invoicing' ),
747
+    ),
748
+    'KR' => array(),
749
+    'KW' => array(),
750
+    'LB' => array(),
751
+    'LR' => array( // Liberia provinces.
752
+        'BM' => __( 'Bomi', 'invoicing' ),
753
+        'BN' => __( 'Bong', 'invoicing' ),
754
+        'GA' => __( 'Gbarpolu', 'invoicing' ),
755
+        'GB' => __( 'Grand Bassa', 'invoicing' ),
756
+        'GC' => __( 'Grand Cape Mount', 'invoicing' ),
757
+        'GG' => __( 'Grand Gedeh', 'invoicing' ),
758
+        'GK' => __( 'Grand Kru', 'invoicing' ),
759
+        'LO' => __( 'Lofa', 'invoicing' ),
760
+        'MA' => __( 'Margibi', 'invoicing' ),
761
+        'MY' => __( 'Maryland', 'invoicing' ),
762
+        'MO' => __( 'Montserrado', 'invoicing' ),
763
+        'NM' => __( 'Nimba', 'invoicing' ),
764
+        'RV' => __( 'Rivercess', 'invoicing' ),
765
+        'RG' => __( 'River Gee', 'invoicing' ),
766
+        'SN' => __( 'Sinoe', 'invoicing' ),
767
+    ),
768
+    'LU' => array(),
769
+    'MD' => array( // Moldova states.
770
+        'C'  => __( 'Chi&#537;in&#259;u', 'invoicing' ),
771
+        'BL' => __( 'B&#259;l&#539;i', 'invoicing' ),
772
+        'AN' => __( 'Anenii Noi', 'invoicing' ),
773
+        'BS' => __( 'Basarabeasca', 'invoicing' ),
774
+        'BR' => __( 'Briceni', 'invoicing' ),
775
+        'CH' => __( 'Cahul', 'invoicing' ),
776
+        'CT' => __( 'Cantemir', 'invoicing' ),
777
+        'CL' => __( 'C&#259;l&#259;ra&#537;i', 'invoicing' ),
778
+        'CS' => __( 'C&#259;u&#537;eni', 'invoicing' ),
779
+        'CM' => __( 'Cimi&#537;lia', 'invoicing' ),
780
+        'CR' => __( 'Criuleni', 'invoicing' ),
781
+        'DN' => __( 'Dondu&#537;eni', 'invoicing' ),
782
+        'DR' => __( 'Drochia', 'invoicing' ),
783
+        'DB' => __( 'Dub&#259;sari', 'invoicing' ),
784
+        'ED' => __( 'Edine&#539;', 'invoicing' ),
785
+        'FL' => __( 'F&#259;le&#537;ti', 'invoicing' ),
786
+        'FR' => __( 'Flore&#537;ti', 'invoicing' ),
787
+        'GE' => __( 'UTA G&#259;g&#259;uzia', 'invoicing' ),
788
+        'GL' => __( 'Glodeni', 'invoicing' ),
789
+        'HN' => __( 'H&icirc;nce&#537;ti', 'invoicing' ),
790
+        'IL' => __( 'Ialoveni', 'invoicing' ),
791
+        'LV' => __( 'Leova', 'invoicing' ),
792
+        'NS' => __( 'Nisporeni', 'invoicing' ),
793
+        'OC' => __( 'Ocni&#539;a', 'invoicing' ),
794
+        'OR' => __( 'Orhei', 'invoicing' ),
795
+        'RZ' => __( 'Rezina', 'invoicing' ),
796
+        'RS' => __( 'R&icirc;&#537;cani', 'invoicing' ),
797
+        'SG' => __( 'S&icirc;ngerei', 'invoicing' ),
798
+        'SR' => __( 'Soroca', 'invoicing' ),
799
+        'ST' => __( 'Str&#259;&#537;eni', 'invoicing' ),
800
+        'SD' => __( '&#536;old&#259;ne&#537;ti', 'invoicing' ),
801
+        'SV' => __( '&#536;tefan Vod&#259;', 'invoicing' ),
802
+        'TR' => __( 'Taraclia', 'invoicing' ),
803
+        'TL' => __( 'Telene&#537;ti', 'invoicing' ),
804
+        'UN' => __( 'Ungheni', 'invoicing' ),
805
+    ),
806
+    'MQ' => array(),
807
+    'MT' => array(),
808
+    'MX' => array( // Mexico States.
809
+        'DF' => __( 'Ciudad de M&eacute;xico', 'invoicing' ),
810
+        'JA' => __( 'Jalisco', 'invoicing' ),
811
+        'NL' => __( 'Nuevo Le&oacute;n', 'invoicing' ),
812
+        'AG' => __( 'Aguascalientes', 'invoicing' ),
813
+        'BC' => __( 'Baja California', 'invoicing' ),
814
+        'BS' => __( 'Baja California Sur', 'invoicing' ),
815
+        'CM' => __( 'Campeche', 'invoicing' ),
816
+        'CS' => __( 'Chiapas', 'invoicing' ),
817
+        'CH' => __( 'Chihuahua', 'invoicing' ),
818
+        'CO' => __( 'Coahuila', 'invoicing' ),
819
+        'CL' => __( 'Colima', 'invoicing' ),
820
+        'DG' => __( 'Durango', 'invoicing' ),
821
+        'GT' => __( 'Guanajuato', 'invoicing' ),
822
+        'GR' => __( 'Guerrero', 'invoicing' ),
823
+        'HG' => __( 'Hidalgo', 'invoicing' ),
824
+        'MX' => __( 'Estado de M&eacute;xico', 'invoicing' ),
825
+        'MI' => __( 'Michoac&aacute;n', 'invoicing' ),
826
+        'MO' => __( 'Morelos', 'invoicing' ),
827
+        'NA' => __( 'Nayarit', 'invoicing' ),
828
+        'OA' => __( 'Oaxaca', 'invoicing' ),
829
+        'PU' => __( 'Puebla', 'invoicing' ),
830
+        'QT' => __( 'Quer&eacute;taro', 'invoicing' ),
831
+        'QR' => __( 'Quintana Roo', 'invoicing' ),
832
+        'SL' => __( 'San Luis Potos&iacute;', 'invoicing' ),
833
+        'SI' => __( 'Sinaloa', 'invoicing' ),
834
+        'SO' => __( 'Sonora', 'invoicing' ),
835
+        'TB' => __( 'Tabasco', 'invoicing' ),
836
+        'TM' => __( 'Tamaulipas', 'invoicing' ),
837
+        'TL' => __( 'Tlaxcala', 'invoicing' ),
838
+        'VE' => __( 'Veracruz', 'invoicing' ),
839
+        'YU' => __( 'Yucat&aacute;n', 'invoicing' ),
840
+        'ZA' => __( 'Zacatecas', 'invoicing' ),
841
+    ),
842
+    'MY' => array( // Malaysian states.
843
+        'JHR' => __( 'Johor', 'invoicing' ),
844
+        'KDH' => __( 'Kedah', 'invoicing' ),
845
+        'KTN' => __( 'Kelantan', 'invoicing' ),
846
+        'LBN' => __( 'Labuan', 'invoicing' ),
847
+        'MLK' => __( 'Malacca (Melaka)', 'invoicing' ),
848
+        'NSN' => __( 'Negeri Sembilan', 'invoicing' ),
849
+        'PHG' => __( 'Pahang', 'invoicing' ),
850
+        'PNG' => __( 'Penang (Pulau Pinang)', 'invoicing' ),
851
+        'PRK' => __( 'Perak', 'invoicing' ),
852
+        'PLS' => __( 'Perlis', 'invoicing' ),
853
+        'SBH' => __( 'Sabah', 'invoicing' ),
854
+        'SWK' => __( 'Sarawak', 'invoicing' ),
855
+        'SGR' => __( 'Selangor', 'invoicing' ),
856
+        'TRG' => __( 'Terengganu', 'invoicing' ),
857
+        'PJY' => __( 'Putrajaya', 'invoicing' ),
858
+        'KUL' => __( 'Kuala Lumpur', 'invoicing' ),
859
+    ),
860
+    'NG' => array( // Nigerian provinces.
861
+        'AB' => __( 'Abia', 'invoicing' ),
862
+        'FC' => __( 'Abuja', 'invoicing' ),
863
+        'AD' => __( 'Adamawa', 'invoicing' ),
864
+        'AK' => __( 'Akwa Ibom', 'invoicing' ),
865
+        'AN' => __( 'Anambra', 'invoicing' ),
866
+        'BA' => __( 'Bauchi', 'invoicing' ),
867
+        'BY' => __( 'Bayelsa', 'invoicing' ),
868
+        'BE' => __( 'Benue', 'invoicing' ),
869
+        'BO' => __( 'Borno', 'invoicing' ),
870
+        'CR' => __( 'Cross River', 'invoicing' ),
871
+        'DE' => __( 'Delta', 'invoicing' ),
872
+        'EB' => __( 'Ebonyi', 'invoicing' ),
873
+        'ED' => __( 'Edo', 'invoicing' ),
874
+        'EK' => __( 'Ekiti', 'invoicing' ),
875
+        'EN' => __( 'Enugu', 'invoicing' ),
876
+        'GO' => __( 'Gombe', 'invoicing' ),
877
+        'IM' => __( 'Imo', 'invoicing' ),
878
+        'JI' => __( 'Jigawa', 'invoicing' ),
879
+        'KD' => __( 'Kaduna', 'invoicing' ),
880
+        'KN' => __( 'Kano', 'invoicing' ),
881
+        'KT' => __( 'Katsina', 'invoicing' ),
882
+        'KE' => __( 'Kebbi', 'invoicing' ),
883
+        'KO' => __( 'Kogi', 'invoicing' ),
884
+        'KW' => __( 'Kwara', 'invoicing' ),
885
+        'LA' => __( 'Lagos', 'invoicing' ),
886
+        'NA' => __( 'Nasarawa', 'invoicing' ),
887
+        'NI' => __( 'Niger', 'invoicing' ),
888
+        'OG' => __( 'Ogun', 'invoicing' ),
889
+        'ON' => __( 'Ondo', 'invoicing' ),
890
+        'OS' => __( 'Osun', 'invoicing' ),
891
+        'OY' => __( 'Oyo', 'invoicing' ),
892
+        'PL' => __( 'Plateau', 'invoicing' ),
893
+        'RI' => __( 'Rivers', 'invoicing' ),
894
+        'SO' => __( 'Sokoto', 'invoicing' ),
895
+        'TA' => __( 'Taraba', 'invoicing' ),
896
+        'YO' => __( 'Yobe', 'invoicing' ),
897
+        'ZA' => __( 'Zamfara', 'invoicing' ),
898
+    ),
899
+    'NL' => array(),
900
+    'NO' => array(),
901
+    'NP' => array( // Nepal states (Zones).
902
+        'BAG' => __( 'Bagmati', 'invoicing' ),
903
+        'BHE' => __( 'Bheri', 'invoicing' ),
904
+        'DHA' => __( 'Dhaulagiri', 'invoicing' ),
905
+        'GAN' => __( 'Gandaki', 'invoicing' ),
906
+        'JAN' => __( 'Janakpur', 'invoicing' ),
907
+        'KAR' => __( 'Karnali', 'invoicing' ),
908
+        'KOS' => __( 'Koshi', 'invoicing' ),
909
+        'LUM' => __( 'Lumbini', 'invoicing' ),
910
+        'MAH' => __( 'Mahakali', 'invoicing' ),
911
+        'MEC' => __( 'Mechi', 'invoicing' ),
912
+        'NAR' => __( 'Narayani', 'invoicing' ),
913
+        'RAP' => __( 'Rapti', 'invoicing' ),
914
+        'SAG' => __( 'Sagarmatha', 'invoicing' ),
915
+        'SET' => __( 'Seti', 'invoicing' ),
916
+    ),
917
+    'NZ' => array( // New Zealand States.
918
+        'NL' => __( 'Northland', 'invoicing' ),
919
+        'AK' => __( 'Auckland', 'invoicing' ),
920
+        'WA' => __( 'Waikato', 'invoicing' ),
921
+        'BP' => __( 'Bay of Plenty', 'invoicing' ),
922
+        'TK' => __( 'Taranaki', 'invoicing' ),
923
+        'GI' => __( 'Gisborne', 'invoicing' ),
924
+        'HB' => __( 'Hawke&rsquo;s Bay', 'invoicing' ),
925
+        'MW' => __( 'Manawatu-Wanganui', 'invoicing' ),
926
+        'WE' => __( 'Wellington', 'invoicing' ),
927
+        'NS' => __( 'Nelson', 'invoicing' ),
928
+        'MB' => __( 'Marlborough', 'invoicing' ),
929
+        'TM' => __( 'Tasman', 'invoicing' ),
930
+        'WC' => __( 'West Coast', 'invoicing' ),
931
+        'CT' => __( 'Canterbury', 'invoicing' ),
932
+        'OT' => __( 'Otago', 'invoicing' ),
933
+        'SL' => __( 'Southland', 'invoicing' ),
934
+    ),
935
+    'PE' => array( // Peru states.
936
+        'CAL' => __( 'El Callao', 'invoicing' ),
937
+        'LMA' => __( 'Municipalidad Metropolitana de Lima', 'invoicing' ),
938
+        'AMA' => __( 'Amazonas', 'invoicing' ),
939
+        'ANC' => __( 'Ancash', 'invoicing' ),
940
+        'APU' => __( 'Apur&iacute;mac', 'invoicing' ),
941
+        'ARE' => __( 'Arequipa', 'invoicing' ),
942
+        'AYA' => __( 'Ayacucho', 'invoicing' ),
943
+        'CAJ' => __( 'Cajamarca', 'invoicing' ),
944
+        'CUS' => __( 'Cusco', 'invoicing' ),
945
+        'HUV' => __( 'Huancavelica', 'invoicing' ),
946
+        'HUC' => __( 'Hu&aacute;nuco', 'invoicing' ),
947
+        'ICA' => __( 'Ica', 'invoicing' ),
948
+        'JUN' => __( 'Jun&iacute;n', 'invoicing' ),
949
+        'LAL' => __( 'La Libertad', 'invoicing' ),
950
+        'LAM' => __( 'Lambayeque', 'invoicing' ),
951
+        'LIM' => __( 'Lima', 'invoicing' ),
952
+        'LOR' => __( 'Loreto', 'invoicing' ),
953
+        'MDD' => __( 'Madre de Dios', 'invoicing' ),
954
+        'MOQ' => __( 'Moquegua', 'invoicing' ),
955
+        'PAS' => __( 'Pasco', 'invoicing' ),
956
+        'PIU' => __( 'Piura', 'invoicing' ),
957
+        'PUN' => __( 'Puno', 'invoicing' ),
958
+        'SAM' => __( 'San Mart&iacute;n', 'invoicing' ),
959
+        'TAC' => __( 'Tacna', 'invoicing' ),
960
+        'TUM' => __( 'Tumbes', 'invoicing' ),
961
+        'UCA' => __( 'Ucayali', 'invoicing' ),
962
+    ),
963 963
 
964
-	/**
965
-	 * Philippine Provinces.
966
-	 */
967
-	'PH' => array(
968
-		'ABR' => __( 'Abra', 'invoicing' ),
969
-		'AGN' => __( 'Agusan del Norte', 'invoicing' ),
970
-		'AGS' => __( 'Agusan del Sur', 'invoicing' ),
971
-		'AKL' => __( 'Aklan', 'invoicing' ),
972
-		'ALB' => __( 'Albay', 'invoicing' ),
973
-		'ANT' => __( 'Antique', 'invoicing' ),
974
-		'APA' => __( 'Apayao', 'invoicing' ),
975
-		'AUR' => __( 'Aurora', 'invoicing' ),
976
-		'BAS' => __( 'Basilan', 'invoicing' ),
977
-		'BAN' => __( 'Bataan', 'invoicing' ),
978
-		'BTN' => __( 'Batanes', 'invoicing' ),
979
-		'BTG' => __( 'Batangas', 'invoicing' ),
980
-		'BEN' => __( 'Benguet', 'invoicing' ),
981
-		'BIL' => __( 'Biliran', 'invoicing' ),
982
-		'BOH' => __( 'Bohol', 'invoicing' ),
983
-		'BUK' => __( 'Bukidnon', 'invoicing' ),
984
-		'BUL' => __( 'Bulacan', 'invoicing' ),
985
-		'CAG' => __( 'Cagayan', 'invoicing' ),
986
-		'CAN' => __( 'Camarines Norte', 'invoicing' ),
987
-		'CAS' => __( 'Camarines Sur', 'invoicing' ),
988
-		'CAM' => __( 'Camiguin', 'invoicing' ),
989
-		'CAP' => __( 'Capiz', 'invoicing' ),
990
-		'CAT' => __( 'Catanduanes', 'invoicing' ),
991
-		'CAV' => __( 'Cavite', 'invoicing' ),
992
-		'CEB' => __( 'Cebu', 'invoicing' ),
993
-		'COM' => __( 'Compostela Valley', 'invoicing' ),
994
-		'NCO' => __( 'Cotabato', 'invoicing' ),
995
-		'DAV' => __( 'Davao del Norte', 'invoicing' ),
996
-		'DAS' => __( 'Davao del Sur', 'invoicing' ),
997
-		'DAC' => __( 'Davao Occidental', 'invoicing' ),
998
-		'DAO' => __( 'Davao Oriental', 'invoicing' ),
999
-		'DIN' => __( 'Dinagat Islands', 'invoicing' ),
1000
-		'EAS' => __( 'Eastern Samar', 'invoicing' ),
1001
-		'GUI' => __( 'Guimaras', 'invoicing' ),
1002
-		'IFU' => __( 'Ifugao', 'invoicing' ),
1003
-		'ILN' => __( 'Ilocos Norte', 'invoicing' ),
1004
-		'ILS' => __( 'Ilocos Sur', 'invoicing' ),
1005
-		'ILI' => __( 'Iloilo', 'invoicing' ),
1006
-		'ISA' => __( 'Isabela', 'invoicing' ),
1007
-		'KAL' => __( 'Kalinga', 'invoicing' ),
1008
-		'LUN' => __( 'La Union', 'invoicing' ),
1009
-		'LAG' => __( 'Laguna', 'invoicing' ),
1010
-		'LAN' => __( 'Lanao del Norte', 'invoicing' ),
1011
-		'LAS' => __( 'Lanao del Sur', 'invoicing' ),
1012
-		'LEY' => __( 'Leyte', 'invoicing' ),
1013
-		'MAG' => __( 'Maguindanao', 'invoicing' ),
1014
-		'MAD' => __( 'Marinduque', 'invoicing' ),
1015
-		'MAS' => __( 'Masbate', 'invoicing' ),
1016
-		'MSC' => __( 'Misamis Occidental', 'invoicing' ),
1017
-		'MSR' => __( 'Misamis Oriental', 'invoicing' ),
1018
-		'MOU' => __( 'Mountain Province', 'invoicing' ),
1019
-		'NEC' => __( 'Negros Occidental', 'invoicing' ),
1020
-		'NER' => __( 'Negros Oriental', 'invoicing' ),
1021
-		'NSA' => __( 'Northern Samar', 'invoicing' ),
1022
-		'NUE' => __( 'Nueva Ecija', 'invoicing' ),
1023
-		'NUV' => __( 'Nueva Vizcaya', 'invoicing' ),
1024
-		'MDC' => __( 'Occidental Mindoro', 'invoicing' ),
1025
-		'MDR' => __( 'Oriental Mindoro', 'invoicing' ),
1026
-		'PLW' => __( 'Palawan', 'invoicing' ),
1027
-		'PAM' => __( 'Pampanga', 'invoicing' ),
1028
-		'PAN' => __( 'Pangasinan', 'invoicing' ),
1029
-		'QUE' => __( 'Quezon', 'invoicing' ),
1030
-		'QUI' => __( 'Quirino', 'invoicing' ),
1031
-		'RIZ' => __( 'Rizal', 'invoicing' ),
1032
-		'ROM' => __( 'Romblon', 'invoicing' ),
1033
-		'WSA' => __( 'Samar', 'invoicing' ),
1034
-		'SAR' => __( 'Sarangani', 'invoicing' ),
1035
-		'SIQ' => __( 'Siquijor', 'invoicing' ),
1036
-		'SOR' => __( 'Sorsogon', 'invoicing' ),
1037
-		'SCO' => __( 'South Cotabato', 'invoicing' ),
1038
-		'SLE' => __( 'Southern Leyte', 'invoicing' ),
1039
-		'SUK' => __( 'Sultan Kudarat', 'invoicing' ),
1040
-		'SLU' => __( 'Sulu', 'invoicing' ),
1041
-		'SUN' => __( 'Surigao del Norte', 'invoicing' ),
1042
-		'SUR' => __( 'Surigao del Sur', 'invoicing' ),
1043
-		'TAR' => __( 'Tarlac', 'invoicing' ),
1044
-		'TAW' => __( 'Tawi-Tawi', 'invoicing' ),
1045
-		'ZMB' => __( 'Zambales', 'invoicing' ),
1046
-		'ZAN' => __( 'Zamboanga del Norte', 'invoicing' ),
1047
-		'ZAS' => __( 'Zamboanga del Sur', 'invoicing' ),
1048
-		'ZSI' => __( 'Zamboanga Sibugay', 'invoicing' ),
1049
-		'00'  => __( 'Metro Manila', 'invoicing' ),
1050
-	),
1051
-	'PK' => array( // Pakistan's states.
1052
-		'JK' => __( 'Azad Kashmir', 'invoicing' ),
1053
-		'BA' => __( 'Balochistan', 'invoicing' ),
1054
-		'TA' => __( 'FATA', 'invoicing' ),
1055
-		'GB' => __( 'Gilgit Baltistan', 'invoicing' ),
1056
-		'IS' => __( 'Islamabad Capital Territory', 'invoicing' ),
1057
-		'KP' => __( 'Khyber Pakhtunkhwa', 'invoicing' ),
1058
-		'PB' => __( 'Punjab', 'invoicing' ),
1059
-		'SD' => __( 'Sindh', 'invoicing' ),
1060
-	),
1061
-	'PL' => array(),
1062
-	'PT' => array(),
1063
-	'PY' => array( // Paraguay states.
1064
-		'PY-ASU' => __( 'Asunci&oacute;n', 'invoicing' ),
1065
-		'PY-1'   => __( 'Concepci&oacute;n', 'invoicing' ),
1066
-		'PY-2'   => __( 'San Pedro', 'invoicing' ),
1067
-		'PY-3'   => __( 'Cordillera', 'invoicing' ),
1068
-		'PY-4'   => __( 'Guair&aacute;', 'invoicing' ),
1069
-		'PY-5'   => __( 'Caaguaz&uacute;', 'invoicing' ),
1070
-		'PY-6'   => __( 'Caazap&aacute;', 'invoicing' ),
1071
-		'PY-7'   => __( 'Itap&uacute;a', 'invoicing' ),
1072
-		'PY-8'   => __( 'Misiones', 'invoicing' ),
1073
-		'PY-9'   => __( 'Paraguar&iacute;', 'invoicing' ),
1074
-		'PY-10'  => __( 'Alto Paran&aacute;', 'invoicing' ),
1075
-		'PY-11'  => __( 'Central', 'invoicing' ),
1076
-		'PY-12'  => __( '&Ntilde;eembuc&uacute;', 'invoicing' ),
1077
-		'PY-13'  => __( 'Amambay', 'invoicing' ),
1078
-		'PY-14'  => __( 'Canindey&uacute;', 'invoicing' ),
1079
-		'PY-15'  => __( 'Presidente Hayes', 'invoicing' ),
1080
-		'PY-16'  => __( 'Alto Paraguay', 'invoicing' ),
1081
-		'PY-17'  => __( 'Boquer&oacute;n', 'invoicing' ),
1082
-	),
1083
-	'RE' => array(),
1084
-	'RO' => array( // Romania states.
1085
-		'AB' => __( 'Alba', 'invoicing' ),
1086
-		'AR' => __( 'Arad', 'invoicing' ),
1087
-		'AG' => __( 'Arge&#537;', 'invoicing' ),
1088
-		'BC' => __( 'Bac&#259;u', 'invoicing' ),
1089
-		'BH' => __( 'Bihor', 'invoicing' ),
1090
-		'BN' => __( 'Bistri&#539;a-N&#259;s&#259;ud', 'invoicing' ),
1091
-		'BT' => __( 'Boto&#537;ani', 'invoicing' ),
1092
-		'BR' => __( 'Br&#259;ila', 'invoicing' ),
1093
-		'BV' => __( 'Bra&#537;ov', 'invoicing' ),
1094
-		'B'  => __( 'Bucure&#537;ti', 'invoicing' ),
1095
-		'BZ' => __( 'Buz&#259;u', 'invoicing' ),
1096
-		'CL' => __( 'C&#259;l&#259;ra&#537;i', 'invoicing' ),
1097
-		'CS' => __( 'Cara&#537;-Severin', 'invoicing' ),
1098
-		'CJ' => __( 'Cluj', 'invoicing' ),
1099
-		'CT' => __( 'Constan&#539;a', 'invoicing' ),
1100
-		'CV' => __( 'Covasna', 'invoicing' ),
1101
-		'DB' => __( 'D&acirc;mbovi&#539;a', 'invoicing' ),
1102
-		'DJ' => __( 'Dolj', 'invoicing' ),
1103
-		'GL' => __( 'Gala&#539;i', 'invoicing' ),
1104
-		'GR' => __( 'Giurgiu', 'invoicing' ),
1105
-		'GJ' => __( 'Gorj', 'invoicing' ),
1106
-		'HR' => __( 'Harghita', 'invoicing' ),
1107
-		'HD' => __( 'Hunedoara', 'invoicing' ),
1108
-		'IL' => __( 'Ialomi&#539;a', 'invoicing' ),
1109
-		'IS' => __( 'Ia&#537;i', 'invoicing' ),
1110
-		'IF' => __( 'Ilfov', 'invoicing' ),
1111
-		'MM' => __( 'Maramure&#537;', 'invoicing' ),
1112
-		'MH' => __( 'Mehedin&#539;i', 'invoicing' ),
1113
-		'MS' => __( 'Mure&#537;', 'invoicing' ),
1114
-		'NT' => __( 'Neam&#539;', 'invoicing' ),
1115
-		'OT' => __( 'Olt', 'invoicing' ),
1116
-		'PH' => __( 'Prahova', 'invoicing' ),
1117
-		'SJ' => __( 'S&#259;laj', 'invoicing' ),
1118
-		'SM' => __( 'Satu Mare', 'invoicing' ),
1119
-		'SB' => __( 'Sibiu', 'invoicing' ),
1120
-		'SV' => __( 'Suceava', 'invoicing' ),
1121
-		'TR' => __( 'Teleorman', 'invoicing' ),
1122
-		'TM' => __( 'Timi&#537;', 'invoicing' ),
1123
-		'TL' => __( 'Tulcea', 'invoicing' ),
1124
-		'VL' => __( 'V&acirc;lcea', 'invoicing' ),
1125
-		'VS' => __( 'Vaslui', 'invoicing' ),
1126
-		'VN' => __( 'Vrancea', 'invoicing' ),
1127
-	),
1128
-	'RS' => array(),
1129
-	'SG' => array(),
1130
-	'SK' => array(),
1131
-	'SI' => array(),
1132
-	'TH' => array( // Thailand states.
1133
-		'TH-37' => __( 'Amnat Charoen', 'invoicing' ),
1134
-		'TH-15' => __( 'Ang Thong', 'invoicing' ),
1135
-		'TH-14' => __( 'Ayutthaya', 'invoicing' ),
1136
-		'TH-10' => __( 'Bangkok', 'invoicing' ),
1137
-		'TH-38' => __( 'Bueng Kan', 'invoicing' ),
1138
-		'TH-31' => __( 'Buri Ram', 'invoicing' ),
1139
-		'TH-24' => __( 'Chachoengsao', 'invoicing' ),
1140
-		'TH-18' => __( 'Chai Nat', 'invoicing' ),
1141
-		'TH-36' => __( 'Chaiyaphum', 'invoicing' ),
1142
-		'TH-22' => __( 'Chanthaburi', 'invoicing' ),
1143
-		'TH-50' => __( 'Chiang Mai', 'invoicing' ),
1144
-		'TH-57' => __( 'Chiang Rai', 'invoicing' ),
1145
-		'TH-20' => __( 'Chonburi', 'invoicing' ),
1146
-		'TH-86' => __( 'Chumphon', 'invoicing' ),
1147
-		'TH-46' => __( 'Kalasin', 'invoicing' ),
1148
-		'TH-62' => __( 'Kamphaeng Phet', 'invoicing' ),
1149
-		'TH-71' => __( 'Kanchanaburi', 'invoicing' ),
1150
-		'TH-40' => __( 'Khon Kaen', 'invoicing' ),
1151
-		'TH-81' => __( 'Krabi', 'invoicing' ),
1152
-		'TH-52' => __( 'Lampang', 'invoicing' ),
1153
-		'TH-51' => __( 'Lamphun', 'invoicing' ),
1154
-		'TH-42' => __( 'Loei', 'invoicing' ),
1155
-		'TH-16' => __( 'Lopburi', 'invoicing' ),
1156
-		'TH-58' => __( 'Mae Hong Son', 'invoicing' ),
1157
-		'TH-44' => __( 'Maha Sarakham', 'invoicing' ),
1158
-		'TH-49' => __( 'Mukdahan', 'invoicing' ),
1159
-		'TH-26' => __( 'Nakhon Nayok', 'invoicing' ),
1160
-		'TH-73' => __( 'Nakhon Pathom', 'invoicing' ),
1161
-		'TH-48' => __( 'Nakhon Phanom', 'invoicing' ),
1162
-		'TH-30' => __( 'Nakhon Ratchasima', 'invoicing' ),
1163
-		'TH-60' => __( 'Nakhon Sawan', 'invoicing' ),
1164
-		'TH-80' => __( 'Nakhon Si Thammarat', 'invoicing' ),
1165
-		'TH-55' => __( 'Nan', 'invoicing' ),
1166
-		'TH-96' => __( 'Narathiwat', 'invoicing' ),
1167
-		'TH-39' => __( 'Nong Bua Lam Phu', 'invoicing' ),
1168
-		'TH-43' => __( 'Nong Khai', 'invoicing' ),
1169
-		'TH-12' => __( 'Nonthaburi', 'invoicing' ),
1170
-		'TH-13' => __( 'Pathum Thani', 'invoicing' ),
1171
-		'TH-94' => __( 'Pattani', 'invoicing' ),
1172
-		'TH-82' => __( 'Phang Nga', 'invoicing' ),
1173
-		'TH-93' => __( 'Phatthalung', 'invoicing' ),
1174
-		'TH-56' => __( 'Phayao', 'invoicing' ),
1175
-		'TH-67' => __( 'Phetchabun', 'invoicing' ),
1176
-		'TH-76' => __( 'Phetchaburi', 'invoicing' ),
1177
-		'TH-66' => __( 'Phichit', 'invoicing' ),
1178
-		'TH-65' => __( 'Phitsanulok', 'invoicing' ),
1179
-		'TH-54' => __( 'Phrae', 'invoicing' ),
1180
-		'TH-83' => __( 'Phuket', 'invoicing' ),
1181
-		'TH-25' => __( 'Prachin Buri', 'invoicing' ),
1182
-		'TH-77' => __( 'Prachuap Khiri Khan', 'invoicing' ),
1183
-		'TH-85' => __( 'Ranong', 'invoicing' ),
1184
-		'TH-70' => __( 'Ratchaburi', 'invoicing' ),
1185
-		'TH-21' => __( 'Rayong', 'invoicing' ),
1186
-		'TH-45' => __( 'Roi Et', 'invoicing' ),
1187
-		'TH-27' => __( 'Sa Kaeo', 'invoicing' ),
1188
-		'TH-47' => __( 'Sakon Nakhon', 'invoicing' ),
1189
-		'TH-11' => __( 'Samut Prakan', 'invoicing' ),
1190
-		'TH-74' => __( 'Samut Sakhon', 'invoicing' ),
1191
-		'TH-75' => __( 'Samut Songkhram', 'invoicing' ),
1192
-		'TH-19' => __( 'Saraburi', 'invoicing' ),
1193
-		'TH-91' => __( 'Satun', 'invoicing' ),
1194
-		'TH-17' => __( 'Sing Buri', 'invoicing' ),
1195
-		'TH-33' => __( 'Sisaket', 'invoicing' ),
1196
-		'TH-90' => __( 'Songkhla', 'invoicing' ),
1197
-		'TH-64' => __( 'Sukhothai', 'invoicing' ),
1198
-		'TH-72' => __( 'Suphan Buri', 'invoicing' ),
1199
-		'TH-84' => __( 'Surat Thani', 'invoicing' ),
1200
-		'TH-32' => __( 'Surin', 'invoicing' ),
1201
-		'TH-63' => __( 'Tak', 'invoicing' ),
1202
-		'TH-92' => __( 'Trang', 'invoicing' ),
1203
-		'TH-23' => __( 'Trat', 'invoicing' ),
1204
-		'TH-34' => __( 'Ubon Ratchathani', 'invoicing' ),
1205
-		'TH-41' => __( 'Udon Thani', 'invoicing' ),
1206
-		'TH-61' => __( 'Uthai Thani', 'invoicing' ),
1207
-		'TH-53' => __( 'Uttaradit', 'invoicing' ),
1208
-		'TH-95' => __( 'Yala', 'invoicing' ),
1209
-		'TH-35' => __( 'Yasothon', 'invoicing' ),
1210
-	),
1211
-	'TR' => array( // Turkey States.
1212
-		'TR01' => __( 'Adana', 'invoicing' ),
1213
-		'TR02' => __( 'Ad&#305;yaman', 'invoicing' ),
1214
-		'TR03' => __( 'Afyon', 'invoicing' ),
1215
-		'TR04' => __( 'A&#287;r&#305;', 'invoicing' ),
1216
-		'TR05' => __( 'Amasya', 'invoicing' ),
1217
-		'TR06' => __( 'Ankara', 'invoicing' ),
1218
-		'TR07' => __( 'Antalya', 'invoicing' ),
1219
-		'TR08' => __( 'Artvin', 'invoicing' ),
1220
-		'TR09' => __( 'Ayd&#305;n', 'invoicing' ),
1221
-		'TR10' => __( 'Bal&#305;kesir', 'invoicing' ),
1222
-		'TR11' => __( 'Bilecik', 'invoicing' ),
1223
-		'TR12' => __( 'Bing&#246;l', 'invoicing' ),
1224
-		'TR13' => __( 'Bitlis', 'invoicing' ),
1225
-		'TR14' => __( 'Bolu', 'invoicing' ),
1226
-		'TR15' => __( 'Burdur', 'invoicing' ),
1227
-		'TR16' => __( 'Bursa', 'invoicing' ),
1228
-		'TR17' => __( '&#199;anakkale', 'invoicing' ),
1229
-		'TR18' => __( '&#199;ank&#305;r&#305;', 'invoicing' ),
1230
-		'TR19' => __( '&#199;orum', 'invoicing' ),
1231
-		'TR20' => __( 'Denizli', 'invoicing' ),
1232
-		'TR21' => __( 'Diyarbak&#305;r', 'invoicing' ),
1233
-		'TR22' => __( 'Edirne', 'invoicing' ),
1234
-		'TR23' => __( 'Elaz&#305;&#287;', 'invoicing' ),
1235
-		'TR24' => __( 'Erzincan', 'invoicing' ),
1236
-		'TR25' => __( 'Erzurum', 'invoicing' ),
1237
-		'TR26' => __( 'Eski&#351;ehir', 'invoicing' ),
1238
-		'TR27' => __( 'Gaziantep', 'invoicing' ),
1239
-		'TR28' => __( 'Giresun', 'invoicing' ),
1240
-		'TR29' => __( 'G&#252;m&#252;&#351;hane', 'invoicing' ),
1241
-		'TR30' => __( 'Hakkari', 'invoicing' ),
1242
-		'TR31' => __( 'Hatay', 'invoicing' ),
1243
-		'TR32' => __( 'Isparta', 'invoicing' ),
1244
-		'TR33' => __( '&#304;&#231;el', 'invoicing' ),
1245
-		'TR34' => __( '&#304;stanbul', 'invoicing' ),
1246
-		'TR35' => __( '&#304;zmir', 'invoicing' ),
1247
-		'TR36' => __( 'Kars', 'invoicing' ),
1248
-		'TR37' => __( 'Kastamonu', 'invoicing' ),
1249
-		'TR38' => __( 'Kayseri', 'invoicing' ),
1250
-		'TR39' => __( 'K&#305;rklareli', 'invoicing' ),
1251
-		'TR40' => __( 'K&#305;r&#351;ehir', 'invoicing' ),
1252
-		'TR41' => __( 'Kocaeli', 'invoicing' ),
1253
-		'TR42' => __( 'Konya', 'invoicing' ),
1254
-		'TR43' => __( 'K&#252;tahya', 'invoicing' ),
1255
-		'TR44' => __( 'Malatya', 'invoicing' ),
1256
-		'TR45' => __( 'Manisa', 'invoicing' ),
1257
-		'TR46' => __( 'Kahramanmara&#351;', 'invoicing' ),
1258
-		'TR47' => __( 'Mardin', 'invoicing' ),
1259
-		'TR48' => __( 'Mu&#287;la', 'invoicing' ),
1260
-		'TR49' => __( 'Mu&#351;', 'invoicing' ),
1261
-		'TR50' => __( 'Nev&#351;ehir', 'invoicing' ),
1262
-		'TR51' => __( 'Ni&#287;de', 'invoicing' ),
1263
-		'TR52' => __( 'Ordu', 'invoicing' ),
1264
-		'TR53' => __( 'Rize', 'invoicing' ),
1265
-		'TR54' => __( 'Sakarya', 'invoicing' ),
1266
-		'TR55' => __( 'Samsun', 'invoicing' ),
1267
-		'TR56' => __( 'Siirt', 'invoicing' ),
1268
-		'TR57' => __( 'Sinop', 'invoicing' ),
1269
-		'TR58' => __( 'Sivas', 'invoicing' ),
1270
-		'TR59' => __( 'Tekirda&#287;', 'invoicing' ),
1271
-		'TR60' => __( 'Tokat', 'invoicing' ),
1272
-		'TR61' => __( 'Trabzon', 'invoicing' ),
1273
-		'TR62' => __( 'Tunceli', 'invoicing' ),
1274
-		'TR63' => __( '&#350;anl&#305;urfa', 'invoicing' ),
1275
-		'TR64' => __( 'U&#351;ak', 'invoicing' ),
1276
-		'TR65' => __( 'Van', 'invoicing' ),
1277
-		'TR66' => __( 'Yozgat', 'invoicing' ),
1278
-		'TR67' => __( 'Zonguldak', 'invoicing' ),
1279
-		'TR68' => __( 'Aksaray', 'invoicing' ),
1280
-		'TR69' => __( 'Bayburt', 'invoicing' ),
1281
-		'TR70' => __( 'Karaman', 'invoicing' ),
1282
-		'TR71' => __( 'K&#305;r&#305;kkale', 'invoicing' ),
1283
-		'TR72' => __( 'Batman', 'invoicing' ),
1284
-		'TR73' => __( '&#350;&#305;rnak', 'invoicing' ),
1285
-		'TR74' => __( 'Bart&#305;n', 'invoicing' ),
1286
-		'TR75' => __( 'Ardahan', 'invoicing' ),
1287
-		'TR76' => __( 'I&#287;d&#305;r', 'invoicing' ),
1288
-		'TR77' => __( 'Yalova', 'invoicing' ),
1289
-		'TR78' => __( 'Karab&#252;k', 'invoicing' ),
1290
-		'TR79' => __( 'Kilis', 'invoicing' ),
1291
-		'TR80' => __( 'Osmaniye', 'invoicing' ),
1292
-		'TR81' => __( 'D&#252;zce', 'invoicing' ),
1293
-	),
1294
-	'TZ' => array( // Tanzania States.
1295
-		'TZ01' => __( 'Arusha', 'invoicing' ),
1296
-		'TZ02' => __( 'Dar es Salaam', 'invoicing' ),
1297
-		'TZ03' => __( 'Dodoma', 'invoicing' ),
1298
-		'TZ04' => __( 'Iringa', 'invoicing' ),
1299
-		'TZ05' => __( 'Kagera', 'invoicing' ),
1300
-		'TZ06' => __( 'Pemba North', 'invoicing' ),
1301
-		'TZ07' => __( 'Zanzibar North', 'invoicing' ),
1302
-		'TZ08' => __( 'Kigoma', 'invoicing' ),
1303
-		'TZ09' => __( 'Kilimanjaro', 'invoicing' ),
1304
-		'TZ10' => __( 'Pemba South', 'invoicing' ),
1305
-		'TZ11' => __( 'Zanzibar South', 'invoicing' ),
1306
-		'TZ12' => __( 'Lindi', 'invoicing' ),
1307
-		'TZ13' => __( 'Mara', 'invoicing' ),
1308
-		'TZ14' => __( 'Mbeya', 'invoicing' ),
1309
-		'TZ15' => __( 'Zanzibar West', 'invoicing' ),
1310
-		'TZ16' => __( 'Morogoro', 'invoicing' ),
1311
-		'TZ17' => __( 'Mtwara', 'invoicing' ),
1312
-		'TZ18' => __( 'Mwanza', 'invoicing' ),
1313
-		'TZ19' => __( 'Coast', 'invoicing' ),
1314
-		'TZ20' => __( 'Rukwa', 'invoicing' ),
1315
-		'TZ21' => __( 'Ruvuma', 'invoicing' ),
1316
-		'TZ22' => __( 'Shinyanga', 'invoicing' ),
1317
-		'TZ23' => __( 'Singida', 'invoicing' ),
1318
-		'TZ24' => __( 'Tabora', 'invoicing' ),
1319
-		'TZ25' => __( 'Tanga', 'invoicing' ),
1320
-		'TZ26' => __( 'Manyara', 'invoicing' ),
1321
-		'TZ27' => __( 'Geita', 'invoicing' ),
1322
-		'TZ28' => __( 'Katavi', 'invoicing' ),
1323
-		'TZ29' => __( 'Njombe', 'invoicing' ),
1324
-		'TZ30' => __( 'Simiyu', 'invoicing' ),
1325
-	),
1326
-	'LK' => array(),
1327
-	'SE' => array(),
1328
-	'UG' => array( // Uganda districts. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:UG.
1329
-		'UG314' => __( 'Abim', 'invoicing' ),
1330
-		'UG301' => __( 'Adjumani', 'invoicing' ),
1331
-		'UG322' => __( 'Agago', 'invoicing' ),
1332
-		'UG323' => __( 'Alebtong', 'invoicing' ),
1333
-		'UG315' => __( 'Amolatar', 'invoicing' ),
1334
-		'UG324' => __( 'Amudat', 'invoicing' ),
1335
-		'UG216' => __( 'Amuria', 'invoicing' ),
1336
-		'UG316' => __( 'Amuru', 'invoicing' ),
1337
-		'UG302' => __( 'Apac', 'invoicing' ),
1338
-		'UG303' => __( 'Arua', 'invoicing' ),
1339
-		'UG217' => __( 'Budaka', 'invoicing' ),
1340
-		'UG218' => __( 'Bududa', 'invoicing' ),
1341
-		'UG201' => __( 'Bugiri', 'invoicing' ),
1342
-		'UG235' => __( 'Bugweri', 'invoicing' ),
1343
-		'UG420' => __( 'Buhweju', 'invoicing' ),
1344
-		'UG117' => __( 'Buikwe', 'invoicing' ),
1345
-		'UG219' => __( 'Bukedea', 'invoicing' ),
1346
-		'UG118' => __( 'Bukomansimbi', 'invoicing' ),
1347
-		'UG220' => __( 'Bukwa', 'invoicing' ),
1348
-		'UG225' => __( 'Bulambuli', 'invoicing' ),
1349
-		'UG416' => __( 'Buliisa', 'invoicing' ),
1350
-		'UG401' => __( 'Bundibugyo', 'invoicing' ),
1351
-		'UG430' => __( 'Bunyangabu', 'invoicing' ),
1352
-		'UG402' => __( 'Bushenyi', 'invoicing' ),
1353
-		'UG202' => __( 'Busia', 'invoicing' ),
1354
-		'UG221' => __( 'Butaleja', 'invoicing' ),
1355
-		'UG119' => __( 'Butambala', 'invoicing' ),
1356
-		'UG233' => __( 'Butebo', 'invoicing' ),
1357
-		'UG120' => __( 'Buvuma', 'invoicing' ),
1358
-		'UG226' => __( 'Buyende', 'invoicing' ),
1359
-		'UG317' => __( 'Dokolo', 'invoicing' ),
1360
-		'UG121' => __( 'Gomba', 'invoicing' ),
1361
-		'UG304' => __( 'Gulu', 'invoicing' ),
1362
-		'UG403' => __( 'Hoima', 'invoicing' ),
1363
-		'UG417' => __( 'Ibanda', 'invoicing' ),
1364
-		'UG203' => __( 'Iganga', 'invoicing' ),
1365
-		'UG418' => __( 'Isingiro', 'invoicing' ),
1366
-		'UG204' => __( 'Jinja', 'invoicing' ),
1367
-		'UG318' => __( 'Kaabong', 'invoicing' ),
1368
-		'UG404' => __( 'Kabale', 'invoicing' ),
1369
-		'UG405' => __( 'Kabarole', 'invoicing' ),
1370
-		'UG213' => __( 'Kaberamaido', 'invoicing' ),
1371
-		'UG427' => __( 'Kagadi', 'invoicing' ),
1372
-		'UG428' => __( 'Kakumiro', 'invoicing' ),
1373
-		'UG101' => __( 'Kalangala', 'invoicing' ),
1374
-		'UG222' => __( 'Kaliro', 'invoicing' ),
1375
-		'UG122' => __( 'Kalungu', 'invoicing' ),
1376
-		'UG102' => __( 'Kampala', 'invoicing' ),
1377
-		'UG205' => __( 'Kamuli', 'invoicing' ),
1378
-		'UG413' => __( 'Kamwenge', 'invoicing' ),
1379
-		'UG414' => __( 'Kanungu', 'invoicing' ),
1380
-		'UG206' => __( 'Kapchorwa', 'invoicing' ),
1381
-		'UG236' => __( 'Kapelebyong', 'invoicing' ),
1382
-		'UG126' => __( 'Kasanda', 'invoicing' ),
1383
-		'UG406' => __( 'Kasese', 'invoicing' ),
1384
-		'UG207' => __( 'Katakwi', 'invoicing' ),
1385
-		'UG112' => __( 'Kayunga', 'invoicing' ),
1386
-		'UG407' => __( 'Kibaale', 'invoicing' ),
1387
-		'UG103' => __( 'Kiboga', 'invoicing' ),
1388
-		'UG227' => __( 'Kibuku', 'invoicing' ),
1389
-		'UG432' => __( 'Kikuube', 'invoicing' ),
1390
-		'UG419' => __( 'Kiruhura', 'invoicing' ),
1391
-		'UG421' => __( 'Kiryandongo', 'invoicing' ),
1392
-		'UG408' => __( 'Kisoro', 'invoicing' ),
1393
-		'UG305' => __( 'Kitgum', 'invoicing' ),
1394
-		'UG319' => __( 'Koboko', 'invoicing' ),
1395
-		'UG325' => __( 'Kole', 'invoicing' ),
1396
-		'UG306' => __( 'Kotido', 'invoicing' ),
1397
-		'UG208' => __( 'Kumi', 'invoicing' ),
1398
-		'UG333' => __( 'Kwania', 'invoicing' ),
1399
-		'UG228' => __( 'Kween', 'invoicing' ),
1400
-		'UG123' => __( 'Kyankwanzi', 'invoicing' ),
1401
-		'UG422' => __( 'Kyegegwa', 'invoicing' ),
1402
-		'UG415' => __( 'Kyenjojo', 'invoicing' ),
1403
-		'UG125' => __( 'Kyotera', 'invoicing' ),
1404
-		'UG326' => __( 'Lamwo', 'invoicing' ),
1405
-		'UG307' => __( 'Lira', 'invoicing' ),
1406
-		'UG229' => __( 'Luuka', 'invoicing' ),
1407
-		'UG104' => __( 'Luwero', 'invoicing' ),
1408
-		'UG124' => __( 'Lwengo', 'invoicing' ),
1409
-		'UG114' => __( 'Lyantonde', 'invoicing' ),
1410
-		'UG223' => __( 'Manafwa', 'invoicing' ),
1411
-		'UG320' => __( 'Maracha', 'invoicing' ),
1412
-		'UG105' => __( 'Masaka', 'invoicing' ),
1413
-		'UG409' => __( 'Masindi', 'invoicing' ),
1414
-		'UG214' => __( 'Mayuge', 'invoicing' ),
1415
-		'UG209' => __( 'Mbale', 'invoicing' ),
1416
-		'UG410' => __( 'Mbarara', 'invoicing' ),
1417
-		'UG423' => __( 'Mitooma', 'invoicing' ),
1418
-		'UG115' => __( 'Mityana', 'invoicing' ),
1419
-		'UG308' => __( 'Moroto', 'invoicing' ),
1420
-		'UG309' => __( 'Moyo', 'invoicing' ),
1421
-		'UG106' => __( 'Mpigi', 'invoicing' ),
1422
-		'UG107' => __( 'Mubende', 'invoicing' ),
1423
-		'UG108' => __( 'Mukono', 'invoicing' ),
1424
-		'UG334' => __( 'Nabilatuk', 'invoicing' ),
1425
-		'UG311' => __( 'Nakapiripirit', 'invoicing' ),
1426
-		'UG116' => __( 'Nakaseke', 'invoicing' ),
1427
-		'UG109' => __( 'Nakasongola', 'invoicing' ),
1428
-		'UG230' => __( 'Namayingo', 'invoicing' ),
1429
-		'UG234' => __( 'Namisindwa', 'invoicing' ),
1430
-		'UG224' => __( 'Namutumba', 'invoicing' ),
1431
-		'UG327' => __( 'Napak', 'invoicing' ),
1432
-		'UG310' => __( 'Nebbi', 'invoicing' ),
1433
-		'UG231' => __( 'Ngora', 'invoicing' ),
1434
-		'UG424' => __( 'Ntoroko', 'invoicing' ),
1435
-		'UG411' => __( 'Ntungamo', 'invoicing' ),
1436
-		'UG328' => __( 'Nwoya', 'invoicing' ),
1437
-		'UG331' => __( 'Omoro', 'invoicing' ),
1438
-		'UG329' => __( 'Otuke', 'invoicing' ),
1439
-		'UG321' => __( 'Oyam', 'invoicing' ),
1440
-		'UG312' => __( 'Pader', 'invoicing' ),
1441
-		'UG332' => __( 'Pakwach', 'invoicing' ),
1442
-		'UG210' => __( 'Pallisa', 'invoicing' ),
1443
-		'UG110' => __( 'Rakai', 'invoicing' ),
1444
-		'UG429' => __( 'Rubanda', 'invoicing' ),
1445
-		'UG425' => __( 'Rubirizi', 'invoicing' ),
1446
-		'UG431' => __( 'Rukiga', 'invoicing' ),
1447
-		'UG412' => __( 'Rukungiri', 'invoicing' ),
1448
-		'UG111' => __( 'Sembabule', 'invoicing' ),
1449
-		'UG232' => __( 'Serere', 'invoicing' ),
1450
-		'UG426' => __( 'Sheema', 'invoicing' ),
1451
-		'UG215' => __( 'Sironko', 'invoicing' ),
1452
-		'UG211' => __( 'Soroti', 'invoicing' ),
1453
-		'UG212' => __( 'Tororo', 'invoicing' ),
1454
-		'UG113' => __( 'Wakiso', 'invoicing' ),
1455
-		'UG313' => __( 'Yumbe', 'invoicing' ),
1456
-		'UG330' => __( 'Zombo', 'invoicing' ),
1457
-	),
1458
-	'UM' => array(
1459
-		'81' => __( 'Baker Island', 'invoicing' ),
1460
-		'84' => __( 'Howland Island', 'invoicing' ),
1461
-		'86' => __( 'Jarvis Island', 'invoicing' ),
1462
-		'67' => __( 'Johnston Atoll', 'invoicing' ),
1463
-		'89' => __( 'Kingman Reef', 'invoicing' ),
1464
-		'71' => __( 'Midway Atoll', 'invoicing' ),
1465
-		'76' => __( 'Navassa Island', 'invoicing' ),
1466
-		'95' => __( 'Palmyra Atoll', 'invoicing' ),
1467
-		'79' => __( 'Wake Island', 'invoicing' ),
1468
-	),
1469
-	'US' => array( // United States.
1470
-		'AL' => __( 'Alabama', 'invoicing' ),
1471
-		'AK' => __( 'Alaska', 'invoicing' ),
1472
-		'AZ' => __( 'Arizona', 'invoicing' ),
1473
-		'AR' => __( 'Arkansas', 'invoicing' ),
1474
-		'CA' => __( 'California', 'invoicing' ),
1475
-		'CO' => __( 'Colorado', 'invoicing' ),
1476
-		'CT' => __( 'Connecticut', 'invoicing' ),
1477
-		'DE' => __( 'Delaware', 'invoicing' ),
1478
-		'DC' => __( 'District Of Columbia', 'invoicing' ),
1479
-		'FL' => __( 'Florida', 'invoicing' ),
1480
-		'GA' => _x( 'Georgia', 'US state of Georgia', 'invoicing' ),
1481
-		'HI' => __( 'Hawaii', 'invoicing' ),
1482
-		'ID' => __( 'Idaho', 'invoicing' ),
1483
-		'IL' => __( 'Illinois', 'invoicing' ),
1484
-		'IN' => __( 'Indiana', 'invoicing' ),
1485
-		'IA' => __( 'Iowa', 'invoicing' ),
1486
-		'KS' => __( 'Kansas', 'invoicing' ),
1487
-		'KY' => __( 'Kentucky', 'invoicing' ),
1488
-		'LA' => __( 'Louisiana', 'invoicing' ),
1489
-		'ME' => __( 'Maine', 'invoicing' ),
1490
-		'MD' => __( 'Maryland', 'invoicing' ),
1491
-		'MA' => __( 'Massachusetts', 'invoicing' ),
1492
-		'MI' => __( 'Michigan', 'invoicing' ),
1493
-		'MN' => __( 'Minnesota', 'invoicing' ),
1494
-		'MS' => __( 'Mississippi', 'invoicing' ),
1495
-		'MO' => __( 'Missouri', 'invoicing' ),
1496
-		'MT' => __( 'Montana', 'invoicing' ),
1497
-		'NE' => __( 'Nebraska', 'invoicing' ),
1498
-		'NV' => __( 'Nevada', 'invoicing' ),
1499
-		'NH' => __( 'New Hampshire', 'invoicing' ),
1500
-		'NJ' => __( 'New Jersey', 'invoicing' ),
1501
-		'NM' => __( 'New Mexico', 'invoicing' ),
1502
-		'NY' => __( 'New York', 'invoicing' ),
1503
-		'NC' => __( 'North Carolina', 'invoicing' ),
1504
-		'ND' => __( 'North Dakota', 'invoicing' ),
1505
-		'OH' => __( 'Ohio', 'invoicing' ),
1506
-		'OK' => __( 'Oklahoma', 'invoicing' ),
1507
-		'OR' => __( 'Oregon', 'invoicing' ),
1508
-		'PA' => __( 'Pennsylvania', 'invoicing' ),
1509
-		'RI' => __( 'Rhode Island', 'invoicing' ),
1510
-		'SC' => __( 'South Carolina', 'invoicing' ),
1511
-		'SD' => __( 'South Dakota', 'invoicing' ),
1512
-		'TN' => __( 'Tennessee', 'invoicing' ),
1513
-		'TX' => __( 'Texas', 'invoicing' ),
1514
-		'UT' => __( 'Utah', 'invoicing' ),
1515
-		'VT' => __( 'Vermont', 'invoicing' ),
1516
-		'VA' => __( 'Virginia', 'invoicing' ),
1517
-		'WA' => __( 'Washington', 'invoicing' ),
1518
-		'WV' => __( 'West Virginia', 'invoicing' ),
1519
-		'WI' => __( 'Wisconsin', 'invoicing' ),
1520
-		'WY' => __( 'Wyoming', 'invoicing' ),
1521
-		'AA' => __( 'Armed Forces (AA)', 'invoicing' ),
1522
-		'AE' => __( 'Armed Forces (AE)', 'invoicing' ),
1523
-		'AP' => __( 'Armed Forces (AP)', 'invoicing' ),
1524
-	),
1525
-	'VN' => array(),
1526
-	'YT' => array(),
1527
-	'ZA' => array( // South African states.
1528
-		'EC'  => __( 'Eastern Cape', 'invoicing' ),
1529
-		'FS'  => __( 'Free State', 'invoicing' ),
1530
-		'GP'  => __( 'Gauteng', 'invoicing' ),
1531
-		'KZN' => __( 'KwaZulu-Natal', 'invoicing' ),
1532
-		'LP'  => __( 'Limpopo', 'invoicing' ),
1533
-		'MP'  => __( 'Mpumalanga', 'invoicing' ),
1534
-		'NC'  => __( 'Northern Cape', 'invoicing' ),
1535
-		'NW'  => __( 'North West', 'invoicing' ),
1536
-		'WC'  => __( 'Western Cape', 'invoicing' ),
1537
-	),
1538
-	'ZM' => array( // Zambia's Provinces. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:ZM.
1539
-		'ZM-01' => __( 'Western', 'invoicing' ),
1540
-		'ZM-02' => __( 'Central', 'invoicing' ),
1541
-		'ZM-03' => __( 'Eastern', 'invoicing' ),
1542
-		'ZM-04' => __( 'Luapula', 'invoicing' ),
1543
-		'ZM-05' => __( 'Northern', 'invoicing' ),
1544
-		'ZM-06' => __( 'North-Western', 'invoicing' ),
1545
-		'ZM-07' => __( 'Southern', 'invoicing' ),
1546
-		'ZM-08' => __( 'Copperbelt', 'invoicing' ),
1547
-		'ZM-09' => __( 'Lusaka', 'invoicing' ),
1548
-		'ZM-10' => __( 'Muchinga', 'invoicing' ),
1549
-	),
964
+    /**
965
+     * Philippine Provinces.
966
+     */
967
+    'PH' => array(
968
+        'ABR' => __( 'Abra', 'invoicing' ),
969
+        'AGN' => __( 'Agusan del Norte', 'invoicing' ),
970
+        'AGS' => __( 'Agusan del Sur', 'invoicing' ),
971
+        'AKL' => __( 'Aklan', 'invoicing' ),
972
+        'ALB' => __( 'Albay', 'invoicing' ),
973
+        'ANT' => __( 'Antique', 'invoicing' ),
974
+        'APA' => __( 'Apayao', 'invoicing' ),
975
+        'AUR' => __( 'Aurora', 'invoicing' ),
976
+        'BAS' => __( 'Basilan', 'invoicing' ),
977
+        'BAN' => __( 'Bataan', 'invoicing' ),
978
+        'BTN' => __( 'Batanes', 'invoicing' ),
979
+        'BTG' => __( 'Batangas', 'invoicing' ),
980
+        'BEN' => __( 'Benguet', 'invoicing' ),
981
+        'BIL' => __( 'Biliran', 'invoicing' ),
982
+        'BOH' => __( 'Bohol', 'invoicing' ),
983
+        'BUK' => __( 'Bukidnon', 'invoicing' ),
984
+        'BUL' => __( 'Bulacan', 'invoicing' ),
985
+        'CAG' => __( 'Cagayan', 'invoicing' ),
986
+        'CAN' => __( 'Camarines Norte', 'invoicing' ),
987
+        'CAS' => __( 'Camarines Sur', 'invoicing' ),
988
+        'CAM' => __( 'Camiguin', 'invoicing' ),
989
+        'CAP' => __( 'Capiz', 'invoicing' ),
990
+        'CAT' => __( 'Catanduanes', 'invoicing' ),
991
+        'CAV' => __( 'Cavite', 'invoicing' ),
992
+        'CEB' => __( 'Cebu', 'invoicing' ),
993
+        'COM' => __( 'Compostela Valley', 'invoicing' ),
994
+        'NCO' => __( 'Cotabato', 'invoicing' ),
995
+        'DAV' => __( 'Davao del Norte', 'invoicing' ),
996
+        'DAS' => __( 'Davao del Sur', 'invoicing' ),
997
+        'DAC' => __( 'Davao Occidental', 'invoicing' ),
998
+        'DAO' => __( 'Davao Oriental', 'invoicing' ),
999
+        'DIN' => __( 'Dinagat Islands', 'invoicing' ),
1000
+        'EAS' => __( 'Eastern Samar', 'invoicing' ),
1001
+        'GUI' => __( 'Guimaras', 'invoicing' ),
1002
+        'IFU' => __( 'Ifugao', 'invoicing' ),
1003
+        'ILN' => __( 'Ilocos Norte', 'invoicing' ),
1004
+        'ILS' => __( 'Ilocos Sur', 'invoicing' ),
1005
+        'ILI' => __( 'Iloilo', 'invoicing' ),
1006
+        'ISA' => __( 'Isabela', 'invoicing' ),
1007
+        'KAL' => __( 'Kalinga', 'invoicing' ),
1008
+        'LUN' => __( 'La Union', 'invoicing' ),
1009
+        'LAG' => __( 'Laguna', 'invoicing' ),
1010
+        'LAN' => __( 'Lanao del Norte', 'invoicing' ),
1011
+        'LAS' => __( 'Lanao del Sur', 'invoicing' ),
1012
+        'LEY' => __( 'Leyte', 'invoicing' ),
1013
+        'MAG' => __( 'Maguindanao', 'invoicing' ),
1014
+        'MAD' => __( 'Marinduque', 'invoicing' ),
1015
+        'MAS' => __( 'Masbate', 'invoicing' ),
1016
+        'MSC' => __( 'Misamis Occidental', 'invoicing' ),
1017
+        'MSR' => __( 'Misamis Oriental', 'invoicing' ),
1018
+        'MOU' => __( 'Mountain Province', 'invoicing' ),
1019
+        'NEC' => __( 'Negros Occidental', 'invoicing' ),
1020
+        'NER' => __( 'Negros Oriental', 'invoicing' ),
1021
+        'NSA' => __( 'Northern Samar', 'invoicing' ),
1022
+        'NUE' => __( 'Nueva Ecija', 'invoicing' ),
1023
+        'NUV' => __( 'Nueva Vizcaya', 'invoicing' ),
1024
+        'MDC' => __( 'Occidental Mindoro', 'invoicing' ),
1025
+        'MDR' => __( 'Oriental Mindoro', 'invoicing' ),
1026
+        'PLW' => __( 'Palawan', 'invoicing' ),
1027
+        'PAM' => __( 'Pampanga', 'invoicing' ),
1028
+        'PAN' => __( 'Pangasinan', 'invoicing' ),
1029
+        'QUE' => __( 'Quezon', 'invoicing' ),
1030
+        'QUI' => __( 'Quirino', 'invoicing' ),
1031
+        'RIZ' => __( 'Rizal', 'invoicing' ),
1032
+        'ROM' => __( 'Romblon', 'invoicing' ),
1033
+        'WSA' => __( 'Samar', 'invoicing' ),
1034
+        'SAR' => __( 'Sarangani', 'invoicing' ),
1035
+        'SIQ' => __( 'Siquijor', 'invoicing' ),
1036
+        'SOR' => __( 'Sorsogon', 'invoicing' ),
1037
+        'SCO' => __( 'South Cotabato', 'invoicing' ),
1038
+        'SLE' => __( 'Southern Leyte', 'invoicing' ),
1039
+        'SUK' => __( 'Sultan Kudarat', 'invoicing' ),
1040
+        'SLU' => __( 'Sulu', 'invoicing' ),
1041
+        'SUN' => __( 'Surigao del Norte', 'invoicing' ),
1042
+        'SUR' => __( 'Surigao del Sur', 'invoicing' ),
1043
+        'TAR' => __( 'Tarlac', 'invoicing' ),
1044
+        'TAW' => __( 'Tawi-Tawi', 'invoicing' ),
1045
+        'ZMB' => __( 'Zambales', 'invoicing' ),
1046
+        'ZAN' => __( 'Zamboanga del Norte', 'invoicing' ),
1047
+        'ZAS' => __( 'Zamboanga del Sur', 'invoicing' ),
1048
+        'ZSI' => __( 'Zamboanga Sibugay', 'invoicing' ),
1049
+        '00'  => __( 'Metro Manila', 'invoicing' ),
1050
+    ),
1051
+    'PK' => array( // Pakistan's states.
1052
+        'JK' => __( 'Azad Kashmir', 'invoicing' ),
1053
+        'BA' => __( 'Balochistan', 'invoicing' ),
1054
+        'TA' => __( 'FATA', 'invoicing' ),
1055
+        'GB' => __( 'Gilgit Baltistan', 'invoicing' ),
1056
+        'IS' => __( 'Islamabad Capital Territory', 'invoicing' ),
1057
+        'KP' => __( 'Khyber Pakhtunkhwa', 'invoicing' ),
1058
+        'PB' => __( 'Punjab', 'invoicing' ),
1059
+        'SD' => __( 'Sindh', 'invoicing' ),
1060
+    ),
1061
+    'PL' => array(),
1062
+    'PT' => array(),
1063
+    'PY' => array( // Paraguay states.
1064
+        'PY-ASU' => __( 'Asunci&oacute;n', 'invoicing' ),
1065
+        'PY-1'   => __( 'Concepci&oacute;n', 'invoicing' ),
1066
+        'PY-2'   => __( 'San Pedro', 'invoicing' ),
1067
+        'PY-3'   => __( 'Cordillera', 'invoicing' ),
1068
+        'PY-4'   => __( 'Guair&aacute;', 'invoicing' ),
1069
+        'PY-5'   => __( 'Caaguaz&uacute;', 'invoicing' ),
1070
+        'PY-6'   => __( 'Caazap&aacute;', 'invoicing' ),
1071
+        'PY-7'   => __( 'Itap&uacute;a', 'invoicing' ),
1072
+        'PY-8'   => __( 'Misiones', 'invoicing' ),
1073
+        'PY-9'   => __( 'Paraguar&iacute;', 'invoicing' ),
1074
+        'PY-10'  => __( 'Alto Paran&aacute;', 'invoicing' ),
1075
+        'PY-11'  => __( 'Central', 'invoicing' ),
1076
+        'PY-12'  => __( '&Ntilde;eembuc&uacute;', 'invoicing' ),
1077
+        'PY-13'  => __( 'Amambay', 'invoicing' ),
1078
+        'PY-14'  => __( 'Canindey&uacute;', 'invoicing' ),
1079
+        'PY-15'  => __( 'Presidente Hayes', 'invoicing' ),
1080
+        'PY-16'  => __( 'Alto Paraguay', 'invoicing' ),
1081
+        'PY-17'  => __( 'Boquer&oacute;n', 'invoicing' ),
1082
+    ),
1083
+    'RE' => array(),
1084
+    'RO' => array( // Romania states.
1085
+        'AB' => __( 'Alba', 'invoicing' ),
1086
+        'AR' => __( 'Arad', 'invoicing' ),
1087
+        'AG' => __( 'Arge&#537;', 'invoicing' ),
1088
+        'BC' => __( 'Bac&#259;u', 'invoicing' ),
1089
+        'BH' => __( 'Bihor', 'invoicing' ),
1090
+        'BN' => __( 'Bistri&#539;a-N&#259;s&#259;ud', 'invoicing' ),
1091
+        'BT' => __( 'Boto&#537;ani', 'invoicing' ),
1092
+        'BR' => __( 'Br&#259;ila', 'invoicing' ),
1093
+        'BV' => __( 'Bra&#537;ov', 'invoicing' ),
1094
+        'B'  => __( 'Bucure&#537;ti', 'invoicing' ),
1095
+        'BZ' => __( 'Buz&#259;u', 'invoicing' ),
1096
+        'CL' => __( 'C&#259;l&#259;ra&#537;i', 'invoicing' ),
1097
+        'CS' => __( 'Cara&#537;-Severin', 'invoicing' ),
1098
+        'CJ' => __( 'Cluj', 'invoicing' ),
1099
+        'CT' => __( 'Constan&#539;a', 'invoicing' ),
1100
+        'CV' => __( 'Covasna', 'invoicing' ),
1101
+        'DB' => __( 'D&acirc;mbovi&#539;a', 'invoicing' ),
1102
+        'DJ' => __( 'Dolj', 'invoicing' ),
1103
+        'GL' => __( 'Gala&#539;i', 'invoicing' ),
1104
+        'GR' => __( 'Giurgiu', 'invoicing' ),
1105
+        'GJ' => __( 'Gorj', 'invoicing' ),
1106
+        'HR' => __( 'Harghita', 'invoicing' ),
1107
+        'HD' => __( 'Hunedoara', 'invoicing' ),
1108
+        'IL' => __( 'Ialomi&#539;a', 'invoicing' ),
1109
+        'IS' => __( 'Ia&#537;i', 'invoicing' ),
1110
+        'IF' => __( 'Ilfov', 'invoicing' ),
1111
+        'MM' => __( 'Maramure&#537;', 'invoicing' ),
1112
+        'MH' => __( 'Mehedin&#539;i', 'invoicing' ),
1113
+        'MS' => __( 'Mure&#537;', 'invoicing' ),
1114
+        'NT' => __( 'Neam&#539;', 'invoicing' ),
1115
+        'OT' => __( 'Olt', 'invoicing' ),
1116
+        'PH' => __( 'Prahova', 'invoicing' ),
1117
+        'SJ' => __( 'S&#259;laj', 'invoicing' ),
1118
+        'SM' => __( 'Satu Mare', 'invoicing' ),
1119
+        'SB' => __( 'Sibiu', 'invoicing' ),
1120
+        'SV' => __( 'Suceava', 'invoicing' ),
1121
+        'TR' => __( 'Teleorman', 'invoicing' ),
1122
+        'TM' => __( 'Timi&#537;', 'invoicing' ),
1123
+        'TL' => __( 'Tulcea', 'invoicing' ),
1124
+        'VL' => __( 'V&acirc;lcea', 'invoicing' ),
1125
+        'VS' => __( 'Vaslui', 'invoicing' ),
1126
+        'VN' => __( 'Vrancea', 'invoicing' ),
1127
+    ),
1128
+    'RS' => array(),
1129
+    'SG' => array(),
1130
+    'SK' => array(),
1131
+    'SI' => array(),
1132
+    'TH' => array( // Thailand states.
1133
+        'TH-37' => __( 'Amnat Charoen', 'invoicing' ),
1134
+        'TH-15' => __( 'Ang Thong', 'invoicing' ),
1135
+        'TH-14' => __( 'Ayutthaya', 'invoicing' ),
1136
+        'TH-10' => __( 'Bangkok', 'invoicing' ),
1137
+        'TH-38' => __( 'Bueng Kan', 'invoicing' ),
1138
+        'TH-31' => __( 'Buri Ram', 'invoicing' ),
1139
+        'TH-24' => __( 'Chachoengsao', 'invoicing' ),
1140
+        'TH-18' => __( 'Chai Nat', 'invoicing' ),
1141
+        'TH-36' => __( 'Chaiyaphum', 'invoicing' ),
1142
+        'TH-22' => __( 'Chanthaburi', 'invoicing' ),
1143
+        'TH-50' => __( 'Chiang Mai', 'invoicing' ),
1144
+        'TH-57' => __( 'Chiang Rai', 'invoicing' ),
1145
+        'TH-20' => __( 'Chonburi', 'invoicing' ),
1146
+        'TH-86' => __( 'Chumphon', 'invoicing' ),
1147
+        'TH-46' => __( 'Kalasin', 'invoicing' ),
1148
+        'TH-62' => __( 'Kamphaeng Phet', 'invoicing' ),
1149
+        'TH-71' => __( 'Kanchanaburi', 'invoicing' ),
1150
+        'TH-40' => __( 'Khon Kaen', 'invoicing' ),
1151
+        'TH-81' => __( 'Krabi', 'invoicing' ),
1152
+        'TH-52' => __( 'Lampang', 'invoicing' ),
1153
+        'TH-51' => __( 'Lamphun', 'invoicing' ),
1154
+        'TH-42' => __( 'Loei', 'invoicing' ),
1155
+        'TH-16' => __( 'Lopburi', 'invoicing' ),
1156
+        'TH-58' => __( 'Mae Hong Son', 'invoicing' ),
1157
+        'TH-44' => __( 'Maha Sarakham', 'invoicing' ),
1158
+        'TH-49' => __( 'Mukdahan', 'invoicing' ),
1159
+        'TH-26' => __( 'Nakhon Nayok', 'invoicing' ),
1160
+        'TH-73' => __( 'Nakhon Pathom', 'invoicing' ),
1161
+        'TH-48' => __( 'Nakhon Phanom', 'invoicing' ),
1162
+        'TH-30' => __( 'Nakhon Ratchasima', 'invoicing' ),
1163
+        'TH-60' => __( 'Nakhon Sawan', 'invoicing' ),
1164
+        'TH-80' => __( 'Nakhon Si Thammarat', 'invoicing' ),
1165
+        'TH-55' => __( 'Nan', 'invoicing' ),
1166
+        'TH-96' => __( 'Narathiwat', 'invoicing' ),
1167
+        'TH-39' => __( 'Nong Bua Lam Phu', 'invoicing' ),
1168
+        'TH-43' => __( 'Nong Khai', 'invoicing' ),
1169
+        'TH-12' => __( 'Nonthaburi', 'invoicing' ),
1170
+        'TH-13' => __( 'Pathum Thani', 'invoicing' ),
1171
+        'TH-94' => __( 'Pattani', 'invoicing' ),
1172
+        'TH-82' => __( 'Phang Nga', 'invoicing' ),
1173
+        'TH-93' => __( 'Phatthalung', 'invoicing' ),
1174
+        'TH-56' => __( 'Phayao', 'invoicing' ),
1175
+        'TH-67' => __( 'Phetchabun', 'invoicing' ),
1176
+        'TH-76' => __( 'Phetchaburi', 'invoicing' ),
1177
+        'TH-66' => __( 'Phichit', 'invoicing' ),
1178
+        'TH-65' => __( 'Phitsanulok', 'invoicing' ),
1179
+        'TH-54' => __( 'Phrae', 'invoicing' ),
1180
+        'TH-83' => __( 'Phuket', 'invoicing' ),
1181
+        'TH-25' => __( 'Prachin Buri', 'invoicing' ),
1182
+        'TH-77' => __( 'Prachuap Khiri Khan', 'invoicing' ),
1183
+        'TH-85' => __( 'Ranong', 'invoicing' ),
1184
+        'TH-70' => __( 'Ratchaburi', 'invoicing' ),
1185
+        'TH-21' => __( 'Rayong', 'invoicing' ),
1186
+        'TH-45' => __( 'Roi Et', 'invoicing' ),
1187
+        'TH-27' => __( 'Sa Kaeo', 'invoicing' ),
1188
+        'TH-47' => __( 'Sakon Nakhon', 'invoicing' ),
1189
+        'TH-11' => __( 'Samut Prakan', 'invoicing' ),
1190
+        'TH-74' => __( 'Samut Sakhon', 'invoicing' ),
1191
+        'TH-75' => __( 'Samut Songkhram', 'invoicing' ),
1192
+        'TH-19' => __( 'Saraburi', 'invoicing' ),
1193
+        'TH-91' => __( 'Satun', 'invoicing' ),
1194
+        'TH-17' => __( 'Sing Buri', 'invoicing' ),
1195
+        'TH-33' => __( 'Sisaket', 'invoicing' ),
1196
+        'TH-90' => __( 'Songkhla', 'invoicing' ),
1197
+        'TH-64' => __( 'Sukhothai', 'invoicing' ),
1198
+        'TH-72' => __( 'Suphan Buri', 'invoicing' ),
1199
+        'TH-84' => __( 'Surat Thani', 'invoicing' ),
1200
+        'TH-32' => __( 'Surin', 'invoicing' ),
1201
+        'TH-63' => __( 'Tak', 'invoicing' ),
1202
+        'TH-92' => __( 'Trang', 'invoicing' ),
1203
+        'TH-23' => __( 'Trat', 'invoicing' ),
1204
+        'TH-34' => __( 'Ubon Ratchathani', 'invoicing' ),
1205
+        'TH-41' => __( 'Udon Thani', 'invoicing' ),
1206
+        'TH-61' => __( 'Uthai Thani', 'invoicing' ),
1207
+        'TH-53' => __( 'Uttaradit', 'invoicing' ),
1208
+        'TH-95' => __( 'Yala', 'invoicing' ),
1209
+        'TH-35' => __( 'Yasothon', 'invoicing' ),
1210
+    ),
1211
+    'TR' => array( // Turkey States.
1212
+        'TR01' => __( 'Adana', 'invoicing' ),
1213
+        'TR02' => __( 'Ad&#305;yaman', 'invoicing' ),
1214
+        'TR03' => __( 'Afyon', 'invoicing' ),
1215
+        'TR04' => __( 'A&#287;r&#305;', 'invoicing' ),
1216
+        'TR05' => __( 'Amasya', 'invoicing' ),
1217
+        'TR06' => __( 'Ankara', 'invoicing' ),
1218
+        'TR07' => __( 'Antalya', 'invoicing' ),
1219
+        'TR08' => __( 'Artvin', 'invoicing' ),
1220
+        'TR09' => __( 'Ayd&#305;n', 'invoicing' ),
1221
+        'TR10' => __( 'Bal&#305;kesir', 'invoicing' ),
1222
+        'TR11' => __( 'Bilecik', 'invoicing' ),
1223
+        'TR12' => __( 'Bing&#246;l', 'invoicing' ),
1224
+        'TR13' => __( 'Bitlis', 'invoicing' ),
1225
+        'TR14' => __( 'Bolu', 'invoicing' ),
1226
+        'TR15' => __( 'Burdur', 'invoicing' ),
1227
+        'TR16' => __( 'Bursa', 'invoicing' ),
1228
+        'TR17' => __( '&#199;anakkale', 'invoicing' ),
1229
+        'TR18' => __( '&#199;ank&#305;r&#305;', 'invoicing' ),
1230
+        'TR19' => __( '&#199;orum', 'invoicing' ),
1231
+        'TR20' => __( 'Denizli', 'invoicing' ),
1232
+        'TR21' => __( 'Diyarbak&#305;r', 'invoicing' ),
1233
+        'TR22' => __( 'Edirne', 'invoicing' ),
1234
+        'TR23' => __( 'Elaz&#305;&#287;', 'invoicing' ),
1235
+        'TR24' => __( 'Erzincan', 'invoicing' ),
1236
+        'TR25' => __( 'Erzurum', 'invoicing' ),
1237
+        'TR26' => __( 'Eski&#351;ehir', 'invoicing' ),
1238
+        'TR27' => __( 'Gaziantep', 'invoicing' ),
1239
+        'TR28' => __( 'Giresun', 'invoicing' ),
1240
+        'TR29' => __( 'G&#252;m&#252;&#351;hane', 'invoicing' ),
1241
+        'TR30' => __( 'Hakkari', 'invoicing' ),
1242
+        'TR31' => __( 'Hatay', 'invoicing' ),
1243
+        'TR32' => __( 'Isparta', 'invoicing' ),
1244
+        'TR33' => __( '&#304;&#231;el', 'invoicing' ),
1245
+        'TR34' => __( '&#304;stanbul', 'invoicing' ),
1246
+        'TR35' => __( '&#304;zmir', 'invoicing' ),
1247
+        'TR36' => __( 'Kars', 'invoicing' ),
1248
+        'TR37' => __( 'Kastamonu', 'invoicing' ),
1249
+        'TR38' => __( 'Kayseri', 'invoicing' ),
1250
+        'TR39' => __( 'K&#305;rklareli', 'invoicing' ),
1251
+        'TR40' => __( 'K&#305;r&#351;ehir', 'invoicing' ),
1252
+        'TR41' => __( 'Kocaeli', 'invoicing' ),
1253
+        'TR42' => __( 'Konya', 'invoicing' ),
1254
+        'TR43' => __( 'K&#252;tahya', 'invoicing' ),
1255
+        'TR44' => __( 'Malatya', 'invoicing' ),
1256
+        'TR45' => __( 'Manisa', 'invoicing' ),
1257
+        'TR46' => __( 'Kahramanmara&#351;', 'invoicing' ),
1258
+        'TR47' => __( 'Mardin', 'invoicing' ),
1259
+        'TR48' => __( 'Mu&#287;la', 'invoicing' ),
1260
+        'TR49' => __( 'Mu&#351;', 'invoicing' ),
1261
+        'TR50' => __( 'Nev&#351;ehir', 'invoicing' ),
1262
+        'TR51' => __( 'Ni&#287;de', 'invoicing' ),
1263
+        'TR52' => __( 'Ordu', 'invoicing' ),
1264
+        'TR53' => __( 'Rize', 'invoicing' ),
1265
+        'TR54' => __( 'Sakarya', 'invoicing' ),
1266
+        'TR55' => __( 'Samsun', 'invoicing' ),
1267
+        'TR56' => __( 'Siirt', 'invoicing' ),
1268
+        'TR57' => __( 'Sinop', 'invoicing' ),
1269
+        'TR58' => __( 'Sivas', 'invoicing' ),
1270
+        'TR59' => __( 'Tekirda&#287;', 'invoicing' ),
1271
+        'TR60' => __( 'Tokat', 'invoicing' ),
1272
+        'TR61' => __( 'Trabzon', 'invoicing' ),
1273
+        'TR62' => __( 'Tunceli', 'invoicing' ),
1274
+        'TR63' => __( '&#350;anl&#305;urfa', 'invoicing' ),
1275
+        'TR64' => __( 'U&#351;ak', 'invoicing' ),
1276
+        'TR65' => __( 'Van', 'invoicing' ),
1277
+        'TR66' => __( 'Yozgat', 'invoicing' ),
1278
+        'TR67' => __( 'Zonguldak', 'invoicing' ),
1279
+        'TR68' => __( 'Aksaray', 'invoicing' ),
1280
+        'TR69' => __( 'Bayburt', 'invoicing' ),
1281
+        'TR70' => __( 'Karaman', 'invoicing' ),
1282
+        'TR71' => __( 'K&#305;r&#305;kkale', 'invoicing' ),
1283
+        'TR72' => __( 'Batman', 'invoicing' ),
1284
+        'TR73' => __( '&#350;&#305;rnak', 'invoicing' ),
1285
+        'TR74' => __( 'Bart&#305;n', 'invoicing' ),
1286
+        'TR75' => __( 'Ardahan', 'invoicing' ),
1287
+        'TR76' => __( 'I&#287;d&#305;r', 'invoicing' ),
1288
+        'TR77' => __( 'Yalova', 'invoicing' ),
1289
+        'TR78' => __( 'Karab&#252;k', 'invoicing' ),
1290
+        'TR79' => __( 'Kilis', 'invoicing' ),
1291
+        'TR80' => __( 'Osmaniye', 'invoicing' ),
1292
+        'TR81' => __( 'D&#252;zce', 'invoicing' ),
1293
+    ),
1294
+    'TZ' => array( // Tanzania States.
1295
+        'TZ01' => __( 'Arusha', 'invoicing' ),
1296
+        'TZ02' => __( 'Dar es Salaam', 'invoicing' ),
1297
+        'TZ03' => __( 'Dodoma', 'invoicing' ),
1298
+        'TZ04' => __( 'Iringa', 'invoicing' ),
1299
+        'TZ05' => __( 'Kagera', 'invoicing' ),
1300
+        'TZ06' => __( 'Pemba North', 'invoicing' ),
1301
+        'TZ07' => __( 'Zanzibar North', 'invoicing' ),
1302
+        'TZ08' => __( 'Kigoma', 'invoicing' ),
1303
+        'TZ09' => __( 'Kilimanjaro', 'invoicing' ),
1304
+        'TZ10' => __( 'Pemba South', 'invoicing' ),
1305
+        'TZ11' => __( 'Zanzibar South', 'invoicing' ),
1306
+        'TZ12' => __( 'Lindi', 'invoicing' ),
1307
+        'TZ13' => __( 'Mara', 'invoicing' ),
1308
+        'TZ14' => __( 'Mbeya', 'invoicing' ),
1309
+        'TZ15' => __( 'Zanzibar West', 'invoicing' ),
1310
+        'TZ16' => __( 'Morogoro', 'invoicing' ),
1311
+        'TZ17' => __( 'Mtwara', 'invoicing' ),
1312
+        'TZ18' => __( 'Mwanza', 'invoicing' ),
1313
+        'TZ19' => __( 'Coast', 'invoicing' ),
1314
+        'TZ20' => __( 'Rukwa', 'invoicing' ),
1315
+        'TZ21' => __( 'Ruvuma', 'invoicing' ),
1316
+        'TZ22' => __( 'Shinyanga', 'invoicing' ),
1317
+        'TZ23' => __( 'Singida', 'invoicing' ),
1318
+        'TZ24' => __( 'Tabora', 'invoicing' ),
1319
+        'TZ25' => __( 'Tanga', 'invoicing' ),
1320
+        'TZ26' => __( 'Manyara', 'invoicing' ),
1321
+        'TZ27' => __( 'Geita', 'invoicing' ),
1322
+        'TZ28' => __( 'Katavi', 'invoicing' ),
1323
+        'TZ29' => __( 'Njombe', 'invoicing' ),
1324
+        'TZ30' => __( 'Simiyu', 'invoicing' ),
1325
+    ),
1326
+    'LK' => array(),
1327
+    'SE' => array(),
1328
+    'UG' => array( // Uganda districts. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:UG.
1329
+        'UG314' => __( 'Abim', 'invoicing' ),
1330
+        'UG301' => __( 'Adjumani', 'invoicing' ),
1331
+        'UG322' => __( 'Agago', 'invoicing' ),
1332
+        'UG323' => __( 'Alebtong', 'invoicing' ),
1333
+        'UG315' => __( 'Amolatar', 'invoicing' ),
1334
+        'UG324' => __( 'Amudat', 'invoicing' ),
1335
+        'UG216' => __( 'Amuria', 'invoicing' ),
1336
+        'UG316' => __( 'Amuru', 'invoicing' ),
1337
+        'UG302' => __( 'Apac', 'invoicing' ),
1338
+        'UG303' => __( 'Arua', 'invoicing' ),
1339
+        'UG217' => __( 'Budaka', 'invoicing' ),
1340
+        'UG218' => __( 'Bududa', 'invoicing' ),
1341
+        'UG201' => __( 'Bugiri', 'invoicing' ),
1342
+        'UG235' => __( 'Bugweri', 'invoicing' ),
1343
+        'UG420' => __( 'Buhweju', 'invoicing' ),
1344
+        'UG117' => __( 'Buikwe', 'invoicing' ),
1345
+        'UG219' => __( 'Bukedea', 'invoicing' ),
1346
+        'UG118' => __( 'Bukomansimbi', 'invoicing' ),
1347
+        'UG220' => __( 'Bukwa', 'invoicing' ),
1348
+        'UG225' => __( 'Bulambuli', 'invoicing' ),
1349
+        'UG416' => __( 'Buliisa', 'invoicing' ),
1350
+        'UG401' => __( 'Bundibugyo', 'invoicing' ),
1351
+        'UG430' => __( 'Bunyangabu', 'invoicing' ),
1352
+        'UG402' => __( 'Bushenyi', 'invoicing' ),
1353
+        'UG202' => __( 'Busia', 'invoicing' ),
1354
+        'UG221' => __( 'Butaleja', 'invoicing' ),
1355
+        'UG119' => __( 'Butambala', 'invoicing' ),
1356
+        'UG233' => __( 'Butebo', 'invoicing' ),
1357
+        'UG120' => __( 'Buvuma', 'invoicing' ),
1358
+        'UG226' => __( 'Buyende', 'invoicing' ),
1359
+        'UG317' => __( 'Dokolo', 'invoicing' ),
1360
+        'UG121' => __( 'Gomba', 'invoicing' ),
1361
+        'UG304' => __( 'Gulu', 'invoicing' ),
1362
+        'UG403' => __( 'Hoima', 'invoicing' ),
1363
+        'UG417' => __( 'Ibanda', 'invoicing' ),
1364
+        'UG203' => __( 'Iganga', 'invoicing' ),
1365
+        'UG418' => __( 'Isingiro', 'invoicing' ),
1366
+        'UG204' => __( 'Jinja', 'invoicing' ),
1367
+        'UG318' => __( 'Kaabong', 'invoicing' ),
1368
+        'UG404' => __( 'Kabale', 'invoicing' ),
1369
+        'UG405' => __( 'Kabarole', 'invoicing' ),
1370
+        'UG213' => __( 'Kaberamaido', 'invoicing' ),
1371
+        'UG427' => __( 'Kagadi', 'invoicing' ),
1372
+        'UG428' => __( 'Kakumiro', 'invoicing' ),
1373
+        'UG101' => __( 'Kalangala', 'invoicing' ),
1374
+        'UG222' => __( 'Kaliro', 'invoicing' ),
1375
+        'UG122' => __( 'Kalungu', 'invoicing' ),
1376
+        'UG102' => __( 'Kampala', 'invoicing' ),
1377
+        'UG205' => __( 'Kamuli', 'invoicing' ),
1378
+        'UG413' => __( 'Kamwenge', 'invoicing' ),
1379
+        'UG414' => __( 'Kanungu', 'invoicing' ),
1380
+        'UG206' => __( 'Kapchorwa', 'invoicing' ),
1381
+        'UG236' => __( 'Kapelebyong', 'invoicing' ),
1382
+        'UG126' => __( 'Kasanda', 'invoicing' ),
1383
+        'UG406' => __( 'Kasese', 'invoicing' ),
1384
+        'UG207' => __( 'Katakwi', 'invoicing' ),
1385
+        'UG112' => __( 'Kayunga', 'invoicing' ),
1386
+        'UG407' => __( 'Kibaale', 'invoicing' ),
1387
+        'UG103' => __( 'Kiboga', 'invoicing' ),
1388
+        'UG227' => __( 'Kibuku', 'invoicing' ),
1389
+        'UG432' => __( 'Kikuube', 'invoicing' ),
1390
+        'UG419' => __( 'Kiruhura', 'invoicing' ),
1391
+        'UG421' => __( 'Kiryandongo', 'invoicing' ),
1392
+        'UG408' => __( 'Kisoro', 'invoicing' ),
1393
+        'UG305' => __( 'Kitgum', 'invoicing' ),
1394
+        'UG319' => __( 'Koboko', 'invoicing' ),
1395
+        'UG325' => __( 'Kole', 'invoicing' ),
1396
+        'UG306' => __( 'Kotido', 'invoicing' ),
1397
+        'UG208' => __( 'Kumi', 'invoicing' ),
1398
+        'UG333' => __( 'Kwania', 'invoicing' ),
1399
+        'UG228' => __( 'Kween', 'invoicing' ),
1400
+        'UG123' => __( 'Kyankwanzi', 'invoicing' ),
1401
+        'UG422' => __( 'Kyegegwa', 'invoicing' ),
1402
+        'UG415' => __( 'Kyenjojo', 'invoicing' ),
1403
+        'UG125' => __( 'Kyotera', 'invoicing' ),
1404
+        'UG326' => __( 'Lamwo', 'invoicing' ),
1405
+        'UG307' => __( 'Lira', 'invoicing' ),
1406
+        'UG229' => __( 'Luuka', 'invoicing' ),
1407
+        'UG104' => __( 'Luwero', 'invoicing' ),
1408
+        'UG124' => __( 'Lwengo', 'invoicing' ),
1409
+        'UG114' => __( 'Lyantonde', 'invoicing' ),
1410
+        'UG223' => __( 'Manafwa', 'invoicing' ),
1411
+        'UG320' => __( 'Maracha', 'invoicing' ),
1412
+        'UG105' => __( 'Masaka', 'invoicing' ),
1413
+        'UG409' => __( 'Masindi', 'invoicing' ),
1414
+        'UG214' => __( 'Mayuge', 'invoicing' ),
1415
+        'UG209' => __( 'Mbale', 'invoicing' ),
1416
+        'UG410' => __( 'Mbarara', 'invoicing' ),
1417
+        'UG423' => __( 'Mitooma', 'invoicing' ),
1418
+        'UG115' => __( 'Mityana', 'invoicing' ),
1419
+        'UG308' => __( 'Moroto', 'invoicing' ),
1420
+        'UG309' => __( 'Moyo', 'invoicing' ),
1421
+        'UG106' => __( 'Mpigi', 'invoicing' ),
1422
+        'UG107' => __( 'Mubende', 'invoicing' ),
1423
+        'UG108' => __( 'Mukono', 'invoicing' ),
1424
+        'UG334' => __( 'Nabilatuk', 'invoicing' ),
1425
+        'UG311' => __( 'Nakapiripirit', 'invoicing' ),
1426
+        'UG116' => __( 'Nakaseke', 'invoicing' ),
1427
+        'UG109' => __( 'Nakasongola', 'invoicing' ),
1428
+        'UG230' => __( 'Namayingo', 'invoicing' ),
1429
+        'UG234' => __( 'Namisindwa', 'invoicing' ),
1430
+        'UG224' => __( 'Namutumba', 'invoicing' ),
1431
+        'UG327' => __( 'Napak', 'invoicing' ),
1432
+        'UG310' => __( 'Nebbi', 'invoicing' ),
1433
+        'UG231' => __( 'Ngora', 'invoicing' ),
1434
+        'UG424' => __( 'Ntoroko', 'invoicing' ),
1435
+        'UG411' => __( 'Ntungamo', 'invoicing' ),
1436
+        'UG328' => __( 'Nwoya', 'invoicing' ),
1437
+        'UG331' => __( 'Omoro', 'invoicing' ),
1438
+        'UG329' => __( 'Otuke', 'invoicing' ),
1439
+        'UG321' => __( 'Oyam', 'invoicing' ),
1440
+        'UG312' => __( 'Pader', 'invoicing' ),
1441
+        'UG332' => __( 'Pakwach', 'invoicing' ),
1442
+        'UG210' => __( 'Pallisa', 'invoicing' ),
1443
+        'UG110' => __( 'Rakai', 'invoicing' ),
1444
+        'UG429' => __( 'Rubanda', 'invoicing' ),
1445
+        'UG425' => __( 'Rubirizi', 'invoicing' ),
1446
+        'UG431' => __( 'Rukiga', 'invoicing' ),
1447
+        'UG412' => __( 'Rukungiri', 'invoicing' ),
1448
+        'UG111' => __( 'Sembabule', 'invoicing' ),
1449
+        'UG232' => __( 'Serere', 'invoicing' ),
1450
+        'UG426' => __( 'Sheema', 'invoicing' ),
1451
+        'UG215' => __( 'Sironko', 'invoicing' ),
1452
+        'UG211' => __( 'Soroti', 'invoicing' ),
1453
+        'UG212' => __( 'Tororo', 'invoicing' ),
1454
+        'UG113' => __( 'Wakiso', 'invoicing' ),
1455
+        'UG313' => __( 'Yumbe', 'invoicing' ),
1456
+        'UG330' => __( 'Zombo', 'invoicing' ),
1457
+    ),
1458
+    'UM' => array(
1459
+        '81' => __( 'Baker Island', 'invoicing' ),
1460
+        '84' => __( 'Howland Island', 'invoicing' ),
1461
+        '86' => __( 'Jarvis Island', 'invoicing' ),
1462
+        '67' => __( 'Johnston Atoll', 'invoicing' ),
1463
+        '89' => __( 'Kingman Reef', 'invoicing' ),
1464
+        '71' => __( 'Midway Atoll', 'invoicing' ),
1465
+        '76' => __( 'Navassa Island', 'invoicing' ),
1466
+        '95' => __( 'Palmyra Atoll', 'invoicing' ),
1467
+        '79' => __( 'Wake Island', 'invoicing' ),
1468
+    ),
1469
+    'US' => array( // United States.
1470
+        'AL' => __( 'Alabama', 'invoicing' ),
1471
+        'AK' => __( 'Alaska', 'invoicing' ),
1472
+        'AZ' => __( 'Arizona', 'invoicing' ),
1473
+        'AR' => __( 'Arkansas', 'invoicing' ),
1474
+        'CA' => __( 'California', 'invoicing' ),
1475
+        'CO' => __( 'Colorado', 'invoicing' ),
1476
+        'CT' => __( 'Connecticut', 'invoicing' ),
1477
+        'DE' => __( 'Delaware', 'invoicing' ),
1478
+        'DC' => __( 'District Of Columbia', 'invoicing' ),
1479
+        'FL' => __( 'Florida', 'invoicing' ),
1480
+        'GA' => _x( 'Georgia', 'US state of Georgia', 'invoicing' ),
1481
+        'HI' => __( 'Hawaii', 'invoicing' ),
1482
+        'ID' => __( 'Idaho', 'invoicing' ),
1483
+        'IL' => __( 'Illinois', 'invoicing' ),
1484
+        'IN' => __( 'Indiana', 'invoicing' ),
1485
+        'IA' => __( 'Iowa', 'invoicing' ),
1486
+        'KS' => __( 'Kansas', 'invoicing' ),
1487
+        'KY' => __( 'Kentucky', 'invoicing' ),
1488
+        'LA' => __( 'Louisiana', 'invoicing' ),
1489
+        'ME' => __( 'Maine', 'invoicing' ),
1490
+        'MD' => __( 'Maryland', 'invoicing' ),
1491
+        'MA' => __( 'Massachusetts', 'invoicing' ),
1492
+        'MI' => __( 'Michigan', 'invoicing' ),
1493
+        'MN' => __( 'Minnesota', 'invoicing' ),
1494
+        'MS' => __( 'Mississippi', 'invoicing' ),
1495
+        'MO' => __( 'Missouri', 'invoicing' ),
1496
+        'MT' => __( 'Montana', 'invoicing' ),
1497
+        'NE' => __( 'Nebraska', 'invoicing' ),
1498
+        'NV' => __( 'Nevada', 'invoicing' ),
1499
+        'NH' => __( 'New Hampshire', 'invoicing' ),
1500
+        'NJ' => __( 'New Jersey', 'invoicing' ),
1501
+        'NM' => __( 'New Mexico', 'invoicing' ),
1502
+        'NY' => __( 'New York', 'invoicing' ),
1503
+        'NC' => __( 'North Carolina', 'invoicing' ),
1504
+        'ND' => __( 'North Dakota', 'invoicing' ),
1505
+        'OH' => __( 'Ohio', 'invoicing' ),
1506
+        'OK' => __( 'Oklahoma', 'invoicing' ),
1507
+        'OR' => __( 'Oregon', 'invoicing' ),
1508
+        'PA' => __( 'Pennsylvania', 'invoicing' ),
1509
+        'RI' => __( 'Rhode Island', 'invoicing' ),
1510
+        'SC' => __( 'South Carolina', 'invoicing' ),
1511
+        'SD' => __( 'South Dakota', 'invoicing' ),
1512
+        'TN' => __( 'Tennessee', 'invoicing' ),
1513
+        'TX' => __( 'Texas', 'invoicing' ),
1514
+        'UT' => __( 'Utah', 'invoicing' ),
1515
+        'VT' => __( 'Vermont', 'invoicing' ),
1516
+        'VA' => __( 'Virginia', 'invoicing' ),
1517
+        'WA' => __( 'Washington', 'invoicing' ),
1518
+        'WV' => __( 'West Virginia', 'invoicing' ),
1519
+        'WI' => __( 'Wisconsin', 'invoicing' ),
1520
+        'WY' => __( 'Wyoming', 'invoicing' ),
1521
+        'AA' => __( 'Armed Forces (AA)', 'invoicing' ),
1522
+        'AE' => __( 'Armed Forces (AE)', 'invoicing' ),
1523
+        'AP' => __( 'Armed Forces (AP)', 'invoicing' ),
1524
+    ),
1525
+    'VN' => array(),
1526
+    'YT' => array(),
1527
+    'ZA' => array( // South African states.
1528
+        'EC'  => __( 'Eastern Cape', 'invoicing' ),
1529
+        'FS'  => __( 'Free State', 'invoicing' ),
1530
+        'GP'  => __( 'Gauteng', 'invoicing' ),
1531
+        'KZN' => __( 'KwaZulu-Natal', 'invoicing' ),
1532
+        'LP'  => __( 'Limpopo', 'invoicing' ),
1533
+        'MP'  => __( 'Mpumalanga', 'invoicing' ),
1534
+        'NC'  => __( 'Northern Cape', 'invoicing' ),
1535
+        'NW'  => __( 'North West', 'invoicing' ),
1536
+        'WC'  => __( 'Western Cape', 'invoicing' ),
1537
+    ),
1538
+    'ZM' => array( // Zambia's Provinces. Ref: https://en.wikipedia.org/wiki/ISO_3166-2:ZM.
1539
+        'ZM-01' => __( 'Western', 'invoicing' ),
1540
+        'ZM-02' => __( 'Central', 'invoicing' ),
1541
+        'ZM-03' => __( 'Eastern', 'invoicing' ),
1542
+        'ZM-04' => __( 'Luapula', 'invoicing' ),
1543
+        'ZM-05' => __( 'Northern', 'invoicing' ),
1544
+        'ZM-06' => __( 'North-Western', 'invoicing' ),
1545
+        'ZM-07' => __( 'Southern', 'invoicing' ),
1546
+        'ZM-08' => __( 'Copperbelt', 'invoicing' ),
1547
+        'ZM-09' => __( 'Lusaka', 'invoicing' ),
1548
+        'ZM-10' => __( 'Muchinga', 'invoicing' ),
1549
+    ),
1550 1550
 );
Please login to merge, or discard this patch.
includes/data/phone-codes.php 1 patch
Indentation   +257 added lines, -257 removed lines patch added patch discarded remove patch
@@ -10,261 +10,261 @@
 block discarded – undo
10 10
 defined( 'ABSPATH' ) || exit;
11 11
 
12 12
 return array(
13
-	'BD' => '+880',
14
-	'BE' => '+32',
15
-	'BF' => '+226',
16
-	'BG' => '+359',
17
-	'BA' => '+387',
18
-	'BB' => '+1246',
19
-	'WF' => '+681',
20
-	'BL' => '+590',
21
-	'BM' => '+1441',
22
-	'BN' => '+673',
23
-	'BO' => '+591',
24
-	'BH' => '+973',
25
-	'BI' => '+257',
26
-	'BJ' => '+229',
27
-	'BT' => '+975',
28
-	'JM' => '+1876',
29
-	'BV' => '',
30
-	'BW' => '+267',
31
-	'WS' => '+685',
32
-	'BQ' => '+599',
33
-	'BR' => '+55',
34
-	'BS' => '+1242',
35
-	'JE' => '+441534',
36
-	'BY' => '+375',
37
-	'BZ' => '+501',
38
-	'RU' => '+7',
39
-	'RW' => '+250',
40
-	'RS' => '+381',
41
-	'TL' => '+670',
42
-	'RE' => '+262',
43
-	'TM' => '+993',
44
-	'TJ' => '+992',
45
-	'RO' => '+40',
46
-	'TK' => '+690',
47
-	'GW' => '+245',
48
-	'GU' => '+1671',
49
-	'GT' => '+502',
50
-	'GS' => '',
51
-	'GR' => '+30',
52
-	'GQ' => '+240',
53
-	'GP' => '+590',
54
-	'JP' => '+81',
55
-	'GY' => '+592',
56
-	'GG' => '+441481',
57
-	'GF' => '+594',
58
-	'GE' => '+995',
59
-	'GD' => '+1473',
60
-	'GB' => '+44',
61
-	'GA' => '+241',
62
-	'SV' => '+503',
63
-	'GN' => '+224',
64
-	'GM' => '+220',
65
-	'GL' => '+299',
66
-	'GI' => '+350',
67
-	'GH' => '+233',
68
-	'OM' => '+968',
69
-	'TN' => '+216',
70
-	'JO' => '+962',
71
-	'HR' => '+385',
72
-	'HT' => '+509',
73
-	'HU' => '+36',
74
-	'HK' => '+852',
75
-	'HN' => '+504',
76
-	'HM' => '',
77
-	'VE' => '+58',
78
-	'PR' => array(
79
-		'+1787',
80
-		'+1939',
81
-	),
82
-	'PS' => '+970',
83
-	'PW' => '+680',
84
-	'PT' => '+351',
85
-	'SJ' => '+47',
86
-	'PY' => '+595',
87
-	'IQ' => '+964',
88
-	'PA' => '+507',
89
-	'PF' => '+689',
90
-	'PG' => '+675',
91
-	'PE' => '+51',
92
-	'PK' => '+92',
93
-	'PH' => '+63',
94
-	'PN' => '+870',
95
-	'PL' => '+48',
96
-	'PM' => '+508',
97
-	'ZM' => '+260',
98
-	'EH' => '+212',
99
-	'EE' => '+372',
100
-	'EG' => '+20',
101
-	'ZA' => '+27',
102
-	'EC' => '+593',
103
-	'IT' => '+39',
104
-	'VN' => '+84',
105
-	'SB' => '+677',
106
-	'ET' => '+251',
107
-	'SO' => '+252',
108
-	'ZW' => '+263',
109
-	'SA' => '+966',
110
-	'ES' => '+34',
111
-	'ER' => '+291',
112
-	'ME' => '+382',
113
-	'MD' => '+373',
114
-	'MG' => '+261',
115
-	'MF' => '+590',
116
-	'MA' => '+212',
117
-	'MC' => '+377',
118
-	'UZ' => '+998',
119
-	'MM' => '+95',
120
-	'ML' => '+223',
121
-	'MO' => '+853',
122
-	'MN' => '+976',
123
-	'MH' => '+692',
124
-	'MK' => '+389',
125
-	'MU' => '+230',
126
-	'MT' => '+356',
127
-	'MW' => '+265',
128
-	'MV' => '+960',
129
-	'MQ' => '+596',
130
-	'MP' => '+1670',
131
-	'MS' => '+1664',
132
-	'MR' => '+222',
133
-	'IM' => '+441624',
134
-	'UG' => '+256',
135
-	'TZ' => '+255',
136
-	'MY' => '+60',
137
-	'MX' => '+52',
138
-	'IL' => '+972',
139
-	'FR' => '+33',
140
-	'IO' => '+246',
141
-	'SH' => '+290',
142
-	'FI' => '+358',
143
-	'FJ' => '+679',
144
-	'FK' => '+500',
145
-	'FM' => '+691',
146
-	'FO' => '+298',
147
-	'NI' => '+505',
148
-	'NL' => '+31',
149
-	'NO' => '+47',
150
-	'NA' => '+264',
151
-	'VU' => '+678',
152
-	'NC' => '+687',
153
-	'NE' => '+227',
154
-	'NF' => '+672',
155
-	'NG' => '+234',
156
-	'NZ' => '+64',
157
-	'NP' => '+977',
158
-	'NR' => '+674',
159
-	'NU' => '+683',
160
-	'CK' => '+682',
161
-	'XK' => '',
162
-	'CI' => '+225',
163
-	'CH' => '+41',
164
-	'CO' => '+57',
165
-	'CN' => '+86',
166
-	'CM' => '+237',
167
-	'CL' => '+56',
168
-	'CC' => '+61',
169
-	'CA' => '+1',
170
-	'CG' => '+242',
171
-	'CF' => '+236',
172
-	'CD' => '+243',
173
-	'CZ' => '+420',
174
-	'CY' => '+357',
175
-	'CX' => '+61',
176
-	'CR' => '+506',
177
-	'CW' => '+599',
178
-	'CV' => '+238',
179
-	'CU' => '+53',
180
-	'SZ' => '+268',
181
-	'SY' => '+963',
182
-	'SX' => '+599',
183
-	'KG' => '+996',
184
-	'KE' => '+254',
185
-	'SS' => '+211',
186
-	'SR' => '+597',
187
-	'KI' => '+686',
188
-	'KH' => '+855',
189
-	'KN' => '+1869',
190
-	'KM' => '+269',
191
-	'ST' => '+239',
192
-	'SK' => '+421',
193
-	'KR' => '+82',
194
-	'SI' => '+386',
195
-	'KP' => '+850',
196
-	'KW' => '+965',
197
-	'SN' => '+221',
198
-	'SM' => '+378',
199
-	'SL' => '+232',
200
-	'SC' => '+248',
201
-	'KZ' => '+7',
202
-	'KY' => '+1345',
203
-	'SG' => '+65',
204
-	'SE' => '+46',
205
-	'SD' => '+249',
206
-	'DO' => array(
207
-		'+1809',
208
-		'+1829',
209
-		'+1849',
210
-	),
211
-	'DM' => '+1767',
212
-	'DJ' => '+253',
213
-	'DK' => '+45',
214
-	'VG' => '+1284',
215
-	'DE' => '+49',
216
-	'YE' => '+967',
217
-	'DZ' => '+213',
218
-	'US' => '+1',
219
-	'UY' => '+598',
220
-	'YT' => '+262',
221
-	'UM' => '+1',
222
-	'LB' => '+961',
223
-	'LC' => '+1758',
224
-	'LA' => '+856',
225
-	'TV' => '+688',
226
-	'TW' => '+886',
227
-	'TT' => '+1868',
228
-	'TR' => '+90',
229
-	'LK' => '+94',
230
-	'LI' => '+423',
231
-	'LV' => '+371',
232
-	'TO' => '+676',
233
-	'LT' => '+370',
234
-	'LU' => '+352',
235
-	'LR' => '+231',
236
-	'LS' => '+266',
237
-	'TH' => '+66',
238
-	'TF' => '',
239
-	'TG' => '+228',
240
-	'TD' => '+235',
241
-	'TC' => '+1649',
242
-	'LY' => '+218',
243
-	'VA' => '+379',
244
-	'VC' => '+1784',
245
-	'AE' => '+971',
246
-	'AD' => '+376',
247
-	'AG' => '+1268',
248
-	'AF' => '+93',
249
-	'AI' => '+1264',
250
-	'VI' => '+1340',
251
-	'IS' => '+354',
252
-	'IR' => '+98',
253
-	'AM' => '+374',
254
-	'AL' => '+355',
255
-	'AO' => '+244',
256
-	'AQ' => '',
257
-	'AS' => '+1684',
258
-	'AR' => '+54',
259
-	'AU' => '+61',
260
-	'AT' => '+43',
261
-	'AW' => '+297',
262
-	'IN' => '+91',
263
-	'AX' => '+35818',
264
-	'AZ' => '+994',
265
-	'IE' => '+353',
266
-	'ID' => '+62',
267
-	'UA' => '+380',
268
-	'QA' => '+974',
269
-	'MZ' => '+258',
13
+    'BD' => '+880',
14
+    'BE' => '+32',
15
+    'BF' => '+226',
16
+    'BG' => '+359',
17
+    'BA' => '+387',
18
+    'BB' => '+1246',
19
+    'WF' => '+681',
20
+    'BL' => '+590',
21
+    'BM' => '+1441',
22
+    'BN' => '+673',
23
+    'BO' => '+591',
24
+    'BH' => '+973',
25
+    'BI' => '+257',
26
+    'BJ' => '+229',
27
+    'BT' => '+975',
28
+    'JM' => '+1876',
29
+    'BV' => '',
30
+    'BW' => '+267',
31
+    'WS' => '+685',
32
+    'BQ' => '+599',
33
+    'BR' => '+55',
34
+    'BS' => '+1242',
35
+    'JE' => '+441534',
36
+    'BY' => '+375',
37
+    'BZ' => '+501',
38
+    'RU' => '+7',
39
+    'RW' => '+250',
40
+    'RS' => '+381',
41
+    'TL' => '+670',
42
+    'RE' => '+262',
43
+    'TM' => '+993',
44
+    'TJ' => '+992',
45
+    'RO' => '+40',
46
+    'TK' => '+690',
47
+    'GW' => '+245',
48
+    'GU' => '+1671',
49
+    'GT' => '+502',
50
+    'GS' => '',
51
+    'GR' => '+30',
52
+    'GQ' => '+240',
53
+    'GP' => '+590',
54
+    'JP' => '+81',
55
+    'GY' => '+592',
56
+    'GG' => '+441481',
57
+    'GF' => '+594',
58
+    'GE' => '+995',
59
+    'GD' => '+1473',
60
+    'GB' => '+44',
61
+    'GA' => '+241',
62
+    'SV' => '+503',
63
+    'GN' => '+224',
64
+    'GM' => '+220',
65
+    'GL' => '+299',
66
+    'GI' => '+350',
67
+    'GH' => '+233',
68
+    'OM' => '+968',
69
+    'TN' => '+216',
70
+    'JO' => '+962',
71
+    'HR' => '+385',
72
+    'HT' => '+509',
73
+    'HU' => '+36',
74
+    'HK' => '+852',
75
+    'HN' => '+504',
76
+    'HM' => '',
77
+    'VE' => '+58',
78
+    'PR' => array(
79
+        '+1787',
80
+        '+1939',
81
+    ),
82
+    'PS' => '+970',
83
+    'PW' => '+680',
84
+    'PT' => '+351',
85
+    'SJ' => '+47',
86
+    'PY' => '+595',
87
+    'IQ' => '+964',
88
+    'PA' => '+507',
89
+    'PF' => '+689',
90
+    'PG' => '+675',
91
+    'PE' => '+51',
92
+    'PK' => '+92',
93
+    'PH' => '+63',
94
+    'PN' => '+870',
95
+    'PL' => '+48',
96
+    'PM' => '+508',
97
+    'ZM' => '+260',
98
+    'EH' => '+212',
99
+    'EE' => '+372',
100
+    'EG' => '+20',
101
+    'ZA' => '+27',
102
+    'EC' => '+593',
103
+    'IT' => '+39',
104
+    'VN' => '+84',
105
+    'SB' => '+677',
106
+    'ET' => '+251',
107
+    'SO' => '+252',
108
+    'ZW' => '+263',
109
+    'SA' => '+966',
110
+    'ES' => '+34',
111
+    'ER' => '+291',
112
+    'ME' => '+382',
113
+    'MD' => '+373',
114
+    'MG' => '+261',
115
+    'MF' => '+590',
116
+    'MA' => '+212',
117
+    'MC' => '+377',
118
+    'UZ' => '+998',
119
+    'MM' => '+95',
120
+    'ML' => '+223',
121
+    'MO' => '+853',
122
+    'MN' => '+976',
123
+    'MH' => '+692',
124
+    'MK' => '+389',
125
+    'MU' => '+230',
126
+    'MT' => '+356',
127
+    'MW' => '+265',
128
+    'MV' => '+960',
129
+    'MQ' => '+596',
130
+    'MP' => '+1670',
131
+    'MS' => '+1664',
132
+    'MR' => '+222',
133
+    'IM' => '+441624',
134
+    'UG' => '+256',
135
+    'TZ' => '+255',
136
+    'MY' => '+60',
137
+    'MX' => '+52',
138
+    'IL' => '+972',
139
+    'FR' => '+33',
140
+    'IO' => '+246',
141
+    'SH' => '+290',
142
+    'FI' => '+358',
143
+    'FJ' => '+679',
144
+    'FK' => '+500',
145
+    'FM' => '+691',
146
+    'FO' => '+298',
147
+    'NI' => '+505',
148
+    'NL' => '+31',
149
+    'NO' => '+47',
150
+    'NA' => '+264',
151
+    'VU' => '+678',
152
+    'NC' => '+687',
153
+    'NE' => '+227',
154
+    'NF' => '+672',
155
+    'NG' => '+234',
156
+    'NZ' => '+64',
157
+    'NP' => '+977',
158
+    'NR' => '+674',
159
+    'NU' => '+683',
160
+    'CK' => '+682',
161
+    'XK' => '',
162
+    'CI' => '+225',
163
+    'CH' => '+41',
164
+    'CO' => '+57',
165
+    'CN' => '+86',
166
+    'CM' => '+237',
167
+    'CL' => '+56',
168
+    'CC' => '+61',
169
+    'CA' => '+1',
170
+    'CG' => '+242',
171
+    'CF' => '+236',
172
+    'CD' => '+243',
173
+    'CZ' => '+420',
174
+    'CY' => '+357',
175
+    'CX' => '+61',
176
+    'CR' => '+506',
177
+    'CW' => '+599',
178
+    'CV' => '+238',
179
+    'CU' => '+53',
180
+    'SZ' => '+268',
181
+    'SY' => '+963',
182
+    'SX' => '+599',
183
+    'KG' => '+996',
184
+    'KE' => '+254',
185
+    'SS' => '+211',
186
+    'SR' => '+597',
187
+    'KI' => '+686',
188
+    'KH' => '+855',
189
+    'KN' => '+1869',
190
+    'KM' => '+269',
191
+    'ST' => '+239',
192
+    'SK' => '+421',
193
+    'KR' => '+82',
194
+    'SI' => '+386',
195
+    'KP' => '+850',
196
+    'KW' => '+965',
197
+    'SN' => '+221',
198
+    'SM' => '+378',
199
+    'SL' => '+232',
200
+    'SC' => '+248',
201
+    'KZ' => '+7',
202
+    'KY' => '+1345',
203
+    'SG' => '+65',
204
+    'SE' => '+46',
205
+    'SD' => '+249',
206
+    'DO' => array(
207
+        '+1809',
208
+        '+1829',
209
+        '+1849',
210
+    ),
211
+    'DM' => '+1767',
212
+    'DJ' => '+253',
213
+    'DK' => '+45',
214
+    'VG' => '+1284',
215
+    'DE' => '+49',
216
+    'YE' => '+967',
217
+    'DZ' => '+213',
218
+    'US' => '+1',
219
+    'UY' => '+598',
220
+    'YT' => '+262',
221
+    'UM' => '+1',
222
+    'LB' => '+961',
223
+    'LC' => '+1758',
224
+    'LA' => '+856',
225
+    'TV' => '+688',
226
+    'TW' => '+886',
227
+    'TT' => '+1868',
228
+    'TR' => '+90',
229
+    'LK' => '+94',
230
+    'LI' => '+423',
231
+    'LV' => '+371',
232
+    'TO' => '+676',
233
+    'LT' => '+370',
234
+    'LU' => '+352',
235
+    'LR' => '+231',
236
+    'LS' => '+266',
237
+    'TH' => '+66',
238
+    'TF' => '',
239
+    'TG' => '+228',
240
+    'TD' => '+235',
241
+    'TC' => '+1649',
242
+    'LY' => '+218',
243
+    'VA' => '+379',
244
+    'VC' => '+1784',
245
+    'AE' => '+971',
246
+    'AD' => '+376',
247
+    'AG' => '+1268',
248
+    'AF' => '+93',
249
+    'AI' => '+1264',
250
+    'VI' => '+1340',
251
+    'IS' => '+354',
252
+    'IR' => '+98',
253
+    'AM' => '+374',
254
+    'AL' => '+355',
255
+    'AO' => '+244',
256
+    'AQ' => '',
257
+    'AS' => '+1684',
258
+    'AR' => '+54',
259
+    'AU' => '+61',
260
+    'AT' => '+43',
261
+    'AW' => '+297',
262
+    'IN' => '+91',
263
+    'AX' => '+35818',
264
+    'AZ' => '+994',
265
+    'IE' => '+353',
266
+    'ID' => '+62',
267
+    'UA' => '+380',
268
+    'QA' => '+974',
269
+    'MZ' => '+258',
270 270
 );
Please login to merge, or discard this patch.