<?php
/*******************************************************************************
 * Copyright (c) 2006-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:
 *    Denis Roy (Eclipse Foundation) - initial API and implementation
 *    Christopher Guindon (Eclipse Foundation)  - created getMenuArray()
 *******************************************************************************/
if (!class_exists('MenuItem')) {
  require_once("menuitem.class.php");
}

class Menu {

	#*****************************************************************************
	#
	# menu.class.php
	#
	# Author: 		Denis Roy
	# Date			2004-09-11
	#
	# Description: Functions and modules related to menu objects
	#
	# HISTORY:
	#
	#*****************************************************************************

	private $MenuItemList = array();

	private $projectBranding = "";

	function getProjectBranding() {
	  return $this->projectBranding;
	}

	function setProjectBranding($_projectBranding) {
	  $this->projectBranding = $_projectBranding;
	}

	function getMenuItemList() {
		return $this->MenuItemList;
	}

	function setMenuItemList($_MenuItemList) {
		$this->MenuItemList = $_MenuItemList;
	}

	# Main constructor
	function Menu() {

		$www_prefix = "";

		global $App;

		if(!isset($App)) {
			$App = new App();
		}
		$www_prefix = $App->getWWWPrefix();

		$MenuText = "Home";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "Downloads";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/downloads/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "Users";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/users/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "Members";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/membership/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "Committers";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/committers/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "Resources";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/resources/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "Projects";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/projects/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

		$MenuText = "About Us";
		$MenuItem = new MenuItem($MenuText, $www_prefix . "/org/", "_self", 0);
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;

	}

	function addMenuItem($_Text, $_URL, $_Target) {
		# Menu Items must be added at position 1 .. position 0 is dashboard, last position is Signout
		$MenuItem = new MenuItem($_Text, $_URL, $_Target, 0);

		# Add incoming menuitem
		$this->MenuItemList[count($this->MenuItemList)] = $MenuItem;
	}

	function getMenuItemCount() {
		return count($this->MenuItemList);
	}

	function getMenuItemAt($_Pos) {
		if($_Pos < $this->getMenuItemCount()) {
			return $this->MenuItemList[$_Pos];
		}
	}

	function getMenuArray() {
		$return = array();
		foreach($this->MenuItemList as $menu){
			$return[] = $menu;
		}
		return $return;
	}

}
