/**
 * Create a rendez vous in draft mode
 *
 * @package Rendez Vous
 * @subpackage Ajax
 *
 * @since Rendez Vous (1.0.0)
 */
function rendez_vous_ajax_create()
{
    check_ajax_referer('rendez-vous-editor', 'nonce');
    if (!bp_current_user_can('publish_rendez_vouss')) {
        wp_send_json_error(__('You cannot create a rendez-vous.', 'rendez-vous'));
    }
    // Init the create arguments
    $args = array('title' => '', 'venue' => '', 'type' => 0, 'description' => '', 'duration' => '', 'days' => array(), 'attendees' => array());
    // First attendees
    $attendees = array_map('absint', $_POST['attendees']);
    if (empty($attendees)) {
        wp_send_json_error(__('No users were selected.', 'rendez-vous'));
    }
    // Add to create arguments
    $args['attendees'] = $attendees;
    // Then fields
    if (empty($_POST['desc']) || !is_array($_POST['desc'])) {
        wp_send_json_error(__('Please describe your rendez-vous using the What tab.', 'rendez-vous'));
    } else {
        $fields = $_POST['desc'];
    }
    $required_fields_missing = array();
    foreach ($fields as $field) {
        if ('required' == $field['class'] && empty($field['value'])) {
            $required_fields_missing[] = $field['label'];
        }
        // Add to create arguments
        $args[$field['id']] = $field['value'];
    }
    // Required fields are missing
    if (!empty($required_fields_missing)) {
        wp_send_json_error(__('Please make sure to fill all required fields.', 'rendez-vous'));
    }
    // Then dates
    if (empty($_POST['maydates']) || !is_array($_POST['maydates'])) {
        wp_send_json_error(__('Please define dates for your rendez-vous using the When tab.', 'rendez-vous'));
    } else {
        $dates = $_POST['maydates'];
    }
    $maydates = array();
    $maydates_errors = array();
    foreach ($dates as $date) {
        $timestamp = false;
        if (!empty($date['hour1'])) {
            if (!preg_match('/^[0-2]?[0-9]:[0-5][0-9]$/', $date['hour1'])) {
                $maydates_errors[] = $date['hour1'];
                continue;
            }
            $timestamp = strtotime($date['mysql'] . ' ' . $date['hour1']);
            $maydates[$timestamp] = array();
        }
        if (!empty($date['hour2'])) {
            if (!preg_match('/^[0-2]?[0-9]:[0-5][0-9]$/', $date['hour2'])) {
                $maydates_errors[] = $date['hour2'];
                continue;
            }
            $timestamp = strtotime($date['mysql'] . ' ' . $date['hour2']);
            $maydates[$timestamp] = array();
        }
        if (!empty($date['hour3'])) {
            if (!preg_match('/^[0-2]?[0-9]:[0-5][0-9]$/', $date['hour3'])) {
                $maydates_errors[] = $date['hour3'];
                continue;
            }
            $timestamp = strtotime($date['mysql'] . ' ' . $date['hour3']);
            $maydates[$timestamp] = array();
        }
    }
    // Check duration format
    if (!empty($args['duration']) && !preg_match('/^[0-2]?[0-9]:[0-5][0-9]$/', $args['duration'])) {
        $maydates_errors[] = $args['duration'];
    }
    if (!empty($maydates_errors)) {
        wp_send_json_error(__('Please make sure to respect the format HH:MM when defining time.', 'rendez-vous'));
    }
    if (!empty($maydates)) {
        $args['days'] = $maydates;
    }
    if (!empty($_POST['group_id'])) {
        $args['group_id'] = absint($_POST['group_id']);
    }
    $rendez_vous_id = rendez_vous_save($args);
    if (empty($rendez_vous_id)) {
        wp_send_json_error(__('The rendez-vous was not created due to an error.', 'rendez-vous'));
    } else {
        // url to edit rendez-vous screen
        wp_send_json_success(esc_url_raw(rendez_vous_get_edit_link($rendez_vous_id, bp_loggedin_user_id())));
    }
}
/**
 * Handle rendez-vous actions (group/member contexts)
 *
 * @package Rendez Vous
 * @subpackage Functions
 *
 * @since Rendez Vous (1.1.0)
 *
 * @return string the rendez-vous screen id
 */
