Passed
Pull Request — master (#405)
by Brian
05:03
created
includes/wpinv-tax-functions.php 3 patches
Braces   +9 added lines, -6 removed lines patch added patch discarded remove patch
@@ -70,8 +70,9 @@  discard block
 block discarded – undo
70 70
         if( !empty( $tax_rates ) ) {
71 71
             // Locate the tax rate for this country / state, if it exists
72 72
             foreach( $tax_rates as $key => $tax_rate ) {
73
-                if( $country != $tax_rate['country'] )
74
-                    continue;
73
+                if( $country != $tax_rate['country'] ) {
74
+                                    continue;
75
+                }
75 76
 
76 77
                 if( !empty( $tax_rate['global'] ) ) {
77 78
                     if( !empty( $tax_rate['rate'] ) ) {
@@ -79,8 +80,9 @@  discard block
 block discarded – undo
79 80
                     }
80 81
                 } else {
81 82
 
82
-                    if( empty( $tax_rate['state'] ) || strtolower( $state ) != strtolower( $tax_rate['state'] ) )
83
-                        continue;
83
+                    if( empty( $tax_rate['state'] ) || strtolower( $state ) != strtolower( $tax_rate['state'] ) ) {
84
+                                            continue;
85
+                    }
84 86
 
85 87
                     $state_rate = $tax_rate['rate'];
86 88
                     if( 0 !== $state_rate || !empty( $state_rate ) ) {
@@ -183,8 +185,9 @@  discard block
 block discarded – undo
183 185
 }
184 186
 
185 187
 function wpinv_cart_needs_tax_address_fields() {
186
-    if( !wpinv_is_cart_taxed() )
187
-        return false;
188
+    if( !wpinv_is_cart_taxed() ) {
189
+            return false;
190
+    }
188 191
 
189 192
     return ! did_action( 'wpinv_after_cc_fields', 'wpinv_default_cc_address_fields' );
190 193
 }
Please login to merge, or discard this patch.
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -618,10 +618,10 @@
 block discarded – undo
618 618
 
619 619
     }
620 620
 
621
-   if ( empty( $iso )  ) {
622
-       return false;
623
-   }
621
+    if ( empty( $iso )  ) {
622
+        return false;
623
+    }
624 624
 
625
-   return compact( 'iso', 'country', 'region', 'city', 'longitude', 'latitude', 'credit' );
625
+    return compact( 'iso', 'country', 'region', 'city', 'longitude', 'latitude', 'credit' );
626 626
 
627 627
 }
Please login to merge, or discard this patch.
Spacing   +173 added lines, -173 removed lines patch added patch discarded remove patch
@@ -1,7 +1,7 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 // MUST have WordPress.
3
-if ( !defined( 'WPINC' ) ) {
4
-    exit( 'Do NOT access this file directly: ' . basename( __FILE__ ) );
3
+if (!defined('WPINC')) {
4
+    exit('Do NOT access this file directly: ' . basename(__FILE__));
5 5
 }
6 6
 
7 7
 /**
@@ -18,8 +18,8 @@  discard block
 block discarded – undo
18 18
  * 
19 19
  * @return bool
20 20
  */
21
-function getpaid_is_eu_state( $country ) {
22
-    return WPInv_EUVat::is_eu_state( $country );
21
+function getpaid_is_eu_state($country) {
22
+    return WPInv_EUVat::is_eu_state($country);
23 23
 }
24 24
 
25 25
 /**
@@ -27,8 +27,8 @@  discard block
 block discarded – undo
27 27
  * 
28 28
  * @return bool
29 29
  */
30
-function getpaid_is_gst_country( $country ) {
31
-    return WPInv_EUVat::is_gst_country( $country );
30
+function getpaid_is_gst_country($country) {
31
+    return WPInv_EUVat::is_gst_country($country);
32 32
 }
33 33
 
34 34
 /**
@@ -42,117 +42,117 @@  discard block
 block discarded – undo
42 42
 
43 43
 
44 44
 function wpinv_use_taxes() {
45
-    $ret = wpinv_get_option( 'enable_taxes', false );
45
+    $ret = wpinv_get_option('enable_taxes', false);
46 46
     
47
-    return (bool) apply_filters( 'wpinv_use_taxes', $ret );
47
+    return (bool) apply_filters('wpinv_use_taxes', $ret);
48 48
 }
49 49
 
50 50
 function wpinv_get_tax_rates() {
51
-    $rates = get_option( 'wpinv_tax_rates', array() );
51
+    $rates = get_option('wpinv_tax_rates', array());
52 52
     
53
-    return apply_filters( 'wpinv_get_tax_rates', $rates );
53
+    return apply_filters('wpinv_get_tax_rates', $rates);
54 54
 }
55 55
 
56
-function wpinv_get_tax_rate( $country = false, $state = false, $item_id = 0 ) {
56
+function wpinv_get_tax_rate($country = false, $state = false, $item_id = 0) {
57 57
     global $wpinv_euvat, $wpi_tax_rates, $wpi_userID;
58
-    $wpi_tax_rates = !empty( $wpi_tax_rates ) ? $wpi_tax_rates : array();
58
+    $wpi_tax_rates = !empty($wpi_tax_rates) ? $wpi_tax_rates : array();
59 59
     
60
-    if ( !empty( $wpi_tax_rates ) && !empty( $item_id ) && isset( $wpi_tax_rates[$item_id] ) ) {
60
+    if (!empty($wpi_tax_rates) && !empty($item_id) && isset($wpi_tax_rates[$item_id])) {
61 61
         return $wpi_tax_rates[$item_id];
62 62
     }
63 63
     
64
-    if ( !$wpinv_euvat->item_is_taxable( $item_id, $country, $state ) ) {
64
+    if (!$wpinv_euvat->item_is_taxable($item_id, $country, $state)) {
65 65
         $wpi_tax_rates[$item_id] = 0;
66 66
         return 0;
67 67
     }
68 68
 
69 69
     $is_global = false;
70
-    if ( $item_id == 'global' ) {
70
+    if ($item_id == 'global') {
71 71
         $is_global = true;
72 72
         $item_id = 0;
73 73
     }
74 74
     
75
-    $rate           = (float)wpinv_get_option( 'tax_rate', 0 );
76
-    $user_address   = wpinv_get_user_address( $wpi_userID );
75
+    $rate           = (float) wpinv_get_option('tax_rate', 0);
76
+    $user_address   = wpinv_get_user_address($wpi_userID);
77 77
     
78
-    if( empty( $country ) ) {
79
-        if( !empty( $_POST['wpinv_country'] ) ) {
78
+    if (empty($country)) {
79
+        if (!empty($_POST['wpinv_country'])) {
80 80
             $country = $_POST['wpinv_country'];
81
-        } elseif( !empty( $_POST['wpinv_country'] ) ) {
81
+        } elseif (!empty($_POST['wpinv_country'])) {
82 82
             $country = $_POST['wpinv_country'];
83
-        } elseif( !empty( $_POST['country'] ) ) {
83
+        } elseif (!empty($_POST['country'])) {
84 84
             $country = $_POST['country'];
85
-        } elseif( is_user_logged_in() && !empty( $user_address ) ) {
85
+        } elseif (is_user_logged_in() && !empty($user_address)) {
86 86
             $country = $user_address['country'];
87 87
         }
88
-        $country = !empty( $country ) ? $country : wpinv_get_default_country();
88
+        $country = !empty($country) ? $country : wpinv_get_default_country();
89 89
     }
90 90
 
91
-    if( empty( $state ) ) {
92
-        if( !empty( $_POST['wpinv_state'] ) ) {
91
+    if (empty($state)) {
92
+        if (!empty($_POST['wpinv_state'])) {
93 93
             $state = $_POST['wpinv_state'];
94
-        } elseif( !empty( $_POST['wpinv_state'] ) ) {
94
+        } elseif (!empty($_POST['wpinv_state'])) {
95 95
             $state = $_POST['wpinv_state'];
96
-        } elseif( !empty( $_POST['state'] ) ) {
96
+        } elseif (!empty($_POST['state'])) {
97 97
             $state = $_POST['state'];
98
-        } elseif( is_user_logged_in() && !empty( $user_address ) ) {
98
+        } elseif (is_user_logged_in() && !empty($user_address)) {
99 99
             $state = $user_address['state'];
100 100
         }
101
-        $state = !empty( $state ) ? $state : wpinv_get_default_state();
101
+        $state = !empty($state) ? $state : wpinv_get_default_state();
102 102
     }
103 103
     
104
-    if( !empty( $country ) ) {
105
-        $tax_rates   = wpinv_get_tax_rates();
104
+    if (!empty($country)) {
105
+        $tax_rates = wpinv_get_tax_rates();
106 106
 
107
-        if( !empty( $tax_rates ) ) {
107
+        if (!empty($tax_rates)) {
108 108
             // Locate the tax rate for this country / state, if it exists
109
-            foreach( $tax_rates as $key => $tax_rate ) {
110
-                if( $country != $tax_rate['country'] )
109
+            foreach ($tax_rates as $key => $tax_rate) {
110
+                if ($country != $tax_rate['country'])
111 111
                     continue;
112 112
 
113
-                if( !empty( $tax_rate['global'] ) ) {
114
-                    if( !empty( $tax_rate['rate'] ) ) {
115
-                        $rate = number_format( $tax_rate['rate'], 4 );
113
+                if (!empty($tax_rate['global'])) {
114
+                    if (!empty($tax_rate['rate'])) {
115
+                        $rate = number_format($tax_rate['rate'], 4);
116 116
                     }
117 117
                 } else {
118 118
 
119
-                    if( empty( $tax_rate['state'] ) || strtolower( $state ) != strtolower( $tax_rate['state'] ) )
119
+                    if (empty($tax_rate['state']) || strtolower($state) != strtolower($tax_rate['state']))
120 120
                         continue;
121 121
 
122 122
                     $state_rate = $tax_rate['rate'];
123
-                    if( 0 !== $state_rate || !empty( $state_rate ) ) {
124
-                        $rate = number_format( $state_rate, 4 );
123
+                    if (0 !== $state_rate || !empty($state_rate)) {
124
+                        $rate = number_format($state_rate, 4);
125 125
                     }
126 126
                 }
127 127
             }
128 128
         }
129 129
     }
130 130
     
131
-    $rate = apply_filters( 'wpinv_tax_rate', $rate, $country, $state, $item_id );
131
+    $rate = apply_filters('wpinv_tax_rate', $rate, $country, $state, $item_id);
132 132
     
133
-    if ( !empty( $item_id ) ) {
133
+    if (!empty($item_id)) {
134 134
         $wpi_tax_rates[$item_id] = $rate;
135
-    } else if ( $is_global ) {
135
+    } else if ($is_global) {
136 136
         $wpi_tax_rates['global'] = $rate;
137 137
     }
138 138
     
139 139
     return $rate;
140 140
 }
141 141
 
142
-function wpinv_get_formatted_tax_rate( $country = false, $state = false, $item_id ) {
143
-    $rate = wpinv_get_tax_rate( $country, $state, $item_id );
144
-    $rate = round( $rate, 4 );
142
+function wpinv_get_formatted_tax_rate($country = false, $state = false, $item_id) {
143
+    $rate = wpinv_get_tax_rate($country, $state, $item_id);
144
+    $rate = round($rate, 4);
145 145
     $formatted = $rate .= '%';
146
-    return apply_filters( 'wpinv_formatted_tax_rate', $formatted, $rate, $country, $state, $item_id );
146
+    return apply_filters('wpinv_formatted_tax_rate', $formatted, $rate, $country, $state, $item_id);
147 147
 }
148 148
 
149
-function wpinv_calculate_tax( $amount = 0, $country = false, $state = false, $item_id = 0 ) {
150
-    $rate = wpinv_get_tax_rate( $country, $state, $item_id );
149
+function wpinv_calculate_tax($amount = 0, $country = false, $state = false, $item_id = 0) {
150
+    $rate = wpinv_get_tax_rate($country, $state, $item_id);
151 151
     $tax  = 0.00;
152 152
 
153
-    if ( wpinv_use_taxes() ) {        
154
-        if ( wpinv_prices_include_tax() ) {
155
-            $pre_tax = ( $amount / ( ( 1 + $rate ) * 0.01 ) );
153
+    if (wpinv_use_taxes()) {        
154
+        if (wpinv_prices_include_tax()) {
155
+            $pre_tax = ($amount / ((1 + $rate) * 0.01));
156 156
             $tax     = $amount - $pre_tax;
157 157
         } else {
158 158
             $tax = $amount * $rate * 0.01;
@@ -160,46 +160,46 @@  discard block
 block discarded – undo
160 160
 
161 161
     }
162 162
 
163
-    return apply_filters( 'wpinv_taxed_amount', $tax, $rate, $country, $state, $item_id );
163
+    return apply_filters('wpinv_taxed_amount', $tax, $rate, $country, $state, $item_id);
164 164
 }
165 165
 
166 166
 function wpinv_prices_include_tax() {
167 167
     return false; // TODO
168
-    $ret = ( wpinv_get_option( 'prices_include_tax', false ) == 'yes' && wpinv_use_taxes() );
168
+    $ret = (wpinv_get_option('prices_include_tax', false) == 'yes' && wpinv_use_taxes());
169 169
 
170
-    return apply_filters( 'wpinv_prices_include_tax', $ret );
170
+    return apply_filters('wpinv_prices_include_tax', $ret);
171 171
 }
172 172
 
173
-function wpinv_sales_tax_for_year( $year = null ) {
174
-    return wpinv_price( wpinv_format_amount( wpinv_get_sales_tax_for_year( $year ) ) );
173
+function wpinv_sales_tax_for_year($year = null) {
174
+    return wpinv_price(wpinv_format_amount(wpinv_get_sales_tax_for_year($year)));
175 175
 }
176 176
 
177
-function wpinv_get_sales_tax_for_year( $year = null ) {
177
+function wpinv_get_sales_tax_for_year($year = null) {
178 178
     global $wpdb;
179 179
 
180 180
     // Start at zero
181 181
     $tax = 0;
182 182
 
183
-    if ( ! empty( $year ) ) {
183
+    if (!empty($year)) {
184 184
         $args = array(
185 185
             'post_type'      => 'wpi_invoice',
186
-            'post_status'    => array( 'publish' ),
186
+            'post_status'    => array('publish'),
187 187
             'posts_per_page' => -1,
188 188
             'year'           => $year,
189 189
             'fields'         => 'ids'
190 190
         );
191 191
 
192
-        $payments    = get_posts( $args );
193
-        $payment_ids = implode( ',', $payments );
192
+        $payments    = get_posts($args);
193
+        $payment_ids = implode(',', $payments);
194 194
 
195
-        if ( count( $payments ) > 0 ) {
195
+        if (count($payments) > 0) {
196 196
             $sql = "SELECT SUM( meta_value ) FROM $wpdb->postmeta WHERE meta_key = '_wpinv_tax' AND post_id IN( $payment_ids )";
197
-            $tax = $wpdb->get_var( $sql );
197
+            $tax = $wpdb->get_var($sql);
198 198
         }
199 199
 
200 200
     }
201 201
 
202
-    return apply_filters( 'wpinv_get_sales_tax_for_year', $tax, $year );
202
+    return apply_filters('wpinv_get_sales_tax_for_year', $tax, $year);
203 203
 }
204 204
 
205 205
 function wpinv_is_cart_taxed() {
@@ -208,33 +208,33 @@  discard block
 block discarded – undo
208 208
 
209 209
 function wpinv_prices_show_tax_on_checkout() {
210 210
     return false; // TODO
211
-    $ret = ( wpinv_get_option( 'checkout_include_tax', false ) == 'yes' && wpinv_use_taxes() );
211
+    $ret = (wpinv_get_option('checkout_include_tax', false) == 'yes' && wpinv_use_taxes());
212 212
 
213
-    return apply_filters( 'wpinv_taxes_on_prices_on_checkout', $ret );
213
+    return apply_filters('wpinv_taxes_on_prices_on_checkout', $ret);
214 214
 }
215 215
 
216 216
 function wpinv_display_tax_rate() {
217
-    $ret = wpinv_use_taxes() && wpinv_get_option( 'display_tax_rate', false );
217
+    $ret = wpinv_use_taxes() && wpinv_get_option('display_tax_rate', false);
218 218
 
219
-    return apply_filters( 'wpinv_display_tax_rate', $ret );
219
+    return apply_filters('wpinv_display_tax_rate', $ret);
220 220
 }
221 221
 
222 222
 function wpinv_cart_needs_tax_address_fields() {
223
-    if( !wpinv_is_cart_taxed() )
223
+    if (!wpinv_is_cart_taxed())
224 224
         return false;
225 225
 
226
-    return ! did_action( 'wpinv_after_cc_fields', 'wpinv_default_cc_address_fields' );
226
+    return !did_action('wpinv_after_cc_fields', 'wpinv_default_cc_address_fields');
227 227
 }
228 228
 
229
-function wpinv_item_is_tax_exclusive( $item_id = 0 ) {
230
-    $ret = (bool)get_post_meta( $item_id, '_wpinv_tax_exclusive', false );
231
-    return apply_filters( 'wpinv_is_tax_exclusive', $ret, $item_id );
229
+function wpinv_item_is_tax_exclusive($item_id = 0) {
230
+    $ret = (bool) get_post_meta($item_id, '_wpinv_tax_exclusive', false);
231
+    return apply_filters('wpinv_is_tax_exclusive', $ret, $item_id);
232 232
 }
233 233
 
234
-function wpinv_currency_decimal_filter( $decimals = 2 ) {
234
+function wpinv_currency_decimal_filter($decimals = 2) {
235 235
     $currency = wpinv_get_currency();
236 236
 
237
-    switch ( $currency ) {
237
+    switch ($currency) {
238 238
         case 'RIAL' :
239 239
         case 'JPY' :
240 240
         case 'TWD' :
@@ -243,50 +243,50 @@  discard block
 block discarded – undo
243 243
             break;
244 244
     }
245 245
 
246
-    return apply_filters( 'wpinv_currency_decimal_count', $decimals, $currency );
246
+    return apply_filters('wpinv_currency_decimal_count', $decimals, $currency);
247 247
 }
248 248
 
249 249
 function wpinv_tax_amount() {
250 250
     $output = 0.00;
251 251
     
252
-    return apply_filters( 'wpinv_tax_amount', $output );
252
+    return apply_filters('wpinv_tax_amount', $output);
253 253
 }
254 254
 
255 255
 // VAT Settings
256
-function wpinv_vat_rate_add_callback( $args ) {
256
+function wpinv_vat_rate_add_callback($args) {
257 257
     ?>
258
-    <p class="wpi-vat-rate-actions"><input id="wpi_vat_rate_add" type="button" value="<?php esc_attr_e( 'Add', 'invoicing' );?>" class="button button-primary" />&nbsp;&nbsp;<i style="display:none;" class="fa fa-refresh fa-spin"></i></p>
258
+    <p class="wpi-vat-rate-actions"><input id="wpi_vat_rate_add" type="button" value="<?php esc_attr_e('Add', 'invoicing'); ?>" class="button button-primary" />&nbsp;&nbsp;<i style="display:none;" class="fa fa-refresh fa-spin"></i></p>
259 259
     <?php
260 260
 }
261 261
 
262
-function wpinv_vat_rate_delete_callback( $args ) {
262
+function wpinv_vat_rate_delete_callback($args) {
263 263
     global $wpinv_euvat;
264 264
     
265 265
     $vat_classes = $wpinv_euvat->get_rate_classes();
266
-    $vat_class = isset( $_REQUEST['wpi_sub'] ) && $_REQUEST['wpi_sub'] !== '' && isset( $vat_classes[$_REQUEST['wpi_sub']] )? sanitize_text_field( $_REQUEST['wpi_sub'] ) : '';
267
-    if ( isset( $vat_classes[$vat_class] ) ) {
266
+    $vat_class = isset($_REQUEST['wpi_sub']) && $_REQUEST['wpi_sub'] !== '' && isset($vat_classes[$_REQUEST['wpi_sub']]) ? sanitize_text_field($_REQUEST['wpi_sub']) : '';
267
+    if (isset($vat_classes[$vat_class])) {
268 268
     ?>
269
-    <p class="wpi-vat-rate-actions"><input id="wpi_vat_rate_delete" type="button" value="<?php echo wp_sprintf( esc_attr__( 'Delete class "%s"', 'invoicing' ), $vat_classes[$vat_class] );?>" class="button button-primary" />&nbsp;&nbsp;<i style="display:none;" class="fa fa-refresh fa-spin"></i></p>
269
+    <p class="wpi-vat-rate-actions"><input id="wpi_vat_rate_delete" type="button" value="<?php echo wp_sprintf(esc_attr__('Delete class "%s"', 'invoicing'), $vat_classes[$vat_class]); ?>" class="button button-primary" />&nbsp;&nbsp;<i style="display:none;" class="fa fa-refresh fa-spin"></i></p>
270 270
     <?php
271 271
     }
272 272
 }
273 273
 
274
-function wpinv_vat_rates_callback( $args ) {
274
+function wpinv_vat_rates_callback($args) {
275 275
     global $wpinv_euvat;
276 276
     
277 277
     $vat_classes    = $wpinv_euvat->get_rate_classes();
278
-    $vat_class      = isset( $_REQUEST['wpi_sub'] ) && $_REQUEST['wpi_sub'] !== '' && isset( $vat_classes[$_REQUEST['wpi_sub']] )? sanitize_text_field( $_REQUEST['wpi_sub'] ) : '_standard';
278
+    $vat_class      = isset($_REQUEST['wpi_sub']) && $_REQUEST['wpi_sub'] !== '' && isset($vat_classes[$_REQUEST['wpi_sub']]) ? sanitize_text_field($_REQUEST['wpi_sub']) : '_standard';
279 279
     
280 280
     $eu_states      = $wpinv_euvat->get_eu_states();
281 281
     $countries      = wpinv_get_country_list();
282 282
     $vat_groups     = $wpinv_euvat->get_vat_groups();
283
-    $rates          = $wpinv_euvat->get_vat_rates( $vat_class );
283
+    $rates          = $wpinv_euvat->get_vat_rates($vat_class);
284 284
     ob_start();
285 285
 ?>
286 286
 </td><tr>
287 287
     <td colspan="2" class="wpinv_vat_tdbox">
288
-    <input type="hidden" name="wpi_vat_class" value="<?php echo $vat_class;?>" />
289
-    <p><?php echo ( isset( $args['desc'] ) ? $args['desc'] : '' ); ?></p>
288
+    <input type="hidden" name="wpi_vat_class" value="<?php echo $vat_class; ?>" />
289
+    <p><?php echo (isset($args['desc']) ? $args['desc'] : ''); ?></p>
290 290
     <table id="wpinv_vat_rates" class="wp-list-table widefat fixed posts">
291 291
         <colgroup>
292 292
             <col width="50px" />
@@ -298,43 +298,43 @@  discard block
 block discarded – undo
298 298
         </colgroup>
299 299
         <thead>
300 300
             <tr>
301
-                <th scope="col" colspan="2" class="wpinv_vat_country_name"><?php _e( 'Country', 'invoicing' ); ?></th>
302
-                <th scope="col" class="wpinv_vat_global" title="<?php esc_attr_e( 'Apply rate to whole country', 'invoicing' ); ?>"><?php _e( 'Country Wide', 'invoicing' ); ?></th>
303
-                <th scope="col" class="wpinv_vat_rate"><?php _e( 'Rate %', 'invoicing' ); ?></th> 
304
-                <th scope="col" class="wpinv_vat_name"><?php _e( 'VAT Name', 'invoicing' ); ?></th>
305
-                <th scope="col" class="wpinv_vat_group"><?php _e( 'Tax Group', 'invoicing' ); ?></th>
301
+                <th scope="col" colspan="2" class="wpinv_vat_country_name"><?php _e('Country', 'invoicing'); ?></th>
302
+                <th scope="col" class="wpinv_vat_global" title="<?php esc_attr_e('Apply rate to whole country', 'invoicing'); ?>"><?php _e('Country Wide', 'invoicing'); ?></th>
303
+                <th scope="col" class="wpinv_vat_rate"><?php _e('Rate %', 'invoicing'); ?></th> 
304
+                <th scope="col" class="wpinv_vat_name"><?php _e('VAT Name', 'invoicing'); ?></th>
305
+                <th scope="col" class="wpinv_vat_group"><?php _e('Tax Group', 'invoicing'); ?></th>
306 306
             </tr>
307 307
         </thead>
308 308
         <tbody>
309
-        <?php if( !empty( $eu_states ) ) { ?>
309
+        <?php if (!empty($eu_states)) { ?>
310 310
         <?php 
311
-        foreach ( $eu_states as $state ) { 
312
-            $country_name = isset( $countries[$state] ) ? $countries[$state] : '';
311
+        foreach ($eu_states as $state) { 
312
+            $country_name = isset($countries[$state]) ? $countries[$state] : '';
313 313
             
314 314
             // Filter the rate for each country
315
-            $country_rate = array_filter( $rates, function( $rate ) use( $state ) { return $rate['country'] === $state; } );
315
+            $country_rate = array_filter($rates, function($rate) use($state) { return $rate['country'] === $state; } );
316 316
             
317 317
             // If one does not exist create a default
318
-            $country_rate = is_array( $country_rate ) && count( $country_rate ) > 0 ? reset( $country_rate ) : array();
318
+            $country_rate = is_array($country_rate) && count($country_rate) > 0 ? reset($country_rate) : array();
319 319
             
320
-            $vat_global = isset( $country_rate['global'] ) ? !empty( $country_rate['global'] ) : true;
321
-            $vat_rate = isset( $country_rate['rate'] ) ? $country_rate['rate'] : '';
322
-            $vat_name = !empty( $country_rate['name'] ) ? esc_attr( stripslashes( $country_rate['name'] ) ) : '';
323
-            $vat_group = !empty( $country_rate['group'] ) ? $country_rate['group'] : ( $vat_class === '_standard' ? 'standard' : 'reduced' );
320
+            $vat_global = isset($country_rate['global']) ? !empty($country_rate['global']) : true;
321
+            $vat_rate = isset($country_rate['rate']) ? $country_rate['rate'] : '';
322
+            $vat_name = !empty($country_rate['name']) ? esc_attr(stripslashes($country_rate['name'])) : '';
323
+            $vat_group = !empty($country_rate['group']) ? $country_rate['group'] : ($vat_class === '_standard' ? 'standard' : 'reduced');
324 324
         ?>
325 325
         <tr>
326 326
             <td class="wpinv_vat_country"><?php echo $state; ?><input type="hidden" name="vat_rates[<?php echo $state; ?>][country]" value="<?php echo $state; ?>" /><input type="hidden" name="vat_rates[<?php echo $state; ?>][state]" value="" /></td>
327 327
             <td class="wpinv_vat_country_name"><?php echo $country_name; ?></td>
328 328
             <td class="wpinv_vat_global">
329
-                <input type="checkbox" name="vat_rates[<?php echo $state;?>][global]" id="vat_rates[<?php echo $state;?>][global]" value="1" <?php checked( true, $vat_global );?> disabled="disabled" />
330
-                <label for="tax_rates[<?php echo $state;?>][global]"><?php _e( 'Apply to whole country', 'invoicing' ); ?></label>
331
-                <input type="hidden" name="vat_rates[<?php echo $state;?>][global]" value="1" checked="checked" />
329
+                <input type="checkbox" name="vat_rates[<?php echo $state; ?>][global]" id="vat_rates[<?php echo $state; ?>][global]" value="1" <?php checked(true, $vat_global); ?> disabled="disabled" />
330
+                <label for="tax_rates[<?php echo $state; ?>][global]"><?php _e('Apply to whole country', 'invoicing'); ?></label>
331
+                <input type="hidden" name="vat_rates[<?php echo $state; ?>][global]" value="1" checked="checked" />
332 332
             </td>
333
-            <td class="wpinv_vat_rate"><input type="number" class="small-text" step="any" min="0" max="99" name="vat_rates[<?php echo $state;?>][rate]" value="<?php echo $vat_rate; ?>" /></td>
334
-            <td class="wpinv_vat_name"><input type="text" class="regular-text" name="vat_rates[<?php echo $state;?>][name]" value="<?php echo $vat_name; ?>" /></td>
333
+            <td class="wpinv_vat_rate"><input type="number" class="small-text" step="any" min="0" max="99" name="vat_rates[<?php echo $state; ?>][rate]" value="<?php echo $vat_rate; ?>" /></td>
334
+            <td class="wpinv_vat_name"><input type="text" class="regular-text" name="vat_rates[<?php echo $state; ?>][name]" value="<?php echo $vat_name; ?>" /></td>
335 335
             <td class="wpinv_vat_group">
336 336
             <?php
337
-            echo wpinv_html_select( array(
337
+            echo wpinv_html_select(array(
338 338
                                         'name'             => 'vat_rates[' . $state . '][group]',
339 339
                                         'selected'         => $vat_group,
340 340
                                         'id'               => 'vat_rates[' . $state . '][group]',
@@ -343,14 +343,14 @@  discard block
 block discarded – undo
343 343
                                         'multiple'         => false,
344 344
                                         'show_option_all'  => false,
345 345
                                         'show_option_none' => false
346
-                                    ) );
346
+                                    ));
347 347
             ?>
348 348
             </td>
349 349
         </tr>
350 350
         <?php } ?>
351 351
         <tr>
352 352
             <td colspan="6" style="background-color:#fafafa;">
353
-                <span><input id="wpi_vat_get_rates_group" type="button" class="button-secondary" value="<?php esc_attr_e( 'Update EU VAT Rates', 'invoicing' ); ?>" />&nbsp;&nbsp;<i style="display:none" class="fa fa-refresh fa-spin"></i></span><span id="wpinv-rates-error-wrap" class="wpinv_errors" style="display:none;"></span>
353
+                <span><input id="wpi_vat_get_rates_group" type="button" class="button-secondary" value="<?php esc_attr_e('Update EU VAT Rates', 'invoicing'); ?>" />&nbsp;&nbsp;<i style="display:none" class="fa fa-refresh fa-spin"></i></span><span id="wpinv-rates-error-wrap" class="wpinv_errors" style="display:none;"></span>
354 354
             </td>
355 355
         </tr>
356 356
         <?php } ?>
@@ -362,35 +362,35 @@  discard block
 block discarded – undo
362 362
     echo $content;
363 363
 }
364 364
 
365
-function wpinv_vat_number_callback( $args ) {
365
+function wpinv_vat_number_callback($args) {
366 366
     global $wpinv_euvat;
367 367
     
368 368
     $vat_number     = $wpinv_euvat->get_vat_number();
369 369
     $vat_valid      = $wpinv_euvat->is_vat_validated();
370 370
 
371
-    $size           = ( isset( $args['size'] ) && !is_null( $args['size'] ) ) ? $args['size'] : 'regular';
372
-    $validated_text = $vat_valid ? __( 'VAT number validated', 'invoicing' ) : __( 'VAT number not validated', 'invoicing' );
371
+    $size           = (isset($args['size']) && !is_null($args['size'])) ? $args['size'] : 'regular';
372
+    $validated_text = $vat_valid ? __('VAT number validated', 'invoicing') : __('VAT number not validated', 'invoicing');
373 373
     $disabled       = $vat_valid ? 'disabled="disabled"' : " ";
374 374
     
375
-    $html = '<input type="text" class="' . $size . '-text" id="wpinv_settings[' . $args['id'] . ']" name="wpinv_settings[' . $args['id'] . ']" placeholder="GB123456789" value="' . esc_attr( stripslashes( $vat_number ) ) . '"/>';
376
-    $html .= '<span>&nbsp;<input type="button" id="wpinv_vat_validate" class="wpinv_validate_vat_button button-secondary" ' . $disabled . ' value="' . esc_attr__( 'Validate VAT Number', 'invoicing' ) . '" /></span>';
377
-    $html .= '<span class="wpinv-vat-stat wpinv-vat-stat-' . (int)$vat_valid . '"><i class="fa"></i> <font>' . $validated_text . '</font></span>';
378
-    $html .= '<label for="wpinv_settings[' . $args['id'] . ']">' . '<p>' . __( 'Enter your VAT number including country identifier, eg: GB123456789 (Settings must be saved after validation)', 'invoicing' ).'</p>' . '</label>';
379
-    $html .= '<input type="hidden" name="_wpi_nonce" value="' . wp_create_nonce( 'vat_validation' ) . '">';
375
+    $html = '<input type="text" class="' . $size . '-text" id="wpinv_settings[' . $args['id'] . ']" name="wpinv_settings[' . $args['id'] . ']" placeholder="GB123456789" value="' . esc_attr(stripslashes($vat_number)) . '"/>';
376
+    $html .= '<span>&nbsp;<input type="button" id="wpinv_vat_validate" class="wpinv_validate_vat_button button-secondary" ' . $disabled . ' value="' . esc_attr__('Validate VAT Number', 'invoicing') . '" /></span>';
377
+    $html .= '<span class="wpinv-vat-stat wpinv-vat-stat-' . (int) $vat_valid . '"><i class="fa"></i> <font>' . $validated_text . '</font></span>';
378
+    $html .= '<label for="wpinv_settings[' . $args['id'] . ']">' . '<p>' . __('Enter your VAT number including country identifier, eg: GB123456789 (Settings must be saved after validation)', 'invoicing') . '</p>' . '</label>';
379
+    $html .= '<input type="hidden" name="_wpi_nonce" value="' . wp_create_nonce('vat_validation') . '">';
380 380
 
381 381
     echo $html;
382 382
 }
383 383
 
384
-function wpinv_eu_fallback_rate_callback( $args ) {
384
+function wpinv_eu_fallback_rate_callback($args) {
385 385
     global $wpinv_options;
386 386
 
387
-    $value = isset( $wpinv_options[$args['id']] ) ? $wpinv_options[ $args['id'] ] : ( isset( $args['std'] ) ? $args['std'] : '' );
388
-    $size = ( isset( $args['size'] ) && !is_null( $args['size'] ) ) ? $args['size'] : 'small';
387
+    $value = isset($wpinv_options[$args['id']]) ? $wpinv_options[$args['id']] : (isset($args['std']) ? $args['std'] : '');
388
+    $size = (isset($args['size']) && !is_null($args['size'])) ? $args['size'] : 'small';
389 389
     
390
-    $html = '<input type="number" min="0" max="99" step="any" class="' . $size . '-text" id="wpinv_settings_' . $args['section'] . '_' . $args['id'] . '" name="wpinv_settings[' . $args['id'] . ']" value="' . esc_attr( stripslashes( $value ) ) . '" />';
391
-    $html .= '<span>&nbsp;<input id="wpi_add_eu_states" type="button" class="button-secondary" value="' . esc_attr__( 'Add EU Member States', 'invoicing' ) . '" /></span>';
392
-    $html .= '<span>&nbsp;<input id="wpi_remove_eu_states" type="button" class="button-secondary" value="' . esc_attr__( 'Remove EU Member States', 'invoicing' ) . '" /></span>';
393
-    $html .= '<span>&nbsp;<input id="wpi_vat_get_rates" type="button" class="button-secondary" value="' . esc_attr__( 'Update EU VAT Rates', 'invoicing' ) . '" />&nbsp;&nbsp;<i style="display:none" class="fa fa-refresh fa-spin"></i></span>';
390
+    $html = '<input type="number" min="0" max="99" step="any" class="' . $size . '-text" id="wpinv_settings_' . $args['section'] . '_' . $args['id'] . '" name="wpinv_settings[' . $args['id'] . ']" value="' . esc_attr(stripslashes($value)) . '" />';
391
+    $html .= '<span>&nbsp;<input id="wpi_add_eu_states" type="button" class="button-secondary" value="' . esc_attr__('Add EU Member States', 'invoicing') . '" /></span>';
392
+    $html .= '<span>&nbsp;<input id="wpi_remove_eu_states" type="button" class="button-secondary" value="' . esc_attr__('Remove EU Member States', 'invoicing') . '" /></span>';
393
+    $html .= '<span>&nbsp;<input id="wpi_vat_get_rates" type="button" class="button-secondary" value="' . esc_attr__('Update EU VAT Rates', 'invoicing') . '" />&nbsp;&nbsp;<i style="display:none" class="fa fa-refresh fa-spin"></i></span>';
394 394
     $html .= '<p><label for="wpinv_settings_' . $args['section'] . '_' . $args['id'] . '">' . $args['desc'] . '</label></p>';
395 395
     echo $html;
396 396
     ?>
@@ -398,36 +398,36 @@  discard block
 block discarded – undo
398 398
     <?php
399 399
 }
400 400
 
401
-function wpinv_vat_ip_lookup_callback( $args ) {
401
+function wpinv_vat_ip_lookup_callback($args) {
402 402
     global $wpinv_options, $wpinv_euvat;
403 403
 
404
-    $value =  isset( $wpinv_options[ $args['id'] ] ) ? $wpinv_options[ $args['id'] ]  : ( isset( $args['std'] ) ? $args['std'] : 'default' );
404
+    $value = isset($wpinv_options[$args['id']]) ? $wpinv_options[$args['id']] : (isset($args['std']) ? $args['std'] : 'default');
405 405
     
406 406
     $options = array();
407
-    if ( function_exists( 'geoip_country_code_by_name' ) ) {
408
-        $options['geoip'] = __( 'PHP GeoIP extension', 'invoicing' );
407
+    if (function_exists('geoip_country_code_by_name')) {
408
+        $options['geoip'] = __('PHP GeoIP extension', 'invoicing');
409 409
     }
410 410
     
411 411
     $geoip2_database = $wpinv_euvat->geoip2_country_dbfile();
412 412
     
413
-    if ( !function_exists( 'bcadd' ) ) {
414
-        $geoip2_message = __( 'GeoIP2 service requires the BC Math PHP extension, it is not loaded in your version of PHP!', 'invoicing' );
413
+    if (!function_exists('bcadd')) {
414
+        $geoip2_message = __('GeoIP2 service requires the BC Math PHP extension, it is not loaded in your version of PHP!', 'invoicing');
415 415
     } else {
416
-        $geoip2_message = ini_get('safe_mode') ? __( 'GeoIP2 is not supported with PHP safe mode enabled!', 'invoicing' ) : '';
416
+        $geoip2_message = ini_get('safe_mode') ? __('GeoIP2 is not supported with PHP safe mode enabled!', 'invoicing') : '';
417 417
     }
418 418
     
419
-    if ( $geoip2_database !== false && empty( $geoip2_message ) ) {
420
-        $options['geoip2'] = __( 'GeoIP2 Database', 'invoicing' );
419
+    if ($geoip2_database !== false && empty($geoip2_message)) {
420
+        $options['geoip2'] = __('GeoIP2 Database', 'invoicing');
421 421
     }
422 422
     
423
-    if ( function_exists( 'simplexml_load_file' ) ) {
424
-        $options['geoplugin'] = __( 'geoPlugin Web Service', 'invoicing' );
423
+    if (function_exists('simplexml_load_file')) {
424
+        $options['geoplugin'] = __('geoPlugin Web Service', 'invoicing');
425 425
     }
426 426
     
427
-    $options['site']    = __( 'Use default country', 'invoicing' );
428
-    $options['default'] = __( 'Auto', 'invoicing' );
427
+    $options['site']    = __('Use default country', 'invoicing');
428
+    $options['default'] = __('Auto', 'invoicing');
429 429
 
430
-    $html = wpinv_html_select( array(
430
+    $html = wpinv_html_select(array(
431 431
         'name'             => "wpinv_settings[{$args['id']}]",
432 432
         'selected'         => $value,
433 433
         'id'               => "wpinv_settings[{$args['id']}]",
@@ -439,23 +439,23 @@  discard block
 block discarded – undo
439 439
     ));
440 440
     
441 441
     $desc = '<label for="wpinv_settings[' . $args['id'] . ']">';
442
-    $desc .= __( 'Select the option Invoicing should use to determine the country from the IP address of the user.', 'invoicing' );
442
+    $desc .= __('Select the option Invoicing should use to determine the country from the IP address of the user.', 'invoicing');
443 443
     $desc .= '<p>';
444
-    if ( empty( $geoip2_message ) ) {
445
-        if ( $geoip2_database ) {
444
+    if (empty($geoip2_message)) {
445
+        if ($geoip2_database) {
446 446
             $last_updated = '';
447
-            if ( $time_updated = wpinv_get_option( 'wpinv_geoip2_date_updated' ) ) {
448
-                $date_updated = date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $time_updated );
449
-                $last_updated = '<br>' . sprintf( __( 'The GeoIP2 database was last updated on: <b>%s</b>', 'invoicing' ), $date_updated );
447
+            if ($time_updated = wpinv_get_option('wpinv_geoip2_date_updated')) {
448
+                $date_updated = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $time_updated);
449
+                $last_updated = '<br>' . sprintf(__('The GeoIP2 database was last updated on: <b>%s</b>', 'invoicing'), $date_updated);
450 450
             }
451
-            $desc .= __(  'GeoIP2 database exists:', 'invoicing' ) . $last_updated . '&nbsp;<input type="button" id="wpi_geoip2" action="update" class="wpinv-refresh-geoip2-btn button-secondary" value="' . __( 'Update GeoIP2 database now (~30MB)', 'invoicing' ) . '"></input>';
451
+            $desc .= __('GeoIP2 database exists:', 'invoicing') . $last_updated . '&nbsp;<input type="button" id="wpi_geoip2" action="update" class="wpinv-refresh-geoip2-btn button-secondary" value="' . __('Update GeoIP2 database now (~30MB)', 'invoicing') . '"></input>';
452 452
         } else {
453
-            $desc .= __( 'GeoIP2 database does not exist:', 'invoicing' ) . '&nbsp;<input type="button" id="wpi_geoip2" action="download" class="wpinv-download-geoip2-btn button-secondary" value="' . __( 'Download GeoIP2 database now', 'invoicing' ) . ' (~30MB)"></input><br>' . __(  'After downloading the GeoIP2 database the GeoIP2 lookup option will show.', 'invoicing' );
453
+            $desc .= __('GeoIP2 database does not exist:', 'invoicing') . '&nbsp;<input type="button" id="wpi_geoip2" action="download" class="wpinv-download-geoip2-btn button-secondary" value="' . __('Download GeoIP2 database now', 'invoicing') . ' (~30MB)"></input><br>' . __('After downloading the GeoIP2 database the GeoIP2 lookup option will show.', 'invoicing');
454 454
         }
455 455
     } else {
456 456
         $desc .= $geoip2_message;
457 457
     }
458
-    $desc .= '</p><p>'. __( 'geoPlugin is a great free service please consider supporting them: ', 'invoicing' ) . ' <a href="http://www.geoplugin.com/" target="_blank">GeoPlugin.com</a></p>';
458
+    $desc .= '</p><p>' . __('geoPlugin is a great free service please consider supporting them: ', 'invoicing') . ' <a href="http://www.geoplugin.com/" target="_blank">GeoPlugin.com</a></p>';
459 459
     $desc .= '</label>';
460 460
     
461 461
     $html .= $desc;
@@ -471,39 +471,39 @@  discard block
 block discarded – undo
471 471
  * 
472 472
  * @param string|bool|null $vat_rule
473 473
  */
474
-function getpaid_filter_vat_rule( $vat_rule ) {
474
+function getpaid_filter_vat_rule($vat_rule) {
475 475
 
476
-    if ( empty( $vat_rule ) ) {        
476
+    if (empty($vat_rule)) {        
477 477
         return getpaid_tax()->allow_vat_rules() ? 'digital' : 'physical';
478 478
     }
479 479
 
480 480
     return $vat_rule;
481 481
 }
482
-add_filter( 'wpinv_get_item_vat_rule', 'getpaid_filter_vat_rule' );
482
+add_filter('wpinv_get_item_vat_rule', 'getpaid_filter_vat_rule');
483 483
 
484 484
 /**
485 485
  * Filters the VAT class to ensure that each item has a VAT class.
486 486
  * 
487 487
  * @param string|bool|null $vat_rule
488 488
  */
489
-function getpaid_filter_vat_class( $vat_class ) {
490
-    return empty( $vat_class ) ? '_standard' : $vat_class;
489
+function getpaid_filter_vat_class($vat_class) {
490
+    return empty($vat_class) ? '_standard' : $vat_class;
491 491
 }
492
-add_filter( 'wpinv_get_item_vat_class', 'getpaid_filter_vat_class' );
492
+add_filter('wpinv_get_item_vat_class', 'getpaid_filter_vat_class');
493 493
 
494 494
 /**
495 495
  * Returns the ip address location url.
496 496
  * 
497 497
  */
498
-function getpaid_ip_location_url( $ip_address ) {
498
+function getpaid_ip_location_url($ip_address) {
499 499
 
500 500
     return add_query_arg(
501 501
         array(
502 502
             'action'   => 'wpinv_ip_geolocation',
503 503
             'ip'       => $ip_address,
504
-            '_wpnonce' => wp_create_nonce( 'getpaid-ip-location' )
504
+            '_wpnonce' => wp_create_nonce('getpaid-ip-location')
505 505
         ),
506
-        admin_url( 'admin-ajax.php' )
506
+        admin_url('admin-ajax.php')
507 507
     );
508 508
 
509 509
 }
@@ -513,54 +513,54 @@  discard block
 block discarded – undo
513 513
  * 
514 514
  * @return array|bool
515 515
  */
516
-function getpaid_geolocate_ip_address( $ip_address ) {
516
+function getpaid_geolocate_ip_address($ip_address) {
517 517
 
518 518
     // Do we have an ip address?
519
-    if ( empty( $ip_address ) ) {
519
+    if (empty($ip_address)) {
520 520
         return false;
521 521
     }
522 522
 
523 523
     /**
524 524
      * Retrieve ip address using max mind.
525 525
      */
526
-    if ( wpinv_get_option( 'vat_ip_lookup' ) == 'geoip2' && $geoip2_city = getpaid_tax()->geoip2_city_record( $ip_address ) ) {
526
+    if (wpinv_get_option('vat_ip_lookup') == 'geoip2' && $geoip2_city = getpaid_tax()->geoip2_city_record($ip_address)) {
527 527
 
528 528
         try {
529 529
             $iso        = $geoip2_city->country->isoCode;
530 530
             $country    = $geoip2_city->country->name;
531
-            $region     = ! empty( $geoip2_city->subdivisions ) && ! empty( $geoip2_city->subdivisions[0]->name ) ? $geoip2_city->subdivisions[0]->name : '';
531
+            $region     = !empty($geoip2_city->subdivisions) && !empty($geoip2_city->subdivisions[0]->name) ? $geoip2_city->subdivisions[0]->name : '';
532 532
             $city       = $geoip2_city->city->name;
533 533
             $longitude  = $geoip2_city->location->longitude;
534 534
             $latitude   = $geoip2_city->location->latitude;
535
-            $credit     = __( 'Geolocated using the information by MaxMind, available from <a href="http://www.maxmind.com" target="_blank">www.maxmind.com</a>', 'invoicing' );
536
-        } catch( Exception $e ) { }
535
+            $credit     = __('Geolocated using the information by MaxMind, available from <a href="http://www.maxmind.com" target="_blank">www.maxmind.com</a>', 'invoicing');
536
+        } catch (Exception $e) { }
537 537
 
538 538
     }
539 539
 
540 540
     // If that fails, GeoLocate using GeoPlugin.
541
-    if ( ( empty( $iso ) || empty( $longitude ) || empty( $latitude ) ) && function_exists( 'simplexml_load_file' ) ) {
541
+    if ((empty($iso) || empty($longitude) || empty($latitude)) && function_exists('simplexml_load_file')) {
542 542
 
543 543
         try {
544
-            $load_xml = simplexml_load_file( 'http://www.geoplugin.net/xml.gp?ip=' . $ip_address );
544
+            $load_xml = simplexml_load_file('http://www.geoplugin.net/xml.gp?ip=' . $ip_address);
545 545
             
546
-            if ( ! empty( $load_xml ) && isset( $load_xml->geoplugin_countryCode ) && ! empty( $load_xml->geoplugin_latitude ) && ! empty( $load_xml->geoplugin_longitude ) ) {
546
+            if (!empty($load_xml) && isset($load_xml->geoplugin_countryCode) && !empty($load_xml->geoplugin_latitude) && !empty($load_xml->geoplugin_longitude)) {
547 547
                 $iso        = $load_xml->geoplugin_countryCode;
548 548
                 $country    = $load_xml->geoplugin_countryName;
549
-                $region     = ! empty( $load_xml->geoplugin_regionName ) ? $load_xml->geoplugin_regionName : '';
550
-                $city       = ! empty( $load_xml->geoplugin_city ) ? $load_xml->geoplugin_city : '';
549
+                $region     = !empty($load_xml->geoplugin_regionName) ? $load_xml->geoplugin_regionName : '';
550
+                $city       = !empty($load_xml->geoplugin_city) ? $load_xml->geoplugin_city : '';
551 551
                 $longitude  = $load_xml->geoplugin_longitude;
552 552
                 $latitude   = $load_xml->geoplugin_latitude;
553 553
                 $credit     = $load_xml->geoplugin_credit;
554
-                $credit     = __( 'Geolocated using the information by geoPlugin, available from <a href="http://www.geoplugin.com" target="_blank">www.geoplugin.com</a>', 'invoicing' ) . '<br>' . $load_xml->geoplugin_credit;
554
+                $credit     = __('Geolocated using the information by geoPlugin, available from <a href="http://www.geoplugin.com" target="_blank">www.geoplugin.com</a>', 'invoicing') . '<br>' . $load_xml->geoplugin_credit;
555 555
             }
556
-        } catch( Exception $e ) { }
556
+        } catch (Exception $e) { }
557 557
 
558 558
     }
559 559
 
560
-   if ( empty( $iso )  ) {
560
+   if (empty($iso)) {
561 561
        return false;
562 562
    }
563 563
 
564
-   return compact( 'iso', 'country', 'region', 'city', 'longitude', 'latitude', 'credit' );
564
+   return compact('iso', 'country', 'region', 'city', 'longitude', 'latitude', 'credit');
565 565
 
566 566
 }
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/Model/City.php 1 patch
Spacing   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -130,7 +130,6 @@
 block discarded – undo
130 130
     private function mostSpecificSubdivision()
131 131
     {
132 132
         return empty($this->subdivisions) ?
133
-            new \GeoIp2\Record\Subdivision(array(), $this->locales) :
134
-            end($this->subdivisions);
133
+            new \GeoIp2\Record\Subdivision(array(), $this->locales) : end($this->subdivisions);
135 134
     }
136 135
 }
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/WebService/Client.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -76,7 +76,7 @@
 block discarded – undo
76 76
         // This is for backwards compatibility. Do not remove except for a
77 77
         // major version bump.
78 78
         if (is_string($options)) {
79
-            $options = array( 'host' => $options );
79
+            $options = array('host' => $options);
80 80
         }
81 81
 
82 82
         if (!isset($options['host'])) {
Please login to merge, or discard this patch.
includes/libraries/GeoIp2/Compat/JsonSerializable.php 1 patch
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -5,12 +5,12 @@
 block discarded – undo
5 5
 // @codingStandardsIgnoreFile
6 6
 
7 7
 /**
8
-  * This interface exists to provide backwards compatibility with PHP 5.3
9
-  *
10
-  * This should _not_ be used by any third-party code.
11
-  *
12
-  * @ignore
13
-  */
8
+ * This interface exists to provide backwards compatibility with PHP 5.3
9
+ *
10
+ * This should _not_ be used by any third-party code.
11
+ *
12
+ * @ignore
13
+ */
14 14
 if (interface_exists('JsonSerializable')) {
15 15
     interface JsonSerializable extends \JsonSerializable
16 16
     {
Please login to merge, or discard this patch.
includes/libraries/class-emogrifier.php 2 patches
Indentation   +776 added lines, -776 removed lines patch added patch discarded remove patch
@@ -9,780 +9,780 @@
 block discarded – undo
9 9
  * @author Roman Ožana <[email protected]>
10 10
  */
11 11
 class Emogrifier {
12
-	/**
13
-	 * @var string
14
-	 */
15
-	const ENCODING = 'UTF-8';
16
-
17
-	/**
18
-	 * @var integer
19
-	 */
20
-	const CACHE_KEY_CSS = 0;
21
-
22
-	/**
23
-	 * @var integer
24
-	 */
25
-	const CACHE_KEY_SELECTOR = 1;
26
-
27
-	/**
28
-	 * @var integer
29
-	 */
30
-	const CACHE_KEY_XPATH = 2;
31
-
32
-	/**
33
-	 * @var integer
34
-	 */
35
-	const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
-
37
-	/**
38
-	 * for calculating nth-of-type and nth-child selectors.
39
-	 *
40
-	 * @var integer
41
-	 */
42
-	const INDEX = 0;
43
-
44
-	/**
45
-	 * for calculating nth-of-type and nth-child selectors.
46
-	 *
47
-	 * @var integer
48
-	 */
49
-	const MULTIPLIER = 1;
50
-
51
-	/**
52
-	 * @var string
53
-	 */
54
-	const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
-
61
-	/**
62
-	 * @var string
63
-	 */
64
-	private $html = '';
65
-
66
-	/**
67
-	 * @var string
68
-	 */
69
-	private $css = '';
70
-
71
-	/**
72
-	 * @var array<string>
73
-	 */
74
-	private $unprocessableHtmlTags = array('wbr');
75
-
76
-	/**
77
-	 * @var array<array>
78
-	 */
79
-	private $caches = array(
80
-		self::CACHE_KEY_CSS => array(),
81
-		self::CACHE_KEY_SELECTOR => array(),
82
-		self::CACHE_KEY_XPATH => array(),
83
-		self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
-	);
85
-
86
-	/**
87
-	 * the visited nodes with the XPath paths as array keys.
88
-	 *
89
-	 * @var array<\DOMNode>
90
-	 */
91
-	private $visitedNodes = array();
92
-
93
-	/**
94
-	 * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
-	 * as key/value pairs for the inner array.
96
-	 *
97
-	 * @var array<array><string>
98
-	 */
99
-	private $styleAttributesForNodes = array();
100
-
101
-	/**
102
-	 * This attribute applies to the case where you want to preserve your original text encoding.
103
-	 *
104
-	 * By default, emogrifier translates your text into HTML entities for two reasons:
105
-	 *
106
-	 * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
-	 *
108
-	 * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
-	 *
110
-	 * If you would like to preserve your original encoding, set this attribute to TRUE.
111
-	 *
112
-	 * @var boolean
113
-	 */
114
-	public $preserveEncoding = false;
115
-
116
-	public static $_media = '';
117
-
118
-	/**
119
-	 * The constructor.
120
-	 *
121
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
123
-	 */
124
-	public function __construct($html = '', $css = '') {
125
-		$this->setHtml($html);
126
-		$this->setCss($css);
127
-	}
128
-
129
-	/**
130
-	 * The destructor.
131
-	 */
132
-	public function __destruct() {
133
-		$this->purgeVisitedNodes();
134
-	}
135
-
136
-	/**
137
-	 * Sets the HTML to emogrify.
138
-	 *
139
-	 * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
-	 */
141
-	public function setHtml($html = '') {
142
-		$this->html = $html;
143
-	}
144
-
145
-	/**
146
-	 * Sets the CSS to merge with the HTML.
147
-	 *
148
-	 * @param string $css the CSS to merge, must be UTF-8-encoded
149
-	 */
150
-	public function setCss($css = '') {
151
-		$this->css = $css;
152
-	}
153
-
154
-	/**
155
-	 * Clears all caches.
156
-	 */
157
-	private function clearAllCaches() {
158
-		$this->clearCache(self::CACHE_KEY_CSS);
159
-		$this->clearCache(self::CACHE_KEY_SELECTOR);
160
-		$this->clearCache(self::CACHE_KEY_XPATH);
161
-		$this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
-	}
163
-
164
-	/**
165
-	 * Clears a single cache by key.
166
-	 *
167
-	 * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
-	 *
169
-	 * @throws InvalidArgumentException
170
-	 */
171
-	private function clearCache($key) {
172
-		$allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
-		if (!in_array($key, $allowedCacheKeys, true)) {
174
-			throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
-		}
176
-
177
-		$this->caches[$key] = array();
178
-	}
179
-
180
-	/**
181
-	 * Purges the visited nodes.
182
-	 */
183
-	private function purgeVisitedNodes() {
184
-		$this->visitedNodes = array();
185
-		$this->styleAttributesForNodes = array();
186
-	}
187
-
188
-	/**
189
-	 * Marks a tag for removal.
190
-	 *
191
-	 * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
-	 * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
-	 *
194
-	 * Note: The tags will not be removed if they have any content.
195
-	 *
196
-	 * @param string $tagName the tag name, e.g., "p"
197
-	 */
198
-	public function addUnprocessableHtmlTag($tagName) {
199
-		$this->unprocessableHtmlTags[] = $tagName;
200
-	}
201
-
202
-	/**
203
-	 * Drops a tag from the removal list.
204
-	 *
205
-	 * @param string $tagName the tag name, e.g., "p"
206
-	 */
207
-	public function removeUnprocessableHtmlTag($tagName) {
208
-		$key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
-		if ($key !== false) {
210
-			unset($this->unprocessableHtmlTags[$key]);
211
-		}
212
-	}
213
-
214
-	/**
215
-	 * Applies the CSS you submit to the HTML you submit.
216
-	 *
217
-	 * This method places the CSS inline.
218
-	 *
219
-	 * @return string
220
-	 *
221
-	 * @throws BadMethodCallException
222
-	 */
223
-	public function emogrify() {
224
-		if ($this->html === '') {
225
-			throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
-		}
227
-
228
-		$xmlDocument = $this->createXmlDocument();
229
-		$xpath = new DOMXPath($xmlDocument);
230
-		$this->clearAllCaches();
231
-
232
-		// before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
-		// we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
-		// also store a reference of nodes with existing inline styles so we don't overwrite them
235
-		$this->purgeVisitedNodes();
236
-
237
-		$nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
-		if ($nodesWithStyleAttributes !== false) {
239
-			/** @var $nodeWithStyleAttribute DOMNode */
240
-			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
-
243
-				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
-				$nodePath = $node->getNodePath();
245
-				if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
-					$this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
-					$this->visitedNodes[$nodePath] = $node;
248
-				}
249
-
250
-				$node->setAttribute('style', $normalizedOriginalStyle);
251
-			}
252
-		}
253
-
254
-		// grab any existing style blocks from the html and append them to the existing CSS
255
-		// (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
-		$allCss = $this->css;
257
-
258
-		$allCss .= $this->getCssFromAllStyleNodes($xpath);
259
-
260
-		$cssParts = $this->splitCssAndMediaQuery($allCss);
261
-		self::$_media = ''; // reset
262
-
263
-		$cssKey = md5($cssParts['css']);
264
-		if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
-			// process the CSS file for selectors and definitions
266
-			preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
-
268
-			$allSelectors = array();
269
-			foreach ($matches as $key => $selectorString) {
270
-				// if there is a blank definition, skip
271
-				if (!strlen(trim($selectorString[2]))) {
272
-					continue;
273
-				}
274
-
275
-				// else split by commas and duplicate attributes so we can sort by selector precedence
276
-				$selectors = explode(',', $selectorString[1]);
277
-				foreach ($selectors as $selector) {
278
-					// don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
-					if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
-						continue;
281
-					}
282
-
283
-					$allSelectors[] = array('selector' => trim($selector),
284
-											 'attributes' => trim($selectorString[2]),
285
-											 // keep track of where it appears in the file, since order is important
286
-											 'line' => $key,
287
-					);
288
-				}
289
-			}
290
-
291
-			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
-
294
-			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
-		}
296
-
297
-		foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
-			// query the body for the xpath selector
299
-			$nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
-
301
-			/** @var $node \DOMNode */
302
-			foreach ($nodesMatchingCssSelectors as $node) {
303
-				// if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
-				if ($node->hasAttribute('style')) {
305
-					// break it up into an associative array
306
-					$oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
-				} else {
308
-					$oldStyleDeclarations = array();
309
-				}
310
-				$newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
-				$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
-			}
313
-		}
314
-
315
-		// now iterate through the nodes that contained inline styles in the original HTML
316
-		foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
-			$node = $this->visitedNodes[$nodePath];
318
-			$currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
-			$node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
-		}
321
-
322
-		// This removes styles from your email that contain display:none.
323
-		// We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
-		// lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
-		// to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
-		$nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
-		// The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
-		// we don't try to call removeChild on a nonexistent child node
329
-		if ($nodesWithStyleDisplayNone->length > 0) {
330
-			/** @var $node \DOMNode */
331
-			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
-					$node->parentNode->removeChild($node);
334
-				}
335
-			}
336
-		}
337
-
338
-		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
-
340
-		if ($this->preserveEncoding) {
341
-			if ( function_exists( 'mb_convert_encoding' ) ) {
342
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
343
-			} else {
344
-				return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
345
-			}
346
-		} else {
347
-			return $xmlDocument->saveHTML();
348
-		}
349
-	}
350
-
351
-	public function strtolower(array $m) {
352
-		return strtolower($m[0]);
353
-	}
354
-
355
-
356
-	/**
357
-	 * This method merges old or existing name/value array with new name/value array.
358
-	 * and then generates a string of the combined style suitable for placing inline.
359
-	 * This becomes the single point for CSS string generation allowing for consistent.
360
-	 * CSS output no matter where the CSS originally came from.
361
-	 * @param array $oldStyles
362
-	 * @param array $newStyles
363
-	 * @return string
364
-	 */
365
-	private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
366
-		$combinedStyles = array_merge($oldStyles, $newStyles);
367
-		$style = '';
368
-		foreach ($combinedStyles as $attributeName => $attributeValue) {
369
-			$style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
370
-		}
371
-		return trim($style);
372
-	}
373
-
374
-
375
-	/**
376
-	 * Copies the media part from CSS array parts to $xmlDocument.
377
-	 *
378
-	 * @param array $cssParts
379
-	 * @param DOMDocument $xmlDocument
380
-	 */
381
-	public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
382
-		if (isset($cssParts['media']) && $cssParts['media'] !== '') {
383
-			$this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
384
-		}
385
-	}
386
-
387
-	/**
388
-	 * Returns CSS content.
389
-	 *
390
-	 * @param DOMXPath $xpath
391
-	 * @return string
392
-	 */
393
-	private function getCssFromAllStyleNodes(DOMXPath $xpath) {
394
-		$styleNodes = $xpath->query('//style');
395
-
396
-		if ($styleNodes === false) {
397
-			return '';
398
-		}
399
-
400
-		$css = '';
401
-		/** @var $styleNode DOMNode */
402
-		foreach ($styleNodes as $styleNode) {
403
-			$css .= "\n\n" . $styleNode->nodeValue;
404
-			$styleNode->parentNode->removeChild($styleNode);
405
-		}
406
-
407
-		return $css;
408
-	}
409
-
410
-	/**
411
-	 * Adds a style element with $css to $document.
412
-	 *
413
-	 * @param DOMDocument $document
414
-	 * @param string $css
415
-	 */
416
-	private function addStyleElementToDocument(DOMDocument $document, $css) {
417
-		$styleElement = $document->createElement('style', $css);
418
-		$styleAttribute = $document->createAttribute('type');
419
-		$styleAttribute->value = 'text/css';
420
-		$styleElement->appendChild($styleAttribute);
421
-
422
-		$head = $this->getOrCreateHeadElement($document);
423
-		$head->appendChild($styleElement);
424
-	}
425
-
426
-	/**
427
-	 * Returns the existing or creates a new head element in $document.
428
-	 *
429
-	 * @param DOMDocument $document
430
-	 * @return DOMNode the head element
431
-	 */
432
-	private function getOrCreateHeadElement(DOMDocument $document) {
433
-		$head = $document->getElementsByTagName('head')->item(0);
434
-
435
-		if ($head === null) {
436
-			$head = $document->createElement('head');
437
-			$html = $document->getElementsByTagName('html')->item(0);
438
-			$html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
439
-		}
440
-
441
-		return $head;
442
-	}
443
-
444
-	/**
445
-	 * Splits input CSS code to an array where:
446
-	 *
447
-	 * - key "css" will be contains clean CSS code.
448
-	 * - key "media" will be contains all valuable media queries.
449
-	 *
450
-	 * Example:
451
-	 *
452
-	 * The CSS code.
453
-	 *
454
-	 *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
455
-	 *
456
-	 * will be parsed into the following array:
457
-	 *
458
-	 *   "css" => "h1 { color:red; }"
459
-	 *   "media" => "@media { h1 {}}"
460
-	 *
461
-	 * @param string $css
462
-	 * @return array
463
-	 */
464
-	private function splitCssAndMediaQuery($css) {
465
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
466
-
467
-		// filter the CSS
468
-		$search = array(
469
-			// get rid of css comment code
470
-			'/\\/\\*.*\\*\\//sU',
471
-			// strip out any import directives
472
-			'/^\\s*@import\\s[^;]+;/misU',
473
-			// strip remains media enclosures
474
-			'/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
475
-		);
476
-
477
-		$replace = array(
478
-			'',
479
-			'',
480
-			'',
481
-		);
482
-
483
-		// clean CSS before output
484
-		$css = preg_replace($search, $replace, $css);
485
-
486
-		return array('css' => $css, 'media' => self::$_media);
487
-	}
488
-
489
-	private function _media_concat( $matches ) {
490
-		self::$_media .= $matches[0];
491
-	}
492
-
493
-	/**
494
-	 * Creates a DOMDocument instance with the current HTML.
495
-	 *
496
-	 * @return DOMDocument
497
-	 */
498
-	private function createXmlDocument() {
499
-		$xmlDocument = new DOMDocument;
500
-		$xmlDocument->encoding = self::ENCODING;
501
-		$xmlDocument->strictErrorChecking = false;
502
-		$xmlDocument->formatOutput = true;
503
-		$libXmlState = libxml_use_internal_errors(true);
504
-		$xmlDocument->loadHTML($this->getUnifiedHtml());
505
-		libxml_clear_errors();
506
-		libxml_use_internal_errors($libXmlState);
507
-		$xmlDocument->normalizeDocument();
508
-
509
-		return $xmlDocument;
510
-	}
511
-
512
-	/**
513
-	 * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
514
-	 *
515
-	 * @return string the unified HTML
516
-	 *
517
-	 * @throws BadMethodCallException
518
-	 */
519
-	private function getUnifiedHtml() {
520
-		if (!empty($this->unprocessableHtmlTags)) {
521
-			$unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
522
-			$bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
523
-		} else {
524
-			$bodyWithoutUnprocessableTags = $this->html;
525
-		}
526
-
527
-		if ( function_exists( 'mb_convert_encoding' ) ) {
528
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
529
-		} else {
530
-			return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
531
-		}
532
-	}
533
-
534
-	/**
535
-	 * @param array $a
536
-	 * @param array $b
537
-	 *
538
-	 * @return integer
539
-	 */
540
-	private function sortBySelectorPrecedence(array $a, array $b) {
541
-		$precedenceA = $this->getCssSelectorPrecedence($a['selector']);
542
-		$precedenceB = $this->getCssSelectorPrecedence($b['selector']);
543
-
544
-		// We want these sorted in ascending order so selectors with lesser precedence get processed first and
545
-		// selectors with greater precedence get sorted last.
546
-		// The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
547
-		// arithmetic operators.
548
-		// @see http://forge.typo3.org/issues/55605
549
-		$precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
550
-		$precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
551
-		return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
552
-	}
553
-
554
-	/**
555
-	 * @param string $selector
556
-	 *
557
-	 * @return integer
558
-	 */
559
-	private function getCssSelectorPrecedence($selector) {
560
-		$selectorKey = md5($selector);
561
-		if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
562
-			$precedence = 0;
563
-			$value = 100;
564
-			// ids: worth 100, classes: worth 10, elements: worth 1
565
-			$search = array('\\#','\\.','');
566
-
567
-			foreach ($search as $s) {
568
-				if (trim($selector == '')) {
569
-					break;
570
-				}
571
-				$number = 0;
572
-				$selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
573
-				$precedence += ($value * $number);
574
-				$value /= 10;
575
-			}
576
-			$this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
577
-		}
578
-
579
-		return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
580
-	}
581
-
582
-	/**
583
-	 * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
584
-	 *
585
-	 * @see http://plasmasturm.org/log/444/
586
-	 *
587
-	 * @param string $paramCssSelector
588
-	 *
589
-	 * @return string
590
-	 */
591
-	private function translateCssToXpath($paramCssSelector) {
592
-		$cssSelector = ' ' . $paramCssSelector . ' ';
593
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
594
-		$cssSelector = trim($cssSelector);
595
-		$xpathKey = md5($cssSelector);
596
-		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
597
-			// returns an Xpath selector
598
-			$search = array(
599
-				// Matches any element that is a child of parent.
600
-				'/\\s+>\\s+/',
601
-				// Matches any element that is an adjacent sibling.
602
-				'/\\s+\\+\\s+/',
603
-				// Matches any element that is a descendant of an parent element element.
604
-				'/\\s+/',
605
-				// first-child pseudo-selector
606
-				'/([^\\/]+):first-child/i',
607
-				// last-child pseudo-selector
608
-				'/([^\\/]+):last-child/i',
609
-				// Matches attribute only selector
610
-				'/^\\[(\\w+)\\]/',
611
-				// Matches element with attribute
612
-				'/(\\w)\\[(\\w+)\\]/',
613
-				// Matches element with EXACT attribute
614
-				'/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
615
-			);
616
-			$replace = array(
617
-				'/',
618
-				'/following-sibling::*[1]/self::',
619
-				'//',
620
-				'*[1]/self::\\1',
621
-				'*[last()]/self::\\1',
622
-				'*[@\\1]',
623
-				'\\1[@\\2]',
624
-				'\\1[@\\2="\\3"]',
625
-			);
626
-
627
-			$cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
628
-
629
-			$cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
630
-			$cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
631
-
632
-			// Advanced selectors are going to require a bit more advanced emogrification.
633
-			// When we required PHP 5.3, we could do this with closures.
634
-			$cssSelector = preg_replace_callback(
635
-				'/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
636
-				array($this, 'translateNthChild'), $cssSelector
637
-			);
638
-			$cssSelector = preg_replace_callback(
639
-				'/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
640
-				array($this, 'translateNthOfType'), $cssSelector
641
-			);
642
-
643
-			$this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
644
-		}
645
-		return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
646
-	}
647
-
648
-	/**
649
-	 * @param array $match
650
-	 *
651
-	 * @return string
652
-	 */
653
-	private function matchIdAttributes(array $match) {
654
-		return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
655
-	}
656
-
657
-	/**
658
-	 * @param array $match
659
-	 *
660
-	 * @return string
661
-	 */
662
-	private function matchClassAttributes(array $match) {
663
-		return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
664
-			implode(
665
-				'"," "))][contains(concat(" ",@class," "),concat(" ","',
666
-				explode('.', substr($match[2], 1))
667
-			) . '"," "))]';
668
-	}
669
-
670
-	/**
671
-	 * @param array $match
672
-	 *
673
-	 * @return string
674
-	 */
675
-	private function translateNthChild(array $match) {
676
-		$result = $this->parseNth($match);
677
-
678
-		if (isset($result[self::MULTIPLIER])) {
679
-			if ($result[self::MULTIPLIER] < 0) {
680
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
681
-				return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
682
-			} else {
683
-				return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
684
-			}
685
-		} else {
686
-			return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
687
-		}
688
-	}
689
-
690
-	/**
691
-	 * @param array $match
692
-	 *
693
-	 * @return string
694
-	 */
695
-	private function translateNthOfType(array $match) {
696
-		$result = $this->parseNth($match);
697
-
698
-		if (isset($result[self::MULTIPLIER])) {
699
-			if ($result[self::MULTIPLIER] < 0) {
700
-				$result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
-				return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
702
-			} else {
703
-				return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
704
-			}
705
-		} else {
706
-			return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
707
-		}
708
-	}
709
-
710
-	/**
711
-	 * @param array $match
712
-	 *
713
-	 * @return array
714
-	 */
715
-	private function parseNth(array $match) {
716
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
717
-			$index = strtolower($match[2]) == 'even' ? 0 : 1;
718
-			return array(self::MULTIPLIER => 2, self::INDEX => $index);
719
-		} elseif (stripos($match[2], 'n') === false) {
720
-			// if there is a multiplier
721
-			$index = intval(str_replace(' ', '', $match[2]));
722
-			return array(self::INDEX => $index);
723
-		} else {
724
-			if (isset($match[3])) {
725
-				$multipleTerm = str_replace($match[3], '', $match[2]);
726
-				$index = intval(str_replace(' ', '', $match[3]));
727
-			} else {
728
-				$multipleTerm = $match[2];
729
-				$index = 0;
730
-			}
731
-
732
-			$multiplier = str_ireplace('n', '', $multipleTerm);
733
-
734
-			if (!strlen($multiplier)) {
735
-				$multiplier = 1;
736
-			} elseif ($multiplier == 0) {
737
-				return array(self::INDEX => $index);
738
-			} else {
739
-				$multiplier = intval($multiplier);
740
-			}
741
-
742
-			while ($index < 0) {
743
-				$index += abs($multiplier);
744
-			}
745
-
746
-			return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
747
-		}
748
-	}
749
-
750
-	/**
751
-	 * Parses a CSS declaration block into property name/value pairs.
752
-	 *
753
-	 * Example:
754
-	 *
755
-	 * The declaration block.
756
-	 *
757
-	 *   "color: #000; font-weight: bold;".
758
-	 *
759
-	 * will be parsed into the following array:
760
-	 *
761
-	 *   "color" => "#000"
762
-	 *   "font-weight" => "bold"
763
-	 *
764
-	 * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
765
-	 *
766
-	 * @return array the CSS declarations with the property names as array keys and the property values as array values
767
-	 */
768
-	private function parseCssDeclarationBlock($cssDeclarationBlock) {
769
-		if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
770
-			return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
771
-		}
772
-
773
-		$properties = array();
774
-		$declarations = explode(';', $cssDeclarationBlock);
775
-		foreach ($declarations as $declaration) {
776
-			$matches = array();
777
-			if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
778
-				continue;
779
-			}
780
-			$propertyName = strtolower($matches[1]);
781
-			$propertyValue = $matches[2];
782
-			$properties[$propertyName] = $propertyValue;
783
-		}
784
-		$this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
785
-
786
-		return $properties;
787
-	}
12
+    /**
13
+     * @var string
14
+     */
15
+    const ENCODING = 'UTF-8';
16
+
17
+    /**
18
+     * @var integer
19
+     */
20
+    const CACHE_KEY_CSS = 0;
21
+
22
+    /**
23
+     * @var integer
24
+     */
25
+    const CACHE_KEY_SELECTOR = 1;
26
+
27
+    /**
28
+     * @var integer
29
+     */
30
+    const CACHE_KEY_XPATH = 2;
31
+
32
+    /**
33
+     * @var integer
34
+     */
35
+    const CACHE_KEY_CSS_DECLARATION_BLOCK = 3;
36
+
37
+    /**
38
+     * for calculating nth-of-type and nth-child selectors.
39
+     *
40
+     * @var integer
41
+     */
42
+    const INDEX = 0;
43
+
44
+    /**
45
+     * for calculating nth-of-type and nth-child selectors.
46
+     *
47
+     * @var integer
48
+     */
49
+    const MULTIPLIER = 1;
50
+
51
+    /**
52
+     * @var string
53
+     */
54
+    const ID_ATTRIBUTE_MATCHER = '/(\\w+)?\\#([\\w\\-]+)/';
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    const CLASS_ATTRIBUTE_MATCHER = '/(\\w+|[\\*\\]])?((\\.[\\w\\-]+)+)/';
60
+
61
+    /**
62
+     * @var string
63
+     */
64
+    private $html = '';
65
+
66
+    /**
67
+     * @var string
68
+     */
69
+    private $css = '';
70
+
71
+    /**
72
+     * @var array<string>
73
+     */
74
+    private $unprocessableHtmlTags = array('wbr');
75
+
76
+    /**
77
+     * @var array<array>
78
+     */
79
+    private $caches = array(
80
+        self::CACHE_KEY_CSS => array(),
81
+        self::CACHE_KEY_SELECTOR => array(),
82
+        self::CACHE_KEY_XPATH => array(),
83
+        self::CACHE_KEY_CSS_DECLARATION_BLOCK => array(),
84
+    );
85
+
86
+    /**
87
+     * the visited nodes with the XPath paths as array keys.
88
+     *
89
+     * @var array<\DOMNode>
90
+     */
91
+    private $visitedNodes = array();
92
+
93
+    /**
94
+     * the styles to apply to the nodes with the XPath paths as array keys for the outer array and the attribute names/values.
95
+     * as key/value pairs for the inner array.
96
+     *
97
+     * @var array<array><string>
98
+     */
99
+    private $styleAttributesForNodes = array();
100
+
101
+    /**
102
+     * This attribute applies to the case where you want to preserve your original text encoding.
103
+     *
104
+     * By default, emogrifier translates your text into HTML entities for two reasons:
105
+     *
106
+     * 1. Because of client incompatibilities, it is better practice to send out HTML entities rather than unicode over email.
107
+     *
108
+     * 2. It translates any illegal XML characters that DOMDocument cannot work with.
109
+     *
110
+     * If you would like to preserve your original encoding, set this attribute to TRUE.
111
+     *
112
+     * @var boolean
113
+     */
114
+    public $preserveEncoding = false;
115
+
116
+    public static $_media = '';
117
+
118
+    /**
119
+     * The constructor.
120
+     *
121
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
122
+     * @param string $css the CSS to merge, must be UTF-8-encoded
123
+     */
124
+    public function __construct($html = '', $css = '') {
125
+        $this->setHtml($html);
126
+        $this->setCss($css);
127
+    }
128
+
129
+    /**
130
+     * The destructor.
131
+     */
132
+    public function __destruct() {
133
+        $this->purgeVisitedNodes();
134
+    }
135
+
136
+    /**
137
+     * Sets the HTML to emogrify.
138
+     *
139
+     * @param string $html the HTML to emogrify, must be UTF-8-encoded
140
+     */
141
+    public function setHtml($html = '') {
142
+        $this->html = $html;
143
+    }
144
+
145
+    /**
146
+     * Sets the CSS to merge with the HTML.
147
+     *
148
+     * @param string $css the CSS to merge, must be UTF-8-encoded
149
+     */
150
+    public function setCss($css = '') {
151
+        $this->css = $css;
152
+    }
153
+
154
+    /**
155
+     * Clears all caches.
156
+     */
157
+    private function clearAllCaches() {
158
+        $this->clearCache(self::CACHE_KEY_CSS);
159
+        $this->clearCache(self::CACHE_KEY_SELECTOR);
160
+        $this->clearCache(self::CACHE_KEY_XPATH);
161
+        $this->clearCache(self::CACHE_KEY_CSS_DECLARATION_BLOCK);
162
+    }
163
+
164
+    /**
165
+     * Clears a single cache by key.
166
+     *
167
+     * @param integer $key the cache key, must be CACHE_KEY_CSS, CACHE_KEY_SELECTOR, CACHE_KEY_XPATH or CACHE_KEY_CSS_DECLARATION_BLOCK
168
+     *
169
+     * @throws InvalidArgumentException
170
+     */
171
+    private function clearCache($key) {
172
+        $allowedCacheKeys = array(self::CACHE_KEY_CSS, self::CACHE_KEY_SELECTOR, self::CACHE_KEY_XPATH, self::CACHE_KEY_CSS_DECLARATION_BLOCK);
173
+        if (!in_array($key, $allowedCacheKeys, true)) {
174
+            throw new InvalidArgumentException('Invalid cache key: ' . $key, 1391822035);
175
+        }
176
+
177
+        $this->caches[$key] = array();
178
+    }
179
+
180
+    /**
181
+     * Purges the visited nodes.
182
+     */
183
+    private function purgeVisitedNodes() {
184
+        $this->visitedNodes = array();
185
+        $this->styleAttributesForNodes = array();
186
+    }
187
+
188
+    /**
189
+     * Marks a tag for removal.
190
+     *
191
+     * There are some HTML tags that DOMDocument cannot process, and it will throw an error if it encounters them.
192
+     * In particular, DOMDocument will complain if you try to use HTML5 tags in an XHTML document.
193
+     *
194
+     * Note: The tags will not be removed if they have any content.
195
+     *
196
+     * @param string $tagName the tag name, e.g., "p"
197
+     */
198
+    public function addUnprocessableHtmlTag($tagName) {
199
+        $this->unprocessableHtmlTags[] = $tagName;
200
+    }
201
+
202
+    /**
203
+     * Drops a tag from the removal list.
204
+     *
205
+     * @param string $tagName the tag name, e.g., "p"
206
+     */
207
+    public function removeUnprocessableHtmlTag($tagName) {
208
+        $key = array_search($tagName, $this->unprocessableHtmlTags, true);
209
+        if ($key !== false) {
210
+            unset($this->unprocessableHtmlTags[$key]);
211
+        }
212
+    }
213
+
214
+    /**
215
+     * Applies the CSS you submit to the HTML you submit.
216
+     *
217
+     * This method places the CSS inline.
218
+     *
219
+     * @return string
220
+     *
221
+     * @throws BadMethodCallException
222
+     */
223
+    public function emogrify() {
224
+        if ($this->html === '') {
225
+            throw new BadMethodCallException('Please set some HTML first before calling emogrify.', 1390393096);
226
+        }
227
+
228
+        $xmlDocument = $this->createXmlDocument();
229
+        $xpath = new DOMXPath($xmlDocument);
230
+        $this->clearAllCaches();
231
+
232
+        // before be begin processing the CSS file, parse the document and normalize all existing CSS attributes (changes 'DISPLAY: none' to 'display: none');
233
+        // we wouldn't have to do this if DOMXPath supported XPath 2.0.
234
+        // also store a reference of nodes with existing inline styles so we don't overwrite them
235
+        $this->purgeVisitedNodes();
236
+
237
+        $nodesWithStyleAttributes = $xpath->query('//*[@style]');
238
+        if ($nodesWithStyleAttributes !== false) {
239
+            /** @var $nodeWithStyleAttribute DOMNode */
240
+            foreach ($nodesWithStyleAttributes as $node) {
241
+                $normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
242
+
243
+                // in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244
+                $nodePath = $node->getNodePath();
245
+                if (!isset($this->styleAttributesForNodes[$nodePath])) {
246
+                    $this->styleAttributesForNodes[$nodePath] = $this->parseCssDeclarationBlock($normalizedOriginalStyle);
247
+                    $this->visitedNodes[$nodePath] = $node;
248
+                }
249
+
250
+                $node->setAttribute('style', $normalizedOriginalStyle);
251
+            }
252
+        }
253
+
254
+        // grab any existing style blocks from the html and append them to the existing CSS
255
+        // (these blocks should be appended so as to have precedence over conflicting styles in the existing CSS)
256
+        $allCss = $this->css;
257
+
258
+        $allCss .= $this->getCssFromAllStyleNodes($xpath);
259
+
260
+        $cssParts = $this->splitCssAndMediaQuery($allCss);
261
+        self::$_media = ''; // reset
262
+
263
+        $cssKey = md5($cssParts['css']);
264
+        if (!isset($this->caches[self::CACHE_KEY_CSS][$cssKey])) {
265
+            // process the CSS file for selectors and definitions
266
+            preg_match_all('/(?:^|[\\s^{}]*)([^{]+){([^}]*)}/mis', $cssParts['css'], $matches, PREG_SET_ORDER);
267
+
268
+            $allSelectors = array();
269
+            foreach ($matches as $key => $selectorString) {
270
+                // if there is a blank definition, skip
271
+                if (!strlen(trim($selectorString[2]))) {
272
+                    continue;
273
+                }
274
+
275
+                // else split by commas and duplicate attributes so we can sort by selector precedence
276
+                $selectors = explode(',', $selectorString[1]);
277
+                foreach ($selectors as $selector) {
278
+                    // don't process pseudo-elements and behavioral (dynamic) pseudo-classes; ONLY allow structural pseudo-classes
279
+                    if (strpos($selector, ':') !== false && !preg_match('/:\\S+\\-(child|type)\\(/i', $selector)) {
280
+                        continue;
281
+                    }
282
+
283
+                    $allSelectors[] = array('selector' => trim($selector),
284
+                                                'attributes' => trim($selectorString[2]),
285
+                                                // keep track of where it appears in the file, since order is important
286
+                                                'line' => $key,
287
+                    );
288
+                }
289
+            }
290
+
291
+            // now sort the selectors by precedence
292
+            usort($allSelectors, array($this,'sortBySelectorPrecedence'));
293
+
294
+            $this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295
+        }
296
+
297
+        foreach ($this->caches[self::CACHE_KEY_CSS][$cssKey] as $value) {
298
+            // query the body for the xpath selector
299
+            $nodesMatchingCssSelectors = $xpath->query($this->translateCssToXpath($value['selector']));
300
+
301
+            /** @var $node \DOMNode */
302
+            foreach ($nodesMatchingCssSelectors as $node) {
303
+                // if it has a style attribute, get it, process it, and append (overwrite) new stuff
304
+                if ($node->hasAttribute('style')) {
305
+                    // break it up into an associative array
306
+                    $oldStyleDeclarations = $this->parseCssDeclarationBlock($node->getAttribute('style'));
307
+                } else {
308
+                    $oldStyleDeclarations = array();
309
+                }
310
+                $newStyleDeclarations = $this->parseCssDeclarationBlock($value['attributes']);
311
+                $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($oldStyleDeclarations, $newStyleDeclarations));
312
+            }
313
+        }
314
+
315
+        // now iterate through the nodes that contained inline styles in the original HTML
316
+        foreach ($this->styleAttributesForNodes as $nodePath => $styleAttributesForNode) {
317
+            $node = $this->visitedNodes[$nodePath];
318
+            $currentStyleAttributes = $this->parseCssDeclarationBlock($node->getAttribute('style'));
319
+            $node->setAttribute('style', $this->generateStyleStringFromDeclarationsArrays($currentStyleAttributes, $styleAttributesForNode));
320
+        }
321
+
322
+        // This removes styles from your email that contain display:none.
323
+        // We need to look for display:none, but we need to do a case-insensitive search. Since DOMDocument only supports XPath 1.0,
324
+        // lower-case() isn't available to us. We've thus far only set attributes to lowercase, not attribute values. Consequently, we need
325
+        // to translate() the letters that would be in 'NONE' ("NOE") to lowercase.
326
+        $nodesWithStyleDisplayNone = $xpath->query('//*[contains(translate(translate(@style," ",""),"NOE","noe"),"display:none")]');
327
+        // The checks on parentNode and is_callable below ensure that if we've deleted the parent node,
328
+        // we don't try to call removeChild on a nonexistent child node
329
+        if ($nodesWithStyleDisplayNone->length > 0) {
330
+            /** @var $node \DOMNode */
331
+            foreach ($nodesWithStyleDisplayNone as $node) {
332
+                if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
333
+                    $node->parentNode->removeChild($node);
334
+                }
335
+            }
336
+        }
337
+
338
+        $this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339
+
340
+        if ($this->preserveEncoding) {
341
+            if ( function_exists( 'mb_convert_encoding' ) ) {
342
+                return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
343
+            } else {
344
+                return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
345
+            }
346
+        } else {
347
+            return $xmlDocument->saveHTML();
348
+        }
349
+    }
350
+
351
+    public function strtolower(array $m) {
352
+        return strtolower($m[0]);
353
+    }
354
+
355
+
356
+    /**
357
+     * This method merges old or existing name/value array with new name/value array.
358
+     * and then generates a string of the combined style suitable for placing inline.
359
+     * This becomes the single point for CSS string generation allowing for consistent.
360
+     * CSS output no matter where the CSS originally came from.
361
+     * @param array $oldStyles
362
+     * @param array $newStyles
363
+     * @return string
364
+     */
365
+    private function generateStyleStringFromDeclarationsArrays(array $oldStyles, array $newStyles) {
366
+        $combinedStyles = array_merge($oldStyles, $newStyles);
367
+        $style = '';
368
+        foreach ($combinedStyles as $attributeName => $attributeValue) {
369
+            $style .= (strtolower(trim($attributeName)) . ': ' . trim($attributeValue) . '; ');
370
+        }
371
+        return trim($style);
372
+    }
373
+
374
+
375
+    /**
376
+     * Copies the media part from CSS array parts to $xmlDocument.
377
+     *
378
+     * @param array $cssParts
379
+     * @param DOMDocument $xmlDocument
380
+     */
381
+    public function copyCssWithMediaToStyleNode(array $cssParts, DOMDocument $xmlDocument) {
382
+        if (isset($cssParts['media']) && $cssParts['media'] !== '') {
383
+            $this->addStyleElementToDocument($xmlDocument, $cssParts['media']);
384
+        }
385
+    }
386
+
387
+    /**
388
+     * Returns CSS content.
389
+     *
390
+     * @param DOMXPath $xpath
391
+     * @return string
392
+     */
393
+    private function getCssFromAllStyleNodes(DOMXPath $xpath) {
394
+        $styleNodes = $xpath->query('//style');
395
+
396
+        if ($styleNodes === false) {
397
+            return '';
398
+        }
399
+
400
+        $css = '';
401
+        /** @var $styleNode DOMNode */
402
+        foreach ($styleNodes as $styleNode) {
403
+            $css .= "\n\n" . $styleNode->nodeValue;
404
+            $styleNode->parentNode->removeChild($styleNode);
405
+        }
406
+
407
+        return $css;
408
+    }
409
+
410
+    /**
411
+     * Adds a style element with $css to $document.
412
+     *
413
+     * @param DOMDocument $document
414
+     * @param string $css
415
+     */
416
+    private function addStyleElementToDocument(DOMDocument $document, $css) {
417
+        $styleElement = $document->createElement('style', $css);
418
+        $styleAttribute = $document->createAttribute('type');
419
+        $styleAttribute->value = 'text/css';
420
+        $styleElement->appendChild($styleAttribute);
421
+
422
+        $head = $this->getOrCreateHeadElement($document);
423
+        $head->appendChild($styleElement);
424
+    }
425
+
426
+    /**
427
+     * Returns the existing or creates a new head element in $document.
428
+     *
429
+     * @param DOMDocument $document
430
+     * @return DOMNode the head element
431
+     */
432
+    private function getOrCreateHeadElement(DOMDocument $document) {
433
+        $head = $document->getElementsByTagName('head')->item(0);
434
+
435
+        if ($head === null) {
436
+            $head = $document->createElement('head');
437
+            $html = $document->getElementsByTagName('html')->item(0);
438
+            $html->insertBefore($head, $document->getElementsByTagName('body')->item(0));
439
+        }
440
+
441
+        return $head;
442
+    }
443
+
444
+    /**
445
+     * Splits input CSS code to an array where:
446
+     *
447
+     * - key "css" will be contains clean CSS code.
448
+     * - key "media" will be contains all valuable media queries.
449
+     *
450
+     * Example:
451
+     *
452
+     * The CSS code.
453
+     *
454
+     *   "@import "file.css"; h1 { color:red; } @media { h1 {}} @media tv { h1 {}}"
455
+     *
456
+     * will be parsed into the following array:
457
+     *
458
+     *   "css" => "h1 { color:red; }"
459
+     *   "media" => "@media { h1 {}}"
460
+     *
461
+     * @param string $css
462
+     * @return array
463
+     */
464
+    private function splitCssAndMediaQuery($css) {
465
+        $css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
466
+
467
+        // filter the CSS
468
+        $search = array(
469
+            // get rid of css comment code
470
+            '/\\/\\*.*\\*\\//sU',
471
+            // strip out any import directives
472
+            '/^\\s*@import\\s[^;]+;/misU',
473
+            // strip remains media enclosures
474
+            '/^\\s*@media\\s[^{]+{(.*)}\\s*}\\s/misU',
475
+        );
476
+
477
+        $replace = array(
478
+            '',
479
+            '',
480
+            '',
481
+        );
482
+
483
+        // clean CSS before output
484
+        $css = preg_replace($search, $replace, $css);
485
+
486
+        return array('css' => $css, 'media' => self::$_media);
487
+    }
488
+
489
+    private function _media_concat( $matches ) {
490
+        self::$_media .= $matches[0];
491
+    }
492
+
493
+    /**
494
+     * Creates a DOMDocument instance with the current HTML.
495
+     *
496
+     * @return DOMDocument
497
+     */
498
+    private function createXmlDocument() {
499
+        $xmlDocument = new DOMDocument;
500
+        $xmlDocument->encoding = self::ENCODING;
501
+        $xmlDocument->strictErrorChecking = false;
502
+        $xmlDocument->formatOutput = true;
503
+        $libXmlState = libxml_use_internal_errors(true);
504
+        $xmlDocument->loadHTML($this->getUnifiedHtml());
505
+        libxml_clear_errors();
506
+        libxml_use_internal_errors($libXmlState);
507
+        $xmlDocument->normalizeDocument();
508
+
509
+        return $xmlDocument;
510
+    }
511
+
512
+    /**
513
+     * Returns the HTML with the non-ASCII characters converts into HTML entities and the unprocessable HTML tags removed.
514
+     *
515
+     * @return string the unified HTML
516
+     *
517
+     * @throws BadMethodCallException
518
+     */
519
+    private function getUnifiedHtml() {
520
+        if (!empty($this->unprocessableHtmlTags)) {
521
+            $unprocessableHtmlTags = implode('|', $this->unprocessableHtmlTags);
522
+            $bodyWithoutUnprocessableTags = preg_replace('/<\\/?(' . $unprocessableHtmlTags . ')[^>]*>/i', '', $this->html);
523
+        } else {
524
+            $bodyWithoutUnprocessableTags = $this->html;
525
+        }
526
+
527
+        if ( function_exists( 'mb_convert_encoding' ) ) {
528
+            return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
529
+        } else {
530
+            return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
531
+        }
532
+    }
533
+
534
+    /**
535
+     * @param array $a
536
+     * @param array $b
537
+     *
538
+     * @return integer
539
+     */
540
+    private function sortBySelectorPrecedence(array $a, array $b) {
541
+        $precedenceA = $this->getCssSelectorPrecedence($a['selector']);
542
+        $precedenceB = $this->getCssSelectorPrecedence($b['selector']);
543
+
544
+        // We want these sorted in ascending order so selectors with lesser precedence get processed first and
545
+        // selectors with greater precedence get sorted last.
546
+        // The parenthesis around the -1 are necessary to avoid a PHP_CodeSniffer warning about missing spaces around
547
+        // arithmetic operators.
548
+        // @see http://forge.typo3.org/issues/55605
549
+        $precedenceForEquals = ($a['line'] < $b['line'] ? (-1) : 1);
550
+        $precedenceForNotEquals = ($precedenceA < $precedenceB ? (-1) : 1);
551
+        return ($precedenceA === $precedenceB) ? $precedenceForEquals : $precedenceForNotEquals;
552
+    }
553
+
554
+    /**
555
+     * @param string $selector
556
+     *
557
+     * @return integer
558
+     */
559
+    private function getCssSelectorPrecedence($selector) {
560
+        $selectorKey = md5($selector);
561
+        if (!isset($this->caches[self::CACHE_KEY_SELECTOR][$selectorKey])) {
562
+            $precedence = 0;
563
+            $value = 100;
564
+            // ids: worth 100, classes: worth 10, elements: worth 1
565
+            $search = array('\\#','\\.','');
566
+
567
+            foreach ($search as $s) {
568
+                if (trim($selector == '')) {
569
+                    break;
570
+                }
571
+                $number = 0;
572
+                $selector = preg_replace('/' . $s . '\\w+/', '', $selector, -1, $number);
573
+                $precedence += ($value * $number);
574
+                $value /= 10;
575
+            }
576
+            $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey] = $precedence;
577
+        }
578
+
579
+        return $this->caches[self::CACHE_KEY_SELECTOR][$selectorKey];
580
+    }
581
+
582
+    /**
583
+     * Right now, we support all CSS 1 selectors and most CSS2/3 selectors.
584
+     *
585
+     * @see http://plasmasturm.org/log/444/
586
+     *
587
+     * @param string $paramCssSelector
588
+     *
589
+     * @return string
590
+     */
591
+    private function translateCssToXpath($paramCssSelector) {
592
+        $cssSelector = ' ' . $paramCssSelector . ' ';
593
+        $cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
594
+        $cssSelector = trim($cssSelector);
595
+        $xpathKey = md5($cssSelector);
596
+        if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
597
+            // returns an Xpath selector
598
+            $search = array(
599
+                // Matches any element that is a child of parent.
600
+                '/\\s+>\\s+/',
601
+                // Matches any element that is an adjacent sibling.
602
+                '/\\s+\\+\\s+/',
603
+                // Matches any element that is a descendant of an parent element element.
604
+                '/\\s+/',
605
+                // first-child pseudo-selector
606
+                '/([^\\/]+):first-child/i',
607
+                // last-child pseudo-selector
608
+                '/([^\\/]+):last-child/i',
609
+                // Matches attribute only selector
610
+                '/^\\[(\\w+)\\]/',
611
+                // Matches element with attribute
612
+                '/(\\w)\\[(\\w+)\\]/',
613
+                // Matches element with EXACT attribute
614
+                '/(\\w)\\[(\\w+)\\=[\'"]?(\\w+)[\'"]?\\]/',
615
+            );
616
+            $replace = array(
617
+                '/',
618
+                '/following-sibling::*[1]/self::',
619
+                '//',
620
+                '*[1]/self::\\1',
621
+                '*[last()]/self::\\1',
622
+                '*[@\\1]',
623
+                '\\1[@\\2]',
624
+                '\\1[@\\2="\\3"]',
625
+            );
626
+
627
+            $cssSelector = '//' . preg_replace($search, $replace, $cssSelector);
628
+
629
+            $cssSelector = preg_replace_callback(self::ID_ATTRIBUTE_MATCHER, array($this, 'matchIdAttributes'), $cssSelector);
630
+            $cssSelector = preg_replace_callback(self::CLASS_ATTRIBUTE_MATCHER, array($this, 'matchClassAttributes'), $cssSelector);
631
+
632
+            // Advanced selectors are going to require a bit more advanced emogrification.
633
+            // When we required PHP 5.3, we could do this with closures.
634
+            $cssSelector = preg_replace_callback(
635
+                '/([^\\/]+):nth-child\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
636
+                array($this, 'translateNthChild'), $cssSelector
637
+            );
638
+            $cssSelector = preg_replace_callback(
639
+                '/([^\\/]+):nth-of-type\\(\s*(odd|even|[+\-]?\\d|[+\\-]?\\d?n(\\s*[+\\-]\\s*\\d)?)\\s*\\)/i',
640
+                array($this, 'translateNthOfType'), $cssSelector
641
+            );
642
+
643
+            $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey] = $cssSelector;
644
+        }
645
+        return $this->caches[self::CACHE_KEY_SELECTOR][$xpathKey];
646
+    }
647
+
648
+    /**
649
+     * @param array $match
650
+     *
651
+     * @return string
652
+     */
653
+    private function matchIdAttributes(array $match) {
654
+        return (strlen($match[1]) ? $match[1] : '*') . '[@id="' . $match[2] . '"]';
655
+    }
656
+
657
+    /**
658
+     * @param array $match
659
+     *
660
+     * @return string
661
+     */
662
+    private function matchClassAttributes(array $match) {
663
+        return (strlen($match[1]) ? $match[1] : '*') . '[contains(concat(" ",@class," "),concat(" ","' .
664
+            implode(
665
+                '"," "))][contains(concat(" ",@class," "),concat(" ","',
666
+                explode('.', substr($match[2], 1))
667
+            ) . '"," "))]';
668
+    }
669
+
670
+    /**
671
+     * @param array $match
672
+     *
673
+     * @return string
674
+     */
675
+    private function translateNthChild(array $match) {
676
+        $result = $this->parseNth($match);
677
+
678
+        if (isset($result[self::MULTIPLIER])) {
679
+            if ($result[self::MULTIPLIER] < 0) {
680
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
681
+                return sprintf('*[(last() - position()) mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
682
+            } else {
683
+                return sprintf('*[position() mod %u = %u]/self::%s', $result[self::MULTIPLIER], $result[self::INDEX], $match[1]);
684
+            }
685
+        } else {
686
+            return sprintf('*[%u]/self::%s', $result[self::INDEX], $match[1]);
687
+        }
688
+    }
689
+
690
+    /**
691
+     * @param array $match
692
+     *
693
+     * @return string
694
+     */
695
+    private function translateNthOfType(array $match) {
696
+        $result = $this->parseNth($match);
697
+
698
+        if (isset($result[self::MULTIPLIER])) {
699
+            if ($result[self::MULTIPLIER] < 0) {
700
+                $result[self::MULTIPLIER] = abs($result[self::MULTIPLIER]);
701
+                return sprintf('%s[(last() - position()) mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
702
+            } else {
703
+                return sprintf('%s[position() mod %u = %u]', $match[1], $result[self::MULTIPLIER], $result[self::INDEX]);
704
+            }
705
+        } else {
706
+            return sprintf('%s[%u]', $match[1], $result[self::INDEX]);
707
+        }
708
+    }
709
+
710
+    /**
711
+     * @param array $match
712
+     *
713
+     * @return array
714
+     */
715
+    private function parseNth(array $match) {
716
+        if (in_array(strtolower($match[2]), array('even','odd'))) {
717
+            $index = strtolower($match[2]) == 'even' ? 0 : 1;
718
+            return array(self::MULTIPLIER => 2, self::INDEX => $index);
719
+        } elseif (stripos($match[2], 'n') === false) {
720
+            // if there is a multiplier
721
+            $index = intval(str_replace(' ', '', $match[2]));
722
+            return array(self::INDEX => $index);
723
+        } else {
724
+            if (isset($match[3])) {
725
+                $multipleTerm = str_replace($match[3], '', $match[2]);
726
+                $index = intval(str_replace(' ', '', $match[3]));
727
+            } else {
728
+                $multipleTerm = $match[2];
729
+                $index = 0;
730
+            }
731
+
732
+            $multiplier = str_ireplace('n', '', $multipleTerm);
733
+
734
+            if (!strlen($multiplier)) {
735
+                $multiplier = 1;
736
+            } elseif ($multiplier == 0) {
737
+                return array(self::INDEX => $index);
738
+            } else {
739
+                $multiplier = intval($multiplier);
740
+            }
741
+
742
+            while ($index < 0) {
743
+                $index += abs($multiplier);
744
+            }
745
+
746
+            return array(self::MULTIPLIER => $multiplier, self::INDEX => $index);
747
+        }
748
+    }
749
+
750
+    /**
751
+     * Parses a CSS declaration block into property name/value pairs.
752
+     *
753
+     * Example:
754
+     *
755
+     * The declaration block.
756
+     *
757
+     *   "color: #000; font-weight: bold;".
758
+     *
759
+     * will be parsed into the following array:
760
+     *
761
+     *   "color" => "#000"
762
+     *   "font-weight" => "bold"
763
+     *
764
+     * @param string $cssDeclarationBlock the CSS declaration block without the curly braces, may be empty
765
+     *
766
+     * @return array the CSS declarations with the property names as array keys and the property values as array values
767
+     */
768
+    private function parseCssDeclarationBlock($cssDeclarationBlock) {
769
+        if (isset($this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock])) {
770
+            return $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock];
771
+        }
772
+
773
+        $properties = array();
774
+        $declarations = explode(';', $cssDeclarationBlock);
775
+        foreach ($declarations as $declaration) {
776
+            $matches = array();
777
+            if (!preg_match('/ *([A-Za-z\\-]+) *: *([^;]+) */', $declaration, $matches)) {
778
+                continue;
779
+            }
780
+            $propertyName = strtolower($matches[1]);
781
+            $propertyValue = $matches[2];
782
+            $properties[$propertyName] = $propertyValue;
783
+        }
784
+        $this->caches[self::CACHE_KEY_CSS_DECLARATION_BLOCK][$cssDeclarationBlock] = $properties;
785
+
786
+        return $properties;
787
+    }
788 788
 }
