<?php 
function get_fields_names($App,$release){
		return array('basics','Planning','IP-Documentation','Release-Review','commonrepo','Communication-and-Availability','API','Message-Bundles','Version-Numbering','OSGi-Bundle-Format','Execution-Environment','Signing','Jarred-Bundles','Re-use','Optimization','Provide-p2-Repository','Capabilities','Support-Translations','Excel-in-NL-Support','Branding','Do-No-Harm','License-Text-Consistency','be_a_good_eclipse_citizen','Engage-Community','Usability','Performance','Test-Localization','Enable-Use-with-All-Languages','Builds','Ramp-Down-Planned-and-Defined','Accessibility','Unit-Tests','API-Policy-Defined-and-Documented','Retention-Policy','Project-Metrics');
		
		/*
		 * fetch all the long/short descriptions for the tracker fields
		 */
		$query = "select * from simultaneous_release_tracker_fields where therelease = '".addslashes($release)."'";
		$res = $App->portal_sql($query);
		$field_descriptions = array();
		while($row = mysql_fetch_assoc($res)){
			$field_descriptions[$row['field']] = $row;
		}
		return $field_descriptions;
}

function get_projects_tracking_by_parent($App){
	$dbhc = new DBConnectionPortalRO();
	$dbh = $dbhc->connect();
	$query = "select * from simultaneous_release_tracker_project_relationships";
	$res = mysql_query($query,$dbh);
	
	/*
	 * fetch all the project tracking with thier parent
	 */
	$projects_tracking_with_parent = array();
	while($row = mysql_fetch_assoc($res)){
		$projects_tracking_with_parent[$row['projectid']] = $row['tracked_by_projectid'];
	}
	
	if($_GET['debug'] == "true"){
		print "<pre>projects_tracking_with_parent<br>";
		print_r($projects_tracking_with_parent);
	}
	
	return $projects_tracking_with_parent;
}
 
function get_projects_tracking($App){
	$projects_tracking_with_parent = get_projects_tracking_by_parent($App);
	/*
	 * fetch all the project data
	 */
	$query = "select 
				distinct ProjectID 
			  from 
			  	ProjectInfo, 
			  	ProjectInfoValues 
			  where 
			  	MainKey = 'simultaneousrelease' 
			  and 
			  	Subkey = 'helios' 
			  and 
			  	Value = 1 
			  and 
			  	ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
			  order by ProjectID
			  	";
	$res = $App->eclipse_sql($query);
	$projects_tracking = array();
	while($row = mysql_fetch_assoc($res)){
		if(isset($projects_tracking_with_parent[$row['ProjectID']])){
			continue;
		}
		$projects_tracking[] = $row['ProjectID'];
	}
	if($_GET['debug'] == "true"){
		print "<pre>projects_tracking<br>";
		print_r($projects_tracking);
	}
	
	return $projects_tracking;	
	
	#todo - get read access for this script worked out
	/*
	 * fetch all the project data
	$query = "select * from Projects where ProjectID in ('".implode("','",$projects_tracking)."')";
	$res = $App->eclipse_sql($query);
	$projects = array();
	while($row = mysql_fetch_assoc($res)){
		$projects[$row['ProjectID']] = $row;
	}	
		
	return $projects;
	 */
	
}

