/*
////////////////////////////////////////////////////
Library: HTML-Form related functions

	fnOnActionButtonPressed(objForm, boolIsCheckFields, boolIsCleanUpElemName)
	fnActionButtonDelete(objForm, strMessage, strElemName)	
	fnOnFormSubmit(objForm, boolIsCheckFields, boolIsCleanUpElemName)
	fnGetElemRealName(objForm, strElemName)
///////////////////////////////////////////////////
*/

////////////////////
// Global Const
///////////////////
var SYS_FORM_ELEMENT_DOACTION = "doaction";
var SYS_SYSTEM_PARAMETER = "--system--";
var SYS_FORM_ACTION_DELETE = 3;
var SYS_DELIMETER_HTMLCONTROLNAME = "::";
var LOC_CONST_PARAMS_COUNT = 4;
var __boolIsSubmitted = false;
var __arrObjSet;
var __arrCheckbox;

//////////////////////
// User-enable functions
/////////////////////
function fnOnActionButtonPressed(objForm, boolIsCheckFields, boolIsCleanUpElemName, boolNotProcessCheckboxes, boolNotSubmitOnce)
{
	if(fnOnFormSubmit(objForm, boolIsCheckFields, boolIsCleanUpElemName, boolNotProcessCheckboxes, boolNotSubmitOnce)) objForm.submit();
}

function fnActionButtonDelete(objForm, strMessage, strElemName)
{
	if(objForm && objForm.elements)
	{
		var objElem;
		if(objForm.elements[strElemName]) objElem = objForm.elements[strElemName];
		else if(objForm.elements[SYS_FORM_ELEMENT_DOACTION]) objElem = objForm.elements[SYS_FORM_ELEMENT_DOACTION];
		else if(objForm.elements[SYS_SYSTEM_PARAMETER + SYS_FORM_ELEMENT_DOACTION]) objElem = objForm.elements[SYS_SYSTEM_PARAMETER + SYS_FORM_ELEMENT_DOACTION];
		if(objElem)
		{
			if(!strMessage) strMessage = "Are you sure to delete this item?\r\n";
			if(confirm(strMessage))
			{
				objElem.value = SYS_FORM_ACTION_DELETE;
				fnCleanUpFormElementNames(objForm);
				fnOnActionButtonPressed(objForm, false, false);
			}
		}
	}
}

function fnOnFormSubmit(objForm, boolIsCheckFields, boolIsCleanUpElemName, boolNotProcessCheckboxes, boolNotSubmitOnce)
{
	if(objForm && !__boolIsSubmitted)
	{

		if(boolIsCheckFields)
		{
			if(!fnCheckFormElements(objForm)) return(false);
		}
		if(boolIsCleanUpElemName)
		{
			 // clean up element names
			if(!fnCleanUpFormElementNames(objForm)) return(false);
		}
		else
		{
			// enable all elements
			if(!fnEnableFormElements(objForm)) return(false);
		}
		// process checkboxes
		if(!boolNotProcessCheckboxes)
		{
			if(!fnProcessCheckboxes(objForm)) return(false);
		}
		if(!boolNotSubmitOnce) __boolIsSubmitted = true; // submit once!
		return(true);
	}
	return(false);
}

function fnGetElemRealName(objForm, strElemName)
{
	if(objForm && objForm.elements && strElemName)
	{
		var arrParams;
		var strElemRealName;
		for(var intCount = 0; intCount < objForm.elements.length; intCount ++)
		{
			strElemRealName = objForm.elements[intCount].name;
			if(strElemRealName.indexOf(SYS_DELIMETER_HTMLCONTROLNAME) != -1)
			{
				arrParams = strElemRealName.split(SYS_DELIMETER_HTMLCONTROLNAME);
				if(arrParams.length == LOC_CONST_PARAMS_COUNT)
				{
					if(arrParams[0] == strElemName)	return(strElemRealName);
				}
			}
		}
		return(strElemName);
	}
}

