<?php
/*******************************************************************************
 * Copyright (c) 2010, 2013 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Bjorn Freeman-Benson (Eclipse Foundation)- initial API and implementation
 *    Wayne Beaton (Eclipse Foundation)- Bug 240688
 *    Wayne Beaton and Denis Roy (EF) - Bug 306373 (Git support)
 *    Wayne Beaton - Bug 414884 (GitHub as an option)
 *******************************************************************************/
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App = new App();
$Nav = new Nav();
$Menu = new Menu();
include($App->getProjectCommon());

require_once(dirname(__FILE__) . "/classes/common.php");

/* 221934 - this page to remain on eclipse.org */

$pageTitle 		= "New Project Provisioning Request";
$pageKeywords	= "";
$pageAuthor		= "";
include( '_commonLeftNav.php' );

ob_start();

//	$sql = "
//		SELECT ProjectID FROM Projects where ProjectPhase = 'Proposal'
//		ORDER By ProjectID";
//	

if (isset($_GET['id'])) {
	if (is_valid_project_name($_GET['id'])) {
		$id = $_GET['id'];
	}
}

if (isset($id)) {
	$project_help = "If the project id ($id) is not correct, please contact
		the <a href=\"mailto:emo@eclipse.org\">EMO</a> for assistance.";
	$project_select = "$id<input type=\"hidden\" name=\"yourProject\" value=\"$id\"/>";
} else {
	$sql = "SELECT 
				r.ProjectId as ProjectID
			FROM 
				ProjectReviews as r 
				join ProjectReviewStatus as s on (r.id = s.id)
				join (select ID, Max(value) as v from ProjectReviewStatus group by id) as m on (m.Id = r.id and m.v = s.value)
			WHERE
				ProjectID is not null 
				and Status = 'Waiting Provisioning'
			ORDER By ProjectId";
	
	$result = $App->foundation_sql($sql);

	if (!mysql_num_rows($result)) {
		$project_help = "There are no currently no projects waiting to be provisioned.
		If this is an error, please contact the <a href=\"mailto:emo@eclipse.org\">EMO</a> 
		for assistance.";
		
		$project_select = "<em>No projects to provision!</em>";
	} else {
	
		$project_help = "If the id for your project is not shown below, please contact
			the <a href=\"mailto:emo@eclipse.org\">EMO</a> for assistance.";
		$project_select = "<select name=\"yourProject\" style=\"width:40em\">";
		while($row = mysql_fetch_assoc($result)) {
			$projectId = $row['ProjectID'];
			$project_select .= "<option>$projectId</option>";
		}
		$project_select .= "</select>";
	}
}

