<?php 
/*******************************************************************************
 * Copyright (c) 2011 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
$App = new App();

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

header("Content-type: application/json");

echo json_encode(projectsAsArray(getTopLevelProjects()));
echo get_trace_text();

function projectsAsArray($projects) {
	$all = array();
	foreach($projects as $project) {
		$all[$project->getId()] = projectAsArray($project);
	}
	return $all;
}

function projectAsArray($project) {
	return array(
		'id' => $project->getId(),
		'name' => $project->getName(),
		'shortname' => $project->getShortName(),
		'projecturl' => $project->getProjectUrl(),
		'description' => $project->getDescription(),
		'scope' => $project->getScope(),
		'planurl' => $project->getPlanUrl(),
		'bugzillaproduct' => $project->getBugzillaProduct(),
		'wikiurl' => $project->getWikiUrl(),
		'documentationurl' => normalizeHttpUrl($project->getDocumentationUrl()),
		'downloadsurl' => normalizeHttpUrl($project->getDownloadsUrl()),
		'gettingstartedurl' => normalizeHttpUrl($project->getGettingStartedUrl()),
		'sourcerepositories' => sourceRepositoriesAsArray($project),
		'releases' => releasesAsArray($project),
 		'children' => projectsAsArray($project->getChildren())
	);
	
}

function sourceRepositoriesAsArray($project) {
	$repositories = array();
	foreach($project->getSourceRepositories() as $repository) {
		$repositories[] = $repository->getPath();
	}
	return $repositories;
}

function releasesAsArray($project) {
	$releases = array();
	foreach($project->getReleases() as $release) {
		$releases[] = releaseAsArray($release);
	}
	
	return $releases;
}

function releaseAsArray($release) {
	$values = array();
	$values['name'] = $release->getName();
	$values['date'] = date('Y-m-d', $release->getDate());
	$values['noteworthy'] = $release->getNoteworthyUrl();
	$values['planurl'] = $release->getPlan();
	addPlanItems($values, $release->getPlan());
	return $values;
}

function addPlanItems(&$values, $planUrl) {
	if (!$planUrl) return;
	if (!preg_match('/\.xml$/', $planUrl)) return;
	
	$file = dirname(__FILE__) . '/../../' . $planUrl;
	
	//$xml = simplexml_load_file($file, 'SimpleXMLElement', null, 'http://www.eclipse.org/project/plan');
	$xml = simplexml_load_file($file);
	if (!$xml) return;

	addPlanItem($values, 'introduction', $xml->introduction);
	addPlanItem($values, 'deliverables', $xml->release_deliverables);
	addPlanItem($values, 'milestones', $xml->release_milestones);
	addPlanItem($values, 'environment', $xml->target_environments);
	addPlanItem($values, 'internationalization', $xml->target_environments->internationalization);
	addPlanItem($values, 'compatibility', $xml->compatibility_with_previous_releases);
	addThemes($values, $xml->themes_and_priorities);	
}

function addPlanItem(&$values, $name, $xml) {
	if (!$xml) return;
	$value = flattenHTML($xml);
	if (!$value) return;
	
	$values[$name] = $value;
}

function addThemes(&$values, &$xml) {
	$themes = array();
	foreach($xml->theme as $theme) {
		$value = array();
		$value['name'] = (string)$theme['name'];
		$value['description'] = flattenHTML($theme->description);
		$themes[] = $value;
	}
	if ($themes) $values['themes'] = $themes;
}

function flattenHTML($xml) {
	if (!$xml) return;
	$text = '';
	foreach($xml->getNamespaces(true) as $namespace => $url) {
		if (!preg_match('/html/', $url)) continue; // Ignore non-HTML namespaces
		$value = $xml->children($namespace, true)->asXML();
		$value = preg_replace('/(<\/?)\w+:/','$1',$value);
		$text .= $value;
	}
	return $text;
}
?>