PluginProbe
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar / 2.0.1
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar v2.0.1
2.1.22 2.1.21 2.1.20 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 trunk 1.1 2.0 2.0.1 2.0.10.2 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.17 2.0.18 2.0.2 2.0.20 2.0.21 All 56 releases
booking-manager / core / wpbm-functions.php

wpbm-functions.php in Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar 2.0.1, at core/wpbm-functions.php

2,175 lines 74.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version 1.0
4 * @package Booking Manager
5 * @subpackage Support Functions
6 * @category Functions
7 *
8 * @author wpdevelop
9 * @link http://oplugins.com/
10 * @email [email protected]
11 *
12 * @modified 29.09.2015
13 */
14
15 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
16
17
18 // <editor-fold defaultstate="collapsed" desc=" V e r s i o n s " >
19 ////////////////////////////////////////////////////////////////////////////////
20 // V e r s i o n s
21 ////////////////////////////////////////////////////////////////////////////////
22
23 /** Get version
24 *
25 * @return string
26 */
27 function get_wpbm_version(){
28 $version = 'free';
29 return $version;
30 }
31
32 /** Check if user accidentially update Booking Manager Paid version to Free
33 *
34 * @return bool
35 */
36 function wpbm_is_updated_paid_to_free() {
37
38 if ( ( wpbm_is_table_exists('wpbm_log') ) && ( ! class_exists('wpbm_personal') ) )
39 return true;
40 else
41 return false;
42 }
43
44 function wpbm_get_ver_sufix() {
45
46 if ( strpos( strtolower( WPBM_VERSION ), 'multisite' ) !== false ) {
47 $v_type = '-multi';
48 } else if ( strpos( strtolower( WPBM_VERSION ), 'develop' ) !== false ) {
49 $v_type = '-dev';
50 } else {
51 $v_type = '';
52 }
53 $v = '';
54 if ( class_exists( 'wpbm_personal' ) )
55 $v = 'ps' . $v_type;
56 if ( class_exists( 'wpbm_pro' ) )
57 $v = '';
58 return $v;
59 }
60
61 function wpbm_up_link() {
62 if ( ! wpbm_is_this_demo() )
63 $v = wpbm_get_ver_sufix();
64 else $v = '';
65 return 'http://oplugins.com/plugins/booking-manager/' . ( ( empty($v) ) ? '' : 'upgrade-' . $v . '/' ) ;
66 }
67
68 /** Check if this demo website
69 *
70 * @return bool
71 */
72 function wpbm_is_this_demo() {
73 //return ! true; //TODO: comment it. 2016-09-27 // Replaced!
74 if (
75 ( ( isset( $_SERVER['SCRIPT_FILENAME'] ) ) && ( strpos( $_SERVER['SCRIPT_FILENAME'], 'oplugins.com' ) !== false ) )
76 || ( ( isset( $_SERVER['HTTP_HOST'] ) ) && ( strpos( $_SERVER['HTTP_HOST'], 'oplugins.com' ) !== false ) )
77 )
78 return true;
79 else
80 return false;
81 }
82
83 /** Get Warning Text for Demo websites */
84 function wpbm_get_warning_text_in_demo_mode() {
85
86 return '<div class="wpbm-settings-notice notice-warning"><strong>Warning!</strong> Demo test version does not allow changes to these items.</div>';
87 }
88
89 /** Show System Info (status) at item > Settings General page
90 * Link: http://server.com/wp-admin/admin.php?page=wpbm-settings&system_info=show#wpbm_general_settings_system_info_metabox
91 */
92 function wpbm_system_info() {
93
94 if ( wpbm_is_this_demo() ) return;
95
96 if ( current_user_can( 'activate_plugins' ) ) { // Only for Administrator or Super admin. More here: https://codex.wordpress.org/Roles_and_Capabilities
97
98 global $wpdb, $wp_version;
99
100 $all_plugins = get_plugins();
101 $active_plugins = get_option( 'active_plugins' );
102
103 $mysql_info = $wpdb->get_results( "SHOW VARIABLES LIKE 'sql_mode'" );
104 if ( is_array( $mysql_info ) ) $sql_mode = $mysql_info[0]->Value;
105 if ( empty( $sql_mode ) ) $sql_mode = 'Not set';
106
107 $safe_mode = ( ini_get( 'safe_mode' ) ) ? 'On' : 'Off';
108 $allow_url_fopen = ( ini_get( 'allow_url_fopen' ) ) ? 'On' : 'Off';
109 $upload_max_filesize = ( ini_get( 'upload_max_filesize' ) ) ? ini_get( 'upload_max_filesize' ) : 'N/A';
110 $post_max_size = ( ini_get( 'post_max_size' ) ) ? ini_get( 'post_max_size' ) : 'N/A';
111 $max_execution_time = ( ini_get( 'max_execution_time' ) ) ? ini_get( 'max_execution_time' ) : 'N/A';
112 $memory_limit = ( ini_get( 'memory_limit' ) ) ? ini_get( 'memory_limit' ) : 'N/A';
113 $memory_usage = ( function_exists( 'memory_get_usage' ) ) ? round( memory_get_usage() / 1024 / 1024, 2 ) . ' Mb' : 'N/A';
114 $exif_read_data = ( is_callable( 'exif_read_data' ) ) ? 'Yes' . " ( V" . substr( phpversion( 'exif' ), 0, 4 ) . ")" : 'No';
115 $iptcparse = ( is_callable( 'iptcparse' ) ) ? 'Yes' : 'No';
116 $xml_parser_create = ( is_callable( 'xml_parser_create' ) ) ? 'Yes' : 'No';
117 $theme = ( function_exists( 'wp_get_theme' ) ) ? wp_get_theme() : get_theme( get_current_theme() );
118
119 if ( function_exists( 'is_multisite' ) ) {
120 if ( is_multisite() ) $multisite = 'Yes';
121 else $multisite = 'No';
122 } else { $multisite = 'N/A';
123 }
124
125 $system_info = array(
126 'system_info' => '',
127 'php_info' => '',
128 'active_plugins' => '',
129 'inactive_plugins' => ''
130 );
131
132 $ver_small_name = get_wpbm_version();
133 if ( class_exists( 'wpbm_multiuser' ) ) $ver_small_name = 'multiuser';
134
135 $system_info['system_info'] = array(
136 'Plugin Update' => ( defined( 'WPBM_VERSION' ) ) ? WPBM_VERSION : 'N/A',
137 'Plugin Version' => ucwords( $ver_small_name ),
138 'Plugin Update Date' => date( "Y-m-d", filemtime( WPBM_FILE ) ),
139
140 'WP Version' => $wp_version,
141 'WP DEBUG' => ( ( defined('WP_DEBUG') ) && ( WP_DEBUG ) ) ? 'On' : 'Off',
142 'WP DB Version' => get_option( 'db_version' ),
143 'Operating System' => PHP_OS,
144 'Server' => $_SERVER["SERVER_SOFTWARE"],
145 'PHP Version' => PHP_VERSION,
146 'PHP Safe Mode' => $safe_mode,
147 'MYSQL Version' => $wpdb->get_var( "SELECT VERSION() AS version" ),
148 'SQL Mode' => $sql_mode,
149 'Memory usage' => $memory_usage,
150 'Site URL' => get_option( 'siteurl' ),
151 'Home URL' => home_url(),
152 'SERVER[HTTP_HOST]' => $_SERVER['HTTP_HOST'],
153 'SERVER[SERVER_NAME]' => $_SERVER['SERVER_NAME'],
154 'Multisite' => $multisite,
155 'Active Theme' => $theme['Name'] . ' ' . $theme['Version']
156 );
157
158 $system_info['php_info'] = array(
159 'PHP Version' => PHP_VERSION,
160 'PHP Safe Mode' => $safe_mode,
161 'PHP Memory Limit' => '<strong>' . $memory_limit . '</strong>',
162 'PHP Max Script Execute Time' => '<strong>' . $max_execution_time . '</strong>',
163
164 'PHP Max Post Size' => '<strong>' . $post_max_size . '</strong>',
165 'PHP MAX Input Vars' => '<strong>' . ( ( ini_get( 'max_input_vars' ) ) ? ini_get( 'max_input_vars' ) : 'N/A' ) . '</strong>', //How many input variables may be accepted (limit is applied to $_GET, $_POST and $_COOKIE superglobal separately).
166
167 'PHP Max Upload Size' => $upload_max_filesize,
168 'PHP Allow URL fopen' => $allow_url_fopen,
169 'PHP Exif support' => $exif_read_data,
170 'PHP IPTC support' => $iptcparse,
171 'PHP XML support' => $xml_parser_create
172 );
173
174 $system_info['php_info']['PHP cURL'] = ( function_exists('curl_init') ) ? 'On' : 'Off';
175 $system_info['php_info']['Max Nesting Level'] = ( ( ini_get( 'max_input_nesting_level' ) ) ? ini_get( 'max_input_nesting_level' ) : 'N/A' );
176 $system_info['php_info']['Max Time 4 script'] = ( ( ini_get( 'max_input_time' ) ) ? ini_get( 'max_input_time' ) : 'N/A' ); //Maximum amount of time each script may spend parsing request data
177 $system_info['php_info']['Log'] = ( ( ini_get( 'error_log' ) ) ? ini_get( 'error_log' ) : 'N/A' );
178
179 if ( ini_get( "suhosin.get.max_value_length" ) ) {
180
181 $system_info['suhosin_info'] = array();
182 $system_info['suhosin_info']['POST max_array_index_length'] = ( ( ini_get( 'suhosin.post.max_array_index_length' ) ) ? ini_get( 'suhosin.post.max_array_index_length' ) : 'N/A' );
183 $system_info['suhosin_info']['REQUEST max_array_index_length'] = ( ( ini_get( 'suhosin.request.max_array_index_length' ) ) ? ini_get( 'suhosin.request.max_array_index_length' ) : 'N/A' );
184
185 $system_info['suhosin_info']['POST max_totalname_length'] = ( ( ini_get( 'suhosin.post.max_totalname_length' ) ) ? ini_get( 'suhosin.post.max_totalname_length' ) : 'N/A' );
186 $system_info['suhosin_info']['REQUEST max_totalname_length'] = ( ( ini_get( 'suhosin.request.max_totalname_length' ) ) ? ini_get( 'suhosin.request.max_totalname_length' ) : 'N/A' );
187
188 $system_info['suhosin_info']['POST max_vars'] = ( ( ini_get( 'suhosin.post.max_vars' ) ) ? ini_get( 'suhosin.post.max_vars' ) : 'N/A' );
189 $system_info['suhosin_info']['REQUEST max_vars'] = ( ( ini_get( 'suhosin.request.max_vars' ) ) ? ini_get( 'suhosin.request.max_vars' ) : 'N/A' );
190
191 $system_info['suhosin_info']['POST max_value_length'] = ( ( ini_get( 'suhosin.post.max_value_length' ) ) ? ini_get( 'suhosin.post.max_value_length' ) : 'N/A' );
192 $system_info['suhosin_info']['REQUEST max_value_length'] = ( ( ini_get( 'suhosin.request.max_value_length' ) ) ? ini_get( 'suhosin.request.max_value_length' ) : 'N/A' );
193
194 $system_info['suhosin_info']['POST max_name_length'] = ( ( ini_get( 'suhosin.post.max_name_length' ) ) ? ini_get( 'suhosin.post.max_name_length' ) : 'N/A' );
195 $system_info['suhosin_info']['REQUEST max_varname_length'] = ( ( ini_get( 'suhosin.request.max_varname_length' ) ) ? ini_get( 'suhosin.request.max_varname_length' ) : 'N/A' );
196
197 $system_info['suhosin_info']['POST max_array_depth'] = ( ( ini_get( 'suhosin.post.max_array_depth' ) ) ? ini_get( 'suhosin.post.max_array_depth' ) : 'N/A' );
198 $system_info['suhosin_info']['REQUEST max_array_depth'] = ( ( ini_get( 'suhosin.request.max_array_depth' ) ) ? ini_get( 'suhosin.request.max_array_depth' ) : 'N/A' );
199 }
200
201
202 if ( function_exists('gd_info') ) {
203 $gd_info = gd_info();
204 if ( isset( $gd_info['GD Version'] ) )
205 $gd_info = $gd_info['GD Version'];
206 else
207 $gd_info = json_encode( $gd_info );
208 } else {
209 $gd_info = 'Off';
210 }
211 $system_info['php_info']['PHP GD'] = $gd_info;
212
213 // More here https://docs.woocommerce.com/document/problems-with-large-amounts-of-data-not-saving-variations-rates-etc/
214
215
216 foreach ( $all_plugins as $path => $plugin ) {
217 if ( is_plugin_active( $path ) )
218 $system_info['active_plugins'][$plugin['Name']] = $plugin['Version'];
219 else
220 $system_info['inactive_plugins'][$plugin['Name']] = $plugin['Version'];
221 }
222
223 // Showing
224 foreach ( $system_info as $section_name => $section_values ) {
225 ?>
226 <span class="wpdevelop">
227 <table class="table table-striped table-bordered">
228 <thead><tr><th colspan="2" style="border-bottom: 1px solid #eeeeee;padding: 10px;"><?php echo strtoupper( $section_name ); ?></th></tr></thead>
229 <tbody>
230 <?php
231 if ( !empty( $section_values ) ) {
232 foreach ( $section_values as $key => $value ) {
233 ?>
234 <tr>
235 <td scope="row" style="width:18em;padding:4px 8px;"><?php echo $key; ?></td>
236 <td scope="row" style="padding:4px 8px;"><?php echo $value; ?></td>
237 </tr>
238 <?php
239 }
240 }
241 ?>
242 </tbody>
243 </table>
244 </span>
245 <div class="clear"></div>
246 <?php
247 }
248 ?>
249 <hr>
250 <div style="color:#777;">
251 <h4 style="font-size:1.1em;">Commonly required configuration vars in php.ini file:</h4>
252 <h4>General section:</h4>
253 <pre><code>memory_limit = 256M
254 max_execution_time = 120
255 post_max_size = 8M
256 upload_max_filesize = 8M
257 max_input_vars = 20480
258 post_max_size = 64M</code></pre>
259 <h4>Suhosin section (if installed):</h4>
260 <pre><code>suhosin.post.max_array_index_length = 1024
261 suhosin.post.max_totalname_length = 65535
262 suhosin.post.max_vars = 2048
263 suhosin.post.max_value_length = 1000000
264 suhosin.post.max_name_length = 256
265 suhosin.post.max_array_depth = 1000
266 suhosin.request.max_array_index_length = 1024
267 suhosin.request.max_totalname_length = 65535
268 suhosin.request.max_vars = 2048
269 suhosin.request.max_value_length = 1000000
270 suhosin.request.max_varname_length = 256
271 suhosin.request.max_array_depth = 1000</code></pre>
272 </div>
273 <?php
274 // phpinfo();
275 }
276 }
277
278
279
280 /** Check if "Booking Calendar" installed/activated and return version number
281 *
282 * @return string - 0 if not installed, otherwise version num
283 */
284 function wpbm_get_wpbc_version() {
285
286 if ( ! defined( 'WP_BK_VERSION_NUM' ) )
287 return 0;
288 else
289 return WP_BK_VERSION_NUM;
290 }
291
292 /** Is activated Booking Calendar support WPBM
293 *
294 * @return boolean
295 */
296 function wpbm_is_wpbc_supported() {
297
298 // 7.2.1 - its start version of Booking Calendar which support integration with Booking Manager 2.0
299
300 if ( version_compare( wpbm_get_wpbc_version(), '7.2.1') >= 0 ) {
301 return true;
302 } else {
303 return false;
304 }
305 }
306
307 // </editor-fold>
308
309
310 // <editor-fold defaultstate="collapsed" desc=" F o r m a t t i n g " >
311 ////////////////////////////////////////////////////////////////////////////////
312 // F o r m a t t i n g
313 ////////////////////////////////////////////////////////////////////////////////
314 /**
315 * Sanitize term to Slug format (no spaces, lowercase).
316 * urldecode - reverse munging of UTF8 characters.
317 *
318 * @param mixed $value
319 * @return string
320 */
321 function wpbm_get_slug_format( $value ) {
322 return urldecode( sanitize_title( $value ) );
323 }
324
325 /**
326 * Get Slug Format Option Value for saving to the options table.
327 * Replacing - to _ and restrict length to 64 characters.
328 *
329 * @param string $value
330 * @return string
331 */
332 function wpbm_get_slug_format_4_option_name( $value ) {
333
334 $value = wpbm_get_slug_format( $value );
335 $value = str_replace('-', '_', $value);
336 $value = substr($value, 0, 64);
337 return $value;
338 }
339
340 /** Insert New Line symbols after <br> tags. Usefull for the settings pages to show in redable view
341 *
342 * @param type $param
343 * @return type
344 */
345 function wpbm_nl_after_br($param) {
346
347 $value = preg_replace( "@(&lt;|<)br\s*/?(&gt;|>)(\r\n)?@", "<br/>", $param );
348
349 return $value;
350 }
351
352 /**
353 * Replace ** to <strong> and * to <em>
354 *
355 * @param String $text
356 * @return string
357 */
358 if ( ! function_exists( 'wpbm_recheck_strong_symbols' ) ) {
359 function wpbm_recheck_strong_symbols( $text ){
360
361 $patterns = '/(\*\*)(\s*[^\*\*]*)(\*\*)/';
362 $replacement = '<strong>${2}</strong>';
363 $value_return = preg_replace($patterns, $replacement, $text);
364
365 $patterns = '/(\*)(\s*[^\*]*)(\*)/';
366 $replacement = '<em>${2}</em>';
367 $value_return = preg_replace($patterns, $replacement, $value_return);
368
369 return $value_return;
370 }
371 }
372
373
374 /** Esacpe and replace any HTML entities
375 *
376 * @param type $string
377 * @return string
378 */
379 function wpbm_esc_to_plain_text( $string ) {
380
381 // //Replace <a href="http://server.com">Link</a> to Link( http://server.com )
382 // $pattern = "/<a(.*)+href=[\"|']+([^\"']+)(?=(\"|'))[^>]*>(.*)<\/a>/" ; //"/(?<=href=(\"|'))[^\"']+(?=(\"|'))/i";
383 // $newurl = "$4 ($2)";
384 // $string = preg_replace($pattern,$newurl,$string);
385
386
387 // List of preg* regular expression patterns to search for replace in plain emails. More: https://raw.github.com/ushahidi/wp-silcc/master/class.html2text.inc
388 $plain_search_array = array(
389 "/\r/", // Non-legal carriage return
390 '/&(nbsp|#160);/i', // Non-breaking space
391 '/&(quot|rdquo|ldquo|#8220|#8221|#147|#148|#34|#034);/i', // Double quotes //FixIn: 2.0.1.6
392 '/&(apos|rsquo|lsquo|#8216|#8217|#39|#039);/i', // Single quotes //FixIn: 2.0.1.6
393 '/&gt;/i', // Greater-than
394 '/&lt;/i', // Less-than
395 '/&#38;/i', // Ampersand
396 '/&#038;/i', // Ampersand
397 '/&amp;/i', // Ampersand
398 '/&(copy|#169);/i', // Copyright
399 '/&(trade|#8482|#153);/i', // Trademark
400 '/&(reg|#174);/i', // Registered
401 '/&(mdash|#151|#8212);/i', // mdash
402 '/&(ndash|minus|#8211|#8722);/i', // ndash
403 '/&(bull|#149|#8226);/i', // Bullet
404 '/&(pound|#163);/i', // Pound sign
405 '/&(euro|#8364);/i', // Euro sign
406 '/&#36;/', // Dollar sign
407 '/&[^&;]+;/i', // Unknown/unhandled entities
408 '/[ ]{2,}/' // Runs of spaces, post-handling
409 );
410
411 // List of symbols for Replace
412 $get_plain_replace_array = array(
413 '', // Non-legal carriage return
414 ' ', // Non-breaking space
415 '"', // Double quotes
416 "'", // Single quotes
417 '>', // Greater-than
418 '<', // Less-than
419 '&', // Ampersand
420 '&', // Ampersand
421 '&', // Ampersand
422 '(c)', // Copyright
423 '(tm)', // Trademark
424 '(R)', // Registered
425 '--', // mdash
426 '-', // ndash
427 '*', // Bullet
428 '£', // Pound sign
429 'EUR', // Euro sign. € ?
430 '$', // Dollar sign
431 '', // Unknown/unhandled entities
432 ' ' // Runs of spaces, post-handling
433 );
434
435 $newstring = preg_replace( $plain_search_array, $get_plain_replace_array, strip_tags( $string ) );
436
437 return $newstring;
438 }
439 // </editor-fold>
440
441
442 // <editor-fold defaultstate="collapsed" desc=" S u p p o r t " >
443 ////////////////////////////////////////////////////////////////////////////////
444 // S u p p o r t Functions
445 ////////////////////////////////////////////////////////////////////////////////
446
447 /** Replace shortcodes in string
448 *
449 * @param string $subject - string to manipulate
450 * @param array $replace_array - array with values to replace // array( [wpbm_id] => 9, [id] => 9, [dates] => July 3, 2016 14:00 - July 4, 2016 16:00, .... )
451 * @param mixed $replace_unknown_shortcodes - replace unknown params, if false, then no replace unknown params
452 * @return string
453 */
454 function wpbm_replace_shortcodes( $subject, $replace_array , $replace_unknown_shortcodes = ' ' ) {
455
456 $defaults = array(
457 'ip' => apply_wpbm_filter( 'wpbm_get_user_ip' )
458 , 'blogname' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES )
459 , 'siteurl' => get_site_url()
460 );
461
462 $replace = wp_parse_args( $replace_array, $defaults );
463
464 foreach ( $replace as $replace_shortcode => $replace_value ) {
465
466 $subject = str_replace( array( '[' . $replace_shortcode . ']'
467 , '{' . $replace_shortcode . '}' )
468 , $replace_value
469 , $subject );
470 }
471
472 // Remove all shortcodes, which is not replaced early.
473 if ( $replace_unknown_shortcodes !== false )
474 $subject = preg_replace( '/[\s]{0,}[\[\{]{1}[a-zA-Z][0-9a-zA-Z:._-]{0,}[\]\}]{1}[\s]{0,}/', $replace_unknown_shortcodes, $subject );
475
476
477 return $subject;
478 }
479
480 /** Simple hack to make array strings lowercase
481 *
482 * @param type $array
483 * @return type
484 */
485 function wpbm_arraytolower( $array ){
486 return unserialize( strtolower( serialize( $array ) ) );
487 }
488
489 /** Support 'hash_equals' this function at older servers than PHP 5.6.0 */
490 if ( !function_exists( 'hash_equals' ) ) {
491 function hash_equals( $known_string, $user_string ) {
492 $ret = 0;
493
494 if ( strlen( $known_string ) !== strlen( $user_string ) ) {
495 $user_string = $known_string;
496 $ret = 1;
497 }
498
499 $res = $known_string ^ $user_string;
500
501 for ( $i = strlen( $res ) - 1; $i >= 0; --$i ) {
502 $ret |= ord( $res[$i] );
503 }
504
505 return !$ret;
506 }
507 }
508
509 /** Check if this valid timestamp
510 *
511 * @param string|int $timestamp
512 * @return bool
513 */
514 function wpbm_is_valid_timestamp( $timestamp ) {
515 return ( ( (string) (int) $timestamp === $timestamp)
516 && ($timestamp <= PHP_INT_MAX)
517 && ($timestamp >= ~PHP_INT_MAX)
518 );
519 }
520 // </editor-fold>
521
522
523 // <editor-fold defaultstate="collapsed" desc=" F i l e s && U R L s " >
524 ////////////////////////////////////////////////////////////////////////////////
525 // F i l e s && U R L s
526 ////////////////////////////////////////////////////////////////////////////////
527
528 /** Get absolute URL to relative plugin path.
529 * Depend from the WPBM_MIN contant can be load minified version of file, if its exist
530 * @param string $path - path
531 * @return string
532 */
533 function wpbm_plugin_url( $path ) {
534
535 if ( ( defined( 'WPBM_MIN' ) ) && ( WPBM_MIN ) ){
536 $path_min = $path;
537 if ( substr( $path_min , -3 ) === '.js' ) {
538 $path_min = substr( $path_min , 0, -3 ) . '.min.js';
539 }
540 if ( substr( $path_min , -4 ) === '.css' ) {
541 $path_min = substr( $path_min , 0, -4 ) . '.min.css';
542 }
543 if ( file_exists( trailingslashit( WPBM_PLUGIN_DIR ) . ltrim( $path_min, '/\\' ) ) ) // check if this file exist
544 return trailingslashit( WPBM_PLUGIN_URL ) . ltrim( $path_min, '/\\' );
545 }
546 return trailingslashit( WPBM_PLUGIN_URL ) . ltrim( $path, '/\\' );
547 }
548
549 /** Check if such file exist or not.
550 *
551 * @param string $path - relative path to file (relative to plugin folder).
552 * @return boolean true | false
553 */
554 function wpbm_is_file_exist( $path ) {
555
556 if ( file_exists( trailingslashit( WPBM_PLUGIN_DIR ) . ltrim( $path, '/\\' ) ) ) // check if this file exist
557 return true;
558 else
559 return false;
560 }
561
562 /** Set URL from absolute to relative (starting from /)
563 *
564 * @param type $url
565 * @return type
566 */
567 function wpbm_set_relative_url( $url ){
568
569 $url = esc_url_raw($url);
570
571 $url_path = parse_url($url, PHP_URL_PATH);
572 $url_path = ( empty($url_path) ? $url : $url_path );
573
574 $url = trim($url_path, '/');
575 return '/' . $url;
576 }
577
578 /** Get Correct Relative URL
579 *
580 * @param type $link
581 * @return string
582 */
583 function wpbm_make_link_relative( $link ){
584
585 if ( $link == get_option('siteurl') )
586 $link = '/';
587 $link = '/' . trim( wp_make_link_relative( $link ), '/' );
588
589 return $link;
590 }
591
592 /** Get Correct Absolute URL
593 *
594 * @param string $link
595 * @return type
596 */
597 function wpbm_make_link_absolute( $link ){
598
599 if ( ( $link != get_option('siteurl') ) && ( strpos($link, 'http') !== 0 ) )
600 $link = get_option('siteurl') . '/' . trim( wp_make_link_relative( $link ), '/' );
601 return esc_js( $link ) ;
602 }
603
604
605 if (!function_exists ('get_file_data_wpdev')) {
606
607 /** Get header info from this file, just for compatibility with WordPress 2.8 and older versions
608 *
609 * @param type $file
610 * @param type $default_headers
611 * @param type $context
612 * @return type
613 */
614 function get_file_data_wpdev( $file, $default_headers, $context = '' ) {
615 // We don't need to write to the file, so just open for reading.
616 $fp = fopen( $file, 'r' );
617
618 // Pull only the first 8kiB of the file in.
619 $file_data = fread( $fp, 8192 );
620
621 // PHP will close file handle, but we are good citizens.
622 fclose( $fp );
623
624 if( $context != '' ) {
625 $extra_headers = array(); //apply_filters( "extra_$context".'_headers', array() );
626
627 $extra_headers = array_flip( $extra_headers );
628 foreach( $extra_headers as $key=>$value ) {
629 $extra_headers[$key] = $key;
630 }
631 $all_headers = array_merge($extra_headers, $default_headers);
632 } else {
633 $all_headers = $default_headers;
634 }
635
636 foreach ( $all_headers as $field => $regex ) {
637 preg_match( '/' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, ${$field});
638 if ( !empty( ${$field} ) )
639 ${$field} = trim(preg_replace("/\s*(?:\*\/|\?>).*/", '', ${$field}[1] ));
640 else
641 ${$field} = '';
642 }
643
644 $file_data = compact( array_keys( $all_headers ) );
645
646 return $file_data;
647 }
648 }
649
650
651 /** Get content from specific URL
652 *
653 * @param string $url
654 * @return string|boolean (false on error)
655 */
656 function wpbm_get_ssl_page_content( $url ) {
657
658 $request = new WP_Http();
659
660 $result = $request->request( $url
661 , array( // Default Parameters
662 // 'method' => 'GET',
663 // 'timeout' => 5, // timeout value for an HTTP request.
664 // 'redirection' => 5, // number of redirects allowed during an HTTP request.
665 // 'httpversion' => '1.0',
666 // 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ),
667 // 'reject_unsafe_urls' => false,
668 // 'blocking' => true,
669 // 'headers' => array(),
670 // 'cookies' => array(),
671 // 'body' => null,
672 // 'compress' => false,
673 // 'decompress' => true,
674 // 'sslverify' => true,
675 // 'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt',
676 // 'stream' => false,
677 // 'filename' => null,
678 // 'limit_response_size' => null
679 )
680 );
681
682 if (
683 ( ! is_wp_error( $result ) )
684 && ( $result[ 'response' ][ 'code' ] == '200' )
685 ) {
686
687 return $result[ 'body' ];
688
689 } else {
690
691 $error_message = $result->get_error_message();
692 do_action( 'wpbc_admin_show_top_notice', $error_message, 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
693 debuge($error_message); //FixIn: 2.0.1.3
694
695 return false;
696 }
697 }
698
699
700
701 /** Count the number of bytes of a given string.
702 * Input string is expected to be ASCII or UTF-8 encoded.
703 * Warning: the function doesn't return the number of chars
704 * in the string, but the number of bytes.
705 * See http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
706 * for information on UTF-8.
707 *
708 * @param string $str The string to compute number of bytes
709 *
710 * @return The length in bytes of the given string.
711 */
712 function wpbm_get_bytes_from_str( $str ) {
713 // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
714 // Number of characters in string
715 $strlen_var = strlen( $str );
716
717 $d = 0; // string bytes counter
718
719 // Iterate over every character in the string, escaping with a slash or encoding to UTF-8 where necessary
720 for ( $c = 0; $c < $strlen_var; ++ $c ) {
721 $ord_var_c = ord( $str{$c} );
722 switch ( true ) {
723 case(($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII)
724 $d ++;
725 break;
726 case(($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX
727 $d += 2;
728 break;
729 case(($ord_var_c & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX
730 $d += 3;
731 break;
732 case(($ord_var_c & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX
733 $d += 4;
734 break;
735 case(($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX
736 $d += 5;
737 break;
738 case(($ord_var_c & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X
739 $d += 6;
740 break;
741 default:
742 $d ++;
743 }
744 }
745 return $d;
746 }
747
748
749 // </editor-fold>
750
751
752 // <editor-fold defaultstate="collapsed" desc=" A d m i n M e n u L i n k s " >
753 ////////////////////////////////////////////////////////////////////////////
754 // A d m i n M e n u L i n k s
755 ////////////////////////////////////////////////////////////////////////////
756
757 /** Get URL to specific Admin Menu page
758 *
759 * @param string $menu_type - { item | add | resources | settings }
760 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
761 * @return string - URL to menu
762 */
763 function wpbm_get_menu_url( $menu_type, $is_absolute_url = true ) {
764
765 switch ( $menu_type) {
766
767 case 'master': // Master
768 $link = 'oplugins&tab=wpbm';
769 break;
770
771 case 'add': // Add New
772 case 'new': // Add New
773 $link = 'oplugins&wpbm-new';
774 break;
775
776 case 'settings': // Settings
777 case 'options':
778 $link = 'oplugins&tab=wpbm-settings';
779 break;
780
781 default: // Master
782 $link = 'oplugins';
783 break;
784 }
785
786 if ( $is_absolute_url ) {
787 $link = admin_url( 'admin.php' ) . '?page=' . $link ;
788 }
789
790 return $link;
791 }
792
793 // // // // // // // // // // // // // // // // // // // // // // // // // /
794
795 /** Get URL of item Listing or Calendar Overview page
796 *
797 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
798 * @param boolean $is_old - { default: true }
799 * @return string - URL to menu
800 */
801 function wpbm_get_master_url( $is_absolute_url = true ) {
802 return wpbm_get_menu_url( 'master', $is_absolute_url );
803 }
804
805 /** Get URL of item > Add item page
806 *
807 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
808 * @param boolean $is_old - { default: true }
809 * @return string - URL to menu
810 */
811 function wpbm_get_new_wpbm_url( $is_absolute_url = true ) {
812 return wpbm_get_menu_url( 'add', $is_absolute_url );
813 }
814
815 /** Get URL of item > Settings page
816 *
817 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
818 * @param boolean $is_old - { default: true }
819 * @return string - URL to menu
820 */
821 function wpbm_get_settings_url( $is_absolute_url = true ) {
822 return wpbm_get_menu_url( 'settings', $is_absolute_url );
823 }
824
825 // // // // // // // // // // // // // // // // // // // // // // // // // /
826
827 /** Check if this item Listing or Calendar Overview page
828 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
829 * @return boolean true | false
830 */
831 function wpbm_is_master_page( $server_param = 'REQUEST_URI' ) {
832
833 if ( ( is_admin() ) &&
834 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
835 ( strpos($_SERVER[ $server_param ],'tab=wpbm-') === false ) && // not the settings
836 ( ( strpos($_SERVER[ $server_param ],'tab=wpbm') !== false ) // tab specified
837 || ( strpos($_SERVER[ $server_param ],'tab=') === false ) ) // or tab not specified at all
838 ) {
839 return true;
840 }
841 return false;
842 }
843
844 /** Check if this item > Add item page
845 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
846 * @return boolean true | false
847 */
848 function wpbm_is_new_wpbm_page( $server_param = 'REQUEST_URI' ) {
849
850 if ( ( is_admin() ) &&
851 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
852 ( strpos($_SERVER[ $server_param ],'tab=wpbm-new') !== false )
853 ) {
854 return true;
855 }
856 return false;
857 }
858
859
860 /** Check if this item > Settings page
861 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
862 * @return boolean true | false
863 */
864 function wpbm_is_settings_page( $server_param = 'REQUEST_URI' ) {
865
866 if ( ( is_admin() ) &&
867 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
868 ( strpos($_SERVER[ $server_param ],'tab=wpbm-settings') !== false )
869 ) {
870 return true;
871 }
872 return false;
873 }
874
875 // </editor-fold>
876
877
878 // <editor-fold defaultstate="collapsed" desc=" A d m i n U I E l e m e n t s " >
879 ////////////////////////////////////////////////////////////////////////////
880 // A d m i n U I E l e m e n t s
881 ////////////////////////////////////////////////////////////////////////////
882
883 /** Get Number of new items
884 *
885 * @return int
886 */
887 function wpbm_get_number_new_items(){
888 return 0;
889 }
890
891
892 /** Show Admin B A R .
893 *
894 * @global type $wp_admin_bar
895 * @return type
896 */
897 function wp_admin_bar_items_menu(){
898
899 global $wp_admin_bar;
900
901 $current_user = wp_get_current_user();
902
903 $curr_user_role = get_wpbm_option( 'wpbm_user_role_master' );
904 $level = 10;
905 if ($curr_user_role == 'administrator') $level = 10;
906 else if ($curr_user_role == 'editor') $level = 7;
907 else if ($curr_user_role == 'author') $level = 2;
908 else if ($curr_user_role == 'contributor') $level = 1;
909 else if ($curr_user_role == 'subscriber') $level = 0;
910
911 if ( ( $current_user->user_level < $level ) || ! is_admin_bar_showing() )
912 return;
913
914
915 $update_count = wpbm_get_number_new_items(); // 0
916
917 $title = 'Booking Manager';
918 $update_title = $title;
919
920
921 if ( $update_count > 0 ) {
922 $update_count_title = "&nbsp;<span id='ab-updates' class='wpbm-count bk-update-count' >" . number_format_i18n($update_count) . "</span>" ; //id='wpbm-count'
923 $update_title .= $update_count_title;
924 }
925
926 $link_items = wpbm_get_master_url();
927 $link_settings = wpbm_get_settings_url();
928
929
930 $wp_admin_bar->add_menu(
931 array(
932 'id' => 'bar_wpbm',
933 'title' => $update_title ,
934 'href' => wpbm_get_master_url()
935 )
936 );
937
938
939 $curr_user_role_settings = get_wpbm_option( 'wpbm_user_role_settings' );
940 $level = 10;
941 if ($curr_user_role_settings == 'administrator') $level = 10;
942 else if ($curr_user_role_settings == 'editor') $level = 7;
943 else if ($curr_user_role_settings == 'author') $level = 2;
944 else if ($curr_user_role_settings == 'contributor') $level = 1;
945 else if ($curr_user_role_settings == 'subscriber') $level = 0;
946
947 if ( ( ($current_user->user_level < $level) ) || !is_admin_bar_showing() ) return;
948
949 $wp_admin_bar->add_menu(
950 array(
951 'id' => 'bar_wpbm_new',
952 'title' => __( 'Add New', 'booking-manager'),
953 'href' => wpbm_get_new_wpbm_url(),
954 'parent' => 'bar_wpbm',
955 )
956 );
957
958
959
960 $wp_admin_bar->add_menu(
961 array(
962 'id' => 'bar_wpbm_settings',
963 'title' => __( 'Settings', 'booking-manager'),
964 'href' => wpbm_get_settings_url(),
965 'parent' => 'bar_wpbm',
966 )
967 );
968
969 $wp_admin_bar->add_menu(
970 array(
971 'id' => 'bar_wpbm_settings_email',
972 'title' => __( 'Emails', 'booking-manager'),
973 'href' => $link_settings . '&tab=email',
974 'parent' => 'bar_wpbm_settings'
975 )
976 );
977
978 }
979 // add_action( 'admin_bar_menu', 'wp_admin_bar_items_menu', 70 ); // Add Admin Bar
980
981
982 /** Show Rating link at footer */
983 function wpbm_show_wpbm_footer(){
984
985 if ( ! wpbm_is_this_demo() ) {
986
987 $message = sprintf( __( 'If you like %s please leave us a %s rating. A huge thank you in advance!', 'booking-manager')
988 , '<strong>Booking Manager</strong>' . ' ' . WPBM_VERSION_NUM
989 , '<a href="https://wordpress.org/support/plugin/booking-manager/reviews/#new-post" target="_blank" title="' . esc_attr__( 'Thanks :)', 'booking-manager') . '">'
990 . '&#9733;&#9733;&#9733;&#9733;&#9733;'
991 . '</a>'
992 );
993
994 echo '<div id="wpbm-footer" style="position:absolute;bottom:40px;text-align:left;width:95%;font-size:0.9em;text-shadow:0 1px 0 #fff;margin:0;color:#888;">' . $message . '</div>';
995 ?>
996 <script type="text/javascript">
997 jQuery(document).ready(function(){
998 jQuery('#wpfooter').append( jQuery('#wpbm-footer') );
999 });
1000 </script>
1001 <?php
1002 }
1003 }
1004 // </editor-fold>
1005
1006
1007 // <editor-fold defaultstate="collapsed" desc=" DB - cheking if table, field or index exists " >
1008 ////////////////////////////////////////////////////////////////////////////
1009 // DB - cheking if table, field or index exists
1010 ////////////////////////////////////////////////////////////////////////////
1011
1012 /**
1013 * Check if table exist
1014 *
1015 * @global type $wpdb
1016 * @param string $tablename
1017 * @return 0|1
1018 */
1019 function wpbm_is_table_exists( $tablename ) {
1020
1021 global $wpdb;
1022
1023 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) )
1024 $tablename = $wpdb->prefix . $tablename ;
1025
1026 $sql_check_table = $wpdb->prepare("SHOW TABLES LIKE %s" , $tablename ); //FixIn 5.4.3
1027
1028 $res = $wpdb->get_results( $sql_check_table );
1029
1030 return count($res); //FixIn 5.4.3
1031 /*
1032 $sql_check_table = $wpdb->prepare("
1033 SELECT COUNT(*) AS count
1034 FROM information_schema.tables
1035 WHERE table_schema = '". DB_NAME ."'
1036 AND table_name = %s " , $tablename );
1037
1038 $res = $wpdb->get_results( $sql_check_table );
1039 return $res[0]->count;*/
1040 }
1041
1042
1043 /**
1044 * Check if table exist
1045 *
1046 * @global type $wpdb
1047 * @param string $tablename
1048 * @param type $fieldname
1049 * @return 0|1
1050 */
1051 function wpbm_is_field_in_table_exists( $tablename , $fieldname) {
1052 global $wpdb;
1053 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) ) $tablename = $wpdb->prefix . $tablename ;
1054 $sql_check_table = "SHOW COLUMNS FROM {$tablename}" ;
1055
1056 $res = $wpdb->get_results( $sql_check_table );
1057
1058 foreach ($res as $fld) {
1059 if ($fld->Field == $fieldname) return 1;
1060 }
1061
1062 return 0;
1063 }
1064
1065
1066 /**
1067 * Check if index exist
1068 *
1069 * @global type $wpdb
1070 * @param string $tablename
1071 * @param type $fieldindex
1072 * @return 0|1
1073 */
1074 function wpbm_is_index_in_table_exists( $tablename , $fieldindex) {
1075 global $wpdb;
1076 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) ) $tablename = $wpdb->prefix . $tablename ;
1077 $sql_check_table = $wpdb->prepare("SHOW INDEX FROM {$tablename} WHERE Key_name = %s", $fieldindex );
1078 $res = $wpdb->get_results( $sql_check_table );
1079 if (count($res)>0) return 1;
1080 else return 0;
1081 }
1082
1083 // </editor-fold>
1084
1085
1086 // <editor-fold defaultstate="collapsed" desc=" E s c a p i n g " >
1087 ////////////////////////////////////////////////////////////////////////////
1088 // E s c a p i n g
1089 ////////////////////////////////////////////////////////////////////////////
1090
1091 /** Transform the REQESTS parameters (GET and POST) into URL
1092 *
1093 * @param type $page_param
1094 * @param array $exclude_params
1095 * @param type $only_these_parameters
1096 * @return type
1097 */
1098 function wpbm_get_params_in_url( $page_param , $exclude_params = array(), $only_these_parameters = false, $is_escape_url = false, $only_get = false ){
1099
1100 $exclude_params[] = 'page';
1101
1102 if ( isset( $_GET['page'] ) )
1103 $page_param = $_GET['page'];
1104
1105 $get_paramaters = array( 'page' => $page_param );
1106
1107 if ( $only_get )
1108 $check_params = $_GET;
1109 else
1110 $check_params = $_REQUEST;
1111 //debuge($check_params);
1112 foreach ( $check_params as $prm_key => $prm_value ) {
1113
1114 // Skip parameters arrays, like $_GET['rvaluation_to'] = Array ( [0] => 6, [1] => 14, [2] => 14 )
1115 if (
1116 ( is_string( $prm_value ) )
1117 || ( is_numeric( $prm_value ) )
1118 ) {
1119
1120 if ( strlen( $prm_value ) > 1000 ) { // Check about TOOO long parameters, if it exist then reset it.
1121 $prm_value = '';
1122 }
1123
1124 if ( ! in_array( $prm_key, $exclude_params ) )
1125 if ( ( $only_these_parameters === false ) || ( in_array( $prm_key, $only_these_parameters ) ) )
1126 $get_paramaters[ $prm_key ] = $prm_value;
1127 }
1128 }
1129 //debuge($check_params, $get_paramaters, $exclude_params );
1130 $url = admin_url( add_query_arg( $get_paramaters , 'admin.php' ) );
1131
1132 if ( $is_escape_url )
1133 $url = esc_url( $url );
1134
1135 return $url;
1136
1137 /* // Old variant:
1138 if ( isset( $_GET['page'] ) ) $page_param = $_GET['page'];
1139
1140 $url_start = 'admin.php?page=' . $page_param . '&';
1141 $exclude_params[] = 'page';
1142 foreach ( $_REQUEST as $prm_key => $prm_value ) {
1143
1144 if ( !in_array( $prm_key, $exclude_params ) )
1145 if ( ($only_these_parameters === false) || ( in_array( $prm_key, $only_these_parameters ) ) )
1146
1147 $url_start .= $prm_key . '=' . $prm_value . '&';
1148
1149 }
1150 $url_start = substr( $url_start, 0, -1 );
1151
1152 return $url_start;
1153 */
1154 }
1155
1156
1157 /** Clean Request Parameters
1158 *
1159 */
1160 function wpbm_check_request_paramters() {
1161
1162 $clean_params = array();
1163
1164 $clean_params[ 'wh_wpbm_id' ] = 'digit_or_csd'; // '0' | '1' | ''
1165 $clean_params[ 'wh_wpbm_date' ] = 'digit_or_date'; // number | date 2016-07-20
1166 $clean_params[ 'wh_wpbm_datenext' ] = 'd'; // '1' | '2' ....
1167 $clean_params[ 'wh_pay_statuscustom' ] = 's'; //string !!! LIKE !!!
1168 $clean_params[ 'wh_pay_status' ] = array( 'all', 'group_ok', 'group_unknown', 'group_pending', 'group_failed' );
1169
1170 foreach ( $clean_params as $request_key => $clean_type ) {
1171
1172 // elements only listed in array::
1173 if ( is_array( $clean_type ) ) { // check only values from the list in this array
1174
1175 if ( ( isset( $_REQUEST[ $request_key ] ) ) && ( ! in_array( $_REQUEST[ $request_key ], $clean_type ) ) )
1176 $clean_type = 's';
1177 else
1178 $clean_type = 'checked_skip_it';
1179 }
1180
1181 switch ( $clean_type ) {
1182
1183 case 'checked_skip_it':
1184
1185 break;
1186
1187 case 'digit_or_date': // digit or comma separated digit
1188 if ( isset( $_REQUEST[ $request_key ] ) )
1189 $_REQUEST[ $request_key ] = wpbm_clean_digit_or_date( $_REQUEST[ $request_key ] ); // nums
1190
1191 break;
1192
1193 case 'digit_or_csd': // digit or comma separated digit
1194 if ( isset( $_REQUEST[ $request_key ] ) )
1195 $_REQUEST[ $request_key ] = wpbm_clean_digit_or_csd( $_REQUEST[ $request_key ] ); // nums
1196
1197 break;
1198
1199 case 's': // string
1200 if ( isset( $_REQUEST[ $request_key ] ) )
1201 $_REQUEST[ $request_key ] = wpbm_clean_like_string_for_db( $_REQUEST[ $request_key ] );
1202
1203 break;
1204
1205 case 'd': // digit
1206 if ( isset( $_REQUEST[ $request_key ] ) )
1207 if ( $_REQUEST[ $request_key ] !== '' )
1208 $_REQUEST[ $request_key ] = intval( $_REQUEST[ $request_key ] );
1209
1210 break;
1211
1212 default:
1213 if ( isset( $_REQUEST[ $request_key ] ) ) {
1214 $_REQUEST[ $request_key ] = intval( $_REQUEST[ $request_key ] );
1215 }
1216 break;
1217 }
1218
1219
1220 }
1221
1222 }
1223
1224
1225 /** Check paramter if it number or comma separated list of numbers
1226 *
1227 * @global type $wpdb
1228 * @param string $value
1229 * @return string
1230 *
1231 * Exmaple:
1232 wpbm_clean_digit_or_csd( '12,a,45,9' ) => '12,0,45,9'
1233 * or
1234 wpbm_clean_digit_or_csd( '10a' ) => '10
1235 * or
1236 wpbm_clean_digit_or_csd( array( '12,a,45,9', '10a' ) ) => array ( '12,0,45,9', '10' )
1237 */
1238 function wpbm_clean_digit_or_csd( $value ) { //FixIn:6.2.1.4
1239
1240 if ( $value === '' ) return $value;
1241
1242
1243 if ( is_array( $value ) ) {
1244 foreach ( $value as $key => $check_value ) {
1245 $value[ $key ] = wpbm_clean_digit_or_csd( $check_value );
1246 }
1247 return $value;
1248 }
1249
1250
1251 global $wpdb;
1252
1253 $value = str_replace( ';', ',', $value );
1254
1255 $array_of_nums = explode(',', $value);
1256
1257 $result = array();
1258 foreach ($array_of_nums as $check_element) {
1259 $result[] = $wpdb->prepare( "%d", $check_element );
1260 }
1261 $result = implode(',', $result );
1262 return $result;
1263 }
1264
1265
1266 /** Cehck about Valid date, like 2016-07-20 or digit
1267 *
1268 * @param string $value
1269 * @return string or int
1270 */
1271 function wpbm_clean_digit_or_date( $value ) { //FixIn:6.2.1.4
1272
1273 if ( $value === '' ) return $value;
1274
1275 if ( preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $value ) ) {
1276
1277 return $value; // Date is valid in format: 2016-07-20
1278 } else {
1279 return intval( $value );
1280 }
1281
1282 }
1283
1284
1285 /** Check $value for injection here
1286 *
1287 * @param type $value
1288 * @return type
1289 */
1290 function wpbm_clean_parameter( $value ) {
1291
1292 $value = preg_replace( '/<[^>]*>/', '', $value ); // clean any tags
1293 $value = str_replace( '<', ' ', $value );
1294 $value = str_replace( '>', ' ', $value );
1295 $value = strip_tags( $value );
1296
1297 // Clean SQL injection
1298 $value = esc_sql( $value );
1299
1300 return $value;
1301 }
1302
1303
1304 function wpbm_esc_like( $value_trimmed ) {
1305
1306 global $wpdb;
1307 if ( method_exists( $wpdb ,'esc_like' ) )
1308 return $wpdb->esc_like( $value_trimmed ); // Its require minimum WP 4.0.0
1309 else
1310 return addcslashes( $value_trimmed, '_%\\' ); // Direct implementation from $wpdb->esc_like(
1311 }
1312
1313
1314 /** Clean user string for using in SQL LIKE statement - append to LIKE sql
1315 *
1316 * @param string $value - to clean
1317 * @return string - escaped
1318 * Exmaple:
1319 * $search_escaped_like_title = wpbm_clean_like_string_for_append_in_sql_for_db( $input_var );
1320 *
1321 * $where_sql = " WHERE title LIKE ". $search_escaped_like_title ." ";
1322 */
1323 function wpbm_clean_like_string_for_append_in_sql_for_db( $value ) {
1324 global $wpdb;
1325
1326 $value_trimmed = trim( stripslashes( $value ) );
1327 $wild = '%';
1328 $like = $wild . wpbm_esc_like( $value_trimmed ) . $wild;
1329 $sql = $wpdb->prepare( "'%s'", $like );
1330
1331 return $sql;
1332
1333
1334 /* Help:
1335 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
1336 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
1337 *
1338 * Example Prepared Statement:
1339 *
1340 * $wild = '%';
1341 * $find = 'only 43% of planets';
1342 * $like = $wild . wpbm_esc_like( $find ) . $wild;
1343 * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE '%s'", $like );
1344 *
1345 * Example Escape Chain:
1346 *
1347 * $sql = esc_sql( wpbm_esc_like( $input ) );
1348 */
1349
1350 }
1351
1352
1353 /** Clean string for using in SQL LIKE requests inside single quotes: WHERE title LIKE '%". $escaped_search_title ."%'
1354 * Replaced _ to \_ % to \% \ to \\
1355 * @param string $value - to clean
1356 * @return string - escaped
1357 * Exmaple:
1358 * $search_escaped_like_title = wpbm_clean_like_string_for_db( $input_var );
1359 *
1360 * $where_sql = " WHERE title LIKE '%". $search_escaped_like_title ."%' ";
1361 *
1362 * Important! Use SINGLE quotes after in SQL query: LIKE '%".$data."%'
1363 */
1364 function wpbm_clean_like_string_for_db( $value ){
1365
1366 global $wpdb;
1367
1368 $value_trimmed = trim( stripslashes( $value ) );
1369
1370 $value_trimmed = wpbm_esc_like( $value_trimmed );
1371
1372 $value = trim( $wpdb->prepare( "'%s'", $value_trimmed ) , "'" );
1373
1374 return $value;
1375
1376 /* Help:
1377 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
1378 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
1379 *
1380 * Example Prepared Statement:
1381 *
1382 * $wild = '%';
1383 * $find = 'only 43% of planets';
1384 * $like = $wild . wpbm_esc_like( $find ) . $wild;
1385 * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE '%s'", $like );
1386 *
1387 * Example Escape Chain:
1388 *
1389 * $sql = esc_sql( wpbm_esc_like( $input ) );
1390 */
1391 }
1392
1393
1394 /** Escape string from SQL for the HTML form field
1395 *
1396 * @param string $value
1397 * @return string
1398 *
1399 * Used: esc_sql function.
1400 *
1401 * https://codex.wordpress.org/Function_Reference/esc_sql
1402 * Note: Be careful to use this function correctly. It will only escape values to be used in strings in the query.
1403 * That is, it only provides escaping for values that will be within quotes in the SQL (as in field = '{$escaped_value}').
1404 * If your value is not going to be within quotes, your code will still be vulnerable to SQL injection.
1405 * For example, this is vulnerable, because the escaped value is not surrounded by quotes in the SQL query:
1406 * ORDER BY {$escaped_value}. As such, this function does not escape unquoted numeric values, field names, or SQL keywords.
1407 *
1408 */
1409 function wpbm_clean_string_for_form( $value ){
1410
1411 global $wpdb;
1412
1413 $value_trimmed = trim( stripslashes( $value ) );
1414
1415 $esc_sql_value = esc_sql( $value_trimmed );
1416
1417 //$value = trim( $wpdb->prepare( "'%s'", $esc_sql_value ) , "'" );
1418
1419 $esc_sql_value = trim( stripslashes( $esc_sql_value ) );
1420
1421 return $esc_sql_value;
1422
1423 }
1424 // </editor-fold>
1425
1426
1427 // <editor-fold defaultstate="collapsed" desc=" U s e r s " >
1428 ////////////////////////////////////////////////////////////////////////////////
1429 // U s e r s
1430 ////////////////////////////////////////////////////////////////////////////////
1431
1432 /** Get ID of active user
1433 *
1434 * @return type
1435 */
1436 function get_wpbm_current_user_id() {
1437 $user = wp_get_current_user();
1438 return ( isset( $user->ID ) ? (int) $user->ID : 0 );
1439 }
1440
1441
1442 /** Check if Current User have specific Role
1443 *
1444 * @return bool Whether the current user has the given capability.
1445 */
1446 function wpbm_is_current_user_have_this_role( $user_role ) {
1447
1448 if ( $user_role == 'administrator' ) $user_role = 'activate_plugins';
1449 if ( $user_role == 'editor' ) $user_role = 'publish_pages';
1450 if ( $user_role == 'author' ) $user_role = 'publish_posts';
1451 if ( $user_role == 'contributor' ) $user_role = 'edit_posts';
1452 if ( $user_role == 'subscriber') $user_role = 'read';
1453
1454 return current_user_can( $user_role );
1455 }
1456
1457
1458 function wpbm_get_user_ip() {
1459 //return '84.243.195.114' ; // Test //90.36.89.174
1460 if (isset($_SERVER['HTTP_CLIENT_IP'])) {
1461 $userIP = $_SERVER['HTTP_CLIENT_IP'] ;
1462 } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
1463 $userIP = $_SERVER['HTTP_X_FORWARDED_FOR'] ;
1464 } elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
1465 $userIP = $_SERVER['HTTP_X_FORWARDED'] ;
1466 } elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
1467 $userIP = $_SERVER['HTTP_FORWARDED_FOR'] ;
1468 } elseif (isset($_SERVER['HTTP_FORWARDED'])) {
1469 $userIP = $_SERVER['HTTP_FORWARDED'] ;
1470 } elseif (isset($_SERVER['REMOTE_ADDR'])) {
1471 $userIP = $_SERVER['REMOTE_ADDR'] ;
1472 } else {
1473 $userIP = "" ;
1474 }
1475
1476 $userIP = explode( ',', $userIP );
1477 $userIP = array_map( 'trim', $userIP );
1478
1479 return $userIP[0] ;
1480 }
1481 add_wpbm_filter( 'wpbm_get_user_ip', 'wpbm_get_user_ip' );
1482 // </editor-fold>
1483
1484
1485 // <editor-fold defaultstate="collapsed" desc=" Mesages for Admin panel " >
1486 ////////////////////////////////////////////////////////////////////////////////
1487 // Mesages for Admin panel
1488 ////////////////////////////////////////////////////////////////////////////////
1489
1490 function wpbm_show_fixed_message( $message, $time_to_show , $message_type = 'updated' , $notice_id = 0, $is_dismissible = false ) {
1491
1492 // Generate unique HTML ID for the message
1493 if ( $notice_id == 0 )
1494 $notice_id = intval( time() * rand(10, 100) );
1495
1496 $notice_id = 'wpbm_system_notice_' . $notice_id;
1497
1498 $is_dismissible = false;
1499
1500 if (
1501 ( ( $is_dismissible ) && ( ! wpbm_section_is_dismissed( $notice_id ) ) )
1502 || ( ! $is_dismissible )
1503 // || true
1504 ){
1505
1506 ?><div id="<?php echo $notice_id; ?>"
1507 class="wpbm_system_notice wpbm_is_dismissible wpbm_is_hideable <?php echo $message_type; ?>"
1508 data-nonce="<?php echo wp_create_nonce( $nonce_name = $notice_id . '_wpbmnonce' ); ?>"
1509 data-user-id="<?php echo get_current_user_id(); ?>"
1510 ><?php
1511
1512 wpbm_x_dismiss_button();
1513
1514 echo $message;
1515
1516 ?></div><?php
1517
1518 // Get the time of message showing
1519 $time_to_show = intval( $time_to_show ) * 1000;
1520
1521 if ( $time_to_show > 0 ) {
1522 ?> <script type="text/javascript">
1523 jQuery('#<?php echo $notice_id; ?>').animate({opacity: 1},<?php echo $time_to_show; ?>).fadeOut( 2000 );
1524 </script> <?php
1525 }
1526 }
1527 }
1528
1529
1530 /** Show Ajax message at the top of page
1531 *
1532 * @param type $message
1533 * @param type $time_to_show
1534 * @param type $is_error
1535 */
1536 function wpbm_show_ajax_message( $message, $time_to_show = 3000, $is_error = false ) {
1537
1538 // Recheck for any "lang" shortcodes for replacing to correct language
1539 $message = apply_wpbm_filter('wpbm_check_for_active_language', $message );
1540
1541 // Escape any JavaScript from message
1542 $notice = html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1543
1544 ?><script type="text/javascript">
1545 var my_message = '<?php echo $notice; ?>';
1546 wpbm_admin_show_message( my_message, '<?php echo ( $is_error ? 'error' : 'success' ); ?>', <?php echo $time_to_show; ?> );
1547 </script><?php
1548 }
1549
1550
1551 /** Show "Saved Changes" message at the top of settings page.
1552 *
1553 */
1554 function wpbm_show_changes_saved_message() {
1555 wpbm_show_message ( __('Changes saved.', 'booking-manager'), 5 );
1556 }
1557
1558
1559 /** Show Message at Top of Admin Pages
1560 *
1561 * @param type $message - mesage to show
1562 * @param type $time_to_show - number of seconds to show, if 0 or skiped, then unlimited time.
1563 * @param type $message_type - Default: updated { updated | error | notice }
1564 */
1565 function wpbm_show_message ( $message, $time_to_show , $message_type = 'updated') {
1566
1567 // Generate unique HTML ID for the message
1568 $inner_message_id = intval( time() * rand(10, 100) );
1569
1570 // Get formated HTML message
1571 $notice = wpbm_get_formated_message( $message, $message_type, $inner_message_id );
1572
1573 // Get the time of message showing
1574 $time_to_show = intval( $time_to_show ) * 1000;
1575
1576 // Show this Message
1577 ?> <script type="text/javascript">
1578 if ( jQuery('.wpbm_admin_message').length ) {
1579 jQuery('.wpbm_admin_message').append( '<?php echo $notice; ?>' );
1580 <?php if ( $time_to_show > 0 ) { ?>
1581 jQuery('#wpbm_inner_message_<?php echo $inner_message_id; ?>').animate({opacity: 1},<?php echo $time_to_show; ?>).fadeOut( 2000 );
1582 <?php } ?>
1583 }
1584 </script> <?php
1585 }
1586
1587
1588 /** Escape and prepare message to show it
1589 *
1590 * @param type $message - message
1591 * @param type $message_type - Default: updated { updated | error | notice }
1592 * @param string $inner_message_id - ID of message DIV, can be skipped
1593 * @return string
1594 */
1595 function wpbm_get_formated_message ( $message, $message_type = 'updated', $inner_message_id = '') {
1596
1597
1598 // Recheck for any "lang" shortcodes for replacing to correct language
1599 $message = apply_wpbm_filter('wpbm_check_for_active_language', $message );
1600
1601 // Escape any JavaScript from message
1602 $notice = html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1603
1604 $notice .= '<a class="close tooltip_left" rel="tooltip" title="'. esc_js(__("Hide", 'booking-manager')). '" data-dismiss="alert" href="javascript:void(0)" onclick="javascript:jQuery(this).parent().hide();">&times;</a>';
1605
1606 if (! empty( $inner_message_id ))
1607 $inner_message_id = 'id="wpbm_inner_message_'. $inner_message_id .'"';
1608
1609 $notice = '<div '.$inner_message_id.' class="wpbm_inner_message '. $message_type . '">' . $notice . '</div>';
1610
1611 return $notice;
1612 }
1613
1614
1615 /** Show system info in settings page
1616 *
1617 * @param string $message ...
1618 * @param string $message_type 'info' | 'warning' | 'error'
1619 * @param string $title __('Important!' , 'booking-manager') | __('Note' , 'booking-manager')
1620 *
1621 * Exmaple: wpbm_show_message_in_settings( __( 'Nothing Found', 'booking-manager'), 'warning', __('Important!' , 'booking-manager') );
1622 */
1623 function wpbm_show_message_in_settings( $message, $message_type = 'info', $title = '' , $is_echo = true ) {
1624
1625 $message_content = '';
1626
1627 $message_content .= '<div class="clear"></div>';
1628
1629 $message_content .= '<div class="wpbm-settings-notice notice-' . $message_type . '" style="text-align:left;">';
1630
1631 if ( ! empty( $title ) )
1632 $message_content .= '<strong>' . esc_js( $title ) . '</strong> ';
1633
1634 $message_content .= html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1635
1636 $message_content .= '</div>';
1637
1638 $message_content .= '<div class="clear"></div>';
1639
1640 if ( $is_echo )
1641 echo $message_content;
1642 else
1643 return $message_content;
1644
1645 }
1646 // </editor-fold>
1647
1648
1649 // <editor-fold defaultstate="collapsed" desc=" Settings Meta Boxes " >
1650 ////////////////////////////////////////////////////////////////////////////////
1651 // Settings Meta Boxes
1652 ////////////////////////////////////////////////////////////////////////////////
1653 function wpbm_open_meta_box_section( $metabox_id, $title ) {
1654
1655 $my_close_open_win_id = $metabox_id . '_metabox';
1656 ?>
1657 <div class='meta-box'>
1658 <div
1659 id="<?php echo $my_close_open_win_id; ?>"
1660 class="postbox <?php if ( '1' == get_user_option( 'wpbm_win_' . $my_close_open_win_id ) ) echo 'closed'; ?>"
1661 > <div title="<?php _e('Click to toggle', 'booking-manager'); ?>"
1662 class="handlediv"
1663 onclick="javascript:wpbm_verify_window_opening(<?php echo get_wpbm_current_user_id(); ?>, '<?php echo $my_close_open_win_id; ?>');"
1664 ><br/></div>
1665 <h3 class='hndle'>
1666 <span><?php echo wp_kses_post( $title ); ?></span>
1667 </h3>
1668 <div class="inside">
1669 <?php
1670 }
1671
1672 function wpbm_close_meta_box_section() {
1673 ?>
1674 </div>
1675 </div>
1676 </div>
1677 <?php
1678 }
1679 // </editor-fold>
1680
1681
1682 // from Toolbar
1683 // <editor-fold defaultstate="collapsed" desc=" M o d a l s " >
1684 ////////////////////////////////////////////////////////////////////////////////
1685 // M o d a l s
1686 ////////////////////////////////////////////////////////////////////////////////
1687
1688 /** Start Loyouts - Modal Window structure */
1689 function wpbm_write_content_for_modals_start_here() {
1690
1691 ?><span id="wpbm_content_for_modals"></span><?php
1692 }
1693 add_wpbm_action( 'wpbm_write_content_for_modals', 'wpbm_write_content_for_modals_start_here');
1694 // </editor-fold>
1695
1696
1697 // <editor-fold defaultstate="collapsed" desc=" Inline JavaScript " >
1698 ////////////////////////////////////////////////////////////////////////////////
1699 // Inline J a v a S c r i p t to Footer page
1700 ////////////////////////////////////////////////////////////////////////////////
1701 /**
1702 * Queue JavaScript for later output at footer
1703 *
1704 * @param string $code
1705 */
1706 function wpbm_enqueue_js( $code ) {
1707 global $wpbm_queued_js;
1708
1709 if ( empty( $wpbm_queued_js ) ) {
1710 $wpbm_queued_js = '';
1711 }
1712
1713 $wpbm_queued_js .= "\n" . $code . "\n";
1714 }
1715
1716
1717 /**
1718 * Output any queued javascript code in the footer.
1719 */
1720 function wpbm_print_js() {
1721
1722 global $wpbm_queued_js;
1723
1724 if ( ! empty( $wpbm_queued_js ) ) {
1725
1726 echo "<!-- WPBM JavaScript -->\n<script type=\"text/javascript\">\njQuery(function($) {";
1727
1728 $wpbm_queued_js = wp_check_invalid_utf8( $wpbm_queued_js );
1729
1730 $wpbm_queued_js = wp_specialchars_decode( $wpbm_queued_js , ENT_COMPAT); // Converts double quotes '&quot;' => '"'
1731
1732 $wpbm_queued_js = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", $wpbm_queued_js );
1733 $wpbm_queued_js = str_replace( "\r", '', $wpbm_queued_js );
1734
1735 echo $wpbm_queued_js . "});\n</script>\n<!-- End WPBM JavaScript -->\n";
1736
1737 $wpbm_queued_js = '';
1738 unset( $wpbm_queued_js );
1739 }
1740 }
1741
1742 // </editor-fold>
1743
1744 // from Toolbar
1745 // <editor-fold defaultstate="collapsed" desc=" JS & CSS - Tooltips & Popover" >
1746 ////////////////////////////////////////////////////////////////////////////////
1747 // JS & CSS
1748 ////////////////////////////////////////////////////////////////////////////////
1749
1750 /** Load suport JavaScript for "Items" page*/
1751 function wpbm_js_for_items_page() {
1752
1753 $is_use_hints = get_wpbm_option( 'wpbm_is_use_hints_at_admin_panel' );
1754 if ( $is_use_hints == 'On' )
1755 wpbm_bs_javascript_tooltips(); // JS Tooltips
1756
1757 wpbm_bs_javascript_popover(); // JS Popover
1758
1759 //wpbm_datepicker_js(); // JS Datepicker
1760 wpbm_datepicker_css(); // CSS DatePicker
1761 }
1762
1763
1764 /** Datepicker activation JavaScript */
1765 function wpbm_datepicker_js() {
1766
1767 ?><script type="text/javascript">
1768 jQuery(document).ready( function(){
1769
1770 function applyCSStoDays( date ){
1771 return [true, 'date_available'];
1772 }
1773 jQuery('input.wpbm-filters-section-calendar').datepick(
1774 { beforeShowDay: applyCSStoDays,
1775 showOn: 'focus',
1776 multiSelect: 0,
1777 numberOfMonths: 1,
1778 stepMonths: 1,
1779 prevText: '&laquo;',
1780 nextText: '&raquo;',
1781 dateFormat: 'yy-mm-dd',
1782 changeMonth: false,
1783 changeYear: false,
1784 minDate: null,
1785 maxDate: null, //'1Y',
1786 showStatus: false,
1787 multiSeparator: ', ',
1788 closeAtTop: false,
1789 // firstDay:<?php //echo get_wpbm_option( 'wpbm_start_day_weeek' ); ?>,
1790 gotoCurrent: false,
1791 hideIfNoPrevNext:true,
1792 useThemeRoller :false,
1793 mandatory: true
1794 }
1795 );
1796 });
1797 </script><?php
1798 }
1799
1800
1801 /** Support CSS - datepick, etc... */
1802 function wpbm_datepicker_css(){
1803 ?>
1804 <style type="text/css">
1805 #datepick-div .datepick-header {
1806 width: 172px !important;
1807 }
1808 #datepick-div {
1809 -border-radius: 3px;
1810 -box-shadow: 0 0 2px #888888;
1811 -webkit-border-radius: 3px;
1812 -webkit-box-shadow: 0 0 2px #888888;
1813 -moz-border-radius: 3px;
1814 -moz-box-shadow: 0 0 2px #888888;
1815 width: 172px !important;
1816 }
1817 #datepick-div .datepick .datepick-days-cell a{
1818 font-size: 12px;
1819 }
1820 #datepick-div table.datepick tr td {
1821 border-top: 0 none !important;
1822 line-height: 24px;
1823 padding: 0 !important;
1824 width: 24px;
1825 }
1826 #datepick-div .datepick-control {
1827 font-size: 10px;
1828 text-align: center;
1829 }
1830 #datepick-div .datepick-one-month {
1831 height: auto;
1832 }
1833 </style>
1834 <?php
1835 }
1836
1837
1838 /** Sortable Table JavaScript */
1839 function wpbm_sortable_js() {
1840 ?>
1841 <script type="text/javascript">
1842 // Activate Sortable Functionality
1843 jQuery( document ).ready(function(){
1844
1845 jQuery('.wpbm_input_table tbody th').css('cursor','move');
1846
1847 jQuery('.wpbm_input_table tbody td.sort').css('cursor','move');
1848
1849 jQuery('.wpbm_input_table.sortable tbody').sortable({
1850 items:'tr',
1851 cursor:'move',
1852 axis:'y',
1853 scrollSensitivity:40,
1854 forcePlaceholderSize: true,
1855 helper: 'clone',
1856 opacity: 0.65,
1857 placeholder: '.wpbm_sortable_table .sort',
1858 start:function(event,ui){
1859 ui.item.css('background-color','#f6f6f6');
1860 },
1861 stop:function(event,ui){
1862 ui.item.removeAttr('style');
1863 }
1864 });
1865 });
1866 </script>
1867 <?php
1868
1869 }
1870 // </editor-fold>
1871
1872
1873 // <editor-fold defaultstate="collapsed" desc=" R e l o a d p a g e " >
1874 ////////////////////////////////////////////////////////////////////////////////
1875 // R e l o a d p a g e
1876 ////////////////////////////////////////////////////////////////////////////////
1877 /**
1878 * Reload page by using JavaScript
1879 *
1880 * @param string $url - URL of page to load
1881 */
1882 function wpbm_reload_page_by_js( $url ) {
1883
1884 $redir = html_entity_decode( esc_url( $url ) );
1885
1886 if ( ! empty( $redir ) ) {
1887 ?>
1888 <script type="text/javascript">
1889 window.location.href = '<?php echo $redir ?>';
1890 </script>
1891 <?php
1892 }
1893 }
1894
1895
1896 /** Redirect browser to a specific page
1897 *
1898 * @param string $url - URL of page to redirect
1899 */
1900 function wpbm_redirect( $url ) {
1901
1902 $url = wpbm_make_link_absolute( $url );
1903
1904 $url = html_entity_decode( esc_url( $url ) );
1905
1906 echo '<script type="text/javascript">';
1907 echo 'window.location.href="'.$url.'";';
1908 echo '</script>';
1909 echo '<noscript>';
1910 echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
1911 echo '</noscript>';
1912 }
1913 // </editor-fold>
1914
1915
1916 // <editor-fold defaultstate="collapsed" desc=" P a g i n a t i o n o f T a b l e L i s t i n g " >
1917 /** Show P a g i n a t i o n
1918 *
1919 * @param int $summ_number_of_items - total number of items
1920 * @param int $active_page_num - number of activated page
1921 * @param int $num_items_per_page - number of items per page
1922 * @param array $only_these_parameters - array of keys to exclude from links
1923 * @param string $url_sufix - usefule for anchor to HTML section with specific ID, Example: '#my_section'
1924 */
1925 function wpbm_show_pagination( $summ_number_of_items, $active_page_num, $num_items_per_page , $only_these_parameters = false, $url_sufix = '' ) {
1926
1927 if ( empty( $num_items_per_page ) ) {
1928 $num_items_per_page = '10';
1929 }
1930
1931 $pages_number = ceil( $summ_number_of_items / $num_items_per_page );
1932 if ( $pages_number < 2 )
1933 return;
1934
1935 //Fix: 5.1.4 - Just in case we are having tooo much resources, then we need to show all resources - and its empty string
1936 if ( ( isset($_REQUEST['wh_wpbm_type'] ) ) && ( strlen($_REQUEST['wh_wpbm_type']) > 1000 ) ) {
1937 $_REQUEST['wh_wpbm_type'] = '';
1938 }
1939
1940 // First parameter will overwriten by $_GET['page'] parameter
1941 $bk_admin_url = wpbm_get_params_in_url( wpbm_get_master_url( false ), array('page_num'), $only_these_parameters );
1942
1943
1944 ?>
1945 <span class="wpdevelop wpbm-pagination">
1946 <div class="container-fluid">
1947 <div class="row">
1948 <div class="col-sm-12 text-center control-group0">
1949 <nav class="btn-toolbar">
1950 <div class="btn-group wpbm-no-margin" style="float:none;">
1951
1952 <?php if ( $pages_number > 1 ) { ?>
1953 <a class="button button-secondary <?php echo ( $active_page_num == 1 ) ? ' disabled' : ''; ?>"
1954 href="<?php echo $bk_admin_url; ?>&page_num=<?php if ($active_page_num == 1) { echo $active_page_num; } else { echo ($active_page_num-1); } echo $url_sufix; ?>">
1955 <?php _e('Prev', 'booking-manager'); ?>
1956 </a>
1957 <?php }
1958
1959 /** Number visible pages (links) that linked to active page, other pages skipped by "..." */
1960 $num_closed_steps = 3;
1961
1962 for ( $pg_num = 1; $pg_num <= $pages_number; $pg_num++ ) {
1963
1964 if ( ! (
1965 ( $pages_number > ( $num_closed_steps * 4) )
1966 && ( $pg_num > $num_closed_steps )
1967 && ( ( $pages_number - $pg_num + 1 ) > $num_closed_steps )
1968 && ( abs( $active_page_num - $pg_num ) > $num_closed_steps )
1969 ) ) {
1970 ?> <a class="button button-secondary <?php if ($pg_num == $active_page_num ) echo ' active'; ?>"
1971 href="<?php echo $bk_admin_url; ?>&page_num=<?php echo $pg_num; echo $url_sufix; ?>">
1972 <?php echo $pg_num; ?>
1973 </a><?php
1974
1975 if ( ( $pages_number > ( $num_closed_steps * 4) )
1976 && ( ($pg_num+1) > $num_closed_steps )
1977 && ( ( $pages_number - ( $pg_num + 1 ) ) > $num_closed_steps )
1978 && ( abs($active_page_num - ( $pg_num + 1 ) ) > $num_closed_steps )
1979 ) {
1980 echo ' <a class="button button-secondary disabled" href="javascript:void(0);">...</a> ';
1981 }
1982 }
1983 }
1984
1985 if ( $pages_number > 1 ) { ?>
1986 <a class="button button-secondary <?php echo ( $active_page_num == $pages_number ) ? ' disabled' : ''; ?>"
1987 href="<?php echo $bk_admin_url; ?>&page_num=<?php if ($active_page_num == $pages_number) { echo $active_page_num; } else { echo ($active_page_num+1); } echo $url_sufix; ?>">
1988 <?php _e('Next', 'booking-manager'); ?>
1989 </a>
1990 <?php } ?>
1991
1992 </div>
1993 </nav>
1994 </div>
1995 </div>
1996 </div>
1997 </span>
1998 <?php
1999 }
2000 // </editor-fold>
2001
2002
2003 // <editor-fold defaultstate="collapsed" desc=" D a t e s " >
2004 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2005 // Dates Format
2006 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2007
2008
2009 /** Get Formated Date & time
2010 *
2011 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2012 * @param string $date_format - Optional. - "m / d / Y, D H:i:s"
2013 * @param string $seperator - Optional. - " "
2014 * @return string - July 29, 2014 12:00 am
2015 */
2016 function wpbm_get_date_time_formatted( $date_sql, $date_format = false, $seperator = ' ', $skip_midnight_time = false ) {
2017
2018 $return_date = wpbm_get_date_formatted( $date_sql, $date_format );
2019
2020 $return_time = wpbm_get_time_formatted( $date_sql, $date_format, $skip_midnight_time );
2021 if ( ! empty( $return_time ) )
2022 $return_date .= $seperator . $return_time;
2023
2024 return $return_date;
2025 }
2026
2027
2028 /** Get Formated Date
2029 *
2030 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2031 * @param string $date_format - Optional. - "m / d / Y, D"
2032 * @param bool $skip_midnight_time - Default false - if 00:00:00 then return '';
2033 * @return string - July 29, 2014
2034 */
2035 function wpbm_get_date_formatted( $date_sql, $date_format = false ) {
2036
2037 if ( $date_format === false ) $date_format = get_wpbm_option( 'wpbm_date_format' );
2038 if ( empty( $date_format ) ) $date_format = "m / d / Y, D";
2039
2040 $formated_date = date_i18n( $date_format, strtotime( $date_sql ) );
2041
2042 return $formated_date;
2043 }
2044
2045
2046 /** Get Formated Date & time
2047 *
2048 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2049 * @param string $time_format - Optional. - "H:i:s"
2050 * @return string - 12:00 am
2051 */
2052 function wpbm_get_time_formatted( $date_sql, $time_format = false , $skip_midnight_time = false ) {
2053
2054 if ( ( $skip_midnight_time ) && ( '00:00:00' == substr( $date_sql, -8 ) ) )
2055 return '';
2056
2057 if ( $time_format === false ) $time_format = get_wpbm_option( 'wpbm_time_format' );
2058 if ( empty( $time_format ) ) $time_format = 'h:i a';
2059
2060 $formated_date = date_i18n( $time_format, strtotime( $date_sql ) );
2061
2062 return $formated_date;
2063 }
2064
2065
2066 /** Check if "current_day" is tomorrow from "next_day"
2067 *
2068 * @param string $current_day_sql_check : 2015-02-29 00:00:00
2069 * @param string $next_day_sql_check : 2015-02-30 00:00:00
2070 * @return boolean : true | false
2071 */
2072 function wpbm_is_next_day( $current_day_sql_check, $next_day_sql_check ) {
2073
2074 // Current day
2075 $current_day_unix = strtotime( $current_day_sql_check );
2076
2077 $current_day_midnight_sql = date_i18n( 'Y-m-d', $current_day_unix );
2078 $current_day_midnight_unix = strtotime( $current_day_midnight_sql );
2079
2080 $calc_next_day_unix = strtotime( '+1 day', $current_day_midnight_unix );
2081
2082 // Next day
2083 $next_day_unix = strtotime( $next_day_sql_check );
2084 $next_day_midnight_sql = date_i18n( 'Y-m-d', $next_day_unix );
2085 $next_day_midnight_unix = strtotime( $next_day_midnight_sql );
2086
2087
2088 if ( $calc_next_day_unix == $next_day_midnight_unix )
2089 return true;
2090 else
2091 return false;
2092 }
2093
2094 /** Check if "current_day" is same day of "other_day"
2095 *
2096 * @param string $current_day_sql_check : 2015-02-29 00:00:00
2097 * @param string $other_day_sql_check : 2015-02-30 00:00:00
2098 * @return boolean : true | false
2099 */
2100 function wpbm_is_this_same_day( $current_day_sql_check, $other_day_sql_check ) {
2101
2102 // Current day
2103 $current_day_unix = strtotime( $current_day_sql_check );
2104
2105 $current_day_midnight_sql = date_i18n( 'Y-m-d', $current_day_unix );
2106 $current_day_midnight_unix = strtotime( $current_day_midnight_sql );
2107
2108 // Other day
2109 $other_day_unix = strtotime( $other_day_sql_check );
2110 $other_day_midnight_sql = date_i18n( 'Y-m-d', $other_day_unix );
2111 $other_day_midnight_unix = strtotime( $other_day_midnight_sql );
2112
2113
2114 if ( $current_day_midnight_unix == $other_day_midnight_unix )
2115 return true;
2116 else
2117 return false;
2118 }
2119
2120
2121 /** Get days in short format view
2122 *
2123 * @param string $days Dates: 15.05.2015, 16.05.2015, 17.05.2015
2124 * @return string Dates in format: 15.05.2015 - 17.05.2015
2125 */
2126 function wpbm_get_dates_short_format( $dates_sql_csv ) { // $days - string with comma seperated dates
2127
2128 if ( empty( $dates_sql_csv ) )
2129 return '';
2130
2131 $days = explode( ',', $dates_sql_csv );
2132
2133 $previosday = false;
2134 $result_string = '';
2135 $last_show_day = '';
2136
2137 foreach ( $days as $day ) {
2138
2139 $is_fin_at_end = false;
2140
2141 if ( $previosday === false ) { // First Day
2142
2143 $result_string = wpbm_get_date_time_formatted( $day, false, ' ', true ); // echo format for first day
2144 $last_show_day = $day;
2145 $previosday = $day; // Set previos day for next loop
2146
2147 } else { // Not first day
2148
2149 if (
2150 wpbm_is_next_day( $previosday, $day )
2151 || wpbm_is_this_same_day( $previosday, $day )
2152 ) { // Check if $day next day from previous
2153
2154 $previosday = $day; // Set previos day for next loop
2155 $is_fin_at_end = true;
2156 } else {
2157 if ( $last_show_day !== $previosday ) { // check if previos day was show or no
2158 $result_string .= ' - ' . wpbm_get_date_time_formatted( $previosday, false, ' ', true ); // assign in needed format this day
2159 }
2160 $result_string .= ', ' . wpbm_get_date_time_formatted( $day, false, ' ', true ); // assign in needed format this day
2161 $previosday = $day; // Set previos day for next loop
2162 $last_show_day = $day;
2163 }
2164 }
2165
2166 }
2167
2168 if ( $is_fin_at_end ) {
2169 $result_string .= ' - ' . wpbm_get_date_time_formatted( $day, false, ' ', true );
2170 }
2171
2172 return $result_string;
2173 }
2174
2175 // </editor-fold>