<?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.5.2",
		"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.5.2",
		"jee,committers,java,cpp,modeling,reporting,rcp,automotive,mobile,scout,testing,parallel",
		"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.5.2",
		"jee,committers,java,cpp,php,installer",
		"Blazingly fast downloads hosted by IBM Bluemix.",
		"http://eclipse.org/go/DISTRO_IBM",
		1250, 1);

	$OBEO = new companyInfo(
		"Obeo",
		"obeo.png", 
		"4.6",
		"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.6",
		"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.6",
		"committers,jee,sdk,java,cpp,modeling,reporting,rcp,scout,testing,parallel", 
		"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.6") {
				$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;
	}
?>