<?php
/**
 * Field for displaying bank account numbers. It separates the bank, branch, account-number and account-suffix.
 */
class BankAccountField extends FormField {
	
	protected $bankCode;
	protected $branchCode;
	
	/**
	 * HACK Proper requiring of compositefields would involve serious restructuring.
	 */
	public $isRequired = false;
	public $requiredFields = array(
		"BankCode",
		"BranchCode",
		"AccountNumber",
	);
	
	public function __construct($name, $title, $value = null, $bankCode = null, $branchCode = null, $form = null) {
		
		$this->bankCode = $bankCode;
		$this->branchCode = $branchCode;
		
		parent::__construct($name, $title, $value, $form);
	}
	
	public function Field() {
		$field = new FieldGroup($this->name);
		$field->setID("{$this->name}_Holder");
		
		$valueArr = array();
		list(
			$valueArr['BankCode'], 
			$valueArr['BranchCode'], 
			$valueArr['AccountNumber'], 
			$valueArr['AccountSuffix']
		) = explode(" ",$this->value);
		$valueArr = self::convert_format_nz($valueArr);
		
		$field->push(new NumericField($this->name.'[BankCode]', '', $valueArr['BankCode'], 2));
		$field->push(new NumericField($this->name.'[BranchCode]', '', $valueArr['BranchCode'], 4));
		$field->push(new NumericField($this->name.'[AccountNumber]', '', $valueArr['AccountNumber'], 8));
		$field->push(new NumericField($this->name.'[AccountSuffix]', '', $valueArr['AccountSuffix'], 3));
			
		return $field;
	}
	
	public function setValue($value) {
		$this->value = self::join_bank_number($value);
	}
	
	public static function join_bank_number($value) {
		if(is_array($value)) {
			$value = self::convert_format_nz($value);
			if($value['BankCode']) {
				$completeNumber .= $value['BankCode'] . " ";
			}
			if($value['BranchCode']) {
				$completeNumber .= $value['BranchCode'] . " ";
			}
			if($value['AccountNumber']) { 
				$completeNumber .= $value['AccountNumber'] . " ";
			}
			if($value['AccountSuffix']) {
				$completeNumber .= $value['AccountSuffix'];
			}
			return $completeNumber;
		} else
			return $value;
	}
	
	/**
	 * TODO Very basic validation at the moment
	 */
	function jsValidation() {
		$formID = $this->form->FormName();
		
		$jsRequired = "";
		if($this->isRequired && $this->requiredFields) {
			foreach($this->requiredFields as $requiredFieldName) {
				$name = $this->Name() . "-{$requiredFieldName}";
				$jsRequired .= "require('$name')\n";
			}
		}
		
		$jsFunc =<<<JS
Behaviour.register({
	"#$formID": {
		validateBankNumber: function(fieldName) {
			if(!$(fieldName + "_Holder")) return true;

			// Phonenumbers are split into multiple values, so get the inputs from the form.
			var parts = $(fieldName + "_Holder").getElementsByTagName('input');
			var isNull = true;
			
			// we're not validating empty fields (done by requiredfields)
			for(i=0; i < parts.length ; i++ ) {
				isNull = (parts[i].value == null || parts[i].value == "") ? isNull && true : false;
			}
			
			if(!isNull) {
				// Concatenate the string values from the parts of the input.
				var joinedNumber = ""; 
				for(i=0; i < parts.length; i++) joinedNumber += parts[i].value;
				if(!joinedNumber.match(/^[\d]{2}[\s]*[\d]{4}[\s]*[\d]{7,8}[\s]*[\d]{2,3}\$/)) {
					// TODO Find a way to mark multiple error fields
					validationError(
						fieldName+"-AccountNumber",
						"Please enter a valid bank number",
						"validation",
						false
					);
				}
			}
			$jsRequired
			return true;			
		}
	}
});
JS;
		Requirements :: customScript($jsFunc, 'func_validateBankNumber');
		
		return "\$('$formID').validateBankNumber('$this->name');";
	}
	
	/**
	 * TODO Very basic validation at the moment
	 */
	function validate($validator){
		$valid = preg_match(
			'/^[\d]{2}[\s]*[\d]{4}[\s]*[\d]{7,8}[\s]*[\d]{2,3}$/',
			self::join_bank_number($this->value)
		);
		
		if(!$valid){
			$validator->validationError(
				$this->name, 
				"Please enter a valid bank number",
				"validation", 
				false
			);
			return false;
		}
		
		return true;
	}
	
	/**
	 * Convert from old format (2-4-7-2) to new format (2-4-8-3).
	 * 
	 * @param $value array BankCode, BranchCode, AccountNumber, AccountSuffix
	 * @return array
	 */
	static function convert_format_nz($value) {
		if(is_string($value)) {
			list(
				$valueArr['BankCode'], 
				$valueArr['BranchCode'], 
				$valueArr['AccountNumber'], 
				$valueArr['AccountSuffix']
			) = explode(" ",$value);
		} else {
			$valueArr = $value;
		}
		
		if(strlen(trim($valueArr['AccountNumber'])) == 7) {
			$valueArr['AccountNumber'] = str_pad($valueArr['AccountNumber'],8,"0",STR_PAD_LEFT);
		}
		if(strlen(trim($valueArr['AccountSuffix'])) == 2) {
			$valueArr['AccountSuffix'] = str_pad($valueArr['AccountSuffix'],3,"0",STR_PAD_LEFT);
		}
		return $valueArr;
	}
	
}
?>