?>
<style> .gray { color: gray } </style>
<script language="javascript">

	function ValidForm() {
		var boolOK = true;
		var committerOK = false;
        var alertmsg = "";

		if( document.project.yourName.value == ""){
		  boolOK = false;
		  alertmsg += 'Your name is a required field. Please try again.\n\r';
		}
		if( document.project.yourEmail.value == ""){
		  boolOK = false;
		  alertmsg += 'Your Email is a required field. Please try again.\n\r';
		}
		if( document.project.yourPhone.value == ""){
		  boolOK = false;
		  alertmsg += 'Your phone number is a required field. Please try again.\n\r';
		}
		if( !document.project.yourDevelopmentProcess.checked ){
		  boolOK = false;
		  alertmsg += 'Read and agreeing to follow the development process is required.\n\r';
		}
		if( document.project.yourProject.value == ""){
		  boolOK = false;
		  alertmsg += 'The project name is a required field. Please try again.\n\r';
		}
		// Regular expression below should allow 1,2, or 3 level deep project identifiers.
		if(!document.project.yourProject.value.match(/^<?php echo ProjectNamePattern; ?>$/)){
		  boolOK = false;
		  alertmsg += 'Your project name must be of the form \'toplevel[.project[.project]]\'\n\r';
		}
        if( (document.project.committerName1.value != "") && (document.project.committerEmail1.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName2.value != "") && (document.project.committerEmail2.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName3.value != "") && (document.project.committerEmail3.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName4.value != "") && (document.project.committerEmail4.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName5.value != "") && (document.project.committerEmail5.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName6.value != "") && (document.project.committerEmail6.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName7.value != "") && (document.project.committerEmail7.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName8.value != "") && (document.project.committerEmail8.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName9.value != "") && (document.project.committerEmail9.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName10.value != "") && (document.project.committerEmail10.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName11.value != "") && (document.project.committerEmail11.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName12.value != "") && (document.project.committerEmail12.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName13.value != "") && (document.project.committerEmail13.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName14.value != "") && (document.project.committerEmail14.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName15.value != "") && (document.project.committerEmail15.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName16.value != "") && (document.project.committerEmail16.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName17.value != "") && (document.project.committerEmail17.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName18.value != "") && (document.project.committerEmail18.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName19.value != "") && (document.project.committerEmail19.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName20.value != "") && (document.project.committerEmail20.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName21.value != "") && (document.project.committerEmail21.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName22.value != "") && (document.project.committerEmail22.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName23.value != "") && (document.project.committerEmail23.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName24.value != "") && (document.project.committerEmail24.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName25.value != "") && (document.project.committerEmail25.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName26.value != "") && (document.project.committerEmail26.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName27.value != "") && (document.project.committerEmail27.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName28.value != "") && (document.project.committerEmail28.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName29.value != "") && (document.project.committerEmail29.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName30.value != "") && (document.project.committerEmail30.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName31.value != "") && (document.project.committerEmail31.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName32.value != "") && (document.project.committerEmail32.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName33.value != "") && (document.project.committerEmail33.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName34.value != "") && (document.project.committerEmail34.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName35.value != "") && (document.project.committerEmail35.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName36.value != "") && (document.project.committerEmail36.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName37.value != "") && (document.project.committerEmail37.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName38.value != "") && (document.project.committerEmail38.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName39.value != "") && (document.project.committerEmail39.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName40.value != "") && (document.project.committerEmail40.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName41.value != "") && (document.project.committerEmail41.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName42.value != "") && (document.project.committerEmail42.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName43.value != "") && (document.project.committerEmail43.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName44.value != "") && (document.project.committerEmail44.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName45.value != "") && (document.project.committerEmail45.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName46.value != "") && (document.project.committerEmail46.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName47.value != "") && (document.project.committerEmail47.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName48.value != "") && (document.project.committerEmail48.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName49.value != "") && (document.project.committerEmail49.value != "" ) )
		  committerOK = true;
		if( (document.project.committerName50.value != "") && (document.project.committerEmail50.value != "" ) )
		  committerOK = true;

		if( !committerOK ){
	      alertmsg += 'You need to specify at least one committer';
	      boolOK = false;
		}

		if( !boolOK ){
		  alert(alertmsg);
		}

		if(boolOK) {
			document.project.submit();
		}
		return boolOK;
	}


		</script>
    <div id="maincontent">
	<div id="midcolumn">
        <h1><?= $pageTitle ?></h1>

<form name="project" method="POST" action="submit_project_provisioning_request.php" onsubmit="return ValidForm()">


