<?php
/*******************************************************************************
 * Copyright (c) 2010 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:
 *    Denis Roy (Eclipse Foundation)- initial API and implementation
 *    Nathan Gervais (Eclipse Foundation) - Expanded new fields being added
 *******************************************************************************/

require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));

class MemberImage {

	#*****************************************************************************
	#
	# membershipimage.class.php
	#
	# Author:   M. Ward
	# Date: 06/01/10
	# Based on work by: 	Denis Roy 2005-10-25
	#
	# Description: functions around membership image details
	#
	# HISTORY:
	#
	#*****************************************************************************

	var $DEBUG;
	var $details = array();


	# default constructor
	function MemberImage() {
		$this->DEBUG = 0;
	    $this->details[0] = -1;
	    $this->details[1] = -1;
	}

	function getsmall_image($member_id) {

	  if ($this->getMetaImage($member_id,"small") == -1 ) {
	    if ($this->DEBUG) {echo "Error retrieving image details for member $_member_id.";}
	  }
	  return $this->details;
	}

	function getlarge_image($member_id) {

	  if ($this->getMetaImage($member_id,"large") == -1 ) {
	    if ($this->DEBUG){echo "Error retrieving image details for member $_member_id.";}
	  }
	  return $this->details;

	}

	function setdebug($val){
	  $this->DEBUG = $val;
	}


	private function getMetaImage($_member_id, $_size) {

		if ( $_member_id <= 0 || !is_numeric($_member_id)){return -1;}


		$image = "";

		$App = new App();

	    $sql = "SELECT ".$_size."_height as height, ".$_size."_width as width , ".$_size."_logo as image from OrganizationInformation where OrganizationID = ".$_member_id." LIMIT 1";
		$sql = $App->sqlSanitize($sql);
    	$result = $App->eclipse_sql($sql);
    	while($myrow = mysql_fetch_array($result))
	    {
        	$this->details[0]=$myrow["width"];
        	$this->details[1]=$myrow["height"];
        	$image=$myrow["image"];
		}
        if ($this->details[0] == 0 && $this->details[1] == 0  ) {
          if ( $image != "" ) {
            $img = imagecreatefromstring($image);
            $this->details[1] = imagesy($img);
            $this->details[0] = imagesx($img);
            imagedestroy($img);
            if ( $this->details[0] == 0 && $this->details[1] == 0 ) {
              //try and get the data the old fashined way
              $image_url = 'http://eclipse.org/membership/scripts/get_image.php?size=small&id=';
	          list ($this->details[0], $this->details[1], $type, $attr) = getimagesize($image_url . $array['memberID']);
	        }
          }
          if ( $this->details[1] == 0 && $this->details[0] == 0 ) {  //error!
            return -1;
          }
          $sql = "UPDATE OrganizationInformation SET ".$_size."_height = ".$this->details[1].",".$_size."_width = ".$this->details[0]." where OrganizationID = ".$_member_id;
  		  //insert data
  		  $sql = $App->sqlSanitize($sql);
  		  $result = $App->eclipse_sql($sql);
        }
		return 1;
	}

}
?>