<? /* * This file is part of the Science-ation project * Science-ation Website: https://science-ation.ca * * This file was part of the 'Science Fair In A Box' project * * * Copyright (C) 2005 Sci-Tech Ontario Inc <info@scitechontario.org> * Copyright (C) 2005 James Grant <james@lightbox.org> * Copyright (C) 2024 AlgoLibre Inc. <science-ation@algolibre.io> * * 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_once ('../common.inc.php'); require_once ('../user.inc.php'); require_once ('../projects.inc.php'); require_once ('../fair_additional_materials.inc.php'); $auth_type = user_auth_required(array('fair', 'committee'), 'admin'); $award_awards_id = intval(get_value_from_array($_GET, 'award_awards_id')); $action = get_value_from_array($_GET, 'action'); /* Load fairs */ $fairs = array(); $q = $pdo->prepare("SELECT * FROM fairs WHERE type='feeder' ORDER BY name"); $q->execute(); while (($f = $q->fetch(PDO::FETCH_ASSOC))) { $fairs[$f['id']] = $f; } switch ($action) { case 'addwinner': $prize_id = intval($_GET['prize_id']); $projects_id = intval($_GET['projects_id']); if (!$prize_id || !$projects_id) { error_('Illegal Assignment'); exit; } // first check how many we are allowed to have $q = $pdo->prepare("SELECT number FROM award_prizes WHERE id=?"); $q->execute([$prize_id]); show_pdo_errors_if_any($pdo); $r = $q->fetch(PDO::FETCH_ASSOC); $number = $r['number']; /* Get the award info */ $q = $pdo->prepare("SELECT * FROM award_awards WHERE id=?"); $q->execute([$award_awards_id]); show_pdo_errors_if_any($pdo); $a = $q->fetch(PDO::FETCH_ASSOC); /* Get the project */ $q = $pdo->prepare("SELECT fairs_id FROM projects WHERE id=?"); $q->execute([$projects_id]); show_pdo_errors_if_any($pdo); $p = $q->fetch(PDO::FETCH_ASSOC); $fairs_id = $p['fairs_id']; /* * Quick sanity check don't let a fair user do an assignment for someone not * in their fair */ if ($auth_type == 'fair' && $fairs_id != $_SESSION['fairs_id']) { error_('Illegal Assignemnt'); exit; } if ($a['per_fair'] == 'yes') { /* Count is the number of this fair already assigned */ $q = $pdo->prepare("SELECT COUNT(*) AS count FROM winners LEFT JOIN projects ON winners.projects_id=projects.id WHERE projects.fairs_id=? awards_prizes_id=?"); $q->execute([$fairs_id,$prize_id]); show_pdo_errors_if_any($pdo); $r = $q->fetch(PDO::FETCH_ASSOC); $count = $r['count']; } else { /* Count is the total number assigned */ $q = $pdo->prepare("SELECT COUNT(*) AS count FROM winners WHERE awards_prizes_id=?"); $q->execute([$prize_id]); show_pdo_errors_if_any($pdo); $r = $q->fetch(PDO::FETCH_ASSOC); $count = $r['count']; } if ($count < $number) { $stmt = $pdo->prepare("INSERT INTO winners (awards_prizes_id,projects_id,year) VALUES (?,?,?)"); $stmt->execute([$prize_id,$projects_id,$config['FAIRYEAR']]); happy_('Winning project added'); } else { error_('This prize cannot accept any more winners. Maximum: %1', $number); } exit; case 'deletewinner': $prize_id = intval($_GET['prize_id']); $projects_id = intval($_GET['projects_id']); if ($prize_id && $projects_id) { $stmt = $pdo->prepare("DELETE FROM winners WHERE awards_prizes_id=? AND projects_id=?"); $stmt->execute([$prize_id,$projects_id]); happy_('Winning project removed'); } exit; case 'award_load': $fairs_id = intval($_GET['fairs_id']); /* Load the award */ $q = $pdo->prepare("SELECT award_awards.id, award_awards.name, award_awards.criteria, award_awards.order AS awards_order, award_awards.per_fair, award_awards.external_additional_materials, award_awards.award_source_fairs_id, award_types.type FROM award_awards , award_types WHERE award_awards.year=? AND\taward_awards.award_types_id=award_types.id AND \taward_types.year=award_awards.year AND\taward_awards.id=? "); $q->execute([$config['FAIRYEAR'],$award_awards_id]); show_pdo_errors_if_any($pdo); if ($q->rowCount() != 1) { echo i18n("Invalid award to load $award_awards_id"); exit; } $r = $q->fetch(PDO::FETCH_ASSOC); print_award($r, $fairs_id); exit; case 'edit_load': $fairs_id = intval($_GET['fairs_id']); /* Force the fair user to only edit their fair */ // if($auth_type == 'fair') $fairs_id = $_SESSION['fairs_id']; /* Load the award */ $q = $pdo->prepare("SELECT award_awards.id, award_awards.name, award_awards.criteria, award_awards.order AS awards_order, award_awards.per_fair, award_awards.external_additional_materials, award_awards.award_source_fairs_id, award_types.type FROM award_awards , award_types WHERE award_awards.year=? AND\taward_awards.award_types_id=award_types.id AND \taward_types.year=award_awards.year AND\taward_awards.id=? "); $q->execute([$config['FAIRYEAR'],$award_awards_id]); show_pdo_errors_if_any($pdo); if ($q->rowCount() != 1) { echo i18n("Invalid award to edit $award_awards_id"); exit; } $r = $q->fetch(PDO::FETCH_ASSOC); $editor_data = array(); /* Load projects */ if ($r['type'] == 'Special') { $editor_data['projects_nominated'] = getProjectsNominatedForSpecialAward($r['id']); $editor_data['disable_nominated'] = false; } else { $editor_data['projects_nominated'] = array(); $editor_data['disable_nominated'] = true; } $editor_data['projects_eligible'] = getProjectsEligibleForAward($r['id']); /* Print the award header */ echo '<br />'; if ($fairs_id) echo '<h4>' . i18n('Winners from') . ": {$fairs[$fairs_id]['name']}</h4>"; echo "<b>{$r['type']} - {$r['name']}</b><br />"; echo "{$r['criteria']}<br />"; /* Print the award with editor */ print_award($r, $fairs_id, true, $editor_data); exit; case 'additional_materials': $fairs_id = intval($_GET['fairs_id']); $q = $pdo->prepare("SELECT * FROM award_awards WHERE id=?"); $q->execute([$award_awards_id]); if ($fairs_id == 0) { echo "Unsupported Action: Can't get additional materials for fairs_id=0. Edit the project and set it's fair to anything except 'Local/Unspecified'."; exit; } $a = $q->fetch(PDO::FETCH_ASSOC); $q = $pdo->prepare("SELECT * FROM fairs WHERE id=?"); $q->execute([$fairs_id]); $fair = $q->fetch(PDO::FETCH_ASSOC); $pdf = fair_additional_materials($fair, $a, $config['FAIRYEAR']); foreach ($pdf['header'] as $h) header($h); echo $pdf['data']; exit; } if ($auth_type == 'fair') { send_header('Enter Winning Projects', array('Science Fair Main' => 'fair_main.php'), 'enter_winning_projects'); } else { send_header('Enter Winning Projects', array('Committee Main' => 'committee_main.php', 'Administration' => 'admin/index.php'), 'enter_winning_projects'); } ?> <div id="winner_editor" title="Edit Winners" style="display: none"> <div id="winner_content"></div> </div> <script language="javascript" type="text/javascript"> var award_awards_id = 0; var fairs_id = 0; function update_winner_content() { $("#winner_content").load("<?= $_SERVER['PHP_SELF'] ?>?action=edit_load&award_awards_id="+award_awards_id+"&fairs_id="+fairs_id,{}, function(responseText, textStatus, XMLHttpRequest) { /* Attach to save button */ $("#project_save").click(function() { var id = award_awards_id; $("#debug").load("project_editor.php?action=save&award_awards_id="+id, $("#project_form").serializeArray()); }); } ); } function popup_editor(id,fid) { var w = (document.documentElement.clientWidth * 0.9); var h = (document.documentElement.clientHeight * 0.9); award_awards_id = id; fairs_id = fid; /* Show the dialog */ $('#winner_editor').dialog('option', 'width', w); $('#winner_editor').dialog('option', 'height', h); $("#winner_editor").dialog('open'); update_winner_content(); return true; } function delete_winner(prize_id, projects_id) { var conf = confirm("<?= i18n('Are you sure you want to remove this project from this prize?') ?>"); if(conf == false) return false; $("#debug").load("<?= $_SERVER['PHP_SELF'] ?>?action=deletewinner&award_awards_id="+award_awards_id+"&prize_id="+prize_id+"&projects_id="+projects_id,{}, function(responseText, textStatus, XMLHttpRequest) { update_winner_content(); } ); } function add_winner(prize_id) { var projects_id; if($("#nom_"+prize_id).hasClass('text-link-selected')) { projects_id = $("#projects_select_"+prize_id+"_nom").val(); } else { projects_id = $("#projects_select_"+prize_id+"_eli").val(); } $("#debug").load("<?= $_SERVER['PHP_SELF'] ?>?action=addwinner&award_awards_id="+award_awards_id+"&prize_id="+prize_id+"&projects_id="+projects_id,{}, function(responseText, textStatus, XMLHttpRequest) { update_winner_content(); } ); } function unlist_winner(projects_id) { $(".projects_select option[value='"+projects_id+"']").remove(); } function set_nom(prize_id) { /* Don't try anything if this is already selected */ if($("#nom_"+prize_id).hasClass('text-link-selected')) return false; /* If nominated link is disabled, set all-eligible instead */ if($("#nom_"+prize_id).hasClass('text-link-disabled')) return set_eli(prize_id); /* Populate List */ $("#projects_select_"+prize_id+"_eli").css('display', 'none'); $("#projects_select_"+prize_id+"_nom").css('display', 'inline'); /* This was brilliant, but we need to filter select boxes by fairs_id in some cases, * so keeping a master copy and duplicating it just didn't work :( * Actually, we can do this now, but the code works the other way, so i'm not going * to change it back. :p */ /* $("#projects_select_"+prize_id).val(''); $("#projects_select_"+prize_id).html(''); $("#projects_nominated > option").clone().appendTo("#projects_select_"+prize_id); */ /* Swap selected styles */ $("#nom_"+prize_id).addClass('text-link-selected'); $("#eli_"+prize_id).removeClass('text-link-selected'); } function set_eli(prize_id) { /* Don't try anything if this is already selected */ if($("#eli_"+prize_id).hasClass('text-link-selected')) { return false; } /* Populate List */ $("#projects_select_"+prize_id+"_eli").css('display', 'inline'); $("#projects_select_"+prize_id+"_nom").css('display', 'none'); /* Swap selected styles */ $("#nom_"+prize_id).removeClass('text-link-selected'); $("#eli_"+prize_id).addClass('text-link-selected'); } $(document).ready(function() { $("#winner_editor").dialog({ bgiframe: true, autoOpen: false, modal: true, resizable: false, draggable: false, buttons: { /* "<?= i18n('Cancel') ?>": function() { $(this).dialog("close"); }, "<?= i18n('Save') ?>": function() { save_report(); $(this).dialog("close"); */ "<?= i18n('Close') ?>": function() { // save_report(); $(this).dialog("close"); } }, close: function() { /* Reload the row after the dialog close in case the info has changed */ $("#winner_list_"+award_awards_id+"_"+fairs_id).load("<?= $_SERVER['PHP_SELF'] ?>?action=award_load&award_awards_id="+award_awards_id+"&fairs_id="+fairs_id); } }); }); </script> <? $fair_join = ''; $fair_where = ''; if ($auth_type == 'fair') { /* * Join to fairs_award_link, and only list awards that are set * as "upload winners" for this fair */ $fair_join = 'LEFT JOIN fairs_awards_link ON fairs_awards_link.award_awards_id=award_awards.id'; $fair_where = "AND fairs_awards_link.upload_winners='yes' AND fairs_awards_link.fairs_id='{$_SESSION['fairs_id']}'"; } $q = $pdo->prepare("SELECT award_awards.id, award_awards.name, award_awards.order AS awards_order, award_awards.per_fair, award_awards.external_additional_materials, award_awards.award_source_fairs_id, award_types.type, sponsors.organization FROM award_awards ?, award_types, sponsors WHERE award_awards.year=? AND\taward_awards.award_types_id=award_types.id AND\taward_types.year=? AND\taward_awards.sponsors_id=sponsors.id ? ORDER BY awards_order"); $q->execute([$fair_join,$config['FAIRYEAR'],$config['FAIRYEAR'],$fair_where]); show_pdo_errors_if_any($pdo); if ($q->rowCount() == 0) { echo i18n('No awards to display.'); send_footer(); exit; } echo '<br />'; echo i18n('Choose an award to assign winners'); echo '<br />'; echo '<br />'; $fairs_id = ($auth_type == 'fair') ? $_SESSION['fairs_id'] : 0; while ($r = $q->fetch(PDO::FETCH_ASSOC)) { if ($r['per_fair'] == 'yes' && $auth_type != 'fair') { ?> <?= $r['type'] ?> - <?= $r['name'] ?> <span style="font-size: 0.8em; font-style: italic;">(<?= $r['organization'] ?>)</span><br /> <? foreach ($fairs as $fid => $f) { ?> <a title="<?= i18n('Edit winners for this award') ?>" href="#" onClick="popup_editor(<?= $r['id'] ?>,<?= $f['id'] ?>);return false;"> <?= $f['name'] ?></a><br /> <div id="winner_list_<?= $r['id'] ?>_<?= $fid ?>"> <? print_award($r, $f['id']); echo '</div>'; } } else { ?> <a title="<?= i18n('Edit winners for this award') ?>" href="#" onClick="popup_editor(<?= $r['id'] ?>,<?= $fairs_id ?>);return false;"> <?= $r['type'] ?> - <?= $r['name'] ?></a> <span style="font-size: 0.8em; font-style: italic;">(<?= $r['organization'] ?>)</span><br /> <div id="winner_list_<?= $r['id'] ?>_<?= $fairs_id ?>"> <? print_award($r, $fairs_id); echo '</div>'; } echo '<br />'; } function print_award(&$r, $fairs_id, $editor = false, $editor_data = array()) { global $config, $auth_type; global $pdo; // echo "fair=$fairs_id"; /* * Setup the winner filter, we don't want to restrict this * to a specific fair for the 'fair' user */ $fairs_where = ''; if ($r['per_fair'] == 'yes') { if ($fairs_id == 0) { echo "blank fairs_id for per-fair award. bug.\n"; exit; } /* For per-fair awards, filter the results */ $fairs_where = "AND projects.fairs_id='$fairs_id'"; } /* Force the 'fair' user to only edit their own fair */ if ($auth_type == 'fair') $fairs_id = $_SESSION['fairs_id']; /* Load prizes for this award */ $q = $pdo->prepare("SELECT award_prizes.prize, award_prizes.number, award_prizes.id, award_prizes.cash, award_prizes.scholarship FROM award_prizes WHERE award_awards_id=? AND award_prizes.year=? ORDER BY `order`"); $q->execute([$r['id'],$config['FAIRYEAR']]); show_pdo_errors_if_any($pdo); echo '<table width="100%"><tr><td>'; $has_winners = false; while ($pr = $q->fetch(PDO::FETCH_OBJ)) { if ($editor == true) { echo '<br /><hr />'; } echo " <b>{$pr->prize}"; if ($pr->cash || $pr->scholarship) { echo ' ('; if ($pr->cash && $pr->scholarship) echo "\${$pr->cash} cash / \${$pr->scholarship} scholarship"; else if ($pr->cash) echo "\${$pr->cash} cash"; else if ($pr->scholarship) echo "\${$pr->scholarship} scholarship"; echo ')'; } /* Load winners for this prize */ $cq = $pdo->prepare("SELECT winners.projects_id, projects.projectnumber, projects.title, projects.fairs_id FROM winners LEFT JOIN projects ON projects.id=winners.projects_id WHERE winners.awards_prizes_id=? ? "); $cq->execute([$pr->id,$fairs_where]); show_pdo_errors_if_any($pdo); $count = $cq->rowCount(); // echo "winners=$count"; /* Print count */ $colour = ($count < $pr->number) ? 'red' : 'green'; echo " <font color=\"$colour\">[$count/{$pr->number}]</font>"; echo '</b>'; echo '<br />'; /* List current winners for this prize */ $winners = array(); while ($w = $cq->fetch(PDO::FETCH_ASSOC)) { if ($w['projectnumber']) { echo ' '; if ($editor == true) { /* Print the delete X before the project */ if ($auth_type == 'fair' && $w['fairs_id'] != $fairs_id) { /* show a blank so everything lines up */ echo ' '; } else { echo "<a onclick=\"delete_winner({$pr->id},{$w['projects_id']});return false;\" href=\"#\" >"; echo "<img style=\"vertical-align:middle\" border=0 src=\"{$config['SFIABDIRECTORY']}/images/16/button_cancel.{$config['icon_extension']}\"></a>"; echo ' '; } $winners[] = $w['projects_id']; } $has_winners = true; echo "({$w['projectnumber']}) {$w['title']}"; echo '<br />'; } else { /* echo " "; echo "<font color=\"red\">No winner(s) specified</font>"; */ } } /* Unlist all the winners we just printed from ALL lists */ if ($editor == true) { echo '<script language="javascript" type="text/javascript">'; foreach ($winners as $w) echo "unlist_winner($w);"; echo '</script>'; } /* Print the select box if we need it */ if ($editor == true && $count < $pr->number) { $n_nom = 0; $n_eli = 0; ?> <br /> <form id="winner_<?= $pr->id ?>"> <select id="projects_select_<?= $pr->id ?>_nom" class="projects_select" style="display:none"> <option value=""><?= i18n('Choose a project') ?></option> <? foreach ($editor_data['projects_nominated'] as $p) { if ($fairs_id != 0 && $p['fairs_id'] != $fairs_id) continue; echo "<option value=\"{$p['id']}\">{$p['projectnumber']} {$p['title']}</option>"; $n_nom++; } ?> </select> <select id="projects_select_<?= $pr->id ?>_eli" class="projects_select" style="display:none"> <option value=""><?= i18n('Choose a project') ?></option> <? foreach ($editor_data['projects_eligible'] as $p) { if ($fairs_id != 0 && $p['fairs_id'] != $fairs_id) continue; echo "<option value=\"{$p['id']}\">{$p['projectnumber']} {$p['title']}</option>"; $n_eli++; print_r($p); } ?> </select> <button id="" onClick="add_winner(<?= $pr->id ?>); return false;"><?= i18n('Add') ?></button> <br /> <?= i18n('List') ?>: <? if ($editor_data['disable_nominated'] == true) $n_nom = 'N/A'; $nom = i18n('All Nominated') . " ($n_nom)"; $el = i18n('All Eligible') . " ($n_eli)"; $cl = ($editor_data['disable_nominated'] == true) ? 'text-link-disabled' : ''; ?> <span id="nom_<?= $pr->id ?>" class="text-link <?= $cl ?>" onClick="set_nom(<?= $pr->id ?>);return false;"><?= $nom ?> </span> - <span id="eli_<?= $pr->id ?>" class="text-link" onClick="set_eli(<?= $pr->id ?>);return false;"><?= $el ?></span> </form> <script language="javascript" type="text/javascript"> <? /* * Start with the nominated list, unless there are none, do * the eligible list by default in that case */ if ($n_nom > 0) echo "set_nom({$pr->id});"; else echo "set_eli({$pr->id});"; ?> </script> <? } } echo '</td><td align="right">'; if ($r['external_additional_materials'] == 1 && $editor == false && $r['award_source_fairs_id'] == NULL) { $d = 'disabled="disabled"'; $a = ''; if ($has_winners == true) { echo "<a href=\"{$_SERVER['PHP_SELF']}?action=additional_materials&award_awards_id={$r['id']}&fairs_id={$fairs_id}\" >"; $d = ''; $a = '</a>'; } echo "<button $d title=\"" . i18n('Download additional material (currently only a nomination form)') . '">' . i18n('Download Additional Materials') . "</button>$a<br/>"; } echo '</td></tr></table>'; } send_footer(); ?>