/////////////////////////////////////////////////////////////////////////////
//  $Workfile: FormValidation.js $ $Revision: 1.4 $ $Author: britchie $ $Date: 2006/02/28 19:53:55 $
/////////////////////////////////////////////////////////////////////////////

var TYPE_STRING = "String";
var TYPE_INTEGER = "Integer";
var TYPE_FLOAT = "Float";
var TYPE_TIME = "Time";
var TYPE_DATE = "Date";
var TYPE_CURRENCY = "Currency";

var ATTR_TYPE_BASE 		 = 0;
var ATTR_TYPE_UNION 	 = 1;
var ATTR_TYPE_STRUCTURED = 2;
var ATTR_TYPE_BOOLEAN	 = 1;
var ATTR_TYPE_DATE		 = 2;
var ATTR_TYPE_DOUBLE	 = 3;
var ATTR_TYPE_FLOAT		 = 4;
var ATTR_TYPE_INTEGER	 = 5;
var ATTR_TYPE_LONG		 = 6;
var ATTR_TYPE_STRING	 = 7;
var ATTR_TYPE_STRUCTURE  = 9;
var ATTR_TYPE_UNION		 = 10


var FMT_DATE = "MM/DD/YYYY";
var FMT_DATE_W3C = "W3C-DTF";
var FMT_DATE_W3C_DEFAULT = "yyyy-mm-dd";
var FMT_TIME_STD = "hh:mm:ss";


var CHECK_CODE_OK = 0;
var CHECK_CODE_FALSE = 1;
var CHECK_CODE_EMPTY = 2;	// Required field is empty

var nCfc = CHECK_CODE_OK; // Check Field Code

var arrayRequiredErrors = new Array();
var sRequiredError = "";



///////////////////////////////////////////////////////////////////////////////////////////////
//	checkField()
//
//	PARAMETERS: sFieldType
//              bRequired
//							sValue
//	RETURNS: boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function checkField(sFieldType,bRequired,sName,sValue,sFormat,sStyle)
{
	var bValid = true;

	window.status="checkField("+sFieldType+","+bRequired+","+sName+","+sValue+","+sFormat+")";

	////////////////////////////////////////
	// discard if not required
	////////////////////////////////////////
	if(!bRequired)
	{
		nCfc=CHECK_CODE_OK;
		if(sValue == "")
		{
			return CHECK_CODE_OK;
		}
	}
	else
	{
		if((0==sValue.length) || (sValue == ""))
		{
			// arrayRequiredErrors(arrayRequiredErrors.length)=sName + " is required";
			sRequiredError = sName + " " +ERR_REQUIRED_EMPTY;
			nCfc=CHECK_CODE_EMPTY;
			//alert(sRequiredError);
			return CHECK_CODE_EMPTY;
		}
	}
	
	if(sStyle != null)
	// If the sStyle argument is passed in.
	{
		if(STYLE_LARGE_EDIT == sStyle) { 
		// For a large edit input box, if length is over 3000, alert and return error
			var lenVal = sValue.length;
			if(lenVal > 3000) {
				alert(ERR_OVER_SIZE_LIMIT + sName + ": " + lenVal);							
				return CHECK_CODE_FALSE;
			}
		}	
	
	}

	////////////////////////////////////////
	// Alert invalid formats
	////////////////////////////////////////
	if(ATTR_TYPE_DATE == sFieldType)
	{
		if(FMT_DATE_W3C == sFormat)
		{
			if(!isW3C_DTF(sValue))
			{
				alert(sName  +" "+ ERR_INVALID_DATE + FMT_DATE_W3C_DEFAULT);
				nCfc=CHECK_CODE_FALSE;
				return CHECK_CODE_FALSE;
			}
		}
		else if(isDateFormat(sValue))
		{
				alert(sName  +" "+ ERR_INVALID_DATE + FMT_DATE);
				nCfc=CHECK_CODE_FALSE;
				return CHECK_CODE_FALSE;
		}

	}
	else if(ATTR_TYPE_STRING == sFieldType)
	{
		if(FMT_TIME_STD == sFormat)
			if(!isTimeFormat(sValue))
			{
				alert(sName +" "+ ERR_INVALID_TIME + sFormat);
				nCfc=CHECK_CODE_FALSE;
				return CHECK_CODE_FALSE;
			}
	}
	else if(ATTR_TYPE_INTEGER == sFieldType)
	{
		if(!isInteger(sValue))
		{
			alert(sName +" "+ ERR_INVALID_TYPE_INTEGER + sFormat);
			nCfc=CHECK_CODE_FALSE;
			return CHECK_CODE_FALSE;
		}
	}
	else if(ATTR_TYPE_FLOAT == sFieldType)
	{
		if(!isFloat(sValue))
		{
			alert(sName +" "+ ERR_INVALID_TYPE_FLOAT + sFormat);
			nCfc=CHECK_CODE_FALSE;
			return CHECK_CODE_FALSE;
		}
	}
	else if(ATTR_TYPE_LONG == sFieldType)
	{
		if(!isLong(sValue))
		{
			alert(sName +" "+ ERR_INVALID_TYPE_LONG + sFormat);
			nCfc=CHECK_CODE_FALSE;
			return CHECK_CODE_FALSE;
		}
	}
	else if(ATTR_TYPE_DOUBLE == sFieldType)
	{
		if(!isDouble(sValue))
		{
			alert(sName +" "+ ERR_INVALID_TYPE_DOUBLE + sFormat);
			nCfc=CHECK_CODE_FALSE;
			return CHECK_CODE_FALSE;
		}
	}
    else if(ATTR_TYPE_BOOLEAN == sFieldType)
    {
        if(!isBoolean(sValue))
        {
            alert(sName +" "+ ERR_INVALID_TYPE_BOOLEAN + sFormat);
            nCfc=CHECK_CODE_FALSE;
            return CHECK_CODE_FALSE;
        }
    }
	else
	{
	  alert(sFieldType + " validation not supported");
	  return CHECK_CODE_FALSE;
	}

return CHECK_CODE_OK;

}