function get_project_tracking($App,$projectid){
	$dbhc = new DBConnectionPortalRO(); 
	$dbh = $dbhc->connect();
	/*
	 * fetch all the tracking data for this project
	 */
	$query = "select * from simultaneous_release_tracker where projectid = '".addslashes($projectid)."'";
	$res = mysql_query($query,$dbh);	
	//	$res = $App->portal_sql($query);
	$rows = array();
	while($row = mysql_fetch_assoc($res)){
		$rows[$row['track_key']] = $row['track_value'];
		$exception = $row['track_key']."_exception";
		$rows[$exception] = $row['exception'];
	}

	if($_GET['debug'] == "true"){
		print "<pre>project_tracking for: $projectid<br>";
		print_r($rows);
	}
	
	// WTB Experimental
//	$projectId = addslashes($projectid);
//	$sql = "SELECT distinct
//			r.ProjectName, r.ProjectId, 
//			SlidesURL, IPLogURL,
//			s.status as Status, s.value as Date 
//		FROM 
//			ProjectReviews as r 
//			left join ProjectReviewStatus as s on (r.id = s.id and s.Status = 'IP Log Posted')
//		WHERE
//			reviewName = 'Helios Release'
//			and r.ProjectId=$projectid";
//	
//	$result = $App->foundation_sql($sql);
//	while ($row = mysql_fetch_assoc($result)) {
//		$rows['ip_log_posted'] = $row['Status'] == 'IP Log Posted' ? 'on' : '';
//		$rows['ip_log_url'] = $row['IPLogURL'];
//		$rows['slides_url'] = $row['SlidesURL'];
//	}
	
	
	return $rows;
}


