
/** 	
*		This function checks that entered data in oForm is valid
*		It checks data according to some parameters where the name of the element (input type) must contain 
*		some keywords such:
*			1. Integet or Numeric: name contains "ID", "NUM", "CODE", "QTY", "RATE", "_NO_"
*			2. Date: name contains "DATE", "BEGIN_DATE"
*			3. Time: name contains "TIME"
*		Also note that names must be Capital letter
*		@param index Index of form to be checked
*		@return boolean Form status. Return True if all data's correct 
*						other wise, it call function that mark errors & return False
*/

// \r	: New Line/Enter, \t	: Tab
	var CONTROL_NAME					= 0;
	var CONTROL_TYPE					= 1;
	var	CONTROL_ISNULL				= 2;
	var CONTROL_MSG						= 3;
	var CONTROL_WRONG_VALUE		= 4;
	var	CONTROL_COMPARE_TO		= 5;
	var CONTROL_COMPOUND			= 6;
	var	CONTROL_ERR_LABEL			= 7;

	// nErrMsgType values:
	var ERR_MSG_TYPE_1_BY_1		= 0;
	var ERR_MSG_TYPE_MARK_ERR	= 1;
	var ERR_MSG_TYPE_MSG_LIST = 2;

function validateData(oForm, aryForm, nErrMsgType)
{

	var iErrorCount = 0;		// Number of Errors
	var sErrorMsg = "";			// Error Msg for ERR_MSG_TYPE_MSG_LIST error type
	var aryError = new Array(oForm.length);		//	indeces of invalid fields are put in Array so they can be used by markError(errorAry) function
	var objControl;					// object for control/field
	var	aryControl;					// Array for Compound Controls such as Date
	var	iControlIndex = 0;	// Contains index of Control in Form
	var	iControlLength = 0;	// Contains number of elements in Control such as Radio Buttons
	var bValid = true;
	
	for (iIndex = 0; iIndex < aryForm.length; iIndex++)
	{
		bValid = true;
		//alert(objControl + "-" + objControl.name + "-" + aryForm[iIndex][CONTROL_NAME])
		if (aryForm[iIndex][CONTROL_NAME] == null || aryForm[iIndex][CONTROL_NAME] == 'undefined' || aryForm[iIndex][CONTROL_NAME] == '' || aryForm[iIndex][CONTROL_NAME] == 'null')
			break;
		
		if (aryForm[iIndex][CONTROL_TYPE] == "text")		/* --- Apply for text --- */
		{
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
				{
					if (isEmpty(objControl.value) || objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE])
						bValid = false;
				}	// Check on CONTROL_ISNULL
			}
		}else if (aryForm[iIndex][CONTROL_TYPE] == "email")		/* --- Apply for text --- */
		{
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
				{
					if (isEmpty(objControl.value) || (isEmail(objControl.value) == false))
						bValid = false;
				}	// Check on CONTROL_ISNULL
			}
		}else if (aryForm[iIndex][CONTROL_TYPE] == "url")		/* --- Apply for text --- */
		{
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
				{
					if (isEmpty(objControl.value) || (checkURL(objControl.value) == false))
						bValid = false;
				}	// Check on CONTROL_ISNULL
			}
		}else if (aryForm[iIndex][CONTROL_TYPE] == "number")		/* --- Apply for numeric text & select-one --- */
		{
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
				{
					
					if (isEmpty(objControl.value) || isNumber(objControl.value) == false || eval(objControl.value) < 0)
						bValid = false;
					else if (eval(objControl.value) == eval(aryForm[iIndex][CONTROL_WRONG_VALUE]))
						bValid = false;
				}	// Check on CONTROL_ISNULL
				if (bValid && (aryForm[iIndex][CONTROL_COMPARE_TO] != ""))		// Compare Value
				{
					
					for (dIndex = 0; dIndex < aryForm.length; dIndex++)
					{
						if (aryForm[dIndex][CONTROL_NAME] == aryForm[iIndex][CONTROL_COMPARE_TO])
						{
							iCompareIndex = dIndex;
							break;
						}
					}
					//alert(iCompareIndex + "-" + aryForm[iIndex][CONTROL_COMPARE_TO] + "-" + eval(objControl.value) + "-" + eval("oForm." + aryForm[iCompareIndex][CONTROL_NAME] + ".value"))
					if (eval(objControl.value) > eval("oForm." + aryForm[iCompareIndex][CONTROL_NAME] + ".value"))
						bValid = false;
					//alert(bValid + "-" + eval(objControl.value) + "-" + eval("oForm." + aryForm[iCompareIndex][CONTROL_NAME] + ".value"))
				}
			}
		}else if (aryForm[iIndex][CONTROL_TYPE] == "date")		/* --- Apply for date --- */
		{
			if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
			{
				if (aryForm[iIndex][CONTROL_COMPOUND] != "")
				{
					aryControl = aryForm[iIndex][CONTROL_COMPOUND].split(",")
					nDay		= eval("oForm." + aryForm[iIndex][CONTROL_NAME] + aryControl[0] + ".value");
					nMonth	= eval("oForm." + aryForm[iIndex][CONTROL_NAME] + aryControl[1] + ".value");
					nYear		= eval("oForm." + aryForm[iIndex][CONTROL_NAME] + aryControl[2] + ".value");
					if ( (nDay != "" || nMonth != "" || nYear != "") )
					{
						bValid = isDate(nDay,nMonth,nYear);
						if (bValid && (aryForm[iIndex][CONTROL_COMPARE_TO] != ""))		// Compare Value
						{
							var objStartDate	= new Date();
							var objEndDate		= new Date();
							objEndDate.setFullYear(nYear,nMonth-1,nDay);
							for (dIndex = 0; dIndex < aryForm.length; dIndex++)
							{
								if (aryForm[dIndex][CONTROL_NAME] == aryForm[iIndex][CONTROL_COMPARE_TO])
								{
									iCompareIndex = dIndex;
									break;
								}
							}
							//alert(aryForm[dIndex][CONTROL_NAME]);
							nDay		= eval("oForm." + aryForm[iCompareIndex][CONTROL_NAME] + aryControl[0] + ".value");
							nMonth	= eval("oForm." + aryForm[iCompareIndex][CONTROL_NAME] + aryControl[1] + ".value");
							nYear		= eval("oForm." + aryForm[iCompareIndex][CONTROL_NAME] + aryControl[2] + ".value");
							
							objStartDate.setFullYear(nYear,nMonth-1,nDay);
							if (getDateDiff(objStartDate,objEndDate,"D",true) < 0)
								bValid = false;
							//alert(objStartDate + "-" + objEndDate )
						}
					}else if (eval(aryForm[iIndex][CONTROL_ISNULL]) == false)
						bValid = false;
				}else{
					alert("No Compund Date: Else Case Not Covered");
					//objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
				}// Check Compund Control
				
			}	// Check on CONTROL_ISNULL
		}else if (aryForm[iIndex][CONTROL_TYPE] == "radio")		/* --- Apply for radio button --- */
		{
			iControlLength = 0;
			bValid = false;
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
				{
					for (iCount=0; iCount<oForm.length; iCount++)	//	Count no of elements that've same name as this one
					{
						if (oForm.elements[iCount].type == "radio" && oForm.elements[iCount].name == aryForm[iIndex][CONTROL_NAME])
						{
							if (iControlLength == 0)	iControlIndex = iCount;
							iControlLength++;
						}else if (eval(iControlLength) > 0)	break;
					}
					for(iCount=iControlIndex;  iCount < (iControlIndex + iControlLength) ; iCount++)
					{
						if (oForm.elements[iCount].checked)
						{
							bValid = true;
							break;
						}
					}
				}	// Check on CONTROL_ISNULL
			}
		}else if (aryForm[iIndex][CONTROL_TYPE] == "checkbox")		// Apply for check box
		{
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true))
				{
					if (objControl.checked == false)
						bValid = false;
				}	// Check on CONTROL_ISNULL
			}
		}else if (aryForm[iIndex][CONTROL_TYPE] == "hidden")		// Apply for hidden parameter
		{
			objControl = eval("oForm." + aryForm[iIndex][CONTROL_NAME]);
			if (objControl != null && objControl != 'undefined')
			{
				if (!(eval(aryForm[iIndex][CONTROL_ISNULL]) == true && objControl.value == aryForm[iIndex][CONTROL_WRONG_VALUE]))
				{
				}	// Check on CONTROL_ISNULL
			}
		}


		if (bValid == false)	// Add error to Error List if not valid
		{
			iErrorCount++;
			aryError[iIndex] = aryForm[iIndex][CONTROL_ERR_LABEL];
			sErrorMsg = sErrorMsg + aryForm[iIndex][CONTROL_MSG] + "\r";
			if (nErrMsgType == ERR_MSG_TYPE_1_BY_1)
			{
				alert(aryForm[iIndex][CONTROL_MSG])
				return false;
			}
		} // Add error to Error List if not valid

	} // End of Loop

	if (eval(iErrorCount) > 0)	bValid = false;
	
	
	// Way of Displaying Errors
	switch (nErrMsgType)
	{
		case ERR_MSG_TYPE_1_BY_1:
			break;
			
		case ERR_MSG_TYPE_MARK_ERR:
			markErrors(oForm, aryForm, aryError)
			break;
			
		case ERR_MSG_TYPE_MSG_LIST:
			if (bValid == false)	alert(sErrorMsg);
			break;
	}
		
	
	return bValid;
} // End of function