///////////////////////////////////////////////////////////////////////////////////////////////
//	validateForm()
//
//  DESCRIPTION: Iterates through form elements and
//
//	PARAMETERS: Form formToSubmit
//
//	RETURNS: boolean
//
//  NOTE: Netscape insists on numbers as case labels instead of vars.
//////////////////////////////////////////////////////////////////////////////////////////////
function validateForm(formToSubmit)
{
	nCfc = 0;
	var nElts = formToSubmit.length;
	//alert("Validating " + formToSubmit.name);
	var bSubmit = true;

	for(var i=0;i<nElts;i++)
	{
		if(BROWSER_IE4)
			formToSubmit.elements[i].change();
		else if(BROWSER_NS4)
		{
			formToSubmit.elements[i].focus();
			formToSubmit.elements[i].change();
		}
		switch (nCfc)
		{
			case 1:
				alert(formToSubmit.name + " returned FALSE at elt " + i);
				bSubmit=false;
				break;
			case 2:
				//alert(formToSubmit.name + " returned EMPTY at elt " + i + " blur="+formToSubmit.elements[i].blur);
				alert(sRequiredError);
				bSubmit=false;
				break;
			case 0:
				//alert(formToSubmit.name + " returned OK at elt " + i);
				bSubmit=true;
				break;
			default:
				bSubmit=true;
		}

		if(false==bSubmit)
			break
	}
	bSubmit=false;
	return bSubmit;
}

///////////////////////////////////////////////////////////////////////////////////////////////
//	validateRegistrationForm()
//
//  DESCRIPTION: Iterates through form elements and
//
//	PARAMETERS: Form formToSubmit
//
//	RETURNS: boolean
//
//  NOTE: Netscape insists on numbers as case labels instead of vars.
//////////////////////////////////////////////////////////////////////////////////////////////
function validateRegistrationForm(formToSubmit)
{
	nCfc = 0;
	var nElts = formToSubmit.length;
	var eltThis;
	//alert("Validating " + formToSubmit.name);
	var bSubmit = true;

	for(var i=0;i<nElts;i++)
	{
		eltThis = formToSubmit.elements[i];
		sThisName = eltThis.name.toUpperCase();
		sEltValue = "";
		if (eltThis.type == "select-one")
			sEltValue = eltThis.options[eltThis.selectedIndex].value;
		else
			sEltValue = eltThis.value;
		if(sEltValue.length==0 && sThisName != "MIDDLENAME")
		{
			alertMsg = "You must enter a";
			if (sThisName[0] == 'A' || sThisName[0] == 'E' ||
				sThisName[0] == 'I' || sThisName[0] == 'O' ||
				sThisName[0] == 'U')
				alertMsg += "n";
			alertMsg += " " + sThisName;
			alert(alertMsg);
			bSubmit=false;
			return bSubmit;
		}
	}

	return bSubmit;
}


///////////////////////////////////////////////////////////////////////////////////////////////
//	isInputTooLong()
//
//	PARAMETERS: numSize
//							strData
//	RETURNS: boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isInputTooLong(numSize, strData)
{
	if(strData.length > numSize)
		return true;
  else
  	return false;

}

