/*
	Form elements check
	29/10/02 11:48
*/
var _aFormField = new Array(); // default array, contains list of fields to check

// public functions
// Form checker
function _fnFormCheck(sFormName, bSubmitFriendly)
{
	var result = false;
	var oFormChecker = new FormChecker(sFormName);
	oFormChecker.Synchronize();
	if(oFormChecker.Check())
	{
		if(bSubmitFriendly)
		{
			oFormChecker.FieldsSubmitFriendly();
		}
		result = true;
	}
	return result;
}

// FormField object constructor
function FormField(sFormName, sInternalName, sPublicName, bIsCompulsory, iMaxLength, sFormat, sHelp)
{
	this.FormName = sFormName;
	this.InternalName = sInternalName;
	this.PublicName = sPublicName;
	this.Element = null;
	this.IsCompulsory = bIsCompulsory;
	this.IsSpacesFounded = false;
	this.MaxLength = iMaxLength;
	this.Format = sFormat;
	this.Help = sHelp;
}

//////////////////////////
/// Form Checker
/////////////////////////

// FormChecker constructor
function FormChecker(sFormName)
{
	this.FormName = sFormName;
	this.Element = null;
	this.Elements = null;
	this.Synchronize = FormChecker_Synchronize;
	this.Check = FormChecker_Check;
	this.CheckField = FormChecker_CheckField;
	this.CheckValue = FormChecker_CheckValue;
	this.CheckGroupValue = FormChecker_CheckGroupValue;
	this.Alert = FormChecker_Alert;
	this.IsStringLonger = FormChecker_IsStringLonger;
	this.IsStringFitFormat = FormChecker_IsStringFitFormat;
	this.IsStringEmpty = FormChecker_IsStringEmpty;
	this.FieldsSubmitFriendly = FormChecker_FieldsSubmitFriendly;
}

// check form and element existence and populate FormChecker object properties
function FormChecker_Synchronize(aElem)
{
	var result = false;
	var sFormName = this.FormName;
	if(sFormName != null)
	{
		var oForm = document.forms[sFormName];
		if(oForm)
		{
			this.Element = oForm;
			if(!aElem || aElem.length == 0)
			{
				// get default array
				if(typeof(_aFormField) != "undefined")
				{
					aElem = _aFormField;
				}
			}
			if(aElem && aElem.length > 0)
			{
				var aFormElem = new Array();
				var iCount = 0;
				for(var i = 0; i < aElem.length; i ++)
				{
					if(aElem[i].FormName == sFormName && oForm.elements[aElem[i].InternalName])
					{
						aFormElem[iCount] = aElem[i];
						//aFormElem[iCount].Element = oForm.elements[aElem[i].Name];
						iCount++;
					}
				}
				if(aFormElem.length > 0)
				{
					this.Elements = aFormElem;
				}
			}
			result = true;
		}
	}
	return result;
}

// check function. iterates by every registered field in Elements array
// resolves html form element by name and pass it to CheckField function
function FormChecker_Check()
{
	result = false;
	if(this.Element)
	{
		var aElem = this.Elements;
		var cFormElem = this.Element.elements;
		if(aElem)
		{
			for(var i = 0; i < aElem.length; i++)
			{
				var oOneField = aElem[i];
				var oOneElem = cFormElem[oOneField.InternalName];
				if(oOneElem)
				{
					if(!this.CheckField(oOneElem, oOneField))
					{
						break;
					}
				}
			}
		}
		else
		{
			result = true;
		}
	}
	return result;
}

// resolves field value and passes it to CheckValue for the value check
function FormChecker_CheckField(oFormElem, oFieldElem)
{
	result = true;
	var sType = oFormElem.type;
	var bIsCollection = (oFormElem.length > 0 && typeof(oFormElem.options) == "undefined");
	if(bIsCollection)
	{
		if(oFormElem[0].type == "checkbox" || oFormElem[0].type == "radio")
		{
			if(!this.CheckGroupValue(oFormElem, oFieldElem))
			{
				this.Alert(oFormElem[0], oFieldElem);
				result = false;
			}
		}
		else
		{
			for(var i = 0; i < oFormElem.length; i++)
			{
				if(!this.CheckValue(oFormElem[i], oFieldElem))
				{
					this.Alert(oFormElem[i], oFieldElem);
					result = false;
					break;
				}
			}
		}
	}
	else
	{
		if(!this.CheckValue(oFormElem, oFieldElem))
		{
			this.Alert(oFormElem, oFieldElem);
			result = false;
		}
	}
	return result;
}

