science-ation/super/conferences.php
jacob f61b4b94f3 Quick patches:
- wording changes for creating an account and recovering passwords
 - updated rollover script to copy the conference logo
2012-02-15 16:36:52 +00:00

1051 lines
37 KiB
PHP

<?
/*
This file is part of the 'Science Fair In A Box' project
SFIAB Website: http://www.sfiab.ca
Copyright (C) 2005-2006 Sci-Tech Ontario Inc <info@scitechontario.org>
Copyright (C) 2005-2008 James Grant <james@lightbox.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, version 2.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
?>
<?
require("../common.inc.php");
require_once("../user.inc.php");
require_once("../config_editor.inc.php");
superuser_required();
/*
Define the steps used in the setup wizard. It's flow is:
start __
|-> selectNameType -> complete
|
|-> selectConference -> enterName -> complete
*/
$wizard_steps = array(
'start' => array(
'title' => i18n('Add a Conference'),
'builder' => 'build_start_step',
'handler' => 'handle_start_step',
'fields' => array(
'method'
),
'actions' => array(
'cancel' => i18n('Cancel'),
'next' => i18n('Next'),
)
),
'selectNameType' => array(
'title' => i18n('Conference Name and Type'),
'builder' => 'build_select_nametype_step',
'handler' => 'handle_select_nametype_step',
'fields' => array(
'name',
'type'
),
'actions' => array(
'cancel' => i18n('Cancel'),
'next' => i18n('Next'),
'back' => i18n('Back'),
)
),
'selectConference' => array(
'title' => i18n('Select a Conference'),
'builder' => 'build_select_conference_step',
'handler' => 'handle_select_conference_step',
'fields' => array(
'mastercopy',
'endExisting',
'rollDates'
),
'actions' => array(
'cancel' => i18n('Cancel'),
'next' => i18n('Next'),
'back' => i18n('Back'),
)
),
'enterName' => array(
'title' => i18n('Conference Name'),
'builder' => 'build_enter_name_step',
'handler' => 'handle_enter_name_step',
'fields' => array(
'name'
),
'actions' => array(
'cancel' => i18n('Cancel'),
'next' => i18n('Next'),
'back' => i18n('Back'),
)
),
'complete' => array(
'title' => i18n('Confirmation'),
'builder' => 'build_complete_step',
'handler' => 'handle_complete_step',
'fields' => array(),
'actions' => array(
'cancel' => i18n('Cancel'),
'ok' => i18n('OK'),
'back' => i18n('Back'),
)
),
'error' => array(
'title' => i18n('Error'),
'builder' => null,
'handler' => 'wizard_close',
'fields' => array(),
'actions' => array('close' => i18n('Close'))
)
);
// check for a step submitted by the wizard
if(array_key_exists('formAction', $_POST)){
if(array_key_exists('formStep', $_POST)){
$stepName = $_POST['formStep'];
$wizard_steps[$stepName]['handler']();
}
exit();
}
// check for an action by the normal method
if(array_key_exists('action', $_GET)){
switch($_GET['action']){
case 'loadTable':
draw_conferences_list();
break;
case 'new':
// present them with a wizard in which to create a new conference
$_SESSION['conference_wizard'] = array();
wizard_draw_step('start');
break;
case 'edit':
// give them an editor in which to modify an existing conference
$cid = intval($_POST['id']);
if($cid){
$conf = mysql_fetch_assoc(mysql_query("SELECT * FROM conferences WHERE id = $cid"));
if(is_array($conf)){
echo "<table>";
echo "<tr><td>" . i18n('Name') . ":</td><td><input type=\"text\" id=\"confName\" value=\"{$conf['name']}\"></input></td></tr>";
echo "<tr><td>" . i18n('Conference Type') . ":</td><td>";
echo "<select id=\"confType\">";
echo "<option value=\"sciencefair\""; if($conf['type'] == 'sciencefair') echo " SELECTED"; echo ">" . i18n("Science Fair") . "</option>";
echo "<option value=\"scienceolympics\""; if($conf['type'] == 'scienceolympics') echo " SELECTED"; echo ">" . i18n("Science Olympics") . "</option>";
echo "</select>";
echo "</td></tr>";
echo "<tr><td>" . i18n('Status') . ":</td><td>";
$statuses = array('pending','running','ended');
echo "<select id=\"confStatus\">";
foreach($statuses as $status){
echo "<option value=\"$status\"";
if($conf['status'] == $status) echo " SELECTED";
echo ">$status</option>";
}
echo "</select>";
echo "</td></tr>";
echo "</table>";
}
}
break;
case 'save':
// save the new conference data for the conference that's being edited
$confId = intval($_POST['id']);
if(!$confId) {
error_("invalid conference id");
}
else {
// verify that the specified conference already exists
$countRecord = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) as tally FROM conferences WHERE id = $confId"));
$tally = $countRecord['tally'];
if($tally == 1){
// ok, it's a valid conference id. Let's go ahead and update the data for it
$confType = mysql_real_escape_string($_POST['confType']);
$confName = mysql_real_escape_string($_POST['confName']);
$confStatus = mysql_real_escape_string($_POST['confStatus']);
mysql_query("UPDATE conferences SET type='$confType', name='$confName', status='$confStatus' WHERE id='$confId'");
$errMsg = mysql_error();
if($errMsg != null){
error_("SQL error: $errMsg");
}else{
happy_("Conference updated successfully");
}
}else{
error_("nonexistant conference id");
}
}
break;
case 'delete':
// delete the specified conference
$confId = intval($_POST['id']);
if(!$confId){
error_("invalid conference id");
}else{
mysql_query("UPDATE conferences set status='deleted' WHERE id = $confId");
$errMsg = mysql_error();
if($errMsg != null){
error_("SQL error: $errMsg");
}else{
happy_("Conference updated successfully");
}
}
break;
}
exit;
}
send_header("Conferences Setup",
array('Committee Main' => 'committee_main.php',
'System Setup' => '/super/index.php')
,"configuration"
);
?>
<script type="text/javascript">
var wizard;
function editConference(cid){
var editor = $('<div></div>');
$.post('conferences.php?action=edit', {'id':cid}, function(result){
editor.html(result);
editor.dialog({
'title':'<?=i18n("Edit")?>',
'modal':'true',
'buttons':{
'<?=i18n('Cancel')?>':function(){
editor.dialog('close');
editor.remove();
},
'<?=i18n('Ok')?>':function(){
$.post(
'conferences.php?action=save',
{
'id':cid,
'confStatus':$('#confStatus').val(),
'confType':$('#confType').val(),
'confName':$('#confName').val()
},
function(result){
editor.dialog('close');
editor.remove();
$('#conferences').load('conferences.php?action=loadTable');
}
);
}
}
});
});
}
function dropConference(cid){
var confirmation = $('<div></div>');
confirmation.append('<?=i18n("Are you sure you want to delete this conference?");?>');
confirmation.dialog({
'title': '<?=i18n("Are you sure");?>',
'modal': true,
'buttons':{
'<?=i18n('No')?>':function(){
$(this).dialog('close');
$(this).remove();
},
'<?=i18n('Yes')?>':function(){
$(this).dialog('close');
$.post('conferences.php?action=delete', {'id':cid}, function(result){
$('#conferences').load('conferences.php?action=loadTable');
});
$(this).remove();
}
}
});
}
function openWizard(){
wizard = $('<div></div>');
$('#conferences').append(wizard);
wizard.dialog({
modal:true,
width:600,
height:400,
resizable:false,
draggable:false,
closeOnEscape:false,
open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); }
});
wizard.load('conferences.php?action=new');
}
function handleSubmit(action){
var params = {'formAction' : action};
for(n in fields){
// is it a checked check box?
val = $('input:checkbox[name=' + fields[n] + ']:checked').val();
if(val == undefined){
// is it an unchecked checkbox?
val = $('input:checkbox[name=' + fields[n] + ']:unchecked').val();
if(val != undefined) val = 'no';
}
if(val == undefined){
// perhaps it's a radio button
val = $('input:radio[name=' + fields[n] + ']:checked').val();
}
if(val == undefined){
// other, then?
val = $('#' + fields[n]).val();
}
if(val != undefined){
params[fields[n]] = val;
}
}
// the relevant parameters have been pulled out of the form, now submit them
$.post('conferences.php', params, function(result){
wizard.html(result);
});
}
</script>
<a href='' onclick="openWizard(); return false;">Add a conference</a>
<hr/>
<div id="conferences">
<?php draw_conferences_list(); ?>
<br/>
</div>
<?
send_footer();
function draw_conferences_list(){
echo "<table class=\"summarytable\">";
echo "<thead><tr><th colspan=\"5\">" . i18n("Conferences") . "</th></tr></thead>";
$query = mysql_query("SELECT * FROM `conferences` WHERE status <> 'deleted'");
$rowNumbr = 0;
while($row = mysql_fetch_assoc($query)){
echo '<tr class="';
if(($rowNumber++) % 2) echo 'odd';
else echo 'even';
echo '">';
echo "<td>{$row['name']}</td><td>{$row['type']}</td><td>{$row['status']}</td>";
echo "<td><img style=\"cursor: pointer;\" onclick=\"editConference({$row['id']});return false;\" alt=\"" . i18n("Edit") . "\" src=\"/icons/16/edit.png\"/></td>";
if($row['status'] == 'running'){
echo "<td></td>"; // can't delete a running conference
}else{
echo "<td><img style=\"cursor: pointer;\" onclick=\"dropConference({$row['id']});return false;\" alt=\"" . i18n("Delete") . "\" src=\"/icons/16/button_cancel.png\"/></td>";
}
echo "</tr>";
}
echo "</table>";
}
/************** Wizard handling functions *************/
// draw an individual step in the wizard
function wizard_draw_step($step, $message = null){
global $wizard_steps;
if(array_key_exists($step, $wizard_steps)){
// tell the client what fields we expect to have sent back
echo "<script type=\"text/javascript\">";
if(count($wizard_steps[$step]['fields']) > 0){
echo "var fields=['formStep','" . implode("','", $wizard_steps[$step]['fields']) . "'];";
}else{
echo "var fields=['formStep'];";
}
// add the appropriate buttons
echo 'wizard.dialog("option","buttons", {';
$doneone = false;
foreach($wizard_steps[$step]['actions'] as $tag => $label){
if($doneone) echo ",";
else $doneone = true;
echo '"' . $label . '":function(){handleSubmit("' . $tag . '");}';
}
echo '});';
// draw the title header
echo 'wizard.dialog("option", "title", "' . $wizard_steps[$step]['title'] . '");';
echo "</script>";
if($message != null){
// used for error messages (eg. empty field)
echo "<div class=\"error\">" . $message . "</div>";
}
// draw the actual content of this step
echo "<div style=\"margin:1em\">";
if(function_exists($wizard_steps[$step]['builder'])){
$wizard_steps[$step]['builder']();
}
echo "</div>";
echo "<input type=\"hidden\" id=\"formStep\" value=\"$step\"></input>";
}
}
// close the wizard
function wizard_close(){
unset($_SESSION['conference_wizard']);
echo "
<script type=\"text/javascript\">
wizard.dialog('close');
wizard.remove();
$('#conferences').load('conferences.php?action=loadTable');
</script>
";
}
/************** Functions for drawing and processing individual wizard steps ************/
function build_start_step(){
echo '<p>' . i18n("This wizard will help you set up a new conference.") . '<p>';
// find out if any conferences already exist
$tally = mysql_result(mysql_query("SELECT COUNT(*) FROM conferences"), 0);
if($tally == 0){
// no conferences, so just let them continue
echo '<p>' . i18n("Click next to continue") . '</p>';
echo '<input type="hidden" id="method" value="create">';
}else{
$copy_selected = '';
$create_selected = 'checked';
if(array_key_exists('method', $_SESSION['conference_wizard'])){
if($_SESSION['conference_wizard']['method'] == 'copy'){
$copy_selected = 'checked';
$create_selected = '';
}
}else{
}
echo '<p>' . i18n("What would you like to do?") . '</p>';
echo '<div style="margin:1em">';
echo '<input type="radio" name="method" value="create" ' . $create_selected . '> ' . i18n('Create a new conference') . '</input><br/>';
echo '<input type="radio" name="method" value="copy" ' . $copy_selected . '> ' . i18n('Copy an existing conference') . '</input><br/>';
echo '</div>';
}
}
function handle_start_step(){
if($_POST['formAction'] == 'cancel'){
wizard_close();
}else{
$_SESSION['conference_wizard']['method'] = $_POST['method'];
switch($_POST['method']){
case 'create':
wizard_draw_step('selectNameType');
break;
case 'copy':
wizard_draw_step('selectConference');
break;
default:
wizard_close();
$save = false;
}
}
}
function build_select_nametype_step(){
global $conference_types;
echo "<p>" . i18n("Please enter the name and type of this conference.") . "</p>";
echo '<div style="margin:1em">';
echo "<table><tr>";
echo "<td>" . i18n("Conference Name") . "</td>";
$val = '';
if(array_key_exists('name', $_SESSION['conference_wizard'])){
$val = ' VALUE="' . $_SESSION['conference_wizard']['name'] . '" ';
}
echo "<td><input type=\"text\" size=\"40\" id=\"name\"$val></input></td>";
echo "</tr><tr>";
echo "<td>" . i18n("Conference Type") . "</td>";
echo "<td><select id=\"type\">";
if(array_key_exists('type', $_SESSION['conference_wizard'])){
$selectedType = $_SESSION['conference_wizard']['type'];
}else{
$selectedType = 'sciencefair';
}
foreach($conference_types as $type => $title){
if($type == $selectedType) $selected = " SELECTED ";
else $selected = "";
echo "<option value=\"$type\"$selected>$title</option>";
}
echo "</select></td>";
echo "</tr></table>";
echo "</div>";
}
function handle_select_nametype_step(){
if($_POST['formAction'] == 'cancel'){
wizard_close();
}else{
$_SESSION['conference_wizard']['type'] = $_POST['type'];
$_SESSION['conference_wizard']['name'] = $_POST['name'];
if($_POST['formAction'] == 'back'){
wizard_draw_step('start');
}else{
if($_POST['name'] == ''){
wizard_draw_step('selectNameType', i18n('A name for the conference is required'));
}else{
wizard_draw_step('complete');
// handle_complete_step();
}
}
}
}
function build_select_conference_step(){
// get our default/entered values
$selectedID = -1;
$endchecked = '';
$rollchecked = ' checked ';
if(array_key_exists('mastercopy', $_SESSION['conference_wizard'])){
$selectedID = $_SESSION['conference_wizard']['mastercopy'];
if($_SESSION['conference_wizard']['endExisting'] == 'yes'){
$endchecked = ' checked ';
}
if($_SESSION['conference_wizard']['rollDates'] == 'no'){
$rollchecked = '';
}
}
echo "<p>" . i18n("Please select the conference that you wish to copy.") . "</p>";
echo '<div style="margin:1em">';
echo "<table><tr><td colspan=\"2\">";
echo "<select id=\"mastercopy\">";
$query = mysql_query("SELECT * FROM conferences WHERE status != 'deleted' ORDER BY id DESC");
while($row = mysql_fetch_assoc($query)){
$id = $row['id'];
if($id == $selectedID) $selected = " SELECTED ";
else if($selectedID == -1) { $selected = " SELECTED "; $selectedID = -2; } // select the first one
else $selected = "";
echo "<option $selected value=\"{$row['id']}\">{$row['name']}</option>";
}
echo "</select>";
echo "</td></tr><tr><td>";
echo "<input type=\"checkbox\" value=\"yes\" name=\"endExisting\" $endchecked ></input>";
echo "</td><td>" . i18n("End this conference after copying it") . "</td></tr>";
echo "<tr><td>";
echo "<input type=\"checkbox\" value=\"yes\" name=\"rollDates\" $rollchecked ></input>";
echo "</td><td>" . i18n("Increment dates by a year") . "</td></tr>";
echo "</table>";
echo '</div>';
}
function handle_select_conference_step(){
if($_POST['formAction'] == 'cancel'){
wizard_close();
}else{
$_SESSION['conference_wizard']['mastercopy'] = $_POST['mastercopy'];
$_SESSION['conference_wizard']['endExisting'] = $_POST['endExisting'];
$_SESSION['conference_wizard']['rollDates'] = $_POST['rollDates'];
if($_POST['formAction'] == 'back'){
wizard_draw_step('start');
}else{
wizard_draw_step('enterName');
}
}
}
function build_enter_name_step(){
echo "<p>" . i18n("Please enter a name for this conference") . "</p>";
$val = '';
if(array_key_exists('name', $_SESSION['conference_wizard'])){
// get the value previously answered
$val = ' VALUE="' . $_SESSION['conference_wizard']['name'] . '" ';
}else if(array_key_exists('mastercopy', $_SESSION['conference_wizard'])){
// get the name of the conference we're copying
$query = "SELECT name FROM conferences WHERE id = {$_SESSION['conference_wizard']['mastercopy']}";
$result = mysql_fetch_assoc(mysql_query($query));
$val = ' VALUE="' . $result['name'] . '" ';
}
echo "<div style=\"margin:1em\"><input type=\"text\" style=\"width: 100%;\" id=\"name\"$val></input></div>";
}
function handle_enter_name_step(){
if($_POST['formAction'] == 'cancel'){
wizard_close();
}else{
$_SESSION['conference_wizard']['name'] = $_POST['name'];
if($_POST['formAction'] == 'back'){
wizard_draw_step('selectConference');
}else{
if($_POST['name'] == ''){
wizard_draw_step('enterName', i18n('A name for the conference is required'));
}else{
wizard_draw_step('complete');
}
// handle_complete_step();
}
}
}
function build_complete_step(){
echo "<p>";
echo i18n("All of the required information has been gathered. Click &quot;OK&quot; to complete the process.");
echo "</p>";
}
function handle_complete_step(){
// print_r($_SESSION);
if($_POST['formAction'] == 'cancel'){
wizard_close();
}else if($_POST['formAction'] == 'back'){
if($_SESSION['conference_wizard']['method'] == 'copy'){
wizard_draw_step('enterName');
}else{
wizard_draw_step('selectNameType');
}
}else{
switch($_SESSION['conference_wizard']['method']){
case 'create':
$result = create_conference($_SESSION['conference_wizard']);
if(is_numeric($result)){
wizard_close();
}else{
wizard_draw_step('error', $result);
}
break;
case 'copy':
if(copy_conference($_SESSION['conference_wizard'])){
wizard_close();
}
break;
}
}
}
// returns the id of the created conference if successful, error message otherwise
function create_conference($params){
$cname = mysql_real_escape_string($params['name']);
$ctype = $params['type'];
mysql_query("INSERT INTO conferences (oid, name, type, status) VALUES (1, '" . $cname . "', '$ctype', 'pending')");
//if its created brand spanking new, we set the copyoriginal and copyparent to be the same as the id
$conferences_id=mysql_insert_id();
mysql_query("UPDATE conferences SET copyoriginal='$conferences_id', copyparent='$conferences_id' WHERE id='$conferences_id'");
$errorMessage = mysql_error();
if($errorMessage){
return "SQL Error:<br/>$errorMessage";
}
//copy over the award_types defaults
$q=mysql_query("SELECT * FROM award_types WHERE conferences_id='-1'");
while($r=mysql_fetch_object($q)) {
mysql_query("INSERT INTO award_types (id,type,`order`, conferences_id) VALUES ('$r->id','$r->type','$r->order','".$conferences_id."')");
}
// add this administrator's admin user account for the new conference
$u = user_create($_SESSION['accounts_id'], $conferences_id);
$q = mysql_query("SELECT id FROM roles WHERE `type` IN('admin', 'config')");
while($row = mysql_fetch_assoc($q)){
mysql_query("
INSERT INTO user_roles (accounts_id, users_id, roles_id, active, complete)
VALUES({$_SESSION['accounts_id']}, {$u['id']}, {$row['id']}, 'yes', 'yes')
");
}
user_add_role($u, 'admin');
user_add_role($u, 'config');
return $conferences_id;
}
// copy users of the specified roles from conference oldConfId to conference newConfId
// roles can be passed as a single comma delimited string, or as an array of strings
// return 'ok' on success, error message otherwise
function conferences_copy_users($oldConfId, $newConfId, $roles){
if(!is_array($roles)){
// they must have been passed as a string
$roles = explode(',', $roles);
foreach($roles as $idx => $val){
$roles[$idx] = trim($val);
}
}
$query = mysql_query("
SELECT * FROM users WHERE users.id IN(
SELECT DISTINCT(users.id) FROM users
JOIN user_roles ON user_roles.users_id = users.id
JOIN roles on roles.id = user_roles.roles_id
WHERE roles.`type` IN ('" . implode("','", $roles) . "')
AND users.conferences_id = $oldConfId
)
");
$keys = '';
while(mysql_error() == '' && $row = mysql_fetch_assoc($query)){
// first we copy the user
$oldId = $row['id'];
unset($row['id']);
if($keys == ''){
$keyList = array_keys($row);
$keys = "`" . implode("`,`", $keyList) . "`";
}
$row['conferences_id'] = $newConfId;
$values = "'" . implode("','", $row) . "'";
mysql_query("INSERT INTO users ($keys) VALUES ($values)");
$uid = mysql_insert_id();
$aid = $row['accounts_id'];
// now copy their applicable roles
$q2 = mysql_query("
SELECT roles_id, active, complete FROM user_roles
JOIN roles ON roles.id = user_roles.roles_id
WHERE roles.`type` IN('" . implode("','", $roles) . "')
AND user_roles.users_id = $oldId
");
while(mysql_error() == '' && $row2 = mysql_fetch_assoc($q2)){
mysql_query("
INSERT INTO user_roles(`accounts_id`, `users_id`, `roles_id`, `active`, `complete`)
VALUES($aid, $uid, {$row2['roles_id']}, '{$row2['active']}', '{$row2['complete']}')
");
}
}
if(mysql_error() != '') return "SQL error :<br/>" . mysql_error();
return 'ok';
}
// copy a conference - returns true on success, false otherwise. Gives the wizard an error message one occurs
function copy_conference($params){
/* $params: {
mastercopy => id of conf to copy
endExisting => end it after copying
rollDates => increment the dates by a year
name => the new name
}*/
global $config;
// start a list of all tables that have been updated
$completedTables = array();
// we'll start by creating the new conference
$oldConfId = $params['mastercopy'];
$oldConf = mysql_fetch_assoc(mysql_query("SELECT * FROM conferences WHERE id = {$oldConfId}"));
mysql_query("INSERT INTO conferences (oid, name, type, status, copyoriginal, copyparent) VALUES (1, '" . mysql_real_escape_string($params['name']) . "', '{$oldConf['type']}', 'pending','{$oldConf['copyoriginal']}','{$oldConf['id']}')");
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error on line #' . (__LINE__ - 1) . ': <br/>' . mysql_error()); return false; }
$newConfId = mysql_insert_id();
// then copy the configuration variables
config_update_variables($newConfId, $oldConfId);
// now the dates
if($params['rollDates'] == 'yes'){
$q=mysql_query("SELECT DATE_ADD(date,INTERVAL 365 DAY) AS newdate, name, description FROM dates WHERE conferences_id = $oldConfId");
}else{
$q=mysql_query("SELECT date AS newdate, name, description FROM dates WHERE conferences_id = $oldConfId");
}
while(mysql_error() == '' && $r = mysql_fetch_object($q))
mysql_query("INSERT INTO dates (date,name,description,conferences_id) VALUES (
'".mysql_real_escape_string($r->newdate)."',
'".mysql_real_escape_string($r->name)."',
'".mysql_real_escape_string($r->description)."',
'".mysql_real_escape_string($newConfId)."')");
$completedTables[] = 'dates';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// page text
$q = mysql_query("SELECT * FROM pagetext WHERE conferences_id = $oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO pagetext (textname,textdescription,text,lastupdate,conferences_id,lang) VALUES (
'".mysql_real_escape_string($r->textname)."',
'".mysql_real_escape_string($r->textdescription)."',
'".mysql_real_escape_string($r->text)."',
'".mysql_real_escape_string($r->lastupdate)."',
'".mysql_real_escape_string($newConfId)."',
'".mysql_real_escape_string($r->lang)."')");
$completedTables[] = 'pagetext';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// project categories
$q = mysql_query("SELECT * FROM projectcategories WHERE conferences_id = $oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO projectcategories (id,category,category_shortform,mingrade,maxgrade,conferences_id) VALUES (
'".mysql_real_escape_string($r->id)."',
'".mysql_real_escape_string($r->category)."',
'".mysql_real_escape_string($r->category_shortform)."',
'".mysql_real_escape_string($r->mingrade)."',
'".mysql_real_escape_string($r->maxgrade)."',
'".mysql_real_escape_string($newConfId)."')");
$completedTables[] = 'projectcategories';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// project divisions
$q=mysql_query("SELECT * FROM projectdivisions WHERE conferences_id=$oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO projectdivisions (id,division,division_shortform,cwsfdivisionid,conferences_id) VALUES (
'".mysql_real_escape_string($r->id)."',
'".mysql_real_escape_string($r->division)."',
'".mysql_real_escape_string($r->division_shortform)."',
'".mysql_real_escape_string($r->cwsfdivisionid)."',
'".mysql_real_escape_string($newConfId)."')");
$completedTables[] = 'projectdivisions';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// project subdivisions
$q=mysql_query("SELECT * FROM projectsubdivisions WHERE conferences_id=$oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO projectsubdivisions (id,projectdivisions_id,subdivision,conferences_id) VALUES (
'".mysql_real_escape_string($r->id)."',
'".mysql_real_escape_string($r->projectsubdivisions_id)."',
'".mysql_real_escape_string($r->subdivision)."',
'".mysql_real_escape_string($newConfId)."')");
$completedTables[] = 'projectsubdivisions';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// safety questions
$q=mysql_query("SELECT * FROM safetyquestions WHERE conferences_id=$oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO safetyquestions (question,type,required,ord,conferences_id) VALUES (
'".mysql_real_escape_string($r->question)."',
'".mysql_real_escape_string($r->type)."',
'".mysql_real_escape_string($r->required)."',
'".mysql_real_escape_string($r->ord)."',
'".mysql_real_escape_string($newConfId)."')");
$completedTables[] = 'safetyquestions';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// awards
$q=mysql_query("SELECT * FROM award_awards WHERE conferences_id=$oldConfId");
$errorMessage = mysql_error();
while($errorMessage == '' && $r=mysql_fetch_object($q)) {
/* Roll the one award */
$errorMessage .= roll($oldConfId, $newConfId, 'award_awards', "id='{$r->id}'");
$award_awards_id=mysql_insert_id();
$errorMessage .= roll($oldConfId, $newConfId, 'award_awards_projectcategories', "award_awards_id='{$r->id}'",
array('award_awards_id' => $award_awards_id));
$errorMessage .= roll($oldConfId, $newConfId, 'award_awards_projectdivisions', "award_awards_id='{$r->id}'",
array('award_awards_id' => $award_awards_id));
$errorMessage .= roll($oldConfId, $newConfId, 'award_prizes', "award_awards_id='{$r->id}'",
array('award_awards_id' => $award_awards_id));
}
$completedTables[] = 'award_awards';
$completedTables[] = 'award_awards_projectcategories';
$completedTables[] = 'award_awards_projectdivisions';
$completedTables[] = 'award_prizes';
if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . $errorMessage); rollback($newConfId, $completedTables); return false; }
// award types
$q=mysql_query("SELECT * FROM award_types WHERE conferences_id = $oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO award_types (id,type,`order`,conferences_id) VALUES (
'".mysql_real_escape_string($r->id)."',
'".mysql_real_escape_string($r->type)."',
'".mysql_real_escape_string($r->order)."',
'".mysql_real_escape_string($newConfId)."')");
$completedTables[] = 'award_types';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// schools
$q=mysql_query("SELECT * FROM schools WHERE conferences_id=$oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q)) {
$puid = ($r->principal_uid == null) ? 'NULL' : ("'".intval($r->principal_uid)."'");
$shuid = ($r->sciencehead_uid == null) ? 'NULL' : ("'".intval($r->sciencehead_uid)."'");
mysql_query("INSERT INTO schools (school,schoollang,schoollevel,board,district,phone,fax,address,city,province_code,postalcode,principal_uid,schoolemail,sciencehead_uid,accesscode,lastlogin,junior,intermediate,senior,registration_password,projectlimit,projectlimitper,conferences_id) VALUES (
'".mysql_real_escape_string($r->school)."',
'".mysql_real_escape_string($r->schoollang)."',
'".mysql_real_escape_string($r->schoollevel)."',
'".mysql_real_escape_string($r->board)."',
'".mysql_real_escape_string($r->district)."',
'".mysql_real_escape_string($r->phone)."',
'".mysql_real_escape_string($r->fax)."',
'".mysql_real_escape_string($r->address)."',
'".mysql_real_escape_string($r->city)."',
'".mysql_real_escape_string($r->province_code)."',
'".mysql_real_escape_string($r->postalcode)."',$puid,
'".mysql_real_escape_string($r->schoolemail)."',$shuid,
'".mysql_real_escape_string($r->accesscode)."',
NULL,
'".mysql_real_escape_string($r->junior)."',
'".mysql_real_escape_string($r->intermediate)."',
'".mysql_real_escape_string($r->senior)."',
'".mysql_real_escape_string($r->registration_password)."',
'".mysql_real_escape_string($r->projectlimit)."',
'".mysql_real_escape_string($r->projectlimitper)."',
'".mysql_real_escape_string($newConfId)."')");
}
$completedTables[] = 'schools';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// questions
$q = mysql_query("SELECT * FROM questions WHERE conferences_id = $oldConfId");
while(mysql_error() == '' && $r=mysql_fetch_object($q))
mysql_query("INSERT INTO questions (id,conferences_id,section,db_heading,question,type,required,ord) VALUES (
'',
'$newConfId',
'".mysql_real_escape_string($r->section)."',
'".mysql_real_escape_string($r->db_heading)."',
'".mysql_real_escape_string($r->question)."',
'".mysql_real_escape_string($r->type)."',
'".mysql_real_escape_string($r->required)."',
'".mysql_real_escape_string($r->ord)."')");
$completedTables[] = 'questions';
if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . mysql_error()); rollback($newConfId, $completedTables); return false; }
// regfee items
$errorMessage = roll($oldConfId, $newConfId, 'regfee_items');
$completedTables[] = 'regfee_items';
if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . $errorMessage); rollback($newConfId, $completedTables); return false; }
// volunteer positions
$errorMessage = roll($oldConfId, $newConfId, 'volunteer_positions');
$completedTables[] = 'volunteer_positions';
if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . $errorMessage); rollback($newConfId, $completedTables); return false; }
// timeslots and rounds
$q = mysql_query("SELECT * FROM judges_timeslots WHERE conferences_id='$oldConfId' AND round_id='0'");
$errorMessage = mysql_error();
while($errorMessage == '' && $r=mysql_fetch_assoc($q)) {
if($params['rollDates'] == 'yes'){
$queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`,`name`)
VALUES ('$newConfId','0','{$r['type']}',DATE_ADD('{$r['date']}', INTERVAL 1 YEAR),
'{$r['starttime']}','{$r['endtime']}','{$r['name']}')";
}else{
$queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`,`name`)
VALUES ('$newConfId','0','{$r['type']}','{$r['date']}',
'{$r['starttime']}','{$r['endtime']}','{$r['name']}')";
}
mysql_query($queryText);
$errorMessage .= mysql_error();
$round_id = mysql_insert_id();
$qq = mysql_query("SELECT * FROM judges_timeslots WHERE round_id='{$r['id']}'");
if($params['rollDates'] == 'yes'){
while(($rr=mysql_fetch_assoc($qq)) && $errorMessage == ''){
$queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`)
VALUES ('$newConfId','$round_id','timeslot',DATE_ADD('{$rr['date']}', INTERVAL 1 YEAR),
'{$rr['starttime']}','{$rr['endtime']}')";
mysql_query($queryText);
$errorMessage .= mysql_error();
}
}else{
while(($rr=mysql_fetch_assoc($qq)) && $errorMessage == ''){
$queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`)
VALUES ('$newConfId','$round_id','timeslot','{$rr['date']}',
'{$rr['starttime']}','{$rr['endtime']}')";
mysql_query($queryText);
$errorMessage .= mysql_error();
}
}
}
$completedTables[] = 'judges_timeslots';
if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . $errorMessage); rollback($newConfId, $completedTables); return false; }
// admin, config, and committee users
$errorMessage = conferences_copy_users($oldConfId, $newConfId, array('admin', 'config', 'committee'));
$completedTables[] = 'users';
$completedTables[] = 'user_roles';
if($errorMessage != 'ok'){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ': <br/>' . $errorMessage); rollback($newConfId, $completedTables); return false; }
// copy the logo files over as well
$imgPath = $_SERVER['DOCUMENT_ROOT'] . $config['SFIABDIRECTORY'] . "/data";
$listing = scandir($imgPath);
$digits = strlen($oldConfId);
foreach($listing as $fname){
if(preg_match("/^$oldConfId-logo/", $fname)){
$newName = $newConfId . substr($fname, $digits);
shell_exec("cp $imgPath/$fname $imgPath/$newName");
}
}
// WHEW! If we've made it this far, the conference has successfully been copied
// end the previous conference if applicable
if($params['endexisting'] == true){
// let's go ahead and end the conference that we just copied
mysql_query("UPDATE conferences SET status = 'ended' WHERE id = '$oldConfId'");
if(mysql_error() != ''){
wizard_draw_step('error', i18n("The conference was copied successfully, but not successfully ended. You will need to end the original conference manually.") . "<br/> SQL error:<br/>" . mysql_error());
return false;
}
}
return true;
}
// undo all of the conference rolling over that was done by copy_conference. This only gets called if an error occurs
// while copying to the new conference. In that case, all of the newly added data relevant to the conference is deleted,
// as well as the conference itself
function rollback($conferences_id, $tables){
foreach($tables as $table){
mysql_query("DELETE FROM `$table` WHERE `conferences_id` = $conferences_id");
}
mysql_query("DELETE FROM conferences WHERE id = $conferences_id");
}
// return empty string on success, error message otherwise
function roll($oldConfId, $newConfId, $table, $where='', $replace=array()){
/* Field Type Null Key Default Extra
* id int(10) unsigned NO PRI NULL auto_increment
* sponsors_id int(10) unsigned NO MUL 0
* award_source_fairs_id int(10) unsigned YES NULL
*/
$errMessage = '';
/* Get field list for this table */
$q = mysql_query("SHOW COLUMNS IN `$table`");
while(($c = mysql_fetch_assoc($q))) {
$col[$c['Field']] = $c;
}
/* Record fields we care about */
$fields = array();
$keys = array_keys($col);
foreach($keys as $k) {
/* Skip id field */
if($col[$k]['Extra'] == 'auto_increment') continue;
/* Skip year field */
if($k == 'year') continue;
/* Skip conferences_id field */
if($k == 'conferences_id') continue;
$fields[] = $k;
}
if($where == '') $where='1';
/* Get data */
$q=mysql_query("SELECT * FROM $table WHERE conferences_id='$oldConfId' AND $where");
if(mysql_error() != '') $errMessage .= mysql_error() . "<br/>";
$names = '`' . implode('`,`', $fields) . '`';
/* Process data */
while($r=mysql_fetch_assoc($q)) {
$vals = '';
foreach($fields as $f) {
if(array_key_exists($f, $replace))
$vals .= ",'".mysql_real_escape_string($replace[$f])."'";
else if($col[$f]['Null'] == 'YES' && $r[$f] == NULL)
$vals .= ',NULL';
else
$vals .= ",'".mysql_real_escape_string($r[$f])."'";
}
mysql_query("INSERT INTO `$table` (`conferences_id`, $names) VALUES ('$newConfId'$vals)");
if(mysql_error() != '') $errMessage .= mysql_error() . "<br/>";
echo mysql_error();
}
return $errMessage;
}