////////////////////
// System function
// check elements
////////////////////
function fnCheckFormElements(objForm)
{
	if(fnNewObjSet(objForm))
	{
		var intCount, intFormIndex;
		var arrCollection;
		var strType, strValue;
		var boolIsOk = true; //assuming OK
		var boolMandatoryOk = true; //assuming OK
		__arrCheckbox = new Array(); //initialize array
		for(intCount = 0; intCount < __arrObjSet.length; intCount++)
		{
			arrCollection = __arrObjSet[intCount].collection; // get collection
			strType = __arrObjSet[intCount].type; // get type
			boolIsOk = true; // assuming OK
			boolMandatoryOk = false;
			boolOptionalCheckedIndex = false; // checkboxes | radio buttons
			for(var intCount1 = 0; intCount1 < arrCollection.length; intCount1 ++)
			{
				strValue = arrCollection[intCount1].value;
				if(__arrObjSet[intCount].mandatory)
				{
					boolIsOk = false;
					boolOptionalCheckedIndex = true;
					if(strType == "radio" || strType == "checkbox")
					{
						if(arrCollection[intCount1].checked) {boolIsOk = true; boolMandatoryOk = true;}
					}
					else
					{
						if(!fnCheckFieldIsEmpty(strValue)) {boolIsOk = true; boolMandatoryOk = true;}
					}
				}
				else if(strType == "radio" || strType == "checkbox")
				{
					// counter to enable checkboxes and radio buttons in request.form
					boolOptionalCheckedIndex = boolOptionalCheckedIndex || arrCollection[intCount1].checked;
				}
				else
				{
					boolOptionalCheckedIndex = true;
				}
				
				if(boolIsOk && strValue && (strType == "text" || strType == "textarea" || strType == "password"))
				{
					if(__arrObjSet[intCount].maxlength)
					{
						if(!fnCheckFieldIsLengthOK(strValue, __arrObjSet[intCount].maxlength)) boolIsOk = false;
					}
					if(boolIsOk && __arrObjSet[intCount].mask)
					{
						if(!fnCheckFieldIsFitTemplate(strValue, __arrObjSet[intCount].mask)) boolIsOk = false;
					}
				}
				intFormIndex = arrCollection[intCount1].index;
			}//for
			if(!boolIsOk) // && !boolMandatoryOk)
			{
				//error
				fnCheckFieldAlertError(__arrObjSet[intCount].mandatory, __arrObjSet[intCount].maxlength, __arrObjSet[intCount].mask);
				if((!objForm.elements[intFormIndex].disabled)) objForm.elements[intFormIndex].focus();
				return(false);
			}
			else if(!boolOptionalCheckedIndex)
			{
				//alter checkbox & radio array
				__arrCheckbox[__arrCheckbox.length] = intFormIndex;
			}
		} // for
		return(true);
	}
	return(false);
}

function fnCheckFieldIsEmpty(strElemValue)
{
	var strInvalid = " \t\n\r";
	for(var intCount = 0; intCount < strElemValue.length; intCount++)
	{
		if(strInvalid.indexOf(strElemValue.charAt(intCount)) < 0)
		{
			return(false);
		}
	}
	return(true);
}

function fnCheckFieldIsLengthOK(strElemValue, intLength)
{
	if(strElemValue && intLength)
	{
		return(strElemValue.length <= intLength); 
	}
	return(false);
}

function fnCheckFieldIsFitTemplate(strElemValue, strMask)
{
	var objRegExp = new RegExp(strMask);
	var boolReturn = objRegExp.test(strElemValue);
	objRegExp = null;
	return(boolReturn);
}

///////////////
// Error Alert
//////////////
function fnCheckFieldAlertError(boolMandatory, intLength, strMask)
{
	alert(	"The entry form is incomplete or the one of the fields is invalid.\r\n\r\n" + 
			"The cursor focus will be moved to the invalid field\r\n" +
			"after pressing \"OK\" button.\r\n\r\n" +
			(boolMandatory ? "The field in compulsory.\r\n" : "") +
			(intLength ? "The length of the field should to exceed " + intLength + ".\r\n" : "") +
			(strMask == "pppppp" ? "The field should answer the mask \"" + strMask + "\".\r\n" : ""));	
}

//////////////////
// System form elements checker support functions
///////////////////
function fnCleanUpFormElementNames(objForm)
{
	if(objForm && objForm.elements)
	{
		var strElemName;
		var arrParams;
		for(var intCount = 0; intCount < objForm.elements.length; intCount++)
		{
			strElemName = objForm.elements[intCount].name;
			if(strElemName.indexOf(SYS_DELIMETER_HTMLCONTROLNAME) != -1)
			{
				arrParams = strElemName.split(SYS_DELIMETER_HTMLCONTROLNAME);
				if(arrParams.length == LOC_CONST_PARAMS_COUNT)
				{
					objForm.elements[intCount].name = arrParams[0];
				} // if arr params
			} // if delimeter
			// enable elements if any are disabled
			if(objForm.elements[intCount].disabled) objForm.elements[intCount].disabled = false;
		} // for
		return(true);
	} // if form
	return(false);
}

