<?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
 * 
 * For questions, help, comments, discussion, etc., please join the
 * Agileco community forums at http://forum.agileco.com/ 
 *
 * @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
 * @version 1.4.93
 */
	
class CORE_search
{

	var $recent_js;
	var $recent_menu;
	var $saved_js;
	var $saved_menu;



	/**
	* Create a new search record.
	*
	* @return 	void
	* @since 	Version 1.0
	* @param	array Contains the elements of the search query
	*/	

	function add($arr)
	{
		$db = &DB(); 
		# determine the search id:
		$this->id = $db->GenID(AGILE_DB_PREFIX . 'search_id');

		# safely store the SQL Query:
		$sql = $db->qstr($arr['sql']);


		# set the time when this record expires
		$date_expire = (time() + (SEARCH_EXPIRE*60));

		# create the search record
		$q  = "INSERT INTO " . AGILE_DB_PREFIX . "search SET
			id			= '" . $this->id . "',
			site_id 	= '" . DEFAULT_SITE . "',
			session_id 	= '" . SESS . "',
			account_id 	= '" . SESS_ACCOUNT . "',
			module		= '" . $arr['module'] . "',
			date_orig	= '" . time() . "',
			date_expire = '" . $date_expire . "',
			full_sql	= $sql,
						order_by	= '" . $arr['order_by'] . "',
			limit_no	= '" . $arr['limit'] . "',
			results		= '" . $arr['results'] . "'";
		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('search.inc.php','add', $db->ErrorMsg());
		}
	}


	/**
	* Retrieves a specific search record, and sets the values to the object.
	* 
	* @return 	void
	* @since 	Version 1.0
	* @todo		Complete the search refresh feature
	* @param	int Contians the Search Id to be retrieved
	*/	

	function get($id)
	{
		# get the details for this search
		$db = &DB();
		$q  = "SELECT *
				FROM " . AGILE_DB_PREFIX . "search
				WHERE
				id			= '" . $id . "'
				AND
				site_id 	= '" . DEFAULT_SITE . "'";
		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('search.inc.php','get', $db->ErrorMsg());
		}

		# get the search values
		$this->id			=   $id;
		$this->account      =   $result->fields['account_id'];
		$this->session      =   $result->fields['session_id'];  
		$this->date_orig	=	$result->fields['date_orig'];
		$this->date_expire	=	$result->fields['date_expire'];
		$this->sql			=	$result->fields['full_sql'];
		$this->order_by		=	$result->fields['order_by'];
		$this->limit		=	$result->fields['limit_no'];


		# check if this search has expired:
		if($this->date_expire <= time())
		{
			# refresh the search
			# $this->results 	=	$this->refresh($id);
			# echo "<BR> this search has expired! Refreshing.... <BR>";
			$this->results		=	$result->fields['results'];
		}
		else
		{
			# use the existing result count
			$this->results		=	$result->fields['results'];
		}
		return;
	}


	/**
	* Refreshes the result count of a specific search and stores the new results in the search record,
	* and returns the new search result count. 
	* 
	* @return 	int Contains the new search results count
	* @since 	Version 1.0
	* @todo		Complete the search refresh code
	* @param	int Contians the Search Id to be refreshed
	* @return	int	The new search results count
	*/

	function refresh($id)
	{

	}



	/**
	* Saves the current search for later retreival.
	* 
	* @return 	void
	* @since 	Version 1.0
	* @todo		Add some error checking for previously used nicknames, identical searches, etc.
	* @param	int Contians the Search Id to be saved
	* @param	string Contains the name of the Module this search was for
	* @param	string Contains search nickname to remember this search as
	*/

	 function save($search_id,$module,$name)
	 {
		# save the search
		$db = &DB();

		# determine the search id:
		$this->id = $db->GenID('search_saved');

		$n = $db->qstr($name);

		# generate the insert statement	 	
		$q  = "INSERT INTO " . AGILE_DB_PREFIX . "search_saved SET
				id 			= '$this->id',
				site_id 	= '" . DEFAULT_SITE . "',
				search_id   = '$search_id',
				account_id	= '" . SESS_ACCOUNT . "',
				session_id	= '" . SESS . "',
				date_orig	= '" . time() . "',
				date_last	= '" . time() . "',
				date_expire	= '',
				module		= '$module',
				name		= $n";
		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('search.inc.php','refresh', $db->ErrorMsg());
		}	 
	 }



	/**
	* Build the recent search menu and JavaScript
	* 
	* @return 	void
	* @since 	Version 1.0
	* @param	string Contains the name of the Module to find recent searches for
	*/

	function build_recent($module)
	{
		# disable for now
		return 0;

		if(isset($this->arr)) unset ($this->arr);

		# get the recent searches
		$db = &DB();
		$q  = "SELECT id, date_orig, date_expire, full_sql, order_by, limit_no
				FROM " . AGILE_DB_PREFIX . "search
				WHERE
				session_id	= '" . SESS . "'
				OR
				account_id	= '" . SESS_ACCOUNT . "'
				AND
				module		= '$module'
				AND
				date_expire >= '" . time() . "'
				AND
				site_id 	= '" . DEFAULT_SITE . "'";
		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('search.inc.php','build_recent', $db->ErrorMsg());
		}

		$results = $result->RecordCount();


			$i  = 0;
			while (!$result->EOF) {
				# get the fields for this loop
				$sql = $result->fields['full_sql'];

				# remove the WHERE
				$sql = trim($sql);
				$sql = eregi_replace("WHERE","",$sql);
				$sql = eregi_replace("AND$","",$sql);
				$sql = trim($sql);

				# replace any sql statements before we split the string
				$sql = ereg_replace(" = ","===",$sql);
				$sql = ereg_replace(" LIKE ","===",$sql);


				# determine the number of fields

				$ii=0;
				if(ereg(" AND ", $sql))
				{
					$sql = split(" AND ",$sql);
					$this_fields = count($sql);

					# loop
					for($count=0; $count < $this_fields; $count++)
					{
						# do each field
						$sqls = split("==",$sql[$count]);
						$field[$count][name]  = $sqls[0];
						$field[$count][value] = ereg_replace("'","",$sqls[1]);
						$field[$count][value] = ereg_replace("=","",$field[$count][value]);

						# check that the name & value are both set...
						if($field[$count][value] != '' && $field[$count][name] != '')
						{
							if(!isset($this->arr[$i][$ii][limit]))
							{
								$this->arr[$i][$ii][search] = $result->fields['id'];
								$this->arr[$i][$ii][limit] = $result->fields['limit_no'];
								$this->arr[$i][$ii][order] = $result->fields['order_by'];
							}

						   $this->arr[$i][$ii][0] = $field[$count][name];
						   $this->arr[$i][$ii][1] = $field[$count][value];

							# echo "<BR><BR>Field/Name: " . $this->arr[$i][$ii][0] . " -> "  . $this->arr[$i][$ii][1];
							$ii++;

							# set the menu up for Smarty
							$this->recent_menu[$i] = $result->fields;
						}
					}
				}
				else
				{
					# field count
					$this_fields = 1;

					# do this one field
					$sqls = split("==",$sql);
					$field[name]  = $sqls[0];
					$field[value] = ereg_replace("'","",$sqls[1]);
					$field[value] = ereg_replace("=","",$field[value]);

					# check that the name & value are both set...
					if($field[value] != '' && $field[name] != '')
					{
						if(!isset($this->arr[$i][$ii][limit]))
						{
							$this->arr[$i][$ii][search] = $result->fields['id'];
							$this->arr[$i][$ii][limit] = $result->fields['limit_no'];
							$this->arr[$i][$ii][order] = $result->fields['order_by'];
						}

						$this->arr[$i][$ii][0] = $field[name];
						$this->arr[$i][$ii][1] = $field[value];

						# echo "<BR><BR>Field/Name: " . $field[name] . " -> "  . $field[value];
						$ii++;

						# set the menu up for Smarty
						$this->recent_menu[$i] = $result->fields;
					}

				}


				# continue loop
				$result->MoveNext();
				if ($ii > 0) $i++;
			}

		# finish the JS:
		if($i > 0 && $ii > 0)
		{
			# build the JavaScript
			$this->recent_js = '
			<script language="JavaScript"> 

			// SEARCH FORM CONTROLLER
			function fill_search_recent(mod,fields,field_count,limit,order,s,c)
			{
				document.search.reset();
				var id = document.search_recent.search_id.selectedIndex;
				if(id == 0) return "";
				var idx = document.search_recent.search_id.options[id].value;       
				for(loop=0; loop <= c; loop++)
				{
					if(s[loop] == idx) 
					{
						var i = loop;
					}
				}
				document.search.limit.value    = limit[i];
				document.search.order_by.value = order[i];  
				for(loop=0; loop < field_count[i]; loop++)
				{
					var fill = "document.search." +  mod + "_" + fields[i][loop][0] + ".value = fields[i][loop][1];"
					eval(fill);
				}                           
			}'; 

			$this->recent_js .= "
			var mod = '$module';
			var c = $i;
			var fields = new Array($i);
			var limit = new Array($i);
			var order = new Array($i);
			var field_count = new Array($i);
			var s = new Array($i);
			";

			# loop through the searches
			for ($ix = 0; $ix <= count($this->arr); $ix++)
			{
				# loop through the fields
				for ($iix = 0; $iix <= count($this->arr[$ix]); $iix++)
				{

				# check that the name/value is set...
				if( $this->arr[$ix][$iix][0] != "" &&  $this->arr[$ix][$iix][1] != "")
				{
					$count = count($this->arr[$ix]);

					# setup the arrays:
					if($iix==0)
					{
					$this->recent_js .= "
					s[$ix]         		= '" . $this->arr[$ix][$iix][search] . "';
					limit[$ix]          = '" . $this->arr[$ix][$iix][limit] . "';
					order[$ix]          = '" . $this->arr[$ix][$iix][order] . "';
					field_count[$ix]= '" . $count . "';
					fields[$ix]         = new Array(field_count[$ix]);
					";
					}

					# set the field settings
					$this->recent_js .=
					"
					fields[$ix][$iix]       = new Array(2);
					fields[$ix][$iix][0]    = '" . $this->arr[$ix][$iix][0] . "';
					fields[$ix][$iix][1]    = '" . $this->arr[$ix][$iix][1] . "';
					";
					}
				}
			}

			# finish the js
			$this->recent_js .= "
			</script>
			";
		}
		else
		{
			$this->recent_js = FALSE;
		}
	} # end of functino




	/**
	* Build the saved search menu and JavaScript
	* 
	* @return 	void
	* @since 	Version 1.0
	* @param	string Contains the name of the Module to find saved searches for
	*/

	function build_saved($module)
	{
		 # disable for now
		return 0;

	if(isset($this->arr)) unset ($this->arr);

	# get the saved searches
	# get the recent searches
	$db1 = &DB();
	$q  = "SELECT id, search_id, name
			FROM " . AGILE_DB_PREFIX . "search_saved
			WHERE
			session_id	= '" . SESS . "'
			OR
			account_id	= '" . SESS_ACCOUNT . "'
			AND
			module		= '$module'
			AND
			site_id 	= '" . DEFAULT_SITE . "'
			ORDER BY name ASC";
	$result1 = $db1->Execute($q);

	# error reporting
	if ($result1 === false)
	{
		global $C_debug;
		$C_debug->sql_error($db1->ErrorMsg());
	}

	$i=0; 
	while (!$result1->EOF) 
	{	
		# get the information for this search
		$db = &DB();
		$q  = "SELECT id, full_sql, order_by, limit_no
				FROM " . AGILE_DB_PREFIX . "search
				WHERE
				id			= '" . $result1->fields['search_id'] . "'
				AND
				site_id 	= '" . DEFAULT_SITE . "'";
		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('search.inc.php','build_saved', $db->ErrorMsg());
		}

				# get the fields for this loop
				$sql = $result->fields['full_sql'];

				# remove the WHERE
				$sql = trim($sql);
				$sql = eregi_replace("WHERE","",$sql);
				$sql = eregi_replace("AND$","",$sql);
				$sql = trim($sql);

				# replace any sql statements before we split the string
				$sql = ereg_replace(" = ","===",$sql);
				$sql = ereg_replace(" LIKE ","===",$sql);


				# determine the number of fields

				$ii=0;
				if(ereg(" AND ", $sql))
				{
					$sql = split(" AND ",$sql);
					$this_fields = count($sql);

					# loop
					for($count=0; $count < $this_fields; $count++)
					{
						# do each field
						$sqls = split("==",$sql[$count]);
						$field[$count][name]  = $sqls[0];
						$field[$count][value] = ereg_replace("'","",$sqls[1]);
						$field[$count][value] = ereg_replace("=","",$field[$count][value]);

						# check that the name & value are both set...
						if($field[$count][value] != '' && $field[$count][name] != '')
						{
							if(!isset($this->arr[$i][$ii][limit]))
							{
								$this->arr[$i][$ii][search] = $result->fields['id'];
								$this->arr[$i][$ii][limit] = $result->fields['limit_no'];
								$this->arr[$i][$ii][order] = $result->fields['order_by'];
							}

							$this->arr[$i][$ii][0] = $field[$count][name];
							$this->arr[$i][$ii][1] = $field[$count][value];

							# echo "<BR><BR>Field/Name: " . $this->arr[$i][$ii][0] . " -> "  . $this->arr[$i][$ii][1];
							$ii++;
							$this->saved_menu[$i] = $result->fields;
							$this->saved_menu[$i]["name"] = $result1->fields["name"];
						}
					}
				}
				else
				{
					# field count
					$this_fields = 1;

					# do this one field
					$sqls = split("==",$sql);
					$field[name]  = $sqls[0];
					$field[value] = ereg_replace("'","",$sqls[1]);
					$field[value] = ereg_replace("=","",$field[value]);

					# check that the name & value are both set...
					if($field[value] != '' && $field[name] != '')
					{
						if(!isset($this->arr[$i][$ii][limit]))
						{
							$this->arr[$i][$ii][search] = $result->fields['id'];
							$this->arr[$i][$ii][limit] = $result->fields['limit_no'];
							$this->arr[$i][$ii][order] = $result->fields['order_by'];
						}

						$this->arr[$i][$ii][0] = $field[name];
						$this->arr[$i][$ii][1] = $field[value];

						#	echo "<BR><BR>Field/Name: " . $field[name] . " -> "  . $field[value];
						$ii++;

						# set the menu up for Smarty
						$this->saved_menu[$i] = $result->fields;
						$this->saved_menu[$i]["name"] = $result1->fields["name"];
					}

				}
		$result1->MoveNext();  
		if ($ii > 0) $i++;              
	}




		# finish the JS:
		if($i > 0 && $ii > 0)
		{
			# build the JavaScript
			$this->saved_js = '
			<script language="JavaScript"> 

			// SEARCH FORM CONTROLLER
			function fill_search_saved(s_mod,s_fields,s_field_count,s_limit,s_order,s_s,s_c)
			{
				document.search.reset();
				var id = document.search_saved.search_id.selectedIndex;
				if(id == 0) return "";
				var idx = document.search_saved.search_id.options[id].value;       
				for(loop=0; loop <= s_c; loop++)
				{
					if(s_s[loop] == idx) 
					{
						var i = loop; 
					}
				}
				document.search.limit.value    = s_limit[i];
				document.search.order_by.value = s_order[i];  
				for(loop=0; loop < s_field_count[i]; loop++)
				{
					var fill = "document.search." +  s_mod + "_" + s_fields[i][loop][0] + ".value = s_fields[i][loop][1];"
					eval(fill);
				}
			}'; 

			$this->saved_js .= "
			var s_mod = '$module';
			var s_c = $i;
			var s_fields = new Array($i);
			var s_limit = new Array($i);
			var s_order = new Array($i);
			var s_field_count = new Array($i);
			var s_s = new Array($i);
			";

			# loop through the searches
			for ($ix = 0; $ix <= count($this->arr); $ix++)
			{
				# loop through the fields
				for ($iix = 0; $iix <= count($this->arr[$ix]); $iix++)
				{

				# check that the name/value is set...
				if( $this->arr[$ix][$iix][0] != "" &&  $this->arr[$ix][$iix][1] != "")
				{
					$count = count($this->arr[$ix]);

					# setup the arrays:
					if($iix==0)
					{
					$this->saved_js .= "
					s_s[$ix]         		= '" . $this->arr[$ix][$iix][search] . "';
					s_limit[$ix]          = '" . $this->arr[$ix][$iix][limit] . "';
					s_order[$ix]          = '" . $this->arr[$ix][$iix][order] . "';
					s_field_count[$ix]= '" . $count . "';
					s_fields[$ix]         = new Array(s_field_count[$ix]);
					";
					}

					# set the field settings
					$this->saved_js .=
					"
					s_fields[$ix][$iix]       = new Array(2);
					s_fields[$ix][$iix][0]    = '" . $this->arr[$ix][$iix][0] . "';
					s_fields[$ix][$iix][1]    = '" . $this->arr[$ix][$iix][1] . "';
					";
					}
				}
			}

			# finish the js
			$this->saved_js .= "
			</script>
			";
		}
		else
		{
			$this->saved_js = FALSE;
		}
	}
}
?>