///////////////////////////////////////////////////////////////////////////////////////////////
//	isIntegerInRange(numData, numUpperBound,numLowerBound)
//
//	DESCRIPTION: Range checks integer field
//
//	PARAMETERS:  numData,
//							 numLowerBound
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isIntegerInRange(numData,numLowerBound,numUpperBound)
{
	//alert("checking " + numData + " for " + numLowerBound + "," +numUpperBound);
	if(!isNaN(numData))
  {
		numData = parseInt(numData,10);
		if((numData > numUpperBound) || (numData < numLowerBound))
    {
			return false;
    }
		else
			return true;
  }
  else
  	return false;
}

///////////////////////////////////////////////////////////////////////////////////////////////
//	isInteger(numData)
//
//	DESCRIPTION: Range checks integer field
//
//	PARAMETERS:  numData,
//							 numLowerBound
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isInteger(numData,numLowerBound,numUpperBound)
{
	return isIntegerInRange(numData,-2147483648,2147483647);
}

///////////////////////////////////////////////////////////////////////////////////////////////
//	isLong(numData)
//
//	DESCRIPTION: Range checks long field
//
//	PARAMETERS:  numData,
//							 numLowerBound
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isLong(numData)
{
	if(isNaN(numData))
		return false;

	var JAVA_MAX = new Number(9223372036854775807);
	var JAVA_MIN = new Number(-9223372036854775808);
	var numTest = new Number(numData);
	if((numTest <= JAVA_MAX) && (numTest >= JAVA_MIN))
		return true;
	else
		return false;

}

///////////////////////////////////////////////////////////////////////////////////////////////
//	isDouble(numData)
//
//	DESCRIPTION: Range checks Double field
//
//	PARAMETERS:  numData,
//							 numLowerBound
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isDouble(numData)
{
	if(isNaN(numData))
		return false;

	var numTest = new Number(numData);
	if((numTest <= Number.MAX_VALUE) && (numTest >= Number.MIN_VALUE))
		return true;
	else
		return false;

}

