/**
 * Parses through an array of lines (of an ICAL file), creates events and inserts them as they are found.
 
 * @since 1.1.0
 *
 * @param array - $lines, array of lines of an ICAL file
 */
 function import_events($lines)
 {
     global $EO_Errors;
     $state = "NONE";
     $error = false;
     $error_count = 0;
     $event_count = 0;
     $event_array = array();
     $event_array['event'] = array();
     $event_array['event_post'] = array();
     $event_array['event_meta'] = array();
     //Get Blog timezone, set Calendar timezone to this by default
     $blog_tz = eo_get_blog_timezone();
     $cal_tz = $blog_tz;
     $output = "";
     //Record number of venues / categories created
     global $eventorganiser_venues_created, $eventorganiser_cats_created;
     $eventorganiser_venues_created = 0;
     $eventorganiser_cats_created = 0;
     //Read through each line
     for ($n = 0; $n < count($lines) && !$error; $n++) {
         $buff = trim($lines[$n]);
         if (!empty($buff)) {
             $line = explode(':', $buff, 2);
             //On the right side of the line we may have DTSTART;TZID= or DTSTART;VALUE=
             $modifiers = explode(';', $line[0]);
             $property = array_shift($modifiers);
             $value = isset($line[1]) ? trim($line[1]) : '';
             //If we are in EVENT state
             if ($state == "VEVENT") {
                 //If END:VEVENT, insert event into database
                 if ($property == 'END' && $value == 'VEVENT') {
                     $state = "VCALENDAR";
                     $event_array['event']['YmdFormated'] = true;
                     $event_array['event']['dateObjects'] = true;
                     //Insert new post from objects
                     $post_id = EO_Event::insertNewEvent($event_array['event_post'], $event_array['event']);
                     if (!$post_id) {
                         $error_count++;
                     }
                 } else {
                     //Otherwise, parse event property
                     try {
                         $event_array = $this->parse_Event_Property($event_array, $property, $value, $modifiers, $blog_tz, $cal_tz);
                     } catch (Exception $e) {
                         $error_count++;
                         $preamble = sprintf(__('Line: %1$d', 'eventorganiser'), $n + 1);
                         $EO_Errors->add('eo_error', $preamble . '   ' . $e->getMessage());
                         //Abort parsing event
                         $state = "VCALENDAR";
                     }
                 }
                 // If we are in CALENDAR state
             } elseif ($state == "VCALENDAR") {
                 //Begin event
                 if ($property == 'BEGIN' && $value == 'VEVENT') {
                     $state = "VEVENT";
                     $event_count++;
                     $event_array['event'] = array();
                     $event_array['event_post'] = array();
                     $event_array['event_meta'] = array();
                 } elseif ($property == 'END' && $value == 'VCALENDAR') {
                     $state = "NONE";
                 } elseif ($property == 'X-WR-TIMEZONE') {
                     try {
                         $cal_tz = self::parse_TZID($value);
                     } catch (Exception $e) {
                         $preamble = sprintf(__('Line: %1$d', 'eventorganiser'), $n + 1);
                         $EO_Errors->add('eo_error', $preamble . '   ' . $e->getMessage());
                         break;
                     }
                 }
             } elseif ($state == "NONE" && $property == 'BEGIN' && $value == 'VCALENDAR') {
                 $state = "VCALENDAR";
             }
         }
         //If line is not empty
     }
     //For each line
     //Display message
     if ($event_count == 0) {
         $EO_Errors->add('eo_error', __("No events were imported.", 'eventorganiser'));
     } elseif ($error_count > 0) {
         $EO_Errors->add('eo_error', sprintf(__('There was an error with %1$d of %2$d events in the ical file'), $error_count, $event_count));
     } else {
         if ($event_count == 1) {
             $message = __("1 event was successfully imported", 'eventorganiser') . ".";
         } else {
             $message = sprintf(__("%d events were successfully imported", 'eventorganiser'), $event_count) . ".";
         }
         if ($eventorganiser_venues_created == 1) {
             $message .= " " . __("1 venue was created", 'eventorganiser') . ".";
         } elseif ($eventorganiser_venues_created > 1) {
             $message .= " " . sprintf(__("%d venues were created", 'eventorganiser'), $eventorganiser_venues_created) . ".";
         }
         if ($eventorganiser_cats_created == 1) {
             $message .= " " . __("1 category was created", 'eventorganiser') . ".";
         } elseif ($eventorganiser_cats_created > 1) {
             $message .= " " . sprintf(__("%d categories were created", 'eventorganiser'), $eventorganiser_cats_created) . ".";
         }
         $EO_Errors->add('eo_notice', $message);
     }
     return true;
 }
 function page_actions()
 {
     global $wpdb, $eventorganiser_events_table;
     //Check action
     if (!empty($_REQUEST['save']) || !empty($_REQUEST['publish'])) {
         //Check nonce
         check_admin_referer('eventorganiser_calendar_save');
         //authentication checks
         if (!current_user_can('edit_events')) {
             wp_die(__('You do not have sufficient permissions to create events'));
         }
         $input = $_REQUEST['eo_event'];
         //Retrieve input from posted data
         //Set the status of the new event
         if (!empty($_REQUEST['save'])) {
             $status = 'draft';
         } else {
             if (current_user_can('publish_events')) {
                 $status = 'publish';
             } else {
                 $status = 'pending';
             }
         }
         //Set post and event details
         $input['occurrence'] = 'once';
         $input['YmdFormated'] = true;
         $venue = (int) $input['venue_id'];
         $post_input = array('post_title' => $input['event_title'], 'post_status' => $status, 'post_content' => $input['event_content'], 'post_type' => 'event', 'tax_input' => array('event-venue' => array($venue)));
         //Insert event
         $post_id = EO_Event::insertNewEvent($post_input, $input);
         if ($post_id) {
             //If event was successfully inserted, redirect and display appropriate message
             $redirect = get_edit_post_link($post_id, '');
             if ($status == 'publish') {
                 $redirect = add_query_arg('message', 6, $redirect);
             } else {
                 $redirect = add_query_arg('message', 7, $redirect);
             }
             //Redirect to event admin page & exit
             wp_redirect($redirect);
             exit;
         }
     } elseif (isset($_REQUEST['action']) && ($_REQUEST['action'] == 'delete_occurrence' || $_REQUEST['action'] == 'break_series') && isset($_REQUEST['series']) && isset($_REQUEST['event'])) {
         $post_id = intval($_REQUEST['series']);
         $event_id = intval($_REQUEST['event']);
         $action = $_REQUEST['action'];
         if ($action == 'break_series') {
             //Check nonce
             check_admin_referer('eventorganiser_break_series_' . $event_id);
             //Check permissions
             if (!current_user_can('edit_event', $post_id) || !current_user_can('delete_event', $post_id)) {
                 wp_die(__('You do not have sufficient permissions to edit this event', 'eventorganiser'));
             }
             //Get current event
             $query_array = array('event_occurrence_id' => $event_id, 'posts_per_page' => -1, 'post_type' => 'event', 'showpastevents' => true, 'perm' => 'readable');
             $query = new WP_Query($query_array);
             global $post;
             if ($query->have_posts()) {
                 $query->the_post();
                 //Assign new event taxonomy terms
                 $taxs = array('event-category', 'event-tag', 'event-venue');
                 $tax_input = array();
                 foreach ($taxs as $tax) {
                     $terms = get_the_terms($post->ID, $tax);
                     if ($terms && !is_wp_error($terms)) {
                         $tax_input[$tax] = array_map('intval', wp_list_pluck($terms, 'term_id'));
                     }
                 }
                 //Post details
                 $post_array = array('post_title' => $post->post_title, 'post_name' => $post->post_name, 'post_author' => $post->post_author, 'post_content' => $post->post_content, 'post_status' => $post->post_status, 'post_date' => $post->post_date, 'post_date_gmt' => $post->post_date_gmt, 'post_excerpt' => $post->post_excerpt, 'post_password' => $post->post_password, 'post_type' => 'event', 'tax_input' => $tax_input, 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status);
                 //Event details
                 $tz = EO_Event::get_timezone();
                 //blog timzone
                 $event_array = array('dateObjects' => true, 'start' => new DateTIme($post->StartDate . ' ' . $post->StartTime, $tz), 'end' => new DateTIme($post->EndDate . ' ' . $post->FinishTime, $tz), 'allday' => $post->event_allday, 'schedule' => 'once', 'frequency' => 1, 'venue' => $post->Venue);
                 //Create new event with duplicated details
                 $new_event_id = EO_Event::insertNewEvent($post_array, $event_array);
                 //delete occurrence,
                 if ($new_event_id) {
                     $del = $wpdb->get_results($wpdb->prepare("DELETE FROM {$eventorganiser_events_table} WHERE post_id=%d AND event_id=%d", $post_id, $event_id));
                     $post_custom = get_post_custom($post->ID);
                     foreach ($post_custom as $meta_key => $meta_values) {
                         $unique = $meta_key[0] == '_' ? true : false;
                         foreach ($meta_values as $meta_value) {
                             add_post_meta($new_event_id, $meta_key, $meta_value, $unique);
                         }
                     }
                 }
                 //Redirect to prevent resubmisson
                 $redirect = add_query_arg(array('post_type' => 'event', 'page' => 'calendar'), admin_url('edit.php'));
                 wp_redirect($redirect);
             }
         } elseif ($action == 'delete_occurrence') {
             //Check nonce
             check_admin_referer('eventorganiser_delete_occurrence_' . $event_id);
             //Check permissions
             if (!current_user_can('delete_event', $post_id)) {
                 wp_die(__('You do not have sufficient permissions to delete this event', 'eventorganiser'));
             }
             $del = $wpdb->get_results($wpdb->prepare("DELETE FROM {$eventorganiser_events_table} WHERE post_id=%d AND event_id=%d", $post_id, $event_id));
             global $EO_Errors;
             $EO_Errors = new WP_Error();
             $EO_Errors->add('eo_notice', '<strong>' . __("Occurrence deleted.", 'eventorganiser') . '</strong>');
         }
     }
 }