/** 	
*		This function mark invalid elements with different color
*		It requeires that every elemenet has lable that's closed in <DIV id=""></DIV> Tag
*		and DIV name has same name as the element & same case sensitive
*			ex:	<DIV id="USER_ID">	User Id	</DIV>	<INPUT type="text" name="USER_ID" value="">
*		@param index Index of form to be checked
*		@param errorAry Array that contain indexes of invalid elements
*/		
function markErrors(oForm, aryForm, aryError)
{
  //alert("within markErrors");
	var correctColor = "black";	
	var wrongColor = "red";
  var objDiv;
	var errorFlg = false;
	var formIndex;

	for (iIndex=0; iIndex < aryError.length; iIndex++)
	{
		objDiv = document.getElementById(aryForm[iIndex][CONTROL_ERR_LABEL]);
		if (objDiv == null || objDiv == 'undefined' || objDiv == '' || objDiv == 'null')
		{
			break;
		}else{
			objDiv.style.color = correctColor;
		}
	}
	for (iIndex=0; iIndex < aryError.length; iIndex++)
	{
		objDiv = document.getElementById(aryError[iIndex]);
		if (objDiv != null && objDiv != 'undefined' && objDiv != '' && objDiv != 'null')
		{
			objDiv.style.color = wrongColor;
			errorFlg = true;
		}
	}
	
	/*
	var errMsg = "من فضلك تصحيح الإخطاء المشاء إليها باللون الأحمر";
	if (errorFlg)
		alert(errMsg);
	*/

}		// End of function