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