<?php
/*******************************************************************************
 * Copyright (c) 2009, 2014 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:
*		Eclipse Foundation - Initial version
*		Anthony Hunter - changes for EMF Query
********************************************************************************/
$Nav->setLinkList(null);

$projectname = "emf-query";

$debug = (isset ($_GET["debug"]) && preg_match("/^\d+$/", $_GET["debug"]) ? $_GET["debug"] : -1);

include_once($_SERVER["DOCUMENT_ROOT"] . "/emf-query/downloads/scripts.php");

$regs = null;
$projects = array("EMF Query" => "emf-query");
$proj = "/modeling"; 
$shortprojectname = "query";

$buildtypes = array(
		"R" => "Release",
		"S" => "Stable",
		"I" => "Integration",
		"M" => "Maintenance",
		"N" => "Nightly"
);

# Set the theme for your project's web pages.
# See http://eclipse.org/phoenix/
$theme = "Nova";

# Define your project-wide Navigation here
# This appears on the left of the page if you define a left nav
# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
# these are optional

# If you want to override the eclipse.org navigation, uncomment below.
# $Nav->setLinkList(array());

# Break the navigation into sections
$Nav->addNavSeparator("EMF Query", 	"/emf-query");
$Nav->addCustomNav("Downloads", "/emf-query/downloads.php", "_self", 3);
$Nav->addCustomNav("Documentation", "/emf-query/documentation.php", "_self", 3);
$Nav->addCustomNav("Wiki", "http://wiki.eclipse.org/EMF", "_self", 3);
$Nav->addCustomNav("Support", "/emf-query/support.php", "_self", 3);
$Nav->addCustomNav("Newsgroup", "http://dev.eclipse.org/newslists/news.eclipse.modeling.emf/maillist.html", "_self", 3);
$Nav->addCustomNav("Mailing List", "https://dev.eclipse.org/mailman/listinfo/emf-dev", "_self", 3);
$Nav->addCustomNav("Modeling Corner", "http://wiki.eclipse.org/Modeling_Corner", "_self", 3);

# Define keywords, author and title here, or in each PHP page specifically
$pageKeywords	= "eclipse, emf, emf query";
$pageAuthor		= "Anthony Hunter";

# top navigation bar
# To override and replace the navigation with your own, uncomment the line below.
$Menu->setMenuItemList(array());
$Menu->addMenuItem("Eclipse", "/", "_self");
$Menu->addMenuItem("EMF Query", "/emf-query", "_self");
$Menu->addMenuItem("Downloads", "/emf-query/downloads.php", "_self");
$Menu->addMenuItem("Documentation", "/emf-query/documentation.php", "_self");
$Menu->addMenuItem("About", "http://www.eclipse.org/projects/project_summary.php?projectid=modeling.emf.emf-query", "_self");

# To define additional CSS or other pre-body headers
$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>');

# To enable occasional Eclipse Foundation Promotion banners on your pages (EclipseCon, etc)
$App->Promotion = TRUE;

# If you have Google Analytics code, use it here
# $App->SetGoogleAnalyticsTrackingCode("YOUR_CODE");
?>