// 
function FormChecker_CheckValue(oFormElem, oFieldElem)
{
	result = true;
	var sType = oFormElem.type;
	
	if(sType == "select" || sType == "select-one" || sType == "select-multiple")
	{
		if(oFieldElem.IsCompulsory)
		{
			result = false;
			var iSelectedIndex = oFormElem.selectedIndex;
			result = (iSelectedIndex > 0 || (iSelectedIndex == 0 && oFormElem.options[iSelectedIndex].value != ""));
			if(sType == "select-multiple" && !result)
			{
				for(var i = 0; i < oFormElem.options.length; i++)
				{
					if(oFormElem.options[i].selected)
					{
						result = true;
						break;
					}
				}
			}
		}
	}
	else if(sType == "text" || sType ==  "password" || sType == "textarea" || sType == "file")
	{
		var sValue = oFormElem.value;
		
		oFieldElem.IsSpacesFounded = ((sType ==  "password") && (oFieldElem.IsCompulsory && sValue && sValue.indexOf(" ") >= 0))
		
		if((oFieldElem.IsCompulsory && this.IsStringEmpty(sValue)) || (oFieldElem.MaxLength && this.IsStringLonger(sValue, oFieldElem.MaxLength)) || (oFieldElem.Format && !this.IsStringFitFormat(sValue, oFieldElem.Format)))
		{
			result = false;
		}
	}
	return result;
}

function FormChecker_CheckGroupValue(oFormElem, oFieldElem)
{
	result = true;
	if(oFormElem.length > 0)
	{
		if(oFieldElem.IsCompulsory)
		{
			result = false;
			for(var i = 0; i < oFormElem.length; i++)
			{
				if(oFormElem[i].checked)
				{
					result = true;
					break;
				}
			}
		}
	}
	return result;
}

function FormChecker_Alert(oFormElem, oFieldElem)
{
	var result = "(!) The value is invalid.\r\n\r\n";
	if(oFieldElem.Help)
	{
		result += oFieldElem.Help;
	}
	else
	{
		result += (oFieldElem.PublicName ? "\"" + oFieldElem.PublicName + "\" field" : "The field") +
			(oFieldElem.IsSpacesFounded ? " must not contain spaces" : (oFieldElem.IsCompulsory ? " is compulsory." : "")) +
			(oFieldElem.MaxLength ? (oFieldElem.IsCompulsory ? " The" : "") + " maximum length is " + oFieldElem.MaxLength + "." : "") +
			(oFieldElem.Format && !oFieldElem.IsCompulsory && !oFieldElem.MaxLength ? " format is incorrect." : "");
	}
	alert(result);
	if(oFormElem && oFormElem.type != "hidden" && !oFormElem.disabled)
	{
		oFormElem.focus();
	}
	return false;
}

function FormChecker_IsStringEmpty(sStr)
{
	var result = true;
	var sInvalid = " \t\n\r";
	for(var i = 0; i < sStr.length; i++)
	{
		if(sInvalid.indexOf(sStr.charAt(i)) < 0)
		{
			result = false;
			break;
		}
	}
	return result;
}

function FormChecker_IsStringFitFormat(sStr, sFormat)
{
	var result = true;
	if(sStr && sStr.length > 0)
	{
		if(sFormat.indexOf("@") == 0)
		{
			//pre-defined format, e.g. @email
		}
		else
		{
			if(typeof(new RegExp()) != "undefined")
			{
				var oRegExp = new RegExp(sFormat);
				result = oRegExp.test(sStr);
			}
		}
	}
	return result;
}

function FormChecker_IsStringLonger(sStr, iMaxLength)
{
	return(sStr.length > iMaxLength);
}

// reset unselected checkboxes
//	in order to have complete form collection
function FormChecker_FieldsSubmitFriendly()
{
	var oElements = this.Element.elements;
	for(var i = 0; i < oElements.length; i++)
	{
		var oElem = oElements[i];
		var sType = oElem.type;
		if(sType == "checkbox")
		{
			if(oElem.length > 0)
			{
				// multiple
				var bIsChecked = false;
				for(var k = 0; k < oElem.length; k++)
				{
					if(oElem[k].checked)
					{
						bIsChecked = true;
						break;
					}
				}
				if(!bIsChecked)
				{
					oElem[0].value = "0";
					oElem[0].checked = true;
				}
			}
			else
			{
				// single
				//if(!oElem.checked)
				//{
				//		oElem.value = "0";
				//		oElem.checked = true;
				//}
			}
		}
	}
}