function rendez_vous_handle_actions()
{
    $action = isset($_GET['action']) ? $_GET['action'] : false;
    $screen = '';
    // Edit template
    if (!empty($_GET['action']) && 'edit' == $_GET['action'] && !empty($_GET['rdv'])) {
        $redirect = remove_query_arg(array('rdv', 'action', 'n'), wp_get_referer());
        $rendez_vous_id = absint($_GET['rdv']);
        $rendez_vous = rendez_vous_get_item($rendez_vous_id);
        if (empty($rendez_vous) || !current_user_can('edit_rendez_vous', $rendez_vous_id)) {
            bp_core_add_message(__('Rendez-vous could not be found', 'rendez-vous'), 'error');
            bp_core_redirect($redirect);
        }
        if ('draft' == $rendez_vous->status) {
            bp_core_add_message(__('Your rendez-vous is in draft mode, check informations and publish!', 'rendez-vous'));
        }
        rendez_vous()->item = $rendez_vous;
        $screen = 'edit';
        do_action('rendez_vous_edit_screen');
    }
    // Display single
    if (!empty($_GET['rdv']) && (empty($action) || !in_array($action, array('edit', 'delete')))) {
        $redirect = remove_query_arg(array('rdv', 'n', 'action'), wp_get_referer());
        $rendez_vous_id = absint($_GET['rdv']);
        $rendez_vous = rendez_vous_get_item($rendez_vous_id);
        if (is_null($rendez_vous->organizer)) {
            bp_core_add_message(__('The rendez-vous was not found.', 'rendez-vous'), 'error');
            bp_core_redirect($redirect);
        }
        // Public rendez-vous can be seen by anybody
        $has_access = true;
        if ('private' == $rendez_vous->status) {
            $has_access = current_user_can('read_private_rendez_vouss', $rendez_vous_id);
        }
        if (empty($rendez_vous) || empty($has_access) || 'draft' == $rendez_vous->status) {
            bp_core_add_message(__('You do not have access to this rendez-vous', 'rendez-vous'), 'error');
            bp_core_redirect($redirect);
        }
        rendez_vous()->item = $rendez_vous;
        $screen = 'single';
        do_action('rendez_vous_single_screen');
    }
    // Publish & Updates.
    if (!empty($_POST['_rendez_vous_edit']) && !empty($_POST['_rendez_vous_edit']['id'])) {
        check_admin_referer('rendez_vous_update');
        $redirect = remove_query_arg(array('rdv', 'n', 'action'), wp_get_referer());
        if (!current_user_can('edit_rendez_vous', absint($_POST['_rendez_vous_edit']['id']))) {
            bp_core_add_message(__('Editing this rendez-vous is not allowed.', 'rendez-vous'), 'error');
            bp_core_redirect($redirect);
        }
        $args = array();
        $action = sanitize_key($_POST['_rendez_vous_edit']['action']);
        $args = array_diff_key($_POST['_rendez_vous_edit'], array('action' => 0, 'submit' => 0));
        $args['status'] = 'publish';
        // Make sure the organizer doesn't change if rendez-vous is edited by someone else
        if (!bp_is_my_profile()) {
            $args['organizer'] = apply_filters('rendez_vous_edit_action_organizer_id', bp_displayed_user_id(), $args);
        }
        $notify = !empty($_POST['_rendez_vous_edit']['notify']) ? 1 : 0;
        $activity = !empty($_POST['_rendez_vous_edit']['activity']) && empty($args['privacy']) ? 1 : 0;
        do_action("rendez_vous_before_{$action}", $args, $notify, $activity);
        $id = rendez_vous_save($args);
        if (empty($id)) {
            bp_core_add_message(__('Editing this rendez-vous failed.', 'rendez-vous'), 'error');
        } else {
            bp_core_add_message(__('Rendez-vous successfully edited.', 'rendez-vous'));
            $redirect = add_query_arg('rdv', $id, $redirect);
            // Rendez-vous is edited or published, let's handle notifications & activity
            do_action("rendez_vous_after_{$action}", $id, $args, $notify, $activity);
        }
        // finally redirect !
        bp_core_redirect($redirect);
    }
    // Set user preferences.
    if (!empty($_POST['_rendez_vous_prefs']) && !empty($_POST['_rendez_vous_prefs']['id'])) {
        check_admin_referer('rendez_vous_prefs');
        $redirect = remove_query_arg(array('n', 'action'), wp_get_referer());
        $rendez_vous_id = absint($_POST['_rendez_vous_prefs']['id']);
        $rendez_vous = rendez_vous_get_item($rendez_vous_id);
        $attendee_id = bp_loggedin_user_id();
        $has_access = $attendee_id;
        if (!empty($has_access) && 'private' == $rendez_vous->status) {
            $has_access = current_user_can('read_private_rendez_vouss', $rendez_vous_id);
        }
        if (empty($has_access)) {
            bp_core_add_message(__('You do not have access to this rendez-vous', 'rendez-vous'), 'error');
            bp_core_redirect($redirect);
        }
        $args = $_POST['_rendez_vous_prefs'];
        // Get days
        if (!empty($args['days'][$attendee_id])) {
            $args['days'] = $args['days'][$attendee_id];
        } else {
            $args['days'] = array();
        }
        do_action("rendez_vous_before_attendee_prefs", $args);
        if (!Rendez_Vous_Item::attendees_pref($rendez_vous_id, $attendee_id, $args['days'])) {
            bp_core_add_message(__('Saving your preferences failed.', 'rendez-vous'), 'error');
        } else {
            bp_core_add_message(__('Preferences successfully saved.', 'rendez-vous'));
            // let's handle notifications to the organizer
            do_action("rendez_vous_after_attendee_prefs", $args, $attendee_id, $rendez_vous);
        }
        // finally redirect !
        bp_core_redirect($redirect);
    }
    // Delete
    if (!empty($_GET['action']) && 'delete' == $_GET['action'] && !empty($_GET['rdv'])) {
        check_admin_referer('rendez_vous_delete');
        $redirect = remove_query_arg(array('rdv', 'action', 'n'), wp_get_referer());
        $rendez_vous_id = absint($_GET['rdv']);
        if (empty($rendez_vous_id) || !current_user_can('delete_rendez_vous', $rendez_vous_id)) {
            bp_core_add_message(__('Rendez-vous could not be found', 'rendez-vous'), 'error');
            bp_core_redirect($redirect);
        }
        $deleted = rendez_vous_delete_item($rendez_vous_id);
        if (!empty($deleted)) {
            bp_core_add_message(__('Rendez-vous successfully cancelled.', 'rendez-vous'));
        } else {
            bp_core_add_message(__('Rendez-vous could not be cancelled', 'rendez-vous'), 'error');
        }
        // finally redirect !
        bp_core_redirect($redirect);
    }
    return $screen;
}