///////////////////////////////////////////////////////////////////////////////////////////////
//  isBoolean(data)
//
//  DESCRIPTION: checks if it is a boolean
//
//  PARAMETERS:  data,
//                           
//  RETURNS:         boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isBoolean(data)
{
    if((data == "true") || (data == "false"))
        return true;
    else
        return false;

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isFloat()
//
//	DESCRIPTION: CParses input for float type
//
//	PARAMETERS:  fltCandidate
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isFloat(fltCandidate)
{
	///////////////////////////////////////
	//	Strip spaces
	///////////////////////////////////////
	fltCandidate = LTrim(RTrim(fltCandidate));

	if(!isNaN(fltCandidate))
 		fltCandidate = parseFloat(fltCandidate,10);
		if(!isNaN(fltCandidate))
	  	return true;
  else
  {
  	return false;
  }

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isCurrency()
//
//	DESCRIPTION: Parses input for Currency data
//
//	PARAMETERS:  varMoney
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isCurrency(varMoney)
{
	var strPre;
  var strPost;
  var intDollarIdx;
  var fltMoney

	///////////////////////////////////////
	//	Strip spaces
	///////////////////////////////////////
	varMoney = LTrim(RTrim(varMoney));

	///////////////////////////////////////
	//	Strip $
	///////////////////////////////////////
  intDollarIdx = varMoney.indexOf("$")
	if(intDollarIdx == 0)
  {
  	strPre = varMoney.substring(0,intDollarIdx);
    strPost = varMoney.substring(intDollarIdx+1,varMoney.length);
		varMoney = strPre + strPost;
	}

	if(isFloat(varMoney))
  	return true
  else
  	return false
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isDateFormat()
//
//	DESCRIPTION: strData is in 'MM/DD/YYYY' format
//
//	PARAMETERS:  strDate
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isDateFormat(sDate)
{
	var REX_YYYY_MM_DD = /^(\d\d)\/(\d\d)\/\d\d\d\d$/;
	if(!REX_YYYY_MM_DD.test(sDate))
		return false;

	if(!isMonth(RegExp.$1,true))
		return false;

	if(!isDay(RegExp.$2))
		return false;

	return true;
}


//////////////////////////////////////////////////////////////////////////////////////////////
//	isTimeFormat()
//
//	DESCRIPTION: checks if strData is in 'HH:MM:SS' format
//
//	PARAMETERS:  strDate
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isTimeFormat(strTime)
{
	var strHH = "";
	var strMM = "";
	var strSS = "";
	var numColonIdx = 0;
	var numLastColonIdx = 0;

	///////////////////////////////////////
	// Check for colon
	///////////////////////////////////////
	numColonIdx = strTime.indexOf(":");
	numLastColonIdx = strTime.indexOf(":",numColonIdx+1);
	if((-1 == numColonIdx) || (-1 == numLastColonIdx))
	{
		return false;
	}

	///////////////////////////////////////
	// Check range of Hours
	///////////////////////////////////////
	strHH = strTime.substring(0,numColonIdx);
	if((!isIntegerInRange(strHH,0,24)) || (strHH.length != 2))
	{
		return false;
	}

	///////////////////////////////////////
	// Check range of Days
	///////////////////////////////////////
	strMM = strTime.substring(numColonIdx+1,numLastColonIdx);
	if((!isIntegerInRange(strMM,0,59)) || (strMM.length != 2))
	{
		return false;
	}

	///////////////////////////////////////
	// Check range of Years
	///////////////////////////////////////
	strSS = strTime.substring(numLastColonIdx+1,strTime.length);
	if((!isIntegerInRange(strSS,0,59)) || (strSS.length != 2))
	{
		return false;
	}

	return true;

}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isYYYYDateFormat()
//
//	DESCRIPTION: strData is in 'YYYY'
//
//	PARAMETERS:  strDate
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isYYYYDateFormat(strDate)
{
	///////////////////////////////////////
	// Check range of Years
	///////////////////////////////////////
	if(strDate.length != 4)
	{
		return false;
	}
  else
  {
   	if(!isIntegerInRange(strDate,1,10000)	)
    {
			return false;
    }
  }

	return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isMonth()
//
//	DESCRIPTION: strData is in 'MM'
//	PARAMETERS:  strDate
//  						 bRequires2 - Month is a 2 digit field
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isMonth(sDate,bRequires2)
{
	if(bRequires2)
		if(sDate.length != 2)
			return false;

	if(!isIntegerInRange(sDate,1,12))
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isDay()
//
//	DESCRIPTION: strData is in 'DD'
//	PARAMETERS:  strDate
//  						 bRequires2 - Month is a 2 digit field
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isDay(sDate,bRequires2)
{
	if(bRequires2)
		if(sDate.length != 2)
			return false;

	if(!isIntegerInRange(sDate,1,31))
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isHour()
//
//	DESCRIPTION: strData is in 'MM'
//
//	PARAMETERS:  strDate
//  						 bRequires2 - Month is a 2 digit field
//  						 bIs24 - 24 Hour clock
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isHour(sDate,bRequires2,bIs24)
{
	if(bRequires2)
		if(sDate.length != 2)
			return false;
	if(bIs24)
	{
		if(!isIntegerInRange(sDate,0,23))
			return false;
	}
	else
	{
		if(!isIntegerInRange(sDate,0,12))
			return false;
	}

	return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	isMinute()
//
//	DESCRIPTION: sDate is in 'MM'
//
//	PARAMETERS:  strDate
//  						 bRequires2 - Month is a 2 digit field
//
//	RETURNS:		 boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isMinute(sDate,bRequires2)
{
	if(bRequires2)
		if(sDate.length != 2)
			return false;
	if(!isIntegerInRange(sDate,0,59))
			return false;

	return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//  isSecond()
//
//  DESCRIPTION: sDate is in 'SS'
//
//  PARAMETERS:  strDate
//                           bRequires2 - Second is a 2 digit field
//
//  RETURNS:         boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isSecond(sDate,bRequires2)
{
    return isMinute(sDate,bRequires2);
}

//////////////////////////////////////////////////////////////////////////////////////////////
//  isFrame()
//
//  DESCRIPTION: strData is in 'FF'
//  PARAMETERS:  strDate
//                           bRequires2 - Frame is a 2 digit field
//  RETURNS:         boolean
//
//////////////////////////////////////////////////////////////////////////////////////////////
function isFrame(sDate,bRequires2)
{
    if(bRequires2)
        if(sDate.length != 2)
            return false;

    if(!isIntegerInRange(sDate,0,30))
        return false;

    return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//
//	RTrim()
//
// Implementation of VB's LTrim()  -This function strips Trailing spaces from a string
//
//////////////////////////////////////////////////////////////////////////////////////////////
function RTrim(strSrc)
{
  var i;
	var str;

	strTemp = strSrc;

	for ( i = strTemp.length - 1; i >= 0; i-- )
  {
		if ( strTemp.charAt(i) == " ")
    {
			strTemp = strTemp.substring (0, i );
	  }
    else
			break;
	}
	return strTemp;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//
//	LTrim()
//
// Implementation of VB's LTrim()  -This function strips leading spaces from a string
//
//////////////////////////////////////////////////////////////////////////////////////////////
function LTrim(strSrc)
{
	var i;
	var strTemp;

	strTemp = strSrc;
	for ( i = 0; i < strTemp.length ; i++ )
  {
	  if ( strTemp.charAt(i) == " ")
    {
			strTemp = strTemp.substring (i + 1, strTemp.length );
	  }
	  else
			break;
	}
	return strTemp;
}

