<?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
 */
	

/**
* Export Handler Class
* 
* This class handles the various export methods for excel, pdf, csv, xml, & txt (tab frormatted).  
*/
class CORE_export
{


########################################
##	EXPORT MULTIPE PDF INVOICES    #####
########################################

function pdf_invoice($VAR, $construct, $type)
{
	global $V_validate, $C_list, $C_translate;

	# loop through the field list to create the sql queries
	$arr = $construct->method[$type];
	$field_list = '';
	$i=0;
	while (list ($key, $value) = each ($arr))
	{
		if($i == 0)
		{
			$field_var =  $construct->table . '_' . $value;
			$field_list .= AGILE_DB_PREFIX . $construct->table . '.' . $value;

			// determine if this record is linked to another table/field
			if($construct->field[$value]["asso_table"] != "")
			{
				$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
			}
		}
		else
		{
			$field_var =  $construct->table . '_' . $value;
			$field_list .= "," . AGILE_DB_PREFIX . $construct->table . "." . $value;

			// determine if this record is linked to another table/field
			if($construct->field[$value]["asso_table"] != "")
			{
				$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
			}
		}
		$i++;
	}

	# get the search details:
	if(isset($VAR['search_id']))
	{
		include_once(PATH_CORE   . 'search.inc.php');
		$search = new CORE_search;
		$search->get($VAR['search_id']);
	}
	else
	{
		echo '<BR> The search terms submitted were invalid!';
	}

	# get the sort order details:
	if(isset($VAR['order_by']) && $VAR['order_by'] != "")
	{
		$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $VAR['order_by'];
		$smarty_order =  $VAR['order_by'];
	}
	else
	{
		$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $construct->order_by;
		$smarty_order =  $search->order_by;
	}

	# format saved search string
	$sql = explode (" WHERE ", $search->sql);

	# generate the full query
	$db = &DB();
	$q = eregi_replace("%%fieldList%%", $field_list, $search->sql);
	$q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q);
	$q = eregi_replace("%%whereList%%", "", $q);
	$q .= " ".AGILE_DB_PREFIX . "invoice.site_id = '" . DEFAULT_SITE . "'";
	$q .= $order_by;

	$invoice = $db->Execute($q);

	# error reporting
	if ($invoice === false)
	{
		global $C_debug;
		$C_debug->error('core:export.inc.php','pdf_invoice', $db->ErrorMsg() . '<br><br>' .$q);
		echo "An SQL error has occured!";
		return;
	}

	include_once(PATH_MODULES.'invoice/invoice.inc.php');
	$iv=new invoice;

	$iv->pdfExport($invoice);


}	



########################################
##	ADMIN SEARCH EXCEL EXPORT      #####
########################################

