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