function fnEnableFormElements(objForm)
{
	if(objForm && objForm.elements)
	{
		for(var intCount = 0; intCount < objForm.elements.length; intCount++)
		{
			// enable elements if any are disabled
			if(objForm.elements[intCount].disabled) objForm.elements[intCount].disabled = false;
		}
		return(true);
	}
	return(false);
}

function fnProcessCheckboxes(objForm)
{
	if(objForm && objForm.elements && __arrCheckbox && __arrCheckbox.length)
	{
		for(var intCount = 0; intCount < __arrCheckbox.length; intCount++)
		{
			objForm.elements[__arrCheckbox[intCount]].value = "";
			objForm.elements[__arrCheckbox[intCount]].checked = true;
		}
		return(true);
	}
	return(true);
}

//////////////////////////////////
// Form Elements Object structure
//////////////////////////////////
function fnObjSet(strElemName, strType, strName, boolMandatory, intMaxLength, strMask)
{
	this.realname = strElemName;
	this.type = strType;
	this.name = strName;
	this.mandatory = string2Int(boolMandatory);
	this.maxlength = string2Int(intMaxLength);
	this.mask = strMask;
	this.collection = new Array();
}

function fnObjSetCollection(strValue, boolChecked, arrOptions, intIndex)
{
	this.index = intIndex;
	this.value = strValue;
	this.checked = boolChecked;
	this.options = arrOptions;
}

function fnAddObjSetElement(strElemName, strType, strName, boolMandatory, intMaxLength, strMask)
{
	__arrObjSet[__arrObjSet.length] = new fnObjSet(strElemName, strType, strName, boolMandatory, intMaxLength, strMask);
	return(__arrObjSet.length);
}

function fnAddObjSetElementCollection(intElemIndex, objElem, intFormIndex)
{
	if(__arrObjSet[intElemIndex].collection)
	{
		var intLength = __arrObjSet[intElemIndex].collection.length;
		var strType = objElem.type;
		var strValue;
		if(strType == "select" || strType == "select-one" || strType == "select-multiple")
		{
			if(objElem.selectedIndex > -1)
			{
				strValue = objElem.options[objElem.selectedIndex].value;
			}
			else
			{
				strValue = "";
			}
		}
		else
		{
			strValue = objElem.value;
		}
		__arrObjSet[intElemIndex].collection[intLength] = new fnObjSetCollection(strValue, objElem.checked, (objElem.options ? objElem.options : null), intFormIndex);
	}
}

function fnObjSetElemExists(strElemName)
{
	if(__arrObjSet)
	{
		for(var intCount = 0; intCount < __arrObjSet.length; intCount++)
		{
			if(__arrObjSet[intCount].name && __arrObjSet[intCount].name == strElemName)
			{
				return(intCount + 1);
			}
		}
	}
	return(false);
}

function fnNewObjSet(objForm)
{
	if(objForm && objForm.elements)
	{
		__arrObjSet = new Array(); // define the array
		var strDelimeter = SYS_DELIMETER_HTMLCONTROLNAME, strElemName;
		var arrParams;
		var intCount, intParams = LOC_CONST_PARAMS_COUNT;
		var objElem;
		for(intCount = 0; intCount < objForm.elements.length; intCount++)
		{
			objElem = objForm.elements[intCount];
			strElemName = objElem.name;
			if(strElemName.indexOf(strDelimeter) != -1)
			{
				arrParams = strElemName.split(strDelimeter);
				if(arrParams.length == intParams)
				{
					// check if such element exists
					var intElemIndex = fnObjSetElemExists(arrParams[0]);
					if(!intElemIndex)
					{
						// new element
						intElemIndex = fnAddObjSetElement(strElemName, objElem.type, arrParams[0], arrParams[1], arrParams[2], arrParams[3]);
					}
					intElemIndex--;
					fnAddObjSetElementCollection(intElemIndex, objElem, intCount);
				} // if params
			} //if delimeter
		} // for
		return(true);
	} // if
	return(false);
}

/////////////////////
// Support functions
////////////////////
function string2Int(strSomeValue)
{
	return (strSomeValue == null || isNaN(strSomeValue) || strSomeValue == "" ? 0 : parseInt(strSomeValue, 10));
}