<table border=0 cellspacing=5 cellpadding=2 width="100%" >
  <tr>
    <td colspan="2">
    
    <p>To be completed by a Project Lead of the new project, consulting with the PMC if necessary.</p>
    
	<p>Updated April 4, 2011</p>
		    <p> This form is used to request the infrastructure for projects that have completed a successful Creation Review and are beginning the Validation Phase of their project
		    (under an existing Top-Level Project) at eclipse.org. These documents follow the Eclipse Project Lifecyle as described in the
            <a href="/projects/dev_process/">Eclipse Development Process</a> and are intended to complement the information
            provided there. In general all inquiries related to project provisioning can be sent to the
            <a href="mailto:emo@eclipse.org"> EMO</a>.
		          </p>
	
            <p>After a successful Creation Review, the project enters the Validation Phase and 
            additional infrastructure is created to support the initial work on the project:</p>
            <ul>
              <li>VCS commit rights</li>
              <li>download site</li>
              <li>a developer mailing list and</li>
              <li>the project website</li>
            </ul>
		    <p> Ongoing changes to the project's core infrastructure are expected especially during the Validation Phase, as the project matures. Please consult the
            Project Implementation Phase Provisioning document for pointers on how to implement these changes. </p>
		    <p> <span style="background-color: #FFFFCC">This form is processed
            manually. Thus we request that you reduce the sysadmin overhead by
            only submitting complete data. Please wait until you have all the
            answers and then submit the completed form once. Multiple partial
            submission will (unfortunately) just confuse the situation. Thanks
            for your understanding.</span> </p>
		    <p>If you have any questions, please send an email to the <a href="mailto:emo@eclipse.org"> EMO</a>. </p>
		</td>
		</tr>
		<tr>
		  <td colspan="2">&nbsp;</td>
		  </tr>
		<tr><td colspan="2">
            <hr>
            <strong>Your Info</strong><br></td></tr>
    	<tr><td width="22%" align="right">Name: </td><td width="78%"><input type="text" size="60" name="yourName"></td></tr>
    	 <tr>
    	   <td align="right">E-mail: </td>
    	   <td><input type="text" size="60" name="yourEmail"></td>
  	   </tr>
    	 <tr>
    	   <td align="right">Phone number: </td><td><input type="text" size="40" name="yourPhone"></td></tr>
    	 <tr>
    	   <td align="right">Development Process </td><td><input type="checkbox" name="yourDevelopmentProcess" value="I AGREE">
            I have read and will follow the <a href="/projects/dev_process/">Eclipse
            Development Process</a></td></tr>
        <tr>
          <td colspan="2">
            <hr>
            <strong>Project Info</strong>
            <p><?= $project_help ?></p>
		  </td>
        </tr>
        <tr>
		   <td align="right">New Eclipse Project id: </td>
		   <td><?= $project_select ?></td>
        </tr>
    	 <tr>
    	   <td colspan=2>&nbsp;</td>
  	   </tr>
        <tr>
		  <td colspan="2">
            <hr>
            <strong>Code Repository</strong><br></td>
        </tr>
        <tr>
        <td colspan="2"><p>Decide whether the project is going to use Git, or SVN for its source code repository. 
        You should note that we 
		intend to deprecate SVN at some point in the future. </p>
        </td></tr>
        <tr>
          <td colspan="2" align="center"><p><input type="radio" name="source_code_repository" value="Git" checked> Git &nbsp;&nbsp;
          <input type="radio" name="source_code_repository" value="GitHub"> GitHub &nbsp;&nbsp;
          <input type="radio" name="source_code_repository" value="SVN"> SVN &nbsp;&nbsp;</p>
          <p>Note that all projects must submit an <a href="http://wiki.eclipse.org/Development_Resources/Initial_Contribution">Initial Contribution</a>
          to the IP Team <em>before</em> any code can be checked in.</p>
          <p>For projects that intend to use <em>GitHub</em>, tag your repository as described in 
          <a href="https://wiki.eclipse.org/Social_Coding/Hosting_a_Project_at_GitHub">Hosting a Project at GitHub</a> before submitting this form.
          Specify the URLs of existing repositories to be moved (one per line):<br/>
          <textarea name="github_repositories" rows="4" cols="60">https://github.com/yourname/repository</textarea></p>
          </td>
          
        </tr>

		<tr>
		  <td colspan="2">
            <hr>
            <strong>Committer List</strong><br></td>
		  </tr>
		<tr>
          <td colspan="2">
            <p align="left">A list of the initial committers for the project. This list should
            reflect the project creation document. Only include committers that appear in the document.
            If you need to add more committers, please do so <em>after</em> the project has been
            provisioned via 
            <a href="http://wiki.eclipse.org/Development_Resources/HOWTO/Nominating_and_Electing_a_New_Committer">committer election</a>. 
            <span style="background-color: #FFFFCC">Note
            that each committer must have completed the e-forms and paper-forms as specified
            in the <a href="/projects/dev_process/new-committer.php#Paperwork">new
            committer process</a>. The project
            cannot
            be provisioned without at least one committer and you cannot be a
            committer until you have completed these forms and agreements.</span></p>
          </td>
		  </tr>
		<tr>
          <td colspan="2">
            <table border="0" width="100%">
              <tr>
                <td width="25%">Name</td>
                <td width="25%">Email Address</td>
              </tr>
