PluginProbe
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar / 2.0.2
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar v2.0.2
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 2.0.22 All 55 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.2, at core/wpbm-functions.php

2,180 lines 74.6 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 info@oplugins.com
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 //FixIn: 2.0.2.2
692 if ( is_wp_error( $result ) ) {
693 $error_message = $result->get_error_message();
694 } else {
695 $error_message = __( 'Unknown error during downloading feed', 'booking-manager' );
696 }
697 do_action( 'wpbc_admin_show_top_notice', $error_message, 'error', 5000 ); // N_O_T_I_C_E in H_E_A_D_E_R
698 debuge($error_message); //FixIn: 2.0.1.3
699
700 return false;
701 }
702 }
703
704
705
706 /** Count the number of bytes of a given string.
707 * Input string is expected to be ASCII or UTF-8 encoded.
708 * Warning: the function doesn't return the number of chars
709 * in the string, but the number of bytes.
710 * See http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
711 * for information on UTF-8.
712 *
713 * @param string $str The string to compute number of bytes
714 *
715 * @return The length in bytes of the given string.
716 */
717 function wpbm_get_bytes_from_str( $str ) {
718 // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
719 // Number of characters in string
720 $strlen_var = strlen( $str );
721
722 $d = 0; // string bytes counter
723
724 // Iterate over every character in the string, escaping with a slash or encoding to UTF-8 where necessary
725 for ( $c = 0; $c < $strlen_var; ++ $c ) {
726 $ord_var_c = ord( $str{$c} );
727 switch ( true ) {
728 case(($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII)
729 $d ++;
730 break;
731 case(($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX
732 $d += 2;
733 break;
734 case(($ord_var_c & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX
735 $d += 3;
736 break;
737 case(($ord_var_c & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX
738 $d += 4;
739 break;
740 case(($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX
741 $d += 5;
742 break;
743 case(($ord_var_c & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X
744 $d += 6;
745 break;
746 default:
747 $d ++;
748 }
749 }
750 return $d;
751 }
752
753
754 // </editor-fold>
755
756
757 // <editor-fold defaultstate="collapsed" desc=" A d m i n M e n u L i n k s " >
758 ////////////////////////////////////////////////////////////////////////////
759 // A d m i n M e n u L i n k s
760 ////////////////////////////////////////////////////////////////////////////
761
762 /** Get URL to specific Admin Menu page
763 *
764 * @param string $menu_type - { item | add | resources | settings }
765 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
766 * @return string - URL to menu
767 */
768 function wpbm_get_menu_url( $menu_type, $is_absolute_url = true ) {
769
770 switch ( $menu_type) {
771
772 case 'master': // Master
773 $link = 'oplugins&tab=wpbm';
774 break;
775
776 case 'add': // Add New
777 case 'new': // Add New
778 $link = 'oplugins&wpbm-new';
779 break;
780
781 case 'settings': // Settings
782 case 'options':
783 $link = 'oplugins&tab=wpbm-settings';
784 break;
785
786 default: // Master
787 $link = 'oplugins';
788 break;
789 }
790
791 if ( $is_absolute_url ) {
792 $link = admin_url( 'admin.php' ) . '?page=' . $link ;
793 }
794
795 return $link;
796 }
797
798 // // // // // // // // // // // // // // // // // // // // // // // // // /
799
800 /** Get URL of item Listing or Calendar Overview page
801 *
802 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
803 * @param boolean $is_old - { default: true }
804 * @return string - URL to menu
805 */
806 function wpbm_get_master_url( $is_absolute_url = true ) {
807 return wpbm_get_menu_url( 'master', $is_absolute_url );
808 }
809
810 /** Get URL of item > Add item page
811 *
812 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
813 * @param boolean $is_old - { default: true }
814 * @return string - URL to menu
815 */
816 function wpbm_get_new_wpbm_url( $is_absolute_url = true ) {
817 return wpbm_get_menu_url( 'add', $is_absolute_url );
818 }
819
820 /** Get URL of item > Settings page
821 *
822 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
823 * @param boolean $is_old - { default: true }
824 * @return string - URL to menu
825 */
826 function wpbm_get_settings_url( $is_absolute_url = true ) {
827 return wpbm_get_menu_url( 'settings', $is_absolute_url );
828 }
829
830 // // // // // // // // // // // // // // // // // // // // // // // // // /
831
832 /** Check if this item Listing or Calendar Overview page
833 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
834 * @return boolean true | false
835 */
836 function wpbm_is_master_page( $server_param = 'REQUEST_URI' ) {
837
838 if ( ( is_admin() ) &&
839 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
840 ( strpos($_SERVER[ $server_param ],'tab=wpbm-') === false ) && // not the settings
841 ( ( strpos($_SERVER[ $server_param ],'tab=wpbm') !== false ) // tab specified
842 || ( strpos($_SERVER[ $server_param ],'tab=') === false ) ) // or tab not specified at all
843 ) {
844 return true;
845 }
846 return false;
847 }
848
849 /** Check if this item > Add item page
850 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
851 * @return boolean true | false
852 */
853 function wpbm_is_new_wpbm_page( $server_param = 'REQUEST_URI' ) {
854
855 if ( ( is_admin() ) &&
856 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
857 ( strpos($_SERVER[ $server_param ],'tab=wpbm-new') !== false )
858 ) {
859 return true;
860 }
861 return false;
862 }
863
864
865 /** Check if this item > Settings page
866 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
867 * @return boolean true | false
868 */
869 function wpbm_is_settings_page( $server_param = 'REQUEST_URI' ) {
870
871 if ( ( is_admin() ) &&
872 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
873 ( strpos($_SERVER[ $server_param ],'tab=wpbm-settings') !== false )
874 ) {
875 return true;
876 }
877 return false;
878 }
879
880 // </editor-fold>
881
882
883 // <editor-fold defaultstate="collapsed" desc=" A d m i n U I E l e m e n t s " >
884 ////////////////////////////////////////////////////////////////////////////
885 // A d m i n U I E l e m e n t s
886 ////////////////////////////////////////////////////////////////////////////
887
888 /** Get Number of new items
889 *
890 * @return int
891 */
892 function wpbm_get_number_new_items(){
893 return 0;
894 }
895
896
897 /** Show Admin B A R .
898 *
899 * @global type $wp_admin_bar
900 * @return type
901 */
902 function wp_admin_bar_items_menu(){
903
904 global $wp_admin_bar;
905
906 $current_user = wp_get_current_user();
907
908 $curr_user_role = get_wpbm_option( 'wpbm_user_role_master' );
909 $level = 10;
910 if ($curr_user_role == 'administrator') $level = 10;
911 else if ($curr_user_role == 'editor') $level = 7;
912 else if ($curr_user_role == 'author') $level = 2;
913 else if ($curr_user_role == 'contributor') $level = 1;
914 else if ($curr_user_role == 'subscriber') $level = 0;
915
916 if ( ( $current_user->user_level < $level ) || ! is_admin_bar_showing() )
917 return;
918
919
920 $update_count = wpbm_get_number_new_items(); // 0
921
922 $title = 'Booking Manager';
923 $update_title = $title;
924
925
926 if ( $update_count > 0 ) {
927 $update_count_title = "&nbsp;<span id='ab-updates' class='wpbm-count bk-update-count' >" . number_format_i18n($update_count) . "</span>" ; //id='wpbm-count'
928 $update_title .= $update_count_title;
929 }
930
931 $link_items = wpbm_get_master_url();
932 $link_settings = wpbm_get_settings_url();
933
934
935 $wp_admin_bar->add_menu(
936 array(
937 'id' => 'bar_wpbm',
938 'title' => $update_title ,
939 'href' => wpbm_get_master_url()
940 )
941 );
942
943
944 $curr_user_role_settings = get_wpbm_option( 'wpbm_user_role_settings' );
945 $level = 10;
946 if ($curr_user_role_settings == 'administrator') $level = 10;
947 else if ($curr_user_role_settings == 'editor') $level = 7;
948 else if ($curr_user_role_settings == 'author') $level = 2;
949 else if ($curr_user_role_settings == 'contributor') $level = 1;
950 else if ($curr_user_role_settings == 'subscriber') $level = 0;
951
952 if ( ( ($current_user->user_level < $level) ) || !is_admin_bar_showing() ) return;
953
954 $wp_admin_bar->add_menu(
955 array(
956 'id' => 'bar_wpbm_new',
957 'title' => __( 'Add New', 'booking-manager'),
958 'href' => wpbm_get_new_wpbm_url(),
959 'parent' => 'bar_wpbm',
960 )
961 );
962
963
964
965 $wp_admin_bar->add_menu(
966 array(
967 'id' => 'bar_wpbm_settings',
968 'title' => __( 'Settings', 'booking-manager'),
969 'href' => wpbm_get_settings_url(),
970 'parent' => 'bar_wpbm',
971 )
972 );
973
974 $wp_admin_bar->add_menu(
975 array(
976 'id' => 'bar_wpbm_settings_email',
977 'title' => __( 'Emails', 'booking-manager'),
978 'href' => $link_settings . '&tab=email',
979 'parent' => 'bar_wpbm_settings'
980 )
981 );
982
983 }
984 // add_action( 'admin_bar_menu', 'wp_admin_bar_items_menu', 70 ); // Add Admin Bar
985
986
987 /** Show Rating link at footer */
988 function wpbm_show_wpbm_footer(){
989
990 if ( ! wpbm_is_this_demo() ) {
991
992 $message = sprintf( __( 'If you like %s please leave us a %s rating. A huge thank you in advance!', 'booking-manager')
993 , '<strong>Booking Manager</strong>' . ' ' . WPBM_VERSION_NUM
994 , '<a href="https://wordpress.org/support/plugin/booking-manager/reviews/#new-post" target="_blank" title="' . esc_attr__( 'Thanks :)', 'booking-manager') . '">'
995 . '&#9733;&#9733;&#9733;&#9733;&#9733;'
996 . '</a>'
997 );
998
999 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>';
1000 ?>
1001 <script type="text/javascript">
1002 jQuery(document).ready(function(){
1003 jQuery('#wpfooter').append( jQuery('#wpbm-footer') );
1004 });
1005 </script>
1006 <?php
1007 }
1008 }
1009 // </editor-fold>
1010
1011
1012 // <editor-fold defaultstate="collapsed" desc=" DB - cheking if table, field or index exists " >
1013 ////////////////////////////////////////////////////////////////////////////
1014 // DB - cheking if table, field or index exists
1015 ////////////////////////////////////////////////////////////////////////////
1016
1017 /**
1018 * Check if table exist
1019 *
1020 * @global type $wpdb
1021 * @param string $tablename
1022 * @return 0|1
1023 */
1024 function wpbm_is_table_exists( $tablename ) {
1025
1026 global $wpdb;
1027
1028 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) )
1029 $tablename = $wpdb->prefix . $tablename ;
1030
1031 $sql_check_table = $wpdb->prepare("SHOW TABLES LIKE %s" , $tablename ); //FixIn 5.4.3
1032
1033 $res = $wpdb->get_results( $sql_check_table );
1034
1035 return count($res); //FixIn 5.4.3
1036 /*
1037 $sql_check_table = $wpdb->prepare("
1038 SELECT COUNT(*) AS count
1039 FROM information_schema.tables
1040 WHERE table_schema = '". DB_NAME ."'
1041 AND table_name = %s " , $tablename );
1042
1043 $res = $wpdb->get_results( $sql_check_table );
1044 return $res[0]->count;*/
1045 }
1046
1047
1048 /**
1049 * Check if table exist
1050 *
1051 * @global type $wpdb
1052 * @param string $tablename
1053 * @param type $fieldname
1054 * @return 0|1
1055 */
1056 function wpbm_is_field_in_table_exists( $tablename , $fieldname) {
1057 global $wpdb;
1058 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) ) $tablename = $wpdb->prefix . $tablename ;
1059 $sql_check_table = "SHOW COLUMNS FROM {$tablename}" ;
1060
1061 $res = $wpdb->get_results( $sql_check_table );
1062
1063 foreach ($res as $fld) {
1064 if ($fld->Field == $fieldname) return 1;
1065 }
1066
1067 return 0;
1068 }
1069
1070
1071 /**
1072 * Check if index exist
1073 *
1074 * @global type $wpdb
1075 * @param string $tablename
1076 * @param type $fieldindex
1077 * @return 0|1
1078 */
1079 function wpbm_is_index_in_table_exists( $tablename , $fieldindex) {
1080 global $wpdb;
1081 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) ) $tablename = $wpdb->prefix . $tablename ;
1082 $sql_check_table = $wpdb->prepare("SHOW INDEX FROM {$tablename} WHERE Key_name = %s", $fieldindex );
1083 $res = $wpdb->get_results( $sql_check_table );
1084 if (count($res)>0) return 1;
1085 else return 0;
1086 }
1087
1088 // </editor-fold>
1089
1090
1091 // <editor-fold defaultstate="collapsed" desc=" E s c a p i n g " >
1092 ////////////////////////////////////////////////////////////////////////////
1093 // E s c a p i n g
1094 ////////////////////////////////////////////////////////////////////////////
1095
1096 /** Transform the REQESTS parameters (GET and POST) into URL
1097 *
1098 * @param type $page_param
1099 * @param array $exclude_params
1100 * @param type $only_these_parameters
1101 * @return type
1102 */
1103 function wpbm_get_params_in_url( $page_param , $exclude_params = array(), $only_these_parameters = false, $is_escape_url = false, $only_get = false ){
1104
1105 $exclude_params[] = 'page';
1106
1107 if ( isset( $_GET['page'] ) )
1108 $page_param = $_GET['page'];
1109
1110 $get_paramaters = array( 'page' => $page_param );
1111
1112 if ( $only_get )
1113 $check_params = $_GET;
1114 else
1115 $check_params = $_REQUEST;
1116 //debuge($check_params);
1117 foreach ( $check_params as $prm_key => $prm_value ) {
1118
1119 // Skip parameters arrays, like $_GET['rvaluation_to'] = Array ( [0] => 6, [1] => 14, [2] => 14 )
1120 if (
1121 ( is_string( $prm_value ) )
1122 || ( is_numeric( $prm_value ) )
1123 ) {
1124
1125 if ( strlen( $prm_value ) > 1000 ) { // Check about TOOO long parameters, if it exist then reset it.
1126 $prm_value = '';
1127 }
1128
1129 if ( ! in_array( $prm_key, $exclude_params ) )
1130 if ( ( $only_these_parameters === false ) || ( in_array( $prm_key, $only_these_parameters ) ) )
1131 $get_paramaters[ $prm_key ] = $prm_value;
1132 }
1133 }
1134 //debuge($check_params, $get_paramaters, $exclude_params );
1135 $url = admin_url( add_query_arg( $get_paramaters , 'admin.php' ) );
1136
1137 if ( $is_escape_url )
1138 $url = esc_url( $url );
1139
1140 return $url;
1141
1142 /* // Old variant:
1143 if ( isset( $_GET['page'] ) ) $page_param = $_GET['page'];
1144
1145 $url_start = 'admin.php?page=' . $page_param . '&';
1146 $exclude_params[] = 'page';
1147 foreach ( $_REQUEST as $prm_key => $prm_value ) {
1148
1149 if ( !in_array( $prm_key, $exclude_params ) )
1150 if ( ($only_these_parameters === false) || ( in_array( $prm_key, $only_these_parameters ) ) )
1151
1152 $url_start .= $prm_key . '=' . $prm_value . '&';
1153
1154 }
1155 $url_start = substr( $url_start, 0, -1 );
1156
1157 return $url_start;
1158 */
1159 }
1160
1161
1162 /** Clean Request Parameters
1163 *
1164 */
1165 function wpbm_check_request_paramters() {
1166
1167 $clean_params = array();
1168
1169 $clean_params[ 'wh_wpbm_id' ] = 'digit_or_csd'; // '0' | '1' | ''
1170 $clean_params[ 'wh_wpbm_date' ] = 'digit_or_date'; // number | date 2016-07-20
1171 $clean_params[ 'wh_wpbm_datenext' ] = 'd'; // '1' | '2' ....
1172 $clean_params[ 'wh_pay_statuscustom' ] = 's'; //string !!! LIKE !!!
1173 $clean_params[ 'wh_pay_status' ] = array( 'all', 'group_ok', 'group_unknown', 'group_pending', 'group_failed' );
1174
1175 foreach ( $clean_params as $request_key => $clean_type ) {
1176
1177 // elements only listed in array::
1178 if ( is_array( $clean_type ) ) { // check only values from the list in this array
1179
1180 if ( ( isset( $_REQUEST[ $request_key ] ) ) && ( ! in_array( $_REQUEST[ $request_key ], $clean_type ) ) )
1181 $clean_type = 's';
1182 else
1183 $clean_type = 'checked_skip_it';
1184 }
1185
1186 switch ( $clean_type ) {
1187
1188 case 'checked_skip_it':
1189
1190 break;
1191
1192 case 'digit_or_date': // digit or comma separated digit
1193 if ( isset( $_REQUEST[ $request_key ] ) )
1194 $_REQUEST[ $request_key ] = wpbm_clean_digit_or_date( $_REQUEST[ $request_key ] ); // nums
1195
1196 break;
1197
1198 case 'digit_or_csd': // digit or comma separated digit
1199 if ( isset( $_REQUEST[ $request_key ] ) )
1200 $_REQUEST[ $request_key ] = wpbm_clean_digit_or_csd( $_REQUEST[ $request_key ] ); // nums
1201
1202 break;
1203
1204 case 's': // string
1205 if ( isset( $_REQUEST[ $request_key ] ) )
1206 $_REQUEST[ $request_key ] = wpbm_clean_like_string_for_db( $_REQUEST[ $request_key ] );
1207
1208 break;
1209
1210 case 'd': // digit
1211 if ( isset( $_REQUEST[ $request_key ] ) )
1212 if ( $_REQUEST[ $request_key ] !== '' )
1213 $_REQUEST[ $request_key ] = intval( $_REQUEST[ $request_key ] );
1214
1215 break;
1216
1217 default:
1218 if ( isset( $_REQUEST[ $request_key ] ) ) {
1219 $_REQUEST[ $request_key ] = intval( $_REQUEST[ $request_key ] );
1220 }
1221 break;
1222 }
1223
1224
1225 }
1226
1227 }
1228
1229
1230 /** Check paramter if it number or comma separated list of numbers
1231 *
1232 * @global type $wpdb
1233 * @param string $value
1234 * @return string
1235 *
1236 * Exmaple:
1237 wpbm_clean_digit_or_csd( '12,a,45,9' ) => '12,0,45,9'
1238 * or
1239 wpbm_clean_digit_or_csd( '10a' ) => '10
1240 * or
1241 wpbm_clean_digit_or_csd( array( '12,a,45,9', '10a' ) ) => array ( '12,0,45,9', '10' )
1242 */
1243 function wpbm_clean_digit_or_csd( $value ) { //FixIn:6.2.1.4
1244
1245 if ( $value === '' ) return $value;
1246
1247
1248 if ( is_array( $value ) ) {
1249 foreach ( $value as $key => $check_value ) {
1250 $value[ $key ] = wpbm_clean_digit_or_csd( $check_value );
1251 }
1252 return $value;
1253 }
1254
1255
1256 global $wpdb;
1257
1258 $value = str_replace( ';', ',', $value );
1259
1260 $array_of_nums = explode(',', $value);
1261
1262 $result = array();
1263 foreach ($array_of_nums as $check_element) {
1264 $result[] = $wpdb->prepare( "%d", $check_element );
1265 }
1266 $result = implode(',', $result );
1267 return $result;
1268 }
1269
1270
1271 /** Cehck about Valid date, like 2016-07-20 or digit
1272 *
1273 * @param string $value
1274 * @return string or int
1275 */
1276 function wpbm_clean_digit_or_date( $value ) { //FixIn:6.2.1.4
1277
1278 if ( $value === '' ) return $value;
1279
1280 if ( preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $value ) ) {
1281
1282 return $value; // Date is valid in format: 2016-07-20
1283 } else {
1284 return intval( $value );
1285 }
1286
1287 }
1288
1289
1290 /** Check $value for injection here
1291 *
1292 * @param type $value
1293 * @return type
1294 */
1295 function wpbm_clean_parameter( $value ) {
1296
1297 $value = preg_replace( '/<[^>]*>/', '', $value ); // clean any tags
1298 $value = str_replace( '<', ' ', $value );
1299 $value = str_replace( '>', ' ', $value );
1300 $value = strip_tags( $value );
1301
1302 // Clean SQL injection
1303 $value = esc_sql( $value );
1304
1305 return $value;
1306 }
1307
1308
1309 function wpbm_esc_like( $value_trimmed ) {
1310
1311 global $wpdb;
1312 if ( method_exists( $wpdb ,'esc_like' ) )
1313 return $wpdb->esc_like( $value_trimmed ); // Its require minimum WP 4.0.0
1314 else
1315 return addcslashes( $value_trimmed, '_%\\' ); // Direct implementation from $wpdb->esc_like(
1316 }
1317
1318
1319 /** Clean user string for using in SQL LIKE statement - append to LIKE sql
1320 *
1321 * @param string $value - to clean
1322 * @return string - escaped
1323 * Exmaple:
1324 * $search_escaped_like_title = wpbm_clean_like_string_for_append_in_sql_for_db( $input_var );
1325 *
1326 * $where_sql = " WHERE title LIKE ". $search_escaped_like_title ." ";
1327 */
1328 function wpbm_clean_like_string_for_append_in_sql_for_db( $value ) {
1329 global $wpdb;
1330
1331 $value_trimmed = trim( stripslashes( $value ) );
1332 $wild = '%';
1333 $like = $wild . wpbm_esc_like( $value_trimmed ) . $wild;
1334 $sql = $wpdb->prepare( "'%s'", $like );
1335
1336 return $sql;
1337
1338
1339 /* Help:
1340 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
1341 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
1342 *
1343 * Example Prepared Statement:
1344 *
1345 * $wild = '%';
1346 * $find = 'only 43% of planets';
1347 * $like = $wild . wpbm_esc_like( $find ) . $wild;
1348 * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE '%s'", $like );
1349 *
1350 * Example Escape Chain:
1351 *
1352 * $sql = esc_sql( wpbm_esc_like( $input ) );
1353 */
1354
1355 }
1356
1357
1358 /** Clean string for using in SQL LIKE requests inside single quotes: WHERE title LIKE '%". $escaped_search_title ."%'
1359 * Replaced _ to \_ % to \% \ to \\
1360 * @param string $value - to clean
1361 * @return string - escaped
1362 * Exmaple:
1363 * $search_escaped_like_title = wpbm_clean_like_string_for_db( $input_var );
1364 *
1365 * $where_sql = " WHERE title LIKE '%". $search_escaped_like_title ."%' ";
1366 *
1367 * Important! Use SINGLE quotes after in SQL query: LIKE '%".$data."%'
1368 */
1369 function wpbm_clean_like_string_for_db( $value ){
1370
1371 global $wpdb;
1372
1373 $value_trimmed = trim( stripslashes( $value ) );
1374
1375 $value_trimmed = wpbm_esc_like( $value_trimmed );
1376
1377 $value = trim( $wpdb->prepare( "'%s'", $value_trimmed ) , "'" );
1378
1379 return $value;
1380
1381 /* Help:
1382 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
1383 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
1384 *
1385 * Example Prepared Statement:
1386 *
1387 * $wild = '%';
1388 * $find = 'only 43% of planets';
1389 * $like = $wild . wpbm_esc_like( $find ) . $wild;
1390 * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE '%s'", $like );
1391 *
1392 * Example Escape Chain:
1393 *
1394 * $sql = esc_sql( wpbm_esc_like( $input ) );
1395 */
1396 }
1397
1398
1399 /** Escape string from SQL for the HTML form field
1400 *
1401 * @param string $value
1402 * @return string
1403 *
1404 * Used: esc_sql function.
1405 *
1406 * https://codex.wordpress.org/Function_Reference/esc_sql
1407 * Note: Be careful to use this function correctly. It will only escape values to be used in strings in the query.
1408 * That is, it only provides escaping for values that will be within quotes in the SQL (as in field = '{$escaped_value}').
1409 * If your value is not going to be within quotes, your code will still be vulnerable to SQL injection.
1410 * For example, this is vulnerable, because the escaped value is not surrounded by quotes in the SQL query:
1411 * ORDER BY {$escaped_value}. As such, this function does not escape unquoted numeric values, field names, or SQL keywords.
1412 *
1413 */
1414 function wpbm_clean_string_for_form( $value ){
1415
1416 global $wpdb;
1417
1418 $value_trimmed = trim( stripslashes( $value ) );
1419
1420 $esc_sql_value = esc_sql( $value_trimmed );
1421
1422 //$value = trim( $wpdb->prepare( "'%s'", $esc_sql_value ) , "'" );
1423
1424 $esc_sql_value = trim( stripslashes( $esc_sql_value ) );
1425
1426 return $esc_sql_value;
1427
1428 }
1429 // </editor-fold>
1430
1431
1432 // <editor-fold defaultstate="collapsed" desc=" U s e r s " >
1433 ////////////////////////////////////////////////////////////////////////////////
1434 // U s e r s
1435 ////////////////////////////////////////////////////////////////////////////////
1436
1437 /** Get ID of active user
1438 *
1439 * @return type
1440 */
1441 function get_wpbm_current_user_id() {
1442 $user = wp_get_current_user();
1443 return ( isset( $user->ID ) ? (int) $user->ID : 0 );
1444 }
1445
1446
1447 /** Check if Current User have specific Role
1448 *
1449 * @return bool Whether the current user has the given capability.
1450 */
1451 function wpbm_is_current_user_have_this_role( $user_role ) {
1452
1453 if ( $user_role == 'administrator' ) $user_role = 'activate_plugins';
1454 if ( $user_role == 'editor' ) $user_role = 'publish_pages';
1455 if ( $user_role == 'author' ) $user_role = 'publish_posts';
1456 if ( $user_role == 'contributor' ) $user_role = 'edit_posts';
1457 if ( $user_role == 'subscriber') $user_role = 'read';
1458
1459 return current_user_can( $user_role );
1460 }
1461
1462
1463 function wpbm_get_user_ip() {
1464 //return '84.243.195.114' ; // Test //90.36.89.174
1465 if (isset($_SERVER['HTTP_CLIENT_IP'])) {
1466 $userIP = $_SERVER['HTTP_CLIENT_IP'] ;
1467 } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
1468 $userIP = $_SERVER['HTTP_X_FORWARDED_FOR'] ;
1469 } elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
1470 $userIP = $_SERVER['HTTP_X_FORWARDED'] ;
1471 } elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
1472 $userIP = $_SERVER['HTTP_FORWARDED_FOR'] ;
1473 } elseif (isset($_SERVER['HTTP_FORWARDED'])) {
1474 $userIP = $_SERVER['HTTP_FORWARDED'] ;
1475 } elseif (isset($_SERVER['REMOTE_ADDR'])) {
1476 $userIP = $_SERVER['REMOTE_ADDR'] ;
1477 } else {
1478 $userIP = "" ;
1479 }
1480
1481 $userIP = explode( ',', $userIP );
1482 $userIP = array_map( 'trim', $userIP );
1483
1484 return $userIP[0] ;
1485 }
1486 add_wpbm_filter( 'wpbm_get_user_ip', 'wpbm_get_user_ip' );
1487 // </editor-fold>
1488
1489
1490 // <editor-fold defaultstate="collapsed" desc=" Mesages for Admin panel " >
1491 ////////////////////////////////////////////////////////////////////////////////
1492 // Mesages for Admin panel
1493 ////////////////////////////////////////////////////////////////////////////////
1494
1495 function wpbm_show_fixed_message( $message, $time_to_show , $message_type = 'updated' , $notice_id = 0, $is_dismissible = false ) {
1496
1497 // Generate unique HTML ID for the message
1498 if ( $notice_id == 0 )
1499 $notice_id = intval( time() * rand(10, 100) );
1500
1501 $notice_id = 'wpbm_system_notice_' . $notice_id;
1502
1503 $is_dismissible = false;
1504
1505 if (
1506 ( ( $is_dismissible ) && ( ! wpbm_section_is_dismissed( $notice_id ) ) )
1507 || ( ! $is_dismissible )
1508 // || true
1509 ){
1510
1511 ?><div id="<?php echo $notice_id; ?>"
1512 class="wpbm_system_notice wpbm_is_dismissible wpbm_is_hideable <?php echo $message_type; ?>"
1513 data-nonce="<?php echo wp_create_nonce( $nonce_name = $notice_id . '_wpbmnonce' ); ?>"
1514 data-user-id="<?php echo get_current_user_id(); ?>"
1515 ><?php
1516
1517 wpbm_x_dismiss_button();
1518
1519 echo $message;
1520
1521 ?></div><?php
1522
1523 // Get the time of message showing
1524 $time_to_show = intval( $time_to_show ) * 1000;
1525
1526 if ( $time_to_show > 0 ) {
1527 ?> <script type="text/javascript">
1528 jQuery('#<?php echo $notice_id; ?>').animate({opacity: 1},<?php echo $time_to_show; ?>).fadeOut( 2000 );
1529 </script> <?php
1530 }
1531 }
1532 }
1533
1534
1535 /** Show Ajax message at the top of page
1536 *
1537 * @param type $message
1538 * @param type $time_to_show
1539 * @param type $is_error
1540 */
1541 function wpbm_show_ajax_message( $message, $time_to_show = 3000, $is_error = false ) {
1542
1543 // Recheck for any "lang" shortcodes for replacing to correct language
1544 $message = apply_wpbm_filter('wpbm_check_for_active_language', $message );
1545
1546 // Escape any JavaScript from message
1547 $notice = html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1548
1549 ?><script type="text/javascript">
1550 var my_message = '<?php echo $notice; ?>';
1551 wpbm_admin_show_message( my_message, '<?php echo ( $is_error ? 'error' : 'success' ); ?>', <?php echo $time_to_show; ?> );
1552 </script><?php
1553 }
1554
1555
1556 /** Show "Saved Changes" message at the top of settings page.
1557 *
1558 */
1559 function wpbm_show_changes_saved_message() {
1560 wpbm_show_message ( __('Changes saved.', 'booking-manager'), 5 );
1561 }
1562
1563
1564 /** Show Message at Top of Admin Pages
1565 *
1566 * @param type $message - mesage to show
1567 * @param type $time_to_show - number of seconds to show, if 0 or skiped, then unlimited time.
1568 * @param type $message_type - Default: updated { updated | error | notice }
1569 */
1570 function wpbm_show_message ( $message, $time_to_show , $message_type = 'updated') {
1571
1572 // Generate unique HTML ID for the message
1573 $inner_message_id = intval( time() * rand(10, 100) );
1574
1575 // Get formated HTML message
1576 $notice = wpbm_get_formated_message( $message, $message_type, $inner_message_id );
1577
1578 // Get the time of message showing
1579 $time_to_show = intval( $time_to_show ) * 1000;
1580
1581 // Show this Message
1582 ?> <script type="text/javascript">
1583 if ( jQuery('.wpbm_admin_message').length ) {
1584 jQuery('.wpbm_admin_message').append( '<?php echo $notice; ?>' );
1585 <?php if ( $time_to_show > 0 ) { ?>
1586 jQuery('#wpbm_inner_message_<?php echo $inner_message_id; ?>').animate({opacity: 1},<?php echo $time_to_show; ?>).fadeOut( 2000 );
1587 <?php } ?>
1588 }
1589 </script> <?php
1590 }
1591
1592
1593 /** Escape and prepare message to show it
1594 *
1595 * @param type $message - message
1596 * @param type $message_type - Default: updated { updated | error | notice }
1597 * @param string $inner_message_id - ID of message DIV, can be skipped
1598 * @return string
1599 */
1600 function wpbm_get_formated_message ( $message, $message_type = 'updated', $inner_message_id = '') {
1601
1602
1603 // Recheck for any "lang" shortcodes for replacing to correct language
1604 $message = apply_wpbm_filter('wpbm_check_for_active_language', $message );
1605
1606 // Escape any JavaScript from message
1607 $notice = html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1608
1609 $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>';
1610
1611 if (! empty( $inner_message_id ))
1612 $inner_message_id = 'id="wpbm_inner_message_'. $inner_message_id .'"';
1613
1614 $notice = '<div '.$inner_message_id.' class="wpbm_inner_message '. $message_type . '">' . $notice . '</div>';
1615
1616 return $notice;
1617 }
1618
1619
1620 /** Show system info in settings page
1621 *
1622 * @param string $message ...
1623 * @param string $message_type 'info' | 'warning' | 'error'
1624 * @param string $title __('Important!' , 'booking-manager') | __('Note' , 'booking-manager')
1625 *
1626 * Exmaple: wpbm_show_message_in_settings( __( 'Nothing Found', 'booking-manager'), 'warning', __('Important!' , 'booking-manager') );
1627 */
1628 function wpbm_show_message_in_settings( $message, $message_type = 'info', $title = '' , $is_echo = true ) {
1629
1630 $message_content = '';
1631
1632 $message_content .= '<div class="clear"></div>';
1633
1634 $message_content .= '<div class="wpbm-settings-notice notice-' . $message_type . '" style="text-align:left;">';
1635
1636 if ( ! empty( $title ) )
1637 $message_content .= '<strong>' . esc_js( $title ) . '</strong> ';
1638
1639 $message_content .= html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1640
1641 $message_content .= '</div>';
1642
1643 $message_content .= '<div class="clear"></div>';
1644
1645 if ( $is_echo )
1646 echo $message_content;
1647 else
1648 return $message_content;
1649
1650 }
1651 // </editor-fold>
1652
1653
1654 // <editor-fold defaultstate="collapsed" desc=" Settings Meta Boxes " >
1655 ////////////////////////////////////////////////////////////////////////////////
1656 // Settings Meta Boxes
1657 ////////////////////////////////////////////////////////////////////////////////
1658 function wpbm_open_meta_box_section( $metabox_id, $title ) {
1659
1660 $my_close_open_win_id = $metabox_id . '_metabox';
1661 ?>
1662 <div class='meta-box'>
1663 <div
1664 id="<?php echo $my_close_open_win_id; ?>"
1665 class="postbox <?php if ( '1' == get_user_option( 'wpbm_win_' . $my_close_open_win_id ) ) echo 'closed'; ?>"
1666 > <div title="<?php _e('Click to toggle', 'booking-manager'); ?>"
1667 class="handlediv"
1668 onclick="javascript:wpbm_verify_window_opening(<?php echo get_wpbm_current_user_id(); ?>, '<?php echo $my_close_open_win_id; ?>');"
1669 ><br/></div>
1670 <h3 class='hndle'>
1671 <span><?php echo wp_kses_post( $title ); ?></span>
1672 </h3>
1673 <div class="inside">
1674 <?php
1675 }
1676
1677 function wpbm_close_meta_box_section() {
1678 ?>
1679 </div>
1680 </div>
1681 </div>
1682 <?php
1683 }
1684 // </editor-fold>
1685
1686
1687 // from Toolbar
1688 // <editor-fold defaultstate="collapsed" desc=" M o d a l s " >
1689 ////////////////////////////////////////////////////////////////////////////////
1690 // M o d a l s
1691 ////////////////////////////////////////////////////////////////////////////////
1692
1693 /** Start Loyouts - Modal Window structure */
1694 function wpbm_write_content_for_modals_start_here() {
1695
1696 ?><span id="wpbm_content_for_modals"></span><?php
1697 }
1698 add_wpbm_action( 'wpbm_write_content_for_modals', 'wpbm_write_content_for_modals_start_here');
1699 // </editor-fold>
1700
1701
1702 // <editor-fold defaultstate="collapsed" desc=" Inline JavaScript " >
1703 ////////////////////////////////////////////////////////////////////////////////
1704 // Inline J a v a S c r i p t to Footer page
1705 ////////////////////////////////////////////////////////////////////////////////
1706 /**
1707 * Queue JavaScript for later output at footer
1708 *
1709 * @param string $code
1710 */
1711 function wpbm_enqueue_js( $code ) {
1712 global $wpbm_queued_js;
1713
1714 if ( empty( $wpbm_queued_js ) ) {
1715 $wpbm_queued_js = '';
1716 }
1717
1718 $wpbm_queued_js .= "\n" . $code . "\n";
1719 }
1720
1721
1722 /**
1723 * Output any queued javascript code in the footer.
1724 */
1725 function wpbm_print_js() {
1726
1727 global $wpbm_queued_js;
1728
1729 if ( ! empty( $wpbm_queued_js ) ) {
1730
1731 echo "<!-- WPBM JavaScript -->\n<script type=\"text/javascript\">\njQuery(function($) {";
1732
1733 $wpbm_queued_js = wp_check_invalid_utf8( $wpbm_queued_js );
1734
1735 $wpbm_queued_js = wp_specialchars_decode( $wpbm_queued_js , ENT_COMPAT); // Converts double quotes '&quot;' => '"'
1736
1737 $wpbm_queued_js = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", $wpbm_queued_js );
1738 $wpbm_queued_js = str_replace( "\r", '', $wpbm_queued_js );
1739
1740 echo $wpbm_queued_js . "});\n</script>\n<!-- End WPBM JavaScript -->\n";
1741
1742 $wpbm_queued_js = '';
1743 unset( $wpbm_queued_js );
1744 }
1745 }
1746
1747 // </editor-fold>
1748
1749 // from Toolbar
1750 // <editor-fold defaultstate="collapsed" desc=" JS & CSS - Tooltips & Popover" >
1751 ////////////////////////////////////////////////////////////////////////////////
1752 // JS & CSS
1753 ////////////////////////////////////////////////////////////////////////////////
1754
1755 /** Load suport JavaScript for "Items" page*/
1756 function wpbm_js_for_items_page() {
1757
1758 $is_use_hints = get_wpbm_option( 'wpbm_is_use_hints_at_admin_panel' );
1759 if ( $is_use_hints == 'On' )
1760 wpbm_bs_javascript_tooltips(); // JS Tooltips
1761
1762 wpbm_bs_javascript_popover(); // JS Popover
1763
1764 //wpbm_datepicker_js(); // JS Datepicker
1765 wpbm_datepicker_css(); // CSS DatePicker
1766 }
1767
1768
1769 /** Datepicker activation JavaScript */
1770 function wpbm_datepicker_js() {
1771
1772 ?><script type="text/javascript">
1773 jQuery(document).ready( function(){
1774
1775 function applyCSStoDays( date ){
1776 return [true, 'date_available'];
1777 }
1778 jQuery('input.wpbm-filters-section-calendar').datepick(
1779 { beforeShowDay: applyCSStoDays,
1780 showOn: 'focus',
1781 multiSelect: 0,
1782 numberOfMonths: 1,
1783 stepMonths: 1,
1784 prevText: '&laquo;',
1785 nextText: '&raquo;',
1786 dateFormat: 'yy-mm-dd',
1787 changeMonth: false,
1788 changeYear: false,
1789 minDate: null,
1790 maxDate: null, //'1Y',
1791 showStatus: false,
1792 multiSeparator: ', ',
1793 closeAtTop: false,
1794 // firstDay:<?php //echo get_wpbm_option( 'wpbm_start_day_weeek' ); ?>,
1795 gotoCurrent: false,
1796 hideIfNoPrevNext:true,
1797 useThemeRoller :false,
1798 mandatory: true
1799 }
1800 );
1801 });
1802 </script><?php
1803 }
1804
1805
1806 /** Support CSS - datepick, etc... */
1807 function wpbm_datepicker_css(){
1808 ?>
1809 <style type="text/css">
1810 #datepick-div .datepick-header {
1811 width: 172px !important;
1812 }
1813 #datepick-div {
1814 -border-radius: 3px;
1815 -box-shadow: 0 0 2px #888888;
1816 -webkit-border-radius: 3px;
1817 -webkit-box-shadow: 0 0 2px #888888;
1818 -moz-border-radius: 3px;
1819 -moz-box-shadow: 0 0 2px #888888;
1820 width: 172px !important;
1821 }
1822 #datepick-div .datepick .datepick-days-cell a{
1823 font-size: 12px;
1824 }
1825 #datepick-div table.datepick tr td {
1826 border-top: 0 none !important;
1827 line-height: 24px;
1828 padding: 0 !important;
1829 width: 24px;
1830 }
1831 #datepick-div .datepick-control {
1832 font-size: 10px;
1833 text-align: center;
1834 }
1835 #datepick-div .datepick-one-month {
1836 height: auto;
1837 }
1838 </style>
1839 <?php
1840 }
1841
1842
1843 /** Sortable Table JavaScript */
1844 function wpbm_sortable_js() {
1845 ?>
1846 <script type="text/javascript">
1847 // Activate Sortable Functionality
1848 jQuery( document ).ready(function(){
1849
1850 jQuery('.wpbm_input_table tbody th').css('cursor','move');
1851
1852 jQuery('.wpbm_input_table tbody td.sort').css('cursor','move');
1853
1854 jQuery('.wpbm_input_table.sortable tbody').sortable({
1855 items:'tr',
1856 cursor:'move',
1857 axis:'y',
1858 scrollSensitivity:40,
1859 forcePlaceholderSize: true,
1860 helper: 'clone',
1861 opacity: 0.65,
1862 placeholder: '.wpbm_sortable_table .sort',
1863 start:function(event,ui){
1864 ui.item.css('background-color','#f6f6f6');
1865 },
1866 stop:function(event,ui){
1867 ui.item.removeAttr('style');
1868 }
1869 });
1870 });
1871 </script>
1872 <?php
1873
1874 }
1875 // </editor-fold>
1876
1877
1878 // <editor-fold defaultstate="collapsed" desc=" R e l o a d p a g e " >
1879 ////////////////////////////////////////////////////////////////////////////////
1880 // R e l o a d p a g e
1881 ////////////////////////////////////////////////////////////////////////////////
1882 /**
1883 * Reload page by using JavaScript
1884 *
1885 * @param string $url - URL of page to load
1886 */
1887 function wpbm_reload_page_by_js( $url ) {
1888
1889 $redir = html_entity_decode( esc_url( $url ) );
1890
1891 if ( ! empty( $redir ) ) {
1892 ?>
1893 <script type="text/javascript">
1894 window.location.href = '<?php echo $redir ?>';
1895 </script>
1896 <?php
1897 }
1898 }
1899
1900
1901 /** Redirect browser to a specific page
1902 *
1903 * @param string $url - URL of page to redirect
1904 */
1905 function wpbm_redirect( $url ) {
1906
1907 $url = wpbm_make_link_absolute( $url );
1908
1909 $url = html_entity_decode( esc_url( $url ) );
1910
1911 echo '<script type="text/javascript">';
1912 echo 'window.location.href="'.$url.'";';
1913 echo '</script>';
1914 echo '<noscript>';
1915 echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
1916 echo '</noscript>';
1917 }
1918 // </editor-fold>
1919
1920
1921 // <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 " >
1922 /** Show P a g i n a t i o n
1923 *
1924 * @param int $summ_number_of_items - total number of items
1925 * @param int $active_page_num - number of activated page
1926 * @param int $num_items_per_page - number of items per page
1927 * @param array $only_these_parameters - array of keys to exclude from links
1928 * @param string $url_sufix - usefule for anchor to HTML section with specific ID, Example: '#my_section'
1929 */
1930 function wpbm_show_pagination( $summ_number_of_items, $active_page_num, $num_items_per_page , $only_these_parameters = false, $url_sufix = '' ) {
1931
1932 if ( empty( $num_items_per_page ) ) {
1933 $num_items_per_page = '10';
1934 }
1935
1936 $pages_number = ceil( $summ_number_of_items / $num_items_per_page );
1937 if ( $pages_number < 2 )
1938 return;
1939
1940 //Fix: 5.1.4 - Just in case we are having tooo much resources, then we need to show all resources - and its empty string
1941 if ( ( isset($_REQUEST['wh_wpbm_type'] ) ) && ( strlen($_REQUEST['wh_wpbm_type']) > 1000 ) ) {
1942 $_REQUEST['wh_wpbm_type'] = '';
1943 }
1944
1945 // First parameter will overwriten by $_GET['page'] parameter
1946 $bk_admin_url = wpbm_get_params_in_url( wpbm_get_master_url( false ), array('page_num'), $only_these_parameters );
1947
1948
1949 ?>
1950 <span class="wpdevelop wpbm-pagination">
1951 <div class="container-fluid">
1952 <div class="row">
1953 <div class="col-sm-12 text-center control-group0">
1954 <nav class="btn-toolbar">
1955 <div class="btn-group wpbm-no-margin" style="float:none;">
1956
1957 <?php if ( $pages_number > 1 ) { ?>
1958 <a class="button button-secondary <?php echo ( $active_page_num == 1 ) ? ' disabled' : ''; ?>"
1959 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; ?>">
1960 <?php _e('Prev', 'booking-manager'); ?>
1961 </a>
1962 <?php }
1963
1964 /** Number visible pages (links) that linked to active page, other pages skipped by "..." */
1965 $num_closed_steps = 3;
1966
1967 for ( $pg_num = 1; $pg_num <= $pages_number; $pg_num++ ) {
1968
1969 if ( ! (
1970 ( $pages_number > ( $num_closed_steps * 4) )
1971 && ( $pg_num > $num_closed_steps )
1972 && ( ( $pages_number - $pg_num + 1 ) > $num_closed_steps )
1973 && ( abs( $active_page_num - $pg_num ) > $num_closed_steps )
1974 ) ) {
1975 ?> <a class="button button-secondary <?php if ($pg_num == $active_page_num ) echo ' active'; ?>"
1976 href="<?php echo $bk_admin_url; ?>&page_num=<?php echo $pg_num; echo $url_sufix; ?>">
1977 <?php echo $pg_num; ?>
1978 </a><?php
1979
1980 if ( ( $pages_number > ( $num_closed_steps * 4) )
1981 && ( ($pg_num+1) > $num_closed_steps )
1982 && ( ( $pages_number - ( $pg_num + 1 ) ) > $num_closed_steps )
1983 && ( abs($active_page_num - ( $pg_num + 1 ) ) > $num_closed_steps )
1984 ) {
1985 echo ' <a class="button button-secondary disabled" href="javascript:void(0);">...</a> ';
1986 }
1987 }
1988 }
1989
1990 if ( $pages_number > 1 ) { ?>
1991 <a class="button button-secondary <?php echo ( $active_page_num == $pages_number ) ? ' disabled' : ''; ?>"
1992 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; ?>">
1993 <?php _e('Next', 'booking-manager'); ?>
1994 </a>
1995 <?php } ?>
1996
1997 </div>
1998 </nav>
1999 </div>
2000 </div>
2001 </div>
2002 </span>
2003 <?php
2004 }
2005 // </editor-fold>
2006
2007
2008 // <editor-fold defaultstate="collapsed" desc=" D a t e s " >
2009 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2010 // Dates Format
2011 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2012
2013
2014 /** Get Formated Date & time
2015 *
2016 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2017 * @param string $date_format - Optional. - "m / d / Y, D H:i:s"
2018 * @param string $seperator - Optional. - " "
2019 * @return string - July 29, 2014 12:00 am
2020 */
2021 function wpbm_get_date_time_formatted( $date_sql, $date_format = false, $seperator = ' ', $skip_midnight_time = false ) {
2022
2023 $return_date = wpbm_get_date_formatted( $date_sql, $date_format );
2024
2025 $return_time = wpbm_get_time_formatted( $date_sql, $date_format, $skip_midnight_time );
2026 if ( ! empty( $return_time ) )
2027 $return_date .= $seperator . $return_time;
2028
2029 return $return_date;
2030 }
2031
2032
2033 /** Get Formated Date
2034 *
2035 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2036 * @param string $date_format - Optional. - "m / d / Y, D"
2037 * @param bool $skip_midnight_time - Default false - if 00:00:00 then return '';
2038 * @return string - July 29, 2014
2039 */
2040 function wpbm_get_date_formatted( $date_sql, $date_format = false ) {
2041
2042 if ( $date_format === false ) $date_format = get_wpbm_option( 'wpbm_date_format' );
2043 if ( empty( $date_format ) ) $date_format = "m / d / Y, D";
2044
2045 $formated_date = date_i18n( $date_format, strtotime( $date_sql ) );
2046
2047 return $formated_date;
2048 }
2049
2050
2051 /** Get Formated Date & time
2052 *
2053 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2054 * @param string $time_format - Optional. - "H:i:s"
2055 * @return string - 12:00 am
2056 */
2057 function wpbm_get_time_formatted( $date_sql, $time_format = false , $skip_midnight_time = false ) {
2058
2059 if ( ( $skip_midnight_time ) && ( '00:00:00' == substr( $date_sql, -8 ) ) )
2060 return '';
2061
2062 if ( $time_format === false ) $time_format = get_wpbm_option( 'wpbm_time_format' );
2063 if ( empty( $time_format ) ) $time_format = 'h:i a';
2064
2065 $formated_date = date_i18n( $time_format, strtotime( $date_sql ) );
2066
2067 return $formated_date;
2068 }
2069
2070
2071 /** Check if "current_day" is tomorrow from "next_day"
2072 *
2073 * @param string $current_day_sql_check : 2015-02-29 00:00:00
2074 * @param string $next_day_sql_check : 2015-02-30 00:00:00
2075 * @return boolean : true | false
2076 */
2077 function wpbm_is_next_day( $current_day_sql_check, $next_day_sql_check ) {
2078
2079 // Current day
2080 $current_day_unix = strtotime( $current_day_sql_check );
2081
2082 $current_day_midnight_sql = date_i18n( 'Y-m-d', $current_day_unix );
2083 $current_day_midnight_unix = strtotime( $current_day_midnight_sql );
2084
2085 $calc_next_day_unix = strtotime( '+1 day', $current_day_midnight_unix );
2086
2087 // Next day
2088 $next_day_unix = strtotime( $next_day_sql_check );
2089 $next_day_midnight_sql = date_i18n( 'Y-m-d', $next_day_unix );
2090 $next_day_midnight_unix = strtotime( $next_day_midnight_sql );
2091
2092
2093 if ( $calc_next_day_unix == $next_day_midnight_unix )
2094 return true;
2095 else
2096 return false;
2097 }
2098
2099 /** Check if "current_day" is same day of "other_day"
2100 *
2101 * @param string $current_day_sql_check : 2015-02-29 00:00:00
2102 * @param string $other_day_sql_check : 2015-02-30 00:00:00
2103 * @return boolean : true | false
2104 */
2105 function wpbm_is_this_same_day( $current_day_sql_check, $other_day_sql_check ) {
2106
2107 // Current day
2108 $current_day_unix = strtotime( $current_day_sql_check );
2109
2110 $current_day_midnight_sql = date_i18n( 'Y-m-d', $current_day_unix );
2111 $current_day_midnight_unix = strtotime( $current_day_midnight_sql );
2112
2113 // Other day
2114 $other_day_unix = strtotime( $other_day_sql_check );
2115 $other_day_midnight_sql = date_i18n( 'Y-m-d', $other_day_unix );
2116 $other_day_midnight_unix = strtotime( $other_day_midnight_sql );
2117
2118
2119 if ( $current_day_midnight_unix == $other_day_midnight_unix )
2120 return true;
2121 else
2122 return false;
2123 }
2124
2125
2126 /** Get days in short format view
2127 *
2128 * @param string $days Dates: 15.05.2015, 16.05.2015, 17.05.2015
2129 * @return string Dates in format: 15.05.2015 - 17.05.2015
2130 */
2131 function wpbm_get_dates_short_format( $dates_sql_csv ) { // $days - string with comma seperated dates
2132
2133 if ( empty( $dates_sql_csv ) )
2134 return '';
2135
2136 $days = explode( ',', $dates_sql_csv );
2137
2138 $previosday = false;
2139 $result_string = '';
2140 $last_show_day = '';
2141
2142 foreach ( $days as $day ) {
2143
2144 $is_fin_at_end = false;
2145
2146 if ( $previosday === false ) { // First Day
2147
2148 $result_string = wpbm_get_date_time_formatted( $day, false, ' ', true ); // echo format for first day
2149 $last_show_day = $day;
2150 $previosday = $day; // Set previos day for next loop
2151
2152 } else { // Not first day
2153
2154 if (
2155 wpbm_is_next_day( $previosday, $day )
2156 || wpbm_is_this_same_day( $previosday, $day )
2157 ) { // Check if $day next day from previous
2158
2159 $previosday = $day; // Set previos day for next loop
2160 $is_fin_at_end = true;
2161 } else {
2162 if ( $last_show_day !== $previosday ) { // check if previos day was show or no
2163 $result_string .= ' - ' . wpbm_get_date_time_formatted( $previosday, false, ' ', true ); // assign in needed format this day
2164 }
2165 $result_string .= ', ' . wpbm_get_date_time_formatted( $day, false, ' ', true ); // assign in needed format this day
2166 $previosday = $day; // Set previos day for next loop
2167 $last_show_day = $day;
2168 }
2169 }
2170
2171 }
2172
2173 if ( $is_fin_at_end ) {
2174 $result_string .= ' - ' . wpbm_get_date_time_formatted( $day, false, ' ', true );
2175 }
2176
2177 return $result_string;
2178 }
2179
2180 // </editor-fold>