public static function get_events($args = array(), $atts = array())
 {
     global $wpdb;
     $defaults = array('page' => '0', 'number' => '5', 'order' => 'ASC', 'date' => 'NOW', 'date_end' => '', 'dayspast' => '', 'horizon' => 'hour', 'allday' => '', 'post_status' => 'publish', 'post_type' => '', 'author' => '', 'parse_postmeta' => '', 'parse_taxonomy' => '0', 'parse_taxonomymeta' => '0', 'premiere' => '0', 'auto' => '0', 'feed' => '', 'post_id' => '', 'current_post' => '', 'rdate' => '');
     //TODO:take into consideration the browser tz.
     $r = wp_parse_args($args, $defaults);
     extract($r, EXTR_SKIP);
     $events_reverse = false;
     //-------------
     $order = 'ASC' == strtoupper($order) ? 'ASC' : 'DESC';
     $parse_taxonomy = '1' == $parse_taxonomy ? true : false;
     //-------------
     $date_oper = '>=';
     $date_end_oper = '<=';
     //-------------
     if ('-1' == $number) {
         $limit = '';
         //no limit !!
     } else {
         $page = intval($page);
         $number = intval($number);
         if ($page < 0) {
             //interchange operators
             $date_oper = '<';
             $date_end_oper = '>';
             $page = abs($page) - 1;
             $events_reverse = true;
             $order = 'ASC' == $order ? 'DESC' : 'ASC';
         }
         if ($page == 0) {
             $limit = "LIMIT {$number}";
         } else {
             $offset = $number * $page;
             $limit = "LIMIT {$offset},{$number}";
         }
     }
     //-----
     //-------------- build taxonomy/term filter
     if ('1' == $auto && is_tax()) {
         $args['taxonomy'] = get_query_var('taxonomy');
         $args['terms'] = get_query_var('term');
     }
     $terms = isset($args['terms']) && !empty($args['terms']) ? $args['terms'] : false;
     if (false !== $terms) {
         $terms = explode(',', $terms);
         $tmp = array();
         foreach ($terms as $slug) {
             $tmp[] = sprintf("'%s'", trim($slug));
         }
         $terms = implode(",", $tmp);
     }
     $taxonomy = isset($args['taxonomy']) ? $args['taxonomy'] : false;
     if (false !== $taxonomy) {
         $taxonomy = explode(',', $taxonomy);
         $tmp = array();
         foreach ($taxonomy as $slug) {
             if (empty($slug)) {
                 continue;
             }
             $tmp[] = sprintf("'%s'", trim($slug));
         }
         $taxonomy = implode(",", $tmp);
     }
     if (false === $taxonomy || false === $terms) {
         $taxonomy_tables = "";
         $taxonomy_filters = "";
     } else {
         $taxonomy_tables = "INNER JOIN {$wpdb->term_relationships} R ON R.object_id=E.post_id\nINNER JOIN {$wpdb->term_taxonomy} TT ON TT.term_taxonomy_id=R.term_taxonomy_id\nINNER JOIN {$wpdb->terms} T ON T.term_id=TT.term_id";
         $taxonomy_filters = "AND TT.taxonomy IN ({$taxonomy})\nAND T.slug IN ({$terms})";
     }
     //------------
     $groupby_arr = array();
     $filters = "";
     //--- EVENT Date filters
     $date_filter = "";
     if (!empty($date)) {
         $date = 'NOW' == $date ? current_time('mysql') : $date;
         $ts = strtotime($date);
         $format = $horizon == 'day' ? 'Y-m-d' : 'Y-m-d H:i:s';
         if (false !== $ts) {
             $date_filter .= sprintf(" AND (E.event_start %s '%s')", $date_oper, date($format, $ts));
         }
     }
     if (!empty($date_end)) {
         $date_end = 'NOW' == $date_end ? current_time('mysql') : $date_end;
         if (strlen($date_end) <= 10) {
             $date_end = date('Y-m-d 23:59:59', strtotime($date_end));
         }
         $ts = strtotime($date_end);
         //$format = $horizon=='day' ? 'Y-m-d' : 'Y-m-d H:i:s' ;
         $format = 'Y-m-d H:i:s';
         if (false !== $ts) {
             $date_filter .= sprintf(" AND (E.event_end %s '%s')", $date_end_oper, date($format, $ts));
         }
     }
     if (!empty($dayspast)) {
         if (false === $date) {
             $ts = mktime(0, 0, 0, date('m'), date('d') - $dayspast, date('Y'));
         } else {
             $ts = mktime(0, 0, 0, date('m', $ts), date('d', $ts) - $dayspast, date('Y', $ts));
         }
         $format = $horizon == 'day' ? 'Y-m-d' : 'Y-m-d H:i:s';
         if (false !== $ts) {
             $date_filter .= sprintf(" AND (E.event_start >= '%s')", date($format, $ts));
         }
     }
     //-- by specific post_id
     if ('current' == $post_id) {
         $post_id = get_the_ID();
     }
     if ($post_id > 0) {
         $filters .= " AND(E.post_id=" . intval($post_id) . ")";
     }
     //-- intended for use with post_ID, not alone, althought you can.
     if (!empty($rdate) && is_numeric($rdate)) {
         $filters .= sprintf(" AND(E.event_start='%s')", $rdate);
     }
     //-- Premiere
     if ('1' == $premiere) {
         $filters .= " AND(E.number=0)";
     } else {
         if ('2' == $premiere) {
             $groupby_arr[] = "E.post_id";
         }
     }
     //-- ALL day filter --------------------
     if (!empty($allday)) {
         $allday = intval($allday) ? 1 : 0;
         $filters .= " AND(E.allday={$allday})";
     }
     //-- maybe csv values: Post status, post type
     foreach (array('post_status' => 'P.post_status', 'post_type' => 'P.post_type') as $field => $sql_field) {
         if (!empty(${$field})) {
             $sql_val = rhc_supe_query::csv_to_sql_strings(${$field});
             $filters .= sprintf(" AND(%s IN (%s))", $sql_field, $sql_val);
         }
     }
     //--- author filter
     $filters .= rhc_supe_query::get_author_sql_filter($author);
     $groupby = empty($groupby_arr) ? '' : sprintf("GROUP BY %s", implode(',', $groupby_arr));
     //----------------------
     $sql = "SELECT E.*,P.*\nFROM `{$wpdb->prefix}rhc_events` E\nINNER JOIN {$wpdb->posts} P ON P.ID=E.post_id\n{$taxonomy_tables}\nWHERE (1) \n{$date_filter}\n{$taxonomy_filters}\n{$filters}\n{$groupby}\nORDER BY E.event_start {$order}\n{$limit}\n";
     if (isset($_REQUEST['rhc_debug']) && current_user_can('manage_options')) {
         echo "SQL:{$sql}<br><-----";
     }
     $events = array();
     //error_log( "\n"."\n".$sql."\n", 3, ABSPATH.'api.log' );
     if ('1' != $feed && $wpdb->query($sql)) {
         $events = rhc_supe_query::handle_get_taxonomy_and_terms($wpdb->last_result, $parse_taxonomy, $parse_taxonomymeta, $atts);
         if ($events_reverse) {
             //file_put_contents( 	ABSPATH.'api.log',print_r( $events,true) );
             $events = array_reverse($events);
         }
     }
     //permalink
     $events = rhc_supe_query::handle_get_permalink($events, $atts);
     //fill post meta
     $events = rhc_supe_query::handle_get_postmeta($events, $atts);
     //fill in images
     $events = rhc_supe_query::handle_get_images($events, $atts);
     if ('0' != $feed) {
         $taxonomy = isset($args['taxonomy']) ? $args['taxonomy'] : '';
         $terms = isset($args['terms']) && !empty($args['terms']) ? $args['terms'] : '';
         $json_feed = apply_filters('rhc_json_feed', false, $taxonomy, $terms, is_numeric($author) ? $author : '', is_string($author) ? $author : '');
     } else {
         $json_feed = array();
     }
     /*
     if(true||$feed!='0'){
     	if(!empty($calendar)){
     		$json_feed = apply_filters('rhc_json_feed',false,RHC_CALENDAR,$calendar,$author,$author_name);	
     	}else{
     		$json_feed = apply_filters('rhc_json_feed',false,$taxonomy,$terms,$author,$author_name);	
     	}	
     }
     */
     if (!empty($events)) {
         $calendar_url = isset($atts['calendar_url']) && !empty($atts['calendar_url']) ? $atts['calendar_url'] : false;
         if (false !== $calendar_url) {
             foreach ($events as $i => $e) {
                 $e->the_permalink = $calendar_url;
             }
         }
     }
     return apply_filters('rhc_supe_get_events', $events, compact('args', 'atts', 'json_feed', 'date', 'date_end'));
 }