<script language="JavaScript">
	function toggleDisplay(id){
		me = document.getElementById(id);
		if (me.style.display=="none"){
			me.style.display="";
		}
		else {
			me.style.display="none";
		}
	}
</script>
<?php
	for( $i = 1; $i <= 50; $i++ ) {
?>
              <tr id="committerRow<?= $i ?>" <?php
              if( $i != 1 ) {
              	?>style="display: none; " <?php
              }
              ?>>
                <td valign="top" align="left"><?= $i ?>. <input type="text" size="30" name="committerName<?= $i ?>">
                <?php if( $i < 50 ) { 
                	?><br><span id="committerPlus<?= $i ?>">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a 
                style="font-weight: normal" onclick="toggleDisplay('committerRow<?= $i + 1 ?>');toggleDisplay('committerPlus<?= $i ?>');"><img src="/home/categories/images/plus.gif"/><font size="-1"> another committer</font></a></span>
                </td>
                <td valign="top" align="left"><input type="text" size="40" name="committerEmail<?= $i ?>"><br>
                  <?php } ?>
                  <input type="checkbox" name="committerLead<?= $i ?>" value="YES" 
               	    <?php if( $i <= 1 ) { ?>
                  	checked
                  	<?php } ?>
                  >Project Lead
                </td>
              </tr>
<?php
	}
?>
            </table>
          </td>
		  </tr>
        <tr>
    	   <td colspan=2>&nbsp;</td>
        </tr>

        <tr>
		  <td colspan="2">
            <hr>
            <strong>Project Website</strong><br></td>
        </tr>
        <tr>
          <td colspan="2"><p>Each project has a web presence on www.eclipse.org. The content for a
        project web pages is stored in a Git repository.
        The repository is automatically checked out to www.eclipse.org, and thereby
        enables website authors to use HTML and PHP to author websites directly
        on www.eclipse.org.</p>
     <p>
        A directory of the form www.eclipse.org/[shortname] will be created for each new project. This also becomes the url for the
        project home page. A default template will be provided.</p>
        
        <p>For instructions on setting up your Eclipse development environment to edit your project website, 
        please see <a href="http://wiki.eclipse.org/Phoenix_Documentation">Phoenix Documentation</a>.</p>
    </td>
		</tr>
<tr>
		  <td colspan="2">
            <hr>
            <strong>Project Proposal</strong><br></td>
</tr>
<tr>
          <td colspan="2">The project proposal is automatically archived in the
            proposals archive.</td>
</tr>
<tr>
		  <td colspan="2">
            <hr>
            <strong>Project Forum</strong><br></td>
</tr>
<tr>
          <td colspan="2">
          Projects typically have a <a href="/forums">forum</a> for user discussions.
      </td>
</tr>
<tr>
		  <td colspan="2">
            <hr>
            <strong>Project Mailing Lists</strong><br></td>
</tr>
<tr>
          <td colspan="2">
