/**
  * Grabs all quizzes and resaves them so they get rebuilt in the DB with any new
  * options, etc
  */
 public function resave_quizzes()
 {
     // get all the quizzes
     $quiz_ids = $this->get_all_quiz_ids();
     // PDO to grab ALL unique Quiz IDs
     $save_quiz = new Enp_quiz_Save_quiz();
     // query to get ALL quizzes
     // for now,  just do one
     if (!empty($quiz_ids)) {
         foreach ($quiz_ids as $quiz_id) {
             $quiz = new Enp_quiz_Quiz($quiz_id);
             // turn it into an array
             $quiz = (array) $quiz;
             // we have to set this as the quiz created by value so it will allow us to update
             // in the future, we can set it to an admin value once we allow that
             $quiz['quiz_updated_by'] = $quiz['quiz_owner'];
             $quiz['quiz_updated_at'] = date("Y-m-d H:i:s");
             // save the quiz
             $save_quiz->save($quiz);
         }
     }
 }
    /**
     * The quiz they submit isn't in the exact format we want it in
     * so we need to reindex it to a nice format and set their values
     *
     * @param $quiz = array() in this format:
     *        $quiz = array(
     *            'quiz' => $_POST['enp_quiz'], // array of quiz values (quiz_id, quiz_title, etc)
     *            'questions' => $_POST['enp_question'], // array of questions
     *            'quiz_updated_by' => $user_id,
     *            'quiz_updated_at' => $date_time,
     *        );
     * @return nicely formatted and value validated quiz array ready for saving
     */
    protected function prepare_submitted_quiz()
    {
        $quiz_id = $this->set_quiz_value('quiz_id', 0);
        $quiz_title = $this->set_quiz_value('quiz_title', '');
        $quiz_status = $this->set_quiz_value('quiz_status', 'draft');
        $quiz_finish_message = $this->set_quiz_value('quiz_finish_message', 'Thanks for taking our quiz!');
        $quiz_updated_by = $this->set_quiz_value('quiz_updated_by', 0);
        $quiz_updated_at = $this->set_quiz_value('quiz_updated_at', date("Y-m-d H:i:s"));
        $quiz_owner = $this->set_quiz_value__object_first('quiz_owner', $quiz_updated_by);
        $quiz_created_by = $this->set_quiz_value__object_first('quiz_created_by', $quiz_updated_by);
        $quiz_created_at = $this->set_quiz_value('quiz_created_at', $quiz_updated_at);
        $quiz_is_deleted = $this->set_quiz_is_deleted();
        // Options
        $quiz_title_display = $this->set_quiz_value('quiz_title_display', 'show');
        $quiz_mc_options_order = $this->set_quiz_value('quiz_mc_options_order', 'random');
        $quiz_width = $this->set_quiz_css_measurement_value('quiz_width', '100%');
        $quiz_bg_color = $this->set_quiz_hex_value('quiz_bg_color', '#ffffff');
        $quiz_text_color = $this->set_quiz_hex_value('quiz_text_color', '#444444');
        $quiz_border_color = $this->set_quiz_hex_value('quiz_border_color', '#dddddd');
        $quiz_button_color = $this->set_quiz_hex_value('quiz_button_color', '#5887C0');
        $quiz_correct_color = $this->set_quiz_hex_value('quiz_correct_color', '#3bb275');
        $quiz_incorrect_color = $this->set_quiz_hex_value('quiz_incorrect_color', '#f14021');
        // custom css
        $quiz_custom_css = $this->set_quiz_css_value('quiz_custom_css', '', false);
        $quiz_custom_css_minified = $this->optimize_css($quiz_custom_css);
        // facebook
        $facebook_title = $this->set_quiz_value('facebook_title', $quiz_title);
        $facebook_description = $this->set_quiz_value('facebook_description', 'How well can you do?');
        $facebook_quote_end = $this->set_quiz_value('facebook_quote_end', 'I got {{score_percentage}}% right.');
        // email
        $email_subject = $facebook_title;
        $email_body_start = $facebook_description;
        $email_body_end = $facebook_quote_end . '

' . $facebook_description;
        // twitter
        $include_url = true;
        $replace_mustache = true;
        $tweet_end = $this->set_tweet_value('tweet_end', 'I got {{score_percentage}}% right on this quiz. How many can you get right?', $include_url, $replace_mustache);
        $default_quiz = array('quiz_id' => $quiz_id, 'quiz_title' => $quiz_title, 'quiz_status' => $quiz_status, 'quiz_finish_message' => $quiz_finish_message, 'quiz_owner' => $quiz_owner, 'quiz_created_by' => $quiz_created_by, 'quiz_created_at' => $quiz_created_at, 'quiz_updated_by' => $quiz_updated_by, 'quiz_updated_at' => $quiz_updated_at, 'quiz_is_deleted' => $quiz_is_deleted, 'quiz_title_display' => $quiz_title_display, 'quiz_mc_options_order' => $quiz_mc_options_order, 'quiz_width' => $quiz_width, 'quiz_bg_color' => $quiz_bg_color, 'quiz_text_color' => $quiz_text_color, 'quiz_border_color' => $quiz_border_color, 'quiz_button_color' => $quiz_button_color, 'quiz_correct_color' => $quiz_correct_color, 'quiz_incorrect_color' => $quiz_incorrect_color, 'quiz_custom_css' => $quiz_custom_css, 'quiz_custom_css_minified' => $quiz_custom_css_minified, 'facebook_title' => $facebook_title, 'facebook_description' => $facebook_description, 'facebook_quote_end' => $facebook_quote_end, 'email_subject' => $email_subject, 'email_body_start' => $email_body_start, 'email_body_end' => $email_body_end, 'tweet_end' => $tweet_end);
        // We don't want to lose anything that was in the sent quiz (like questions, etc)
        // so we'll merge them to make sure we don't lose anything
        self::$quiz = array_merge(self::$quiz, $default_quiz);
    }
 public function save_quiz()
 {
     // make sure they're logged in and own this quiz
     // returns current_user_id if valid
     $user_id = $this->validate_user();
     $params = array();
     if (isset($_POST['enp_quiz'])) {
         $posted_quiz = $_POST['enp_quiz'];
         if (isset($posted_quiz['new_quiz'])) {
             $new_quiz_flag = $posted_quiz['new_quiz'];
         } else {
             $new_quiz_flag = '0';
         }
     }
     if (isset($_POST['enp_question'])) {
         $posted_question = $_POST['enp_question'];
     }
     if (isset($_POST['enp-quiz-submit'])) {
         $posted_user_action = $_POST['enp-quiz-submit'];
     }
     if (isset($_POST['enp_quiz_nonce'])) {
         $posted_nonce = $_POST['enp_quiz_nonce'];
     }
     //Is it a POST request?
     if ($_SERVER['REQUEST_METHOD'] === 'POST') {
         //Validate the form key
         if (!isset($posted_nonce) || !self::$nonce->validate($posted_nonce)) {
             // Form key is invalid,
             // return them to the page (they're probably refreshing the page)
             self::$message['error'][] = 'Quiz was not resaved';
             return false;
         }
     }
     // initiate the save_quiz object
     // get access to wpdb
     global $wpdb;
     // set-up an empty array for our quiz submission
     $quiz = array();
     // extract values
     // set the date_time to pass
     $date_time = date("Y-m-d H:i:s");
     // build our array to save
     if (isset($posted_quiz)) {
         $quiz = array('quiz' => $posted_quiz, 'quiz_updated_by' => $user_id, 'quiz_updated_at' => $date_time);
     }
     if (isset($posted_question) && !empty($posted_question)) {
         $quiz['question'] = $posted_question;
     }
     if (isset($posted_user_action) && !empty($posted_user_action)) {
         // get the value of the button they clicked
         $quiz['user_action'] = $posted_user_action;
     } else {
         // no submit button clicked? Should never happen
         self::$message['error'][] = 'The form was not submitted right. Please contact our support and let them know how you reached this error';
         return false;
     }
     // initiate the save_quiz object
     $save_quiz = new Enp_quiz_Save_quiz();
     // save the quiz by passing our $quiz array to the save function
     $response = $save_quiz->save($quiz);
     // set it as our messages to return to the user
     self::$message = $this->set_message($response);
     // get the ID of the quiz that was just created (if there)
     $quiz_id = $response->quiz_id;
     // set-up vars for our next steps
     $save_action = $response->action;
     // set the user_action so we know what the user was wanting to do
     self::$user_action = $response->user_action;
     // check to see if we have a successful save response from the save class
     // REMEMBER: A successful save can still have an error message
     // such as "Quiz Updated. Hey! You don't have any questions though!"
     if ($response->status !== 'success') {
         // No successful save, so return them to the same page and display error messages
         return false;
     }
     //*************************//
     //  SUCCESS! Now what...?  //
     //*************************//
     if (defined('DOING_AJAX') && DOING_AJAX) {
         $json_response = $response;
         $json_response = json_encode($json_response);
         wp_send_json($json_response);
         // always end ajax with exit()
         exit;
     } elseif (self::$user_action['action'] === 'next' && self::$user_action['element'] === 'preview' && empty(self::$message['error'])) {
         // unset the cookies for the current quiz
         // in case they deleted questions and just in general
         // to make it feel as expected (starting quiz from beginning)
         $preview_quiz = new Enp_quiz_Quiz($quiz_id);
         $this->unset_quiz_take_cookies($preview_quiz);
         $this->redirect_to_quiz_preview($quiz_id);
     } elseif (self::$user_action['action'] === 'next' && self::$user_action['element'] === 'publish' && empty(self::$message['error'])) {
         // unset the cookies for the current quiz
         $published_quiz = new Enp_quiz_Quiz($quiz_id);
         $this->unset_quiz_take_cookies($published_quiz);
         // redirect to the quiz publish page
         $this->redirect_to_quiz_publish($quiz_id);
     } elseif ($save_action === 'insert' || $new_quiz_flag === '1') {
         // they don't want to move on yet, but they're inserting,
         // so we need to send them to their newly created quiz create page
         $this->redirect_to_quiz_create($quiz_id);
     } else {
         // we have errors! Oh no! Send them back to fix it
         return false;
     }
 }