
// 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.getAttribute('datatype')) && _ISD_UI_EnsureValue(ctrl.getAttribute('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.getAttribute('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.getAttribute('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 = ctrlForm.elements[i];
		if (field)
		{
			if (_ISD_UI_Form_IsControlToValidate(field))
			{
				var valid = true;
				if(field.getAttribute('isrequired')) // check required fields
				{
					if(!field.disabled)
					{
						switch(field.getAttribute('datatype'))
						{
							case 'Lookup':
							{
								valid = (field.value != 0 && field.value != null && field.value != '');
								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.getAttribute('datatype'))	// check regular expressions
						valid = _ISD_UI_Form_ValidateRegExp(field.value, field.getAttribute('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;
}