New projects typically have a single <code> [shortname]-dev@</code> mailing list for developer discussion.
A new project may choose to have additional mailing lists of the form
<code>[shortname]-[component]-dev@</code>. The short name can be an abbreviation
of the Descriptive Name, or an Acronym, or the project's optional Nickname. The <i>short name</i> appears on <a href="/mail/">the
            mailing list main page</a>.
            You will need to provide
            the <i>long description</i>
            using the <a href="/projects/dev_process/project-status-infrastructure.php">project status infrastructure</a>
</td>
</tr>
<tr>
          <td colspan="2">
            <table border="0" width="100%">
              <tr>
                <td width="25%">Mailing List Name</td>
                <td width="65%">Short Description</td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="30" name="mailingList1" value="[shortname]-dev"></td>
                <td width="65%" valign="top" align="left"><input type="text" size="40" name="shortDescription1"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="30" name="mailingList2"></td>
                <td width="65%" valign="top" align="left"><input type="text" size="40" name="shortDescription2"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="30" name="mailingList3"></td>
                <td width="65%" valign="top" align="left"><input type="text" size="40" name="shortDescription3"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="30" name="mailingList4"></td>
                <td width="65%" valign="top" align="left"><input type="text" size="40" name="shortDescription4"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="30" name="mailingList5"></td>
                <td width="65%" valign="top" align="left"><input type="text" size="40" name="shortDescription5"></td>
              </tr>
            </table>
          </td>
</tr>
<tr>
		  <td colspan="2">
            <hr>
            <strong>Builds</strong><br></td>
</tr>
<tr>
          <td colspan="2">
        <p>The project leads are responsible for builds and maintenance on eclipse.org.
        The frequency of these is dependent on the project needs.
        There are three main options for builds at Eclipse:</p>
        <ul>
        <li>Use the <a href="http://wiki.eclipse.org/CBI">Common Build Infrastructure</a> (CBI).</li>
        <li>Use build.eclipse.org as a standalone build server.</li>
        <li>Use your own infrastructure. Run builds offsite using source code from eclipse.org</li>
        </ul>
          </td>
</tr>
<tr>
		  <td colspan="2">
            <hr>
            <strong>Downloads</strong><br></td>
</tr>
<tr>
          <td colspan="2"><p>Downloadable files (i.e. ZIP files, JARs) must be hosted at download.eclipse.org.
          For mirroring purposes, the link to download
      a file is http://www.eclipse.org/downloads/download.php?file=/path/to/filename.
      This will allow mirror site selection based on the file requested. We ask
      that you not link directly to &quot;download.eclipse.org&quot;.</p>
      <p>Because the downloads space is mirrored to several servers worldwide,
        we ask you use this space wisely, taking extra care when placing large
        files in this space, and performing regular file cleanups. Large directories
        use bandwidth while mirroring and deter new mirror sites because of high
        disk space requirements. Also, HTML and PHP files must not be placed on
        the download server.</p>
      <p>Uploads to this space are via SFTP or SCP. Use any SFTP or SCP client,
        such as CoreFTP or WinSCP, to connect to download.eclipse.org.
        If you are using <a href="http://wiki.eclipse.org/Athena_Common_Build" target="_blank">Athena Common Builder</a>, please see the Athena documentation for
        instruction on moving your build output to the server.</p>
        </td>
</tr>
<tr>
		  <td colspan="2">
            <hr>
            <strong>Bugzilla</strong><br></td>
