PluginProbe
RSVP and Event Management / 2.7.5
RSVP and Event Management v2.7.5
trunk 0.5.0 0.6.0 0.7.0 0.8.0 0.9.0 0.9.5 1.0.0 1.1.0 1.2.0 1.2.1 1.3.0 1.3.1 1.3.2 1.5.0 1.6.0 1.6.1 1.6.2 1.6.5 1.7.0 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 All 136 releases
← All changes | wp-rsvp.php +775 -1340 1.7.3 → 2.7.5 View file →
@@ -1,1397 +1,832 @@
1 1 <?php
2 2 /**
3 3 * @package rsvp
4 - * @author MDE Development, LLC
5 - * @version 1.7.3
4 + * @author WPChill
5 + * @version 2.7.5
6 + * Plugin Name: RSVP
7 + * Text Domain: rsvp-plugin
8 + * Plugin URI: http://wordpress.org/extend/plugins/rsvp/
9 + * Description: This plugin allows guests to RSVP to an event. It was made initially for weddings but could be used for other things.
10 + * Author: WPChill
11 + * Version: 2.7.5
12 + * Author URI: https://wpchill.com
13 + * License: GPLv3
14 + * Copyright 2010-2020 Mike de Libero [email protected]
15 + * Copyright 2020 MachoThemes [email protected]
16 + * Copyright 2020 WPChill [email protected]
17 + *
18 + * Original Plugin URI: http://www.swimordiesoftware.com
19 + * Original Author URI: http://www.swimordiesoftware.com
20 + * Original Author: https://profiles.wordpress.org/mdedev/
21 + *
22 + *
23 + * This program is free software; you can redistribute it and/or modify
24 + * it under the terms of the GNU General Public License, version 3, as
25 + * published by the Free Software Foundation.
26 + *
27 + * This program is distributed in the hope that it will be useful,
28 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 + * GNU General Public License for more details.
31 + *
32 + * You should have received a copy of the GNU General Public License
33 + * along with this program; if not, write to the Free software
34 + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
6 35 */
7 -/*
8 -Plugin Name: RSVP
9 -Text Domain: rsvp-plugin
10 -Plugin URI: http://wordpress.org/extend/plugins/rsvp/
11 -Description: This plugin allows guests to RSVP to an event. It was made initially for weddings but could be used for other things.
12 -Author: MDE Development, LLC
13 -Version: 1.7.3
14 -Author URI: http://mde-dev.com
15 -License: GPL
16 -*/
17 -#
18 -# INSTALLATION: see readme.txt
19 -#
20 -# USAGE: Once the RSVP plugin has been installed, you can set the custom text
21 -# via Settings -> RSVP Options in the admin area.
22 -#
23 -# To add, edit, delete and see rsvp status there will be a new RSVP admin
24 -# area just go there.
25 -#
26 -# To allow people to rsvp create a new page and add "rsvp-pluginhere" to the text
27 36
28 - session_start();
29 - define("ATTENDEES_TABLE", $wpdb->prefix."attendees");
30 - define("ASSOCIATED_ATTENDEES_TABLE", $wpdb->prefix."associatedAttendees");
31 - define("QUESTIONS_TABLE", $wpdb->prefix."rsvpCustomQuestions");
32 - define("QUESTION_TYPE_TABLE", $wpdb->prefix."rsvpQuestionTypes");
33 - define("ATTENDEE_ANSWERS", $wpdb->prefix."attendeeAnswers");
34 - define("QUESTION_ANSWERS_TABLE", $wpdb->prefix."rsvpCustomQuestionAnswers");
35 - define("QUESTION_ATTENDEES_TABLE", $wpdb->prefix."rsvpCustomQuestionAttendees");
36 - define("EDIT_SESSION_KEY", "RsvpEditAttendeeID");
37 - define("EDIT_QUESTION_KEY", "RsvpEditQuestionID");
38 - define("RSVP_FRONTEND_TEXT_CHECK", "rsvp-pluginhere");
39 - define("OPTION_GREETING", "rsvp_custom_greeting");
40 - define("OPTION_THANKYOU", "rsvp_custom_thankyou");
41 - define("OPTION_DEADLINE", "rsvp_deadline");
42 - define("OPTION_OPENDATE", 'rsvp_opendate');
43 - define("OPTION_YES_VERBIAGE", "rsvp_yes_verbiage");
44 - define("OPTION_NO_VERBIAGE", "rsvp_no_verbiage");
45 - define("OPTION_KIDS_MEAL_VERBIAGE", "rsvp_kids_meal_verbiage");
46 - define("OPTION_VEGGIE_MEAL_VERBIAGE", "rsvp_veggie_meal_verbiage");
47 - define("OPTION_NOTE_VERBIAGE", "rsvp_note_verbiage");
48 - define("RSVP_OPTION_HIDE_NOTE", "rsvp_hide_note_field");
49 - define("OPTION_HIDE_VEGGIE", "rsvp_hide_veggie");
50 - define("OPTION_HIDE_KIDS_MEAL", "rsvp_hide_kids_meal");
51 - define("OPTION_HIDE_ADD_ADDITIONAL", "rsvp_hide_add_additional");
52 - define("OPTION_NOTIFY_ON_RSVP", "rsvp_notify_when_rsvp");
53 - define("OPTION_NOTIFY_EMAIL", "rsvp_notify_email_address");
54 - define("OPTION_DEBUG_RSVP_QUERIES", "rsvp_debug_queries");
55 - define("OPTION_WELCOME_TEXT", "rsvp_custom_welcome");
56 - define("OPTION_RSVP_QUESTION", "rsvp_custom_question_text");
57 - define("OPTION_RSVP_CUSTOM_YES_NO", "rsvp_custom_yes_no");
58 - define("OPTION_RSVP_PASSCODE", "rsvp_passcode");
59 - define("OPTION_RSVP_OPEN_REGISTRATION", "rsvp_open_registration");
60 - define("OPTION_RSVP_DONT_USE_HASH", "rsvp_dont_use_has");
61 - define("RSVP_DB_VERSION", "9");
62 - define("QT_SHORT", "shortAnswer");
63 - define("QT_MULTI", "multipleChoice");
64 - define("QT_LONG", "longAnswer");
65 - define("QT_DROP", "dropdown");
66 - define("QT_RADIO", "radio");
67 - define("RSVP_START_PARA", "<p class=\"rsvpParagraph\">");
68 - define("RSVP_END_PARA", "</p>\r\n");
69 - define("RSVP_START_CONTAINER", "<div id=\"rsvpPlugin\">\r\n");
70 - define("RSVP_END_CONTAINER", "</div>\r\n");
71 - define("RSVP_START_FORM_FIELD", "<div class=\"rsvpFormField\">\r\n");
72 - define("RSVP_END_FORM_FIELD", "</div>\r\n");
73 -
74 - $my_plugin_file = __FILE__;
37 +use Box\Spout\Reader\ReaderFactory;
38 +use Box\Spout\Common\Type;
75 39
76 - if (isset($plugin)) {
77 - $my_plugin_file = $plugin;
78 - }
79 - else if (isset($mu_plugin)) {
80 - $my_plugin_file = $mu_plugin;
81 - }
82 - else if (isset($network_plugin)) {
83 - $my_plugin_file = $network_plugin;
84 - }
40 +$my_plugin_file = __FILE__;
85 41
86 - define('RSVP_PLUGIN_FILE', $my_plugin_file);
87 - define('RSVP_PLUGIN_PATH', WP_PLUGIN_DIR.'/'.basename(dirname($my_plugin_file)));
88 - if((isset($_GET['page']) && (strToLower($_GET['page']) == 'rsvp-admin-export')) ||
89 - (isset($_POST['rsvp-bulk-action']) && (strToLower($_POST['rsvp-bulk-action']) == "export"))) {
90 - add_action('init', 'rsvp_admin_export');
42 +if ( isset( $plugin ) ) {
43 + $my_plugin_file = $plugin;
44 +} elseif ( isset( $mu_plugin ) ) {
45 + $my_plugin_file = $mu_plugin;
46 +} elseif ( isset( $network_plugin ) ) {
47 + $my_plugin_file = $network_plugin;
48 +}
49 +
50 +define( 'RSVP_PLUGIN_FILE', $my_plugin_file );
51 +define( 'RSVP_PLUGIN_PATH', WP_PLUGIN_DIR . '/' . basename( dirname( $my_plugin_file ) ) );
52 +
53 +require_once 'includes/rsvp-constants.php';
54 +
55 +require_once 'external-libs/wp-simple-nonce/wp-simple-nonce.php';
56 +require_once __DIR__ . '/includes/rsvp_frontend.inc.php';
57 +
58 +if ( is_admin() ) {
59 + require_once __DIR__ . '/includes/class-rsvp-review.php';
60 + require_once 'includes/class-rsvp-admin.php';
61 + require_once 'includes/class-rsvp-list-table.php';
62 + require_once 'includes/class-rsvp-events-list-table.php';
63 + require_once 'includes/class-rsvp-attendees-list-table.php';
64 + require_once 'includes/class-rsvp-questions-list-table.php';
65 + require_once 'includes/class-rsvp-helper.php';
66 + require_once 'includes/class-rsvp-upsells.php';
67 +
68 + if ( apply_filters( 'rsvp_show_upsells', true ) ) {
69 + RSVP_Upsells::get_instance();
91 70 }
92 -
93 - require_once("rsvp_frontend.inc.php");
94 - /*
95 - * Description: Database setup for the rsvp plug-in.
96 - */
97 - function rsvp_database_setup() {
98 - global $wpdb;
99 - require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
100 - require_once("rsvp_db_setup.inc.php");
71 +}
72 +
73 +/**
74 + * Database setup for the rsvp plug-in.
75 + */
76 +function rsvp_database_setup() {
77 + global $wpdb;
78 + require_once ABSPATH . 'wp-admin/includes/upgrade.php';
79 + require_once __DIR__ . '/includes/rsvp_db_setup.inc.php';
80 +}
81 +
82 +/**
83 + * Checks to see if the passcode field is installed in the attendees table, if not
84 + * it will add the field.
85 + */
86 +function rsvp_install_passcode_field() {
87 + global $wpdb;
88 + $table = ATTENDEES_TABLE;
89 + $sql = "SHOW COLUMNS FROM `$table` LIKE 'passcode'";
90 + if ( ! $wpdb->get_results( $sql ) ) {
91 + $sql = "ALTER TABLE `$table` ADD `passcode` VARCHAR(50) NOT NULL DEFAULT '';";
92 + $wpdb->query( $sql );
101 93 }
102 -
103 - function rsvp_install_passcode_field() {
104 - global $wpdb;
105 - $table = ATTENDEES_TABLE;
106 - $sql = "SHOW COLUMNS FROM `$table` LIKE 'passcode'";
107 - if(!$wpdb->get_results($sql)) {
108 - $sql = "ALTER TABLE `$table` ADD `passcode` VARCHAR(50) NOT NULL DEFAULT '';";
109 - $wpdb->query($sql);
110 - }
94 +}
95 +
96 +/**
97 + * Checks to see if passcode is required for attendees.
98 + *
99 + * @return bool True if a passcode is required, false otherwise.
100 + */
101 +function rsvp_require_passcode() {
102 + return ( ( get_option( OPTION_RSVP_PASSCODE ) == 'Y' ) || ( get_option( OPTION_RSVP_OPEN_REGISTRATION ) == 'Y' ) || ( get_option( OPTION_RSVP_ONLY_PASSCODE ) == 'Y' ) );
103 +}
104 +
105 +/**
106 + * Checks to see if only a passcode is required to RSVP.
107 + *
108 + * @return bool True if only a passcode is needed to RSVP, false otherwise.
109 + */
110 +function rsvp_require_only_passcode_to_register() {
111 + return ( get_option( OPTION_RSVP_ONLY_PASSCODE ) === 'Y' );
112 +}
113 +
114 +/**
115 + * [rsvp_require_unique_passcode description]
116 + *
117 + * @return [type] [description]
118 + */
119 +function rsvp_require_unique_passcode() {
120 + return rsvp_require_only_passcode_to_register();
121 +}
122 +
123 +/**
124 + * [rsvp_is_passcode_unique description]
125 + *
126 + * @param [type] $passcode [description]
127 + * @param [type] $attendee_id [description]
128 + *
129 + * @return [type] [description]
130 + */
131 +function rsvp_is_passcode_unique( $passcode, $attendee_id ) {
132 + global $wpdb;
133 +
134 + $is_unique = false;
135 +
136 + $sql = $wpdb->prepare( 'SELECT * FROM ' . ATTENDEES_TABLE . ' WHERE id <> %d AND passcode = %s', $attendee_id, $passcode );
137 + if ( ! $wpdb->get_results( $sql ) ) {
138 + $is_unique = true;
111 139 }
112 -
113 - function rsvp_require_passcode() {
114 - return ((get_option(OPTION_RSVP_PASSCODE) == "Y") || (get_option(OPTION_RSVP_OPEN_REGISTRATION) == "Y"));
115 - }
116 -
117 - /**
118 - * This generates a random 6 character passcode to be used for guests when the option is enabled.
119 - */
120 - function rsvp_generate_passcode() {
121 - $length = 6;
122 - $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
123 - $passcode = "";
124 140
125 - for ($p = 0; $p < $length; $p++) {
126 - $passcode .= $characters[mt_rand(0, strlen($characters))];
127 - }
141 + return $is_unique;
142 +}
128 143
129 - return $passcode;
144 +/**
145 + * This generates a random 6 character passcode to be used for guests when the option is enabled.
146 + */
147 +function rsvp_generate_passcode() {
148 + $length = 6;
149 + $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
150 + $passcode = '';
151 +
152 + for ( $p = 0; $p < $length; $p ++ ) {
153 + $passcode .= $characters[ mt_rand( 0, strlen( $characters ) ) ];
130 154 }
131 155
132 - function rsvp_admin_guestlist_options() {
133 -
134 - if(rsvp_require_passcode()) {
135 - global $wpdb;
136 -
137 - rsvp_install_passcode_field();
138 -
139 - $sql = "SELECT id, passcode FROM ".ATTENDEES_TABLE." WHERE passcode = ''";
140 - $attendees = $wpdb->get_results($sql);
141 - foreach($attendees as $a) {
142 - $newPasscode = rsvp_generate_passcode();
143 - $wpdb->update(ATTENDEES_TABLE,
144 - array("passcode" => rsvp_generate_passcode()),
145 - array("id" => $a->id),
146 - array("%s"),
147 - array("%d"));
148 - }
156 + return $passcode;
157 +}
158 +
159 +
160 +/**
161 + * Gets the file type based on the users uploaded extension.
162 + *
163 + * @param string $file_path The file name that the user uploaded for importing.
164 + *
165 + * @return object Null or the Spout type used for parsing the files.
166 + */
167 +function rsvp_free_import_get_file_type( $file_path ) {
168 + $ext = strtolower( pathinfo( $file_path, PATHINFO_EXTENSION ) );
169 +
170 + if ( 'csv' === $ext ) {
171 + return Type::CSV;
172 + } elseif ( 'xlsx' === $ext ) {
173 + return Type::XLSX;
174 + } elseif ( 'ods' === $ext ) {
175 + return Type::ODS;
176 + }
177 +
178 + return null;
179 +}
180 +
181 +
182 +function rsvp_get_question_with_answer_type_ids() {
183 + global $wpdb;
184 +
185 + $ids = array();
186 + $sql = 'SELECT id FROM ' . QUESTION_TYPE_TABLE . "
187 + WHERE questionType IN ('" . QT_MULTI . "', '" . QT_DROP . "', '" . QT_RADIO . "')";
188 + $results = $wpdb->get_results( $sql );
189 + foreach ( $results as $r ) {
190 + $ids[] = (int) $r->id;
191 + }
192 +
193 + return $ids;
194 +}
195 +
196 +/**
197 + * Populates the custom question types
198 + *
199 + * @since 2.2.8
200 + */
201 +function rsvp_populate_custom_question_types() {
202 + global $wpdb;
203 +
204 + $question_types = array(
205 + array(
206 + 'questionType' => 'shortAnswer',
207 + 'friendlyName' => 'Short Answer',
208 + ),
209 + array(
210 + 'questionType' => 'multipleChoice',
211 + 'friendlyName' => 'Multiple Choice',
212 + ),
213 + array(
214 + 'questionType' => 'longAnswer',
215 + 'friendlyName' => 'Long Answer',
216 + ),
217 + array(
218 + 'questionType' => 'dropdown',
219 + 'friendlyName' => 'Drop Down',
220 + ),
221 + array(
222 + 'questionType' => 'radio',
223 + 'friendlyName' => 'Radio',
224 + ),
225 + );
226 +
227 + foreach ( $question_types as $qt ) {
228 + $qType = $wpdb->get_var( $wpdb->prepare( 'SELECT id FROM ' . QUESTION_TYPE_TABLE . ' WHERE questionType = %s ', $qt['questionType'] ) );
229 + if ( $qType == null ) {
230 + $wpdb->insert(
231 + QUESTION_TYPE_TABLE,
232 + array(
233 + 'questionType' => $qt['questionType'],
234 + 'friendlyName' => $qt['friendlyName'],
235 + ),
236 + array( '%s', '%s' )
237 + );
149 238 }
150 -?>
151 - <script type="text/javascript" language="javascript">
152 - jQuery(document).ready(function() {
153 - jQuery("#rsvp_opendate").datepicker();
154 - jQuery("#rsvp_deadline").datepicker();
155 - });
156 - </script>
157 - <div class="wrap">
158 - <h2>RSVP Guestlist Options</h2>
159 - <form method="post" action="options.php">
160 - <?php settings_fields( 'rsvp-option-group' ); ?>
161 - <table class="form-table">
162 - <tr valign="top">
163 - <th scope="row"><label for="rsvp_opendate">RSVP Open Date:</label></th>
164 - <td align="left"><input type="text" name="rsvp_opendate" id="rsvp_opendate" value="<?php echo htmlspecialchars(get_option(OPTION_OPENDATE)); ?>" /></td>
165 - </tr>
166 - <tr valign="top">
167 - <th scope="row"><label for="rsvp_deadline">RSVP Deadline:</label></th>
168 - <td align="left"><input type="text" name="rsvp_deadline" id="rsvp_deadline" value="<?php echo htmlspecialchars(get_option(OPTION_DEADLINE)); ?>" /></td>
169 - </tr>
170 - <tr valign="top">
171 - <th scope="row"><label for="rsvp_custom_greeting">Custom Greeting:</label></th>
172 - <td align="left"><textarea name="rsvp_custom_greeting" id="rsvp_custom_greeting" rows="5" cols="60"><?php echo htmlspecialchars(get_option(OPTION_GREETING)); ?></textarea></td>
173 - </tr>
174 - <tr valign="top">
175 - <th scope="row"><label for="rsvp_custom_welcome">Custom Welcome:</label></th>
176 - <td align="left">Default is: &quot;There are a few more questions we need to ask you if you could please fill them out below to finish up the RSVP process.&quot;<br />
177 - <textarea name="rsvp_custom_welcome" id="rsvp_custom_welcome" rows="5" cols="60"><?php echo htmlspecialchars(get_option(OPTION_WELCOME_TEXT)); ?></textarea></td>
178 - </tr>
179 - <tr valign="top">
180 - <th scope="row"><label for="rsvp_custom_question_text">RSVP Question Verbiage:</label></th>
181 - <td align="left">Default is: &quot;So, how about it?&quot;<br />
182 - <input type="text" name="rsvp_custom_question_text" id="rsvp_custom_question_text"
183 - value="<?php echo htmlspecialchars(get_option(OPTION_RSVP_QUESTION)); ?>" size="65" /></td>
184 - </tr>
185 - <tr valign="top">
186 - <th scope="row"><label for="rsvp_yes_verbiage">RSVP Yes Verbiage:</label></th>
187 - <td align="left"><input type="text" name="rsvp_yes_verbiage" id="rsvp_yes_verbiage"
188 - value="<?php echo htmlspecialchars(get_option(OPTION_YES_VERBIAGE)); ?>" size="65" /></td>
189 - </tr>
190 - <tr valign="top">
191 - <th scope="row"><label for="rsvp_no_verbiage">RSVP No Verbiage:</label></th>
192 - <td align="left"><input type="text" name="rsvp_no_verbiage" id="rsvp_no_verbiage"
193 - value="<?php echo htmlspecialchars(get_option(OPTION_NO_VERBIAGE)); ?>" size="65" /></td>
194 - </tr>
195 - <!--<tr valign="top">
196 - <th scope="row"><label for="rsvp_custom_yes_no">Custom Yes/No Questions</label></th>
197 - <td align="left">
198 - This option allows a user to add in multiple yes or no options for when a user rsvps. This will over ride anything specified for the "RSVP Yes Verbiage" and "RSVP No Verbiage" options. The format of each question should be in the format:<br />
199 - value | Text user to see and each on it's own line.<br /><br />
200 - An example:<br />
201 - Yes | Yes, I will gladly come<br />
202 - Eh | Eh, I don't really know you and I know you are only inviting me for a gift
203 - <br /><br />
204 - <strong>Note:</strong> If you do not set a question with a value of "Yes" and one with a value of "No" the RSVP "Yes" and "No" counts will not be correct.
205 - <br /><br />
206 - <textarea name="rsvp_custom_yes_no" id="rsvp_custom_yes_no" rows="5" cols="60"><?php echo htmlspecialchars(get_option(OPTION_RSVP_CUSTOM_YES_NO)); ?></textarea>
207 - </td>
208 - </tr>-->
209 - <tr valign="top">
210 - <th scope="row"><label for="rsvp_kids_meal_verbiage">RSVP Kids Meal Verbiage:</label></th>
211 - <td align="left"><input type="text" name="rsvp_kids_meal_verbiage" id="rsvp_kids_meal_verbiage"
212 - value="<?php echo htmlspecialchars(get_option(OPTION_KIDS_MEAL_VERBIAGE)); ?>" size="65" /></td>
213 - </tr>
214 - <tr valign="top">
215 - <th scope="row"><label for="rsvp_hide_kids_meal">Hide Kids Meal Question:</label></th>
216 - <td align="left"><input type="checkbox" name="rsvp_hide_kids_meal" id="rsvp_hide_kids_meal"
217 - value="Y" <?php echo ((get_option(OPTION_HIDE_KIDS_MEAL) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
218 - </tr>
219 - <tr valign="top">
220 - <th scope="row"><label for="rsvp_veggie_meal_verbiage">RSVP Vegetarian Meal Verbiage:</label></th>
221 - <td align="left"><input type="text" name="rsvp_veggie_meal_verbiage" id="rsvp_veggie_meal_verbiage"
222 - value="<?php echo htmlspecialchars(get_option(OPTION_VEGGIE_MEAL_VERBIAGE)); ?>" size="65" /></td>
223 - </tr>
224 - <tr valign="top">
225 - <th scope="row"><label for="rsvp_hide_veggie">Hide Vegetarian Meal Question:</label></th>
226 - <td align="left"><input type="checkbox" name="rsvp_hide_veggie" id="rsvp_hide_veggie"
227 - value="Y" <?php echo ((get_option(OPTION_HIDE_VEGGIE) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
228 - </tr>
229 - <tr valign="top">
230 - <th scope="row"><label for="rsvp_note_verbiage">Note Verbiage:</label></th>
231 - <td align="left"><textarea name="rsvp_note_verbiage" id="rsvp_note_verbiage" rows="3" cols="60"><?php
232 - echo htmlspecialchars(get_option(OPTION_NOTE_VERBIAGE)); ?></textarea></td>
233 - </tr>
234 - <tr valign="top">
235 - <th scope="row"><label for="rsvp_hide_note_field">Hide Note Field:</label></th>
236 - <td align="left"><input type="checkbox" name="rsvp_hide_note_field" id="rsvp_hide_note_field" value="Y"
237 - <?php echo ((get_option(RSVP_OPTION_HIDE_NOTE) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
238 - </tr>
239 - <tr valign="top">
240 - <th scope="row"><label for="rsvp_custom_thankyou">Custom Thank You:</label></th>
241 - <td align="left"><textarea name="rsvp_custom_thankyou" id="rsvp_custom_thankyou" rows="5" cols="60"><?php echo htmlspecialchars(get_option(OPTION_THANKYOU)); ?></textarea></td>
242 - </tr>
243 - <tr>
244 - <th scope="row"><label for="rsvp_hide_add_additional">Do not allow additional guests</label></th>
245 - <td align="left"><input type="checkbox" name="rsvp_hide_add_additional" id="rsvp_hide_add_additional" value="Y"
246 - <?php echo ((get_option(OPTION_HIDE_ADD_ADDITIONAL) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
247 - </tr>
248 - <tr>
249 - <th scope="row"><label for="rsvp_notify_when_rsvp">Notify When Guest RSVPs</label></th>
250 - <td align="left"><input type="checkbox" name="rsvp_notify_when_rsvp" id="rsvp_notify_when_rsvp" value="Y"
251 - <?php echo ((get_option(OPTION_NOTIFY_ON_RSVP) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
252 - </tr>
253 - <tr>
254 - <th scope="row"><label for="rsvp_notify_email_address">Email address to notify</label></th>
255 - <td align="left"><input type="text" name="rsvp_notify_email_address" id="rsvp_notify_email_address" value="<?php echo htmlspecialchars(get_option(OPTION_NOTIFY_EMAIL)); ?>"/></td>
256 - </tr>
257 - <tr>
258 - <th scope="ropw"><label for="<?php echo OPTION_RSVP_PASSCODE; ?>">Require a Passcode to RSVP:</label></th>
259 - <td align="left"><input type="checkbox" name="<?php echo OPTION_RSVP_PASSCODE; ?>" id="<?php echo OPTION_RSVP_PASSCODE; ?>" value="Y"
260 - <?php echo ((get_option(OPTION_RSVP_PASSCODE) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
261 - </tr>
262 - <tr valign="top">
263 - <th scope="row"><label for="<?PHP echo OPTION_RSVP_OPEN_REGISTRATION; ?>">Allow Open Registration (note - this will force passcodes for attendees):</label></th>
264 - <td align="left"><input type="checkbox" name="<?php echo OPTION_RSVP_OPEN_REGISTRATION; ?>" id="<?php echo OPTION_RSVP_OPEN_REGISTRATION; ?>" value="Y"
265 - <?php echo ((get_option(OPTION_RSVP_OPEN_REGISTRATION) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
266 - </tr>
267 - <tr valign="top">
268 - <th scope="row"><label for="<?PHP echo OPTION_RSVP_DONT_USE_HASH; ?>">Do not scroll page to the top of the RSVP form:</label></th>
269 - <td align="left"><input type="checkbox" name="<?php echo OPTION_RSVP_DONT_USE_HASH; ?>" id="<?php echo OPTION_RSVP_DONT_USE_HASH; ?>" value="Y"
270 - <?php echo ((get_option(OPTION_RSVP_DONT_USE_HASH) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
271 - </tr>
272 - <tr valign="top">
273 - <th scope="row"><label for="rsvp_debug_queries">Debug RSVP Queries:</label></th>
274 - <td align="left"><input type="checkbox" name="rsvp_debug_queries" id="rsvp_debug_queries"
275 - value="Y" <?php echo ((get_option(OPTION_DEBUG_RSVP_QUERIES) == "Y") ? " checked=\"checked\"" : ""); ?> /></td>
276 - </tr>
277 - </table>
278 - <input type="hidden" name="action" value="update" />
279 - <p class="submit">
280 - <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
281 - </p>
282 - </form>
283 - </div>
284 -<?php
285 239 }
286 -
287 - function rsvp_admin_guestlist() {
288 - global $wpdb;
289 -
290 - if(get_option("rsvp_db_version") != RSVP_DB_VERSION) {
291 - rsvp_database_setup();
292 - }
293 - rsvp_install_passcode_field();
294 - if((count($_POST) > 0) && ($_POST['rsvp-bulk-action'] == "delete") && (is_array($_POST['attendee']) && (count($_POST['attendee']) > 0))) {
295 - foreach($_POST['attendee'] as $attendee) {
296 - if(is_numeric($attendee) && ($attendee > 0)) {
297 - $wpdb->query($wpdb->prepare("DELETE FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE attendeeID = %d OR associatedAttendeeID = %d",
298 - $attendee,
299 - $attendee));
300 - $wpdb->query($wpdb->prepare("DELETE FROM ".ATTENDEES_TABLE." WHERE id = %d",
301 - $attendee));
240 +}
241 +
242 +function rsvp_admin_custom_question() {
243 + global $wpdb;
244 + $rsvp_helper = RSVP_Helper::get_instance();
245 +
246 + $answerQuestionTypes = rsvp_get_question_with_answer_type_ids();
247 +
248 + rsvp_populate_custom_question_types();
249 +
250 + if ( ( count( $_POST ) > 0 ) && ! empty( $_POST['question'] ) && is_numeric( $_POST['questionTypeID'] ) ) {
251 + check_admin_referer( 'rsvp_add_custom_question' );
252 + if ( isset( $_POST['questionId'] ) && is_numeric( $_POST['questionId'] ) && ( $_POST['questionId'] > 0 ) ) {
253 + $wpdb->update(
254 + QUESTIONS_TABLE,
255 + array(
256 + 'question' => sanitize_text_field( wp_unslash( $_POST['question'] ) ),
257 + 'questionTypeID' => absint( $_POST['questionTypeID'] ),
258 + 'permissionLevel' => ( ( sanitize_text_field( wp_unslash( $_POST['permissionLevel'] ) ) == 'private' ) ? 'private' : 'public' ),
259 + ),
260 + array( 'id' => absint( $_POST['questionId'] ) ),
261 + array( '%s', '%d', '%s' ),
262 + array( '%d' )
263 + );
264 + $questionId = absint( $_POST['questionId'] );
265 +
266 + $answers = $wpdb->get_results( $wpdb->prepare( 'SELECT id FROM ' . QUESTION_ANSWERS_TABLE . ' WHERE questionID = %d', absint( $questionId ) ) );
267 + if ( count( $answers ) > 0 ) {
268 + foreach ( $answers as $a ) {
269 + if ( isset( $_POST[ 'deleteAnswer' . $a->id ] ) && ( strToUpper( sanitize_text_field( wp_unslash( $_POST[ 'deleteAnswer' . $a->id ] ) ) ) == 'Y' ) ) {
270 + $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . QUESTION_ANSWERS_TABLE . ' WHERE id = %d', $a->id ) );
271 + } elseif ( isset( $_POST[ 'answer' . $a->id ] ) && ! empty( $_POST[ 'answer' . $a->id ] ) ) {
272 + $wpdb->update(
273 + QUESTION_ANSWERS_TABLE,
274 + array( 'answer' => sanitize_text_field( wp_unslash( $_POST[ 'answer' . $a->id ] ) ) ),
275 + array( 'id' => absint( $a->id ) ),
276 + array( '%s' ),
277 + array( '%d' )
278 + );
279 + }
302 280 }
303 281 }
282 + } else {
283 + $wpdb->insert(
284 + QUESTIONS_TABLE,
285 + array(
286 + 'question' => sanitize_text_field( wp_unslash( ( $_POST['question'] ) ) ),
287 + 'questionTypeID' => absint( $_POST['questionTypeID'] ),
288 + 'permissionLevel' => ( ( sanitize_text_field( wp_unslash( ( $_POST['permissionLevel'] ) ) == 'private' ) ? 'private' : 'public' ) ),
289 + ),
290 + array( '%s', '%d', '%s' )
291 + );
292 + $questionId = $wpdb->insert_id;
304 293 }
305 -
306 - $sql = "SELECT id, firstName, lastName, rsvpStatus, note, kidsMeal, additionalAttendee, veggieMeal, personalGreeting, passcode FROM ".ATTENDEES_TABLE;
307 - $orderBy = " lastName, firstName";
308 - if(isset($_GET['sort'])) {
309 - if(strToLower($_GET['sort']) == "rsvpstatus") {
310 - $orderBy = " rsvpStatus ".((strtolower($_GET['sortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
311 - }else if(strToLower($_GET['sort']) == "attendee") {
312 - $direction = ((strtolower($_GET['sortDirection']) == "desc") ? "DESC" : "ASC");
313 - $orderBy = " lastName $direction, firstName $direction";
314 - } else if(strToLower($_GET['sort']) == "kidsmeal") {
315 - $orderBy = " kidsMeal ".((strtolower($_GET['sortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
316 - } else if(strToLower($_GET['sort']) == "additional") {
317 - $orderBy = " additionalAttendee ".((strtolower($_GET['sortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
318 - } else if(strToLower($_GET['sort']) == "vegetarian") {
319 - $orderBy = " veggieMeal ".((strtolower($_GET['sortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
320 - }
321 - }
322 - $sql .= " ORDER BY ".$orderBy;
323 - $attendees = $wpdb->get_results($sql);
324 - $sort = "";
325 - $sortDirection = "asc";
326 - if(isset($_GET['sort'])) {
327 - $sort = $_GET['sort'];
328 - }
329 -
330 - if(isset($_GET['sortDirection'])) {
331 - $sortDirection = $_GET['sortDirection'];
332 - }
333 - ?>
334 - <script type="text/javascript" language="javascript">
335 - jQuery(document).ready(function() {
336 - jQuery("#cb").click(function() {
337 - if(jQuery("#cb").attr("checked")) {
338 - jQuery("input[name='attendee[]']").attr("checked", "checked");
339 - } else {
340 - jQuery("input[name='attendee[]']").removeAttr("checked");
341 - }
342 - });
343 - });
344 - </script>
345 - <div class="wrap">
346 - <div id="icon-edit" class="icon32"><br /></div>
347 - <h2>List of current attendees</h2>
348 - <form method="post" id="rsvp-form" enctype="multipart/form-data">
349 - <input type="hidden" id="rsvp-bulk-action" name="rsvp-bulk-action" />
350 - <input type="hidden" id="sortValue" name="sortValue" value="<?php echo htmlentities($sort, ENT_QUOTES); ?>" />
351 - <input type="hidden" name="exportSortDirection" value="<?php echo htmlentities($sortDirection, ENT_QUOTES); ?>" />
352 - <div class="tablenav">
353 - <div class="alignleft actions">
354 - <select id="rsvp-action-top" name="action">
355 - <option value="" selected="selected"><?php _e('Bulk Actions', 'rsvp'); ?></option>
356 - <option value="delete"><?php _e('Delete', 'rsvp'); ?></option>
357 - </select>
358 - <input type="submit" value="<?php _e('Apply', 'rsvp'); ?>" name="doaction" id="doaction" class="button-secondary action" onclick="document.getElementById('rsvp-bulk-action').value = document.getElementById('rsvp-action-top').value;" />
359 - <input type="submit" value="<?php _e('Export Attendees', 'rsvp'); ?>" name="exportButton" id="exportButton" class="button-secondary action" onclick="document.getElementById('rsvp-bulk-action').value = 'export';" />
360 - </div>
361 - <?php
362 - $yesResults = $wpdb->get_results("SELECT COUNT(*) AS yesCount FROM ".ATTENDEES_TABLE." WHERE rsvpStatus = 'Yes'");
363 - $noResults = $wpdb->get_results("SELECT COUNT(*) AS noCount FROM ".ATTENDEES_TABLE." WHERE rsvpStatus = 'No'");
364 - $noResponseResults = $wpdb->get_results("SELECT COUNT(*) AS noResponseCount FROM ".ATTENDEES_TABLE." WHERE rsvpStatus = 'NoResponse'");
365 - $kidsMeals = $wpdb->get_results("SELECT COUNT(*) AS kidsMealCount FROM ".ATTENDEES_TABLE." WHERE kidsMeal = 'Y'");
366 - $veggieMeals = $wpdb->get_results("SELECT COUNT(*) AS veggieMealCount FROM ".ATTENDEES_TABLE." WHERE veggieMeal = 'Y'");
367 - ?>
368 - <div class="alignright">RSVP Count -
369 - Yes: <strong><?php echo $yesResults[0]->yesCount; ?></strong> &nbsp; &nbsp; &nbsp; &nbsp;
370 - No: <strong><?php echo $noResults[0]->noCount; ?></strong> &nbsp; &nbsp; &nbsp; &nbsp;
371 - No Response: <strong><?php echo $noResponseResults[0]->noResponseCount; ?></strong> &nbsp; &nbsp; &nbsp; &nbsp;
372 - Kids Meals: <strong><?php echo $kidsMeals[0]->kidsMealCount; ?></strong> &nbsp; &nbsp; &nbsp; &nbsp;
373 - Veggie Meals: <strong><?php echo $veggieMeals[0]->veggieMealCount; ?></strong>
374 - </div>
375 - <div class="clear"></div>
376 - </div>
377 - <table class="widefat post fixed" cellspacing="0">
378 - <thead>
379 - <tr>
380 - <th scope="col" class="manage-column column-cb check-column" style=""><input type="checkbox" id="cb" /></th>
381 - <th scope="col" id="attendeeName" class="manage-column column-title" style="">Attendee</a> &nbsp;
382 - <a href="admin.php?page=rsvp-top-level&amp;sort=attendee&amp;sortDirection=asc">
383 - <img src="<?php echo plugins_url(); ?>/rsvp/uparrow<?php
384 - echo ((($sort == "attendee") && ($sortDirection == "asc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
385 - alt="Sort Ascending Attendee Status" title="Sort Ascending Attendee Status" border="0"></a> &nbsp;
386 - <a href="admin.php?page=rsvp-top-level&amp;sort=attendee&amp;sortDirection=desc">
387 - <img src="<?php echo plugins_url(); ?>/rsvp/downarrow<?php
388 - echo ((($sort == "attendee") && ($sortDirection == "desc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
389 - alt="Sort Descending Attendee Status" title="Sort Descending Attendee Status" border="0"></a>
390 - </th>
391 - <th scope="col" id="rsvpStatus" class="manage-column column-title" style="">RSVP Status &nbsp;
392 - <a href="admin.php?page=rsvp-top-level&amp;sort=rsvpStatus&amp;sortDirection=asc">
393 - <img src="<?php echo plugins_url(); ?>/rsvp/uparrow<?php
394 - echo ((($sort == "rsvpStatus") && ($sortDirection == "asc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
395 - alt="Sort Ascending RSVP Status" title="Sort Ascending RSVP Status" border="0"></a> &nbsp;
396 - <a href="admin.php?page=rsvp-top-level&amp;sort=rsvpStatus&amp;sortDirection=desc">
397 - <img src="<?php echo plugins_url(); ?>/rsvp/downarrow<?php
398 - echo ((($sort == "rsvpStatus") && ($sortDirection == "desc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
399 - alt="Sort Descending RSVP Status" title="Sort Descending RSVP Status" border="0"></a>
400 - </th>
401 - <?php if(get_option(OPTION_HIDE_KIDS_MEAL) != "Y") {?>
402 - <th scope="col" id="kidsMeal" class="manage-column column-title" style="">Kids Meal &nbsp;
403 - <a href="admin.php?page=rsvp-top-level&amp;sort=kidsMeal&amp;sortDirection=asc">
404 - <img src="<?php echo plugins_url(); ?>/rsvp/uparrow<?php
405 - echo ((($sort == "kidsMeal") && ($sortDirection == "asc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
406 - alt="Sort Ascending Kids Meal Status" title="Sort Ascending Kids Meal Status" border="0"></a> &nbsp;
407 - <a href="admin.php?page=rsvp-top-level&amp;sort=kidsMeal&amp;sortDirection=desc">
408 - <img src="<?php echo plugins_url(); ?>/rsvp/downarrow<?php
409 - echo ((($sort == "kidsMeal") && ($sortDirection == "desc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
410 - alt="Sort Descending Kids Meal Status" title="Sort Descending Kids Meal Status" border="0"></a>
411 - </th>
412 - <?php } ?>
413 - <th scope="col" id="additionalAttendee" class="manage-column column-title" style="">Additional Attendee &nbsp;
414 - <a href="admin.php?page=rsvp-top-level&amp;sort=additional&amp;sortDirection=asc">
415 - <img src="<?php echo plugins_url(); ?>/rsvp/uparrow<?php
416 - echo ((($sort == "additional") && ($sortDirection == "asc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
417 - alt="Sort Ascending Additional Attendees Status" title="Sort Ascending Additional Attendees Status" border="0"></a> &nbsp;
418 - <a href="admin.php?page=rsvp-top-level&amp;sort=additional&amp;sortDirection=desc">
419 - <img src="<?php echo plugins_url(); ?>/rsvp/downarrow<?php
420 - echo ((($sort == "additional") && ($sortDirection == "desc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
421 - alt="Sort Descending Additional Attendees Status" title="Sort Descending Additional Atttendees Status" border="0"></a>
422 - </th>
423 - <?php if(get_option(OPTION_HIDE_VEGGIE) != "Y") {?>
424 - <th scope="col" id="veggieMeal" class="manage-column column-title" style="">Vegetarian &nbsp;
425 - <a href="admin.php?page=rsvp-top-level&amp;sort=vegetarian&amp;sortDirection=asc">
426 - <img src="<?php echo plugins_url(); ?>/rsvp/uparrow<?php
427 - echo ((($sort == "vegetarian") && ($sortDirection == "asc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
428 - alt="Sort Ascending Vegetarian Status" title="Sort Ascending Vegetarian Status" border="0"></a> &nbsp;
429 - <a href="admin.php?page=rsvp-top-level&amp;sort=vegetarian&amp;sortDirection=desc">
430 - <img src="<?php echo plugins_url(); ?>/rsvp/downarrow<?php
431 - echo ((($sort == "vegetarian") && ($sortDirection == "desc")) ? "_selected" : ""); ?>.gif" width="11" height="9"
432 - alt="Sort Descending Vegetarian Status" title="Sort Descending Vegetarian Status" border="0"></a>
433 - </th>
434 - <?php } ?>
435 - <th scope="col" id="customMessage" class="manage-column column-title" style="">Custom Message</th>
436 - <th scope="col" id="note" class="manage-column column-title" style="">Note</th>
437 - <?php
438 - if(rsvp_require_passcode()) {
439 - ?>
440 - <th scope="col" id="passcode" class="manage-column column-title" style="">Passcode</th>
441 - <?php
442 - }
443 -
444 - ?>
445 - <?php
446 - $qRs = $wpdb->get_results("SELECT id, question FROM ".QUESTIONS_TABLE." ORDER BY sortOrder, id");
447 - if(count($qRs) > 0) {
448 - foreach($qRs as $q) {
449 - ?>
450 - <th scope="col" class="manage-column -column-title"><?php echo htmlspecialchars(stripslashes($q->question)); ?></th>
451 - <?php
452 - }
453 - }
454 - ?>
455 - <th scope="col" id="associatedAttendees" class="manage-column column-title" style="">Associated Attendees</th>
456 - </tr>
457 - </thead>
458 - </table>
459 - <div style="overflow: auto;height: 450px;">
460 - <table class="widefat post fixed" cellspacing="0">
461 - <?php
462 - $i = 0;
463 - foreach($attendees as $attendee) {
464 - ?>
465 - <tr class="<?php echo (($i % 2 == 0) ? "alternate" : ""); ?> author-self">
466 - <th scope="row" class="check-column"><input type="checkbox" name="attendee[]" value="<?php echo $attendee->id; ?>" /></th>
467 - <td>
468 - <a href="<?php echo get_option("siteurl"); ?>/wp-admin/admin.php?page=rsvp-admin-guest&amp;id=<?php echo $attendee->id; ?>"><?php echo htmlspecialchars(stripslashes($attendee->firstName)." ".stripslashes($attendee->lastName)); ?></a>
469 - </td>
470 - <td><?php echo $attendee->rsvpStatus; ?></td>
471 - <?php if(get_option(OPTION_HIDE_KIDS_MEAL) != "Y") {?>
472 - <td><?php
473 - if($attendee->rsvpStatus == "NoResponse") {
474 - echo "--";
475 - } else {
476 - echo (($attendee->kidsMeal == "Y") ? "Yes" : "No");
477 - }?></td>
478 - <?php } ?>
479 - <td><?php
480 - if($attendee->rsvpStatus == "NoResponse") {
481 - echo "--";
482 - } else {
483 - echo (($attendee->additionalAttendee == "Y") ? "Yes" : "No");
484 - }
485 - ?></td>
486 - <?php if(get_option(OPTION_HIDE_VEGGIE) != "Y") {?>
487 - <td><?php
488 - if($attendee->rsvpStatus == "NoResponse") {
489 - echo "--";
490 - } else {
491 - echo (($attendee->veggieMeal == "Y") ? "Yes" : "No");
492 - }
493 - ?></td>
494 - <?php } ?>
495 - <td><?php
496 - echo nl2br(stripslashes(trim($attendee->personalGreeting)));
497 - ?></td>
498 - <td><?php echo nl2br(stripslashes(trim($attendee->note))); ?></td>
499 - <?php
500 - if(rsvp_require_passcode()) {
501 - ?>
502 - <td><?php echo $attendee->passcode; ?></td>
503 - <?php
504 - }
505 - $sql = "SELECT question, answer FROM ".QUESTIONS_TABLE." q
506 - LEFT JOIN ".ATTENDEE_ANSWERS." ans ON q.id = ans.questionID AND ans.attendeeID = %d
507 - ORDER BY q.sortOrder";
508 - $aRs = $wpdb->get_results($wpdb->prepare($sql, $attendee->id));
509 - if(count($aRs) > 0) {
510 - foreach($aRs as $a) {
511 - ?>
512 - <td><?php echo htmlspecialchars(stripslashes($a->answer)); ?></td>
513 - <?php
514 - }
515 - }
516 - ?>
517 - <td>
518 - <?php
519 - $sql = "SELECT firstName, lastName FROM ".ATTENDEES_TABLE."
520 - WHERE id IN (SELECT attendeeID FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE associatedAttendeeID = %d)
521 - OR id in (SELECT associatedAttendeeID FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE attendeeID = %d)";
522 -
523 - $associations = $wpdb->get_results($wpdb->prepare($sql, $attendee->id, $attendee->id));
524 - foreach($associations as $a) {
525 - echo htmlspecialchars(stripslashes($a->firstName." ".$a->lastName))."<br />";
526 - }
527 - ?>
528 - </td>
529 - </tr>
530 - <?php
531 - $i++;
532 - }
533 - ?>
534 - </table>
535 - </div>
536 - </form>
537 - </div>
538 - <?php
539 - }
540 -
541 - function rsvp_admin_export() {
542 - global $wpdb;
543 - $sql = "SELECT id, firstName, lastName, rsvpStatus, note, kidsMeal, additionalAttendee, veggieMeal, passcode
544 - FROM ".ATTENDEES_TABLE;
545 -
546 - $orderBy = " lastName, firstName";
547 - if(isset($_POST['sortValue'])) {
548 - if(strToLower($_POST['sortValue']) == "rsvpstatus") {
549 - $orderBy = " rsvpStatus ".((strtolower($_POST['exportSortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
550 - }else if(strToLower($_POST['sortValue']) == "attendee") {
551 - $direction = ((strtolower($_POST['exportSortDirection']) == "desc") ? "DESC" : "ASC");
552 - $orderBy = " lastName $direction, firstName $direction";
553 - } else if(strToLower($_POST['sortValue']) == "kidsmeal") {
554 - $orderBy = " kidsMeal ".((strtolower($_POST['exportSortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
555 - } else if(strToLower($_POST['sortValue']) == "additional") {
556 - $orderBy = " additionalAttendee ".((strtolower($_POST['exportSortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
557 - } else if(strToLower($_POST['sortValue']) == "vegetarian") {
558 - $orderBy = " veggieMeal ".((strtolower($_POST['exportSortDirection']) == "desc") ? "DESC" : "ASC") .", ".$orderBy;
559 - }
560 - }
561 - $sql .= " ORDER BY ".$orderBy;
562 - $attendees = $wpdb->get_results($sql);
563 - $csv = "\"Attendee\",\"RSVP Status\",";
564 -
565 - if(get_option(OPTION_HIDE_KIDS_MEAL) != "Y") {
566 - $csv .= "\"Kids Meal\",";
567 - }
568 - $csv .= "\"Additional Attendee\",";
569 -
570 - if(get_option(OPTION_HIDE_VEGGIE) != "Y") {
571 - $csv .= "\"Vegatarian\",";
572 - }
573 - if(rsvp_require_passcode()) {
574 - $csv .= "\"Passcode\",";
575 - }
576 - $csv .= "\"Note\",\"Associated Attendees\"";
577 -
578 - $qRs = $wpdb->get_results("SELECT id, question FROM ".QUESTIONS_TABLE." ORDER BY sortOrder, id");
579 - if(count($qRs) > 0) {
580 - foreach($qRs as $q) {
581 - $csv .= ",\"".stripslashes($q->question)."\"";
294 +
295 + if ( isset( $_POST['numNewAnswers'] ) && is_numeric( $_POST['numNewAnswers'] ) &&
296 + in_array( absint( $_POST['questionTypeID'] ), $answerQuestionTypes ) ) {
297 + for ( $i = 0; $i < absint( $_POST['numNewAnswers'] ); $i ++ ) {
298 + if ( isset( $_POST[ 'newAnswer' . $i ] ) && ! empty( $_POST[ 'newAnswer' . $i ] ) ) {
299 + $wpdb->insert(
300 + QUESTION_ANSWERS_TABLE,
301 + array(
302 + 'questionID' => absint( $questionId ),
303 + 'answer' => sanitize_text_field( wp_unslash( $_POST[ 'newAnswer' . $i ] ) ),
304 + )
305 + );
582 306 }
583 307 }
584 -
585 - $csv .= "\r\n";
586 - foreach($attendees as $a) {
587 - $csv .= "\"".stripslashes($a->firstName." ".$a->lastName)."\",\"".($a->rsvpStatus)."\",";
588 -
589 - if(get_option(OPTION_HIDE_KIDS_MEAL) != "Y") {
590 - $csv .= "\"".(($a->kidsMeal == "Y") ? "Yes" : "No")."\",";
591 - }
592 -
593 - $csv .= "\"".(($a->additionalAttendee == "Y") ? "Yes" : "No")."\",";
594 -
595 - if(get_option(OPTION_HIDE_VEGGIE) != "Y") {
596 - $csv .= "\"".(($a->veggieMeal == "Y") ? "Yes" : "No")."\",";
597 - }
598 -
599 - if(rsvp_require_passcode()) {
600 - $csv .= "\"".(($a->passcode))."\",";
601 - }
602 -
603 - $csv .= "\"".(str_replace("\"", "\"\"", stripslashes($a->note)))."\",\"";
604 -
605 - $sql = "SELECT firstName, lastName FROM ".ATTENDEES_TABLE."
606 - WHERE id IN (SELECT attendeeID FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE associatedAttendeeID = %d)
607 - OR id in (SELECT associatedAttendeeID FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE attendeeID = %d)";
608 -
609 - $associations = $wpdb->get_results($wpdb->prepare($sql, $a->id, $a->id));
610 - foreach($associations as $assc) {
611 - $csv .= trim(stripslashes($assc->firstName." ".$assc->lastName))."\r\n";
612 - }
613 - $csv .= "\"";
614 -
615 - $qRs = $wpdb->get_results("SELECT id, question FROM ".QUESTIONS_TABLE." ORDER BY sortOrder, id");
616 - if(count($qRs) > 0) {
617 - foreach($qRs as $q) {
618 - $aRs = $wpdb->get_results($wpdb->prepare("SELECT answer FROM ".ATTENDEE_ANSWERS." WHERE attendeeID = %d AND questionID = %d", $a->id, $q->id));
619 - if(count($aRs) > 0) {
620 - $csv .= ",\"".stripslashes($aRs[0]->answer)."\"";
621 - } else {
622 - $csv .= ",\"\"";
623 - }
308 + }
309 +
310 + if ( strToLower( sanitize_text_field( wp_unslash( $_POST['permissionLevel'] ) ) ) == 'private' ) {
311 + $wpdb->query( $wpdb->prepare( 'DELETE FROM ' . QUESTION_ATTENDEES_TABLE . ' WHERE questionID = %d', absint( $questionId ) ) );
312 + if ( isset( $_POST['attendees'] ) && is_array( $_POST['attendees'] ) ) {
313 + foreach ( array_map( 'sanitize_text_field', array_map( 'wp_unslash', $_POST['attendees'] ) ) as $aid ) {
314 + if ( is_numeric( $aid ) && ( $aid > 0 ) ) {
315 + $wpdb->insert(
316 + QUESTION_ATTENDEES_TABLE,
317 + array(
318 + 'attendeeID' => absint( $aid ),
319 + 'questionID' => absint( $questionId ),
320 + ),
321 + array( '%d', '%d' )
322 + );
624 323 }
625 324 }
626 -
627 - $csv .= "\r\n";
628 325 }
629 - if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])) {
630 - // IE Bug in download name workaround
631 - ini_set( 'zlib.output_compression','Off' );
632 - }
633 - header('Content-Description: RSVP Export');
634 - header("Content-Type: application/vnd.ms-excel", true);
635 - header('Content-Disposition: attachment; filename="rsvpEntries.csv"');
636 - echo $csv;
637 - exit();
638 - }
639 -
640 - function rsvp_admin_import() {
641 - global $wpdb;
642 - if(count($_FILES) > 0) {
643 - check_admin_referer('rsvp-import');
644 - require_once("Excel/reader.php");
645 - $data = new Spreadsheet_Excel_Reader();
646 - $data->read($_FILES['importFile']['tmp_name']);
647 - if($data->sheets[0]['numCols'] >= 2) {
648 - $count = 0;
649 - for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
650 - $fName = trim($data->sheets[0]['cells'][$i][1]);
651 - $lName = trim($data->sheets[0]['cells'][$i][2]);
652 - $personalGreeting = (isset($data->sheets[0]['cells'][$i][4])) ? $personalGreeting = $data->sheets[0]['cells'][$i][4] : "";
653 - $passcode = (isset($data->sheets[0]['cells'][$i][5])) ? $data->sheets[0]['cells'][$i][5] : "";
654 - if(!empty($fName) && !empty($lName)) {
655 - $sql = "SELECT id FROM ".ATTENDEES_TABLE."
656 - WHERE firstName = %s AND lastName = %s ";
657 - $res = $wpdb->get_results($wpdb->prepare($sql, $fName, $lName));
658 - if(count($res) == 0) {
659 - $wpdb->insert(ATTENDEES_TABLE, array("firstName" => $fName,
660 - "lastName" => $lName,
661 - "personalGreeting" => $personalGreeting,
662 - "passcode" => $passcode),
663 - array('%s', '%s', '%s', '%s'));
664 - $count++;
326 + }
327 + ?>
328 + <p><?php echo esc_html__( 'Custom Question saved', 'rsvp' ); ?></p>
329 + <p>
330 + <a href="<?php echo esc_url( add_query_arg( array( 'page' => 'rsvp-admin-questions' ), admin_url( 'admin.php' ) ) ); ?>"
331 + class="button button-secondary"><?php echo esc_html__( 'Continue to Question List', 'rsvp' ); ?></a>
332 + <a href="
333 + <?php
334 + echo esc_url( add_query_arg(
335 + array(
336 + 'page' => 'rsvp-admin-questions',
337 + 'action' => 'add',
338 + ),
339 + admin_url( 'admin.php' )
340 + ) );
341 + ?>
342 + "
343 + class="button button-primary"><?php echo esc_html__( 'Add another Question', 'rsvp' ); ?></a>
344 + </p>
345 + <?php
346 + } else {
347 + $questionTypeId = 0;
348 + $question = '';
349 + $isNew = true;
350 + $questionId = 0;
351 + $permissionLevel = 'public';
352 + $savedAttendees = array();
353 + if ( isset( $_GET['id'] ) && is_numeric( $_GET['id'] ) ) {
354 + $qRs = $wpdb->get_results( $wpdb->prepare( 'SELECT id, question, questionTypeID, permissionLevel FROM ' . QUESTIONS_TABLE . ' WHERE id = %d', absint( $_GET['id'] ) ) );
355 + if ( count( $qRs ) > 0 ) {
356 + $isNew = false;
357 + $questionId = absint( $qRs[0]->id );
358 + $question = stripslashes( $qRs[0]->question );
359 + $permissionLevel = stripslashes( $qRs[0]->permissionLevel );
360 + $questionTypeId = absint( $qRs[0]->questionTypeID );
361 +
362 + if ( $permissionLevel == 'private' ) {
363 + $aRs = $wpdb->get_results( $wpdb->prepare( 'SELECT attendeeID FROM ' . QUESTION_ATTENDEES_TABLE . ' WHERE questionID = %d', $questionId ) );
364 + if ( count( $aRs ) > 0 ) {
365 + foreach ( $aRs as $a ) {
366 + $savedAttendees[] = $a->attendeeID;
665 367 }
666 368 }
667 369 }
668 -
669 - if($data->sheets[0]['numCols'] >= 3) {
670 - // There must be associated users so let's associate them
671 - for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
672 - $fName = trim($data->sheets[0]['cells'][$i][1]);
673 - $lName = trim($data->sheets[0]['cells'][$i][2]);
674 - if(!empty($fName) && !empty($lName) && (count($data->sheets[0]['cells'][$i]) >= 3)) {
675 - // Get the user's id
676 - $sql = "SELECT id FROM ".ATTENDEES_TABLE."
677 - WHERE firstName = %s AND lastName = %s ";
678 - $res = $wpdb->get_results($wpdb->prepare($sql, $fName, $lName));
679 - if((count($res) > 0) && isset($data->sheets[0]['cells'][$i][3])) {
680 - $userId = $res[0]->id;
681 -
682 - // Deal with the assocaited users...
683 - $associatedUsers = explode(",", trim($data->sheets[0]['cells'][$i][3]));
684 - if(is_array($associatedUsers)) {
685 - foreach($associatedUsers as $au) {
686 - $user = explode(" ", trim($au), 2);
687 - // Three cases, they didn't enter in all of the information, user exists or doesn't.
688 - // If user exists associate the two users
689 - // If user does not exist add the user and then associate the two
690 - if(is_array($user) && (count($user) == 2)) {
691 - $sql = "SELECT id FROM ".ATTENDEES_TABLE."
692 - WHERE firstName = %s AND lastName = %s ";
693 - $userRes = $wpdb->get_results($wpdb->prepare($sql, trim($user[0]), trim($user[1])));
694 - if(count($userRes) > 0) {
695 - $newUserId = $userRes[0]->id;
696 - } else {
697 - // Insert them and then we can associate them...
698 - $wpdb->insert(ATTENDEES_TABLE, array("firstName" => trim($user[0]), "lastName" => trim($user[1])), array('%s', '%s'));
699 - $newUserId = $wpdb->insert_id;
700 - $count++;
701 - }
702 -
703 - $wpdb->insert(ASSOCIATED_ATTENDEES_TABLE, array("attendeeID" => $newUserId,
704 - "associatedAttendeeID" => $userId),
705 - array("%d", "%d"));
706 -
707 - $wpdb->insert(ASSOCIATED_ATTENDEES_TABLE, array("attendeeID" => $userId,
708 - "associatedAttendeeID" => $newUserId),
709 - array("%d", "%d"));
710 - }
711 - }
712 - }
713 - }
714 - }
715 - }
716 - }
717 - ?>
718 - <p><strong><?php echo $count; ?></strong> total records were imported.</p>
719 - <p>Continue to the RSVP <a href="admin.php?page=rsvp-top-level">list</a></p>
720 - <?php
721 370 }
722 - } else {
723 - ?>
724 - <form name="rsvp_import" method="post" enctype="multipart/form-data">
725 - <?php wp_nonce_field('rsvp-import'); ?>
726 - <p>Select an excel file (only xls please, xlsx is not supported....yet) in the following format:<br />
727 - <strong>First Name</strong> | <strong>Last Name</strong> | <strong>Associated Attendees*</strong> | <strong>Custom Message</strong> | <strong>Passcode</strong>
728 - </p>
729 - <p>
730 - * associated attendees should be separated by a comma it is assumed that the first space encountered will separate the first and last name.
731 - </p>
732 - <p>A header row is not expected.</p>
733 - <p><input type="file" name="importFile" id="importFile" /></p>
734 - <p><input type="submit" value="Import File" name="goRsvp" /></p>
735 - </form>
736 - <?php
737 371 }
738 - }
739 -
740 - function rsvp_admin_guest() {
741 - global $wpdb;
742 - if((count($_POST) > 0) && !empty($_POST['firstName']) && !empty($_POST['lastName'])) {
743 - check_admin_referer('rsvp_add_guest');
744 - $passcode = (isset($_POST['passcode'])) ? $_POST['passcode'] : "";
745 -
746 - if(isset($_SESSION[EDIT_SESSION_KEY]) && is_numeric($_SESSION[EDIT_SESSION_KEY])) {
747 - $wpdb->update(ATTENDEES_TABLE,
748 - array("firstName" => trim($_POST['firstName']),
749 - "lastName" => trim($_POST['lastName']),
750 - "personalGreeting" => trim($_POST['personalGreeting']),
751 - "rsvpStatus" => trim($_POST['rsvpStatus'])),
752 - array("id" => $_SESSION[EDIT_SESSION_KEY]),
753 - array("%s", "%s", "%s", "%s"),
754 - array("%d"));
755 - rsvp_printQueryDebugInfo();
756 - $attendeeId = $_SESSION[EDIT_SESSION_KEY];
757 - $wpdb->query($wpdb->prepare("DELETE FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE attendeeId = %d", $attendeeId));
758 - } else {
759 - $wpdb->insert(ATTENDEES_TABLE, array("firstName" => trim($_POST['firstName']),
760 - "lastName" => trim($_POST['lastName']),
761 - "personalGreeting" => trim($_POST['personalGreeting']),
762 - "rsvpStatus" => trim($_POST['rsvpStatus'])),
763 - array('%s', '%s', '%s', '%s'));
764 - rsvp_printQueryDebugInfo();
765 -
766 - $attendeeId = $wpdb->insert_id;
767 - }
768 -
769 - if(isset($_POST['associatedAttendees']) && is_array($_POST['associatedAttendees'])) {
770 - foreach($_POST['associatedAttendees'] as $aid) {
771 - if(is_numeric($aid) && ($aid > 0)) {
772 - $wpdb->insert(ASSOCIATED_ATTENDEES_TABLE, array("attendeeID"=>$attendeeId, "associatedAttendeeID"=>$aid), array("%d", "%d"));
773 - rsvp_printQueryDebugInfo();
774 - }
775 - }
776 - }
777 -
778 - if(rsvp_require_passcode()) {
779 - if(empty($passcode)) {
780 - $passcode = rsvp_generate_passcode();
781 - }
782 - $wpdb->update(ATTENDEES_TABLE,
783 - array("passcode" => trim($passcode)),
784 - array("id"=>$attendeeId),
785 - array("%s"),
786 - array("%d"));
787 - }
372 +
373 + $sql = 'SELECT id, questionType, friendlyName FROM ' . QUESTION_TYPE_TABLE;
374 + $questionTypes = $wpdb->get_results( $sql );
788 375 ?>
789 - <p>Attendee <?php echo htmlspecialchars(stripslashes($_POST['firstName']." ".$_POST['lastName']));?> has been successfully saved</p>
790 - <p>
791 - <a href="<?php echo get_option('siteurl'); ?>/wp-admin/admin.php?page=rsvp-top-level">Continue to Attendee List</a> |
792 - <a href="<?php echo get_option('siteurl'); ?>/wp-admin/admin.php?page=rsvp-admin-guest">Add a Guest</a>
793 - </p>
794 - <?php
795 - } else {
796 - $attendee = null;
797 - unset($_SESSION[EDIT_SESSION_KEY]);
798 - $associatedAttendees = array();
799 - $firstName = "";
800 - $lastName = "";
801 - $personalGreeting = "";
802 - $rsvpStatus = "NoResponse";
803 - $passcode = "";
804 -
805 - if(isset($_GET['id']) && is_numeric($_GET['id'])) {
806 - $attendee = $wpdb->get_row("SELECT id, firstName, lastName, personalGreeting, rsvpStatus, passcode FROM ".ATTENDEES_TABLE." WHERE id = ".$_GET['id']);
807 - if($attendee != null) {
808 - $_SESSION[EDIT_SESSION_KEY] = $attendee->id;
809 - $firstName = stripslashes($attendee->firstName);
810 - $lastName = stripslashes($attendee->lastName);
811 - $personalGreeting = stripslashes($attendee->personalGreeting);
812 - $rsvpStatus = $attendee->rsvpStatus;
813 - $passcode = stripslashes($attendee->passcode);
814 -
815 - // Get the associated attendees and add them to an array
816 - $associations = $wpdb->get_results("SELECT associatedAttendeeID FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE attendeeId = ".$attendee->id.
817 - " UNION ".
818 - "SELECT attendeeID FROM ".ASSOCIATED_ATTENDEES_TABLE." WHERE associatedAttendeeID = ".$attendee->id);
819 - foreach($associations as $aId) {
820 - $associatedAttendees[] = $aId->associatedAttendeeID;
821 - }
822 - }
823 - }
824 - ?>
825 - <form name="contact" action="admin.php?page=rsvp-admin-guest" method="post">
826 - <?php wp_nonce_field('rsvp_add_guest'); ?>
827 - <p class="submit">
828 - <input type="submit" class="button-primary" value="<?php _e('Save'); ?>" />
829 - </p>
830 - <table class="form-table">
831 - <tr valign="top">
832 - <th scope="row"><label for="firstName"><?php echo __("First Name", 'rsvp-plugin'); ?>:</label></th>
833 - <td align="left"><input type="text" name="firstName" id="firstName" size="30" value="<?php echo htmlspecialchars($firstName); ?>" /></td>
834 - </tr>
835 - <tr valign="top">
836 - <th scope="row"><label for="lastName"><?php echo __("Last Name", 'rsvp-plugin'); ?>:</label></th>
837 - <td align="left"><input type="text" name="lastName" id="lastName" size="30" value="<?php echo htmlspecialchars($lastName); ?>" /></td>
838 - </tr>
839 - <?php
840 - if(rsvp_require_passcode()) {
841 - ?>
842 - <tr valign="top">
843 - <th scope="row"><label for="passcode">Passcode:</label></th>
844 - <td align="left"><input type="text" name="passcode" id="passcode" size="30" value="<?php echo htmlspecialchars($passcode); ?>" maxlength="6" /></td>
845 - </tr>
846 - <?php
847 - }
848 - ?>
849 - <tr>
850 - <th scope="row"><label for="rsvpStatus">RSVP Status</label></th>
851 - <td align="left">
852 - <select name="rsvpStatus" id="rsvpStatus" size="1">
853 - <option value="NoResponse" <?php
854 - echo (($rsvpStatus == "NoResponse") ? " selected=\"selected\"" : "");
855 - ?>>No Response</option>
856 - <option value="Yes" <?php
857 - echo (($rsvpStatus == "Yes") ? " selected=\"selected\"" : "");
858 - ?>>Yes</option>
859 - <option value="No" <?php
860 - echo (($rsvpStatus == "No") ? " selected=\"selected\"" : "");
861 - ?>>No</option>
862 - </select>
863 - </td>
864 - </tr>
865 - <tr valign="top">
866 - <th scope="row" valign="top"><label for="personalGreeting">Custom Message:</label></th>
867 - <td align="left"><textarea name="personalGreeting" id="personalGreeting" rows="5" cols="40"><?php echo htmlspecialchars($personalGreeting); ?></textarea></td>
868 - </tr>
869 - <tr valign="top">
870 - <th scope="row">Associated Attendees:</th>
871 - <td align="left">
872 - <select name="associatedAttendees[]" multiple="multiple" size="5" style="height: 200px;">
873 - <?php
874 - $attendees = $wpdb->get_results("SELECT id, firstName, lastName FROM ".$wpdb->prefix."attendees ORDER BY lastName, firstName");
875 - foreach($attendees as $a) {
876 - if($a->id != $_SESSION[EDIT_SESSION_KEY]) {
877 - ?>
878 - <option value="<?php echo $a->id; ?>"
879 - <?php echo ((in_array($a->id, $associatedAttendees)) ? "selected=\"selected\"" : ""); ?>><?php echo htmlspecialchars(stripslashes($a->firstName)." ".stripslashes($a->lastName)); ?></option>
880 - <?php
881 - }
882 - }
883 - ?>
884 - </select>
885 - </td>
886 - </tr>
376 + <script type="text/javascript">
377 + var questionTypeId = [
887 378 <?php
888 - if(($attendee != null) && ($attendee->id > 0)) {
889 - $sql = "SELECT question, answer FROM ".ATTENDEE_ANSWERS." ans
890 - INNER JOIN ".QUESTIONS_TABLE." q ON q.id = ans.questionID
891 - WHERE attendeeID = %d
892 - ORDER BY q.sortOrder";
893 - $aRs = $wpdb->get_results($wpdb->prepare($sql, $attendee->id));
894 - if(count($aRs) > 0) {
895 - ?>
896 - <tr>
897 - <td colspan="2">
898 - <h4>Custom Questions Answered</h4>
899 - <table cellpadding="2" cellspacing="0" border="0">
900 - <tr>
901 - <th>Question</th>
902 - <th>Answer</th>
903 - </tr>
904 - <?php
905 - foreach($aRs as $a) {
906 - ?>
907 - <tr>
908 - <td><?php echo stripslashes($a->question); ?></td>
909 - <td><?php echo stripslashes($a->answer); ?></td>
910 - </tr>
911 - <?php
912 - }
913 - ?>
914 - </table>
915 - </td>
916 - </tr>
917 - <?php
918 - }
379 + foreach ( $answerQuestionTypes as $aqt ) {
380 + echo '"' . esc_attr( $aqt ) . '",';
919 381 }
920 382 ?>
921 - </table>
922 - <p class="submit">
923 - <input type="submit" class="button-primary" value="<?php _e('Save'); ?>" />
924 - </p>
925 - </form>
926 -<?php
927 - }
928 - }
929 -
930 - function rsvp_admin_questions() {
931 - global $wpdb;
932 -
933 - if((count($_POST) > 0) && ($_POST['rsvp-bulk-action'] == "delete") && (is_array($_POST['q']) && (count($_POST['q']) > 0))) {
934 - foreach($_POST['q'] as $q) {
935 - if(is_numeric($q) && ($q > 0)) {
936 - $wpdb->query($wpdb->prepare("DELETE FROM ".QUESTIONS_TABLE." WHERE id = %d", $q));
937 - $wpdb->query($wpdb->prepare("DELETE FROM ".ATTENDEE_ANSWERS." WHERE questionID = %d", $q));
383 + ];
384 +
385 + function addAnswer( counterElement ) {
386 + var currAnswer = jQuery( "#numNewAnswers" ).val();
387 + if ( isNaN( currAnswer ) ) {
388 + currAnswer = 0;
938 389 }
390 +
391 + var s = "<tr>\r\n" +
392 + "<td align=\"right\" width=\"75\"><label for=\"newAnswer" + currAnswer + "\"><?php echo esc_html__( 'Answer', 'rsvp' ); ?>:</label></td>\r\n" +
393 + "<td><input type=\"text\" name=\"newAnswer" + currAnswer + "\" id=\"newAnswer" + currAnswer + "\" size=\"40\" /></td>\r\n" +
394 + "</tr>\r\n";
395 + jQuery( "#answerContainer" ).append( s );
396 + currAnswer++;
397 + jQuery( "#numNewAnswers" ).val( currAnswer );
398 + return false;
939 399 }
940 - } else if((count($_POST) > 0) && ($_POST['rsvp-bulk-action'] == "saveSortOrder")) {
941 - $sql = "SELECT id FROM ".QUESTIONS_TABLE;
942 - $sortQs = $wpdb->get_results($sql);
943 - foreach($sortQs as $q) {
944 - if(is_numeric($_POST['sortOrder'.$q->id]) && ($_POST['sortOrder'.$q->id] >= 0)) {
945 - $wpdb->update(QUESTIONS_TABLE,
946 - array("sortOrder" => $_POST['sortOrder'.$q->id]),
947 - array("id" => $q->id),
948 - array("%d"),
949 - array("%d"));
950 - rsvp_printQueryDebugInfo();
400 +
401 + jQuery( document ).ready( function () {
402 +
403 + <?php
404 + if ( $isNew || ! in_array( $questionTypeId, $answerQuestionTypes ) ) {
405 + echo 'jQuery("#answerContainer").hide();';
951 406 }
952 - }
953 - }
954 -
955 - $sql = "SELECT id, question, sortOrder FROM ".QUESTIONS_TABLE." ORDER BY sortOrder ASC";
956 - $customQs = $wpdb->get_results($sql);
957 - ?>
958 - <script type="text/javascript" language="javascript">
959 - jQuery(document).ready(function() {
960 - jQuery("#cb").click(function() {
961 - if(jQuery("#cb").attr("checked")) {
962 - jQuery("input[name='q[]']").attr("checked", "checked");
407 +
408 + if ( $isNew || ( $permissionLevel == 'public' ) ) {
409 + ?>
410 + jQuery( "#attendeesArea" ).hide();
411 + <?php
412 + }
413 + ?>
414 + jQuery( "#questionType" ).change( function () {
415 + var selectedValue = jQuery( "#questionType" ).val();
416 + if ( questionTypeId.indexOf( selectedValue ) != -1 ) {
417 + jQuery( "#answerContainer" ).show();
963 418 } else {
964 - jQuery("input[name='q[]']").removeAttr("checked");
419 + jQuery( "#answerContainer" ).hide();
965 420 }
966 - });
967 -
968 - jQuery("#customQuestions").tableDnD({
969 - onDrop: function(table, row) {
970 - var rows = table.tBodies[0].rows;
971 - for (var i=0; i<rows.length; i++) {
972 - jQuery("#sortOrder" + rows[i].id).val(i);
973 - }
974 -
421 + } )
422 +
423 + jQuery( "#permissionLevel" ).change( function () {
424 + if ( jQuery( "#permissionLevel" ).val() != "public" ) {
425 + jQuery( "#attendeesArea" ).show();
426 + } else {
427 + jQuery( "#attendeesArea" ).hide();
975 428 }
976 - });
977 - });
429 + } )
430 + } );
978 431 </script>
979 - <div class="wrap">
980 - <div id="icon-edit" class="icon32"><br /></div>
981 - <h2>List of current custom questions</h2>
982 - <form method="post" id="rsvp-form" enctype="multipart/form-data">
983 - <input type="hidden" id="rsvp-bulk-action" name="rsvp-bulk-action" />
984 - <div class="tablenav">
985 - <div class="alignleft actions">
986 - <select id="rsvp-action-top" name="action">
987 - <option value="" selected="selected"><?php _e('Bulk Actions', 'rsvp'); ?></option>
988 - <option value="delete"><?php _e('Delete', 'rsvp'); ?></option>
432 + <form name="contact" action="<?php echo esc_url( add_query_arg( 'action', 'add' ) ); ?>" method="post">
433 + <input type="hidden" name="numNewAnswers" id="numNewAnswers" value="0"/>
434 + <input type="hidden" name="questionId" value="<?php echo absint( $questionId ); ?>"/>
435 + <?php wp_nonce_field( 'rsvp_add_custom_question' ); ?>
436 + <p class="submit">
437 + <a href="<?php echo esc_url( admin_url( 'admin.php?page=rsvp-admin-questions' ) ); ?>"
438 + class="button button-secondary"><?php esc_html_e( 'Back to custom question list', 'rsvp' ); ?></a>
439 + <input type="submit" class="button-primary" value="<?php esc_attr_e( 'Save', 'rsvp' ); ?>"/>
440 + </p>
441 + <table id="customQuestions" class="form-table">
442 + <tr valign="top">
443 + <th scope="row"><label for="questionType"><?php echo esc_html__( 'Question Type', 'rsvp' ); ?>
444 + :</label></th>
445 + <td align="left"><select name="questionTypeID" id="questionType" size="1">
446 + <?php
447 + foreach ( $questionTypes as $qt ) {
448 + echo '<option value="' . esc_attr( $qt->id ) . '" ' . ( ( $questionTypeId == $qt->id ) ? ' selected="selected"' : '' ) . '>' . esc_html( $qt->friendlyName ) . "</option>\r\n";
449 + }
450 + ?>
989 451 </select>
990 - <input type="submit" value="<?php _e('Apply', 'rsvp'); ?>" name="doaction" id="doaction" class="button-secondary action" onclick="document.getElementById('rsvp-bulk-action').value = document.getElementById('rsvp-action-top').value;" />
991 - <input type="submit" value="<?php _e('Save Sort Order', 'rsvp'); ?>" name="saveSortButton" id="saveSortButton" class="button-secondary action" onclick="document.getElementById('rsvp-bulk-action').value = 'saveSortOrder';" />
992 - </div>
993 - <div class="clear"></div>
994 - </div>
995 - <table class="widefat post fixed" cellspacing="0">
996 - <thead>
452 + </td>
453 + </tr>
454 + <tr valign="top">
455 + <th scope="row"><label for="question"><?php echo esc_html__( 'Question', 'rsvp' ); ?>:</label></th>
456 + <td align="left"><input type="text" name="question" id="question" size="40"
457 + value="<?php echo esc_attr( $question ); ?>"/></td>
458 + </tr>
459 + <tr>
460 + <th scope="row"><label
461 + for="permissionLevel"><?php echo esc_html__( 'Question Permission Level', 'rsvp' ); ?>
462 + :</label></th>
463 + <td align="left"><select name="permissionLevel" id="permissionLevel" size="1">
464 + <option value="public" <?php echo ( $permissionLevel == 'public' ) ? ' selected="selected"' : ''; ?>><?php echo esc_html__( 'Everyone', 'rsvp' ); ?></option>
465 + <option value="private" <?php echo ( $permissionLevel == 'private' ) ? ' selected="selected"' : ''; ?>><?php echo esc_html__( 'Select People', 'rsvp' ); ?></option>
466 + </select></td>
467 + </tr>
468 + <?php if ( ! $isNew && ( $permissionLevel == 'private' ) ) : ?>
997 469 <tr>
998 - <th scope="col" class="manage-column column-cb check-column" style=""><input type="checkbox" id="cb" /></th>
999 - <th scope="col" id="questionCol" class="manage-column column-title" style="">Question</th>
470 + <th scope="row"><?php echo esc_html__( 'Private Import Key', 'rsvp' ); ?>:</th>
471 + <td align="left">pq_<?php echo esc_html( $questionId ); ?></td>
1000 472 </tr>
1001 - </thead>
1002 - </table>
1003 - <div style="overflow: auto;height: 450px;">
1004 - <table class="widefat post fixed" cellspacing="0" id="customQuestions">
1005 - <?php
1006 - $i = 0;
1007 - foreach($customQs as $q) {
1008 - ?>
1009 - <tr class="<?php echo (($i % 2 == 0) ? "alternate" : ""); ?> author-self" id="<?php echo $q->id; ?>">
1010 - <th scope="row" class="check-column"><input type="checkbox" name="q[]" value="<?php echo $q->id; ?>" /></th>
1011 - <td>
1012 - <a href="<?php echo get_option("siteurl"); ?>/wp-admin/admin.php?page=rsvp-admin-custom-question&amp;id=<?php echo $q->id; ?>"><?php echo htmlspecialchars(stripslashes($q->question)); ?></a>
1013 - <input type="hidden" name="sortOrder<?php echo $q->id; ?>" id="sortOrder<?php echo $q->id; ?>" value="<?php echo $q->sortOrder; ?>" />
1014 - </td>
1015 - </tr>
1016 - <?php
1017 - $i++;
1018 - }
1019 - ?>
1020 - </table>
1021 - </div>
1022 - </form>
1023 - </div>
1024 - <?php
1025 - }
1026 -
1027 - function rsvp_admin_custom_question() {
1028 - global $wpdb;
1029 - $answerQuestionTypes = array(2,4,5);
1030 -
1031 - $radioQuestionType = $wpdb->get_results("SELECT id FROM ".QUESTION_TYPE_TABLE." WHERE questionType = 'radio'");
1032 - if($radioQuestionType == 0) {
1033 - $wpdb->insert(QUESTION_TYPE_TABLE, array("questionType" => "radio", "friendlyName" => "Radio"), array('%s', '%s'));
1034 - rsvp_printQueryDebugInfo();
1035 - }
1036 -
1037 - if((count($_POST) > 0) && !empty($_POST['question']) && is_numeric($_POST['questionTypeID'])) {
1038 - check_admin_referer('rsvp_add_custom_question');
1039 - if(isset($_SESSION[EDIT_QUESTION_KEY]) && is_numeric($_SESSION[EDIT_QUESTION_KEY])) {
1040 - $wpdb->update(QUESTIONS_TABLE,
1041 - array("question" => trim($_POST['question']),
1042 - "questionTypeID" => trim($_POST['questionTypeID']),
1043 - "permissionLevel" => ((trim($_POST['permissionLevel']) == "private") ? "private" : "public")),
1044 - array("id" => $_SESSION[EDIT_QUESTION_KEY]),
1045 - array("%s", "%d", "%s"),
1046 - array("%d"));
1047 - rsvp_printQueryDebugInfo();
1048 - $questionId = $_SESSION[EDIT_QUESTION_KEY];
1049 -
1050 - $answers = $wpdb->get_results($wpdb->prepare("SELECT id FROM ".QUESTION_ANSWERS_TABLE." WHERE questionID = %d", $questionId));
1051 - if(count($answers) > 0) {
1052 - foreach($answers as $a) {
1053 - if(isset($_POST['deleteAnswer'.$a->id]) && (strToUpper($_POST['deleteAnswer'.$a->id]) == "Y")) {
1054 - $wpdb->query($wpdb->prepare("DELETE FROM ".QUESTION_ANSWERS_TABLE." WHERE id = %d", $a->id));
1055 - } elseif(isset($_POST['answer'.$a->id]) && !empty($_POST['answer'.$a->id])) {
1056 - $wpdb->update(QUESTION_ANSWERS_TABLE,
1057 - array("answer" => trim($_POST['answer'.$a->id])),
1058 - array("id"=>$a->id),
1059 - array("%s"),
1060 - array("%d"));
1061 - rsvp_printQueryDebugInfo();
1062 - }
1063 - }
1064 - }
1065 - } else {
1066 - $wpdb->insert(QUESTIONS_TABLE, array("question" => trim($_POST['question']),
1067 - "questionTypeID" => trim($_POST['questionTypeID']),
1068 - "permissionLevel" => ((trim($_POST['permissionLevel']) == "private") ? "private" : "public")),
1069 - array('%s', '%d', '%s'));
1070 - rsvp_printQueryDebugInfo();
1071 - $questionId = $wpdb->insert_id;
1072 - }
1073 -
1074 - if(isset($_POST['numNewAnswers']) && is_numeric($_POST['numNewAnswers']) &&
1075 - in_array($_POST['questionTypeID'], $answerQuestionTypes)) {
1076 - for($i = 0; $i < $_POST['numNewAnswers']; $i++) {
1077 - if(isset($_POST['newAnswer'.$i]) && !empty($_POST['newAnswer'.$i])) {
1078 - $wpdb->insert(QUESTION_ANSWERS_TABLE, array("questionID"=>$questionId, "answer"=>$_POST['newAnswer'.$i]));
1079 - rsvp_printQueryDebugInfo();
1080 - }
1081 - }
1082 - }
1083 -
1084 - if(strToLower(trim($_POST['permissionLevel'])) == "private") {
1085 - $wpdb->query($wpdb->prepare("DELETE FROM ".QUESTION_ATTENDEES_TABLE." WHERE questionID = %d", $questionId));
1086 - if(isset($_POST['attendees']) && is_array($_POST['attendees'])) {
1087 - foreach($_POST['attendees'] as $aid) {
1088 - if(is_numeric($aid) && ($aid > 0)) {
1089 - $wpdb->insert(QUESTION_ATTENDEES_TABLE, array("attendeeID"=>$aid, "questionID"=>$questionId), array("%d", "%d"));
1090 - rsvp_printQueryDebugInfo();
1091 - }
1092 - }
1093 - }
1094 - }
1095 - ?>
1096 - <p>Custom Question saved</p>
1097 - <p>
1098 - <a href="<?php echo get_option('siteurl'); ?>/wp-admin/admin.php?page=rsvp-admin-questions">Continue to Question List</a> |
1099 - <a href="<?php echo get_option('siteurl'); ?>/wp-admin/admin.php?page=rsvp-admin-custom-question">Add another Question</a>
1100 - </p>
1101 - <?php
1102 - } else {
1103 - $questionTypeId = 0;
1104 - $question = "";
1105 - $isNew = true;
1106 - $questionId = 0;
1107 - $permissionLevel = "public";
1108 - $savedAttendees = array();
1109 - unset($_SESSION[EDIT_QUESTION_KEY]);
1110 - if(isset($_GET['id']) && is_numeric($_GET['id'])) {
1111 - $qRs = $wpdb->get_results($wpdb->prepare("SELECT id, question, questionTypeID, permissionLevel FROM ".QUESTIONS_TABLE." WHERE id = %d", $_GET['id']));
1112 - if(count($qRs) > 0) {
1113 - $isNew = false;
1114 - $_SESSION[EDIT_QUESTION_KEY] = $qRs[0]->id;
1115 - $questionId = $qRs[0]->id;
1116 - $question = stripslashes($qRs[0]->question);
1117 - $permissionLevel = stripslashes($qRs[0]->permissionLevel);
1118 - $questionTypeId = $qRs[0]->questionTypeID;
1119 -
1120 - if($permissionLevel == "private") {
1121 - $aRs = $wpdb->get_results($wpdb->prepare("SELECT attendeeID FROM ".QUESTION_ATTENDEES_TABLE." WHERE questionID = %d", $questionId));
1122 - if(count($aRs) > 0) {
1123 - foreach($aRs as $a) {
1124 - $savedAttendees[] = $a->attendeeID;
1125 - }
1126 - }
1127 - }
1128 - }
1129 - }
1130 -
1131 - $sql = "SELECT id, questionType, friendlyName FROM ".QUESTION_TYPE_TABLE;
1132 - $questionTypes = $wpdb->get_results($sql);
1133 - ?>
1134 - <script type="text/javascript">
1135 - function addAnswer(counterElement) {
1136 - var currAnswer = jQuery("#numNewAnswers").val();
1137 - if(isNaN(currAnswer)) {
1138 - currAnswer = 0;
1139 - }
1140 -
1141 - var s = "<tr>\r\n"+
1142 - "<td align=\"right\" width=\"75\"><label for=\"newAnswer" + currAnswer + "\">Answer:</label></td>\r\n" +
1143 - "<td><input type=\"text\" name=\"newAnswer" + currAnswer + "\" id=\"newAnswer" + currAnswer + "\" size=\"40\" /></td>\r\n" +
1144 - "</tr>\r\n";
1145 - jQuery("#answerContainer").append(s);
1146 - currAnswer++;
1147 - jQuery("#numNewAnswers").val(currAnswer);
1148 - return false;
1149 - }
1150 -
1151 - jQuery(document).ready(function() {
1152 -
1153 - <?php
1154 - if($isNew || !in_array($questionTypeId, $answerQuestionTypes)) {
1155 - echo 'jQuery("#answerContainer").hide();';
1156 - }
1157 -
1158 - if($isNew || ($permissionLevel == "public")) {
1159 - ?>
1160 - jQuery("#attendeesArea").hide();
1161 - <?php
1162 - }
1163 - ?>
1164 - jQuery("#questionType").change(function() {
1165 - var selectedValue = jQuery("#questionType").val();
1166 - if((selectedValue == 2) || (selectedValue == 4) || (selectedValue == 5)) {
1167 - jQuery("#answerContainer").show();
1168 - } else {
1169 - jQuery("#answerContainer").hide();
1170 - }
1171 - })
1172 -
1173 - jQuery("#permissionLevel").change(function() {
1174 - if(jQuery("#permissionLevel").val() != "public") {
1175 - jQuery("#attendeesArea").show();
1176 - } else {
1177 - jQuery("#attendeesArea").hide();
1178 - }
1179 - })
1180 - });
1181 - </script>
1182 - <form name="contact" action="admin.php?page=rsvp-admin-custom-question" method="post">
1183 - <input type="hidden" name="numNewAnswers" id="numNewAnswers" value="0" />
1184 - <?php wp_nonce_field('rsvp_add_custom_question'); ?>
1185 - <p class="submit">
1186 - <input type="submit" class="button-primary" value="<?php _e('Save'); ?>" />
1187 - </p>
1188 - <table id="customQuestions" class="form-table">
1189 - <tr valign="top">
1190 - <th scope="row"><label for="questionType">Question Type:</label></th>
1191 - <td align="left"><select name="questionTypeID" id="questionType" size="1">
1192 - <?php
1193 - foreach($questionTypes as $qt) {
1194 - echo "<option value=\"".$qt->id."\" ".(($questionTypeId == $qt->id) ? " selected=\"selected\"" : "").">".$qt->friendlyName."</option>\r\n";
1195 - }
1196 - ?>
1197 - </select>
1198 - </td>
1199 - </tr>
1200 - <tr valign="top">
1201 - <th scope="row"><label for="question">Question:</label></th>
1202 - <td align="left"><input type="text" name="question" id="question" size="40" value="<?php echo htmlspecialchars($question); ?>" /></td>
1203 - </tr>
1204 - <tr>
1205 - <th scope="row"><label for="permissionLevel">Question Permission Level:</label></th>
1206 - <td align="left"><select name="permissionLevel" id="permissionLevel" size="1">
1207 - <option value="public" <?php echo ($permissionLevel == "public") ? " selected=\"selected\"" : ""; ?>>Public</option>
1208 - <option value="private" <?php echo ($permissionLevel == "private") ? " selected=\"selected\"" : ""; ?>>Private</option>
1209 - </select></td>
1210 - </tr>
1211 - <tr>
1212 - <td colspan="2">
1213 - <table cellpadding="0" cellspacing="0" border="0" id="answerContainer">
1214 - <tr>
1215 - <th>Answers</th>
1216 - <th align="right"><a href="#" onclick="return addAnswer();">Add new Answer</a></th>
1217 - </tr>
1218 - <?php
1219 - if(!$isNew) {
1220 - $aRs = $wpdb->get_results($wpdb->prepare("SELECT id, answer FROM ".QUESTION_ANSWERS_TABLE." WHERE questionID = %d", $questionId));
1221 - if(count($aRs) > 0) {
1222 - foreach($aRs as $answer) {
473 + <?php endif; ?>
474 + <tr>
475 + <td colspan="2">
476 + <table cellpadding="0" cellspacing="0" border="0" id="answerContainer">
477 + <tr>
478 + <th><?php echo esc_html__( 'Answers', 'rsvp' ); ?></th>
479 + <th align="right"><a href="#"
480 + onclick="return addAnswer();"><?php echo esc_html__( 'Add new Answer', 'rsvp' ); ?></a>
481 + </th>
482 + </tr>
483 + <?php
484 + if ( ! $isNew ) {
485 + $aRs = $wpdb->get_results( $wpdb->prepare( 'SELECT id, answer FROM ' . QUESTION_ANSWERS_TABLE . ' WHERE questionID = %d', absint( $questionId ) ) );
486 + if ( count( $aRs ) > 0 ) {
487 + foreach ( $aRs as $answer ) {
1223 488 ?>
1224 - <tr>
1225 - <td width="75" align="right"><label for="answer<?php echo $answer->id; ?>">Answer:</label></td>
1226 - <td><input type="text" name="answer<?php echo $answer->id; ?>" id="answer<?php echo $answer->id; ?>" size="40" value="<?php echo htmlspecialchars(stripslashes($answer->answer)); ?>" />
1227 - &nbsp; <input type="checkbox" name="deleteAnswer<?php echo $answer->id; ?>" id="deleteAnswer<?php echo $answer->id; ?>" value="Y" /><label for="deleteAnswer<?php echo $answer->id; ?>">Delete</label></td>
1228 - </tr>
489 + <tr>
490 + <td width="75" align="right"><label
491 + for="answer<?php echo esc_attr( $answer->id ); ?>"><?php echo esc_html__( 'Answer', 'rsvp' ); ?>
492 + :</label></td>
493 + <td><input type="text" name="answer<?php echo esc_attr( $answer->id ); ?>"
494 + id="answer<?php echo esc_attr( $answer->id ); ?>" size="40"
495 + value="<?php echo esc_attr( stripslashes( $answer->answer ) ); ?>"/>
496 + &nbsp; <input type="checkbox"
497 + name="deleteAnswer<?php echo esc_attr( $answer->id ); ?>"
498 + id="deleteAnswer<?php echo esc_attr( $answer->id ); ?>"
499 + value="Y"/><label
500 + for="deleteAnswer<?php echo esc_attr( $answer->id ); ?>"><?php echo esc_html__( 'Delete', 'rsvp' ); ?></label>
501 + </td>
502 + </tr>
1229 503 <?php
1230 - }
1231 - }
1232 504 }
1233 - ?>
1234 - </table>
1235 - </td>
1236 - </tr>
1237 - <tr id="attendeesArea">
1238 - <th scope="row"><label for="attendees">Attendees allowed to answer this question:</label></th>
1239 - <td>
1240 - <select name="attendees[]" id="attendees" style="height:75px;" multiple="multiple">
1241 - <?php
1242 - $attendees = $wpdb->get_results("SELECT id, firstName, lastName FROM ".$wpdb->prefix."attendees ORDER BY lastName, firstName");
1243 - foreach($attendees as $a) {
505 + }
506 + }
507 + ?>
508 + </table>
509 + </td>
510 + </tr>
511 + <tr id="attendeesArea">
512 + <th scope="row"><label
513 + for="attendees"><?php echo esc_html__( 'Attendees allowed to answer this question', 'rsvp' ); ?>
514 + :</label></th>
515 + <td>
516 + <p>
517 + <span style="margin-left: 30px;"><?php esc_html_e( 'Available people', 'rsvp' ); ?></span>
518 + <span style="margin-left: 65px;"><?php esc_html_e( 'People that have access', 'rsvp' ); ?></span>
519 + </p>
520 + <select name="attendees[]" id="attendeesQuestionSelect" style="height:75px;"
521 + multiple="multiple">
522 + <?php
523 + $attendees = $rsvp_helper->get_attendees();
524 + foreach ( $attendees as $a ) {
1244 525 ?>
1245 - <option value="<?php echo $a->id; ?>"
1246 - <?php echo ((in_array($a->id, $savedAttendees)) ? " selected=\"selected\"" : ""); ?>><?php echo htmlspecialchars(stripslashes($a->firstName)." ".stripslashes($a->lastName)); ?></option>
526 + <option value="<?php echo esc_attr( $a->id ); ?>"
527 + <?php echo( ( in_array( $a->id, $savedAttendees ) ) ? ' selected="selected"' : '' ); ?>><?php echo esc_html( stripslashes( $a->firstName ) . ' ' . stripslashes( $a->lastName ) ); ?></option>
1247 528 <?php
1248 - }
1249 - ?>
1250 - </select>
1251 - </td>
1252 - </tr>
1253 - </table>
1254 - </form>
529 + }
530 + ?>
531 + </select>
532 + </td>
533 + </tr>
534 + </table>
535 + </form>
1255 536 <?php
537 + }
538 +}
539 +
540 +function rsvp_admin_scripts() {
541 + wp_enqueue_script( 'jquery' );
542 + wp_enqueue_script( 'jquery-ui-datepicker' );
543 + wp_enqueue_script( 'jquery-ui-sortable' );
544 + wp_enqueue_style( 'jquery-ui' );
545 + wp_register_script( 'jquery_multi_select', plugins_url( 'multi-select/js/jquery.multi-select.js', RSVP_PLUGIN_FILE ) );
546 + wp_enqueue_script( 'jquery_multi_select' );
547 + wp_register_style( 'jquery_multi_select_css', plugins_url( 'multi-select/css/multi-select.css', RSVP_PLUGIN_FILE ) );
548 + wp_enqueue_style( 'jquery_multi_select_css' );
549 +
550 + wp_register_style( 'rsvp_jquery-ui', plugins_url( '/assets/admin/css/jquery-ui.css', RSVP_PLUGIN_FILE ) );
551 + wp_enqueue_style( 'rsvp_jquery-ui' );
552 +
553 + wp_register_script( 'rsvp_admin', plugins_url( 'assets/admin/js/rsvp_plugin_admin.js', RSVP_PLUGIN_FILE ), array( 'jquery-ui-sortable' ), '', true );
554 + wp_enqueue_script( 'rsvp_admin' );
555 +}
556 +
557 +/**
558 + * Function for loading the needed assets for the plugin.
559 + */
560 +function rsvp_init() {
561 + $result = load_plugin_textdomain( 'rsvp', false, basename( dirname( __FILE__ ) ) . '/languages/' );
562 +}
563 +
564 +/**
565 + * Handles converting text encodings for characters like umlauts that might be stored in different encodings
566 + *
567 + * @param string $text The text we wish to handle the encoding against
568 + *
569 + * @return string The converted text
570 + */
571 +function rsvp_handle_text_encoding( $text ) {
572 + if ( function_exists( 'mb_convert_encoding' ) && function_exists( 'mb_detect_encoding' ) ) {
573 + return mb_convert_encoding( $text, 'UTF-8', mb_detect_encoding( $text, 'UTF-8, ISO-8859-1', true ) );
574 + }
575 +
576 + return $text;
577 +}
578 +
579 +function rsvp_free_is_addslashes_enabled() {
580 + return get_magic_quotes_gpc();
581 +}
582 +
583 +function rsvp_getCurrentPageURL() {
584 + global $wp;
585 + global $wp_rewrite;
586 +
587 + $pageURL = home_url( $wp->request );
588 + $pageURL = trailingslashit( $pageURL );
589 +
590 + if ( $wp_rewrite->using_index_permalinks() && ( strpos( $pageURL, 'index.php' ) === false ) ) {
591 + $parts = parse_url( $pageURL );
592 +
593 + $pageURL = $parts['scheme'] . '://' . $parts['host'];
594 +
595 + if ( isset( $parts['port'] ) ) {
596 + $pageURL .= ':' . $parts['port'];
1256 597 }
598 +
599 + $pageURL .= '/index.php' . $parts['path'];
600 +
601 + if ( isset( $parts['query'] ) && ( $parts['query'] != '' ) ) {
602 + $pageURL .= '?' . $parts['query'];
603 + }
604 + } elseif ( empty( $wp_rewrite->permalink_structure ) ) {
605 + $pageURL = get_permalink();
1257 606 }
1258 -
1259 - function rsvp_modify_menu() {
1260 -
1261 - add_options_page('RSVP Options', //page title
1262 - 'RSVP Options', //subpage title
1263 - 'manage_options', //access
1264 - 'rsvp-options', //current file
1265 - 'rsvp_admin_guestlist_options' //options function above
1266 - );
1267 - $page = add_menu_page("RSVP Plugin",
1268 - "RSVP Plugin",
1269 - "publish_posts",
1270 - "rsvp-top-level",
1271 - "rsvp_admin_guestlist");
1272 - add_action('admin_print_scripts-' . $page, 'rsvp_admin_scripts');
1273 - $page = add_submenu_page("rsvp-top-level",
1274 - "Add Guest",
1275 - "Add Guest",
1276 - "publish_posts",
1277 - "rsvp-admin-guest",
1278 - "rsvp_admin_guest");
1279 - add_action('admin_print_scripts-' . $page, 'rsvp_admin_scripts');
1280 - add_submenu_page("rsvp-top-level",
1281 - "RSVP Export",
1282 - "RSVP Export",
1283 - "publish_posts",
1284 - "rsvp-admin-export",
1285 - "rsvp_admin_export");
1286 - add_submenu_page("rsvp-top-level",
1287 - "RSVP Import",
1288 - "RSVP Import",
1289 - "publish_posts",
1290 - "rsvp-admin-import",
1291 - "rsvp_admin_import");
1292 - $page = add_submenu_page("rsvp-top-level",
1293 - "Custom Questions",
1294 - "Custom Questions",
1295 - "publish_posts",
1296 - "rsvp-admin-questions",
1297 - "rsvp_admin_questions");
1298 - add_action('admin_print_scripts-' . $page, 'rsvp_admin_scripts');
1299 - $page = add_submenu_page("rsvp-top-level",
1300 - "Add Custom Question",
1301 - "Add Custom Question",
1302 - "publish_posts",
1303 - "rsvp-admin-custom-question",
1304 - "rsvp_admin_custom_question");
1305 -
1306 - add_action('admin_print_scripts-' . $page, 'rsvp_admin_scripts');
607 +
608 + if ( get_option( OPTION_RSVP_DONT_USE_HASH ) != 'Y' ) {
609 + $pageURL .= '#rsvpArea';
1307 610 }
1308 -
1309 - function rsvp_register_settings() {
1310 - register_setting('rsvp-option-group', OPTION_OPENDATE);
1311 - register_setting('rsvp-option-group', OPTION_GREETING);
1312 - register_setting('rsvp-option-group', OPTION_THANKYOU);
1313 - register_setting('rsvp-option-group', OPTION_HIDE_VEGGIE);
1314 - register_setting('rsvp-option-group', OPTION_HIDE_KIDS_MEAL);
1315 - register_setting('rsvp-option-group', OPTION_NOTE_VERBIAGE);
1316 - register_setting('rsvp-option-group', OPTION_VEGGIE_MEAL_VERBIAGE);
1317 - register_setting('rsvp-option-group', OPTION_KIDS_MEAL_VERBIAGE);
1318 - register_setting('rsvp-option-group', OPTION_YES_VERBIAGE);
1319 - register_setting('rsvp-option-group', OPTION_NO_VERBIAGE);
1320 - register_setting('rsvp-option-group', OPTION_DEADLINE);
1321 - register_setting('rsvp-option-group', OPTION_THANKYOU);
1322 - register_setting('rsvp-option-group', OPTION_HIDE_ADD_ADDITIONAL);
1323 - register_setting('rsvp-option-group', OPTION_NOTIFY_EMAIL);
1324 - register_setting('rsvp-option-group', OPTION_NOTIFY_ON_RSVP);
1325 - register_setting('rsvp-option-group', OPTION_DEBUG_RSVP_QUERIES);
1326 - register_setting('rsvp-option-group', OPTION_WELCOME_TEXT);
1327 - register_setting('rsvp-option-group', OPTION_RSVP_QUESTION);
1328 - register_setting('rsvp-option-group', OPTION_RSVP_CUSTOM_YES_NO);
1329 - register_setting('rsvp-option-group', OPTION_RSVP_PASSCODE);
1330 - register_setting('rsvp-option-group', RSVP_OPTION_HIDE_NOTE);
1331 - register_setting('rsvp-option-group', OPTION_RSVP_OPEN_REGISTRATION);
1332 - register_setting('rsvp-option-group', OPTION_RSVP_DONT_USE_HASH);
1333 -
1334 - wp_register_script('jquery_table_sort', plugins_url('jquery.tablednd_0_5.js',__FILE__));
1335 - wp_register_script('jquery_ui', rsvp_getHttpProtocol()."://ajax.microsoft.com/ajax/jquery.ui/1.8.5/jquery-ui.js");
1336 - wp_register_style('jquery_ui_stylesheet', rsvp_getHttpProtocol()."://ajax.microsoft.com/ajax/jquery.ui/1.8.5/themes/redmond/jquery-ui.css");
611 +
612 + return $pageURL;
613 +}
614 +function rsvp_hide_untill_loaded() {
615 +
616 + echo '<style type="text/css">.rsvpArea, .rsvpParagraph, #rsvpPlugin {display:none;} </style>';
617 +}
618 +
619 +function rsvp_add_css() {
620 + $css = get_option( RSVP_OPTION_CSS_STYLING );
621 +
622 + if ( ! empty( $css ) ) {
623 + $output = '<!-- RSVP Free Styling -->';
624 + $output .= '<style id="rsvp_plugin-custm-style" type="text/css">' . $css . '</style>';
625 +
626 + echo wp_kses_post( $output );
1337 627 }
1338 -
1339 - function rsvp_admin_scripts() {
1340 - wp_enqueue_script("jquery_table_sort");
1341 - wp_enqueue_script("jquery_ui");
1342 - wp_enqueue_style( 'jquery_ui_stylesheet');
628 +}
629 +
630 +function rsvp_front_scripts() {
631 + wp_register_script( 'jquery_validate', plugins_url( 'assets/js/jquery.validate.min.js', RSVP_PLUGIN_FILE ), array( 'jquery' ) );
632 + wp_register_script( 'rsvp_plugin', plugins_url( 'assets/js/rsvp_plugin.js', RSVP_PLUGIN_FILE ), array( 'jquery' ) );
633 + wp_localize_script(
634 + 'rsvp_plugin',
635 + 'rsvp_plugin_vars',
636 + array(
637 + 'askEmail' => __( 'Please enter an email address that we can use to contact you about the extra guest. We have to keep a pretty close eye on the number of attendees. Thanks!', 'rsvp' ),
638 + 'customNote' => __( 'If you are adding additional RSVPs please enter your email address in case we have questions', 'rsvp' ),
639 + 'newAttending1LastName' => __( 'Please enter a last name', 'rsvp' ),
640 + 'newAttending1FirstName' => __( 'Please enter a first name', 'rsvp' ),
641 + 'newAttending2LastName' => __( 'Please enter a last name', 'rsvp' ),
642 + 'newAttending2FirstName' => __( 'Please enter a first name', 'rsvp' ),
643 + 'newAttending3LastName' => __( 'Please enter a last name', 'rsvp' ),
644 + 'newAttending3FirstName' => __( 'Please enter a first name', 'rsvp' ),
645 + 'attendeeFirstName' => __( 'Please enter a first name', 'rsvp' ),
646 + 'attendeeLastName' => __( 'Please enter a last name', 'rsvp' ),
647 + 'firstName' => __( 'Please enter your first name', 'rsvp' ),
648 + 'lastName' => __( 'Please enter your last name', 'rsvp' ),
649 + 'passcode' => __( 'Please enter your password', 'rsvp' ),
650 + )
651 + );
652 +
653 + wp_register_style( 'rsvp_css', plugins_url( 'assets/css/rsvp_plugin.css', RSVP_PLUGIN_FILE ) );
654 + wp_enqueue_script( 'jquery' );
655 + wp_enqueue_script( 'jquery_validate' );
656 + wp_enqueue_script( 'rsvp_plugin' );
657 + wp_enqueue_style( 'rsvp_css' );
658 +}
659 +
660 +function rsvp_add_privacy_policy_content() {
661 + if ( ! function_exists( 'wp_add_privacy_policy_content' ) ) {
662 + return;
1343 663 }
1344 -
1345 - function rsvp_init() {
1346 - wp_register_script('jquery_validate', rsvp_getHttpProtocol()."://ajax.aspnetcdn.com/ajax/jquery.validate/1.10.0/jquery.validate.min.js");
1347 - wp_register_script('rsvp_plugin', plugins_url("rsvp_plugin.js", RSVP_PLUGIN_FILE));
1348 - wp_register_style('rsvp_css', plugins_url("rsvp_plugin.css", RSVP_PLUGIN_FILE));
1349 - wp_enqueue_script('jquery');
1350 - wp_enqueue_script('jquery_validate');
1351 - wp_enqueue_script('rsvp_plugin');
1352 - wp_enqueue_style("rsvp_css");
1353 -
1354 -
1355 - load_plugin_textdomain('rsvp-plugin', false, basename( dirname( __FILE__ ) ) . '/languages' );
664 +
665 + $content = __(
666 + 'All information entered either from an attendee or a WordPress admin for the RSVP
667 + plugin is never sent to external sites. The data stays in database tables
668 + on the WordPress instance.',
669 + 'rsvp'
670 + );
671 +
672 + wp_add_privacy_policy_content(
673 + 'RSVP Plugin',
674 + wp_kses_post( wpautop( $content, false ) )
675 + );
676 +}
677 +
678 +/**
679 + * Handles the data erasing for a given email address.
680 + *
681 + * @param string $email_address The email address we want to delete from the attendees table.
682 + * @param integer $page The page we are on.
683 + *
684 + * @return array An array containing how many attendees were deleted.
685 + */
686 +function rsvp_data_eraser_handler( $email_address, $page = 1 ) {
687 + global $wpdb;
688 + $rsvp_helper = RSVP_Helper::get_instance();
689 +
690 + $num_deleted = 0;
691 + $sql = 'SELECT id FROM ' . ATTENDEES_TABLE . ' WHERE email = %s';
692 + $attendees = $wpdb->get_results( $wpdb->prepare( $sql, $email_address ) );
693 + foreach ( $attendees as $a ) {
694 + $rsvp_helper->delete_attendee( $a->id );
695 + $num_deleted ++;
1356 696 }
1357 -
1358 - function rsvp_printQueryDebugInfo() {
1359 - global $wpdb;
1360 -
1361 - if(get_option(OPTION_DEBUG_RSVP_QUERIES) == "Y") {
1362 - echo "<br />Sql Output: ";
1363 - $wpdb->print_error();
1364 - echo "<br />";
1365 - }
697 +
698 + return array(
699 + 'items_removed' => $num_deleted,
700 + 'items_retained' => false, // We never retain items.
701 + 'messages' => array( __( 'RSVP Data Erased Successfully', 'rsvp' ) ),
702 + 'done' => true,
703 + );
704 +}
705 +
706 +/**
707 + * The data eraser registration that lets the core of WP know
708 + * we can handle erasing of the RSVP Plugin information
709 + * if it is ever requested.
710 + *
711 + * @param array $erasers The array of erasers already registered with this WP instance.
712 + *
713 + * @return array The erasers array now with the RSVP eraser added.
714 + */
715 +function rsvp_register_data_eraser( $erasers ) {
716 + $erasers['rsvp-plugin'] = array(
717 + 'eraser_friendly_name' => __( 'RSVP Plugin', 'rsvp' ),
718 + 'callback' => 'rsvp_data_eraser_handler',
719 + );
720 +
721 + return $erasers;
722 +}
723 +
724 +/**
725 + * Retrieves and packages up the exporter information for the new WordPress compliance functionality
726 + *
727 + * @param string $email_address The email address we need to export the information for.
728 + * @param integer $page The current page.
729 + *
730 + * @return array Containing the information and if everything is done being exported.
731 + */
732 +function rsvp_data_exporter_handler( $email_address, $page = 1 ) {
733 + global $wpdb;
734 +
735 + $export_items = array();
736 + $sql = 'SELECT a.id, a.firstName, a.lastName, a.rsvpDate,
737 + a.rsvpStatus, a.note, a.additionalAttendee, a.kidsMeal,
738 + a.veggieMeal, a.personalGreeting
739 + FROM ' . ATTENDEES_TABLE . ' a
740 + WHERE email = %s';
741 + $attendees = $wpdb->get_results( $wpdb->prepare( $sql, $email_address ) );
742 + foreach ( $attendees as $a ) {
743 + $export_items['firstName'] = stripslashes( $a->firstName );
744 + $export_items['lastName'] = stripslashes( $a->lastName );
745 + $export_items['rsvpDate'] = $a->rsvpDate;
746 + $export_items['rsvpStatus'] = stripslashes( $a->rsvpStatus );
747 + $export_items['note'] = stripslashes( $a->note );
748 + $export_items['additionalAttendee'] = stripslashes( $a->additionalAttendee );
749 + $export_items['personalGreeting'] = stripslashes( $a->personalGreeting );
750 + $export_items['veggieMeal'] = stripslashes( $a->veggieMeal );
751 + $export_items['kidsMeal'] = stripslashes( $a->kidsMeal );
752 +
753 + // Print out the custom question information for the main event.
754 + $export_items = rsvp_data_exporter_custom_questions( $a->id, $export_items );
1366 755 }
1367 -
1368 - /*
1369 - This function checks to see if the page is running over SSL/HTTPs and will return the proper HTTP protocol.
1370 -
1371 - Postcondition: The caller will receive the proper HTTP protocol to use at the beginning of a URL.
1372 - */
1373 - function rsvp_getHttpProtocol() {
1374 - if(isset($_SERVER['HTTPS']) && (trim($_SERVER['HTTPS']) != "") && (strtolower(trim($_SERVER['HTTPS'])) != "off")) {
1375 - return "https";
1376 - }
1377 - return "http";
756 +
757 + return array(
758 + 'data' => $export_items,
759 + 'done' => true,
760 + );
761 +}
762 +
763 +/**
764 + * Retrieves the custom question and answers for export
765 + *
766 + * @param integer $attendee_id The attendee we want to get the answers for.
767 + * @param array $export_items The current exported items that we need to add to.
768 + *
769 + * @return array The export items with the custom questions added for the event passed in.
770 + */
771 +function rsvp_data_exporter_custom_questions( $attendee_id, $export_items ) {
772 + global $wpdb;
773 +
774 + $sql = 'SELECT answer, question FROM ' . ATTENDEE_ANSWERS . ' aa
775 + JOIN ' . QUESTIONS_TABLE . ' q ON q.id = aa.questionID
776 + WHERE aa.attendeeID = %d';
777 +
778 + $custom_questions = $wpdb->get_results( $wpdb->prepare( $sql, $attendee_id ) );
779 + foreach ( $custom_questions as $cq ) {
780 + $export_items[ stripslashes( $cq->question ) ] = stripslashes( $cq->answer );
1378 781 }
1379 -
1380 - function rsvp_getCurrentPageURL() {
1381 - $pageURL = rsvp_getHttpProtocol();
1382 -
1383 - $pageURL .= "://";
1384 - if ($_SERVER["SERVER_PORT"] != "80") {
1385 - $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
1386 - } else {
1387 - $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
1388 - }
1389 - return $pageURL;
1390 - }
1391 -
1392 - add_action('admin_menu', 'rsvp_modify_menu');
1393 - add_action('admin_init', 'rsvp_register_settings');
1394 - add_action('init', 'rsvp_init');
1395 - add_filter('the_content', 'rsvp_frontend_handler');
1396 - register_activation_hook(__FILE__,'rsvp_database_setup');
1397 -?>
782 +
783 + return $export_items;
784 +}
785 +
786 +/**
787 + * Replace a smart quote with an actual single-quote so that people can
788 + * find themselves when they do a search on the front-end.
789 + *
790 + * @param string $in The string we want to replace smart-quotes with single-quotes.
791 + *
792 + * @return string The string that has had the values replaced.
793 + */
794 +function rsvp_smart_quote_replace( $in ) {
795 + return str_replace( '’', '\'', $in );
796 +}
797 +
798 +/**
799 + * Registers the RSVP data exporter to WP core
800 + *
801 + * @param array $exporters The current array of exporters registered with this WP instance.
802 + *
803 + * @return array The exporters array now with the RSVP exporter added.
804 + */
805 +function rsvp_register_data_exporter( $exporters ) {
806 + $exporters['rsvp-plugin'] = array(
807 + 'exporter_friendly_name' => __( 'RSVP Plugin', 'rsvp' ),
808 + 'callback' => 'rsvp_data_exporter_handler',
809 + );
810 +
811 + return $exporters;
812 +}
813 +
814 +/**
815 + * RSVP shortcode handler
816 + *
817 + * @param array $atts The array of attributes for this shortcode.
818 + *
819 + * @return string The output of the page.
820 + */
821 +function rsvpshortcode_func( $atts ) {
822 + return rsvp_frontend_handler( 'rsvp-pluginhere ' );
823 +}
824 +
825 +add_shortcode( 'rsvp', 'rsvpshortcode_func' );
826 +add_action( 'admin_init', 'rsvp_add_privacy_policy_content' );
827 +add_filter( 'wp_privacy_personal_data_erasers', 'rsvp_register_data_eraser', 10 );
828 +add_filter( 'wp_privacy_personal_data_exporters', 'rsvp_register_data_exporter', 10 );
829 +add_action( 'init', 'rsvp_init' );
830 +add_action( 'wp_head', 'rsvp_hide_untill_loaded' );
831 +add_filter( 'the_content', 'rsvp_frontend_handler' );
832 +register_activation_hook( __FILE__, 'rsvp_database_setup' );