PluginProbe
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar / 2.0.11
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar v2.0.11
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.11, at core/wpbm-functions.php

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