<?php
/**
 * Copyright (c) 2014, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 * Chris Aniszczyk - Initial implementation
 * Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */

require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");

$App = new App();
$Theme = $App->getThemeClass();

$pageTitle = "Community Poll Vote";
$Theme->setPageTitle($pageTitle);
$Theme->setPageKeywords("Eclipse Simultaneous Release 2016");
$Theme->setPageAuthor("Chris Aniszczyk");

// Polls are good for 3 months!
$App->usePolls();

// Poll 1
$Poll = new Poll(11, "Vote: What is your favorite name for the 2016 Eclipse Simultaneous Release?");
$Poll->addOption(1, "Naboo");
$Poll->addOption(2, "Naiad");
$Poll->addOption(3, "Nano");
$Poll->addOption(4, "Narvi");
$Poll->addOption(5, "Nash");
$Poll->addOption(6, "Neo");
$Poll->addOption(7, "Neptune");
$Poll->addOption(8, "Newton");
$Poll->addOption(9, "Nibiru");
$Poll->addOption(10, "Nova");
// $Poll->noGraph(); # uncomment to disable bar graph
$pollHTML = $Poll->getHTML();

$Poll->requireLogin(); // no anonymous votes

// Paste your HTML content between the markers!
ob_start();
?>
<div id="maincontent">
  <h1><?php print $pageTitle ?></h1>
  <h2>Help decide the name for the 2016 Eclipse Simultaneous Release!</h2>
  <p>
    There will be an Eclipse Simultaneous Release on the fourth Wednesday of
    June, 2016. But what to call it? Please vote, for your favorite name for the
    2016 release. Remember, the simultaneous release name is an informal <i>marketing
      name</i>. It should be recognizable, pronounceable, relatively distinct
    and not obvious to confuse with other software or trademarks. Be sure to
    consider how it sounds in context, such as...
  </p>
  <p>
    <i>"Hey, go download the <b>Eclipse xyz Release</b> and see all the cool
      stuff in there!"
    </i>
  </p>
  <p>
    The following list was arrived at with input from the community (see <a
      href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=453927"
    >bug 453927</a>) and discussions inside the Eclipse Planning Council.
  </p>
  <div style="padding: 5px; margin-left: 1%; margin-right: 1%;">
    <p>
      Naboo: 8 %<br /> Naiad: 1 %<br /> Nano: 2 %<br /> Narvi: 3 %<br /> Nash: 2
      %<br /> Neo: 8 %<br /> Neptune: 38 %<br /> Newton: 11 %<br /> Nibiru: 2 %<br />
      Nova: 25 %<br /> <b>Total votes: 367</b><br />
    </p>
  </div>
  <p>Thanks for your vote and your help with Eclipse! The poll is closed and
    names are under review.</p>
  <p>
    <b>Note: The Planning Council reserves the right to make the final decision,
      in case some popularly voted item is later found to be unsuitable for some
      reason.</b></p>
  <p>Current time: <?php echo date("d/m/y : H:i (T)", time()); ?></p>
</div>
<?php
$html = ob_get_contents();
ob_end_clean();

$Theme->setHtml($html);
$Theme->generatePage();

