// Input: string value
// action: check if this string is empty or not.
function _ISD_UI_Form_IsEmptyString(str)
{
	var ret = true;
	if(str)
	{
		if('' != str)
		{
			ret = (str.length + 1 == str.split(' ').length);
		}
	}
	return ret;
}
// Input: a float value 
// action: check if this input value is float or not.
function _ISD_UI_Form_GetDate(field, arrdate)
{
	var ret = null;
	if (-1 != field.name.indexOf("Day"))
		arrdate[0] = field.value;
	if (-1 != field.name.indexOf("Month"))
		arrdate[1] = field.value;
	if (-1 != field.name.indexOf("Year"))
		arrdate[2] = field.value;
	if (arrdate[0] && arrdate[1] && arrdate[2])	
		ret = String(arrdate[1]) + '/' + String(arrdate[0]) + '/' + String(arrdate[2]);
	return ret;	
}
//action: check date interval
function _ISD_UI_Form_CheckDateInterval(start, end) 
{
	var ret = false;
  var diff = _ISD_UI_getDateDiff(start, end, 'd', true);
  if (diff != null && diff>=0)
  	ret = true;
  	
  return ret;
}
//action: check search keyword
function _ISD_UI_Form_ValidateStringRegExp(val)
{
	var ret = false;
	var pattern1;
	var pattern2;
	var pattern3;
	var pattern4;
	pattern1 =	/(\!)|(\@)|(\#)|(\$)|(\%)|(\^)|(\&amp;)|(\*)|(\()|(\))|(\+)|(\=)|(\-)|(\[)|(\])|(\\\\)|(\')|(\;)|(\,)|(\.)|(\/)|(\{)|(\})|(\|)|(\\)|(\")|(\:)|(\<)|(\>)|(\&lt;)|(\&gt;)|(\?)/i;
	pattern2 = /(\%27)|(\')|(\-\-)|(\%23)|(#)/i;
	pattern3 = /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;))/i;
	pattern4 = /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/i;
	ret = (!pattern1.test(val));
	if (ret)
		ret = (!pattern2.test(val));
	if (ret)
		ret = (!pattern3.test(val));
	if (ret)
		ret = (!pattern4.test(val));
	
	return ret;
}
// Input: a string value and regular expression pattern
// action: check if this input string is a valid regular expression or not.
function _ISD_UI_Form_ValidateRegExp(val, datatype)
{
	var ret = true;
	var pattern;
	if(!_ISD_UI_Form_IsEmptyString(val))
	{
		switch(datatype)
		{
			case 'Email':
			{
				pattern = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/gi;
				break;
			}
			case 'Url':
			{
				pattern = /http:\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{3}/gi;
				break;
			}
			case 'Enum':
			case 'Money':
			case 'Integer':
			{
				pattern = /(^-?\d\d*$)/gi;
				break;
			}
			case 'Float':
			case 'Decimal':
			case 'Number':
			{
				pattern = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/gi;
				break;
			}
			case 'File':
			{
				pattern  =	/(\.exe)|(\.com)|(\.bat)|(\.asp)|(\.aspx)|(\.cgi)|(\.cfm)|(\.cgi)|(\.dll)|(\.php)|(\.bin)|(\.cmd)|(\.csh)|(\.hta)|(\.js)|(\.jse)|(\.jsx)|(\.ocx)|(\.script)|(\.bv)|(\.vbe)|(\.vbscript)|(\.vbs)|(\.app)|(\.awk)|(\.icd)|(\.jar)|(\.dld)|(\.ebm)|(\.vlx)|(\.wsf)|(\.xap)/i;
				break;
			}
			case 'Datetime':
			{
				pattern = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
				break;
			}
			case 'ISDFormField':
			{
				pattern = /INPUT|TEXTAREA|SELECT|OPTION/;
				break;
			}
			default:
				break;
		}
		if (pattern)
			ret = pattern.test(val);
		ret = ('File' == datatype) ? (!ret) : ret;
	}
	return ret;
}
// Input: a form element 
// action: check if this form element is a valid form field or not.
function _ISD_UI_Form_IsControlToValidate(ctrl)
{
	var ret = false;
	if (_ISD_UI_Form_ValidateRegExp(ctrl.tagName, 'ISDFormField'))
	{
		if (_ISD_UI_EnsureValue(ctrl.datatype) && _ISD_UI_EnsureValue(ctrl.errormessage))
			ret = true;
	}
	return ret;
}
// Input: the form field.
// action: popup an error message and return false
function _ISD_UI_Form_ChangeFocus(field, valid)
{
	var className;
	var bgColor;
	var brColor;
	if (valid)
	{
		className = 'validfield_FormStyle';	
		bgColor = '#ffffff'; brColor = '#bdc7d8';
	}	
	else
	{
		className = 'invalidfield_FormStyle';	
		bgColor = '#fbdbdc'; brColor = '#f59297';
	}	
	field.style["backgroundColor"] = bgColor;
	field.style["borderColor"] = brColor;	
}
// Input: the form field.
// action: popup an error message and return false
function _ISD_UI_Form_OnDoValidateField(field, valid)
{
	if ('Datetime' != field.datatype)
		_ISD_UI_Form_ChangeFocus(field, valid)
	else
	{
		var ctrl = _ISD_UI_getFirstParent(field, "SPAN");
		if (ctrl)
			_ISD_UI_Form_ChangeFocus(ctrl, valid)
	}
	if (!valid)
	{	
		alert(field.errormessage);	
		field.focus(); 
	}
}
// Input: the submit control, the function name and the ObjectID.
// action: validation of web form controls
function _ISD_UI_Form_validate(ctrlSubmit)
{
	var arrdate = new Array();
	var ret = true;
	var i = 0;
	
	ctrlSubmit = _ISD_UI_EnsureObject(ctrlSubmit);
	var ctrlForm = ctrlSubmit.form;
	for(i=0; i < ctrlForm.elements.length; i++)
	{
		var field = _ISD_UI_EnsureObject(ctrlForm.elements[i]);
		if (_ISD_UI_Form_IsControlToValidate(field))
		{
			var valid = true;
			if(field.required) // check required fields
			{
				if(!field.disabled)
				{
					switch(field.datatype)
					{
						case 'Lookup':
						{
							valid = (field.value != 0);
							break;
						}
						case 'Float':
						case 'Decimal':
						case 'Number':
						case 'Integer':
						{
							valid = (true != _ISD_UI_Form_IsEmptyString(field.value));
							if (valid)
								valid = (field.value > 0);
							break;
						}
						default:
						{
							valid = (true != _ISD_UI_Form_IsEmptyString(field.value));
							break;
						}
					}
					_ISD_UI_Form_OnDoValidateField(field, valid);
					if (!valid)
						return false;
				}
			}
			if (valid)
			{
				if ('Datetime' != field.datatype)	// check regular expressions
					valid = _ISD_UI_Form_ValidateRegExp(field.value, field.datatype); 
				else // check valid datetime
				{
					var date = _ISD_UI_Form_GetDate(field, arrdate);
					if (date)
					{
						valid = _ISD_UI_Form_ValidateRegExp(date, 'Datetime');
						if (valid && ('' != field.controltovalidate && null != field.controltovalidate))
						{
							if ('Today' == field.controltovalidate)
							{
								var start = new Date(arrdate[2], arrdate[1], arrdate[0]);
								var today = new Date();
								var end = new Date(today.getFullYear(), today.getMonth() + 1, today.getDate());
								if (null != start && null != end) 
									valid = _ISD_UI_Form_CheckDateInterval(start, end); 
							}
							else
							{
								var start = _ISD_UI_getDateByID(field, field.controltovalidate); 
								var end = new Date(arrdate[2], arrdate[1], arrdate[0]);
								if (null != start && null != end) 
									valid = _ISD_UI_Form_CheckDateInterval(start, end); 
							}
						}
						date = null; arrdate[0] = null; arrdate[1] = null; arrdate[2] = null;	
					}	
				}	
				_ISD_UI_Form_OnDoValidateField(field, valid);
				if (!valid)
						return false;
			}		
		}
	}
	return ret;
}