function search_excel($VAR, $construct, $type)
{
	global $C_translate;

	# set the field list for this method:
	$arr = $construct->method["$type"];
	$filename = 'Export.xls';


	# determine what action to take:
	# inline display, download, email, web save    	

	if($VAR["type"] == "display")
	{
	   header ('Content-type: application/x-msexcel');
	   header ("Content-Disposition: inline; filename=$filename" );
	   header ("Content-Description: PHP/INTERBASE Generated Data" );
	}

	else if($VAR["type"] == "download")
	{
		header ("Content-Disposition: attachment; filename=$filename" );
	}

	else if($VAR["type"] == "email")
	{
		echo "Email exports not supported yet!";
		exit;
	}

	else if($VAR["type"] == "email")
	{
		echo "Saving exports not supported yet!";
		exit;
	}           	

	# Start the Excel Stream
	xlsBOF();


		/************** BEGIN STANDARD EXPORT SEARCH CODE *********************/


		   # set the field list for this method:
		 $arr = $construct->method["$type"];

		 # loop through the field list to create the sql queries
		 $arr = $construct->method[$type];
		 $field_list = '';
		 $i=0;
		 while (list ($key, $value) = each ($arr))
		 {
			 if($i == 0)
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= AGILE_DB_PREFIX . $construct->table . '.' . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 else
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= "," . AGILE_DB_PREFIX . $construct->table . "." . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 $i++;
		 }

		# get the search details:
		if(isset($VAR['search_id']))
		{
			include_once(PATH_CORE   . 'search.inc.php');
			$search = new CORE_search;
			$search->get($VAR['search_id']);
		}
		else
		{
			echo '<BR> The search terms submitted were invalid!';
		}

		# get the sort order details:
		if(isset($VAR['order_by']) && $VAR['order_by'] != "")
		{
			$order_by = ' ORDER BY ' .   AGILE_DB_PREFIX . $construct->table . '.' .  $VAR['order_by'];
			$smarty_order =  $VAR['order_by'];
		}
		else
		{
			$order_by = ' ORDER BY ' .   AGILE_DB_PREFIX . $construct->table . '.' .  $construct->order_by;
			$smarty_order =  $search->order_by;
		}

		# determine the offset & limit
		if(isset($VAR['page']))
		{
			$current_page = $VAR['page'];
		}
		else
		{
			$current_page = '0';
		}

		# determine the offset & limit
		if($current_page==0)
		{
			$offset = '0,10000000';
		}
		else
		{
			$offset =  (($current_page * $search->limit) - $search->limit). ',' . $search->limit;
		}

		# format saved search string
		$sql = explode (" WHERE ", $search->sql);

		# generate the full query
		$q = eregi_replace("%%fieldList%%", $field_list, $search->sql);
		$q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q);
		$q = eregi_replace("%%whereList%%", "", $q);
		$q .= " " . AGILE_DB_PREFIX . $construct->table.".site_id = '" . DEFAULT_SITE . "'";
		$q .= $order_by;
		$db = &DB();

		# determine the offset & limit             
		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('core:export.inc.php','search_xml', $db->ErrorMsg() . '<br><br>' .$q);
			echo "An SQL error has occured!";
			return;
		}

		# put the results into an array
		$i=0;
		$class_name = TRUE;
		$results = '';
		while (!$result->EOF) {
			$results[$i] = $result->fields;
			   $result->MoveNext();
			   $i++;
		}

		# get any linked fields
		if($i > 0)
		{
			$this->result = $results;
			$db_join = new CORE_database;
			$this->result = $db_join->join_fields($results, $this->linked);
		}
		else
		{
			$this->result = $results;
		}

		/************** END STANDARD EXPORT SEARCH CODE *********************/


	# WRITE THE FIRST COLUMN
	reset($arr);
	$column=0;
	while (list ($key, $value) = each ($arr))
	{
		// get the translated field name
		$field = $C_translate->translate('field_'.$value, $construct->module,'');

		if(gettype($this->result["$ii"]["$key"]) != "string" )
		{
			xlsWriteLabel($row,$column,$field);
		}
		$column++;
	}


	# LOOP THROUGH THE RESULTS & DISPLAY AS EXCEL
	$row = 1;
	for($ii = 0; $ii < count($this->result); $ii++)
	{
		# get the data for each cell:
		reset($arr);
		$column=0;
		while (list ($key, $value) = each ($arr))
		{
			if  ($construct->field["$value"][convert] == 'date'      ||
				 $construct->field["$value"][convert] == 'time'      ||
				 $construct->field["$value"][convert] == 'date-now'  ||
				 $construct->field["$value"][convert] == 'date-time' )
			{
				 $data = date(UNIX_DATE_FORMAT,$this->result["$ii"]["$value"]);
			} else {
				 $data = $this->result["$ii"]["$value"];
			}

			if(is_numeric ($data))
				xlsWriteNumber($row,$column,$data);
			else
				xlsWriteLabel($row,$column,$data);

			$column++;
		}
		$row++;
	}


	# Dispay the output
	xlsEOF();
	exit();
}	












	###################################
	##	ADMIN SEARCH PDF EXPORT   #####
	###################################

	function search_pdf($VAR, $construct, $type)
	{
		# include fpdf class:
		include_once(PATH_CORE . 'fpdf.inc.php');

		# set the field list for this method:
		$arr = $construct->method["$type"];

		# loop through the field list to create the sql queries
		$field_list = '';
		$heading_list = '';
		$width_list = '';
		$i=0;
		while (list ($key, $value) = each ($arr))
		{
			if($i == 0)
			{
				$field_var =  $construct->table . '_' . $value;
				$field_list .= $value;
				$heading_list .= strtoupper($value);		 // <- translate
				$width_list .= $construct->field[$value]['pdf_width'];
			}
			else
			{
				$field_var =  $construct->table . '_' . $value;
				$field_list .= "," . $value;
				$heading_list .= "," . strtoupper($value);		// <- translate
				$width_list .= "," . $construct->field[$value]['pdf_width'];
			}
			$i++;
		}

		# start the new PDF class...
		$pdf = new PDF_MC_Table();
		$pdf->Open();
		$pdf->AddPage();

		# Determine the number of columns and width for each one...	
		$SetWidths = split(",",$width_list);
		$pdf->SetWidths($SetWidths);	

		# Define the table heading	
		$TableHeading =  split(",",$heading_list);			

		# Define the Properties for the table heading cells:			
		# set the font:
		$pdf->HeadFontFamily 	= "Arial";
		$pdf->HeadFontStyle  	= "BI";
		$pdf->HeadFontSize		= 8;

		# set the font color:
		$pdf->HeadTextColor1	= 255;
		$pdf->HeadTextColor2	= 255;
		$pdf->HeadTextColor3	= 255;

		# set the bg color:
		$pdf->HeadFillColor1	= 90;
		$pdf->HeadFillColor2	= 90;
		$pdf->HeadFillColor3	= 90;

		# set the hieght
		$pdf->HeadHeight		= 6;

		# Print the Heading:
		$pdf->HeadRow($TableHeading);

		# Define the row settings for the rest of the cells...	
		# define the font settings
		$pdf->SetFontFamily 	= "Arial";
		$pdf->SetFontStyle  	= "";
		$pdf->SetFontSize		= "7";

		# set the hieght
		$pdf->RowHeight		= 4;			




		/************** BEGIN STANDARD EXPORT SEARCH CODE *********************/


		 # set the field list for this method:
		 $arr = $construct->method["$type"];

		 # loop through the field list to create the sql queries
		 $arr = $construct->method[$type];
		 $field_list = '';
		 $i=0;
		 while (list ($key, $value) = each ($arr))
		 {
			 if($i == 0)
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= AGILE_DB_PREFIX . $construct->table . '.' . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 else
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= "," . AGILE_DB_PREFIX . $construct->table . "." . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 $i++;
		 }

		# get the search details:
		if(isset($VAR['search_id']))
		{
			include_once(PATH_CORE   . 'search.inc.php');
			$search = new CORE_search;
			$search->get($VAR['search_id']);
		}
		else
		{
			echo '<BR> The search terms submitted were invalid!';
		}

		# get the sort order details:
		if(isset($VAR['order_by']) && $VAR['order_by'] != "")
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $VAR['order_by'];
			$smarty_order =  $VAR['order_by'];
		}
		else
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $construct->order_by;
			$smarty_order =  $search->order_by;
		}

		# format saved search string
		$sql = explode (" WHERE ", $search->sql);

		# generate the full query
		$q = eregi_replace("%%fieldList%%", $field_list, $search->sql);
		$q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q);
		$q = eregi_replace("%%whereList%%", "", $q);
		$q .= " ".AGILE_DB_PREFIX . $construct->table.".site_id = '" . DEFAULT_SITE . "'";
		$q .= $order_by;
		$db = &DB();

		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('core:export.inc.php','search_xml', $db->ErrorMsg() . '<br><br>' .$q);
			echo "An SQL error has occured!";
			return;
		}

		# put the results into an array
		$i=0;
		$class_name = TRUE;
		$results = '';
		while (!$result->EOF) {
			$results[$i] = $result->fields;
			   $result->MoveNext();
			   $i++;
		}

		# get any linked fields
		if($i > 0)
		{
			$this->result = $results;
			$db_join = new CORE_database;
			$this->result = $db_join->join_fields($results, $this->linked);
		}
		else
		{
			$this->result = $results;
		}

		/************** END STANDARD EXPORT SEARCH CODE *********************/





		# LOOP THROUGH THE RESULTS & DISPLAY AS PDF
		$results = $result->RecordCount();
		$BackAlt = TRUE;
		while (!$result->EOF)
		{
			# get the data for each cell:
			reset($arr);
			$CurrRow='';
			$i=0;
			while (list ($key, $value) = each ($arr))
			{
				if($i == 0)
				{
					$CurrRow .= $result->fields["$key"];
				}
				else
				{
					$CurrRow .= "::" . $result->fields["$key"];
				}
				$i++;
			}		
			$ThisRow =  split("::",$CurrRow);			

			# set the colors & fonts
			if($BackAlt)
			{
				# alternating row 1:
				$pdf->SetTextColorVar1	= "50";
				$pdf->SetTextColorVar2	= "50";
				$pdf->SetTextColorVar3	= "50";			
				$pdf->SetFillColorVar1	= 255;
				$pdf->SetFillColorVar2	= 255;
				$pdf->SetFillColorVar3	= 255;						
				$BackAlt = FALSE;									
			}
			else
			{
				# alternating row 2:				
				$pdf->SetTextColorVar1	= "0";
				$pdf->SetTextColorVar2	= "0";
				$pdf->SetTextColorVar3	= "0";			
				$pdf->SetFillColorVar1	= 240;
				$pdf->SetFillColorVar2	= 240;
				$pdf->SetFillColorVar3	= 240;					
				$BackAlt = TRUE;			
			}

			# check for needed page break
			$nb=0;
			for($ii=0;$ii<count($dataarr);$ii++)
			   $nb=max($nb,$pdf->NbLines($pdf->widths[$ii],$dataarr[$ii]));
			$h=5*$nb;

			# Issue a page break first if needed
			if($pdf->CheckPageBreak($h))
				# print the Table Heading again
				$pdf->HeadRow($TableHeading);
				$pdf->Row($ThisRow);		
			# Next record
			$result->MoveNext();
		}

		# Dispay the output
		$pdf->Output();
		exit;
	}	










