<?php define('BOOKING_POPUP_MESSAGE', "<h2>You are about to book event</h2> <div class='event_details_wrapper'> <p class='event_details bold'>{event_title}</p> <p class='event_details'>{column_title}</p> <p class='event_details'>{event_start} - {event_end}</p> </div> {booking_form} <p>An initial receipt will be sent out automatically unless you decide not to do so below.</p> <div class='tt_btn_wrapper'>{tt_btn_book}{tt_btn_cancel}</div>"); define('BOOKING_POPUP_THANK_YOU_MESSAGE', "<h2>Thank you for choosing our services!</h2> <div class='event_details_wrapper'> <p class='event_details bold'>{event_title}</p> <p class='event_details'>{column_title}</p> <p class='event_details'>{event_start} - {event_end}</p> </div> <p class='info'>This is a confirmation of your booking. Your booking is now complete and a confirmation email has been sent to you.</p> <div class='tt_btn_wrapper'>{tt_btn_continue}</div>"); //timetable function tt_timetable($atts, $content) { $timetable_events_settings = timetable_events_settings(); wp_register_style('timetable_inline_style', false); wp_enqueue_style('timetable_inline_style'); $inline_style = ''; $defaults = array( 'event' => '', 'event_category' => '', 'events_page' => '', 'filter_style' => 'dropdown_list', 'filter_kind' => 'event', 'measure' => 1, 'show_booking_button' => 'no', 'show_available_slots' => 'no', 'available_slots_singular_label' => '{number_available}/{number_total} slot available', 'available_slots_plural_label' => '{number_available}/{number_total} slots available', 'allow_user_booking' => 'yes', 'allow_guest_booking' => 'no', 'default_booking_view' => 'user', 'show_guest_name_field' => 'yes', 'guest_name_field_required' => 'yes', 'show_guest_phone_field' => 'no', 'guest_phone_field_required' => 'no', 'show_guest_message_field' => 'no', 'guest_message_field_required' => 'no', 'booking_label' => 'Book now', 'booked_label' => 'Booked', 'unavailable_label' => 'Unavailable', 'booking_popup_label' => 'Book now', 'login_popup_label' => 'Log in', 'cancel_popup_label' => 'Cancel', 'continue_popup_label' => 'Continue', 'terms_checkbox' => 'no', 'terms_message' => 'Please accept terms and conditions', 'booking_popup_message' => BOOKING_POPUP_MESSAGE, 'booking_popup_thank_you_message' => BOOKING_POPUP_THANK_YOU_MESSAGE, 'filter_label' => 'All Events', 'filter_label_2' => 'All Events Categories', 'hour_category' => '', 'columns' => '', 'time_format' => 'H.i', 'hide_hours_column' => 0, 'hide_all_events_view' => 0, 'show_end_hour' => 0, 'event_layout' => 1, 'box_bg_color' => '00A27C', 'box_hover_bg_color' => '1F736A', 'box_txt_color' => 'FFFFFF', 'box_hover_txt_color' => 'FFFFFF', 'box_hours_txt_color' => 'FFFFFF', 'box_hours_hover_txt_color' => 'FFFFFF', 'filter_color' => '00A27C', 'row1_color' => 'F0F0F0', 'row2_color' => '', 'generate_pdf_text_color' => 'FFFFFF', 'generate_pdf_bg_color' => '00A27C', 'generate_pdf_hover_text_color' => 'FFFFFF', 'generate_pdf_hover_bg_color' => '1F736A', 'booking_text_color' => 'FFFFFF', 'booking_bg_color' => '05BB90', 'booking_hover_text_color' => 'FFFFFF', 'booking_hover_bg_color' => '07B38A', 'booked_text_color' => 'AAAAAA', 'booked_bg_color' => 'EEEEEE', 'unavailable_text_color' => 'AAAAAA', 'unavailable_bg_color' => 'EEEEEE', 'available_slots_color' => 'FFD544', 'hide_empty' => 0, 'disable_event_url' => 0, 'text_align' => 'center', 'row_height' => 31, 'id' => '', 'shortcode_id' => '', 'desktop_list_view' => 0, 'responsive' => 1, 'event_description_responsive' => 'none', 'collapse_event_hours_responsive' => 0, 'colors_responsive_mode' => 0, 'export_to_pdf_button' => 0, 'generate_pdf_label' => 'Generate PDF', 'pdf_font' => 'lato', 'direction' => 'ltr', 'font_custom' => '', 'font' => '', 'font_subset' => '', 'font_size' => '', 'custom_css' => '' ); if(isset($atts['shortcode_id']) && strlen($atts['shortcode_id'])) { $timetable_shortcodes_list = get_option("timetable_shortcodes_list"); if($timetable_shortcodes_list!==false && !empty($timetable_shortcodes_list[$atts['shortcode_id']])) { $shortcode = $timetable_shortcodes_list[$atts['shortcode_id']]; $shortcode = html_entity_decode(substr($shortcode, strpos($shortcode, '[')+1, $bracket2 = strrpos($shortcode, ']')-1)); $shortcode_atts = shortcode_parse_atts($shortcode); $defaults = array_merge($defaults, $shortcode_atts); } } //replace square entites to their applicable characters $attributes = shortcode_atts($defaults, $atts); array_walk($attributes, function(&$val, &$key) { $val = html_entity_decode($val); }); //default_booking_view if($attributes['default_booking_view']=='user') $attributes['allow_user_booking']='yes'; elseif($attributes['default_booking_view']=='guest') $attributes['allow_guest_booking']='yes'; $atts = $atts2 = $attributes; extract($atts); //replace grave accent added by Visual Composer $atts2["terms_message"] = $terms_message = str_replace("``", "\"", $terms_message); $atts2["booking_popup_message"] = $booking_popup_message = str_replace("``", "\"", $booking_popup_message); $atts2["booking_popup_thank_you_message"] = $booking_popup_thank_you_message = str_replace("``", "\"", $booking_popup_thank_you_message); $custom_css = str_replace("``", "\"", $custom_css); //remove leading '#' hash character $color_params = array('box_bg_color','box_hover_bg_color','box_txt_color','box_hover_txt_color','box_hours_txt_color','box_hours_hover_txt_color','filter_color','row1_color','row2_color','generate_pdf_text_color','generate_pdf_bg_color','generate_pdf_hover_text_color','generate_pdf_hover_bg_color','booking_text_color','booking_bg_color','booking_hover_text_color','booking_hover_bg_color','booked_text_color','booked_bg_color','unavailable_text_color','unavailable_bg_color','available_slots_color'); foreach($color_params as $color_param) { if(!empty($$color_param)) $$color_param = ltrim($$color_param, "#"); } $events_array = array_values(array_diff(array_filter(array_map('trim', explode(",", $event))), array("-"))); $event_category_array = array_values(array_diff(array_filter(array_map('trim', explode(",", $event_category))), array("-"))); if(!$hide_all_events_view) { $events_list_html = '<li><a href="#all-events' . ($id!='' ? '-' . urlencode($id) : '') . '" title="' . esc_attr($filter_label) . '">' . $filter_label . '</a></li>'; $events_categories_list_html = '<li><a href="#all-events' . ($id!='' ? '-' . urlencode($id) : '') . '" title="' . esc_attr(($filter_kind=="event_and_event_category" ? $filter_label_2 : $filter_label)) . '">' . ($filter_kind=="event_and_event_category" ? $filter_label_2 : $filter_label) . '</a></li>'; } else { $events_list_html = ''; $events_categories_list_html = ''; } if($filter_kind=="event" || !count($event_category_array) || ($filter_kind=="event_and_event_category" && !empty($event))) { $events_array_count = count($events_array); for($i=0; $i<$events_array_count; $i++) { $events_list = get_posts(array( "name" => $events_array[$i], 'post_type' => $timetable_events_settings['slug'], 'post_status' => 'publish' )); if($events_list) $events_list_html .= '<li><a href="#' . urlencode($events_array[$i]) . ($id!='' ? '-' . urlencode($id) : '') . '" title="' . esc_attr($events_list[0]->post_title) . '">' . $events_list[0]->post_title . '</a></li>'; if($hide_all_events_view && $filter_style=="dropdown_list" && ($filter_label=="All Events" || $filter_label=="") && !$i) { $filter_label = $events_list[$i]->post_title; } } } $events_category_array_count = 0; if($filter_kind=="event_category" || ($filter_kind=="event_and_event_category" && !empty($event_category))) { $events_category_array_count = count($event_category_array); for($i=0; $i<$events_category_array_count; $i++) { $category = get_term_by("slug", $event_category_array[$i], "events_category"); if(!empty($category)) { $events_categories_list_html .= '<li><a href="#' . urlencode($event_category_array[$i]) . ($id!='' ? '-' . urlencode($id) : '') . '" title="' . esc_attr($category->name) . '">' . $category->name . '</a></li>'; if($hide_all_events_view && $filter_style=="dropdown_list" && !$i) { if($filter_kind!="event_and_event_category" && ($filter_label=="All Events" || $filter_label=="")) $filter_label = $category->name; if($filter_kind=="event_and_event_category" && ($filter_label_2=="All Events Categories" || $filter_label_2=="")) $filter_label_2 = $category->name; } } } } $events_array_verified = array(); if(count($event_category_array)) { //events array ids $events_array_id = array(); for($i=0; $i<count($events_array); $i++) { $event_post = get_posts(array( 'name' => $events_array[$i], 'post_type' => $timetable_events_settings['slug'], 'post_status' => 'publish', 'numberposts' => 1 )); if(count($event_post)) { $events_array_id[] = $event_post[0]->ID; } } $events_array_cat = get_posts(array( 'include' => $events_array_id, 'post_type' => $timetable_events_settings['slug'], 'post_status' => 'publish', 'posts_per_page' => -1, 'nopaging' => true, 'orderby' => 'menu_order', 'order' => 'ASC', 'events_category' => implode("','", array_map("tt_strtolower_urlencode", $event_category_array)) )); if(!empty($events_array_cat)) { for($i=0; $i<count($events_array_cat); $i++) $events_array_verified[] = urldecode($events_array_cat[$i]->post_name); } else $events_array_verified = -1; } $output = ''; $output .= "<div " . ($id!="" ? "id='".urlencode($id)."'" : "") . " class='tt_wrapper " . ($direction=="rtl" ? "rtl" : "") . " " . ($show_booking_button=="on_hover" ? "booking_hover_buttons" : "") . "'>"; if($filter_style=="dropdown_list") { $output .= '<div class="tt_navigation_wrapper ' . ($filter_kind=="event_and_event_category" ? "tt_double_buttons" : "") . '"> <div class="tt_navigation_cell timetable_clearfix">'; if($filter_kind=="event_category" || $filter_kind=="event_and_event_category") { $output .= '<ul class="timetable_clearfix tabs_box_navigation events_categories_filter' . ((int)$responsive ? " tt_responsive" : "") . ' sf-timetable-menu"> <li class="tabs_box_navigation_selected" aria-haspopup="true"><label>' . ($filter_kind=="event_and_event_category" ? $filter_label_2 : $filter_label) . '</label><span class="tabs_box_navigation_icon"></span>' . (!$hide_all_events_view || !empty($event_category) ? '<ul class="sub-menu">' . $events_categories_list_html . '</ul>' : '') . '</li> </ul>'; } if($filter_kind=="event" || $filter_kind=="event_and_event_category") { $output .= '<ul class="timetable_clearfix tabs_box_navigation events_filter' . ((int)$responsive ? " tt_responsive" : "") . ' sf-timetable-menu"> <li class="tabs_box_navigation_selected" aria-haspopup="true"><label>' . $filter_label . '</label><span class="tabs_box_navigation_icon"></span>' . (!$hide_all_events_view || !empty($event) ? '<ul class="sub-menu">' . $events_list_html . '</ul>' : '') . '</li> </ul>'; } $output .= '</div>'; if($export_to_pdf_button && $responsive) { $pdf_text_color = (strtoupper($generate_pdf_text_color)!="FFFFFF" ? $generate_pdf_text_color : ""); $pdf_bg_color = (strtoupper($generate_pdf_bg_color)!="00A27C" ? $generate_pdf_bg_color : ""); $pdf_hover_text_color = (strtoupper($generate_pdf_hover_text_color)!="FFFFFF" || $pdf_text_color!="" ? $generate_pdf_hover_text_color : ""); $pdf_hover_bg_color = (strtoupper($generate_pdf_hover_bg_color)!="1F736A" || $pdf_bg_color!="" ? $generate_pdf_hover_bg_color : ""); $output .= "<div class='tt_navigation_cell timetable_clearfix'> <form class='tt_generate_pdf' action='' method='post'> <textarea class='tt_pdf_html' name='tt_pdf_html_content'></textarea> <input type='hidden' name='tt_action' value='tt_generate_pdf'/> <input type='hidden' name='tt_pdf_font' value='" . $pdf_font . "'/> <input type='submit' value='" . $generate_pdf_label . "' style='" . (strlen($pdf_text_color) ? " color: #" . $pdf_text_color . " !important;" : "") . (strlen($pdf_bg_color) ? " background-color: #" . $pdf_bg_color . ";" : "") . "' onMouseOver='" . (strlen($pdf_hover_text_color) ? " this.style.setProperty(\"color\", \"#" . $pdf_hover_text_color . "\", \"important\");" : "") . (strlen($pdf_hover_bg_color) ? " this.style.setProperty(\"background\", \"#" . $pdf_hover_bg_color . "\", \"important\");" : "") . "' onMouseOut='" . (strlen($pdf_hover_text_color) ? (strlen($pdf_text_color) ? " this.style.setProperty(\"color\", \"#" . $pdf_text_color . "\", \"important\");" : " this.style.color=\"\";") : "") . (strlen($pdf_hover_bg_color) ? (strlen($pdf_bg_color) ? " this.style.setProperty(\"background\", \"#" . $pdf_bg_color . "\", \"important\");" : " this.style.background=\"\";") : "") . "'/> </form> </div>"; } $output .= '</div>'; } if((int)$row_height!=31 || strtoupper($box_bg_color)!="00A27C" || strtoupper($filter_color)!="00A27C" || strtoupper($available_slots_color)!="FFD544" || $custom_css!="") { $inline_style .= $custom_css . ((int)$row_height!=31 ? ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable td{height: ' . (int)$row_height . (substr($row_height, -2)!="px" ? 'px' : '') . ';}' : '') . (strtoupper($box_bg_color)!="00A27C" ? ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable .event{background: #' . $box_bg_color . ';}' : '') . (strtoupper($filter_color)!="00A27C" ? ($id!="" ? '#' . $id : '') . ' .tt_tabs_navigation li a:hover,' . ($id!="" ? '#' . $id : '') . ' .tt_tabs_navigation li a.selected,' . ($id!="" ? '#' . $id : '') . ' .tt_tabs_navigation li.ui-tabs-active a{border-color:#' . $filter_color . ' !important;}' . ($id!="" ? '.' . $id : '') . '.tabs_box_navigation.sf-timetable-menu .tabs_box_navigation_selected{background-color:#' . $filter_color . ';border-color:#' . $filter_color . ';}' . ($id!="" ? '.' . $id : '') . '.tabs_box_navigation.sf-timetable-menu .tabs_box_navigation_selected:hover{background-color: #FFF; border: 1px solid rgba(0, 0, 0, 0.1);}' . ($id!="" ? '.' . $id : '') . '.sf-timetable-menu li ul li a:hover, .sf-timetable-menu li ul li.selected a:hover{background-color:#' . $filter_color . ';}' : '') . (strtoupper($available_slots_color)!="FFD544" ? ($id!="" ? '#' . $id : '') . ' .tt_timetable .event span.available_slots,' . ($id!="" ? '#' . $id : '') . ' .tt_responsive .tt_timetable.small .tt_items_list span.available_slots,' . ($id!="" ? '#' . $id : '') . ' .tt_responsive .tt_timetable.small .tt_items_list span.available_slots span.count { color:#' . $available_slots_color . ' !important;}' : ''); } if($font!="") $output .= '<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=' . $font . '&amp;subset=' . $font_subset . '">'; if($font_custom!="" || $font!="" || (int)$font_size>0) { $font_explode = explode(":", $font); $font = '"' . $font_explode[0] . '"'; $inline_style .= ($font_custom!="" || $font!="" ? ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable, #tt_booking_popup_message .tt_booking_message, #tt_booking_popup_message h2{font-family:' . ($font_custom!="" ? $font_custom : $font) . ' !important;}' : '') . ((int)$font_size>0 ? ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable th,' . ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable td,' . ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable .event .before_hour_text,' . ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable .event .after_hour_text,' . ($id!="" ? '#' . $id : '') . '.tt_tabs .tt_timetable .event .event_header{font-size:' . (int)$font_size . 'px !important;}' : ''); } $output .= '<div class="timetable_clearfix tt_tabs' . ((int)$responsive ? " tt_responsive" : "") . " event_layout_" . $event_layout . '"' . ($id!="" ? ' id="' . $id . '"' : '') . '>'; $output .= '<div class="tt_navigation_wrapper ' . ($filter_style=='tabs' ? '' : 'tt_hide') . '"> <div class="tt_navigation_cell timetable_clearfix">'; // we need to display all filter items, both events and events categories, so the filter buttons from both lists are working correctly if($filter_kind=="event_and_event_category") { $all_filters_list_html = $events_list_html . $events_categories_list_html; // filter list must be hidden $output .= '<ul class="timetable_clearfix tt_tabs_navigation all_filters" style="display: none !important;">' . $all_filters_list_html . '</ul>'; } if($filter_kind=="event" || $filter_kind=="event_and_event_category") { $events_list_html_view_all = ''; if($hide_all_events_view && empty($event)) $events_list_html_view_all = '<li><a href="#all-events' . ($id!='' ? '-' . urlencode($id) : '') . '" title="' . esc_attr($filter_label) . '">' . $filter_label . '</a></li>'; $output .= '<ul class="timetable_clearfix tt_tabs_navigation events_filter"' . ($filter_style=="dropdown_list" ? ' style="display: none;"' : '') . '>' . $events_list_html_view_all . $events_list_html . '</ul>'; } if($filter_kind=="event_category" || $filter_kind=="event_and_event_category") { $events_categories_list_html_view_all = ''; if($hide_all_events_view && empty($event_category)) $events_categories_list_html_view_all = '<li><a href="#all-events' . ($id!='' ? '-' . urlencode($id) : '') . '" title="' . esc_attr(($filter_kind=="event_and_event_category" ? $filter_label_2 : $filter_label)) . '">' . ($filter_kind=="event_and_event_category" ? $filter_label_2 : $filter_label) . '</a></li>'; $output .= '<ul class="timetable_clearfix tt_tabs_navigation events_categories_filter"' . ($filter_style=="dropdown_list" ? ' style="display: none;"' : '') . '>' . $events_categories_list_html_view_all . $events_categories_list_html . '</ul>'; } $output .= '</div>'; if($export_to_pdf_button && $filter_style=='tabs' && $responsive) { $pdf_text_color = (strtoupper($generate_pdf_text_color)!="FFFFFF" ? $generate_pdf_text_color : ""); $pdf_bg_color = (strtoupper($generate_pdf_bg_color)!="00A27C" ? $generate_pdf_bg_color : ""); $pdf_hover_text_color = (strtoupper($generate_pdf_hover_text_color)!="FFFFFF" || $pdf_text_color!="" ? $generate_pdf_hover_text_color : ""); $pdf_hover_bg_color = (strtoupper($generate_pdf_hover_bg_color)!="1F736A" || $pdf_bg_color!="" ? $generate_pdf_hover_bg_color : ""); $output .= "<div class='tt_navigation_cell timetable_clearfix'> <form class='tt_generate_pdf' action='' method='post'> <textarea class='tt_pdf_html' name='tt_pdf_html_content'></textarea> <input type='hidden' name='tt_action' value='tt_generate_pdf'/> <input type='hidden' name='tt_pdf_font' value='" . $pdf_font . "'/> <input type='submit' value='" . $generate_pdf_label . "' style='" . (strlen($pdf_text_color) ? " color: #" . $pdf_text_color . " !important;" : "") . (strlen($pdf_bg_color) ? " background-color: #" . $pdf_bg_color . ";" : "") . "' onMouseOver='" . (strlen($pdf_hover_text_color) ? " this.style.setProperty(\"color\", \"#" . $pdf_hover_text_color . "\", \"important\");" : "") . (strlen($pdf_hover_bg_color) ? " this.style.setProperty(\"background\", \"#" . $pdf_hover_bg_color . "\", \"important\");" : "") . "' onMouseOut='" . (strlen($pdf_hover_text_color) ? (strlen($pdf_text_color) ? " this.style.setProperty(\"color\", \"#" . $pdf_text_color . "\", \"important\");" : " this.style.color=\"\";") : "") . (strlen($pdf_hover_bg_color) ? (strlen($pdf_bg_color) ? " this.style.setProperty(\"background\", \"#" . $pdf_bg_color . "\", \"important\");" : " this.style.background=\"\";") : "") . "'/> </form> </div>"; } $output .= '</div>'; if(!$hide_all_events_view) { $output .= '<div id="all-events' . ($id!='' ? '-' . urlencode($id) : '') . '">' . (empty($events_array_verified) ? tt_get_timetable($atts, $events_array) : ($events_array_verified!=-1 ? tt_get_timetable($atts, $events_array_verified) : sprintf(__('No %s available!' , 'timetable'), strtolower($timetable_events_settings['label_plural'])))) . '</div>'; } if($filter_kind=="event" || !count($event_category_array) || $filter_kind=="event_and_event_category") { for($i=0; $i<$events_array_count; $i++) { $post = get_page_by_path($events_array[$i], ARRAY_A, $timetable_events_settings['slug']); $categories = wp_get_post_terms($post["ID"], "events_category"); $categories_str = ""; foreach($categories as $category) $categories_str .= "tt-event-category-" . $category->slug . ($id!='' ? '-' . urlencode($id) : '') . " "; $output .= '<div id="' . urlencode($events_array[$i]) . ($id!='' ? '-' . urlencode($id) : '') . '" class="tt-ui-tabs-hide ' . $categories_str . '">' . (empty($events_array_verified) || ($events_array_verified!=-1 && in_array($events_array[$i], $events_array_verified)) ? tt_get_timetable($atts, $events_array[$i]) : sprintf(__('No %s available!' , 'timetable'), strtolower($timetable_events_settings['label_plural']))) . '</div>'; } } if($filter_kind=="event_category" || $filter_kind=="event_and_event_category") { for($i=0; $i<$events_category_array_count; $i++) { $events_array_posts = array(); $events_array_posts = get_posts(array( 'include' => (array)$events_array_id, 'post_type' => $timetable_events_settings['slug'], 'post_status' => 'publish', 'events_category' => $event_category_array[$i], 'posts_per_page' => -1, 'nopaging' => true )); $events_array_for_timetable = array(); for($j=0; $j<count($events_array_posts); $j++) $events_array_for_timetable[] = urldecode($events_array_posts[$j]->post_name); $output .= '<div id="' . urlencode($event_category_array[$i]) . ($id!='' ? '-' . urlencode($id) : '') . '" class="tt-ui-tabs-hide">' . (count($events_array_posts) ? tt_get_timetable($atts, $events_array_for_timetable) : sprintf(__('No %1$s available in %2$s category!', 'timetable'), strtolower($timetable_events_settings['label_plural']), $event_category_array[$i])) . '</div>'; } } $output .= '</div>'; $output .= "<div class='tt_error_message tt_hide'>" . sprintf(__('No %s available!' , 'timetable'), strtolower($timetable_events_settings['label_plural'])) . "</div>"; $output .= "<div class='tt_booking_overlay tt_hide'> </div> <div class='tt_booking tt_hide'> <div class='tt_booking_message_wrapper'> <div class='tt_booking_message' data-event-hour-id> </div> <div class='tt_preloader tt_hide'> <div class='bounce1'></div> <div class='bounce2'></div> <div class='bounce3'></div> </div> </div> </div>"; $output .= '<input type="hidden" class="timetable_atts" name="timetable_atts" value="' . htmlentities(json_encode($atts2)) . '" />'; $output .= "</div>"; wp_add_inline_style('timetable_inline_style', $inline_style); return $output; } add_shortcode("tt_timetable", "tt_timetable"); /** * Generates the Timetable HTML code * * @param type $atts - timetable options * @param type $event - events that will be displayed * @return string - Timetable HTML code */ function tt_get_timetable($atts, $event = null) { $timetable_events_settings = timetable_events_settings(); extract(shortcode_atts(array( 'events_page' => '', 'measure' => 1, 'filter_style' => 'dropdown_list', 'filter_label' => 'All Events', 'show_booking_button' => 'no', 'show_available_slots' => 'no', 'available_slots_singular_label' => '{number_available}/{number_total} slot available', 'available_slots_plural_label' => '{number_available}/{number_total} slots available', 'allow_user_booking' => 'yes', 'allow_guest_booking' => 'no', 'default_booking_view' => 'user', 'show_guest_name_field' => 'yes', 'guest_name_field_required' => 'yes', 'show_guest_phone_field' => 'no', 'guest_phone_field_required' => 'no', 'show_guest_message_field' => 'no', 'guest_message_field_required' => 'no', 'booking_label' => 'Book now', 'booked_label' => 'Booked', 'unavailable_label' => 'Unavailable', 'hour_category' => '', 'columns' => '', 'time_format' => 'H.i', 'hide_hours_column' => 0, 'show_end_hour' => 0, 'event_layout' => 1, 'box_bg_color' => '00A27C', 'box_hover_bg_color' => '1F736A', 'box_txt_color' => 'FFFFFF', 'box_hover_txt_color' => 'FFFFFF', 'box_hours_txt_color' => 'FFFFFF', 'box_hours_hover_txt_color' => 'FFFFFF', 'row1_color' => 'F0F0F0', 'row2_color' => '', 'generate_pdf_text_color' => 'FFFFFF', 'generate_pdf_bg_color' => '00A27C', 'generate_pdf_hover_text_color' => 'FFFFFF', 'generate_pdf_hover_bg_color' => '1F736A', 'booking_text_color' => 'FFFFFF', 'booking_bg_color' => '05BB90', 'booking_hover_text_color' => 'FFFFFF', 'booking_hover_bg_color' => '07B38A', 'booked_text_color' => 'AAAAAA', 'booked_bg_color' => 'EEEEEE', 'unavailable_text_color' => 'AAAAAA', 'unavailable_bg_color' => 'EEEEEE', 'available_slots_color' => 'FFD544', 'hide_empty' => 0, 'disable_event_url' => 0, 'text_align' => 'center', 'row_height' => 31, 'id' => '', 'desktop_list_view' => 0, 'responsive' => 1, 'event_description_responsive' => 'none', 'collapse_event_hours_responsive' => 0, 'colors_responsive_mode' => 0, ), $atts)); //remove leading '#' hash character $color_params = array('box_bg_color','box_hover_bg_color','box_txt_color','box_hover_txt_color','box_hours_txt_color','box_hours_hover_txt_color','filter_color','row1_color','row2_color','generate_pdf_text_color','generate_pdf_bg_color','generate_pdf_hover_text_color','generate_pdf_hover_bg_color','booking_text_color','booking_bg_color','booking_hover_text_color','booking_hover_bg_color','booked_text_color','booked_bg_color','unavailable_text_color','unavailable_bg_color','available_slots_color'); foreach($color_params as $color_param) { if(!empty($$color_param)) $$color_param = ltrim($$color_param, "#"); } $measure = (double)$measure; $user_id = ($allow_user_booking=='yes' ? get_current_user_id() : 0); global $wpdb; if($columns!="") { $weekdays_explode = explode(",", $columns); $weekdays_in_query = ""; foreach($weekdays_explode as $weekday_explode) $weekdays_in_query .= "'" . tt_strtolower_urlencode($weekday_explode) . "'" . ($weekday_explode!=end($weekdays_explode) ? "," : ""); } if($hour_category!=null && $hour_category!="-") $hour_category = array_values(array_diff(array_filter(array_map('trim', explode(",", $hour_category))), array("-"))); $output = ""; $query = "SELECT TIME_FORMAT(t1.start, '%H.%i') AS start, TIME_FORMAT(t1.end, '%H.%i') AS end, t1.tooltip AS tooltip, t1.before_hour_text AS before_hour_text, t1.after_hour_text AS after_hour_text, t1.available_places AS available_places, t1.slots_per_user, COALESCE(t4.booking_count,0) AS booking_count, t1.event_hours_id AS event_hours_id, t2.ID AS event_id, t2.post_title AS event_title, t2.post_name AS post_name, t3.post_title, t3.menu_order, COALESCE(t6.booking_count,0) AS current_user_booking_count FROM " . $wpdb->prefix . "event_hours AS t1 LEFT JOIN {$wpdb->posts} AS t2 ON t1.event_id=t2.ID LEFT JOIN {$wpdb->posts} AS t3 ON t1.weekday_id=t3.ID LEFT JOIN (SELECT event_hours_id, COALESCE(COUNT(booking_id),0) as booking_count FROM " . $wpdb->prefix . "event_hours_booking GROUP BY event_hours_id) AS t4 ON t1.event_hours_id=t4.event_hours_id LEFT JOIN (SELECT event_hours_id, user_id, COUNT(booking_id) as booking_count FROM " . $wpdb->prefix . "event_hours_booking where user_id= " . (int)$user_id . " and user_id!=0 GROUP BY event_hours_id) AS t6 ON t1.event_hours_id=t6.event_hours_id "; $query .= " WHERE t2.post_type='" . $timetable_events_settings['slug'] . "' AND t2.post_status='publish'"; if(is_array($event) && count($event)) $query .= " AND t2.post_name IN('" . implode("','", array_map("tt_strtolower_urlencode", $event)) . "')"; else if($event!=null) $query .= " AND t2.post_name='" . tt_strtolower_urlencode($event) . "'"; if($hour_category!=null && $hour_category!="-") $query .= " AND t1.category IN('" . join("','", $hour_category) . "')"; $query .= " AND t3.post_type='timetable_weekdays' AND t3.post_status='publish'"; if(isset($weekdays_in_query) && $weekdays_in_query!="") $query .= " AND t3.post_name IN(" . $weekdays_in_query . ")"; //$query .= " ORDER BY FIELD(t3.menu_order,2,3,4,5,6,7,1), t1.start, t1.end"; $query .= " ORDER BY t3.menu_order, t1.start, t1.end, t2.post_name"; $event_hours = $wpdb->get_results($query); if(!count($event_hours)) return sprintf(__('No %s hours available!' , 'timetable'), strtolower($timetable_events_settings['label_plural'])); $event_hours_tt = array(); foreach($event_hours as $event_hour) { //$event_hours_tt[($event_hour->menu_order>1 ? $event_hour->menu_order-1 : 7)][] = array( $event_hours_tt[$event_hour->menu_order][] = array( "start" => $event_hour->start, "end" => $event_hour->end, "tooltip" => $event_hour->tooltip, "before_hour_text" => $event_hour->before_hour_text, "after_hour_text" => $event_hour->after_hour_text, "available_places" => $event_hour->available_places, "slots_per_user" => $event_hour->slots_per_user, "booking_count" => (is_null($event_hour->booking_count) ? 0 : $event_hour->booking_count), "current_user_booking_count" => (isset($event_hour->current_user_booking_count) ? $event_hour->current_user_booking_count : 0), "event_hours_id" => $event_hour->event_hours_id, "tooltip" => $event_hour->tooltip, "id" => $event_hour->event_id, "title" => $event_hour->event_title, "name" => $event_hour->post_name ); } //get weekdays $query = "SELECT post_title, menu_order FROM {$wpdb->posts} WHERE post_type='timetable_weekdays' AND post_status='publish'"; if(isset($weekdays_in_query) && $weekdays_in_query!="") $query .= " AND post_name IN(" . $weekdays_in_query . ")"; //$query .= " ORDER BY FIELD(menu_order,2,3,4,5,6,7,1)"; $query .= " ORDER BY menu_order"; $weekdays = $wpdb->get_results($query); //get min anx max hour $query = "SELECT min(TIME_FORMAT(t1.start, '%H.%i')) AS min, max(REPLACE(TIME_FORMAT(t1.end, '%H.%i'), '00.00', '24.00')) AS max FROM " . $wpdb->prefix . "event_hours AS t1 LEFT JOIN {$wpdb->posts} AS t2 ON t1.event_id=t2.ID LEFT JOIN {$wpdb->posts} AS t3 ON t1.weekday_id=t3.ID WHERE t2.post_type='" . $timetable_events_settings['slug'] . "' AND t2.post_status='publish'"; if(is_array($event) && count($event)) $query .= " AND t2.post_name IN('" . implode("','", array_map("tt_strtolower_urlencode", $event)) . "')"; else if($event!=null) $query .= " AND t2.post_name='" . tt_strtolower_urlencode($event) . "'"; if($hour_category!=null && $hour_category!="-") $query .= " AND t1.category IN('" . join("','", $hour_category) . "')"; $query .= " AND t3.post_type='timetable_weekdays' AND t3.post_status='publish'"; if(isset($weekdays_in_query) && $weekdays_in_query!="") $query .= " AND t3.post_name IN(" . $weekdays_in_query . ")"; $hours = $wpdb->get_row($query); $drop_columns = array(); $l = 0; $increment = 1; $hours_min = (int)$hours->min; if(!(int)$desktop_list_view) { $output .= '<table class="tt_timetable"> <thead> <tr class="row_gray"' . ($row1_color!="" ? ' style="background-color: ' . ($row1_color!="transparent" ? '#' : '') . $row1_color . ' !important;"' : '') . '>'; if(!(int)$hide_hours_column) $output .= '<th></th>'; foreach($weekdays as $weekday) { $output .= ' <th>' . $weekday->post_title . '</th>'; } $output .= ' </tr> </thead> <tbody>'; if((int)$measure==1) { $max_explode = explode(".", $hours->max); $max_hour = (int)$hours->max + (!empty($max_explode[1]) && (int)$max_explode[1]>0 ? 1 : 0); } else { $max_hour = $hours->max; $max_hour = to_decimal_time($max_hour); $max_hour = get_next_row_hour($max_hour, $measure); $increment = (double)$measure; $hours_min = to_decimal_time(roundMin($hours->min, $measure, to_decimal_time($hours_min))); } for($i=$hours_min; $i<$max_hour; $i=$i+$increment) { if((int)$measure==1) { $start = str_pad($i, 2, '0', STR_PAD_LEFT) . '.00'; $end = str_replace("24", "00", str_pad($i+1, 2, '0', STR_PAD_LEFT)) . '.00'; } else { $i = number_format($i, 2); $hourIExplode = explode(".", $i); $hourI = $hourIExplode[0] . "." . ((int)$hourIExplode[1]>0 ? (int)$hourIExplode[1]*60/100 : "00"); $start = number_format($i, 2); $end = number_format(str_replace("24", "00", $i+$measure), 2); $startExplode = explode(".", $start); $start = str_pad($startExplode[0], 2, '0', STR_PAD_LEFT) . "." . ((int)$startExplode[1]>0 ? (int)$startExplode[1]*60/100 : "00"); $endExplode = explode(".", $end); $end = str_pad($endExplode[0], 2, '0', STR_PAD_LEFT) . "." . ((int)$endExplode[1]>0 ? (int)$endExplode[1]*60/100 : "00"); } if($time_format!="H.i") { $start = date($time_format, strtotime($start)); $end = date($time_format, strtotime($end)); } /*$max_explode = explode(".", $hours->max); $max_hour = (int)$hours->max + ((int)$max_explode[1]>0 ? 1 : 0); for($i=(int)$hours->min; $i<$max_hour; $i++) { $start = str_pad($i, 2, '0', STR_PAD_LEFT) . '.00'; $end = str_replace("24", "00", str_pad($i+1, 2, '0', STR_PAD_LEFT)) . '.00'; if($time_format!="H.i") { $start = date($time_format, strtotime($start)); $end = date($time_format, strtotime($end)); }*/ $row_empty = true; $temp_empty_count = 0; $row_content = ""; for($j=0; $j<count($weekdays); $j++) { //$weekday_fixed_number = ($weekdays[$j]->menu_order>1 ? $weekdays[$j]->menu_order-1 : 7); $weekday_fixed_number = $weekdays[$j]->menu_order; if(!in_array($weekday_fixed_number, (array)(isset($drop_columns[$i]["columns"]) ? $drop_columns[$i]["columns"] : array()))) { if(tt_hour_in_array($i, (isset($event_hours_tt[$weekday_fixed_number]) ? $event_hours_tt[$weekday_fixed_number] : array()), $measure, $hours_min)) { $rowspan = tt_get_rowspan_value($i, $event_hours_tt[$weekday_fixed_number], 1, $measure, $hours_min); if($rowspan>1) { if((int)$measure==1) { for($k=1; $k<$rowspan; $k++) $drop_columns[$i+$k]["columns"][] = $weekday_fixed_number; } else { for($k=$measure; $k<$rowspan*$measure; $k=$k+$measure) { $tmp = number_format($i+$k, 2); $drop_columns["$tmp"]["columns"][] = $weekday_fixed_number; } } } $array_count = count($event_hours_tt[$weekday_fixed_number]); $hours = array(); if((int)$measure==1) { for($k=(int)$i; $k<(int)$i+$rowspan; $k++) $hours[] = $k; } else { for($k=(double)$i; $k<(double)$i+$rowspan*$measure; $k=$k+$measure) $hours[] = $k; } $events = array(); for($k=0; $k<$array_count; $k++) { if(((int)$measure==1 && in_array((int)$event_hours_tt[$weekday_fixed_number][$k]["start"], $hours)) || ((int)$measure!=1 && in_array(to_decimal_time(roundMin($event_hours_tt[$weekday_fixed_number][$k]["start"], $measure, $hours_min)), $hours))) { $events[$k]["name"] = $event_hours_tt[$weekday_fixed_number][$k]["name"]; $events[$k]["title"] = $event_hours_tt[$weekday_fixed_number][$k]["title"]; $events[$k]["tooltip"][] = $event_hours_tt[$weekday_fixed_number][$k]["tooltip"]; $events[$k]["before_hour_text"][] = $event_hours_tt[$weekday_fixed_number][$k]["before_hour_text"]; $events[$k]["after_hour_text"][] = $event_hours_tt[$weekday_fixed_number][$k]["after_hour_text"]; $events[$k]["available_places"][] = $event_hours_tt[$weekday_fixed_number][$k]["available_places"]; $events[$k]["slots_per_user"][] = $event_hours_tt[$weekday_fixed_number][$k]["slots_per_user"]; $events[$k]["booking_count"][] = $event_hours_tt[$weekday_fixed_number][$k]["booking_count"]; $events[$k]["current_user_booking_count"][] = $event_hours_tt[$weekday_fixed_number][$k]["current_user_booking_count"]; $events[$k]["event_hours_id"][] = $event_hours_tt[$weekday_fixed_number][$k]["event_hours_id"]; $events[$k]["id"] = $event_hours_tt[$weekday_fixed_number][$k]["id"]; $events[$k]["hours"][] = $event_hours_tt[$weekday_fixed_number][$k]["start"] . " - " . $event_hours_tt[$weekday_fixed_number][$k]["end"]; $event_hours_tt[$weekday_fixed_number][$k]["displayed"] = true; } } $color = ""; $text_color = ""; $hover_color = ""; $hover_text_color = ""; $hours_text_color = ""; $hours_hover_text_color = ""; if(count($events)==1 && count($events[key($events)]['hours'])==1) { $color = get_post_meta($events[key($events)]["id"], "timetable_color", true); if($color=="" && strtoupper($box_bg_color)!="00A27C") $color = $box_bg_color; $hover_color = get_post_meta($events[key($events)]["id"], "timetable_hover_color", true); if($hover_color=="" && (strtoupper($box_hover_bg_color)!="1F736A" || $color!="")) $hover_color = $box_hover_bg_color; $text_color = get_post_meta($events[key($events)]["id"], "timetable_text_color", true); if($text_color=="" && strtoupper($box_txt_color)!="FFFFFF") $text_color = $box_txt_color; $hover_text_color = get_post_meta($events[key($events)]["id"], "timetable_hover_text_color", true); if($hover_text_color=="" && (strtoupper($box_hover_txt_color)!="FFFFFF" || $text_color!="")) { $hover_text_color = $box_hover_txt_color; if($text_color=="") $text_color = "FFFFFF"; } $hours_text_color = get_post_meta($events[key($events)]["id"], "timetable_hours_text_color", true); if($hours_text_color=="" && strtoupper($box_hours_txt_color)!="FFFFFF") $hours_text_color = $box_hours_txt_color; $hours_hover_text_color = get_post_meta($events[key($events)]["id"], "timetable_hours_hover_text_color", true); if($hours_hover_text_color=="" && (strtoupper($box_hours_hover_txt_color)!="FFFFFF" || $hours_text_color!="")) { $hours_hover_text_color = $box_hours_hover_txt_color; if($hours_text_color=="") $hours_text_color = "FFFFFF"; } } $booking_text_color = ($booking_text_color!="" && strtoupper($booking_text_color)!="FFFFFF" ? $booking_text_color : ""); $booking_bg_color = ($booking_bg_color!="" && strtoupper( $booking_bg_color)!="05BB90" ? $booking_bg_color : ""); $booking_hover_text_color = ($booking_hover_text_color!="" && (strtoupper($booking_hover_text_color)!="FFFFFF" || $booking_text_color!="") ? $booking_hover_text_color : ""); $booking_hover_bg_color = ($booking_hover_bg_color!="" && (strtoupper($booking_hover_bg_color)!="07B38A" || $booking_bg_color!="") ? $booking_hover_bg_color : ""); $unavailable_text_color = ($unavailable_text_color!="" && strtoupper($unavailable_text_color)!="AAAAAA" ? $unavailable_text_color : ""); $unavailable_bg_color = ($unavailable_bg_color!="" && strtoupper($unavailable_bg_color)!="EEEEEE" ? $unavailable_bg_color : ""); $booked_text_color = ($booked_text_color!="" && strtoupper($booked_text_color)!="AAAAAA" ? $booked_text_color : ""); $booked_bg_color = ($booked_bg_color!="" && strtoupper($booked_bg_color)!="EEEEEE" ? $booked_bg_color : ""); $available_slots_color = ($available_slots_color!="" && strtoupper($available_slots_color)!="FFD544" ? $available_slots_color : ""); $global_colors = array( "box_bg_color" => $box_bg_color, "box_hover_bg_color" => $box_hover_bg_color, "box_txt_color" => $box_txt_color, "box_hover_txt_color" => $box_hover_txt_color, "box_hours_txt_color" => $box_hours_txt_color, "box_hours_hover_txt_color" => $box_hours_hover_txt_color, "booking_text_color" => ($booking_text_color), "booking_bg_color" => ($booking_bg_color), "booking_hover_text_color" => ($booking_hover_text_color), "booking_hover_bg_color" => ($booking_hover_bg_color), "booked_text_color" => ($booked_text_color), "booked_bg_color" => ($booked_bg_color), "unavailable_text_color" => ($unavailable_text_color), "unavailable_bg_color" => ($unavailable_bg_color), "available_slots_color" => ($available_slots_color), ); $row_content .= '<td' . ($color!="" || $text_color!="" || $text_align!="center" ? ' style="' . ($text_align!="center" ? 'text-align:' . $text_align . ';' : '') . ($color!="" ? 'background: #' . $color . ';' : '') . ($text_color!="" ? 'color: #' . $text_color . ';' : '') . '"': '') . ($hover_color!="" || $hover_text_color!="" || $hours_hover_text_color!="" ? ' onMouseOver="' . ($hover_color!="" ? 'this.style.background=\'#'.$hover_color.'\';' : '') . ($hover_text_color!="" ? 'this.style.color=\'#'.$hover_text_color.'\';jQuery(this).find(\'.event_header\').css(\'cssText\', \'color: #'.$hover_text_color.' !important\');' : '') . ($hours_hover_text_color!="" ? 'jQuery(this).find(\'.hours\').css(\'color\',\'#'.$hours_hover_text_color.'\');' : '') . '" onMouseOut="' . ($hover_color!="" ? 'this.style.background=\'#'.$color.'\';' : '') . ($hover_text_color!="" ? 'this.style.color=\'#'.$text_color.'\';jQuery(this).find(\'.event_header\').css(\'cssText\',\'color: #'.$text_color.' !important\');' : '') . ($hours_hover_text_color!="" ? 'jQuery(this).find(\'.hours\').css(\'color\',\'#'.$hours_text_color.'\');' : '') . '"' : '') . ' class="event' . (count(array_filter(array_values($events[key($events)]['tooltip']))) && count($events)==1 && count($events[key($events)]['hours'])==1 ? ' tt_tooltip' : '' ) . (count($events)==1 && count($events[key($events)]['hours'])==1 ? ' tt_single_event' : '') . '"' . ($rowspan>1 ? ' rowspan="' . $rowspan . '"' : '') . '>'; $row_content .= tt_get_row_content($events, compact("events_page", "time_format", "event_layout", "global_colors", "disable_event_url", "show_booking_button", "show_available_slots", "allow_user_booking", "allow_guest_booking", "default_booking_view", "booking_label", "available_slots_singular_label", "available_slots_plural_label", "booked_label", "unavailable_label")); $row_content .= '</td>'; $row_empty = false; } else $row_content .= '<td></td>'; $temp_empty_count++; } } if($temp_empty_count!=$j) $row_empty = false; if(((int)$hide_empty && !$row_empty) || !(int)$hide_empty) { $output .= '<tr class="row_' . ($l+1) . ($l%2==1 ? ' row_gray' : '') . '"' . ($l%2==1 && strtoupper($row1_color)!="F0F0F0" ? ' style="background: ' . ($row1_color!="transparent" ? '#' : '') . $row1_color . ' !important;"' : '') . ($l%2==0 && $row2_color!="" ? ' style="background: ' . ($row2_color!="transparent" ? '#' : '') . $row2_color . ' !important;"' : '') . '>'; if(!(int)$hide_hours_column) { $output .= '<td class="tt_hours_column"> ' . $start . ((int)$show_end_hour ? ' - ' . $end : '') . ' </td>'; } $output .= $row_content; $output .= '</tr>'; $l++; } } $output .= '</tbody> </table>'; } if((int)$desktop_list_view || (int)$responsive) { $output .= '<div class="tt_timetable small ' . ($colors_responsive_mode ? 'use_colors' : '') . ' ' . ((int)$desktop_list_view ? 'desktop' : '') . '">'; $l = 0; foreach($weekdays as $weekday) { //$weekday_fixed_number = ($weekday->menu_order>1 ? $weekday->menu_order-1 : 7); $weekday_fixed_number = $weekday->menu_order; if(isset($event_hours_tt[$weekday_fixed_number])) { $output .= '<h3 class="box_header ' . ($collapse_event_hours_responsive ? 'plus ' : '') . ($l>0 ? ' page_margin_top' : '') . '"> ' . $weekday->post_title . ' </h3> <ul class="tt_items_list thin page_margin_top timetable_clearfix' . (isset($mode) && $mode=='12h' ? ' mode12' : '') . '">'; $event_hours_count = count($event_hours_tt[$weekday_fixed_number]); for($i=0; $i<$event_hours_count; $i++) { if($time_format!="H.i") { $event_hours_tt[$weekday_fixed_number][$i]["start"] = date($time_format, strtotime($event_hours_tt[$weekday_fixed_number][$i]["start"])); $event_hours_tt[$weekday_fixed_number][$i]["end"] = date($time_format, strtotime($event_hours_tt[$weekday_fixed_number][$i]["end"])); } $classes_url = ""; $timetable_custom_url = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_custom_url", true); if(!(int)get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_disable_url", true) && !(int)$disable_event_url) $classes_url = ($timetable_custom_url!="" ? $timetable_custom_url : get_permalink($event_hours_tt[$weekday_fixed_number][$i]["id"])); $colors_html = ''; $list_colors_html = ''; $text_colors_html = ''; $hours_text_colors_html = ''; if($colors_responsive_mode) { $color = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_color", true); if($color=="" && strtoupper($box_bg_color)!="00A27C") $color = $box_bg_color; $hover_color = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_hover_color", true); if($hover_color=="" && (strtoupper($box_hover_bg_color)!="1F736A" || $color!="")) $hover_color = $box_hover_bg_color; $text_color = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_text_color", true); if($text_color=="" && strtoupper($box_txt_color)!="FFFFFF") $text_color = $box_txt_color; $hover_text_color = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_hover_text_color", true); if($hover_text_color=="" && (strtoupper($box_hover_txt_color)!="FFFFFF" || $text_color!="")) { $hover_text_color = $box_hover_txt_color; if($text_color=="") $text_color = "FFFFFF"; } $hours_text_color = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_hours_text_color", true); if($hours_text_color=="" && strtoupper($box_hours_txt_color)!="FFFFFF") $hours_text_color = $box_hours_txt_color; $hours_hover_text_color = get_post_meta($event_hours_tt[$weekday_fixed_number][$i]["id"], "timetable_hours_hover_text_color", true); if($hours_hover_text_color=="" && (strtoupper($box_hours_hover_txt_color)!="FFFFFF" || $hours_text_color!="")) { $hours_hover_text_color = $box_hours_hover_txt_color; if($hours_text_color=="") $hours_text_color = "FFFFFF"; } $colors_html = ($color!="" || $text_color!="" ? ' style="' . ($color!="" ? 'background: #' . $color . ';' : '') . ($text_color!="" ? 'color: #' . $text_color . ';' : '') . '"': '') . ($hover_color!="" || $hover_text_color!="" || $hours_hover_text_color!="" ? ' onMouseOver="' . ($hover_color!="" ? 'this.style.background=\'#'.$hover_color.'\';' : '') . ($hover_text_color!="" ? 'this.style.color=\'#'.$hover_text_color.'\';jQuery(this).find(\'.event_header,.event_description\').css(\'cssText\', \'color: #'.$hover_text_color.' !important\');' : '') . ($hours_hover_text_color!="" ? 'jQuery(this).find(\'.value\').css(\'color\',\'#'.$hours_hover_text_color.'\');' : '') . '" onMouseOut="' . ($hover_color!="" ? 'this.style.background=\'#'.$color.'\';' : '') . ($hover_text_color!="" ? 'this.style.color=\'#'.$text_color.'\';jQuery(this).find(\'.event_header,.event_description\').css(\'cssText\',\'color: #'.$text_color.' !important\');' : '') . ($hours_hover_text_color!="" ? 'jQuery(this).find(\'.value\').css(\'color\',\'#'.$hours_text_color.'\');' : '') . '"' : ''); $text_colors_html = ($text_color!="" ? ' style="color: #' . $text_color . ' !important;"' : ''); $hours_text_colors_html = ($hours_text_color!="" ? ' style="color:#' . $hours_text_color . ';"' : ''); } $output .= ' <li ' . $colors_html . ' class="timetable_clearfix"> <div class="event_container"> <' . ($classes_url!="" ? 'a' : 'span') . ($classes_url!="" ? ' href="' . $classes_url . '"' : '') . ' title="' . esc_attr($event_hours_tt[$weekday_fixed_number][$i]["title"]) . '"' . ' class="event_header" ' . $text_colors_html . '>' . $event_hours_tt[$weekday_fixed_number][$i]["title"] . ' </' . ($classes_url!="" ? 'a' : 'span') . '>'; if(in_array($event_description_responsive, array("description-2", "description-1", "description-1-and-description-2")) && ($event_hours_tt[$weekday_fixed_number][$i]["before_hour_text"] || $event_hours_tt[$weekday_fixed_number][$i]["after_hour_text"])) { $output .= '<span class="event_description" ' . $text_colors_html . '>'. (in_array($event_description_responsive, array("description-1", "description-1-and-description-2")) ? '<span class="event_description_1">'.do_shortcode($event_hours_tt[$weekday_fixed_number][$i]["before_hour_text"]).'</span>' : '') . (in_array($event_description_responsive, array("description-1-and-description-2")) && $event_hours_tt[$weekday_fixed_number][$i]["before_hour_text"]!="" && $event_hours_tt[$weekday_fixed_number][$i]["after_hour_text"]!="" ? '<span class="event_description_dot"> &middot; </span>' : '') . (in_array($event_description_responsive, array("description-2", "description-1-and-description-2")) ? '<span class="event_description_2">'.do_shortcode($event_hours_tt[$weekday_fixed_number][$i]["after_hour_text"]).'</span>' : '') . '</span>'; } $taken_slots = $event_hours_tt[$weekday_fixed_number][$i]["booking_count"]; $total_slots = $event_hours_tt[$weekday_fixed_number][$i]["available_places"]; $available_slots = $total_slots-$taken_slots; if($show_booking_button!="no") { if($show_available_slots=="always" && $total_slots) { $booking_slots_label = prepare_booking_slots_label(array( 'available_slots' => $available_slots, 'taken_slots' => $taken_slots, 'total_slots' => $total_slots, 'available_slots_singular_label' => $available_slots_singular_label, 'available_slots_plural_label' => $available_slots_plural_label, )); $output .= "<span class='available_slots id-" . $event_hours_tt[$weekday_fixed_number][$i]["event_hours_id"] . "'>"; $output .= $booking_slots_label; $output .= "</span>"; } } $output .= '</div>'; $output .= '<div class="value" ' . $hours_text_colors_html . '> <span class="start-hour">' . $event_hours_tt[$weekday_fixed_number][$i]["start"] . '</span><span class="hour-separator"> - </span><span class="end-hour">' . $event_hours_tt[$weekday_fixed_number][$i]["end"] . "</span>"; if($show_booking_button!="no") { $output .= prepare_booking_button(array( 'current_user_booking_count' => (int)$event_hours_tt[$weekday_fixed_number][$i]["current_user_booking_count"], 'slots_per_user' => $event_hours_tt[$weekday_fixed_number][$i]["slots_per_user"], 'event_hours_id' => $event_hours_tt[$weekday_fixed_number][$i]["event_hours_id"], 'booked_text_color' => $booked_text_color, 'booked_bg_color' => $booked_bg_color, 'booked_label' => $booked_label, 'available_slots' => $available_slots, 'unavailable_text_color' => $unavailable_text_color, 'unavailable_bg_color' => $unavailable_bg_color, 'unavailable_label' => $unavailable_label, 'booking_text_color' => $booking_text_color, 'booking_bg_color' => $booking_bg_color, 'booking_hover_text_color' => $booking_hover_text_color, 'booking_hover_bg_color' => $booking_hover_bg_color, 'booking_label' => $booking_label, 'show_booking_button' => $show_booking_button, )); } $output .= '</div> </li>'; } $output .= '</ul>'; $l++; } } $output .= '</div>'; } return $output; } function tt_get_row_content($events, $args) { extract($args); $content = ""; foreach($events as $key=>$details) { $color = ""; $hover_color = ""; $textcolor = ""; $hover_text_color = ""; $hours_text_color = ""; $hours_count = count($details["hours"]); if(count($events)>1 || (count($events)==1 && $hours_count>1)) { $color = get_post_meta($details["id"], "timetable_color", true); $hover_color = get_post_meta($details["id"], "timetable_hover_color", true); if($color=="" && strtoupper($global_colors["box_bg_color"])!="00A27C") $color = $global_colors["box_bg_color"]; if($hover_color=="" && (strtoupper($global_colors["box_hover_bg_color"])!="1F736A" || $color!="")) $hover_color = $global_colors["box_hover_bg_color"]; } $text_color = get_post_meta($details["id"], "timetable_text_color", true); if($text_color=="" && strtoupper($global_colors["box_txt_color"])!="FFFFFF") $text_color = $global_colors["box_txt_color"]; $hover_text_color = get_post_meta($details["id"], "timetable_hover_text_color", true); if($hover_text_color=="" && (strtoupper($global_colors["box_hover_txt_color"])!="FFFFFF" || $text_color!="")) { $hover_text_color = $global_colors["box_hover_txt_color"]; if($text_color=="") $text_color = "FFFFFF"; } $hours_text_color = get_post_meta($details["id"], "timetable_hours_text_color", true); if($hours_text_color=="" && strtoupper($global_colors["box_hours_txt_color"])!="FFFFFF") $hours_text_color = $global_colors["box_hours_txt_color"]; $hours_hover_text_color = get_post_meta($details["id"], "timetable_hours_hover_text_color", true); if($hours_hover_text_color=="" && (strtoupper($global_colors["box_hours_hover_txt_color"])!="FFFFFF" || $hours_text_color!="")) { $hours_hover_text_color = $global_colors["box_hours_hover_txt_color"]; if($hours_text_color=="") $hours_text_color = "FFFFFF"; } extract($global_colors); $timetable_custom_url = get_post_meta($details["id"], "timetable_custom_url", true); $classes_url = ""; if(!(int)get_post_meta($details["id"], "timetable_disable_url", true) && !(int)$disable_event_url) $classes_url = ($timetable_custom_url!="" ? $timetable_custom_url : get_permalink($details["id"])); $class_link = '<' . ($classes_url!="" ? 'a' : 'span') . ' class="event_header"' . ($classes_url!="" ? ' href="' . $classes_url /*. '#' . urldecode($details["name"])*/ . '"' : '') . ' title="' . esc_attr($details["title"]) . '"' . ($text_color!="" ? ' style="color: #' . $text_color . ' !important;"' : '') . '>' . $details["title"] . '</' . ($classes_url!="" ? 'a' : 'span') . '>'; for($i=0; $i<$hours_count; $i++) { $tooltip = ""; $content .= '<div class="event_container id-' . $details["id"] . (count(array_filter(array_values($details['tooltip']))) && (count($events)>1 || (count($events)==1 && $hours_count>1)) ? ' tt_tooltip' : '' ) . '"' . ($color!="" || ($text_color!="" && (count($events)>1 || (count($events)==1 && $hours_count>1))) ? ' style="' . ($color!="" ? 'background-color: #' . $color . ';' : '') . ($text_color!="" && (count($events)>1 || (count($events)==1 && $hours_count>1)) ? 'color: #' . $text_color . ';' : '') . '"': '') . (($hover_color!="" || $hover_text_color!="" || $hours_hover_text_color!="") && (count($events)>1 || (count($events)==1 && $hours_count>1)) ? ' onMouseOver="' . ($hover_color!="" ? 'this.style.background=\'#'.$hover_color.'\';' : '') . ($hover_text_color!="" ? 'this.style.color=\'#'.$hover_text_color.'\';jQuery(this).find(\'.event_header\').css(\'cssText\', \'color: #'.$hover_text_color.' !important\');' : '') . ($hours_hover_text_color!="" ? 'jQuery(this).find(\'.hours\').css(\'color\',\'#'.$hours_hover_text_color.'\');' : '') . '" onMouseOut="' . ($hover_color!="" ? 'this.style.background=\'#'.$color.'\';' : '') . ($hover_text_color!="" ? 'this.style.color=\'#'.$text_color.'\';jQuery(this).find(\'.event_header\').css(\'cssText\',\'color: #'.$text_color.' !important\');' : '') . ($hours_hover_text_color!="" ? 'jQuery(this).find(\'.hours\').css(\'color\',\'#'.$hours_text_color.'\');' : '') . '"' : '') . '>'; $hoursExplode = explode(" - ", $details["hours"][$i]); $startHour = date($time_format, strtotime($hoursExplode[0])); $endHour = date($time_format, strtotime($hoursExplode[1])); $description1_content = ""; if($details["before_hour_text"][$i]!="") $description1_content = "<div class='before_hour_text'>" . do_shortcode($details["before_hour_text"][$i]) . "</div>"; $description2_content = ""; if($details["after_hour_text"][$i]!="") $description2_content = "<div class='after_hour_text'>" . do_shortcode($details["after_hour_text"][$i]) . "</div>"; $top_hour_content = '<div class="top_hour"><span class="hours"' . ($hours_text_color!="" ? ' style="color:#' . $hours_text_color . ';"' : '') . '>' . $startHour . '</span></div>'; $bottom_hour_content = '<div class="bottom_hour"><span class="hours"' . ($hours_text_color!="" ? ' style="color:#' . $hours_text_color . ';"' : '') . '>' . $endHour . '</span></div>'; $hours_content = '<div class="hours_container"><span class="hours"' . ($hours_text_color!="" ? ' style="color:#' . $hours_text_color . ';"' : '') . '>' . $startHour . ' - ' . $endHour . '</span></div>'; $class_link_tooltip = '<' . ($classes_url!="" ? 'a' : 'span') . ' class="event_header"' . ($hover_text_color!="" ? ' style="color: #' . $hover_text_color . ';"': '') . ($classes_url!="" ? ' href="' . $classes_url /*. '#' . urldecode($details["name"])*/ . '"' : '') . ' title="' . esc_attr($details["title"]) . '">' . $details["title"] . '</' . ($classes_url!="" ? 'a' : 'span') . '>'; $tooltip = ($details["tooltip"][$i]!="" ? $class_link_tooltip : '') . $details["tooltip"][$i]; $booking_content = ''; $booking_slots_html = ''; if($show_booking_button!='no') { $taken_slots = $details['booking_count'][$i]; $total_slots = $details['available_places'][$i]; $available_slots = $total_slots-$taken_slots; $booking_content = prepare_booking_button(array( 'current_user_booking_count' => $details['current_user_booking_count'][$i], 'slots_per_user' => $details['slots_per_user'][$i], 'event_hours_id' => $details["event_hours_id"][$i], 'booked_text_color' => $booked_text_color, 'booked_bg_color' => $booked_bg_color, 'booked_label' => $booked_label, 'available_slots' => $available_slots, 'unavailable_text_color' => $unavailable_text_color, 'unavailable_bg_color' => $unavailable_bg_color, 'unavailable_label' => $unavailable_label, 'booking_text_color' => $booking_text_color, 'booking_bg_color' => $booking_bg_color, 'booking_hover_text_color' => $booking_hover_text_color, 'booking_hover_bg_color' => $booking_hover_bg_color, 'booking_label' => $booking_label, 'show_booking_button' => $show_booking_button, )); if($show_available_slots=="always" && $total_slots) { $booking_slots_label = prepare_booking_slots_label(array( 'available_slots' => $available_slots, 'taken_slots' => $taken_slots, 'total_slots' => $total_slots, 'available_slots_singular_label' => $available_slots_singular_label, 'available_slots_plural_label' => $available_slots_plural_label, )); $booking_slots_html = "<span class='available_slots id-" . $details["event_hours_id"][$i] . "'>"; $booking_slots_html .= $booking_slots_label; $booking_slots_html .= "</span>"; } } if((int)$event_layout==1) { $content .= $class_link; $content .= $description1_content; $content .= $top_hour_content; $content .= $bottom_hour_content; $content .= $description2_content; } else if((int)$event_layout==2) { $content .= $top_hour_content; $content .= $bottom_hour_content; $content .= $description1_content; $content .= $class_link; $content .= $description2_content; } else if((int)$event_layout==3) { $content .= $class_link; $content .= $description1_content; $content .= $hours_content; $content .= $description2_content; } else if((int)$event_layout==4) { $content .= $class_link; $content .= $description1_content; $content .= $top_hour_content; $content .= $description2_content; } else if((int)$event_layout==5) { $content .= $class_link; $content .= $description1_content; $content .= $description2_content; } $content .= $booking_slots_html; if(count($events)==1 && $hours_count==1) $content .= '</div>'; if($show_booking_button!="no") $content .= $booking_content; if($tooltip!="") { $hover_color = get_post_meta($details["id"], "timetable_hover_color", true); if($hover_color=="" && strtoupper($global_colors["box_hover_bg_color"])!="1F736A") $hover_color = $global_colors["box_hover_bg_color"]; $content .= '<div class="tt_tooltip_text"><div class="tt_tooltip_content"' . ($hover_color!="" || $hover_text_color!="" ? ' style="' . ($hover_color!="" ? 'background-color: #' . $hover_color . ';' : '') . ($hover_text_color!="" ? 'color: #' . $hover_text_color . ';' : '') . '"': '') . '>' . $tooltip . '</div><div class="tt_tooltip_arrow"' . ($hover_color!="" ? ' style="border-color: #' . $hover_color . ' transparent;"' : '') . '></div></div>'; } if(count($events)>1 || (count($events)==1 && $hours_count>1)) $content .= '</div>' . (end($events)!=$details || (end($events)==$details && $i+1<$hours_count) ? '<hr>' : ''); } /*$content .= $class_link; $hours_count = count($details["hours"]); for($i=0; $i<$hours_count; $i++) { if($time_format!="H.i") { $hoursExplode = explode(" - ", $details["hours"][$i]); $details["hours"][$i] = date($time_format, strtotime($hoursExplode[0])) . " - " . date($time_format, strtotime($hoursExplode[1])); } $content .= ($i!=0 ? '<br />' : ''); if($details["before_hour_text"][$i]!="") $content .= "<div class='before_hour_text'>" . $details["before_hour_text"][$i] . "</div>"; $content .= '<span class="hours"' . ($hours_text_color!="" ? ' style="color:#' . $hours_text_color . ';"' : '') . '>' . $details["hours"][$i] . '</span>'; if($details["after_hour_text"][$i]!="") $content .= "<div class='after_hour_text'>" . $details["after_hour_text"][$i] . "</div>"; $class_link_tooltip = '<a' . ($hover_text_color!="" ? ' style="color: #' . $hover_text_color . ';"': '') . ' href="' . $classes_url . '#' . urldecode($details["name"]) . '" title="' . esc_attr($key) . '">' . $key . '</a>'; $tooltip .= ($tooltip!="" && $details["tooltip"][$i]!="" ? '<br /><br />' : '' ) . ($details["tooltip"][$i]!="" ? $class_link_tooltip : '') . $details["tooltip"][$i]; }*/ /*if(count($events)==1) $content .= '</div>'; if($tooltip!="") { $hover_color = get_post_meta($details["id"], "timetable_hover_color", true); $content .= '<div class="tooltip_text"><div class="tooltip_content"' . ($hover_color!="" || $hover_text_color!="" ? ' style="' . ($hover_color!="" ? 'background-color: #' . $hover_color . ';' : '') . ($hover_text_color!="" ? 'color: #' . $hover_text_color . ';' : '') . '"': '') . '>' . $tooltip . '</div><span class="tooltip_arrow"' . ($hover_color!="" ? ' style="border-color: #' . $hover_color . ' transparent;"' : '') . '></span></div>'; } if(count($events)>1) $content .= '</div>' . (end($events)!=$details ? '<hr>' : '');*/ } return $content; } function tt_get_rowspan_value($hour, $array, $rowspan, $measure, $hours_min) { $array_count = count($array); $found = false; $hours = array(); if((int)$measure==1) { for($i=(int)$hour; $i<(int)$hour+$rowspan; $i++) $hours[] = $i; for($i=0; $i<$array_count; $i++) { if(in_array((int)$array[$i]["start"], $hours)) { $end_explode = explode(".", $array[$i]["end"]); $end_hour = (int)$array[$i]["end"] + ((int)$end_explode[1]>0 ? 1 : 0); if($end_hour-(int)$hour>1 && $end_hour-(int)$hour>$rowspan) { $rowspan = $end_hour-(int)$hour; $found = true; } } } } else { for($i=(double)$hour; $i<(double)$hour+$rowspan*$measure; $i=$i+$measure) $hours[] = $i; for($i=0; $i<$array_count; $i++) { if(in_array(to_decimal_time(roundMin($array[$i]["start"], $measure, $hours_min)), $hours)) { $end_hour = to_decimal_time($array[$i]["end"], false); //changed to false - wrong value for ex. 00:30 end hour //$end_hour = ($end_hour<24 ? get_next_row_hour($end_hour, $measure) : $end_hour); $end_hour = get_next_row_hour($end_hour, $measure); if($end_hour-(double)$hour>$measure && ($end_hour-(double)$hour)/$measure>$rowspan) { $rowspan = ($end_hour-(double)$hour)/$measure; $found = true; } } } } if(!$found) return $rowspan; else return tt_get_rowspan_value($hour, $array, $rowspan, $measure, $hours_min); } function roundMin($time, $measure, $hours_min) { /*echo "TIME:" . $time . "<br>"; echo "HOURS_MIN:" . $hours_min . "<br>"; $roundTo = $measure*60; $seconds = date('U', strtotime($time)); return date("H.i", floor($seconds / ($roundTo * 60)) * ($roundTo * 60));*/ $decimal_time = to_decimal_time($time); $found = false; while(!$found) { $hours_min=$hours_min+$measure; if($hours_min>$decimal_time) $found = true; } $hours_min = number_format($hours_min-$measure, 2); $hours_min_explode = explode(".", $hours_min); return str_pad($hours_min_explode[0], 2, '0', STR_PAD_LEFT) . "." . ((int)$hours_min_explode[1]>0 ? (int)$hours_min_explode[1]*60/100 : "00"); } function tt_hour_in_array($hour, $array, $measure, $hours_min) { $array_count = count($array); for($i=0; $i<$array_count; $i++) { if((int)$measure==1) { if((!isset($array[$i]["displayed"]) || (bool)$array[$i]["displayed"]!=true) && (int)$array[$i]["start"]==(int)$hour) return true; } else { if((!isset($array[$i]["displayed"]) || (bool)$array[$i]["displayed"]!=true) && to_decimal_time(roundMin($array[$i]["start"], $measure, $hours_min))==(double)$hour) return true; } } return false; } function to_decimal_time($time, $midReplace = false) { $timeExplode = explode(".", $time); return ($midReplace && (int)$timeExplode[0]==0 ? 24 : $timeExplode[0]) . "." . (isset($timeExplode[1]) && (int)$timeExplode[1]>0 ? sprintf("%02s", ceil($timeExplode[1]/60*100)) : "00"); } function get_next_row_hour($hour, $measure) { $hourExplode = explode(".", $hour); if((int)$hourExplode[1]>0) { if((int)$hourExplode[1]+$measure*100>100) { $hour = (int)$hourExplode[0]+1; if($hour==24) $hour = 0; $minutes = "00"; } else if(fmod((int)$hourExplode[1],(double)$measure*100)!=0) { for($i=0; $i<100; $i=$i+$measure*100) { if((int)$hourExplode[1]<$i) { $minutes = $i; break; } } $hour = (int)$hourExplode[0]; } else { $hour = (int)$hourExplode[0]; $minutes = (int)$hourExplode[1]; } } else { $hour = (int)$hourExplode[0]; $minutes = (int)$hourExplode[1]; } if($hour . "." . $minutes == "0.00") return "24.00"; return $hour . "." . $minutes; } function tt_strtolower_urlencode($val) { return strtolower(urlencode($val)); } /*function get_next_row_hour($hour, $measure, $next = 1) { $hourExplode = explode(".", $hour); if((int)$hourExplode[1]>0) { if((int)$hourExplode[1]+$measure*100>=100) { $hour = (int)$hourExplode[0]+1; //if($hour==24) //$hour = 0; if((int)$hourExplode[1]+$measure*100==100 || !$next) $minutes = "00"; else $minutes = $measure*100; } else { if(fmod((int)$hourExplode[1],(double)$measure*100)==0) $minutes = (int)$hourExplode[1]; else for($i=0; $i<100; $i=$i+$measure*100) { if((int)$hourExplode[1]<$i) { $minutes = $i; break; } } $hour = (int)$hourExplode[0]; if($next) $minutes = $minutes+$measure*100; if($minutes>100-$measure*100) { $hour = $hour+1; if($minutes==100 || !$next) $minutes = "00"; else $minutes = $measure*100; } } } else { $hour = (int)$hourExplode[0]; if($next) $minutes = $measure*100; else $minutes = (int)$hourExplode[1]; } return $hour . "." . $minutes; }*/ function timetable_vc_init() { include_once(ABSPATH . 'wp-admin/includes/plugin.php'); if(!is_plugin_active('js_composer/js_composer.php') || !function_exists('vc_map') || !function_exists('vc_add_shortcode_param')) return; //add support for multiple select field vc_add_shortcode_param('dropdownmulti' , 'timetable_vc_dropdownmultiple_settings_field'); global $wpdb; $timetable_events_settings = timetable_events_settings(); //get saved shortcodes $timetable_shortcodes_list = get_option('timetable_shortcodes_list'); $timetable_shortcodes_array = array(__('choose...', 'timetable') => '-1'); if(!empty($timetable_shortcodes_list)) { foreach($timetable_shortcodes_list as $key=>$val) $timetable_shortcodes_array[$key] = $key; } //get events list $events_list = get_posts(array( 'posts_per_page' => -1, 'nopaging' => true, 'orderby' => 'title', 'order' => 'ASC', 'post_type' => $timetable_events_settings['slug'] )); $events_array = array(); $events_array["All"] =""; foreach($events_list as $event) $events_array[$event->post_title . " (id:" . $event->ID . ")"] = urldecode($event->post_name); //get events categories list $events_categories = get_terms(array( 'taxonomy' => 'events_category', 'orderby' => 'name', 'order' => 'ASC', )); $events_categories_array = array(); $events_categories_array["All"] =""; foreach($events_categories as $events_category) $events_categories_array[$events_category->name] = urldecode($events_category->slug); //get hour categories $query = "SELECT distinct(category) AS category FROM " . $wpdb->prefix . "event_hours AS t1 LEFT JOIN {$wpdb->posts} AS t2 ON t1.event_id=t2.ID WHERE t2.post_type='" . $timetable_events_settings['slug'] . "' AND t2.post_status='publish' AND category<>'' ORDER BY category ASC"; $hour_categories = $wpdb->get_results($query); $hour_categories_array = array(); $hour_categories_array["All"] =""; foreach($hour_categories as $hour_category) $hour_categories_array[$hour_category->category] = $hour_category->category; //get columns $weekdays_list = get_posts(array( 'posts_per_page' => -1, 'nopaging' => true, 'orderby' => 'menu_order', 'order' => 'ASC', 'post_type' => 'timetable_weekdays' )); $weekdays_array = array(); $weekdays_array["All"] =""; foreach($weekdays_list as $weekday) $weekdays_array[$weekday->post_title . " (id:" . $weekday->ID . ")"] = urldecode($weekday->post_name); //get google fonts $fontsArray = timetable_get_google_fonts(); $google_fonts_array=array(); $google_fonts_array["Default"]=""; if(isset($fontsArray)) { $fontsCount = count((array)$fontsArray->items); for($i=0; $i<$fontsCount; $i++) { $variantsCount = count((array)$fontsArray->items[$i]->variants); if($variantsCount>1) { for($j=0; $j<$variantsCount; $j++) { $google_fonts_array[$fontsArray->items[$i]->family . ":" . $fontsArray->items[$i]->variants[$j]] = $fontsArray->items[$i]->family . ":" . $fontsArray->items[$i]->variants[$j]; } } else { $google_fonts_array[$fontsArray->items[$i]->family] = $fontsArray->items[$i]->family; } } } vc_map(array( "name" => __("Timetable", 'timetable'), "base" => "tt_timetable", "class" => "", "controls" => "full", "show_settings_on_create" => true, "icon" => "icon-wpb-layer-timetable", "admin_enqueue_js" => array(plugin_dir_url(__FILE__).'/admin/js/timetable_vc.js'), "front_enqueue_js" => array(plugin_dir_url(__FILE__).'/admin/js/timetable_vc.js'), "params" => array( array( "type" => "dropdown", "class" => "", "heading" => __("Choose shortcode id:", "timetable"), "param_name" => "shortcode_id", "value" => $timetable_shortcodes_array, ), array( "type" => "dropdownmulti", "class" => "", "heading" => __("Events", "timetable"), "param_name" => "event", "value" => $events_array, ), array( "type" => "dropdownmulti", "class" => "", "heading" => __("Event categories", "timetable"), "param_name" => "event_category", "value" => $events_categories_array, ), array( "type" => "dropdownmulti", "class" => "", "heading" => __("Hour categories", "timetable"), "param_name" => "hour_category", "value" => $hour_categories_array, ), array( "type" => "dropdownmulti", "class" => "", "heading" => __("Columns", "timetable"), "param_name" => "columns", "value" => $weekdays_array, ), array( "type" => "dropdown", "class" => "", "heading" => __("Hour measure", "timetable"), "param_name" => "measure", "value" => array( __("Hour (1h)", "timetable") => "1", __("Half hour (30min)", "timetable") => "0.5", __("Quarter hour (15min)", "timetable") => "0.25", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Filter style", "timetable"), "param_name" => "filter_style", "value" => array( __("Dropdown list", "timetable") => "dropdown_list", __("Tabs", "timetable") => "tabs", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Filter kind", "timetable"), "param_name" => "filter_kind", "value" => array( __("By event", "timetable") => "event", __("By event category", "timetable") => "event_category", __("By event and event category", "timetable") => "event_and_event_category", ), ), array( "type" => "textfield", "class" => "", "heading" => __("Filter label", "timetable"), "param_name" => "filter_label", "value" => __("All Events", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Filter label 2", "timetable"), "param_name" => "filter_label_2", "value" => __("All Events Categories", "timetable"), "dependency" => array( "element" => "filter_kind", "value" => array("event_and_event_category"), ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Select time format", "timetable"), "param_name" => "select_time", "value" => array( __("09.03 (H.i)", "timetable") => "H.i", __("09:03 (H:i)", "timetable") => "H:i", __("9:03 am (g:i a)", "timetable") => "g:i a", __("9:03 AM (g:i A)", "timetable") => "g:i A", ), ), array( "type" => "textfield", "class" => "", "heading" => __("Time format", "timetable"), "param_name" => "time_format", "value" => "H.i", ), array( "type" => "dropdown", "class" => "", "heading" => __("Hide 'All Events' view", "timetable"), "param_name" => "hide_all_events_view", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Hide first (hours) column", "timetable"), "param_name" => "hide_hours_column", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Show end hour in first (hours) column", "timetable"), "param_name" => "show_end_hour", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Event block layout", "timetable"), "param_name" => "event_layout", "value" => array( __("Type 1", "timetable") => "1", __("Type 2", "timetable") => "2", __("Type 3", "timetable") => "3", __("Type 4", "timetable") => "4", __("Type 5", "timetable") => "5", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Hide empty rows", "timetable"), "param_name" => "hide_empty", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Disable event url", "timetable"), "param_name" => "disable_event_url", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Text align", "timetable"), "param_name" => "text_align", "value" => array( __("center", "timetable") => "center", __("left", "timetable") => "left", __("right", "timetable") => "right", ), ), array( "type" => "textfield", "class" => "", "heading" => __("Id", "timetable"), "param_name" => "id", "value" => "", ), array( "type" => "textfield", "class" => "", "heading" => __("Row height (in px)", "timetable"), "param_name" => "row_height", "value" => "31", ), array( "type" => "dropdown", "class" => "", "heading" => __("Display list view on desktop", "timetable"), "param_name" => "desktop_list_view", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Responsive", "timetable"), "param_name" => "responsive", "value" => array( __("Yes", "timetable") => "1", __("No", "timetable") => "0", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Event description in responsive mode", "timetable"), "param_name" => "event_description_responsive", "value" => array( __("None", "timetable") => "none", __("Only Description 1", "timetable") => "description-1", __("Only Description 2", "timetable") => "description-2", __("Description 1 and Description 2", "timetable") => "description-1-and-description-2", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Collapse event hours in responsive mode", "timetable"), "param_name" => "collapse_event_hours_responsive", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Use colors in responsive mode", "timetable"), "param_name" => "colors_responsive_mode", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Export to PDF button", "timetable"), "param_name" => "export_to_pdf_button", "value" => array( __("No", "timetable") => "0", __("Yes", "timetable") => "1", ), ), array( "type" => "textfield", "class" => "", "heading" => __("Generate PDF label", "timetable"), "param_name" => "generate_pdf_label", "value" => __("Generate PDF", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("PDF Font", "timetable"), "param_name" => "pdf_font", "value" => array( __("Lato", "timetable") => "lato", __("DejaVu Sans", "timetable") => "dejavusans", ), ), array( "type" => "colorpicker", "class" => "", "heading" => __("Timetable box background color", "timetable"), "param_name" => "box_bg_color", "value" => "#00a27c", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Timetable box hover background color", "timetable"), "param_name" => "box_hover_bg_color", "value" => "#1f736a", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Timetable box text color", "timetable"), "param_name" => "box_txt_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Timetable box hover text color", "timetable"), "param_name" => "box_hover_txt_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Timetable box hours text color", "timetable"), "param_name" => "box_hours_txt_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Timetable box hours hover text color", "timetable"), "param_name" => "box_hours_hover_txt_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Filter control background color", "timetable"), "param_name" => "filter_color", "value" => "#00a27c", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Row 1 style background color", "timetable"), "param_name" => "row1_color", "value" => "#f0f0f0", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Row 2 style background color", "timetable"), "param_name" => "row2_color", "value" => "", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Generate PDF button text color", "timetable"), "param_name" => "generate_pdf_text_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Generate PDF button background color", "timetable"), "param_name" => "generate_pdf_bg_color", "value" => "#00a27c", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Generate PDF button hover text color", "timetable"), "param_name" => "generate_pdf_hover_text_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Generate PDF button hover background color", "timetable"), "param_name" => "generate_pdf_hover_bg_color", "value" => "#1f736a", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Booking button text color", "timetable"), "param_name" => "booking_text_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Booking button background color", "timetable"), "param_name" => "booking_bg_color", "value" => "#05bb90", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Booking button hover text color", "timetable"), "param_name" => "booking_hover_text_color", "value" => "#ffffff", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Booking button hover background color", "timetable"), "param_name" => "booking_hover_bg_color", "value" => "#07b38a", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Booked button text color", "timetable"), "param_name" => "booked_text_color", "value" => "#aaaaaa", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Booked button background color", "timetable"), "param_name" => "booked_bg_color", "value" => "#eeeeee", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Unavailable button text color", "timetable"), "param_name" => "unavailable_text_color", "value" => "#aaaaaa", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Unavailable button background color", "timetable"), "param_name" => "unavailable_bg_color", "value" => "#eeeeee", ), array( "type" => "colorpicker", "class" => "", "heading" => __("Available slots color", "timetable"), "param_name" => "available_slots_color", "value" => "#ffd544", ), array( "type" => "textfield", "class" => "", "heading" => __("Table header font", "timetable"), "param_name" => "font_custom", "value" => "", ), array( "type" => "dropdown", "class" => "", "heading" => __("or choose Google font", "timetable"), "param_name" => "font", "value" => $google_fonts_array, ), array( "type" => "dropdownmulti", "class" => "", "heading" => __("Google font subset", "timetable"), "param_name" => "font_subset", "value" => array( "", "arabic", "hebrew", "telugu", "cyrillic-ext", "cyrillic", "devanagari", "greek-ext", "greek", "vietnamese", "latin-ext", "latin", "khmer", ), "dependency" => array( "element" => "font", "not_empty" => true, "callback" => "timetable_font_subset_init", ), ), array( "type" => "textfield", "class" => "", "heading" => __("Font size (in px)", "timetable"), "param_name" => "font_size", "value" => "", ), array( "type" => "dropdown", "class" => "", "heading" => __("Show booking button", "timetable"), "param_name" => "show_booking_button", "value" => array( __("No", "timetable") => "no", __("Always", "timetable") => "always", __("On hover", "timetable") => "on_hover", ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Show available slots", "timetable"), "param_name" => "show_available_slots", "value" => array( __("No", "timetable") => "no", __("Always", "timetable") => "always", ), ), array( "type" => "textfield", "class" => "", "heading" => __("Available slots singular label", "timetable"), "param_name" => "available_slots_singular_label", "value" => "{number_available}/{number_total} slot available", "description" => __("Specify text label for 'slot available' information (singular). Available placeholders: {number_available}, {number_taken}, {number_total}.", "timetable") ), array( "type" => "textfield", "class" => "", "heading" => __("Available slots plural label", "timetable"), "param_name" => "available_slots_plural_label", "value" => "{number_available}/{number_total} slots available", "description" => __("Specify text label for 'slots available' information (plural). Available placeholders: {number_available}, {number_taken}, {number_total}.", "timetable") ), array( "type" => "dropdown", "class" => "", "heading" => __("Default booking view", "timetable"), "param_name" => "default_booking_view", "value" => array( __("User", "timetable") => "user", __("Guest", "timetable") => "guest", ), "description" => __("Specify which booking view should be visible by default.", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Allow user booking", "timetable"), "param_name" => "allow_user_booking", "value" => array( __("Yes", "timetable") => "yes", __("No", "timetable") => "no", ), "description" => __("Set to 'Yes' if you want to allow logged in users to make a booking.", "timetable"), "dependency" => array( "element" => "default_booking_view", "value" => array("guest"), ), ), array( "type" => "dropdown", "class" => "", "heading" => __("Allow guest booking", "timetable"), "param_name" => "allow_guest_booking", "value" => array( __("No", "timetable") => "no", __("Yes", "timetable") => "yes", ), "description" => __("Set to 'Yes' if you want to allow guests to make a booking.", "timetable"), /*"dependency" => array( "element" => "default_booking_view", "value" => array("user"), ),*/ ), array( "type" => "dropdown", "class" => "", "heading" => __("Show guest name field", "timetable"), "param_name" => "show_guest_name_field", "value" => array( __("Yes", "timetable") => "yes", __("No", "timetable") => "no", ), "dependency" => array( "element" => "allow_guest_booking", "value" => array("yes"), ), "description" => __("Set to 'Yes' if you want to show 'Name' field in guest booking form.", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Guest name field required", "timetable"), "param_name" => "guest_name_field_required", "value" => array( __("Yes", "timetable") => "yes", __("No", "timetable") => "no", ), "dependency" => array( "element" => "allow_guest_booking", "value" => array("yes"), ), "description" => __("Set to 'Yes' if the 'Name' field should be required.", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Show guest phone field", "timetable"), "param_name" => "show_guest_phone_field", "value" => array( __("No", "timetable") => "no", __("Yes", "timetable") => "yes", ), "dependency" => array( "element" => "allow_guest_booking", "value" => array("yes"), ), "description" => __("Set to 'Yes' if you want to show 'Phone' field in guest booking form.", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Guest phone field required", "timetable"), "param_name" => "guest_phone_field_required", "value" => array( __("No", "timetable") => "no", __("Yes", "timetable") => "yes", ), "dependency" => array( "element" => "allow_guest_booking", "value" => array("yes"), ), "description" => __("Set to 'Yes' if the 'Phone' field should be required.", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Show guest message field", "timetable"), "param_name" => "show_guest_message_field", "value" => array( __("No", "timetable") => "no", __("Yes", "timetable") => "yes", ), "dependency" => array( "element" => "allow_guest_booking", "value" => array("yes"), ), "description" => __("Set to 'Yes' if you want to show 'Message' field in guest booking form.", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Guest message field required", "timetable"), "param_name" => "guest_message_field_required", "value" => array( __("No", "timetable") => "no", __("Yes", "timetable") => "yes", ), "dependency" => array( "element" => "allow_guest_booking", "value" => array("yes"), ), "description" => __("Set to 'Yes' if the 'Message' field should be required.", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Booking label", "timetable"), "param_name" => "booking_label", "value" => __("Book now", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Booked label", "timetable"), "param_name" => "booked_label", "value" => __("Booked", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Unavailable label", "timetable"), "param_name" => "unavailable_label", "value" => __("Unavailable", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Popup booking label", "timetable"), "param_name" => "booking_popup_label", "value" => __("Book now", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Popup login label", "timetable"), "param_name" => "login_popup_label", "value" => __("Log in", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Popup cancel label", "timetable"), "param_name" => "cancel_popup_label", "value" => __("Cancel", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Popup continue label", "timetable"), "param_name" => "continue_popup_label", "value" => __("Continue", "timetable"), ), array( "type" => "dropdown", "class" => "", "heading" => __("Terms and conditions checkbox", "timetable"), "param_name" => "terms_checkbox", "value" => array( __("No", "timetable") => "no", __("Yes", "timetable") => "yes", ), "description" => __("Set to 'Yes' if you want to display 'Terms and conditions' checkbox.", "timetable"), ), array( "type" => "textfield", "class" => "", "heading" => __("Terms and conditions message", "timetable"), "param_name" => "terms_message", "value" => __("Please accept terms and conditions", "timetable"), "description" => __("Specify text for 'Terms and conditions' checkbox.", "timetable"), ), array( "type" => "textarea", "class" => "", "heading" => __("Booking pop-up message", "timetable"), "param_name" => "booking_popup_message", "value" => BOOKING_POPUP_MESSAGE, "description" => __("Specify text that will appear in pop-up window. Available placeholders: {event_title} {column_title} {event_start} {event_end} {event_description_1} {event_description_2} {user_name} {user_email} {tt_btn_book} {tt_btn_cancel} {tt_btn_continue}", 'timetable'), ), array( "type" => "textarea", "class" => "", "heading" => __("Booking pop-up thank you message", "timetable"), "param_name" => "booking_popup_thank_you_message", "value" => BOOKING_POPUP_THANK_YOU_MESSAGE, "description" => __("Specify text that will appear in pop-up window. Available placeholders: {event_title} {column_title} {event_start} {event_end} {event_description_1} {event_description_2} {user_name} {user_email} {tt_btn_continue}", 'timetable'), ), array( "type" => "textarea", "class" => "", "heading" => __("Custom CSS", "timetable"), "param_name" => "custom_css", "value" => "", ), ), )); } add_action('init', 'timetable_vc_init'); function timetable_vc_dropdownmultiple_settings_field($settings, $value) { $value = ($value==null ? array() : $value); if(!is_array($value)) $value = explode(",", $value); $output = '<select name="'.$settings['param_name'].'" class="wpb_vc_param_value wpb-input wpb-select '.$settings['param_name'].' '.$settings['type'].'" multiple>'; foreach ( $settings['value'] as $text_val => $val ) { if ( is_numeric($text_val) && is_string($val) || is_numeric($text_val) && is_numeric($val) ) { $text_val = $val; } $text_val = __($text_val, "js_composer"); $selected = ''; if ( in_array($val,$value) ) $selected = ' selected="selected"'; $output .= '<option class="'.$val.'" value="'.$val.'"'.$selected.'>'.$text_val.'</option>'; } $output .= '</select>'; return $output; } function prepare_booking_button($args) { $args = shortcode_atts(array( 'show_booking_button' => 'no', 'show_available_slots' => 'no', 'available_slots_singular_label' => '{number_available}/{number_total} slot available', 'available_slots_plural_label' => '{number_available}/{number_total} slots available', 'booking_label' => 'Book now', 'booked_label' => 'Booked', 'unavailable_label' => 'Unavailable', 'booking_text_color' => 'FFFFFF', 'booking_bg_color' => '05BB90', 'booking_hover_text_color' => 'FFFFFF', 'booking_hover_bg_color' => '07B38A', 'booked_text_color' => 'AAAAAA', 'booked_bg_color' => 'EEEEEE', 'unavailable_text_color' => 'AAAAAA', 'unavailable_bg_color' => 'EEEEEE', 'available_slots_color' => 'FFD544', 'timetable_page_id' => '', 'event_hours_id' => '', 'redirect' => 'no', 'current_user_booking_count' => '', 'slots_per_user' => '', 'available_slots' => '', ), $args); $output = ''; $booking_url = '#'; if($args['timetable_page_id']>0) $booking_url = get_permalink($args['timetable_page_id']) . '#book-event-hour-' . $args['event_hours_id']; if($args['current_user_booking_count']>=$args['slots_per_user'] && $args['slots_per_user']>0) { $output .= "<a href='' class='event_hour_booking id-" . $args['event_hours_id'] . " booked' style='" . (strlen($args['booked_text_color']) ? " color: #" . $args['booked_text_color'] . " !important;" : "") . (strlen($args['booked_bg_color']) ? " background-color: #" . $args['booked_bg_color'] . " !important;" : "") . "' title='" . $args['booked_label'] . "'>" . $args['booked_label'] . "</a>"; } elseif(!$args['available_slots']) { $output .= "<a href='' class='event_hour_booking id-" . $args['event_hours_id'] . " unavailable' style='" . (strlen($args['unavailable_text_color']) ? " color: #" . $args['unavailable_text_color'] . " !important;" : "") . (strlen($args['unavailable_bg_color']) ? " background-color: #" . $args['unavailable_bg_color'] . " !important;" : "") . "' title='" . $args['unavailable_label'] . "'>" . $args['unavailable_label'] . "</a>"; } else { $output .= "<a href='" . $booking_url . "' class='event_hour_booking id-" . $args['event_hours_id'] . " " . ($args['redirect']=='yes' ? 'redirect' : '') . " ' data-event-hour-id='" . $args['event_hours_id'] . "' style='" . (strlen($args['booking_text_color']) ? " color: #" . $args['booking_text_color'] . " !important;" : "") . (strlen($args['booking_bg_color']) ? " background-color: #" . $args['booking_bg_color'] . ";" : "") . "' onMouseOver='" . (strlen($args['booking_hover_text_color']) ? " this.style.setProperty(\"color\", \"#" . $args['booking_hover_text_color'] . "\", \"important\");" : "") . (strlen($args['booking_hover_bg_color']) ? " this.style.setProperty(\"background\", \"#" . $args['booking_hover_bg_color'] . "\", \"important\");" : "") . "' onMouseOut='" . (strlen($args['booking_hover_text_color']) ? (strlen($args['booking_hover_text_color']) ? " this.style.setProperty(\"color\", \"#" . $args['booking_text_color'] . "\", \"important\");" : " this.style.color=\"\";") : "") . (strlen($args['booking_hover_bg_color']) ? (strlen($args['booking_hover_bg_color']) ? " this.style.setProperty(\"background\", \"#" . $args['booking_bg_color'] . "\", \"important\");" : " this.style.background=\"\";") : "") . "' title='" . $args['booking_label'] . "'>" . $args['booking_label'] . "</a>"; } $output = "<div class='event_hour_booking_wrapper " . $args['show_booking_button'] . "'>" . $output . "</div>"; return $output; } function prepare_booking_slots_label($args) { $args = shortcode_atts(array( 'available_slots' => '', 'taken_slots' => '', 'total_slots' => '', 'available_slots_singular_label' => '', 'available_slots_plural_label' => '', ), $args); $placeholders = array( 'number' => strpos($args['available_slots_singular_label'], '{number}'), 'number_available' => strpos($args['available_slots_singular_label'], '{number_available}'), 'number_taken' => strpos($args['available_slots_singular_label'], '{number_taken}'), 'number_total' => strpos($args['available_slots_singular_label'], '{number_total}'), ); asort($placeholders); foreach($placeholders as $key=>$val) { if($val===false) unset($placeholders[$key]); } reset($placeholders); $placeholder = key($placeholders); //decide whether use singular or plural label $placeholder_val = 0; switch($placeholder) { case 'number': $placeholder_val = $args['available_slots']; break; case 'number_available': $placeholder_val = $args['available_slots']; break; case 'number_taken': $placeholder_val = $args['total_slots']; break; case 'number_total': $placeholder_val = $args['total_slots']; break; } $booking_slots_label = ($placeholder_val==1 ? $args['available_slots_singular_label'] : $args['available_slots_plural_label']); $booking_slots_label = str_replace('{number}', '<span class="count available">' . $args['available_slots'] . '</span>', $booking_slots_label); $booking_slots_label = str_replace('{number_available}', '<span class="count available">' . $args['available_slots'] . '</span>', $booking_slots_label); $booking_slots_label = str_replace('{number_taken}', '<span class="count taken">' . $args['taken_slots'] . '</span>', $booking_slots_label); $booking_slots_label = str_replace('{number_total}', '<span class="count total">' . $args['total_slots'] . '</span>', $booking_slots_label); return $booking_slots_label; }