<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <?php require_once ("include/election-sql.php"); $max_step = 4; if (!isset ($_POST["step"])) { $step = 1; } else { $step = $_POST["step"]; } if ($step > $max_step || $step < 1) { $step = 1; } $result = ""; $error = ""; $handle = elec_sql_open (); if ($handle === FALSE) { $error .= "Can not open the database.<br />\n"; $step = 0; } $election_id = -1; if ($step == 1) { if (isset ($_GET["election_id"]) && is_numeric ($_GET["election_id"])) { $election_id = $_GET["election_id"]; } else if (isset ($_GET["id"]) && is_numeric ($_GET["id"])) { $election_id = $_GET["id"]; //FIXME: Remove this else path after 2009 elections } } else if ($step >= 1) { if (isset ($_POST["election_id"]) && is_numeric ($_POST["election_id"])) $election_id = $_POST["election_id"]; } if ($election_id == -1) { $error .= "Please choose an election/referendum on this <a href=\"./\">list</a>.<br />\n"; $step = 0; } else { $election = elec_get_election ($handle, $election_id); if ($election === FALSE) { $error .= "The specified election/referendum does not exist.<br />\n"; $step = 0; } else if (!elec_election_is_current ($election)) { $error .= "The voting period for the specified ".htmlspecialchars(elec_election_get_type ($election))." starts on ".htmlspecialchars($election["voting_start"])." (UTC) and ends on ".htmlspecialchars($election["voting_end"])." (UTC). It is not possible to vote now.<br />\n"; $step = 0; } } if ($step > 1) { $email = ""; $tmp_token = ""; if (isset ($_POST["email"]) && isset ($_POST["tmp_token"])) { $email = $_POST["email"]; $tmp_token = $_POST["tmp_token"]; } if (!elec_verify_email_tmp_token ($handle, $election_id, $email, $tmp_token)) { $step = 1; $error .= "The e-mail address and token you gave do not match an existing voter, or you have already voted.<br />\n"; } else { $choices = elec_choices_get ($handle, $election_id); if (!elec_verify_elections ($choices)) { $error .= "The ".htmlspecialchars(elec_election_get_type ($election))." is not properly set up.\n"; $step = 0; } } } ?> <head> <link rel="stylesheet" type="text/css" href="vote.css" /> <?php if ($step==2) { ?> <style> .canddata, .prefdata{ width:30%; height: <?php echo 1.8*count($choices); ?>em; background: #E0FFD0; } .canddata ul{ list-style-type: none; list-style-position: inside; } .prefdata ol{ list-style-position: outside; } .canddata ul li:hover, .prefdata ol li:hover{ background: #E0E0E0; cursor: pointer; } </style> <?php } ?> <title>The GNOME Foundation - Votes</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <?php function escape_js_var($var) { $var = preg_replace("([\\\'\"\/])", "\\$1", $var); $var = str_replace("\n", "\\n", $var); $var = str_replace("\r", "\\r", $var); return $var; } if ($step==2) { ?> <script type="text/javascript"> //<![CDATA[ // @licstart The following is the entire license notice for the JavaScript code in this page. // The JavaScript code in this page is free software: you can // redistribute it and/or modify it under the terms of the GNU // General Public License (GNU GPL) as published by the Free Software // Foundation, either version 2 of the License, or (at your option) // any later version. The code is distributed WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. // @licend The above is the entire license notice for the JavaScript code in this page. function addPreference(listItem) { var preferenceList = document.getElementById('preferences'); listItem.parentNode.removeChild(listItem); preferenceList.appendChild(listItem); listItem.setAttribute('onclick', 'removePreference(this)'); } function removePreference(listItem) { var candidateList = document.getElementById('candidates'); listItem.parentNode.removeChild(listItem); candidateList.appendChild(listItem); listItem.setAttribute('onclick', 'addPreference(this)'); } function populateList(){ var candidateList = document.getElementById('candidates'); var listItem; var prefInput; var listItemText; <?php $index=0; foreach ($choices as $choice) { $index++; echo " listItem = document.createElement('li');\n"; echo " listItem.setAttribute('name', 'vote" . escape_js_var($choice["id"]) . "');\n"; echo " listItem.setAttribute('onclick', 'addPreference(this)');\n"; echo " listItemText = document.createTextNode('" . escape_js_var($choice["choice"]) . "');\n"; echo " listItem.appendChild(listItemText);\n"; echo " candidateList.appendChild(listItem);\n\n"; echo " prefInput = document.createElement('input');\n"; echo " prefInput.value = '';\n"; echo " prefInput.name = 'pref$index';\n"; echo " prefInput.id = 'pref$index';\n"; echo " prefInput.type = 'hidden';\n"; echo " document.forms[0].appendChild(prefInput);\n"; echo "\n"; } ?> } function submitPreferences() { // Traverse OL, get name & position of preferences, and for each preference, // set value of hidden input with name prefN to value voteM before submitting var preferenceList = document.getElementById('preferences'); var pref; var i = 0; var index = 0; // Iterate through the list for( i = 0; i < preferenceList.childNodes.length; i++ ) { node = preferenceList.childNodes[i]; // If we have a list item, get its name & set the appropriate hidden input if (node.nodeName.toLowerCase() == 'li') { index++; pref=document.getElementById('pref'+index) pref.value = node.getAttribute('name'); // DEBUG: alert(pref.name + '=' + pref.value); } } } //]]> </script> </head> <body onLoad="populateList()"> <?php } else { // Here $step!=2 ?> </head> <body> <?php } ?> <?php if (isset ($election) && $election !== FALSE) { echo "<h1>".htmlspecialchars($election["name"])."</h1>\n"; } if ($step >= 2) { $votes_array = elec_vote_get_votes_from_post ($choices); $vote = -1; $res = elec_verify_vote_is_valid ($choices, $vote, $votes_array); if ($res != "") { $error .= "The vote you made is not valid: ".htmlspecialchars($res)."<br />\n"; $step = 2; } } if ($step == 4) { /* vote has been confirmed */ require ("include/step4-commit.php"); $result = step4_do (); } else if ($step == 3) { /* confirm vote */ require ("include/step3-confirm.php"); $result = step3_do (); } else if ($step == 2) { /* choose vote */ require ("include/step2-choose.php"); $result = step2_do (); } else if ($step == 1) { /* login */ require ("include/step1-login.php"); $result = step1_do (); } else { if (!isset ($error) || $error == "") $error = "Unknown error.<br />\n"; } if (isset ($handle)) elec_sql_close ($handle); if (isset ($error) && $error != "") { echo "<div class=\"error\">".$error."</div>\n";; echo "<p>If you don't understand the error, you should probably contact the Membership and Elections Committee, which can be reached at <a href=\"mailto:elections@gnome.org\">elections@gnome.org</a>.</p>\n"; } if ($step != $max_step && $step >= 1) { echo "<form action=\"".htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES)."\" method=\"post\""; if ($step == 2) { echo " onsubmit=\"submitPreferences()\""; } echo ">\n"; } echo $result; // already HTML escaped if ($step != $max_step && $step >= 1) { if ($step > 1) { echo " <input type=\"hidden\" name=\"email\" value=\"". htmlspecialchars($email)."\" />\n"; echo " <input type=\"hidden\" name=\"tmp_token\" value=\"".htmlspecialchars($tmp_token)."\" />\n"; } if ($step > 2) { $index=0; foreach ($votes_array as $vote) { $index++; $name = "pref".$index; $value = "vote".$vote; echo " <input type=\"hidden\" name=\"".htmlspecialchars($name)."\" value=\"".htmlspecialchars($value)."\" />\n"; } } echo " <input type=\"hidden\" name=\"election_id\" value=\"".htmlspecialchars($election_id)."\" />\n"; echo " <input type=\"hidden\" name=\"step\" value=\"".htmlspecialchars($step + 1)."\" />\n"; echo " <input type=\"submit\" value=\"Continue to next step\" />\n"; echo "</form>\n"; } ?> </body> </html>