<?php
/*******************************************************************************
 * Copyright (c) 2009 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");

	# jee,sdk,java,cpp,modeling,reporting,rcp,php,pulsar,soa,javascript
	# sdk = "Classic"
 

	# Actuate Info confirmed and updated June 9, 2009  
 	$ACTUATE = new companyInfo(
 		"Actuate", 
 		"actuate.PNG", 
 		"3.7", 
 		"reporting",    
 		"Fast download from Actuate, co-founder and lead for the BIRT project.  Plus quick, easy deployment options and interactivity for BIRT.", 
 		"http://eclipse.org/go/DISTROS_ACTUATE_HELIOS",  
 		500, 1); 

	# Bluage updated with information from June 12
 	$BLUAGE = new companyInfo(
 		"BLU AGE", 
 		"bluage_legacy_64_24o.png", 
 		"4.3.1",
 		"jee,sdk,java,cpp,modeling,reporting,rcp,automotive,mobile,scout,testing,parallel,standard", 
 		"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", 
 		125, 1);
 
 	# EclipseSource 22 2011
 	$ECLIPSESOURCE = new companyInfo (
 		"EclipseSource", 
 		"yoxos64x64.jpg", 
 		"4.3.2",
 		"jee,standard,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", 
 		500, 1);
 
 	# Genuitec info updated as of June 23
 	$GENUITEC = new companyInfo (
 		"Genuitec", 
 		"genuitec.png",
 		"4.3.1",
 		"jee,standard,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", 
 		200, 1);
 
 		
	#Information as of June 24
 	$INTALIO = new companyInfo (
 		"Intalio", 
 		"intalio.png", 
 		"3.X.ISP_DOWN",
 		"sdk",
 		"Grab Eclipse Classic, the BPMN modeler, or try Intalio|Designer, our Business Process IDE.", 
 		"http://eclipse.org/go/DISTRO_INTALIO_GALILEO", 
 		125, 1);
 
 	# ITEMIS Has updated as of June 19th and are good to go!
 	$ITEMIS = new companyInfo(
 		"Itemis", 
 		"itemis.gif", 
 		"3.5.1",
 		"java",
 		"Eclipse Galileo, including Xtext, Xpand, Xtend, Check and EMF. Get started with DSLs and MDD.",  
 		"http://eclipse.org/go/DISTROS_ITEMIS_GALILEO", 
 		125, 1);
 
 	# ITEMIS Has updated as of June 19th and are good to go!
 	$NWIRE = new companyInfo(
 		"nWire Software", 
 		"nwire.png", 
 		"3.6.2",
 		"sdk, jee, java, rcp, php",
 		"Blazing fast Eclipse downloads over Limelight CDN. No reg required. Optional code exploration tools.",  
 		"http://eclipse.org/go/DISTROS_NWIRE_HELIOS", 
 		200, 1);
 		
 	# UPDATE JUNE 22 2011
 	$OBEO = new companyInfo(
 		"Obeo", 
 		"obeo.png", 
 		"4.3.2",
 		"modeling, jee, java, automotive, standard",
 		"Download the latest Eclipse easily and discover how to create your OWN modeling solutions.",  
 		"http://eclipse.org/go/DISTROS_OBEO", 
 		125, 1);
 
 
	# Oracle information is placeholder -- updates required.
	$ORACLE = new companyInfo(
		"Oracle", 
		"ora64.gif", 
		"3.5.2",     
		"jee,sdk,java", 
		"Bandwidth by Oracle. Eclipse Galileo and 3.x distributions by the foundation. Free products and downloads of #1 Commercial Eclipse tool by Oracle.", 
		"http://eclipse.org/go/DISTRO_ORACLE_GALILEO", 
		500, 1);
 
 	# Update on June 22
	$POLARION = new companyInfo(
		"Polarion Software", 
		"polarion64.png", 
		"4.3.1",
		"standard",
		"Kepler + Subversive, FastTrack, FREE Integrated Tracker/SVN/Wiki/Workflows, more!", 
		"http://eclipse.org/go/DISTRO_POLARION", 
		125, 1);

 	#  UPDATED ON JUNE 23 -- GOOD TO GO!
	$SOPERA = new companyInfo(
		"SOPERA", 
		"sopera64x64.png", 
		"3.6",
		"jee,java,soa",
		"Fast and free download of Eclipse Helios powered by SOPERA, Specialist for Eclipse-based SOA Solutions.", 
		"http://eclipse.org/go/DISTROS_SOPERA_HELIOS", 
		125, 1);

 	#  UPDATED ON JUNE 23 -- GOOD TO GO!
	$SPRING = new companyInfo(
		"SpringSource", 
		"spring64.png", 
		"4.3.2",
		"standard,jee,java,rcp",
		"Rapid downloads of Eclipse packages. Free downloads of SpringSource Tool Suite for Spring, AspectJ, Groovy and Grails.", 
		"http://eclipse.org/go/DISTRO_SPRINGSOURCE", 
		200, 1);

 	#  added Nov/09
	$XPOLOG = new companyInfo(
		"XpoLog", 
		"xpolog64.jpg", 
		"3.7",
		"sdk,jee,java,cdt,rcp",
		"Accelerated downloads of Eclipse packages. Free trial of XpoLog Log Analysis Platform with Automatic application problem monitoring.", 
		"http://eclipse.org/go/DISTROS_XPOLOG_HELIOS", 
		125, 1);
		
			# Bluage updated with information from June 12
 	$YATTA = new companyInfo(
 		"Yatta Solutions GmbH", 
 		"yatta_64_64.png", 
 		"4.3.2",
 		"standard,jee,sdk,java,cpp,modeling,reporting,rcp,scout,testing,parallel", 
 		"Get your Eclipse download and have a look at our modeling solutions made in Germany.", 
 		"http://eclipse.org/go/DISTRO_YATTA", 
 		125, 1);
		

	$companyinfo = array(  
		&$ACTUATE, &$BLUAGE, &$ECLIPSESOURCE, &$GENUITEC, 
		&$INTALIO, &$ITEMIS, &$NWIRE, &$OBEO, 
		&$ORACLE, &$POLARION, &$SOPERA, &$SPRING, &$XPOLOG, &$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.3.2") {
				$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;
	}
?>
