/* Validation
	----------------------------------------------------------
 */
function radioboxValue(id) {
	var elm = returnObjectById(id);
	if (!elm)
		return false;
	
	var myform = elm.form;
	for (var i=0; i<myform.elements[elm.name].length; i++) {
		if (myform.elements[elm.name][i].checked)
			return myform.elements[elm.name][i].value;
	}
	return false;
}

function setVisible(ids, visible) {
	var display = visible ? '' : 'none';
	for (var i in ids) {
		elm = returnObjectById(ids[i]);
		if (elm)
			elm.style.display = display;
	}
}

function setEnabled(ids, enabled) {
	var disabled = enabled ? false : true;
	for (var i in ids) {
		elm = returnObjectById(ids[i]);
		if (elm)
			elm.disabled = disabled;
	}
}

function formRendererValidateField(fieldID, validationType, failureMessage, isDynamic, parameters) {
	function trim(s) {
	  while (s.substring(0,1) == ' ') {
	    s = s.substring(1,s.length);
	  }
	  while (s.substring(s.length-1,s.length) == ' ') {
	    s = s.substring(0,s.length-1);
	  }
	  return s;
	}
	
	function validate(element) {
		var data = trim(element.value);
		
		switch (validationType.toLowerCase()) {

			case 'required':
				if (element.type.toLowerCase() == 'radio') {
					var myform = element.form;
					var result = false;
					for (var i=0; i<myform.elements[element.name].length; i++)
						result = result || myform.elements[element.name][i].checked;
					return result;
				} else if (element.type.toLowerCase() == 'checkbox') {
					return element.checked;
				} else {
					if(data == '') {
						return false;
					}
				}
				break;

			case 'integer':
				if (element.disabled) return true;
				var regexp = new RegExp('^-?[0-9]+$', 'i');
				return (regexp.test(data) && !isNaN(parseInt(data)));
				break;
		
			case 'email':
				if (element.disabled) return true;
				var regexp = new RegExp('^([_a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+)(\.[a-zA-Z0-9-]+)*(\.[a-z]{2,4})$', 'i');
				return (regexp.test(data));
				break;
		
			case 'float':
			case 'number':
				if (element.disabled) return true;
				var regexp = new RegExp('^-?[0-9]*([.,][0-9]+)?$', 'i');
				return (regexp.test(data) && !isNaN(parseFloat(data)));
				break;
		
			case 'date':
				if (element.disabled) return true;
				var regexp1 = new RegExp('^([0-9]{4})[./-]([0-9]{1,2})[./-]([0-9]{1,2})$', 'i');
				var regexp2 = new RegExp('^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})$', 'i');
				return (regexp1.test(data) || regexp2.test(data));
				break;
			
			case 'hour':
				if (element.disabled) return true;
				var regexp = new RegExp('^(((0?|1)[0-9])|(2[0-3]))$', 'i');
				return (regexp.test(data));
				break;
			
			case 'minute':
				if (element.disabled) return true;
				var regexp = new RegExp('^((0?|[1-5])[0-9])$', 'i');
				return (regexp.test(data));
				break;

			case 'time':	
				if (element.disabled) return true;
				var regexp1 = new RegExp('^([0-9]{4})[./-]([0-9]{1,2})[./-]([0-9]{1,2})$', 'i');
				var regexp2 = new RegExp('^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})$', 'i');
				var regexp3 = new RegExp('^([0-9]{4})[./-]([0-9]{1,2})[./-]([0-9]{1,2})\ ([0-9]{1,2})[./-:]([0-9]{1,2})[./-:]([0-9]{1,2})$', 'i');
				var regexp4 = new RegExp('^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})\ ([0-9]{1,2})[./-:]([0-9]{1,2})[./-:]([0-9]{1,2})$', 'i');
				return (regexp1.test(data) || regexp2.test(data) || regexp3.test(data) || regexp4.test(data));
				break;
			
			case 'us_zip':
				if (element.disabled) return true;
				var regexp = new RegExp('(^[0-9]{5}$)|(^[0-9]{5}-[0-9]{4}$)', 'i');
				return (regexp.test(data));
				break;
				
			case 'regexp':
				if (element.disabled) return true;
				if (parameters && parameters['regexp']) {
					var regexp = new RegExp(parameters['regexp'], 'i');
					return (regexp.test(data));
				}
				break;
				
			case 'equalto':
				if (element.disabled) return true;
				if (parameters && parameters['equalto']) {
					var equal = returnObjectById(parameters['equalto']);
					if (equal && equal.value != data)
						return false;
				}
				break;

			case 'function':
				if (parameters && parameters['function']) {
					return eval(parameters['function']);
				}
				break;
				
			case 'minmax':
			case 'maxmin':
				if (parameters) {
					if ((typeof parameters['maxlength'] != 'undefined' && data.length > parameters['maxlength'])
						|| (typeof parameters['minlength']  != 'undefined' && data.length < parameters['minlength'])
						|| (typeof parameters['maxvalue'] != 'undefined' && data > parameters['maxvalue'])
						|| (typeof parameters['minvalue'] != 'undefined' && data < parameters['minvalue']))
					{
						return false;
					}
				}
				break;
				
			case 'string':
				return true;
		}
		return true;
	}
	var elm;
	var result = true;
	if (isDynamic) {
		var i = 0;
		var id;
		while (1) {
			id = fieldID + '_' + i;
			elm = returnObjectById(id);
			if (!elm)
				break;
			if (!validate(elm)) {
				result = false;
				break;
			}
			i++;
		}
	} else {
		elm = returnObjectById(fieldID);
		if (elm){
			result = validate(elm);
		}
	}
	
	if (result == false) {
		// elm variable currently refers to element with some errors found, focus on it
		//var message = returnObjectById(failureMessageID);
		//message = message ? message.value : 'Invalid option: ' + elm.name + '\n(no detailed message)';
		alert(failureMessage);
		elm.focus();
	}
	return result;
}