function get_fields(){
	$thefields = array();
	//		Do the basics ... early
		$fields = array();
		$thefields['basics'] = array (
			'fields' => $fields,
			'name' => 'Basic Requirements',
			'one_line_summary' => 'The requirements and conditions stated in this section are the basic minimum required for a project to claim they are part of the yearly Simultaneous Release.'
		);
		
		/*
		 * PLANNING URL
		 */
		$fields = array();
		$fields[] = array ('key'=>'planning_url', 'label'=>'URL', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
		$thefields['Planning'] = array (
			'fields' => $fields,
			'name' => 'Planning',
		);

		/*
		 * IP DOCUMENTATION
		 */
		$fields = array();
		$fields[] = array ('key'=>'ip_documentation_IP_URL', 'label'=>'URL to IP Log', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
		$thefields['IP-Documentation'] =array (
			'fields' => $fields ,
			'name' => 'IP-Documentation',
		);
		
		/*
		 * RELEASE REVIEW
		 */
		$fields = array();
		$fields[] = array ('key'=>'release_review_PMC_executive_summary', 'label'=>'URL to PMC\'s Executive Summary (by RC2)', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
//		$fields[] = array ('key'=>'release_review__checklist_url', 'label'=>'URL to checklists', 'type'=>'textfield','check'=>'req noquery','allow_excpetion' => true);
		$thefields['Release-Review'] =array (
			'fields' => $fields ,
			'name' => 'Release-Review',
		);
		
		
		/*
		 * Common Repo
		 */
		$fields = array();
		$thefields['commonrepo'] = array (
			'fields' => $fields,
			'name' => 'Common Repository Requirements',
		);
		
		/*
		 * Communication and Availability
		 */
		$fields = array();
		$fields[] = array ('key'=>'communication_and_availability', 'label'=>'Subscriptions confirmed and contact info sent.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'communication_and_availability_releng_contacts', 'label'=>'Releng Contact Names. [the expectation being names only, not contact info]', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
		$thefields['Communication-and-Availability'] =array (
			'fields' => $fields ,
			'name' => 'Communication-and-Availability',
		);
		
		/*
		 * API
		 */
		$fields = array();
		$fields[] = array ('key'=>'bugzilla_api_clean', 'label'=>'Bugzillas open, or can "prove" API clean.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'url_api_reports', 'label'=>'Link to API check reports', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'list_bugzilla_api_deviations', 'label'=>'List of Bugilla\'s open for API deviations', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
		$thefields['API'] =array (
			'fields' => $fields ,
			'name' => 'API',
			'one_line_summary' => 'Projects should leverage only published APIs of dependencies.',
			'details' => 'Projects should leverage only published APIs of dependencies. All deviations must be documented in bugzillas. These bugzillas may be of the type that a dependent project should provide a required API, or of the type that a consuming project must move to some API that already exists. Note that technically there is no obligation for consumed projects to provide API that is requested ... that depends on many things ... but the main goal of requiring these bugzilla entries is to provide some documentation and measure of the amount of risk associated with non-API use.'
		);
		
		/*
		 * Message Bundles
		 */
		$fields = array();
		$fields[] = array ('key'=>'message_bundles_used_throughout', 'label'=>'Message Bundles used throughout.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
//		$fields[] = array ('key'=>'message_bundles_exception', 'label'=>'Message Bundle Exception. Give description of technical reasons, and link to Planning Councils approval.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Message-Bundles'] =array (
			'fields' => $fields ,
			'name' => 'Message-Bundles',
			'one_line_summary' => 'Projects must use Eclipse message bundles unless there are technical reasons not to.',
			'details' => 'Projects must use <a target="_blank" href="http://help.eclipse.org/galileo/topic/org.eclipse.platform.doc.isv/reference/misc/message_bundles.html">Eclipse message bundles</a> unless there are technical reasons not to.'
		);
		
		/*
		 * Version Numbering
		 */
		$fields = array();
		$fields[] = array ('key'=>'standard_versioning_used', 'label'=>'Standard Versioning used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
//		$fields[] = array ('key'=>'standard_versioning_exceptions', 'label'=>'Exceptions', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
		$thefields['Version-Numbering'] =array (
			'fields' => $fields ,
			'name' => 'Version-Numbering',
			'one_line_summary' => 'Projects must use 4-part version numbers.',
			'details' => 'Projects must use <a target="_blank" href="http://wiki.eclipse.org/Version_Numbering">4-part version numbers</a>.',
		);
		
		/*
		 * OSGi bundle format
		 */
		$fields = array();
		$fields[] = array ('key'=>'using_osgi_bundle_format', 'label'=>'OSGi bundle format used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['OSGi-Bundle-Format'] =array (
			'fields' => $fields ,
			'name' => 'OSGi-Bundle-Format',
			'one_line_summary' => 'All plug-ins (bundles) must use the true bundle form.',
			'details' => 'All plug-ins (bundles) must use the true bundle form. That is, provide a manifest.mf file, and not rely on the plugin.xml file being \'translated\' into a manifest.mf file at initial startup. With that, empty plugin.xml files in the presence of a manifest.mf file should not be included in a bundle. (For some old history, see <a target="_blank" href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130598">bug 130598</a>.)'
		);
			
		/*
		 * Execution Environment
		 */
		$fields = array();
		$fields[] = array ('key'=>'using_bundle_required_execution_environment', 'label'=>'Bundle Required Execution Environment used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Execution-Environment'] =array (
			'fields' => $fields ,
			'name' => 'Execution-Environment',
			'one_line_summary' => 'All plug-ins must correctly list their Bundle Required Execution Environment (BREE).',
			'details' => 'All plug-ins must <a target="_blank" href="http://wiki.eclipse.org/Execution_Environments">correctly list their Bundle Required Execution Environment (BREE)</a>.',
		);
		
		/*
		 * Signing
		 */
		$fields = array();
		$fields[] = array ('key'=>'using_signing', 'label'=>'Signing used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Signing'] =array (
			'fields' => $fields ,
			'name' => 'Signing',
			'one_line_summary' => 'Projects must use signed plugins using the Eclipse certificate</a>.',
			'details' => 'Projects must use <a target="_blank" href="http://wiki.eclipse.org/JAR_Signing">signed plugins using the Eclipse certificate</a>.',
		);
		
		
		/*
		 * Jarred Bundles
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_jarred_bundles', 'label'=>'Jarred Bundles used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Jarred-Bundles'] =array (
			'fields' => $fields ,
			'name' => 'Jarred-Bundles',
			'one_line_summary' => 'Projects must use jarred plug-ins.',
			'details' => 'Projects must use jarred plug-ins (with unpack=false) unless authorized by the planning council for technical exceptions. Also, nested jars should be avoided if possible since it creates problems for projects that has dependencies to such plug-ins. The OSGi runtime is fine with it but the PDE environment is not able to handle classpaths that contain nested jars.'
		);
		
		/*
		 * Re-use
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_reuse_orbit', 'label'=>'Re use from Orbit.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Re-use'] =array (
			'fields' => $fields ,
			'name' => 'Re-use',
			'one_line_summary' => 'Re-use and share common third party jars.',
			'details' => 'Re-use and share common third party jars. Any third-party plug-ins that are common between projects must be consumed via <a traget="_blank" href="http://www.eclipse.org/orbit">Orbit</a>; a Simultaneous Release will not have duplicate third-party libraries (note that this only applies to identical versions of the libraries; thus if project A requires foo.jar 1.6 and project B uses foo.jar 1.7, that\'s ok, as long as it is required and has a documented reason).'
		);
		
		
		/*
		 * Optimization
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_optimize_p2_repositories', 'label'=>'Optimize p2 repositories used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Optimization'] =array (
			'fields' => $fields ,
			'name' => 'Optimization',
			'one_line_summary' => 'Projects must optimize their p2 repositories to reduce bandwidth utilization and provide a better install and update experience for users.',
		);
		
		 
		/*
		 * Provide p2 repository
		 */
		$fields = array();
		$fields[] = array ('key'=>'provide_p2_repository', 'label'=>'Provide p2 repository.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Provide-p2-Repository'] =array (
			'fields' => $fields ,
			'name' => 'Provide-p2-Repository',
			'one_line_summary' => 'Projects must provide their own project p2 repository.',
			'details' => 'Projects must provide their own project p2 repository for their own project and updates. In addition, they must provide their archives and metadata in a specified format and method to allow at least parts of their repository to be aggregated and mirrored to a common repository. The <a target="_blank" href="http://wiki.eclipse.org/Helios/Contributing_to_Helios_Build">current process</a> may be modified throughout the year, if improvements can be made.'
		);
		
		

		
		/*
		 * Capabilities.
		 */
		$fields = array();
		$fields[] = array ('key'=>'url_capabilities_description', 'label'=>'URL to a project\'s description of their capabilities (even if sample) and/or plugin names adopters can use', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'url_discover_strategy', 'label'=>'URL to a project\'s description of their progressive discover strategy or documentation', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
		$thefields['Capabilities'] =array (
			'fields' => $fields ,
			'name' => 'Capabilities',
			'one_line_summary' => 'Each project will provide basic capability/activity definitions to allow for their UI contributions to be hidden.',
			'details' => 'Each project will provide basic capability/activity definitions to allow for their UI contributions to be hidden. These may be provided in a separate plugins and features to facilitate inclusion and reuse by consumers in product development, or simply well documented so adopters can reuse via copy/paste. Ideally, projects should also provide triggers to facilitate progressive discovery of functionality.'
		);
		
		/*
		 * Support Translations
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_support_translations', 'label'=>'Translation support used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Support-Translations'] =array (
			'fields' => $fields ,
			'name' => 'Support-Translations',
			'one_line_summary' => 'All strings must be externalized, and Projects must participate in Babel.',
			'details' => 'All strings must be externalized, and Projects must participate in Babel, meaning it is registered and available for string translation, etc. Projects must freeze the UI sufficiently early to allow the Babel project time to translate strings so there can be simultaneous release of translated versions. The UI should be frozen by M6 (a "freeze" all major changes and additions are done by M6, and changes after that are done in a controlled, well documented fashion, so Babel translators can more easily "keep up" with late changes).'
		);
		
		/*
		 * Excel in NL support
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_ICU4J', 'label'=>'ICU4J used where appropriate.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
//		$fields[] = array ('key'=>'exceptions_ICU4J', 'label'=>'Exceptions', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
		$thefields['Excel-in-NL-Support'] =array (
			'fields' => $fields ,
			'name' => 'Excel-in-NL-Support',
			'one_line_summary' => 'The Project must use ICU4J, where appropriate, to excel in NL support. (The latest ICU4J bundles will be in Orbit)',
			'details' => 'The Project must use <a traget="_blank" href="http://wiki.eclipse.org/ICU4J">ICU4J</a>, where appropriate, to excel in NL support. (The latest ICU4J bundles will be in Orbit)',
		);
		
		/*
		 * Branding
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_branding', 'label'=>'Branding used.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Branding'] =array (
			'fields' => $fields ,
			'name' => 'Branding',
			'one_line_summary' => 'Each major project (as determined by participating PMCs) must have an \'About\' dialog icon with hover text that displays the provider name.',
			'details' => ' Each major project (as determined by participating PMCs) must have an \'About\' dialog icon with hover text that displays the provider name. Every plug-in and feature must specify a descriptive provider-name (for features), or Bundle-Vendor header (for plug-ins), as determined by the project\'s PMC (e.g. "Eclipse Modeling Project" rather than "Eclipse.org"). Also, Projects must contribute to the welcome page when appropriate.'
		);
		
		
		/*
		 * No Unresolved Bugs
		 */
		$fields = array();
		$fields[] = array ('key'=>'no_unresolved_bugs', 'label'=>'No unresolved bugs or known issues causing interference with others', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['Do-No-Harm'] =array (
			'fields' => $fields ,
			'name' => 'Do-No-Harm',
			'one_line_summary' => 'Projects must work together in any combination of any install.',
			'details' => 'Projects must work together in any combination of any install. Put another way, this means that users can install any subset of the Helios projects and each of the installed projects will work as well as if it had been loaded independently. If such a problem is identified, the affected projects must track down and fix the problem.',
		);
				
		/*
		 * License text consistency
		 */
		$fields = array();
		$fields[] = array ('key'=>'used_standard_license_form', 'label'=>'Standard forms of license used', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$thefields['License-Text-Consistency'] =array (
			'fields' => $fields ,
			'name' => 'License-Text-Consistency',
			'one_line_summary' => '[New this year.]  Use standard forms of license documents.',
			'details' => '[New this year.]  Use standard forms of license documents so it is displayed in the most usable, and concise way during install and update. It is a normal requirement to use a standard Eclipse Foundation "about" template, but where those templates are edited by each project, care must be taken to be sure they are edited in similar ways. You can see an example of the license-consolidating UI in Eclipse Platform Helios M1.'
		);
		
		
		
		
		
//		Be a good Eclipse Citizen ... and document it
		$fields = array();
		$thefields['be_a_good_eclipse_citizen'] = array (
			'fields' => $fields,
			'name' => 'Eclipse Citizenship',
			'one_line_summary' => 'Projects should exhibit good Eclipse Citizenship, to Release and participate in Common Discovery Site and EPP Packages. These are often "best practices" that some projects have found helpful at Eclipse. These criteria often speak to the quality of the Project, as an Eclipse Project, as opposed to their code or architecture. They are a bit more subjective than some of the other criteria, and the relevancy to any particular project may not be as universal, so there is no set number of items to satisfy. But, it is required that each project document their level of compliance to each item. Especially good Eclipse Citizens will get a gold star, and especially bad ones might get a frowny face.'
		);
		/*
		 * Engage Community
		 */
		$fields = array();
		$fields[] = array ('key'=>'engage_community', 'label'=>'Engage Community', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'engage_community_new_and_noteworthy', 'label'=>'New & Noteworthy URL or description', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Engage-Community'] =array (
			'fields' => $fields ,
			'name' => 'Engage-Community',
			'one_line_summary' => 'The Project should actively engage their community to get feedback on milestone builds, and document how they do that.',
			'details' => 'The Project should actively engage their community to get feedback on milestone builds, and document how they do that. One way to do this is to have a <a  target="_blank" href="http://wiki.eclipse.org/Architecture_Council/New_and_Noteworthy">New & Noteworthy</a> for each milestone. New and Noteworthy documents should be something readable and usable not just a static list of all the bugs. Corollary: individual new & noteworthy should be linked in to the collective New & Noteworthy.'
		);
		/*
		 * Usability
		 */
		$fields = array();
		$fields[] = array ('key'=>'following_usability_guidelines', 'label'=>'Usability', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'following_usability_guidelines_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Usability'] =array (
			'fields' => $fields ,
			'name' => 'Usability',
			'one_line_summary' => 'The Project should follow the User Interface Guidelines.',
			'details' => 'The Project should follow the User Interface Guidelines. The UI Checklist is a good place to start. Also, should participate in a User Interface Best Practices Working Group  UI walkthrough.',
		);
		/*
		 * Performance
		 */
		$fields = array();
		$fields[] = array ('key'=>'measurable_performance_criteria', 'label'=>'Performance', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'measurable_performance_criteria_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Performance'] =array (
			'fields' => $fields ,
			'name' => 'Performance',
			'one_line_summary' => 'Project should have measurable performance criteria that are regularly tested against. Projects should devote at least one milestone to performance and scalability improvements.'
		);

		/*
		 * Test Localization
		 */
		$fields = array();
		$fields[] = array ('key'=>'use_babel_pseudo_translation', 'label'=>'Test Localization', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'use_babel_pseudo_translation_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Test-Localization'] =array (
			'fields' => $fields ,
			'name' => 'Test-Localization',
			'one_line_summary' => 'The project should use the Babel Pseudo Translation Test to verify their translatability.',
		);
		
		/*
		 * Enable Use with All Languages
		 */
		$fields = array();
		$fields[] = array ('key'=>'enable_use_with_all_languages', 'label'=>'Enable Use with All Languages', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'enable_use_with_all_languages_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Enable-Use-with-All-Languages'] =array (
			'fields' => $fields ,
			'name' => 'Enable-Use-with-All-Languages',
			'one_line_summary' => 'Should design and test for enabling all languages including bidi, unicode characters, etc. This is different than "translating" the program. For example, while using an English version of Eclipse Web Tools, someone should be able to create a Chinese language web application.'
		);
		
		/*
		 * Builds
		 */
		$fields = array();
		$fields[] = array ('key'=>'builds', 'label'=>'Builds', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'builds_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Builds'] =array (
			'fields' => $fields ,
			'name' => 'Builds',
			'one_line_summary' => 'Projects must have a mature, stable build process: documented, scripted, repeatable, and executable by others.'
		);
		

		/*
		 * Ramp Down Planned and Defined
		 */
		$fields = array();
		$fields[] = array ('key'=>'ramp_down_planned_and_defined', 'label'=>'Ramp Down Planned and Defined', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'ramp_down_planned_and_defined_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Ramp-Down-Planned-and-Defined'] =array (
			'fields' => $fields ,
			'name' => 'Ramp-Down-Planned-and-Defined',
			'one_line_summary' => 'Projects must have a written ramp down policy by M6, at the latest, and provide link. The plan should describe when the project plans to be feature complete, have API frozen, and similar. See Platform 3.5 Endgame plan as a guideline. See also Helios Final Daze.)'
		);
				
		/*
		 * Accessibility
		 */
		$fields = array();
		$fields[] = array ('key'=>'accessibility', 'label'=>'Accessibility', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'accessibility_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Accessibility'] =array (
			'fields' => $fields ,
			'name' => 'Accessibility',
			'one_line_summary' => 'Projects should design and test for accessibility compliance, following established guidelines and Eclipse fundamental techniques to achieve accessibility.',
			'details' => 'Projects should design and test for accessibility compliance, following established guidelines and Eclipse fundamental techniques to achieve accessibility. Projects must document their accessibility work and compliance. Ideally this would be by using a publicly available checklists, such as
							<ul>
							    <li> <a target="_blank" href="http://www.itic.org/resources/voluntary-product-accessibility-template-vpat/">http://www.itic.org/resources/voluntary-product-accessibility-template-vpat/</a>
							    <li> <a target="_blank" href="http://www.section508.gov/">http://www.section508.gov/</a>
							    <li> <a target="_blank" href="http://www.w3.org/TR/WCAG/">http://www.w3.org/TR/WCAG/</a>
							</ul>
							but, given the advice of the <a target="_blank" href="http://wiki.eclipse.org/Planning_Council/Cross_Project_Teams/Accessibility">Accessibility Cross Project Team</a>, for this year\'s Helios Simultaneous Release, projects can document their work or compliance as a negative, such as "we did not do any accessibility work or testing and do not know the degree of our compliance". But its important to document, so adopters know. If possible, and appropriate, accessibility testing tools can be leveraged such as <a target="_blank" href="http://www.nvda-project.org/">NVDA</a>. The main <a target="_blank" href="http://www.eclipse.org/articles/article.php?file=Article-Accessibility351/index.html">accessibility article at Eclipse Corner</a> has been made current (thanks goes to Todd Creasey).'
		);

		
		/*
		 * Unit Tests
		 */
		$fields = array();
		$fields[] = array ('key'=>'unit_tests', 'label'=>'Unit Tests', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'unit_tests_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Unit-Tests'] =array (
			'fields' => $fields ,
			'name' => 'Unit-Tests',
			'one_line_summary' => '[New this year.] Projects must have some unit tests that can verify at least basic functionality of a build or distribution. The steps to build and run the tests must be documented and executable by others.'
		);
		
		/*
		 *  API Policy Defined and Documented
		 */
		$fields = array();
		$fields[] = array ('key'=>'api_policy_defined_and_documented', 'label'=>'API Policy Defined and Documented', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'api_policy_defined_and_documented_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['API-Policy-Defined-and-Documented'] =array (
			'fields' => $fields ,
			'name' => 'API-Policy-Defined-and-Documented',
			'one_line_summary' => '[New this year.] Typically would include how \'APIs\' are distinguished from non-API and \'provisional\' API, if any. It is recommended that non-API be marked with x-internal in the bundles manifest. Also, should include what the commitment is to API, how long maintained after deprecated, etc.',
			'details' => '[New this year.] Typically would include how \'APIs\' are distinguished from non-API and \'provisional\' API, if any. It is recommended that non-API be marked with x-internal in the bundles manifest. Also, should include what the commitment is to API, how long maintained after deprecated, etc. As one example, see <a target="_blank" href="http://wiki.eclipse.org/WTP_API_Policy">WTP API Policy</a>.'
			);
		
		/*
		 *  Retention Policy
		 */
		$fields = array();
		$fields[] = array ('key'=>'retention_policy', 'label'=>'Retention Policy', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'retention_policy_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Retention-Policy'] =array (
			'fields' => $fields ,
			'name' => 'Retention-Policy',
			'one_line_summary' => '[New this year.] Projects should define and document their retention policy. This should include both zip distributions and repositories.',
			'details' => '[New this year.] Projects should define and document their retention policy. This should include both zip distributions and repositories. For examples, see <a target="_blank" href="http://wiki.eclipse.org/WTP/Retention_Policy">WTP Retention Policy</a> and <a target="_blank" href="http://wiki.eclipse.org/Eclipse_Project_Update_Sites">Eclipse Project Update Sites</a>'
			);
		
		
		/*
		 * Project Metrics
		 */
		$fields = array();
		$fields[] = array ('key'=>'project_metrics', 'label'=>'Project Metrics', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
		$fields[] = array ('key'=>'project_metrics_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
		$thefields['Project-Metrics'] =array (
			'fields' => $fields ,
			'name' => 'Project-Metrics',
			'one_line_summary' => '[New this year.] Projects should provide some summary metrics.',
			'details' => '[New this year.] Projects should provide some summary metrics, such as number of bundles, number of committers, lines of code, number of bugs opened and fixed. This is so some statements can be made and tracked year-to-year about the size of the simultaneous release.'
			);
			
	return $thefields;	
}


?>