<?php 
/*******************************************************************************
 * Copyright (c) 2011 Eclipse Foundation and others.
 * 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:
 *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
trace_file_info(__FILE__);

function getOrganization($id) {
	$organizations = getOrganizations();
	return $organizations[$id];
}

function getOrganizations() {
	global $_organizations;
	
	if ($_organizations) return $_organizations;

	global $App;
	$_organizations = array();
	
    $sql = "select 
    		o.OrganizationId as id, Name1 as name, SCRM_GUID,
    		om.Relation as type, om.EntryDate as startDate, om.ExpiryDate as endDate 
    	from Organizations as o 
    		left join OrganizationMemberships as om on (o.OrganizationId = om.OrganizationId)";
    
    $result = $App->foundation_sql($sql);
    while ($row = mysql_fetch_assoc($result)) {
    	$id = $row['id'];
    	if (!isset($_organizations[$id])) 
    		$_organizations[$id] = new Organization($row);
    	if (isset($row['type'])) {
    		$_organizations[$id]->memberships[] = new Membership($row);
    	}
    }
    
    return $_organizations;
}

class Organization {
	var $data;
	var $memberships = array();
	
	function __construct($row) {
		$this->data = $row;
	}
	
	function getId() {
		return $this->data['id'];
	}
	
	function getSugarId() {
		return $this->data['SCRM_GUID'];
	}
	
	function getName() {
		return $this->data['name'];
	}
	
	function isMember() {
		foreach($this->memberships as $membership) {
			if ($membership->isActive()) return true;
		}
		return false;
	}
}

class Membership {
	var $data;
	
	function __construct($row) {
		$this->data = $row;
	}
	
	function isActive() {
		// if we have an end date, we're not active. Otherwise, we are.
		return $this->getEndDate() ? false : true;
	}
	
	function getEndDate() {
		if (!$this->data['endDate']) return null;
		$date = strtotime($this->data['endDate']);
		return $date < 0 ? null : $date;
	}
}
?>