</tr>
<tr>
          <td colspan="2">
        A Bugzilla &quot;product&quot; is created for the new project.
        Underneath that product are a set of &quot;components&quot;. There are
        two schemes for the component owners - some projects choose one, some
        choose the other:
        <ol>
          <li>The component owners are actually humans - project committers as
            listed above. With this scheme, the component owner receives
            notifications of new bugs for this component.&nbsp;&nbsp;<br/>
            <br/> If you
            choose this scheme, enter the component owners' email addresses. The
            components owners must already have <span style="background-color: #FFFFCC">existing</span>
            Bugzilla user accounts.</li>
          <li>The component owners are abstract &quot;inbox&quot; entities. With
            this scheme, anyone who wants to receive notifications of new bugs
            for this component uses the Bugzilla &quot;watch this address&quot;
            feature to watch the inbox email address. Thus plus for this scheme
            is that it is easy to change component owners and have multiple
            owners (just have them watch the inbox address); the minus is that
            if nobody is watching the inbox address, the notifications go to
            /dev/null.<br/>
            <br/>If you
            choose this scheme, enter the inbox email addresses in form
            &quot;[short name].[component name]-inbox@eclipse.org&quot;. These
            bugzilla accounts do <i>not</i> have to exist (and, in fact, they
            should not exist).</li>
        </ol>

        <p><img border="0" src="/projects/dev_process/bugzillacomponent.jpg" width="355" height="113"></p>


  </td>
</tr>
<tr>
          <td colspan="2">
            <table border="0" width="100%">
              <tr>
                <td width="25%">Component Name</td>
                <td width="25%"> Description</td>
                <td width="50%">Component Owner's Email Address</td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="25" name="component1"></td>
                <td width="25%" valign="top" align="left"><input type="text" size="35" name="componentDescription1"></td>
                <td width="50%" valign="top" align="left"><input type="text" size="35" name="componentOwner1"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="25" name="component2"></td>
                <td width="25%" valign="top" align="left"><input type="text" size="35" name="componentDescription2"></td>
                <td width="50%" valign="top" align="left"><input type="text" size="35" name="componentOwner2"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="25" name="component3"></td>
                <td width="25%" valign="top" align="left"><input type="text" size="35" name="componentDescription3"></td>
                <td width="50%" valign="top" align="left"><input type="text" size="35" name="componentOwner3"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="25" name="component4"></td>
                <td width="25%" valign="top" align="left"><input type="text" size="35" name="componentDescription4"></td>
                <td width="50%" valign="top" align="left"><input type="text" size="35" name="componentOwner4"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="25" name="component5"></td>
                <td width="25%" valign="top" align="left"><input type="text" size="35" name="componentDescription5"></td>
                <td width="50%" valign="top" align="left"><input type="text" size="35" name="componentOwner5"></td>
              </tr>
              <tr>
                <td width="25%" valign="top" align="left"><input type="text" size="25" name="component6"></td>
                <td width="25%" valign="top" align="left"><input type="text" size="35" name="componentDescription6"></td>
                <td width="50%" valign="top" align="left"><input type="text" size="35" name="componentOwner6"></td>
              </tr>
            </table>
          </td>
</tr>
        <tr>
          <td colspan="2">
            <hr>

    </td>
		</tr>
		<tr><td colspan=2>
		Math question: (5 - 1) divided by two: <input type="text" name="math" value="" />
	</td></tr>
		<tr><td colspan=2>
		<input type="hidden" name="state" value="submit" />
	    <input type="submit" name="Submit" value="Submit" />
		</td></tr>
  <tr>
    <td colspan="2">


</td></tr>
  <tr>
    <td colspan="2">

 FYI: The project is 'created' in three steps:
 <ol>
  <li>First the code repository, user accounts, mailing-list, master home page (links to your page in the website), download space on download.eclipse.org, and Bugzilla
    components are created.</li>
  <li>Then the developer mailing lists and the hosting Top-Level Project main page are connected to
    the project</li>
  <li>The project lead creates the initial website and the
  <a href="/projects/dev_process/project-status-infrastructure.php">project status information files</a>.
  <li>And then, voil&agrave;, the project is &quot;live&quot;.</li>
 </ol>
 <p>This sequencing ensures that all the core infrastructure is ready and that the data and an initial project structure are in place, before the project goes
 live.</p>
</td></tr></table>
</form>
</div></div>

<?php
	# Paste your HTML content between the EOHTML markers!
	$html = ob_get_contents();
	ob_end_clean();

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>

