<?php
/**
 * AgileBill - Open Billing Software
 *
 * This body of work is free software; you can redistribute it and/or
 * modify it under the terms of the Open AgileBill License
 * License as published at http://www.agileco.com/agilebill/license1-4.txt
 *
 * Originally authored by Tony Landis, AgileBill LLC
 *
 * Recent modifications by Deon George
 *
 * @author Deon George <deonATleenooksDOTnet>
 * @copyright 2009 Deon George
 * @link http://osb.leenooks.net
 *
 * @link http://www.agileco.com/
 * @copyright 2004-2008 Agileco, LLC.
 * @license http://www.agileco.com/agilebill/license1-4.txt
 * @author Tony Landis <tony@agileco.com>
 * @package AgileBill
 * @subpackage Core
 */

/**
 * The main AgileBill CORE List Class
 *
 * @package AgileBill
 * @subpackage Core
 */
class CORE_list {
	private $id = 100;

	/**
	 * @todo deprecite this function - replace with mmenu()
	 */
	public function menu($input_id,$name,$table,$field,$default,$class,$all=false) {
		$this->mmenu($input_id,$name,$table,$field,$default,'',$class,$all);
	}
	/**
	 * Generate a select list, using the values in a table
	 *
	 * @param string $input_id HTML id="" value.
	 *	+ If 'no', then a hot click img wont be included
	 *	+ If 'all', then a blank item will be included
	 * @param string $name HTML name="" value.
	 * @param string $table Table to query for a list of items.
	 * @param string $field Column to query for a list of items.
	 * @param string $default Default Value to pre-select (if it exists)
	 *	+ If 'all', then a blank item will be included
	 * @param string|array $where SQL where conditions
	 * @param string $class CSS class for the select list
	 * @param bool $all If true, then a blank item will be included.
	 *
	 * @todo Remove the many ways of selecting all
	 */
	public function mmenu($input_id,$name,$table,$field,$default,$where,$class,$all=false) {
		global $C_translate;

		$noicon = false;

		if ($input_id == 'no') {
			$input_id = '';
			$noicon = true;
		}

		if (! $input_id)
			$input_id = sprintf('%s_%s_%s',$table,$field,$this->id++);

		$db = &DB();
		$result = $db->Execute(sqlSelect($db,$table,sprintf('id,%s',$field),$where,$field));
		if ($result === false) {
			global $C_debug;

			$C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg());

		} else {
			$return = sprintf('<select id="%s" name="%s" class="%s">',$input_id,$name,$class);

			if ($all)
				$return .= '<option value="">&nbsp;</option>';

			$i = 0;
			while (! $result->EOF) {
				$return .= sprintf('<option value="%s"%s>%s</option>',
					$result->fields['id'],($default == $result->fields['id']) ? ' selected="selected"' : '',$result->fields[$field]);
				$result->MoveNext();

				$i++;
			}

			$return .= '</select>';

			if ($i==0)
				$return = $C_translate->translate('lists_none_defined');

			if ($i > 0 && ! $noicon)
				$return .= sprintf('&nbsp;<img src="themes/%s/images/icons/zoomi_16.gif" alt="Zoom" width="16" height="16" style="border: 0px;" onclick="menu_item_view(\'%s\',\'%s\');"/>',THEME_NAME,$table,$input_id);

			echo $return;
		}
	}

	function decrypt($data) {
		include_once(PATH_CORE.'crypt.inc.php');

		return CORE_decrypt($data);
	}

	function menu_cc_admin($field,$account,$default,$class,$user=false) {
		include_once(PATH_MODULES.'account_billing/account_billing.inc.php');
		$abo = new account_billing;

		echo $abo->menu_admin($field,$account,$default,$class,$user);
	}

	function menu_multi($default,$name,$table,$field,$id,$max,$class) {
		include_once(PATH_CORE.'list_menu_multi.inc.php');

		echo list_menu_multi($default,$name,$table,$field,$id,$max,$class);
	}

	function menu_files($id,$name,$default,$path,$pre,$ext,$class) {
		include_once(PATH_CORE.'list_menu_files.inc.php');

		echo list_menu_files($id,$name,$default,$path,$pre,$ext,$class);
	}

	/**
	 * Generate a list of frequently used selections in OSB
	 *
	 * @param string $type List type
	 * @param string $input_id HTML id="" value.
	 * @param string $name HTML name="" value.
	 * @param string $default Default Value to pre-select (if it exists)
	 * @param string $class CSS class for the select list
	 * @param bool $all If true, then a blank item will be included.
	 */
	public function menu_staticlist($type,$input_id,$name,$default,$class,$all=false) {
		include_once(PATH_CORE.'list_staticlist.inc.php');
		return list_menu_staticlist($type,$input_id,$name,$default,$class,$all);
	}

	public function format_currency($number,$currency_id=DEFAULT_CURRENCY) {
		$number = $this->format_currency_decimal($number,$currency_id);

		if (! $currency_id)
			$currency_id = DEFAULT_CURRENCY;

		return sprintf('%s%s %s',
			$this->format_currency[$currency_id]['symbol'],
			($number > .05 || $number == 0 || $number < -1 || DEFAULT_DECIMAL_PLACE == 2)
				? number_format($number,DEFAULT_DECIMAL_PLACE)
				: number_format($this->format_currency_decimal($number,$currency_id,2)),
			$this->currency_iso($currency_id));
	}

	public function format_currency_num($number,$currency_id=DEFAULT_CURRENCY) {
		$number = $this->format_currency_decimal($number,$currency_id);

		if (! $currency_id)
			$currency_id = DEFAULT_CURRENCY;

		return sprintf('%s%s',
			$this->format_currency[$currency_id]['symbol'],
			($number > .05 || $number == 0 || $number < -1 || DEFAULT_DECIMAL_PLACE == 2)
				? number_format($number,DEFAULT_DECIMAL_PLACE)
				: number_format($this->format_currency_decimal($number,$currency_id),2));
	}

	public function format_currency_decimal($number,$currency_id,$decimals=DEFAULT_DECIMAL_PLACE) {
		return ($number);
		if (empty($number))
			return 0;
		if (empty($currency_id))
			$currency_id = DEFAULT_CURRENCY;
		if (! isset($this->format_currency[$currency_id]))
			$this->currency($currency_id);
		if (! isset($this->format_currency[DEFAULT_CURRENCY]))
			$this->currency(DEFAULT_CURRENCY);

		return round($number*=$this->format_currency[DEFAULT_CURRENCY]['convert'][$currency_id]['rate'],$decimals);
	}

	public function currency_list($ret,$currency_id=DEFAULT_CURRENCY)  {
		global $smarty;

		if (! isset($this->format_currency[$currency_id]))
			$this->currency(DEFAULT_CURRENCY);

		$smarty->assign($ret,$this->format_currency[DEFAULT_CURRENCY]['convert']);
	}

	public function currency_iso($currency_id=DEFAULT_CURRENCY) {
		if (! isset($this->format_currency[$currency_id]))
			$this->currency(DEFAULT_CURRENCY);

		return $this->format_currency[$currency_id]['iso'];
	}

	public function currency($currency_id) {
		static $CACHE = array();
		$db = &DB();

		if (! isset($CACHE[$currency_id])) {
			$rs = $db->Execute(sqlSelect('currency','*',array('where'=>array('id'=>$currency_id))));
			if ($rs && $rs->RecordCount())
				$this->format_currency[$currency_id] = array(
					'symbol' => $rs->fields['symbol'],
					'convert' => unserialize($rs->fields['convert_array']),
					'iso' => $rs->fields['three_digit']);
			else
				return false;
		}

		return true;
	}

	public function radio($input_id,$name,$table,$field,$id,$class) {
		include_once(PATH_CORE.'list_radio.inc.php');

		echo list_radio($input_id,$name,$table,$field,$id,$class);
	}

	public function check($input_id,$name,$table,$field,$default,$class) {
		include_once(PATH_CORE.'list_check.inc.php');

		echo list_check($input_id,$name,$table,$field,$default,$class);
	}

	public function select_groups($default,$field_name,$class,$size,$own_account) {
		include_once(PATH_CORE.'list_select_groups.inc.php');

		return list_select_groups($default,$field_name,$class,$size,$own_account);
	}

	public function calender_view($field,$default,$css,$id) {
		include_once(PATH_CORE.'list_calendar.inc.php');

		if (isset($default) && $default != '' && $default != '0')
			$default = date(UNIX_DATE_FORMAT,$default);
		else
			$default = '';

		echo list_calender_add($field,$default,$css,$id);
	}

	public function calender_add($field,$default,$css,$id='') {
		if ($default == 'now')
			$default = date(UNIX_DATE_FORMAT,time());

		include_once(PATH_CORE.'list_calendar.inc.php');
		echo list_calender_add($field,$default,$css,$id);
	}

	# @todo Remove?
	public function calender_add_static_var($field,$default,$css) {
		include_once(PATH_CORE.'list_calendar.inc.php');

		if ($default == 'now')
			$default = date(UNIX_DATE_FORMAT,time());

		echo list_calender_add_static($field,$default,$css);
	}

	public function calender_search($field,$default,$css) {
		if ($default == 'now')
			$default = date(UNIX_DATE_FORMAT,time());

		foreach (array(0,1) as $id) {
			printf('<select name="field_option[%s][%s]"><option value=">">></option><option value="<"><</option><option value="<="><=</option><option value=">=">>=</option><option value="!=">!=</option></select>&nbsp;&nbsp;',$field,$id);
			$this->calender_view($field,$default,$css,$id);
			echo '<br/>';
		}
	}

	public function setup_default_date($default,$css)	{
		include_once(PATH_CORE.'list_setup_default_date.inc.php');

		echo list_setup_default_date($default,$css);
	}

	public function card_type_menu($default_selected,$checkout_id,$field='checkout_plugin_data[card_type]',$class,$all=false) {
		include_once(PATH_CORE.'list_card_type_menu.inc.php');

		echo list_card_type_menu($default_selected,$checkout_id,$field,$class,$all);
	}

	public function time($date) {
		if ($date == '')
			$date = time();

		return date(DEFAULT_TIME_FORMAT,$date);
	}

	public function date($date) {
		if ($date == '')
			$date = time();

		return date(UNIX_DATE_FORMAT,$date);
	}

	public function date_time($date) {
		if ($date == '')
			return 'UNKNOWN';

		return sprintf('%s  %s',$this->date($date),$this->time($date));
	}

	public function unserial($data,$var) {
		global $smarty;

		if (is_string($data))
			$array = unserialize($data);
		if (is_array($array))
			$smarty->assign($var,$array);
	}

	public function smarty_array($table,$field,$sql,$return) { return $this->tmSmartyArray($table,$field,$sql,$return); }
	public function tmSmartyArray($table,$field,$sql,$return) {
		$db = &DB();
		$smart = array();

		# @todo this sqlSelect() is using a call for DEFAULT_SITE until all calls to smarty_array() dont start $sql with 'AND'
		$result = $db->Execute($s=sqlSelect($table,sprintf('id,%s',$field),array('where'=>sprintf('site_id=%s %s',DEFAULT_SITE,$sql),'orderby'=>$field)));
		if (! $result) {
			global $C_debug;
			$C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg());

			return false;
		}

		while (! $result->EOF) {
			array_push($smart,$result->fields);
			$result->MoveNext();
		}

		global $smarty;
		$smarty->assign($return,$smart);

		return true;
	}

	function translate($table,$field1,$field2,$id,$var) {
		global $smarty;
		$db = &DB();
		$sql= "SELECT id, $field1 FROM ".AGILE_DB_PREFIX."$table
			  WHERE site_id = " . $db->qstr(DEFAULT_SITE) . " AND
			  language_id   = " . $db->qstr(SESS_LANGUAGE).  " AND " .
			  $field2 . "   = " . $db->qstr($id);
		$result = $db->Execute($sql);
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg());
			return false;
		} else if($result->RecordCount() > 0) {
			$smarty->assign("$var",$result->fields);
			return $result->fields;
		} else {
			if (SESS_LANGUAGE == DEFAULT_LANGUAGE) {
				return false;
			} else {
				$sql= "SELECT id, $field1 FROM ".AGILE_DB_PREFIX."$table
					  WHERE site_id = " . $db->qstr(DEFAULT_SITE) . " AND
					  language_id   = " . $db->qstr(DEFAULT_LANGUAGE).  " AND " .
					  $field2 . "   = " . $db->qstr($id);
				$result = $db->Execute($sql);
				if ($result === false) {
					global $C_debug;
					$C_debug->error(__FILE__,__METHOD__,$db->ErrorMsg());
					return false;
				} else if($result->RecordCount() > 0) {
					$smarty->assign("$var",$result->fields);
					return $result->fields;
				} else {
					return false;
				}
			}
		}
	}

	public function bool($field,$curr_value,$class='form_menu',$extra='') {
		# If the field is blank, we'll just return true/false
		if (! $field)
			return $curr_value ? _('Yes') : _('No');

		if ($curr_value == 'all') {
			$true = '';
			$false= '';

		} elseif($curr_value == '1') {
			$true = ' selected="selected"';
			$false= '';

		} else {
			$true = '';
			$false= ' selected="selected"';
		}

		$return = sprintf('<select id="%s" name="%s" class="%s" %s>',preg_replace('/[\[\]]/','_',$field),$field,$class,$extra);

		if ($curr_value == 'all')
			$return .= '<option value="" selected="selected">&nbsp;</option>';

		$return .= sprintf('<option value="1"%s>%s</option>',$true,_('Yes'));
		$return .= sprintf('<option value="0"%s>%s</option>',$false,_('No'));
		$return .= '</select>';

		echo $return;
	}

	function graphview() {
		global $VAR,$C_method;
		$auth = Array('product:top','account_admin:top','affiliate:top','invoice:compare');
		for($i=0; $i<count($auth); $i++) {
			if($auth[$i] == $VAR['graph']) {
				$m = explode(':',$VAR['graph']);
				$C_method->exe_noauth($m[0],$m[1]);
				exit;
			}
		}
	}

	function bar_graph() {
		global $VAR;
		require_once(PATH_CORE   . 'graph.inc.php');
		$graph   = new CORE_graph;
		@$module = $VAR['graph_module'];
		@$range  = $VAR['graph_range'];
		@$start  = $VAR['graph_start'];
		@$extra  = $VAR['graph_extra'];
		$graph->BAR_graph($module,$range,$start,$extra);
	}

	function pie_graph() {
		global $VAR;
		require_once(PATH_CORE   . 'graph.inc.php');
		$graph   = new CORE_graph;
		@$module = $VAR['graph_module'];
		@$method = $VAR['graph_method'];
		@$range  = $VAR['graph_range'];
		@$start  = $VAR['graph_start'];
		@$extra  = $VAR['graph_extra'];
		$graph->PIE_graph($module,$method,$range,$start,$extra);
	}

	# @todo consider changing this so that it returns the .inc file if the module is installed
	# so that $a = x->is_installed('y'); require_once $a can be used
	/**
	 * Check if a module is installed
	 *
	 * @param string Name of Module to check
	 * @return string include path to module, if installed, otherwise false
	 */
	public function is_installed($module) {
		$file = sprintf('%s%s/%s.inc.php',PATH_MODULES,$module,$module);

		# If we have already checked, then return the file.
		if (isset($this->is_installed[$module]) && $this->is_installed[$module])
			return $file;

		if (file_exists($file) && $this->auth_method_by_name($module,'search')) {
			$this->is_installed[$module] = true;
			return $file;
		}

		$db = &DB();
		$result = $db->Execute(sqlSelect('module','id',array('where'=>array('name'=>$module,'status'=>1))));
		if ($result && $result->RecordCount() && file_exists($file)) {
			$this->is_installed[$module] = true;
			return $file;

		} else {
			return false;
		}
	}

	# @todo this should probably be private?
	public function auth_method_by_name($module,$method) {
		global $C_auth;

		if (! is_object($C_auth))
			return false;

		return $C_auth->auth_method_by_name($module,$method);
	}

	/**
	 * Generate the admin menu
	 */
	public function generate_admin_menu() {
		global $C_auth;

		echo $C_auth->generate_admin_menu();
	}

	# @todo to deprecate
	private function account($field) {
		if (empty($this->account) && SESS_LOGGED) {
			$db = &DB();
			$sql    = 'SELECT * FROM ' . AGILE_DB_PREFIX . 'account WHERE
						site_id     = ' . $db->qstr(DEFAULT_SITE) . ' AND
						id  = ' . $db->qstr(SESS_ACCOUNT);
			$result = $db->Execute($sql);
			$this->account = $result->fields;
		}
		echo $this->account[$field];
	}

	# Get the AgileBill version info
	# @todo to deprecate
	private function version()  {
		die();
		require_once(PATH_CORE.'version.inc.php');
	}
}
?>