Please login to merge, or discard this patch.
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -238,7 +238,7 @@  discard block
 block discarded – undo
238 238
 		if ($nodesWithStyleAttributes !== false) {
239 239
 			/** @var $nodeWithStyleAttribute DOMNode */
240 240
 			foreach ($nodesWithStyleAttributes as $node) {
241
-				$normalizedOriginalStyle = preg_replace_callback( '/[A-z\\-]+(?=\\:)/S', array( $this, 'strtolower' ), $node->getAttribute('style') );
241
+				$normalizedOriginalStyle = preg_replace_callback('/[A-z\\-]+(?=\\:)/S', array($this, 'strtolower'), $node->getAttribute('style'));
242 242
 
243 243
 				// in order to not overwrite existing style attributes in the HTML, we have to save the original HTML styles
244 244
 				$nodePath = $node->getNodePath();
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 			}
290 290
 
291 291
 			// now sort the selectors by precedence
292
-			usort($allSelectors, array($this,'sortBySelectorPrecedence'));
292
+			usort($allSelectors, array($this, 'sortBySelectorPrecedence'));
293 293
 
294 294
 			$this->caches[self::CACHE_KEY_CSS][$cssKey] = $allSelectors;
295 295
 		}
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
 		if ($nodesWithStyleDisplayNone->length > 0) {
330 330
 			/** @var $node \DOMNode */
331 331
 			foreach ($nodesWithStyleDisplayNone as $node) {
332
-				if ($node->parentNode && is_callable(array($node->parentNode,'removeChild'))) {
332
+				if ($node->parentNode && is_callable(array($node->parentNode, 'removeChild'))) {
333 333
 					$node->parentNode->removeChild($node);
334 334
 				}
335 335
 			}
@@ -338,10 +338,10 @@  discard block
 block discarded – undo
338 338
 		$this->copyCssWithMediaToStyleNode($cssParts, $xmlDocument);
339 339
 
340 340
 		if ($this->preserveEncoding) {
341
-			if ( function_exists( 'mb_convert_encoding' ) ) {
342
-				return mb_convert_encoding( $xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES' );
341
+			if (function_exists('mb_convert_encoding')) {
342
+				return mb_convert_encoding($xmlDocument->saveHTML(), self::ENCODING, 'HTML-ENTITIES');
343 343
 			} else {
344
-				return htmlspecialchars_decode( utf8_encode( html_entity_decode( $xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING ) ) );
344
+				return htmlspecialchars_decode(utf8_encode(html_entity_decode($xmlDocument->saveHTML(), ENT_COMPAT, self::ENCODING)));
345 345
 			}
346 346
 		} else {
347 347
 			return $xmlDocument->saveHTML();
@@ -462,7 +462,7 @@  discard block
 block discarded – undo
462 462
 	 * @return array
463 463
 	 */
464 464
 	private function splitCssAndMediaQuery($css) {
465
-		$css = preg_replace_callback( '#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array( $this, '_media_concat' ), $css );
465
+		$css = preg_replace_callback('#@media\\s+(?:only\\s)?(?:[\\s{\(]|screen|all)\\s?[^{]+{.*}\\s*}\\s*#misU', array($this, '_media_concat'), $css);
466 466
 
467 467
 		// filter the CSS
468 468
 		$search = array(
@@ -486,7 +486,7 @@  discard block
 block discarded – undo
486 486
 		return array('css' => $css, 'media' => self::$_media);
487 487
 	}
488 488
 
489
-	private function _media_concat( $matches ) {
489
+	private function _media_concat($matches) {
490 490
 		self::$_media .= $matches[0];
491 491
 	}
492 492
 
@@ -524,10 +524,10 @@  discard block
 block discarded – undo
524 524
 			$bodyWithoutUnprocessableTags = $this->html;
525 525
 		}
526 526
 
527
-		if ( function_exists( 'mb_convert_encoding' ) ) {
528
-			return mb_convert_encoding( $bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING );
527
+		if (function_exists('mb_convert_encoding')) {
528
+			return mb_convert_encoding($bodyWithoutUnprocessableTags, 'HTML-ENTITIES', self::ENCODING);
529 529
 		} else {
530
-			return htmlspecialchars_decode( utf8_decode( htmlentities( $bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false ) ) );
530
+			return htmlspecialchars_decode(utf8_decode(htmlentities($bodyWithoutUnprocessableTags, ENT_COMPAT, self::ENCODING, false)));
531 531
 		}
532 532
 	}
533 533
 
@@ -562,7 +562,7 @@  discard block
 block discarded – undo
562 562
 			$precedence = 0;
563 563
 			$value = 100;
564 564
 			// ids: worth 100, classes: worth 10, elements: worth 1
565
-			$search = array('\\#','\\.','');
565
+			$search = array('\\#', '\\.', '');
566 566
 
567 567
 			foreach ($search as $s) {
568 568
 				if (trim($selector == '')) {
@@ -590,7 +590,7 @@  discard block
 block discarded – undo
590 590
 	 */
591 591
 	private function translateCssToXpath($paramCssSelector) {
592 592
 		$cssSelector = ' ' . $paramCssSelector . ' ';
593
-		$cssSelector = preg_replace_callback( '/\s+\w+\s+/', array( $this, 'strtolower' ), $cssSelector );
593
+		$cssSelector = preg_replace_callback('/\s+\w+\s+/', array($this, 'strtolower'), $cssSelector);
594 594
 		$cssSelector = trim($cssSelector);
595 595
 		$xpathKey = md5($cssSelector);
596 596
 		if (!isset($this->caches[self::CACHE_KEY_XPATH][$xpathKey])) {
@@ -713,7 +713,7 @@  discard block
 block discarded – undo
713 713
 	 * @return array
714 714
 	 */
715 715
 	private function parseNth(array $match) {
716
-		if (in_array(strtolower($match[2]), array('even','odd'))) {
716
+		if (in_array(strtolower($match[2]), array('even', 'odd'))) {
717 717
 			$index = strtolower($match[2]) == 'even' ? 0 : 1;
718 718
 			return array(self::MULTIPLIER => 2, self::INDEX => $index);
719 719
 		} elseif (stripos($match[2], 'n') === false) {
Please login to merge, or discard this patch.
templates/emails/wpinv-email-user_note.php 2 patches
Braces   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,7 +1,8 @@
 block discarded – undo
1 1
 <?php
2 2
 // don't load directly
3
-if ( !defined('ABSPATH') )
3
+if ( !defined('ABSPATH') ) {
4 4
     die('-1');
5
+}
5 6
 
6 7
 do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
7 8
 
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -1,22 +1,22 @@
 block discarded – undo
1 1
 <?php
2 2
 // don't load directly
3
-if ( !defined('ABSPATH') )
3
+if (!defined('ABSPATH'))
4 4
     die('-1');
5 5
 
6
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
6
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
7 7
 
8
-do_action( 'wpinv_email_before_note_details', $invoice, $email_type, $sent_to_admin, $customer_note );
8
+do_action('wpinv_email_before_note_details', $invoice, $email_type, $sent_to_admin, $customer_note);
9 9
 
10
-if ( ! empty( $message_body ) ) {
11
-    echo wpautop( wptexturize( $message_body ) );
10
+if (!empty($message_body)) {
11
+    echo wpautop(wptexturize($message_body));
12 12
 }
13 13
 
14
-do_action( 'wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin );
14
+do_action('wpinv_email_invoice_details', $invoice, $email_type, $sent_to_admin);
15 15
 
16
-do_action( 'wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin );
16
+do_action('wpinv_email_invoice_items', $invoice, $email_type, $sent_to_admin);
17 17
 
18
-do_action( 'wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin );
18
+do_action('wpinv_email_billing_details', $invoice, $email_type, $sent_to_admin);
19 19
 
20
-do_action( 'wpinv_email_after_note_details', $invoice, $email_type, $sent_to_admin, $customer_note );
20
+do_action('wpinv_email_after_note_details', $invoice, $email_type, $sent_to_admin, $customer_note);
21 21
 
22
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
23 22
\ No newline at end of file
23
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
24 24
\ No newline at end of file
Please login to merge, or discard this patch.
templates/emails/wpinv-email-overdue.php 2 patches
Braces   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,7 +1,8 @@
 block discarded – undo
1 1
 <?php
2 2
 // don't load directly
3
-if ( !defined('ABSPATH') )
3
+if ( !defined('ABSPATH') ) {
4 4
     die('-1');
5
+}
5 6
 
6 7
 do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
7 8
 
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,12 +1,12 @@
 block discarded – undo
1 1
 <?php
2 2
 // don't load directly
3
-if ( !defined('ABSPATH') )
3
+if (!defined('ABSPATH'))
4 4
     die('-1');
5 5
 
6
-do_action( 'wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin );
6
+do_action('wpinv_email_header', $email_heading, $invoice, $email_type, $sent_to_admin);
7 7
 
8
-if ( ! empty( $message_body ) ) {
9
-    echo wpautop( wptexturize( $message_body ) );
8
+if (!empty($message_body)) {
9
+    echo wpautop(wptexturize($message_body));
10 10
 }
11 11
 
12
-do_action( 'wpinv_email_footer', $invoice, $email_type, $sent_to_admin );
13 12
\ No newline at end of file
13
+do_action('wpinv_email_footer', $invoice, $email_type, $sent_to_admin);
14 14
\ No newline at end of file
Please login to merge, or discard this patch.
templates/wpinv-invalid-access.php 1 patch
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -1,56 +1,56 @@
 block discarded – undo
1 1
 <?php 
2
-if ( !defined('ABSPATH') ) {
2
+if (!defined('ABSPATH')) {
3 3
     exit;
4 4
 }
5
-do_action( 'wpinv_invalid_invoice_before_display' ); ?><!DOCTYPE html>
5
+do_action('wpinv_invalid_invoice_before_display'); ?><!DOCTYPE html>
6 6
 <html <?php language_attributes(); ?>>
7 7
 <head>
8 8
     <meta charset="UTF-8">
9 9
     <title><?php wp_title() ?></title>
10
-    <meta charset="<?php bloginfo( 'charset' ); ?>" />
10
+    <meta charset="<?php bloginfo('charset'); ?>" />
11 11
     <meta name="viewport" content="width=device-width,initial-scale=1">
12 12
     <meta name="robots" content="noindex,nofollow">
13
-    <?php do_action( 'wpinv_invalid_invoice_head' ); ?>
13
+    <?php do_action('wpinv_invalid_invoice_head'); ?>
14 14
 </head>
15 15
 <body class="body wpinv wpinv-print wpinv-invalid-invoice">
16
-    <?php do_action( 'wpinv_invalid_invoice_body_start' ); ?>
16
+    <?php do_action('wpinv_invalid_invoice_body_start'); ?>
17 17
     <div class="container wpinv-wrap">
18 18
         <!-- ///// Start Header -->
19 19
         <htmlpageheader name="wpinv-pdf-header">
20
-            <?php do_action( 'wpinv_invalid_invoice_before_header' ); ?>
20
+            <?php do_action('wpinv_invalid_invoice_before_header'); ?>
21 21
             <div class="row wpinv-header">
22 22
                 <div class="col-xs-12 wpinv-business">
23
-                    <a target="_blank" href="<?php echo esc_url( wpinv_get_business_website() ); ?>">
24
-                        <?php if ( $logo = wpinv_get_business_logo() ) { ?>
25
-                        <img class="logo" src="<?php echo esc_url( $logo ); ?>">
23
+                    <a target="_blank" href="<?php echo esc_url(wpinv_get_business_website()); ?>">
24
+                        <?php if ($logo = wpinv_get_business_logo()) { ?>
25
+                        <img class="logo" src="<?php echo esc_url($logo); ?>">
26 26
                         <?php } else { ?>
27
-                        <h1><?php echo esc_html( wpinv_get_business_name() ); ?></h1>
27
+                        <h1><?php echo esc_html(wpinv_get_business_name()); ?></h1>
28 28
                         <?php } ?>
29 29
                     </a>
30 30
                 </div>
31 31
             </div>
32
-            <?php do_action( 'wpinv_invalid_invoice_after_header' ); ?>
32
+            <?php do_action('wpinv_invalid_invoice_after_header'); ?>
33 33
         </htmlpageheader>
34 34
         <!-- End Header ///// -->
35 35
         
36
-        <?php do_action( 'wpinv_invalid_invoice_before_content' ); ?>
36
+        <?php do_action('wpinv_invalid_invoice_before_content'); ?>
37 37
 
38
-        <?php do_action( 'wpinv_invalid_invoice_content' ); ?>
38
+        <?php do_action('wpinv_invalid_invoice_content'); ?>
39 39
         
40
-        <?php do_action( 'wpinv_invalid_invoice_after_content' ); ?>
40
+        <?php do_action('wpinv_invalid_invoice_after_content'); ?>
41 41
         
42 42
         <!-- ///// Start Footer -->
43 43
         <htmlpagefooter name="wpinv-pdf-footer">
44
-            <?php do_action( 'wpinv_invalid_invoice_before_footer' ); ?>
44
+            <?php do_action('wpinv_invalid_invoice_before_footer'); ?>
45 45
             <div class="row wpinv-footer">
46 46
                 <div class="col-sm-12">
47 47
                     <div class="footer-text"><?php echo wpinv_get_business_footer(); ?></div>
48 48
                 </div>
49 49
             </div>
50
-            <?php do_action( 'wpinv_invalid_invoice_after_footer' ); ?>
50
+            <?php do_action('wpinv_invalid_invoice_after_footer'); ?>
51 51
         </htmlpagefooter>
52 52
         <!-- End Footer ///// -->
53 53
     </div>
54
-    <?php do_action( 'wpinv_invalid_invoice_body_end' ); ?>
54
+    <?php do_action('wpinv_invalid_invoice_body_end'); ?>
55 55
 </body>
56 56
 </html>
57 57
\ No newline at end of file
Please login to merge, or discard this patch.
includes/class-wpinv-subscriptions-db.php 2 patches
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,6 +1,8 @@
 block discarded – undo
1 1
 <?php
2 2
 // Exit if accessed directly.
3
-if (!defined( 'ABSPATH' ) ) exit;
3
+if (!defined( 'ABSPATH' ) ) {
4
+    exit;
5
+}
4 6
 
5 7
 /**
6 8
  * The Subscriptions DB Class
Please login to merge, or discard this patch.
Spacing   +154 added lines, -154 removed lines patch added patch discarded remove patch
@@ -1,6 +1,6 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 // Exit if accessed directly.
3
-if (!defined( 'ABSPATH' ) ) exit;
3
+if (!defined('ABSPATH')) exit;
4 4
 
5 5
 /**
6 6
  * The Subscriptions DB Class
@@ -68,8 +68,8 @@  discard block
 block discarded – undo
68 68
             'transaction_id'    => '',
69 69
             'parent_payment_id' => 0,
70 70
             'product_id'        => 0,
71
-            'created'           => date( 'Y-m-d H:i:s' ),
72
-            'expiration'        => date( 'Y-m-d H:i:s' ),
71
+            'created'           => date('Y-m-d H:i:s'),
72
+            'expiration'        => date('Y-m-d H:i:s'),
73 73
             'trial_period'      => '',
74 74
             'status'            => '',
75 75
             'profile_id'        => '',
@@ -82,11 +82,11 @@  discard block
 block discarded – undo
82 82
      * @access  public
83 83
      * @since   1.0.0
84 84
      */
85
-    public function get_subscriptions( $args = array() ) {
85
+    public function get_subscriptions($args = array()) {
86 86
         global $wpdb;
87 87
 
88 88
         $defaults = array(
89
-            'number'       => get_option( 'posts_per_page' ),
89
+            'number'       => get_option('posts_per_page'),
90 90
             'offset'       => 0,
91 91
             'search'       => '',
92 92
             'customer_id'  => 0,
@@ -94,21 +94,21 @@  discard block
 block discarded – undo
94 94
             'order'        => 'DESC'
95 95
         );
96 96
 
97
-        $args  = wp_parse_args( $args, $defaults );
97
+        $args = wp_parse_args($args, $defaults);
98 98
 
99
-        if( $args['number'] < 1 ) {
99
+        if ($args['number'] < 1) {
100 100
             $args['number'] = 999999999999;
101 101
         }
102 102
 
103 103
         $where = ' WHERE 1=1 ';
104 104
 
105 105
         // specific customers
106
-        if( ! empty( $args['id'] ) ) {
106
+        if (!empty($args['id'])) {
107 107
 
108
-            if( is_array( $args['id'] ) ) {
109
-                $ids = implode( ',', array_map('intval', $args['id'] ) );
108
+            if (is_array($args['id'])) {
109
+                $ids = implode(',', array_map('intval', $args['id']));
110 110
             } else {
111
-                $ids = intval( $args['id'] );
111
+                $ids = intval($args['id']);
112 112
             }
113 113
 
114 114
             $where .= " AND `id` IN( {$ids} ) ";
@@ -116,12 +116,12 @@  discard block
 block discarded – undo
116 116
         }
117 117
 
118 118
         // Specific products
119
-        if( ! empty( $args['product_id'] ) ) {
119
+        if (!empty($args['product_id'])) {
120 120
 
121
-            if( is_array( $args['product_id'] ) ) {
122
-                $product_ids = implode( ',', array_map('intval', $args['product_id'] ) );
121
+            if (is_array($args['product_id'])) {
122
+                $product_ids = implode(',', array_map('intval', $args['product_id']));
123 123
             } else {
124
-                $product_ids = intval( $args['product_id'] );
124
+                $product_ids = intval($args['product_id']);
125 125
             }
126 126
 
127 127
             $where .= " AND `product_id` IN( {$product_ids} ) ";
@@ -129,12 +129,12 @@  discard block
 block discarded – undo
129 129
         }
130 130
 
131 131
         // Specific parent payments
132
-        if( ! empty( $args['parent_payment_id'] ) ) {
132
+        if (!empty($args['parent_payment_id'])) {
133 133
 
134
-            if( is_array( $args['parent_payment_id'] ) ) {
135
-                $parent_payment_ids = implode( ',', array_map('intval', $args['parent_payment_id'] ) );
134
+            if (is_array($args['parent_payment_id'])) {
135
+                $parent_payment_ids = implode(',', array_map('intval', $args['parent_payment_id']));
136 136
             } else {
137
-                $parent_payment_ids = intval( $args['parent_payment_id'] );
137
+                $parent_payment_ids = intval($args['parent_payment_id']);
138 138
             }
139 139
 
140 140
             $where .= " AND `parent_payment_id` IN( {$parent_payment_ids} ) ";
@@ -142,12 +142,12 @@  discard block
 block discarded – undo
142 142
         }
143 143
 
144 144
         // Specific transaction IDs
145
-        if( ! empty( $args['transaction_id'] ) ) {
145
+        if (!empty($args['transaction_id'])) {
146 146
 
147
-            if( is_array( $args['transaction_id'] ) ) {
148
-                $transaction_ids = implode( "','", array_map('sanitize_text_field', $args['transaction_id'] ) );
147
+            if (is_array($args['transaction_id'])) {
148
+                $transaction_ids = implode("','", array_map('sanitize_text_field', $args['transaction_id']));
149 149
             } else {
150
-                $transaction_ids = sanitize_text_field( $args['transaction_id'] );
150
+                $transaction_ids = sanitize_text_field($args['transaction_id']);
151 151
             }
152 152
 
153 153
             $where .= " AND `transaction_id` IN ( '{$transaction_ids}' ) ";
@@ -155,12 +155,12 @@  discard block
 block discarded – undo
155 155
         }
156 156
 
157 157
         // Subscriptoins for specific customers
158
-        if( ! empty( $args['customer_id'] ) ) {
158
+        if (!empty($args['customer_id'])) {
159 159
 
160
-            if( is_array( $args['customer_id'] ) ) {
161
-                $customer_ids = implode( ',', array_map('intval', $args['customer_id'] ) );
160
+            if (is_array($args['customer_id'])) {
161
+                $customer_ids = implode(',', array_map('intval', $args['customer_id']));
162 162
             } else {
163
-                $customer_ids = intval( $args['customer_id'] );
163
+                $customer_ids = intval($args['customer_id']);
164 164
             }
165 165
 
166 166
             $where .= " AND `customer_id` IN( {$customer_ids} ) ";
@@ -168,12 +168,12 @@  discard block
 block discarded – undo
168 168
         }
169 169
 
170 170
         // Subscriptions for specific profile IDs
171
-        if( ! empty( $args['profile_id'] ) ) {
171
+        if (!empty($args['profile_id'])) {
172 172
 
173
-            if( is_array( $args['profile_id'] ) ) {
174
-                $profile_ids = implode( "','", array_map('sanitize_text_field', $args['profile_id'] ) );
173
+            if (is_array($args['profile_id'])) {
174
+                $profile_ids = implode("','", array_map('sanitize_text_field', $args['profile_id']));
175 175
             } else {
176
-                $profile_ids = sanitize_text_field( $args['profile_id'] );
176
+                $profile_ids = sanitize_text_field($args['profile_id']);
177 177
             }
178 178
 
179 179
             $where .= " AND `profile_id` IN( '{$profile_ids}' ) ";
@@ -181,12 +181,12 @@  discard block
 block discarded – undo
181 181
         }
182 182
 
183 183
         // Subscriptions for specific statuses
184
-        if( ! empty( $args['status'] ) ) {
184
+        if (!empty($args['status'])) {
185 185
 
186
-            if( is_array( $args['status'] ) ) {
187
-                $statuses = implode( "','", array_map( 'sanitize_text_field', $args['status'] ) );
186
+            if (is_array($args['status'])) {
187
+                $statuses = implode("','", array_map('sanitize_text_field', $args['status']));
188 188
             } else {
189
-                $statuses = sanitize_text_field( $args['status'] );
189
+                $statuses = sanitize_text_field($args['status']);
190 190
             }
191 191
 
192 192
             $where .= " AND `status` IN( '{$statuses}' ) ";
@@ -194,21 +194,21 @@  discard block
 block discarded – undo
194 194
         }
195 195
 
196 196
         // Subscriptions created for a specific date or in a date range
197
-        if( ! empty( $args['date'] ) ) {
197
+        if (!empty($args['date'])) {
198 198
 
199
-            if( is_array( $args['date'] ) ) {
199
+            if (is_array($args['date'])) {
200 200
 
201
-                if( ! empty( $args['date']['start'] ) ) {
201
+                if (!empty($args['date']['start'])) {
202 202
 
203
-                    $start = date( 'Y-m-d H:i:s', strtotime( $args['date']['start'] ) );
203
+                    $start = date('Y-m-d H:i:s', strtotime($args['date']['start']));
204 204
 
205 205
                     $where .= " AND `created` >= '{$start}'";
206 206
 
207 207
                 }
208 208
 
209
-                if( ! empty( $args['date']['end'] ) ) {
209
+                if (!empty($args['date']['end'])) {
210 210
 
211
-                    $end = date( 'Y-m-d H:i:s', strtotime( $args['date']['end'] ) );
211
+                    $end = date('Y-m-d H:i:s', strtotime($args['date']['end']));
212 212
 
213 213
                     $where .= " AND `created` <= '{$end}'";
214 214
 
@@ -216,9 +216,9 @@  discard block
 block discarded – undo
216 216
 
217 217
             } else {
218 218
 
219
-                $year  = date( 'Y', strtotime( $args['date'] ) );
220
-                $month = date( 'm', strtotime( $args['date'] ) );
221
-                $day   = date( 'd', strtotime( $args['date'] ) );
219
+                $year  = date('Y', strtotime($args['date']));
220
+                $month = date('m', strtotime($args['date']));
221
+                $day   = date('d', strtotime($args['date']));
222 222
 
223 223
                 $where .= " AND $year = YEAR ( created ) AND $month = MONTH ( created ) AND $day = DAY ( created )";
224 224
             }
@@ -226,21 +226,21 @@  discard block
 block discarded – undo
226 226
         }
227 227
 
228 228
         // Subscriptions with a specific expiration date or in an expiration date range
229
-        if( ! empty( $args['expiration'] ) ) {
229
+        if (!empty($args['expiration'])) {
230 230
 
231
-            if( is_array( $args['expiration'] ) ) {
231
+            if (is_array($args['expiration'])) {
232 232
 
233
-                if( ! empty( $args['expiration']['start'] ) ) {
233
+                if (!empty($args['expiration']['start'])) {
234 234
 
235
-                    $start = date( 'Y-m-d H:i:s', strtotime( $args['expiration']['start'] ) );
235
+                    $start = date('Y-m-d H:i:s', strtotime($args['expiration']['start']));
236 236
 
237 237
                     $where .= " AND `expiration` >= '{$start}'";
238 238
 
239 239
                 }
240 240
 
241
-                if( ! empty( $args['expiration']['end'] ) ) {
241
+                if (!empty($args['expiration']['end'])) {
242 242
 
243
-                    $end = date( 'Y-m-d H:i:s', strtotime( $args['expiration']['end'] ) );
243
+                    $end = date('Y-m-d H:i:s', strtotime($args['expiration']['end']));
244 244
 
245 245
                     $where .= " AND `expiration` <= '{$end}'";
246 246
 
@@ -248,73 +248,73 @@  discard block
 block discarded – undo
248 248
 
249 249
             } else {
250 250
 
251
-                $year  = date( 'Y', strtotime( $args['expiration'] ) );
252
-                $month = date( 'm', strtotime( $args['expiration'] ) );
253
-                $day   = date( 'd', strtotime( $args['expiration'] ) );
251
+                $year  = date('Y', strtotime($args['expiration']));
252
+                $month = date('m', strtotime($args['expiration']));
253
+                $day   = date('d', strtotime($args['expiration']));
254 254
 
255 255
                 $where .= " AND $year = YEAR ( expiration ) AND $month = MONTH ( expiration ) AND $day = DAY ( expiration )";
256 256
             }
257 257
 
258 258
         }
259 259
 
260
-        if ( ! empty( $args['search'] ) ) {
260
+        if (!empty($args['search'])) {
261 261
 
262
-            if( false !== strpos( 'id:', $args['search'] ) ) {
262
+            if (false !== strpos('id:', $args['search'])) {
263 263
 
264
-                $args['search'] = trim( str_replace( 'id:', '', $args['search'] ) );
265
-                $where .= " AND `id` = '" . esc_sql( $args['search'] ) . "'";
264
+                $args['search'] = trim(str_replace('id:', '', $args['search']));
265
+                $where .= " AND `id` = '" . esc_sql($args['search']) . "'";
266 266
 
267
-            } else if( false !== strpos( $args['search'], 'txn:' ) ) {
267
+            } else if (false !== strpos($args['search'], 'txn:')) {
268 268
 
269
-                $args['search'] = trim( str_replace( 'txn:', '', $args['search'] ) );
270
-                $where .= " AND `transaction_id` = '" . esc_sql( $args['search'] ) . "'";
269
+                $args['search'] = trim(str_replace('txn:', '', $args['search']));
270
+                $where .= " AND `transaction_id` = '" . esc_sql($args['search']) . "'";
271 271
 
272
-            } else if( false !== strpos( $args['search'], 'profile_id:' ) ) {
272
+            } else if (false !== strpos($args['search'], 'profile_id:')) {
273 273
 
274
-                $args['search'] = trim( str_replace( 'profile_id:', '', $args['search'] ) );
275
-                $where .= " AND `profile_id` = '" . esc_sql( $args['search'] ) . "'";
274
+                $args['search'] = trim(str_replace('profile_id:', '', $args['search']));
275
+                $where .= " AND `profile_id` = '" . esc_sql($args['search']) . "'";
276 276
 
277
-            } else if( false !== strpos( $args['search'], 'product_id:' ) ) {
277
+            } else if (false !== strpos($args['search'], 'product_id:')) {
278 278
 
279
-                $args['search'] = trim( str_replace( 'product_id:', '', $args['search'] ) );
280
-                $where .= " AND `product_id` = '" . esc_sql( $args['search'] ) . "'";
279
+                $args['search'] = trim(str_replace('product_id:', '', $args['search']));
280
+                $where .= " AND `product_id` = '" . esc_sql($args['search']) . "'";
281 281
 
282
-            } else if( false !== strpos( $args['search'], 'customer_id:' ) ) {
282
+            } else if (false !== strpos($args['search'], 'customer_id:')) {
283 283
 
284
-                $args['search'] = trim( str_replace( 'customer_id:', '', $args['search'] ) );
285
-                $where .= " AND `customer_id` = '" . esc_sql( $args['search'] ) . "'";
284
+                $args['search'] = trim(str_replace('customer_id:', '', $args['search']));
285
+                $where .= " AND `customer_id` = '" . esc_sql($args['search']) . "'";
286 286
 
287 287
             } else {
288 288
 
289
-                $where .= " AND ( `parent_payment_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `profile_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `transaction_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `product_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `id` = '" . esc_sql( $args['search'] ) . "' )";
289
+                $where .= " AND ( `parent_payment_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `profile_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `transaction_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `product_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `id` = '" . esc_sql($args['search']) . "' )";
290 290
 
291 291
             }
292 292
 
293 293
         }
294 294
 
295
-        $args['orderby'] = ! array_key_exists( $args['orderby'], $this->get_columns() ) ? 'id' : $args['orderby'];
295
+        $args['orderby'] = !array_key_exists($args['orderby'], $this->get_columns()) ? 'id' : $args['orderby'];
296 296
 
297
-        if( 'amount' == $args['orderby'] ) {
297
+        if ('amount' == $args['orderby']) {
298 298
             $args['orderby'] = 'amount+0';
299 299
         }
300 300
 
301
-        $cache_key = md5( 'wpinv_subscriptions_' . serialize( $args ) );
301
+        $cache_key = md5('wpinv_subscriptions_' . serialize($args));
302 302
 
303
-        $subscriptions = wp_cache_get( $cache_key, 'subscriptions' );
303
+        $subscriptions = wp_cache_get($cache_key, 'subscriptions');
304 304
 
305
-        $args['orderby'] = esc_sql( $args['orderby'] );
306
-        $args['order']   = esc_sql( $args['order'] );
305
+        $args['orderby'] = esc_sql($args['orderby']);
306
+        $args['order']   = esc_sql($args['order']);
307 307
 
308
-        if( $subscriptions === false ) {
309
-            $subscriptions = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM  $this->table_name $where ORDER BY {$args['orderby']} {$args['order']} LIMIT %d,%d;", absint( $args['offset'] ), absint( $args['number'] ) ), OBJECT );
308
+        if ($subscriptions === false) {
309
+            $subscriptions = $wpdb->get_results($wpdb->prepare("SELECT * FROM  $this->table_name $where ORDER BY {$args['orderby']} {$args['order']} LIMIT %d,%d;", absint($args['offset']), absint($args['number'])), OBJECT);
310 310
 
311
-            if( ! empty( $subscriptions ) ) {
311
+            if (!empty($subscriptions)) {
312 312
 
313
-                foreach( $subscriptions as $key => $subscription ) {
314
-                    $subscriptions[ $key ] = new WPInv_Subscription( $subscription );
313
+                foreach ($subscriptions as $key => $subscription) {
314
+                    $subscriptions[$key] = new WPInv_Subscription($subscription);
315 315
                 }
316 316
 
317
-                wp_cache_set( $cache_key, $subscriptions, 'subscriptions', 3600 );
317
+                wp_cache_set($cache_key, $subscriptions, 'subscriptions', 3600);
318 318
 
319 319
             }
320 320
 
@@ -329,19 +329,19 @@  discard block
 block discarded – undo
329 329
      * @access  public
330 330
      * @since   1.0.0
331 331
      */
332
-    public function count( $args = array() ) {
332
+    public function count($args = array()) {
333 333
 
334 334
         global $wpdb;
335 335
 
336 336
         $where = ' WHERE 1=1 ';
337 337
 
338 338
         // specific customers
339
-        if( ! empty( $args['id'] ) ) {
339
+        if (!empty($args['id'])) {
340 340
 
341
-            if( is_array( $args['id'] ) ) {
342
-                $ids = implode( ',', array_map('intval', $args['id'] ) );
341
+            if (is_array($args['id'])) {
342
+                $ids = implode(',', array_map('intval', $args['id']));
343 343
             } else {
344
-                $ids = intval( $args['id'] );
344
+                $ids = intval($args['id']);
345 345
             }
346 346
 
347 347
             $where .= " AND `id` IN( {$ids} ) ";
@@ -349,12 +349,12 @@  discard block
 block discarded – undo
349 349
         }
350 350
 
351 351
         // Specific products
352
-        if( ! empty( $args['product_id'] ) ) {
352
+        if (!empty($args['product_id'])) {
353 353
 
354
-            if( is_array( $args['product_id'] ) ) {
355
-                $product_ids = implode( ',', array_map('intval', $args['product_id'] ) );
354
+            if (is_array($args['product_id'])) {
355
+                $product_ids = implode(',', array_map('intval', $args['product_id']));
356 356
             } else {
357
-                $product_ids = intval( $args['product_id'] );
357
+                $product_ids = intval($args['product_id']);
358 358
             }
359 359
 
360 360
             $where .= " AND `product_id` IN( {$product_ids} ) ";
@@ -362,12 +362,12 @@  discard block
 block discarded – undo
362 362
         }
363 363
 
364 364
         // Specific parent payments
365
-        if( ! empty( $args['parent_payment_id'] ) ) {
365
+        if (!empty($args['parent_payment_id'])) {
366 366
 
367
-            if( is_array( $args['parent_payment_id'] ) ) {
368
-                $parent_payment_ids = implode( ',', array_map('intval', $args['parent_payment_id'] ) );
367
+            if (is_array($args['parent_payment_id'])) {
368
+                $parent_payment_ids = implode(',', array_map('intval', $args['parent_payment_id']));
369 369
             } else {
370
-                $parent_payment_ids = intval( $args['parent_payment_id'] );
370
+                $parent_payment_ids = intval($args['parent_payment_id']);
371 371
             }
372 372
 
373 373
             $where .= " AND `parent_payment_id` IN( {$parent_payment_ids} ) ";
@@ -375,12 +375,12 @@  discard block
 block discarded – undo
375 375
         }
376 376
 
377 377
         // Subscriptoins for specific customers
378
-        if( ! empty( $args['customer_id'] ) ) {
378
+        if (!empty($args['customer_id'])) {
379 379
 
380
-            if( is_array( $args['customer_id'] ) ) {
381
-                $customer_ids = implode( ',', array_map('intval', $args['customer_id'] ) );
380
+            if (is_array($args['customer_id'])) {
381
+                $customer_ids = implode(',', array_map('intval', $args['customer_id']));
382 382
             } else {
383
-                $customer_ids = intval( $args['customer_id'] );
383
+                $customer_ids = intval($args['customer_id']);
384 384
             }
385 385
 
386 386
             $where .= " AND `customer_id` IN( {$customer_ids} ) ";
@@ -388,12 +388,12 @@  discard block
 block discarded – undo
388 388
         }
389 389
 
390 390
         // Subscriptions for specific profile IDs
391
-        if( ! empty( $args['profile_id'] ) ) {
391
+        if (!empty($args['profile_id'])) {
392 392
 
393
-            if( is_array( $args['profile_id'] ) ) {
394
-                $profile_ids = implode( ',', array_map('intval', $args['profile_id'] ) );
393
+            if (is_array($args['profile_id'])) {
394
+                $profile_ids = implode(',', array_map('intval', $args['profile_id']));
395 395
             } else {
396
-                $profile_ids = intval( $args['profile_id'] );
396
+                $profile_ids = intval($args['profile_id']);
397 397
             }
398 398
 
399 399
             $where .= " AND `profile_id` IN( {$profile_ids} ) ";
@@ -401,12 +401,12 @@  discard block
 block discarded – undo
401 401
         }
402 402
 
403 403
         // Specific transaction IDs
404
-        if( ! empty( $args['transaction_id'] ) ) {
404
+        if (!empty($args['transaction_id'])) {
405 405
 
406
-            if( is_array( $args['transaction_id'] ) ) {
407
-                $transaction_ids = implode( ',', array_map('sanitize_text_field', $args['transaction_id'] ) );
406
+            if (is_array($args['transaction_id'])) {
407
+                $transaction_ids = implode(',', array_map('sanitize_text_field', $args['transaction_id']));
408 408
             } else {
409
-                $transaction_ids = sanitize_text_field( $args['transaction_id'] );
409
+                $transaction_ids = sanitize_text_field($args['transaction_id']);
410 410
             }
411 411
 
412 412
             $where .= " AND `transaction_id` IN( {$transaction_ids} ) ";
@@ -414,10 +414,10 @@  discard block
 block discarded – undo
414 414
         }
415 415
 
416 416
         // Subscriptions for specific statuses
417
-        if( ! empty( $args['status'] ) ) {
417
+        if (!empty($args['status'])) {
418 418
 
419
-            if( is_array( $args['status'] ) ) {
420
-                $statuses = implode( ',', $args['status'] );
419
+            if (is_array($args['status'])) {
420
+                $statuses = implode(',', $args['status']);
421 421
                 $where  .= " AND `status` IN( {$statuses} ) ";
422 422
             } else {
423 423
                 $statuses = $args['status'];
@@ -429,21 +429,21 @@  discard block
 block discarded – undo
429 429
         }
430 430
 
431 431
         // Subscriptions created for a specific date or in a date range
432
-        if( ! empty( $args['date'] ) ) {
432
+        if (!empty($args['date'])) {
433 433
 
434
-            if( is_array( $args['date'] ) ) {
434
+            if (is_array($args['date'])) {
435 435
 
436
-                if( ! empty( $args['date']['start'] ) ) {
436
+                if (!empty($args['date']['start'])) {
437 437
 
438
-                    $start = date( 'Y-m-d H:i:s', strtotime( $args['date']['start'] ) );
438
+                    $start = date('Y-m-d H:i:s', strtotime($args['date']['start']));
439 439
 
440 440
                     $where .= " AND `created` >= '{$start}'";
441 441
 
442 442
                 }
443 443
 
444
-                if( ! empty( $args['date']['end'] ) ) {
444
+                if (!empty($args['date']['end'])) {
445 445
 
446
-                    $end = date( 'Y-m-d H:i:s', strtotime( $args['date']['end'] ) );
446
+                    $end = date('Y-m-d H:i:s', strtotime($args['date']['end']));
447 447
 
448 448
                     $where .= " AND `created` <= '{$end}'";
449 449
 
@@ -451,9 +451,9 @@  discard block
 block discarded – undo
451 451
 
452 452
             } else {
453 453
 
454
-                $year  = date( 'Y', strtotime( $args['date'] ) );
455
-                $month = date( 'm', strtotime( $args['date'] ) );
456
-                $day   = date( 'd', strtotime( $args['date'] ) );
454
+                $year  = date('Y', strtotime($args['date']));
455
+                $month = date('m', strtotime($args['date']));
456
+                $day   = date('d', strtotime($args['date']));
457 457
 
458 458
                 $where .= " AND $year = YEAR ( created ) AND $month = MONTH ( created ) AND $day = DAY ( created )";
459 459
             }
@@ -461,21 +461,21 @@  discard block
 block discarded – undo
461 461
         }
462 462
 
463 463
         // Subscriptions with a specific expiration date or in an expiration date range
464
-        if( ! empty( $args['expiration'] ) ) {
464
+        if (!empty($args['expiration'])) {
465 465
 
466
-            if( is_array( $args['expiration'] ) ) {
466
+            if (is_array($args['expiration'])) {
467 467
 
468
-                if( ! empty( $args['expiration']['start'] ) ) {
468
+                if (!empty($args['expiration']['start'])) {
469 469
 
470
-                    $start = date( 'Y-m-d H:i:s', strtotime( $args['expiration']['start'] ) );
470
+                    $start = date('Y-m-d H:i:s', strtotime($args['expiration']['start']));
471 471
 
472 472
                     $where .= " AND `expiration` >= '{$start}'";
473 473
 
474 474
                 }
475 475
 
476
-                if( ! empty( $args['expiration']['end'] ) ) {
476
+                if (!empty($args['expiration']['end'])) {
477 477
 
478
-                    $end = date( 'Y-m-d H:i:s', strtotime( $args['expiration']['end'] ) );
478
+                    $end = date('Y-m-d H:i:s', strtotime($args['expiration']['end']));
479 479
 
480 480
                     $where .= " AND `expiration` <= '{$end}'";
481 481
 
@@ -483,64 +483,64 @@  discard block
 block discarded – undo
483 483
 
484 484
             } else {
485 485
 
486
-                $year  = date( 'Y', strtotime( $args['expiration'] ) );
487
-                $month = date( 'm', strtotime( $args['expiration'] ) );
488
-                $day   = date( 'd', strtotime( $args['expiration'] ) );
486
+                $year  = date('Y', strtotime($args['expiration']));
487
+                $month = date('m', strtotime($args['expiration']));
488
+                $day   = date('d', strtotime($args['expiration']));
489 489
 
490 490
                 $where .= " AND $year = YEAR ( expiration ) AND $month = MONTH ( expiration ) AND $day = DAY ( expiration )";
491 491
             }
492 492
 
493 493
         }
494 494
 
495
-        if ( ! empty( $args['search'] ) ) {
495
+        if (!empty($args['search'])) {
496 496
 
497
-            if( false !== strpos( 'id:', $args['search'] ) ) {
497
+            if (false !== strpos('id:', $args['search'])) {
498 498
 
499
-                $args['search'] = trim( str_replace( 'id:', '', $args['search'] ) );
500
-                $where .= " AND `id` = '" . esc_sql( $args['search'] ) . "'";
499
+                $args['search'] = trim(str_replace('id:', '', $args['search']));
500
+                $where .= " AND `id` = '" . esc_sql($args['search']) . "'";
501 501
 
502
-            } else if( false !== strpos( $args['search'], 'txn:' ) ) {
502
+            } else if (false !== strpos($args['search'], 'txn:')) {
503 503
 
504
-                $args['search'] = trim( str_replace( 'txn:', '', $args['search'] ) );
505
-                $where .= " AND `transaction_id` = '" . esc_sql( $args['search'] ) . "'";
504
+                $args['search'] = trim(str_replace('txn:', '', $args['search']));
505
+                $where .= " AND `transaction_id` = '" . esc_sql($args['search']) . "'";
506 506
 
507
-            } else if( false !== strpos( $args['search'], 'profile_id:' ) ) {
507
+            } else if (false !== strpos($args['search'], 'profile_id:')) {
508 508
 
509
-                $args['search'] = trim( str_replace( 'profile_id:', '', $args['search'] ) );
510
-                $where .= " AND `profile_id` = '" . esc_sql( $args['search'] ) . "'";
509
+                $args['search'] = trim(str_replace('profile_id:', '', $args['search']));
510
+                $where .= " AND `profile_id` = '" . esc_sql($args['search']) . "'";
511 511
 
512
-            } else if( false !== strpos( $args['search'], 'product_id:' ) ) {
512
+            } else if (false !== strpos($args['search'], 'product_id:')) {
513 513
 
514
-                $args['search'] = trim( str_replace( 'product_id:', '', $args['search'] ) );
515
-                $where .= " AND `product_id` = '" . esc_sql( $args['search'] ) . "'";
514
+                $args['search'] = trim(str_replace('product_id:', '', $args['search']));
515
+                $where .= " AND `product_id` = '" . esc_sql($args['search']) . "'";
516 516
 
517
-            } else if( false !== strpos( $args['search'], 'customer_id:' ) ) {
517
+            } else if (false !== strpos($args['search'], 'customer_id:')) {
518 518
 
519
-                $args['search'] = trim( str_replace( 'customer_id:', '', $args['search'] ) );
520
-                $where .= " AND `customer_id` = '" . esc_sql( $args['search'] ) . "'";
519
+                $args['search'] = trim(str_replace('customer_id:', '', $args['search']));
520
+                $where .= " AND `customer_id` = '" . esc_sql($args['search']) . "'";
521 521
 
522 522
             } else {
523 523
 
524
-                $where .= " AND ( `parent_payment_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `profile_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `transaction_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `product_id` LIKE '%%" . esc_sql( $args['search'] ) . "%%' OR `id` = '" . esc_sql( $args['search'] ) . "' )";
524
+                $where .= " AND ( `parent_payment_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `profile_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `transaction_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `product_id` LIKE '%%" . esc_sql($args['search']) . "%%' OR `id` = '" . esc_sql($args['search']) . "' )";
525 525
 
526 526
             }
527 527
 
528 528
         }
529 529
 
530
-        $cache_key = md5( 'wpinv_subscriptions_count' . serialize( $args ) );
530
+        $cache_key = md5('wpinv_subscriptions_count' . serialize($args));
531 531
 
532
-        $count = wp_cache_get( $cache_key, 'subscriptions' );
532
+        $count = wp_cache_get($cache_key, 'subscriptions');
533 533
 
534
-        if( $count === false ) {
534
+        if ($count === false) {
535 535
 
536 536
             $sql   = "SELECT COUNT($this->primary_key) FROM " . $this->table_name . "{$where};";
537
-            $count = $wpdb->get_var( $sql );
537
+            $count = $wpdb->get_var($sql);
538 538
 
539
-            wp_cache_set( $cache_key, $count, 'subscriptions', 3600 );
539
+            wp_cache_set($cache_key, $count, 'subscriptions', 3600);
540 540
 
541 541
         }
542 542
 
543
-        return absint( $count );
543
+        return absint($count);
544 544
 
545 545
     }
546 546
 
@@ -553,7 +553,7 @@  discard block
 block discarded – undo
553 553
     public function create_table() {
554 554
         global $wpdb;
555 555
 
556
-        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
556
+        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
557 557
 
558 558
         $sql = "CREATE TABLE " . $this->table_name . " (
559 559
         id bigint(20) NOT NULL AUTO_INCREMENT,
@@ -578,9 +578,9 @@  discard block
 block discarded – undo
578 578
         KEY customer_and_status ( customer_id, status)
579 579
         ) CHARACTER SET utf8 COLLATE utf8_general_ci;";
580 580
 
581
-        dbDelta( $sql );
581
+        dbDelta($sql);
582 582
 
583
-        update_option( $this->table_name . '_db_version', $this->version );
583
+        update_option($this->table_name . '_db_version', $this->version);
584 584
     }
585 585
 
586 586
 }
587 587
\ No newline at end of file
Please login to merge, or discard this patch.