<?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.4",
		"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.4",
		"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",
		"4.7.4",
		"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",
		"4.7.4",
		"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.4",
		"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.4",
		"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.4") {
				$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;
	}
?>