########################################
##	ADMIN SEARCH CSV EXPORT        #####
########################################

function search_csv($VAR, $construct, $type)
{
	global $C_translate;

	include_once(PATH_ADODB  . 'toexport.inc.php');
	$filename = 'Export.csv';


	# determine what action to take:
	# inline display, download, email, web save    	

	if($VAR["type"] == "display")
	{
	   header ('Content-type: application/x-csv');
	   header ("Content-Disposition: inline; filename=$filename" );
	}

	else if($VAR["type"] == "download")
	{
		header ("Content-Disposition: attachment; filename=$filename" );
	}



		 /************** BEGIN STANDARD EXPORT SEARCH CODE *********************/


		 # set the field list for this method:
		 $arr = $construct->method["$type"];

		 # loop through the field list to create the sql queries
		 $arr = $construct->method[$type];
		 $field_list = '';
		 $i=0;
		 while (list ($key, $value) = each ($arr))
		 {
			 if($i == 0)
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= AGILE_DB_PREFIX . $construct->table . '.' . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 else
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= "," . AGILE_DB_PREFIX . $construct->table . "." . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 $i++;
		 }

		# get the search details:
		if(isset($VAR['search_id']))
		{
			include_once(PATH_CORE   . 'search.inc.php');
			$search = new CORE_search;
			$search->get($VAR['search_id']);
		}
		else
		{
			echo '<BR> The search terms submitted were invalid!';
		}

		# get the sort order details:
		if(isset($VAR['order_by']) && $VAR['order_by'] != "")
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $VAR['order_by'];
			$smarty_order =  $VAR['order_by'];
		}
		else
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $construct->order_by;
			$smarty_order =  $search->order_by;
		}

		# format saved search string
		$sql = explode (" WHERE ", $search->sql);

		# generate the full query
		$q = eregi_replace("%%fieldList%%", $field_list, $search->sql);
		$q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q);
		$q = eregi_replace("%%whereList%%", "", $q);
		$q .= " ".AGILE_DB_PREFIX . $construct->table.".site_id = '" . DEFAULT_SITE . "'";
		$q .= $order_by;
		$db = &DB();

		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('core:export.inc.php','search_xml', $db->ErrorMsg() . '<br><br>' .$q);
			echo "An SQL error has occured!";
			return;
		}

		# put the results into an array
		$i=0;
		$class_name = TRUE;
		$results = '';
		while (!$result->EOF) {
			$results[$i] = $result->fields;
			   $result->MoveNext();
			   $i++;
		}

		# get any linked fields
		if($i > 0)
		{
			$this->result = $results;
			$db_join = new CORE_database;
			$this->result = $db_join->join_fields($results, $this->linked);
		}
		else
		{
			$this->result = $results;
		}

		/************** END STANDARD EXPORT SEARCH CODE *********************/



	# LOOP THROUGH THE RESULTS & DISPLAY AS CSV
	for($ii = 0; $ii < count($this->result); $ii++)
	{
		# print the heading:
		if($ii == 0)
		{
			reset($arr);
			$total_fields = count($arr) - 1;
			$iii = 0;
			while (list ($key, $value) = each ($arr))
			{
				 $field = $C_translate->translate('field_'.$value, $construct->module,'');
				 echo '"' . $field . '"';
				 if($total_fields > $iii) echo ',';
				 $iii++;
			}
		}	



		# new line
		echo '
';				
		# print the data for each cell:
		reset($arr);
		$total_fields = count($arr) - 1;
		$iii = 0;
		while (list ($key, $value) = each ($arr))
		{
			if  ($construct->field["$value"][convert] == 'date'      ||
				 $construct->field["$value"][convert] == 'time'      ||
				 $construct->field["$value"][convert] == 'date-now'  ||
				 $construct->field["$value"][convert] == 'date-time' )
			{
				 $data = date(UNIX_DATE_FORMAT,$this->result["$ii"]["$value"]);
			} else {
				 $data = $this->result["$ii"]["$value"];
			}

			echo '"' . $data . '"';
			if($total_fields > $iii) echo ',';
			$iii++;
		}
	}	
	exit();
}	









