<?php
/*******************************************************************************
 * Copyright (c) 2009-2016 Eclipse Foundation, Inc.
 * 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 API and implementation
 *******************************************************************************/

	require_once("content/distro_functions.php");

	$BLUAGE = new companyInfo(
		"BLU AGE", 
		"ba_legacy_110x80_opt.jpg", 
		"4.7.1a",
		"jee,sdk,java,cpp,modeling,reporting,rcp,automotive,mobile,scout,testing,parallel,committers, installer", 
		"Free and fast direct Eclipse downloads. Get more BLU AGE Eclipse plugins for your Legacy Application Modernization, Reverse Modeling and Forward Engineering.", 
		"http://eclipse.org/go/BLUAGE_DISTRO",
		25, 1);

	$ECLIPSESOURCE = new companyInfo (
		"EclipseSource", 
		"yoxos64x64.jpg", 
		"4.5.2",
		"jee,committers,java,cpp,modeling,reporting,rcp,automotive,scout,testing,parallel,mobile",
		"Warp speed from the Amazon cloud plus a choice of hundreds of plug-ins with managed dependencies.", 
		"http://eclipse.org/go/DISTRO_ECLIPSESOURCE_INDIGO", 
		125, 1);

	$GENUITEC = new companyInfo (
		"Genuitec",
		"genuitec.png",
		"4.7.1a",
		"jee,committers,java,cpp,modeling,reporting,rcp,automotive,mobile,scout,testing,parallel, installer",
		"Native installers for all OS platforms, lightning fast downloads. Manage plugins and dependencies. For free.", 
		"http://eclipse.org/go/DISTRO_GENUITEC_INDIGO", 
		25, 1);
	
	$IBM = new companyInfo (
		"IBM",
		"bluemix-icon-64x.png",
		"4.7.1a",
		"jee,committers,java,cpp,php,installer,javascript",
		"Blazingly fast downloads hosted by IBM Bluemix.",
		"http://eclipse.org/go/DISTRO_IBM",
		1250, 1);

	$OBEO = new companyInfo(
		"Obeo",
		"obeo.png", 
		"4.7.1a",
		"modeling, jee, java, installer",
		"Download the latest Eclipse easily and discover how to create your OWN modeling solutions.",  
		"http://eclipse.org/go/DISTROS_OBEO", 
		125, 1);

	$SPRING = new companyInfo(
		"Spring by Pivotal", 
		"spring64.png", 
		"4.7.1a",
		"committers,jee,java,rcp",
		"Rapid downloads of Eclipse packages. Free downloads of Spring Tool Suite for Spring, Spring Boot, Cloud Foundry, and AspectJ.", 
		"http://eclipse.org/go/DISTRO_SPRINGSOURCE", 
		100, 1);

		# Bluage updated with information from June 12
	$YATTA = new companyInfo(
		"Yatta Solutions GmbH", 
		"yatta_64_64.png", 
		"4.7.1a",
		"committers,jee,sdk,java,cpp,modeling,reporting,rcp,scout,testing,parallel,installer", 
		"Take the shortcut to Eclipse now! Save and share your Eclipse - with Profiles.", 
		"http://eclipse.org/go/DISTRO_YATTA", 
		25, 1);

	$companyinfo = array(
		&$BLUAGE, &$ECLIPSESOURCE, &$GENUITEC, &$IBM, &$OBEO,
		&$SPRING, &$YATTA
	);



	/**
	 * Returns random array of companies based on the name of the package 
	 * @param $_package - the name of the package (one of jee|sdk|java|cpp|modeling|reporting|rcp|php|pulsar)
	 * @return array - array of companyInfo objects
	 */
	function getCompanyArrayByPackage($_package, $_weighted=true) {
		$rValue = array();
		global $companyinfo;
		foreach ($companyinfo as $company) {
			if(strpos($company->projects, $_package) !== false && $company->version == "4.7.1a") {
				$rValue[] = $company;
			}
		}
		# randomize the list here is requested to do so.
		if($_weighted) {
			$a = randomSeed($rValue);
			$newArray = array();
			foreach($a as $key=>$value) {
				$newArray[] = $rValue[$value];
			}
			
			$rValue = $newArray;
		}
		return $rValue;
	}
?>
