<?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",
		"2019-06",
		"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",
		"2019-06",
		"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",
		"ibm-cloud-logo.jpg",
		"2019-06",
		"jee,committers,java,cpp,php,installer,javascript",
		"Blazingly fast downloads hosted by IBM Cloud.",
		"http://eclipse.org/go/DISTRO_IBM",
		1250, 1);

	$OBEO = new companyInfo(
		"Obeo",
		"obeo.png",
		"2019-03",
		"modeling, jee, java, installer",
		"Fast downloads hosted<br />by Eclipse experts.",
		"http://eclipse.org/go/DISTROS_OBEO",
		125, 1);

	$SPRING = new companyInfo(
		"Spring by Pivotal",
		"spring64.png",
		"2019-03",
		"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",
		"2019-03",
		"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 == "2019-06") {
				$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;
	}
?>
