<?php
/*******************************************************************************
 * Copyright (c) 2018 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
 *******************************************************************************/

/**
 * This script generates a list of trademarks asserted by
 * The Eclipse Foundation. There are two types of trademarks:
 * registered, which are represented by an "R" in a circle (R),
 * and unregistered (or "common law") trademarks, which are
 * represented with a "TM" in superscript.
 *
 * Most of the work is done by the Trademarks class; this
 * script is primarily concerned with presenting the information
 * to the user.
 *
 * @see Trademarks
 */
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");

$App = new App();
$Nav = new Nav();
$Menu = new Menu();
include($App->getProjectCommon());

$pageTitle 		= "Eclipse Foundation Trademarks";
$pageKeywords	= "";
$pageAuthor		= "Wayne Beaton";

ob_start();
?>
<div id="maincontent">
<div id="midcolumn">
<h1><?= $pageTitle ?></h1>

<p>This document captures a list of trademarks claimed by the Eclipse Foundation. Please read
our <a href="/legal/logo_guidelines.php">Guidelines for Eclipse Logos &amp; Trademarks</a>.

<p>The Eclipse Foundation considers the names of all open source projects, all downloadable
software products, the Eclipse logo, and the logos of our brands and projects to be trademarks
of the The Eclipse Foundation. The Eclipse Foundation owns all of these trademarks on behalf of
our various communities.</p>

<h2>Registered Trademarks</h2>

<ul>
	<li>Eclipse&reg; is registered in Canada, and Europe.</li>
	<li>The Eclipse Logo is registered in Canada, and Europe.</li>
	<li>EclipseCon&reg; is registered in The United States, and Europe.</li>
	<li>GlassFish&reg; is registered in Australia, Brazil, Switzerland,
		Europe, China, Israel, India, Japan, Mexico, Norway, Russia,
		Singapore, South Korea, and The United States.</li>
	<li>Jakarta EE&trade; is filed in The United States, Europe, and
		Canada.</li>
	<li>Jetty&reg; is registered in The United States.</li>
	<li>MicroProfile&reg; is registered in The United States, and Europe.</li>
	<li>PolarSys&reg; is registered in The United States, Europe, and
		Canada.</li>
</ul>

<h2>Trademarks</h2>

<ul>
	<li>Eclipse Summit&trade;</li>
	<li>Eclipse Foundation Member&trade;</li>
	<li>Built on Eclipse&trade;, Eclipse Ready&trade;</li>
	<li>Eclipse Simultaneous Release&trade;, <a
		href="https://projects.eclipse.org/releases/photon">Eclipse Photon</a>&trade;,
		<a href="https://projects.eclipse.org/releases/oxygen">Eclipse
			Oxygen</a>&trade;, <a
		href="https://projects.eclipse.org/releases/neon">Eclipse Neon</a>&trade;,
		<a href="https://projects.eclipse.org/releases/mars">Eclipse Mars</a>&trade;,
		<a href="https://projects.eclipse.org/releases/luna">Eclipse Luna</a>&trade;,
		<a href="https://projects.eclipse.org/releases/kepler">Eclipse
			Kepler</a>&trade;, <a
		href="https://projects.eclipse.org/releases/juno">Eclipse Juno</a>&trade;,
		<a href="https://projects.eclipse.org/releases/indigo">Eclipse
			Indigo</a>&trade;, <a
		href="https://projects.eclipse.org/releases/helios">Eclipse Helios</a>&trade;,
		<a href="https://projects.eclipse.org/releases/galileo">Eclipse
			Galileo</a>&trade;, <a
		href="https://projects.eclipse.org/releases/ganymede">Eclipse
			Ganymede</a>&trade;, <a
		href="https://projects.eclipse.org/releases/europa">Eclipse Europa</a>&trade;,
		<a href="https://projects.eclipse.org/releases/callisto">Eclipse
			Callisto</a>&trade;
	</li>
	<li>Capella IC&trade;, Eclipse Internet of Things&trade;, Eclipse
		Science&trade;, GEMOC RC&trade;, LocationTech&trade;,
		OpenMDM&trade;, Papyrus IC&trade;, Eclipse Long Term Support&trade;</li>
</ul>


<h3>Project Names</h3>

<p>All Eclipse open source project names are considered trademarks of The Eclipse Foundation,
even if they are not listed below. </p>

<ul>
<?php
foreach(Project::getAll() as $project) {
	$trademarks = array();
	$project->trademarksDo(TRADEMARK_UNREGISTERED, function($term) use (&$trademarks, &$project) {
		$trademark = $term;
		if (!$project->isArchived()) $trademark = "<a href=\"{$project->getUrl()}\">{$trademark}</a>";
		$trademark = "{$trademark}&trade;";
		$trademarks[] = $trademark;
	});
	if ($trademarks) {
		echo "<li>";
		echo implode(", ", $trademarks);
		echo "</li>";
	}
};

?>
</ul>
</div>
</div>

<?php
$html = ob_get_contents();
ob_end_clean();
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
