<?php

	# proc_dmsd_ncoa.php
	# =================
	# 01/06/2010 - Rick Davis
	
	# Process ncoa updates for synced database.

ini_set('display_errors', 1);
	
$app = "admin";
$env = "prod";
$debug = "true";


define('SF_ROOT_DIR',         realpath(dirname(__FILE__).'/..'));
define('SF_APP',              $app);
define('SF_ENVIRONMENT',      $env);
define('SF_DEBUG',            $debug);
define( '_VALID_CYB_CRYPT',   1 );
define( '_VALID_RBS', 1 );
 
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php'); 
require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR.'classes'. DIRECTORY_SEPARATOR.'class.autoloop.php');
require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR.'classes'. DIRECTORY_SEPARATOR.'class.chrome.php');
require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR.'includes' . DIRECTORY_SEPARATOR . 'webservices' . DIRECTORY_SEPARATOR . 'AutoLoop2' . DIRECTORY_SEPARATOR . 'inc.classvars.php');
require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR.'classes'. DIRECTORY_SEPARATOR.'class.alert_email.php');
require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR.'classes'. DIRECTORY_SEPARATOR.'class.dmsd.php');


sfContext::getInstance();
//
// Initialize the database
//


$hour = date("H");
# if ( $hour > 3 && $hour < 7 ) exit("Not running during backup window\r\n");


	$databaseManager 			= new sfDatabaseManager();
	$databaseManager->initialize();
	
	$CDmsd						= new Dmsd();
	

	$dms_main_conn				= Propel::GetConnection('dms_main');
	$dms_master_conn			= Propel::GetConnection('dms_master');	

	$email			= new AlertEmail();
	
	$alert_list = 		array(	'rdavis@amms-fl.com' => 'Rick Davis',
								'palcivar@ammsusa.com' => 'Peter Alcivar'
								);

	$sAccuzipWorkingPath = SF_ROOT_DIR . '/data/Uploads/Dmsd';
	
	$email_msg = "Processing Path: $sAccuzipWorkingPath<br /><br />Start: " . date("Y-m-d H:i:s") . "<br />";
	
	$test = false;
	if ( $test )
	{
	
		UpdateTotals();
		
		die("Aborting\r\n");
		
	}

	$results		= ImportAcczipResults($sAccuzipWorkingPath);
	if ($results !== false)
	{
		$email_msg .= $results;

		$email_msg .= "End: " . date("Y-m-d H:i:s") . "<br />";
		$email->SendStatusEmail($alert_list, "proc_dmsd_ncoa: Completed " , $email_msg);
	}

	exit("Aborting\r\n");


	function GetListsNeedingNcoa()
	{
		global $dms_main_conn;
		
		$ncoa_list = array();
		
		$C = new Criteria();
		$C->add(DmsdFeedPeer::LAST_NCOA_RUN, date("Y-m-d 00:00:00"), Criteria::LESS_THAN);
		$C->addSelectColumn(DmsdFeedPeer::DMSD_FEED_ID);
		$C->addSelectColumn(DmsdFeedPeer::CUSTOMER_ID);
		$rs = DmsdFeedPeer::doSelectRs($C, $dms_main_conn);
		while($rs->next())
		{
			$ncoa_list[$rs->getInt(1)] = $rs->getInt(2);
		}
		
		return $ncoa_list;
	
	}
	
	
	function GetCustomerAddresses($ncoa_list_in)
	{
		global $CDmsd;
		
		
		
		$sFields = array('PREFIX', 'FIRST', 'MIDDLE', 'LAST', 'SUFFIX', 
		'COMPANY', 'ADDRESS', 'SUITE', '', 'CITY', 'STATE', 'ZIP', 
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '','customer_id','external_customer_id'				
		);
		
		$sAccuzipWorkingPath = SF_ROOT_DIR . '/data/Uploads/Dmsd';
		echo "sAccuzipWorkingPath = $sAccuzipWorkingPath\r\n";
		
		$fh = NewFile();
		
		$row_count 	= 0;
		$iRecords 	= 0;
		foreach($ncoa_list_in as $dmsd_feed_id => $CustomerId)
		{
			echo "Getting counts for ncoa_list_in[$dmsd_feed_id] / $CustomerId\r\n";
			
			$dms_master_conn	= $CDmsd->GetDmsDbConn($CustomerId);
			#echo "dms_master_conn = " . print_r($dms_master_conn, true) . "\r\n";
			
			
			$ncoa_list = array();
			
			$ncoa_date			= date("Y-m-d 00:00:00", time() - ( 90 * 86400 ));
			$ncoa_list[$CustomerId] = array();
			
			$C = new Criteria();
			$C->addSelectColumn(DmsConsumerPeer::EXTERNAL_CUSTOMER_ID);
			$C->addSelectColumn(DmsConsumerPeer::FIRST_NAME);
			$C->addSelectColumn(DmsConsumerPeer::MIDDLE_NAME);
			$C->addSelectColumn(DmsConsumerPeer::LAST_NAME);
			$C->addSelectColumn(DmsConsumerPeer::SALUTATION);
			$C->addSelectColumn(DmsConsumerPeer::STREET_ADDRESS);
			$C->addSelectColumn(DmsConsumerPeer::CITY);
			$C->addSelectColumn(DmsConsumerPeer::STATE_PROVINCE);
			$C->addSelectColumn(DmsConsumerPeer::POSTAL_CODE);
			$C->add(DmsConsumerPeer::LAST_NCOA_DATE, $ncoa_date, Criteria::LESS_THAN);
			$rs = DmsConsumerPeer::doSelectRs($C, $dms_master_conn);
			while($rs->next())
			{
				
				$ncoa_list[$CustomerId][] = array(
													'customer_id'			=> $CustomerId,
													'external_customer_id'	=> $rs->getString(1),
													'FIRST'					=> $rs->getString(2),
													'MIDDLE'				=> $rs->getString(3),
													'LAST'					=> $rs->getString(4),
													'PREFIX'				=> $rs->getString(5),
													'ADDRESS'				=> $rs->getString(6),
													'CITY'					=> $rs->getString(7),
													'STATE'					=> $rs->getString(8),
													'ZIP'					=> $rs->getString(9)
													);
				$row_count++;
			}		
			unset($rs);
			echo "row_count = $row_count\r\n";
			
			# write out the records
			# =====================================================================
			foreach($ncoa_list as $CustomerId => $customer_ncoa)
			{
				echo "\r\nncoa_list[$CustomerId] \r\n";
				foreach($customer_ncoa as $data)
				{
					# echo ".";
					$iRow = 0;
					$sBuffer = "";
					foreach($sFields as $iKey => $sField) 
					{
						if ( $iRow > 0 ) $sBuffer .= ",";
						if ( strlen($sField) > 0 && isset($data[$sField])) 
						{	# Handle blank fields in the output file.
							#echo "$sField = " . $data[$maps_to[$sField]] . " ,";
							#$sData = preg_replace("/,/", "", $CUploadData->$sField);	# strip out any commas included in any field
							$sData = preg_replace("/,/", "", $data[$sField]);			# strip out any commas included in any field
							$sData = preg_replace("/'/", "", $sData);					# strip out any apostrophes from the fields.
						} else {
							$sData = "";
						}
						$sBuffer .= $sData;
						$iRow++;
					}
					$iRecords++;
					$sBuffer .= ",$row_id";
					fwrite($fh, "$sBuffer\r\n");	
				
				}
			}
			unset($ncoa_list);
			echo "iRecords = $iRecords\r\n";
			if ($iRecords > 100000 ) 
			{
				fclose($fh);
				echo "moving: {$sAccuzipWorkingPath}/In/$timefile.csv => {$sAccuzipWorkingPath}/Move/$timefile.csv\r\n";
				rename($sAccuzipWorkingPath . "/In/$timefile.csv", $sAccuzipWorkingPath . "/Move/$timefile.csv");
				
				$fh = NewFile();
				$iRecords = 0;
			}
		}
		
		
		if ( $iRecords < 200 ) 
		{
			# Pad with bogus records so we can ncoa the file
			for ($i = 1; $i < 101 ; $i++ ) 
			{
				$sBuffer = "";
				$sPadd['PREFIX'] = '';
				$sPadd['FIRST'] = 'Jim';
				$sPadd['MIDDLE'] = '';
				$sPadd['LAST'] = 'Smith';
				$sPadd['SUFFIX'] = '';
				$sPadd['COMPANY'] = '';
				$sPadd['ADDRESS'] = '9427 Corporate Lake Drive';
				$sPadd['SUITE'] = "Suite $i";
				$sPadd['CITY'] = 'Tampa';
				$sPadd['STATE'] = 'FL';
				$sPadd['ZIP'] = '33634';
				$sPadd['iUploadRecordIndex'] = '-1';

				$iRow = 0;

				foreach($sFields as $iKey => $sField)
				{
					if ( $iRow > 0 ) $sBuffer .= ",";
					if ( strlen($sField) > 0 ) {							# Handle blank fields in the output file.
						$sData = preg_replace("/,/", "", $sPadd[$sField]);	# strip out any commas included in any field
						$sData = preg_replace("/'/", "", $sData);			# strip out any apostrophes from the fields.
					} else {
						$sData = "";
					}
					$sBuffer .= $sData;
					$iRow++;
				}
				$sBuffer .= ",0";
				fwrite($fh, "$sBuffer\r\n");	
			}
		}
		fclose($fh);
		
		echo "moving: {$sAccuzipWorkingPath}/In/$timefile.csv => {$sAccuzipWorkingPath}/Move/$timefile.csv\r\n";
		rename($sAccuzipWorkingPath . "/In/$timefile.csv", $sAccuzipWorkingPath . "/Move/$timefile.csv");
		
	
	}
	
	
	
	
	
	# direct copy from the old consumer accuzip procesing loops
	
	
	# Internal functions
	# ==============================================================================================
	
	
	function NewFile()
	{
	
		global $sAccuzipWorkingPath;
		global $timefile;
	
		
		
		$sHeaders = array('Sal', 'First', 'Middle', 'Last', 'Title', 
		'Company', 'Address', 'Address2', 'Address3', 'City', 'St', 'Zip', 
		'Crrt', 'Lacs_', 'Barcode', 'Walkseq_', 'Lot_', 'Ascdesc_', 'Dp_',
		'Urban', 'Country', 'Phone1', 'Phone2', 'Phone3', 'Group1', 'Group2',
		'Group3', 'Group4', 'Website', 'Email', 'Zip5', 'Zip4', 'Dpc',
		'Dp', 'Chkdg', 'Countyno_', 'Countynm_', 'Congress_', 'Copies_', 'Subscribe_',
		'Primary_', 'Pre_', 'Street_', 'Suffix', 'Post_', 'Abrev_', 'Secy_', 
		'Pmb_', 'Pmbno_', 'Financeno_', 'Type_', 'Ocompany', 'Oaddress', 'Ocity',
		'Ostate', 'Ozipcode', 'Address4', 'Address5', 'Address6', 'Address7', 'Address8',
		'Address9', 'Address10', 'Department', 'Entry_date', 'Mod_date', 'Acs_part', 'Acs_key', 'Status_',
		'Errno_', 'Leftout_', 'Key_', 'Cnt_', 'X', 'Area_', 'Latitude_', 
		'Longitude_', 'Timezone_', 'Entry_', 'Trayno', 'Pkgno', 'Bundle', 'Endorse',
		'Rate_', 'Traymark_', 'Pkgmark_', 'Sequence_', 'Zip5_', 'Elot_', 'Mail_add',
		'ELatitude', 'Elongitude', 'Census_tr', 'Census_bl', 'Dpv_', 'Dpvnotes_', 'Movetype_',
		'Movedate_', 'Matchflg_', 'Nxi_','CustId','ExtlId'
		);
		
		$timefile = microtime(true);
		$sOutfile = $sAccuzipWorkingPath . "/In/$timefile.csv";
		
		
		
		echo "writing $sOutfile\r\n";
		
		# touch the file
		$fh = fopen($sOutfile, "w+");
		fwrite($fh, "");
		fclose($fh);
		
		# set its permissions
		chmod($sOutfile, 0666);
		chown($sOutfile, 'web3_admin');
		
		
		# open the file again
		$fh = fopen($sOutfile, "w+");
		
		if ( !$fh ) die("Failed to open $sOutfile");
		
		$sBuffer = "";
		$iRow = 0;
		foreach($sHeaders as $iKey => $sValue) 
		{
			if ( $iRow > 0 ) $sBuffer .= ",";
			$sBuffer .= $sValue;
			$iRow++;
		}
		fwrite($fh, "$sBuffer\r\n");
		
		return $fh;
	
	}
	
	
	
	# ========================================================================
	function ImportAcczipResults($sAccuzipWorkingPath='') {
		global $CStatusLog;

		$lStart = time();

		# Transfer Fields
		$a_sFields = array('sPhoneHome', 'sPhoneWork', 'sPhoneCell', 'sPhoneFax', 'sEmail1', 'sEmail2', 'sLead', 'sMake', 'sModel', 'sYear', 'sBalance', 'sDate', 'sBirthday');
		
		$a_sAccuFields = array('sPrefix', 'sFirst', 'sMiddle', 'sLast', 'sSuffix', 
		'sCompany', 'sAddress', 'sSuite', '', 'sCity', 'sState', 'sZip', 
		'sCRRT', '', 'sZipBarcode', '', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', 'sZip5', 'sZip4', 'sDPC',
		'', '', 'sCountyNumber', 'sCountyName', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', 'cPostalType', '', '', '',
		'', '', '', '', '', '', '',
		'', '', '', '', '', '', 'sResult',
		'sResult', '', '', '', '', '', 'sAreaCode',
		'sLat', 'sLon', '', '', '', '', '',
		'', '', '', 'iUploadRecordIndex', '', '', '',
		'', '', '', '', '', '', '',
		'', '', ''
		);


		$sAccuHeaders = array('Sal', 'First', 'Middle', 'Last', 'Title', 
		'Company', 'Address', 'Address2', 'Address3', 'City', 'State', 'Zip', 
		'Crrt', 'Lacs_', 'Barcode', 'Walkseq_', 'Lot_', 'Ascdesc_', 'Dp_',
		'Urban', 'Country', 'Phone1', 'Phone2', 'Phone3', 'Group1', 'Group2',
		'Group3', 'Group4', 'Website', 'Email', 'Zip5', 'Zip4', 'DPC',
		'Dp', 'Chkdg', 'Countyno_', 'Countynm_', 'Congress_', 'Copies_', 'Subscribe_',
		'Primary_', 'Pre_', 'Street_', 'Suffix', 'Post_', 'Abrev_', 'Secy_', 
		'Pmb_', 'Pmbno_', 'Financeno_', 'Type_', 'Ocompany', 'Oaddress', 'Ocity',
		'Ostate', 'Ozipcode', 'Address4', 'Address5', 'Address6', 'Address7', 'Address8',
		'Address9', 'Address10', 'Entry_date', 'Mod_date', 'Acs_part', 'Acs_key', 'Status',
		'Errno_', 'Leftout_', 'Key_', 'Cnt_', 'X', 'Area_', 'Latitude_', 
		'Longitude_', 'Timezone_', 'Entry_', 'Trayno', 'Pkgno', 'Bundle', 'Endorse',
		'Rate_', 'Traymark_', 'Pkgmark_', 'Sequence_', 'Zip5_', 'Elot_', 'Mail_add',
		'ELatitude', 'Elongitude', 'Census_tr', 'Census_bl', 'Dpv_', 'Dpvnotes_', 'Movetype_',
		'Movedate_', 'Matchflg_', 'Nxi_'
		);

		$return_msg = "";

		$sErr 		= "";
		$sReturn 	= "";
		$dir 		= $sAccuzipWorkingPath . "/Out";

		$sSubject 	= "";
		$sHTMLBody 	= "";

		echo "ImportAcczipResults:: looking at $dir\r\n";
		$file_count = 0;
		if (is_dir($dir)) 
		{
			if ($dh = opendir($dir)) 
			{

				# Added: 9:09 AM 6/13/2007 Lom Nguyen
				# Update the script status report to it's current progress.
				#$CStatusLogDetail->Stage ('Opening Directory', '(OK) Opening Accuzip Working Directory: ' . $dir);

				while (($file = readdir($dh)) !== false  )
				{
					$sType = filetype($dir . "/" . $file);
					$iSuccess = false;
					$iNewRecords = 0;
					$iUpdatedRecords = 0;
					echo "file=$file &nbsp; type=$sType\r\n";
					$sSubject .="&nbsp;&nbsp;FILE=$file&nbsp; type=$sType";//daniel
					$sHTMLBody .= "file=$file &nbsp; type=$sType<br />";//daniel

					if ( $sType == 'dir' && strlen($file) > 2 ) 
					{
						$dir_sub = $dir . "/$file";
						$dh_sub = opendir($dir_sub);

						while (( $sub_file = readdir($dh_sub)) !== false ) 
						{
							if ( $sub_file != '.' && $sub_file != '..' )
							{
								$sSubType = filetype($dir_sub . "/" . $sub_file);

								if ( strlen($sub_file) > 4 && $sSubType == 'file' ) 
								{
									if ( strtolower(substr($sub_file, strlen($sub_file) - 4, 4)) == ".csv" ) 
									{
										echo "We want to process [$dir_sub, $sub_file]\r\n";
										ProcessAccuzip($dir_sub, $sub_file);
										$file_count++;
									}
								}
							}
						}
					} elseif ( strtoupper(substr($file, strlen($file)-4, 4)) == ".CSV" ) {
						echo " have just a normal file: $file\r\n";
						echo " dir = $dir\r\n";
						echo "We want to process [$file, $sub_file]\r\n";
						ProcessAccuzip($dir, $file);
						$file_count++;
					}

					$file = "";
				}
			}
			closedir($dh);
		}
		if (!empty($file_count))
		{
			$sReturn .= "Found $file_count files to process.<br />";
			$lEnd = time();
			$sReturn .= "Done: ". date("H:i:s") . "<br />";
			$sReturn .= "Took " . number_format($lEnd - $lStart, "0", ".", ",") . " seconds.<br />";

			return $sReturn;
		}
		return false;
	}
	
	
	
	# ========================================================================
	function ProcessAccuzip($dir='', $file='') 
	{
		
		global $CDmsd;
		global $dms_master_conn;
		$dms_conn = null;

		$sReturn = "";
		$debug_flag = false;
		$sOutFile = $dir . "/" . $file;
		echo "ProcessAccuzip(dir=$dir, file=$file) \r\n";
		$iRow = 0;
		$fh = fopen($sOutFile, "r");
		$sHeader = fgetcsv($fh, 4096, ",", '"');

		$HeaderMap 					= array_flip($sHeader);
		
		# Check to make sure the header is correct
		
		if ( strtolower($sHeader[0]) == 'sal' && strtolower($sHeader[9]) == 'city' && strtolower($sHeader[99]) == 'nxi_' ) {
			
			# Burn the next bogus header that Accuzip5 so lovingly appends to the file.
			$burn = fgetcsv($fh, 4096, ",", '"');
			
			
//			# Get the customer & client ids for the import.
//			$client_id		= $CDW_Import->client_id;
//			$customer_id	= $CDW_Import->customer_id;
//			
//			$sCenterZip = "";
//			$iUserType = 0;
//			if ( $client_id > 0 && $customer_id > 0 ) {
//				$CDW_Customer->load($customer_id);
//				$sCenterZip = substr($CDW_Customer->zip, 0, 5);
//				$iUserType = 2;
//			} else if ( $client_id > 0 && $customer_id == 0 ) {
//				$CDW_Client->load($client_id);
//				$sCenterZip = substr($CDW_Client->zip, 0, 5);	
//				$iUserType = 1;		
//			}
//			if ( !$CDW_Zipcodes->load($sCenterZip) ) {
//				$sFeature .= "Zip($sCenterZip) not found<br />";
//				echo "Client:<br />";								
//				$sTemp = $CDW_Client->Dump();
//				$sFeature .= "$sTemp<br />";
//				$sHTMLBody .= "Client:<br />$sTemp<br />";//daniel								
//				
//				echo "Customer: <br />";
//				$sTemp = $CDW_Customer->Dump();
//				$sFeature .= "$sTemp<br />";
//				echo "$sFeature<br />";
//				echo "Error: Dealer / Customer Zip not found - Haulting.<br />";
//				$sHTMLBody .= "Customer: <br />$sTemp<br />Error: Dealer / Customer Zip not found - Haulting.<br />";//daniel
//
//				# Added: 10:21 AM 6/13/2007 Lom Nguyen
//				# Update the script status report to it's current progress.
//				$CStatusLogDetail->Stage ('Error', "(Error) Zip($sCenterZip) not found - Client: " . $CDW_Client->Dump() . " - Customer: " . $CDW_Customer->Dump() );
//			
//				sendNotifEmail($sSubject, $sHTMLBody, $sFromName, $sFromEmail);//daniel
//				exit();
//			}
			
			$DmsCheckedList = array();
			$sql_path = SF_ROOT_DIR . '/data/Uploads/Dmsd/addresses.sql';
			$last_ncoa_date = date("Y-m-d H:i:s");
			$CustomerId = 0;
			$sCenterZip = 0;
			$iRow = 0;
			while ( !feof($fh) ) {
				$a_sData = fgetcsv($fh, 8096, ",", '"');
				if ( $debug_flag ) {
					print_r($a_sData);
					echo "<br />";
				}
				if ( $iRow % 1000 == 0 ) echo "\r\n" . date("Y-m-d H:i:s") . " ::$iRow";
				if ( $iRow % 100 == 0 ) echo ".";
				#$import_row_id = intval($a_sData[86]);
				#echo "import_row_id = $import_row_id\r\n";
				#echo "iRow = $iRow\timport_row_id=$import_row_id\r\n";
				#if ( $a_sData[68] == 'V' && $import_row_id > -1 ) {	# Only record addresses that are verified mailable.
				#echo "a_sData = " . print_r($a_sData, true) . "\r\n";
				if ( $a_sData[68] == 'V' )
				{
				
					$sPrefix 	= strtoupper(trim($a_sData[0]));
					$sFirst 	= strtoupper(trim($a_sData[1]));
					$sMiddle 	= strtoupper(trim($a_sData[2]));
					$sLast 		= strtoupper(trim($a_sData[3]));
					$sSuffix 	= strtoupper(trim($a_sData[4]));
					$sCompany 	= strtoupper(trim($a_sData[6]));
					$sAddress 	= strtoupper(trim($a_sData[6]));
					$sSuite 	= strtoupper(trim($a_sData[7]));
					$sCity 		= strtoupper(trim($a_sData[9]));
					$sState 	= strtoupper(trim($a_sData[10]));
					$sZip	 	= strtoupper(trim($a_sData[11]));
					$sZip5 		= strtoupper(trim($a_sData[30]));
					$sZip4 		= strtoupper(trim($a_sData[31]));
					$sCRRT 		= strtoupper(trim($a_sData[12]));
					$sZipBarcode= strtoupper(trim($a_sData[14]));
					$sDPC		= strtoupper(trim($a_sData[32]));
					$sType		= strtoupper(trim($a_sData[50]));
					$sLat		= strtoupper(trim($a_sData[75]));
					$sLon		= strtoupper(trim($a_sData[76]));
					$sErrNo		= strtoupper(trim($a_sData[69]));
					$sDpvMsg	= strtoupper(trim($a_sData[94]));
					$sDpvNotes	= strtoupper(trim($a_sData[95]));
					$customer_id	= intval(trim($a_sData[100]));
					$ExternalId	= strtoupper(trim($a_sData[101]));
					
					#echo "customer_id = $customer_id\r\n";
					#echo "ExternalId = $ExternalId\r\n";
					
					if ($customer_id == 0 ) continue;	# don't bother with records that don't seem to be correct.




					$PostalKey 				= sprintf("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s", 
													$a_sData[$HeaderMap['barcode']],
													$a_sData[$HeaderMap['primary_']],
													$a_sData[$HeaderMap['pre_']],
													$a_sData[$HeaderMap['street_']],
													$a_sData[$HeaderMap['suffix_']],
													$a_sData[$HeaderMap['post_']],
													$a_sData[$HeaderMap['abrev_']],
													$a_sData[$HeaderMap['secy_']],
													$a_sData[$HeaderMap['pmb_']],
													$a_sData[$HeaderMap['pmbno_']]
													);

					// $PostalKey 				= sprintf("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s", 
					// 								trim($a_sData[14]),
					// 								trim($a_sData[40]),
					// 								trim($a_sData[41]),
					// 								trim($a_sData[42]),
					// 								trim($a_sData[43]),
					// 								trim($a_sData[44]),
					// 								trim($a_sData[45]),
					// 								trim($a_sData[46]),
					// 								trim($a_sData[47]),
					// 								trim($a_sData[48])
					// 								);
					
					# Did we switch customer on this record - if so make up a new connection
					if ( $customer_id <> $CustomerId && $customer_id > 0 )
					{
						echo "switching CustomerId from $CustomerId to $customer_id\r\n";
						$Customer = CustomerPeer::retrieveByPk($customer_id);
						#echo print_r($Customer, true) . "\r\n";
						$CustomerFail = false;
                                                
						if ( $CustomerId > 0 ) 
						{
							echo "mid-run\r\n";
							fclose($fha);
							PushAddressUpdate($CustomerId, $sql_path);
							UpdateConsumerNcoaDate($CustomerId, $DmsCheckedList);
							$DmsCheckedList = array();
							
							
							$dms_main_conn				= Propel::GetConnection('dms_main');
							# Update the last ncoa date on the feed
							$C = new Criteria();
							$C->add(DmsdFeedPeer::CUSTOMER_ID, $CustomerId);
							$C->add(DmsdFeedPeer::ACTIVE_YN, 'Y');
							$feed = DmsdFeedPeer::doSelectOne($C, $dms_main_conn);
							if ( $feed )
							{
								$feed->setLastNcoaRun(date("Y-m-d H:i:s"));
								$feed->save($dms_main_conn);
							}
						
						}
						echo "Finished updating CustomerId: $CustomerId customer_id: {$customer_id}\r\n";
						
						
						if ( $Customer )
                                                {
						$CustomerId 				= $customer_id;
						$sCenterZip 				= substr($Customer->getZip(), 0, 5);
						$dms_master_conn 			= $CDmsd->GetDmsDbConn($CustomerId);
						$dms_conn					= $CDmsd->GetDmsConn();
						echo "Got new connection for CustomerId: $CustomerId\r\n";
                                                } else {
                                                    $CustomerFail = true;
                                                }
						
						$fha = fopen($sql_path, "w+");
						
					}
					if ( $CustomerFail ) 
                                        {
                                            $customer_id = -1;
                                            continue;
                                        }
					
					# Does this address already exist in the address table?
					
					#if ( $sZipBarcode == '/804371237375/' ) $CDW_Address->DebugOn();
					$address_info =	AddressPeer::GetAddressByKeys(trim($sZipBarcode), trim($sAddress), trim($sSuite));
					# echo "address_info = " . print_r($address_info, true) . "\r\n";
					if ( !$address_info ) {
						echo "+";
						# Apparently the address doesn't exist, so let's add it.
						$address = new Address();
						$address->setAddress(trim($sAddress));
						$address->setSuite(trim($sSuite));
						$address->setCity($sCity);
						$address->setState($sState);
						$address->setZip($sZip);
						$address->setZip5($sZip5);
						$address->setZip4($sZip4);
						$address->setCrrt($sCRRT);
						$address->setDpc($sDPC);
						$address->setPostalBarcode(trim($sZipBarcode));
						$address->setType($sType);
						$address->setLat($sLat);
						$address->setLon($sLon);
						$address->setLatLonSource("A");
						$address->setValidYn("Y");
						$address->save();
						
						$address_id = $address->getAddressId();
					} else {
						$address_id = $address_info[0];	# Pick the first matching address ( should only have one ).
					}
					
					#echo "-";
					$dms_consumer = DmsConsumerPeer::GetByExternalId($ExternalId, $dms_master_conn);
					if ( !$dms_consumer )
					{
						echo "Accuzipfile file contains unknown dms consumer: ExternalId = $ExternalId (row=$iRow)\r\n";
						continue;						
					}
					$old_address_id = $dms_consumer->getAddressId();
					$old_postal_key = $dms_consumer->getPostalKey();
					
					# Save the ExternalId to an array so we can pass it to the UpdateConsumerNcoaDate function to mark
					# off the fact we checked the address whether it changed or not.
					$DmsCheckedList[] = $ExternalId;
					
					# Is the address valid and not the same as the old address?
					$UpdateAddress = false;

					if ( $address_id > 0  && $old_address_id != $address_id ) 
					{
						$UpdateAddress = true;
					}
					if ( $old_postal_key != $PostalKey )
					{
						$UpdateAddress = true;
					}
					if ( $UpdateAddress )
					{
					#if ( $address_id > 0 ) {
					
						
				#		$dms_consumer->setAddressId($address_id);
				#		$dms_consumer->setAddressCassMsg($sErrNo);
				#		$dms_consumer->setAddressDpvMsg($sDpvMsg);
				#		$dms_consumer->setLastNcoaDate($last_ncoa_date);
						#echo "z";
						$nDist 		= ZipcodesPeer::ZipDist($sCenterZip, $sZip5);
						$nRadial 	= 0;
						#echo "Dist = $nDist\r\n";
						if ( $nDist >= 0 ) {
							# Get the approximate radial from the center.
							#$nRadial = $CDW_Zipcodes->ZipRadial($sCenterZip, $sZip5);
							#echo " radial = $nRadial\r\n";
				#			$dms_consumer->setDist($nDist);
							#$CDW_ImportDataRow->radial_deg = $nRadial;
						}
						# Store the data
				#		$dms_consumer->save($dms_master_conn);
						
						#$CDW_ImportDataRow->store();
						# die("Check the record for import_data_row($import_id, $import_row_id)\r\n");
						$buffer = sprintf('"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"', 
												$ExternalId,
												$address_id, 
												$sErrNo, 
												$sDpvMsg, 
												$sDpvNotes, 
												$last_ncoa_date, 
												$nDist,
												$sAddress,
												$sCity,
												$sState,
												$sZip,
												$PostalKey
												);
						fwrite($fha, $buffer . "\r\n");
						#echo "b";
						
					}
				} elseif ( $a_sData[68] != 'V' && !feof($fh) ) {
					$sErrNo			= strtoupper(trim($a_sData[69]));
					$sDpvMsg		= strtoupper(trim($a_sData[94]));
					$sDpvNotes		= strtoupper(trim($a_sData[95]));
					$customer_id	= intval(trim($a_sData[100]));
					$e_t1			= strtoupper(trim($a_sData[101]));
					$e_t2			= str_replace('"', "", $e_t1);		# Remove bogus commas and quotes from string
					$ExternalId		= str_replace(',', "", $e_t2);
					
					$DmsCheckedList[] = $ExternalId;
					
					#echo "customer_id = $customer_id\r\n";
					#echo "ExternalId = $ExternalId\r\n";
					
					
					
					#
					# Do we have to switch the customer records?
					# --------------------------------------
					if ($customer_id == 0 ) continue;	# don't bother with records that don't seem to be correct.
					
					# Did we switch customer on this record - if so make up a new connection
					if ( $customer_id <> $CustomerId && $customer_id > 0 )
					{
						echo "switching CustomerId from $CustomerId to $customer_id\r\n";
						$Customer = CustomerPeer::retrieveByPk($customer_id);
						#echo print_r($Customer, true) . "\r\n";
						
						if ( $CustomerId > 0 ) 
						{
							echo "mid-run\r\n";
							fclose($fha);
							PushAddressUpdate($CustomerId, $sql_path);
							UpdateConsumerNcoaDate($CustomerId, $DmsCheckedList);
							$DmsCheckedList = array();
						
						}
						echo "Finished switching customer (invalid) for customer: $CustomerId\r\n";
						if (!$Customer )
						{
							echo "a_sData = " . print_r($a_sData, true) . "\r\n";
							die("Found invalid customer: $customer_id ($dir / $file )  (row=$iRow)\r\n");
						}
						
						
						$CustomerId 				= $customer_id;
						$sCenterZip 				= substr($Customer->getZip(), 0, 5);
						$dms_master_conn 			= $CDmsd->GetDmsDbConn($CustomerId);
						$dms_conn					= $CDmsd->GetDmsConn();
						
						echo "Got new connection for CustomerId: $CustomerId\r\n";
						$fha = fopen($sql_path, "w+");
						
					}
					# --------------------------------------
					# End of customer switch block
					#
					echo "-";
					#echo "Not validated " . print_r($a_sData, true) . "\r\n";
					# We didn't verify so let's update with the error codes
						# Store the data
				#		$dms_consumer->setAddressCassMsg($sErrNo);
						
				#		$dms_consumer->save($dms_master_conn);
						$buffer = sprintf('"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"', 
												$ExternalId,
												"-1", 
												$sErrNo, 
												$sDpvMsg,
												$sDpvNotes, 
												$last_ncoa_date, 
												"-1",
												"",
												"",
												"",
												"",
												""
												);
						fwrite($fha, $buffer . "\r\n");
						#echo "-";
				}
				$iRow++;
			}
			echo "\r\n";
			echo "end-run\r\n";
			fclose($fh);
			fclose($fha);
			PushAddressUpdate($CustomerId, $sql_path);
			UpdateConsumerNcoaDate($CustomerId, $DmsCheckedList);
			$DmsCheckedList = array();
			
			if ( $CustomerId > 0 ) 
			{				
				$dms_main_conn				= Propel::GetConnection('dms_main');
				# Update the last ncoa date on the feed
				$C = new Criteria();
				$C->add(DmsdFeedPeer::CUSTOMER_ID, $CustomerId);
				$C->add(DmsdFeedPeer::ACTIVE_YN, 'Y');
				$feed = DmsdFeedPeer::doSelectOne($C, $dms_main_conn);
				if ( $feed )
				{
					$feed->setLastNcoaRun(date("Y-m-d H:i:s"));
					$feed->save($dms_main_conn);
				}
			}
						
			
			# -- Fix - - - Move the file only if it's actually been processed.
			# Ok update the import records
//			$CDW_Import->accuzip_received_date = date("Y-m-d H:i:s");
//			$CDW_Import->accuzip_processing_yn = 'N';
//			$CDW_Import->store();
			
			# Move it to the processed folder.
			echo "dir = {$dir}  file = {$file}\n";
			echo "sOutFile = {$sOutFile}\n";
			$dir_parts = explode("/", $dir);
			echo "dir_parts = " . print_r($dir_parts, true) . "\n";
			if ( $dir_parts[count($dir_parts) - 1] != "Dmsd" )
				unset($dir_parts[count($dir_parts) - 1]);	# Kill the sub directory value

			if ( $dir_parts[count($dir_parts) - 1] != "Dmsd" )
				unset($dir_parts[count($dir_parts) - 1]);	# Kill the out directory value

			$parent_dir = join("/", $dir_parts);
			echo "parent_dir = $parent_dir\r\n";
			$sProcFile = $parent_dir . "/Processed/" . $file;
			echo "sProcFile = {$sProcFile}\r\n";

			// does the orginal file still exist?
			if (! file_exists($sOutFile))
			{
				die("Whoops - the original file {$sOutFile} doesn't appear to exist.\n");
			} 

			if ( file_exists($sProcFile) ) unlink($sProcFile);
			$sReturn .= "Moving to $sProcFile<br />";
			if ( ! rename($sOutFile, $sProcFile) ) {
				die( " Move failed ($sOutFile => $sProcFile\r\n");
			} 
			else {
				rmdir($dir);
			}
			# -- End fix
			
		} else {
			fclose($fh);
			echo " wrong header\r\n sHeader[0]='$sHeader[0]'\r\n sHeader[9]='$sHeader[9]'\r\n sHeader[99]='$sHeader[99]' \r\n";
		}
		
						
	}
	
	/**
	 *	UpdateTotals() 
	 *  ****************************************************************************************************************
	 */
	function UpdateTotals()
	{
		echo "Update totals\r\n";
		
		$dms_main_conn				= Propel::GetConnection('dms_main');
		
		$C = new Criteria();
		$C->add(DmsdFeedPeer::ACTIVE_YN, 'Y');
		$dmsd_feed_list	= DmsdFeedPeer::doSelect($C, $dms_main_conn);
		foreach($dmsd_feed_list as $key => $dmsd_feed)
		{
			$customer_id = $dmsd_feed->getCustomerId();
			echo microtime(true) . "  customer_id = $customer_id\r\n";
			$ncoa_counts = GetFeedCounts($customer_id);
			echo "ncoa_count = " . print_r($ncoa_counts, true) . "\r\n";
			
			$dmsd_feed->setSalesCount($ncoa_counts['deal_count']);
			$dmsd_feed->setRoCount($ncoa_counts['ro_count']);
			$dmsd_feed->setMailableCount($ncoa_counts['mailable']);
			$dmsd_feed->setLastNcoaRun($ncoa_counts['last_ncoa']);
			$dmsd_feed->save($dms_main_conn);
			echo microtime(true) . " saved\r\n";
		}
	
	}
	
	
	function GetFeedCounts($CustomerId=0)
	{
		global $CDmsd;
		
		
		$dms_master_conn 			= $CDmsd->GetDmsDbConn($CustomerId);
		
		
		# Get the sales counts
		$C = new Criteria();
		$deal_count			= DmsDealPeer::doCount($C, true, $dms_master_conn);
		
		
		# Get the ro counts
		$C = new Criteria();
		$ro_count			= DmsRoPeer::doCount($C, true, $dms_master_conn);
		
		
		# Get the mailable count
		$C = new Criteria();
		$C->add(DmsConsumerPeer::ADDRESS_ID, 0, Criteria::GREATER_THAN);
		$mailable_count = DmsConsumerPeer::doCount($C, false, $dms_master_conn);
		echo "Mailable count = $mailable_count\r\n";
		
		# Get the most recent NCOA run date
		$C = new Criteria();
		$C->add(DmsConsumerPeer::ADDRESS_ID, 0, Criteria::GREATER_THAN);
		$C->addSelectColumn(DmsConsumerPeer::LAST_NCOA_DATE);
		$C->addDescendingOrderByColumn(DmsConsumerPeer::LAST_NCOA_DATE);
		
		$most_recent_ncoa = '2001-01-01';
		$rs = DmsConsumerPeer::doSelectRs($C, $dms_master_conn);
		while($rs->next())
		{
			$most_recent_ncoa = $rs->getString(1);
		}
		
		$Result = array('mailable' => $mailable_count,
						'last_ncoa'	=> $most_recent_ncoa,
						'deal_count'	=> $deal_count,
						'ro_count'		=> $ro_count
						);
						
		return $Result;
	
	}
	
	
	
	
	
	/*
	 * UpdateConsumerNcoaDate
	 ******************************************************************************************* */	
	function UpdateConsumerNcoaDate($CustomerId, $ExternalIdList)
	{
	
		global $CDmsd;
		if ( !is_array($ExternalIdList) ) 	return false;		
		if ( count($ExternalIdList) == 0 ) 		return false;
		
		$dms_master_conn 			= $CDmsd->GetDmsDbConn($CustomerId);
		$dms_conn					= $CDmsd->GetDmsConn();
		
		$query  = "update dms_consumer set last_ncoa_date = '" . date("Y-m-d H:i:s") 
				. "' where external_customer_id "
				. "in ('" . join("','", $ExternalIdList) . "') and address_id <> 0 ";
		echo "Query = $query\r\n";		
		//$result = mysql_query($query, $dms_conn) or die($query . "\r\n" . mysql_error($dms_conn) );
		$Rs 	= $dms_master_conn->executeQuery($query);
		
	}
	
	
	/*
	 * PushAddressUpdate
	 ******************************************************************************************* */	
	function PushAddressUpdate($CustomerId, $sql_path)
	{
		global $CDmsd;
		
		
		$dms_master_conn 			= $CDmsd->GetDmsDbConn($CustomerId);
		$dms_conn					= $CDmsd->GetDmsConn();
		if ( !$dms_conn )
		{
			die("Aborting: failed to get connection calling CDmsd->GetDmsDbConn({$CustomerId})\n");
		}
		echo "PushAddressUpdate($CustomerId, $sql_path)\r\n";
	
		$Query = "drop table if exists `address_update` ";
		#echo "query = $query\r\n";
		// $result = mysql_query($query, $dms_conn) or die($query . "\r\n" . mysql_error($dms_conn) );
		$Rs 						= $dms_master_conn->executeQuery($Query);
		
		$Query = "
CREATE TABLE IF NOT EXISTS `address_update` (
  `address_update_id` int(11) NOT NULL AUTO_INCREMENT,
  `external_customer_id` varchar(50) NOT NULL,
  `address_id` int(11) NOT NULL,
  `address_cass_msg` varchar(60) NOT NULL,
  `address_dpv_msg` varchar(60) NOT NULL,
  `address_dpv_notes` varchar(60) NOT NULL,
  `last_ncoa_date` datetime NOT NULL,
  `dist` decimal(10,2) NOT NULL,
  `current_address`  varchar(128) NOT NULL,
  `current_city`  varchar(50) NOT NULL,
  `current_state`  varchar(50) NOT NULL,
  `current_zip`  varchar(10) NOT NULL,
  `postal_key` varchar(255) NULL,
  PRIMARY KEY (`address_update_id`),
  KEY `external_customer_id` (`external_customer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;";
		#echo "query = $query\r\n";
		// $result = mysql_query($query, $dms_conn) or die($query . "\r\n" . mysql_error($dms_conn) );

		$Rs 						= $dms_master_conn->executeQuery($Query);
		
	
		$QueryHeader 		= "INSERT INTO address_update "
							. "(external_customer_id, address_id, address_cass_msg, address_dpv_msg, address_dpv_notes, last_ncoa_date, dist, current_address, current_city, current_state, current_zip, postal_key) "
							. "VALUES ";
		$QueryRow 			= array();
		$QueryCount 		= 0;

		$fh 				= fopen($sql_path, "r");
		while(!feof($fh))
		{
			$Rec 			= fgetcsv($fh, 8192);
			$QueryRow[] 	= sprintf("('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
								addslashes($Rec[0]),
								addslashes($Rec[1]),
								addslashes($Rec[2]),
								addslashes($Rec[3]),
								addslashes($Rec[4]),
								addslashes($Rec[5]),
								addslashes($Rec[6]),
								addslashes($Rec[7]),
								addslashes($Rec[8]),
								addslashes($Rec[9]),
								addslashes($Rec[10]),
								addslashes($Rec[11])
									);
			$QueryCount++;
			if ( $QueryCount % 100 == 0)
			{
				$Query 		= $QueryHeader . join(",", $QueryRow);
				echo "Query = {$Query}\n";
				$Rs 		= $dms_master_conn->executeQuery($Query);

				$QueryRow 	= array();
				$QueryCount = 0;
			}

		}
		if ( $QueryCount > 0 )
		{		
			$Query 		= $QueryHeader . join(",", $QueryRow);
			echo "Query = {$Query}\n";
			$Rs 		= $dms_master_conn->executeQuery($Query);
		}
			
		// $query = "load data local infile '" . $sql_path . "' replace "
		// 	. " into table `address_update` "
		// 	. " fields terminated by ','"
		// 	. " enclosed by '\"'"
		// 	. " lines terminated by '\\r\\n'"
		// 	. " (external_customer_id, address_id, address_cass_msg, address_dpv_msg, address_dpv_notes, last_ncoa_date, dist, current_address, current_city, current_state, current_zip, postal_key)";
		// // echo "query = $query\r\n";
		// // $result = mysql_query($query, $dms_conn) or die("*** ERROR **** query failed: {$query}\n" . mysql_error($dms_conn) );
			
		
		$query = "update dms_consumer,address_update
		set dms_consumer.address_id = address_update.address_id,
			dms_consumer.address_cass_msg = address_update.address_cass_msg,
			dms_consumer.address_dpv_msg = address_update.address_dpv_msg,
			dms_consumer.address_dpv_notes = address_update.address_dpv_notes,
			dms_consumer.last_ncoa_date = address_update.last_ncoa_date,
			dms_consumer.dist = address_update.dist,
			dms_consumer.current_address = address_update.current_address,
			dms_consumer.current_city = address_update.current_city,
			dms_consumer.current_state = address_update.current_state,
			dms_consumer.current_zip = address_update.current_zip,
			dms_consumer.postal_key = address_update.postal_key
			where dms_consumer.external_customer_id = address_update.external_customer_id";
		// echo "query = $query\r\n";
			
		//$result = mysql_query($query, $dms_conn) or die("*** ERROR **** query failed: {$query}\n" . mysql_error($dms_conn) );
		$Rs 						= $dms_master_conn->executeQuery($query);
		
		
		#$query = "drop table if exists `address_update` ";
		#echo "query = $query\r\n";
		#$result = mysql_query($query, $dms_conn) or die($query . "\r\n" . mysql_error($dms_conn) );
		
		#die("Aborting after PushAddressUpdate($CustomerId, $sql_path)\r\nS");
	}
		
		
	# ==================================================================================
	function name_split($full_name='') {
	 
		$a_suffix_list = array('JR', 'JR.', 'SR', 'SR.',  'II', '2', '3RD', 'III', '4TH', 'IV', '5TH', 'V', 'DDS', 'DDS.', 'MD', 'MD.');
	
		$a_name_parts = array();
		
		if ( strlen($full_name) > 0 ) {
			# Parse out the name
			$sFullName = strtoupper($full_name);
			
			# is there a DBA in the name?
			if ( strpos($sFullName, " DBA ") > 0 ) $iSkip = true;	# Don't save DBA (aka Businesses)
			if ( strpos($sFullName, " LLC") > 0 ) $iSkip = true;	# Don't save LLC (aka Businesses)
			if ( strpos($sFullName, " INC") > 0 ) $iSkip = true;	# Don't save INC (aka Businesses)
			
			# if we have a comma in the full name then it's probably ' Last,First
			if ( strpos($sFullName, "," ) !== false ) {
				$aParts = explode(',', $sFullName);
				$iCommaCount = count($aParts);
				$sFullName = "";
				for($i = 1; $i < $iCommaCount; $i++) {
					$sFullName .= trim($aParts[$i]) . " ";
				}
				$sFullName .= $aParts[0];
			}
			
			$a_parts = explode(" ", $sFullName);
			
			foreach($a_parts as $iKey => $sPart) {
				$iKill = false;
				switch($sPart) {
					case "":
						$iKill = true;
						break;
					case "MR.":
						$iKill = true;
						break;
					case "MR":
						$iKill = true;
						break;
					case "MRS.":
						$iKill = true;
						break;
					case "MRS":
						$iKill = true;
						break;
					case "MS.":
						$iKill = true;
						break;
					case "MS":
						$iKill = true;
						break;
					case "AND":
						$iKill = true;
						break;
					case "DR":
						$iKill = true;
						break;
					case "DR.":
						$iKill = true;
						break;
				}
				if ( $iKill ) {
					unset($a_parts[$iKey]);
				}
				
						
			}
			$sTemp = join(" ", $a_parts);
			#echo "Garbage collection done.  result = '$sTemp'<br />";
			$a_parts = explode(' ', $sTemp);	# collapse down the extra spacings.
			
			
			$iPartsCount = count($a_parts);
			# Check to see if this is a JR, SR, II, III, IV or V
			$iSuffix = false;
			foreach($a_suffix_list as $iKey => $sSuffix) {
				if ( $a_parts[$iPartsCount - 1] == $sSuffix ) $iSuffix = true;
			}
			switch(count($a_parts)) {
				case 2:
					$a_name_parts['FIRST'] = $a_parts[0];
					$a_name_parts['LAST'] = $a_parts[1];
					break;
				case 3:
					if ( $iSuffix ) {
						$a_name_parts['FIRST'] = $a_parts[0];
						$a_name_parts['LAST'] = $a_parts[1];
						$a_name_parts['SUFFIX'] = $a_parts[2];
					} else {
						$a_name_parts['FIRST'] = $a_parts[0];
						$a_name_parts['MIDDLE'] = $a_parts[1];
						$a_name_parts['LAST'] = $a_parts[2];
					}
					break;
				case 4:
					if ( $iSuffix ) {
						$a_name_parts['FIRST'] = $a_parts[0];
						$a_name_parts['MIDDLE'] = $a_parts[1];
						$a_name_parts['LAST'] = $a_parts[2];
						$a_name_parts['SUFFIX'] = $a_parts[3];
					} else {
						$a_name_parts['FIRST'] = $a_parts[0];
						$a_name_parts['MIDDLE'] = $a_parts[1];
						$a_name_parts['LAST'] = $a_parts[2] . " " . $a_parts[3];
					}
					break;
				case 5:
					if ( $iSuffix ) {
						$a_name_parts['FIRST'] = $a_parts[0];
						$a_name_parts['MIDDLE'] = $a_parts[1];
						$a_name_parts['LAST'] = $a_parts[2] . " " . $a_parts[3];
						$a_name_parts['SUFFIX'] = $a_parts[4];
					} else {
						$a_name_parts['FIRST'] = $a_parts[0];
						$a_name_parts['MIDDLE'] = $a_parts[1];
						$a_name_parts['LAST'] = $a_parts[2] . " " . $a_parts[3] . " " . $a_parts[4];
					}
					break;
			}
			
		}
		return $a_name_parts;
	 }	
