<?php  																														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"); 	$App 	= new App();	$Nav	= new Nav();	$Menu 	= new Menu();		include("_projectCommon.php");    # All on the same line to unclutter the user's desktop'

#*****************************************************************************
#
# index.php
#
# Author: 		Denis Roy
# Date:			2005-10-11
#
# Description: Main eclipse.org page
#
#****************************************************************************

#
# Begin: page-specific settings.  Change these.
$pageTitle 		= "Eclipse Newcomers FAQ";
$pageKeywords	= "newcomers, faq, new to eclipse";
$pageAuthor		= "Ian Skerrett";

# Add page-specific Nav bars here
# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank)
# $Nav->addCustomNav("My Link", "mypage.php", "_self");
# $Nav->addCustomNav("Google", "http://www.google.com/", "_blank");

# End: page-specific settings
#

# Place your html content in a file called content/en_pagename.php

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

	<h3>What is Eclipse?</h3>
	<p>Eclipse is an open source community whose projects are focused on
		building an extensible development platform, runtimes and application
		frameworks for building, deploying and managing software across the
		entire software lifecycle. Many people know us, and hopefully love us,
		as a Java IDE but Eclipse is much more than a Java IDE.</p>
	<p>The Eclipse open source community has over 200 open source projects.
		These projects can be conceptually organized into seven different
		"pillars" or categories:</p>
	<ol>
		<li>Enterprise Development</li>
		<li>Embedded and Device Development</li>
		<li>Rich Client Platform</li>
		<li>Rich Internet Applications</li>
		<li>Application Frameworks</li>
		<li>Application Lifecycle Management (ALM)</li>
		<li>Service Oriented Architecture (SOA)</li>
	</ol>
	<p>The Eclipse community is also supported by a large and vibrant
		ecosystem of major IT solution providers, innovative start-ups,
		universities and research institutions and individuals that extend,
		support and complement the Eclipse Platform.</p>
	<p>One very exciting thing about Eclipse is that many people are using
		Eclipse in ways that we have never imagined. The common thread is that
		they are building innovative, industrial-strength software and want to
		use great tools, frameworks and runtimes to make their job easier.</p>

	<h3>What is the Eclipse Foundation?</h3>
	<p>The Eclipse Foundation is a not-for-profit, member-supported
		corporation that hosts the Eclipse projects. The Foundation provides
		services to run the IT infrastructure, perform IP due diligence,
		mentor open source projects, and provide marketing and business
		development support for the Eclipse community.</p>
	<p>It is important to realize that the Eclipse Foundation does not
		actually develop the open source code. All of the open source software
		at Eclipse is developed by open source developers, called committers,
		which are volunteered or contributed by organizations and individuals.</p>

	<h3>How can I get started using Eclipse?</h3>
	<p>
		Most people start by downloading <a
			href="http://www.eclipse.org/downloads/">one of the different
			download packages</a>. Plugins can be added to Eclipse to expand its
		functionality; the <a href="/projects/listofprojects.php">Eclipse
			Projects</a> and <a href="http://marketplace.eclipse.org/">Eclipse
			Marketplace</a> are two sources for additional plugins, but there are
		many more out there!<br /> <br /> There is also a wealth of <a
			href="/resources?type=book">books</a>, <a
			href="http://www.eclipse.org/resources?category=Getting%20Started">tutorials
			and white papers</a> to help you get started. Check out <a
			href="http://wiki.eclipse.org/The_Official_Eclipse_FAQs">The Official
			Eclipse FAQ</a> in the <a href="http://wiki.eclipse.org/Main_Page">Eclipse
			Wiki</a> for more information about all aspects of Eclipse. There are
		also companies available to help with <a
			href="http://marketplace.eclipse.org/taxonomy/term/34">training and
			consulting services.</a> In addition, please feel free to post a
		question on our <a href="/forums/">forums.</a>
	</p>

	<h3>Where do I get support?</h3>
	<p>
		Everyone is free to open <a href="http://bugs.eclipse.org/bugs/">bugs</a>
		and <a href="/forums/">ask questions on our forums.</a> There are also
		companies that offer commercial products built on Eclipse and <a
			href="http://www.eclipse.org/downloads/">Eclipse distributions</a>.
		Many of these organizations are able to provide commercial -level
		support.
	</p>

	<h3>How do I get in contact with other Eclipse users?</h3>
	<p>
		The best way to get in touch with other Eclipse users is via our <a
			href="/forums/">forums</a> and <a
			href="http://bugs.eclipse.org/bugs/">Bugzilla database.</a> This is
		typically where people ask and answer questions about their favourite
		Eclipse projects. You can also find individuals blogging about Eclipse
		on <a href="http://www.planeteclipse.org">PlanetEclipse.org.</a>
	</p>
	<p>
		If you would like to contact the Eclipse Foundation see our <a
			href="/org/foundation/contact.php">Contact Us section.</a>
	
	
	<h3>What license does Eclipse use?</h3>
	<p>Eclipse uses the Eclipse Public License (EPL). The EPL is a
		commercially friendly license that allows organizations to include
		Eclipse software in their commercial products, while at the same time
		asking those who create derivative works of EPL code to contribute
		back to the community.</p>
	<p>
		The commercial-friendly nature of the EPL had been proven over and
		over as hundreds of companies ship Eclipse based products. More
		information about the EPL can be found in our <a
			href="/legal/eplfaq.php">Licensing FAQ.</a>
	</p>

	<h3>How do I start an Eclipse open source project?</h3>
	<p>
		The first step in starting an open source project is to familiarize
		yourself with the <a href="/projects">existing open source projects.</a>
		There is a lot of diverse technology being developed at Eclipse, so it
		might be actually easier to contribute to an existing open source
		project. If you believe you have a unique technology that is suited
		for Eclipse, then the first step is to read the Eclipse development
		process to ensure that the goals of Eclipse align with your interests
		in creating an open source project. The next step is to contact the
		Eclipse Management Organization (EMO) to get some help and advice in
		drafting your proposal. You can contact the EMO via <a
			href="mailto:emo@eclipse.org">emo at eclipse dot org</a>.
	</p>

	<h3>Who is allowed to start an Eclipse open source project?</h3>
	<p>
		Eclipse is an open and transparent community of open source projects.
		We welcome project proposals from all sources. It is important to
		understand that you do not have to be a member of the Eclipse
		Foundation to <a
			href="http://wiki.eclipse.org/Development_Resources/HOWTO/Starting_A_New_Project">start</a>
		or work on an open source project.
	</p>


	<h3>How do I become a member?</h3>
	<p>
		To become a member please visit <a href="/membership/become_a_member/">here</a>
		for detailed instructions.
	</p>
	<br />

</div>
	<?
	$html = ob_get_contents();
	ob_end_clean();
	$Nav->addCustomNav("Downloads", 	"/downloads/", 		"_self", 1);
	$Nav->addCustomNav("Resources",		"/resources/", 			"_self",1 );
	$Nav->addCustomNav("Projects",		"/projects/", 			"_self",1 );
	# Generate the web page
	$App->generatePage("Nova", $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
	?>