<?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 = 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 = 'indigo' 
			  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){
	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 = 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 = 'Indigo 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/Indigo/Contributing_to_Indigo_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;	
}


?>