<?php 
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.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');
		
		$release = $App->sqlSanitize($release);
		/*
		 * 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 = $App->portal_sql($query,$dbh);
	$res = $App->portal_sql($query);
	
	/*
	 * 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 (array_key_exists('debug', $_GET) && $_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 = 'juno' 
			  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 (array_key_exists('debug', $_GET) && $_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){
	if (!is_valid_project_name($projectid)) return null;
	
//	$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 = $App->portal_sql($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 (array_key_exists('debug', $_GET) && $_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 = 'Juno 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.'
		);
		
		/*
		 * Offset
		 */
		$fields = array();
		$fields[] = array ('key'=>'offset', 'label'=>'Offset', 'type'=>'select', 'options' =>array('+0'=>'+0','+1'=>'+1','+2'=>'+2','+3'=>'+3'),'check'=>'noquery','allow_excpetion' => false);
		$thefields['Offset'] = array (
			'fields' => $fields,
			'name' => 'Offset',
		
		);
		
		/*
		 * 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/Juno/Contributing_to_Juno_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 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.'
		);
		
		
		
		
		
//		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.)'
		);
				
		/*
		 * 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 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;	
}


?>