########################################
##	ADMIN SEARCH TAB EXPORT        #####
########################################

function search_tab($VAR, $construct, $type)
{
	global $C_translate;
	include_once(PATH_ADODB  . '/toexport.inc.php');		
	$filename = 'Export.txt';


	# determine what action to take:
	# inline display, download, email, web save    	

	if($VAR["type"] == "display")
	{
	   header ('Content-type: application/x-txt');
	   header ("Content-Disposition: inline; filename=$filename" );
	}

	else if($VAR["type"] == "download")
	{
		header ("Content-Disposition: attachment; filename=$filename" );
	}

		/************** BEGIN STANDARD EXPORT SEARCH CODE *********************/


		   # set the field list for this method:
		 $arr = $construct->method["$type"];

		 # loop through the field list to create the sql queries
		 $arr = $construct->method[$type];
		 $field_list = '';
		 $i=0;
		 while (list ($key, $value) = each ($arr))
		 {
			 if($i == 0)
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= AGILE_DB_PREFIX . $construct->table . '.' . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 else
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= "," . AGILE_DB_PREFIX . $construct->table . "." . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 $i++;
		 }

		# get the search details:
		if(isset($VAR['search_id']))
		{
			include_once(PATH_CORE   . 'search.inc.php');
			$search = new CORE_search;
			$search->get($VAR['search_id']);
		}
		else
		{
			echo '<BR> The search terms submitted were invalid!';
		}

		# get the sort order details:
		if(isset($VAR['order_by']) && $VAR['order_by'] != "")
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $VAR['order_by'];
			$smarty_order =  $VAR['order_by'];
		}
		else
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $construct->order_by;
			$smarty_order =  $search->order_by;
		}

		# format saved search string
		$sql = explode (" WHERE ", $search->sql);

		# generate the full query
		$q = eregi_replace("%%fieldList%%", $field_list, $search->sql);
		$q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q);
		$q = eregi_replace("%%whereList%%", "", $q);
		$q .= " ".AGILE_DB_PREFIX . $construct->table.".site_id = '" . DEFAULT_SITE . "'";
		$q .= $order_by;
		$db = &DB();

		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('core:export.inc.php','search_xml', $db->ErrorMsg() . '<br><br>' .$q);
			echo "An SQL error has occured!";
			return;
		}

		# put the results into an array
		$i=0;
		$class_name = TRUE;
		$results = '';
		while (!$result->EOF) {
			$results[$i] = $result->fields;
			   $result->MoveNext();
			   $i++;
		}

		# get any linked fields
		if($i > 0)
		{
			$this->result = $results;
			$db_join = new CORE_database;
			$this->result = $db_join->join_fields($results, $this->linked);
		}
		else
		{
			$this->result = $results;
		}

		/************** END STANDARD EXPORT SEARCH CODE *********************/




	# LOOP THROUGH THE RESULTS & DISPLAY AS CSV
	for($ii = 0; $ii < count($this->result); $ii++)
	{
		# print the heading:
		if($ii == 0)
		{
			reset($arr);
			$total_fields = count($arr) - 1;
			$iii = 0;
			while (list ($key, $value) = each ($arr))
			{
				 $data = $C_translate->translate('field_'.$value, $construct->module,'');
				 echo $data;
				 if($total_fields > $iii) echo '    ';
				 $iii++;
			}
		}



		# new line
		echo '
';				
		# print the data for each cell:
		reset($arr);
		$total_fields = count($arr) - 1;
		$iii = 0;
		while (list ($key, $value) = each ($arr))
		{
			if  ($construct->field["$value"][convert] == 'date'      ||
				 $construct->field["$value"][convert] == 'time'      ||
				 $construct->field["$value"][convert] == 'date-now'  ||
				 $construct->field["$value"][convert] == 'date-time' )
			{
				 $data = date(UNIX_DATE_FORMAT,$this->result["$ii"]["$value"]);
			} else {
				 $data = $this->result["$ii"]["$value"];
			}

			echo addslashes($data);
			if($total_fields > $iii) echo ' ';
			$iii++;
		}
	}	
	exit();
}








	########################################
	##	ADMIN SEARCH XML EXPORT        #####
	########################################

	function search_xml($VAR, $construct, $type)
	{

		/************** BEGIN STANDARD EXPORT SEARCH CODE *********************/


		# set the field list for this method:
		$arr = $construct->method["$type"];

		# loop through the field list to create the sql queries
		 $arr = $construct->method[$type];
		 $field_list = '';
		 $i=0;
		 while (list ($key, $value) = each ($arr))
		 {
			 if($i == 0)
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= AGILE_DB_PREFIX . $construct->table . '.' . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 else
			 {
				 $field_var =  $construct->table . '_' . $value;
				 $field_list .= "," . AGILE_DB_PREFIX . $construct->table . "." . $value;

				// determine if this record is linked to another table/field
				if($construct->field[$value]["asso_table"] != "")
				{
					$this->linked[] = array('field' => $value, 'link_table' => $construct->field[$value]["asso_table"], 'link_field' => $construct->field[$value]["asso_field"]);
				}
			 }
			 $i++;
		 }

		# get the search details:
		if(isset($VAR['search_id']))
		{
			include_once(PATH_CORE   . 'search.inc.php');
			$search = new CORE_search;
			$search->get($VAR['search_id']);
		}
		else
		{
			echo '<BR> The search terms submitted were invalid!';
		}

		# get the sort order details:
		if(isset($VAR['order_by']) && $VAR['order_by'] != "")
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $VAR['order_by'];
			$smarty_order =  $VAR['order_by'];
		}
		else
		{
			$order_by = ' ORDER BY ' . AGILE_DB_PREFIX . $construct->table . '.' .  $construct->order_by;
			$smarty_order =  $search->order_by;
		}

		# format saved search string
		$sql = explode (" WHERE ", $search->sql);

		# generate the full query
		$q = eregi_replace("%%fieldList%%", $field_list, $search->sql);
		$q = eregi_replace("%%tableList%%", AGILE_DB_PREFIX.$construct->table, $q);
		$q = eregi_replace("%%whereList%%", "", $q);
		$q .= " ".AGILE_DB_PREFIX . $construct->table.".site_id = '" . DEFAULT_SITE . "'";
		$q .= $order_by;
		$db = &DB();

		$result = $db->Execute($q);

		# error reporting
		if ($result === false)
		{
			global $C_debug;
			$C_debug->error('core:export.inc.php','search_xml', $db->ErrorMsg() . '<br><br>' .$q);
			echo "An SQL error has occured!";
			return;
		}

		# put the results into an array
		$i=0;
		$class_name = TRUE;
		$results = '';
		while (!$result->EOF) {
			$results[$i] = $result->fields;
			$result->MoveNext();
			$i++;
		}

		# get any linked fields
		if($i > 0)
		{
			$this->result = $results;
			$db_join = new CORE_database;
			$this->result = $db_join->join_fields($results, $this->linked);
		}
		else
		{
			$this->result = $results;
		}

		/************** END STANDARD EXPORT SEARCH CODE *********************/





		# create the xml processing instruction
		# header("Content-type: text/xml");
		$filename = 'XML_Export.xml';

		# determine what action to take:
		if($VAR["type"] == "display") {
		   header ('Content-type: application/x-xml');
		   header ("Content-Disposition: inline; filename=$filename" );
		}

		else if($VAR["type"] == "download") {
			header ("Content-Disposition: attachment; filename=$filename" );
		}

		$_xml ="<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
		$_xml .="<results>\r\n";

		# loop through the resulsts and display as PDF
		$row = 0;
		for($ii = 0; $ii < count($this->result); $ii++)
		{
			$_xml .= "	<" . $construct->table . ">\r\n";

			# get the data for each cell:
			reset($arr);
			$column=0;
			while (list ($key, $value) = each ($arr))
			{
				if  ($construct->field["$value"][convert] == 'date'      ||
					 $construct->field["$value"][convert] == 'time'      ||
					 $construct->field["$value"][convert] == 'date-now'  ||
					 $construct->field["$value"][convert] == 'date-time' )
					 {
						$date = date(UNIX_DATE_FORMAT,$this->result["$ii"]["$value"]);
						$data = htmlspecialchars($date,0,'ISO8859-1');
						//$data = test;
					 } else {
						$data = htmlspecialchars($this->result["$ii"]["$value"],0,'ISO8859-1');
					 }
				$_xml .= "		<$value>" . $data . "</$value>\r\n";
			}

			# Next record
			$_xml .= "	</" . $construct->table . ">\r\n";

		}
		$_xml .="</results>\r\n";
		echo $_xml;	
		exit();
	}
}



// ----- begin of excel export function library -----
// Excel begin of file header
function xlsBOF() {
	echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
	return;
}

// Excel end of file footer
function xlsEOF() {
   echo pack("ss", 0x0A, 0x00);
   return;
}


// Function to write a Number (double) into Row, Col
function xlsWriteNumber($Row, $Col, $Value) {
	echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
	echo pack("d", $Value);
	return;
}


// Function to write a label (text) into Row, Col
 function xlsWriteLabel($Row, $Col, $Value ) {
	$L = strlen($Value);
	echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
	echo $Value;
	return;
}	
?>