function tt_timetable($atts, $content)
{
    extract(shortcode_atts(array("event" => "", "event_category" => "", "events_page" => "", "filter_style" => "dropdown_list", "filter_kind" => "event", "measure" => 1, "filter_label" => "All Events", "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" => "", "hide_empty" => 0, "disable_event_url" => 0, "text_align" => "center", "row_height" => 31, "id" => "", "responsive" => 1, "direction" => "ltr", "font_custom" => "", "font" => "", "font_subset" => "", "font_size" => "", "custom_css" => ""), $atts));
    $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 (count($event_category_array)) {
        //events array ids
        $events_array_id = array();
        for ($i = 0; $i < count($events_array); $i++) {
            $event = get_posts(array('name' => $events_array[$i], 'post_type' => 'events', 'post_status' => 'publish', 'numberposts' => 1));
            $events_array_id[] = $event[0]->ID;
        }
        $events_array_cat = get_posts(array('include' => $events_array_id, 'post_type' => 'events', 'post_status' => 'publish', 'posts_per_page' => -1, 'nopaging' => true, 'orderby' => 'menu_order', 'order' => 'ASC', 'events_category' => implode(",", $event_category_array)));
        $events_array = array();
        for ($i = 0; $i < count($events_array_cat); $i++) {
            $events_array[] = $events_array_cat[$i]->post_name;
        }
    }
    if (!$hide_all_events_view) {
        $events_list_html = '<li><a href="#all-events' . ($id != '' ? '-' . $id : '') . '" title="' . esc_attr($filter_label) . '">' . $filter_label . '</a></li>';
    } else {
        $events_list_html = '';
    }
    if ($filter_kind == "event" || !count($event_category_array)) {
        $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' => 'events', 'post_status' => 'publish'));
            if ($events_list) {
                $events_list_html .= '<li><a href="#' . $events_array[$i] . '" 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;
            }
            /*query_posts(array(
            			"name" => $events_array[$i],
            			'post_type' => 'events',
            			'post_status' => 'publish'
            		));
            		if(have_posts())
            		{
            			the_post();
            			$events_list_html .= '<li><a href="#' . $events_array[$i] . '" title="' . esc_attr(get_the_title()) . '">' . get_the_title() . '</a></li>';
            		}
            		//Reset Query
            		wp_reset_query();*/
        }
    } else {
        $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");
            $events_list_html .= '<li><a href="#' . $event_category_array[$i] . '" title="' . esc_attr($category->name) . '">' . $category->name . '</a></li>';
            if ($hide_all_events_view && $filter_style == "dropdown_list" && ($filter_label == "All Events" || $filter_label == "") && !$i) {
                $filter_label = $category->name;
            }
        }
    }
    $output = '';
    if ($direction == "rtl") {
        $output .= "<div class='rtl'>";
    }
    if ($filter_style == "dropdown_list") {
        $output .= '<ul class="timetable_clearfix tabs_box_navigation' . ((int) $responsive ? " tt_responsive" : "") . ' sf-timetable-menu' . ($id != "" ? ' ' . $id : '') . '">
			<li class="tabs_box_navigation_selected"><label>' . $filter_label . '</label><span class="tabs_box_navigation_icon"></span><ul class="sub-menu">' . $events_list_html . '</ul></li>
		</ul>';
    }
    if ((int) $row_height != 31 || strtoupper($box_bg_color) != "00A27C" || strtoupper($filter_color) != "00A27C" || $custom_css != "") {
        $output .= '<style type="text/css">' . $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 . ';}' : '') . '</style>';
    }
    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] . '"';
        $output .= '<style type="text/css">' . ($font_custom != "" || $font != "" ? ($id != "" ? '#' . $id : '') . '.tt_tabs .tt_timetable{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;}' : '') . '</style>';
    }
    $output .= '<div class="timetable_clearfix tt_tabs' . ((int) $responsive ? " tt_responsive" : "") . " event_layout_" . $event_layout . '"' . ($id != "" ? ' id="' . $id . '"' : '') . '>
		<ul class="timetable_clearfix tt_tabs_navigation"' . ($filter_style == "dropdown_list" ? ' style="display: none;"' : '') . '>' . $events_list_html . '</ul>';
    if (!$hide_all_events_view) {
        $output .= '<div id="all-events' . ($id != '' ? '-' . $id : '') . '">' . tt_get_timetable($atts, $events_array) . '</div>';
    }
    if ($filter_kind == "event" || !count($event_category_array)) {
        for ($i = 0; $i < $events_array_count; $i++) {
            $output .= '<div id="' . $events_array[$i] . '" class="tt-ui-tabs-hide">' . tt_get_timetable($atts, $events_array[$i]) . '</div>';
        }
    } else {
        for ($i = 0; $i < $events_category_array_count; $i++) {
            $events_array = array();
            $events_array = get_posts(array('include' => (array) $events_array_id, 'post_type' => 'events', '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); $j++) {
                $events_array_for_timetable[] = $events_array[$j]->post_name;
            }
            $output .= '<div id="' . $event_category_array[$i] . '" class="tt-ui-tabs-hide">' . (count($events_array) ? tt_get_timetable($atts, $events_array_for_timetable) : __('No events available in ' . $event_category_array[$i] . ' category!', 'timetable')) . '</div>';
        }
    }
    $output .= '</div>';
    if ($direction == "rtl") {
        $output .= "</div>";
    }
    return $output;
}
function tt_timetable($atts, $content)
{
    $timetable_events_settings = timetable_events_settings();
    extract(shortcode_atts(array("event" => "", "event_category" => "", "events_page" => "", "filter_style" => "dropdown_list", "filter_kind" => "event", "measure" => 1, "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" => "", "hide_empty" => 0, "disable_event_url" => 0, "text_align" => "center", "row_height" => 31, "id" => "", "responsive" => 1, "event_description_responsive" => "none", "collapse_event_hours_responsive" => 0, "direction" => "ltr", "font_custom" => "", "font" => "", "font_subset" => "", "font_size" => "", "custom_css" => ""), $atts));
    //replace grave accent added by Visual Composer
    $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');
    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]) . '" 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;
            }
        }
    }
    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]) . '" 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));
            $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 = '';
    if ($direction == "rtl") {
        $output .= "<div class='rtl'>";
    }
    if ($filter_style == "dropdown_list") {
        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' . ($id != "" ? ' ' . urlencode($id) : '') . ' ' . ($filter_kind == "event_and_event_category" ? "tt_double_buttons" : "") . '">
				<li class="tabs_box_navigation_selected"><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' . ($id != "" ? ' ' . urlencode($id) : '') . ' ' . ($filter_kind == "event_and_event_category" ? "tt_double_buttons" : "") . '">
				<li class="tabs_box_navigation_selected"><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>';
        }
    }
    if ((int) $row_height != 31 || strtoupper($box_bg_color) != "00A27C" || strtoupper($filter_color) != "00A27C" || $custom_css != "") {
        $output .= '<style type="text/css">' . $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 . ';}' : '') . '</style>';
    }
    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] . '"';
        $output .= '<style type="text/css">' . ($font_custom != "" || $font != "" ? ($id != "" ? '#' . $id : '') . '.tt_tabs .tt_timetable{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;}' : '') . '</style>';
    }
    $output .= '<div class="timetable_clearfix tt_tabs' . ((int) $responsive ? " tt_responsive" : "") . " event_layout_" . $event_layout . '"' . ($id != "" ? ' id="' . $id . '"' : '') . '>';
    // 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_categories_list_html . $events_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_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>';
    }
    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 (!$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) : __('No events available!', 'timetable'))) . '</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, "events");
            $categories = wp_get_post_terms($post["ID"], "events_category");
            $categories_str = "";
            foreach ($categories as $category) {
                $categories_str .= "tt-event-category-" . $category->slug . " ";
            }
            $output .= '<div id="' . urlencode($events_array[$i]) . '" 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]) : __('No events available!', 'timetable')) . '</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]) . '" class="tt-ui-tabs-hide">' . (count($events_array_posts) ? tt_get_timetable($atts, $events_array_for_timetable) : sprintf(__('No events available in %1$s category!', 'timetable'), $event_category_array[$i])) . '</div>';
        }
    }
    $output .= '</div>';
    $output .= "<div id='tt_error_message' class='tt_hide'>" . __('No events available!', 'timetable') . "</div>";
    if ($direction == "rtl") {
        $output .= "</div>";
    }
    return $output;
}