/**
 * Called when an edit field should change value.
 */	
function onEditChange(field) {
	setData(field, -1);	
}

/**
 * Called when an edit field changes value.
 */	
function onChangeEvent(field, validation_code, positiveOnly) {
	if (onFieldValidate(field,validation_code, positiveOnly)) {
		onEditChange(field); 
		return true;
	}
	else {
		return false;
	}	
}

/**
 * Called when field in endless controls changes value.
 */
function onEditChangeEndless(field, validation_code, positiveOnly) {
	var row;
	if (onFieldValidate(field,validation_code, positiveOnly)) {
		row = getCurrentRow(field);
		setData(field, row);		
		return true;
	}
	else {
		return false;
	}		
}

/**
 * Called when an edit field gains focus.
 */
function onEditFocusGain(field) {
	if (field.className != 'disabled') {
		field.setAttribute('oldTextAlign', field.style.textAlign);	
		field.className = 'focused';
		setFSHHint(field.id);
//		document.getElementById(field.id).select();
	}
}

/**
 * Called when an edit field loses focus.
 */
function onEditFocusLost(field) {
	if (field.className != 'disabled') {
		field.className = 'enabled';
		field.style.textAlign = field.getAttribute('oldTextAlign');
	}
}

/**
 * The handler for the onEditKeyDown event.
 */
function onEditKeyDown(field, event, validation_code) {		
	if (field.readOnly)
		return;
	if (window.event) {
		keynum = event.keyCode;
	} else if (event.which) {
		keynum = event.which;
	}	

	keychar = String.fromCharCode(keynum);	
	if (keynum == 9 && event.shiftKey) {
		field.focusField = 'prev';
		field.onchange();
		return false;
	} else if (keychar == '\r' || keynum == 9) {
		field.focusField = 'next';
		field.onchange();		
		return false;
	} else if (keynum == 40 && event.altKey) {
		var button = document.getElementById('button_' + field.id);
		if (button) {
			onSelectClick(field.id, -1);
			menuActivate(field.id, -1, button);
			return false;
		}
	}
	if (field.className != 'editmode') {
		switch (validation_code) {
			case 8: case 9: case 10: case 14:
				var str = field.value;
				field.value = str.replace(/ /g, '');
				field.value = str.replace(/\u00A0/g, '');
				break;
		}		
		field.className = 'editmode';
		field.style.textAlign = 'left';
		field.select();
	}
	return true;
}

/**
 * Validates a field.
 */
function onFieldValidate(field, validation_code, positiveOnly) {
	var regExp;
	var msgSuffix = '';
	switch (validation_code) {

		case 8: case 9: case 10: case 14: //tiFldNumeric=8 tiFldAmount=9 tiFldCurrency=10 tiFldPercent=14
			regExp = (positiveOnly ? /^[\d,. \u00A0]*$/ : /^-?[\d,. \u00A0]*$/); // \u00A0 = nbsp
			msgSuffix = (positiveOnly ? '.number.positive' : '.number');
			break;
		case 11: //tiFldDate
			//regExp = /^(([\d-/]*)|([dD]{1}))$/; //Digit or - or / or D/d
			regExp = /^(([\d-]*)|([Dd]{1})|([\d/]*))$/; //Digit or - or / or D/d
			msgSuffix = '.date';
			break;
		case 12: case 13: //tiFldEnclCon=12 /tiFldEnclNo=13
			regExp = /^[\d,-]*$/; //Digit or - or , 
			msgSuffix = '.encl';
			break;
		case 15: //tiFldShare
			regExp = (positiveOnly ? /^[\d,.]*$/ : /^-?[\d,.]*$/); //Digit or . or ,
			msgSuffix = (positiveOnly ? '.share.positive' : '.share');
			break;
		case 16: //tiFldSSN
			regExp = /^[\d-]*$/; //Digit or -
			msgSuffix = '.ssn';
			break;
		default: //tiFldText=17
			regExp =/^.*$/;
			break;
	}
	var RetVal;
	RetVal = regExp.test(field.value);
	if (!RetVal) {
		if (showMessage) showMessage('error.validation.field' + msgSuffix);
		field.focus();
		field.select()	
	}
	return RetVal;
}

/**
 * Clean this field after each keypress.
 */
function onEditKeyUp(field, evt, validation_code) {
	if (field.value == '') return;
	switch (validation_code) {
		case 8: case 9: case 10: case 14: //tiFldNumeric=8 tiFldAmount=9 tiFldCurrency=10 tiFldPercent=14
			var fieldValue = field.value;
			var origFieldValue = fieldValue;
			while ((fieldValue != '') && (/^[,.]*$/.test(fieldValue.substr(0,1)))) {
				fieldValue = fieldValue.substr(1);
			}
			var neg = (fieldValue.substr(0,1) == '-');
			fieldValue = fieldValue.replace(/[-#$%&\'\(]/g, ''); // These chars have the same keycodes as end, home and arrows.
			if (neg) fieldValue = '-' + fieldValue;
			if (origFieldValue != fieldValue) field.value = fieldValue;
		break;
	}
}
	
/**
 * Tests if a key is valid for this field.
 */
function onKeyPressValidate(field, evt, validation_code, positiveOnly, stopAll) {
	var keyCode = evt.which ? evt.which : evt.keyCode;
	var keyChar = String.fromCharCode(keyCode);
	var regExp;
	//Arrows and some other characters like backspace etc is OK
	if ((keyCode<30) || ((keyCode<41) && (keyCode>34))) {		
		return true;
	}
	if (stopAll) {
		return false;
	}

	switch (validation_code) {


		case 8: case 9: case 10: case 14: //tiFldNumeric=8 tiFldAmount=9 tiFldCurrency=10 tiFldPercent=14
			regExp = (positiveOnly ? /^[\d,.]*$/ : /^-?[\d,.]*$/);
			break;
		case 11: //tiFldDate
			regExp = /^[\d-Dd/]*$/; //Digit or - or / or d/D
			break;
		case 12: case 13: //tiFldEnclCon=12 /tiFldEnclNo=13
			regExp = /^[\d,-]*$/; //Digit or - or / ??????
			break;	
		case 15: //tiFldShare
			regExp = (positiveOnly ? /^[\d,.]*$/ : /^[\d,.-]*$/); //Digit or -
			break;
		case 16: //tiFldSSN
			regExp = /^[\d-]*$/; //Digit or -
			break;
		default: //tiFldText=17
			regExp =/^.*$/;
			break;

	}
	return regExp.test(keyChar);
}

