/*
Function to display the client side errors by opening the error page.
*/
function showErrorPage()
{
	window.open("/emms/common/error.jsp", "errorpage", "scrollbars=yes,resizable=yes,height=450,top=20,left=20") ;
}

/*
This function validates if the data has been entered in all the mandatory fields
of the Form passed as Parameter.
Mandatory fields will have the naming convention as "txt_R<datatype>_FieldName".
Optional fields will have the naming convention as "txt_O<datatype>_FieldName".
It will populate the arrErrors array with the list of all the mandatory fields 
for which data has not been entered. It will be a multi-dimensional array.
Values will be stored as follows:
Column 0 -> Descriptive field name. Picked up from the attribute "descName"
Column 1 -> Error Code
Column 2 -> Error description. 
			Picked up from the global variable in the respective JSP defined as the error code.
*/
function checkMandatoryFields(frmReference, arrErrors)
{
	var iCounter, iArrPos ;
	for (iCounter = 0; iCounter < frmReference.length; iCounter++)
	{
		var fldName, iPosition;
		// Mandatory check needs to be performed only for Text / Select fields
		if (frmReference(iCounter).type.search("text") < 0)
		{
			if (frmReference(iCounter).type.search("select") < 0)
			{
				continue ;
			}
		}
		/* Extract the name of the field and verify that if the field is
			mandatory field.
		*/
		fldName = frmReference(iCounter).name ;
		iPosition = fldName.indexOf("_") ;
		if (iPosition >= 0)
		{
			// If the field is mandatory, check if the value has been specified
			if (fldName.charAt(iPosition + 1).toUpperCase() == "R")
			{
				// Validate only for non-disabled fields
				if (frmReference(iCounter).disabled == false)
				{
					if (trimString(frmReference(iCounter).value) == "")
					{
						iArrPos = arrErrors.length;
						arrErrors[iArrPos] = new Array(3);
						// Error field descriptive name
						arrErrors[iArrPos][0] = frmReference(iCounter).getAttribute("descName");
						// Error code
						arrErrors[iArrPos][1] = "EMMS001E";
						// Error description
						arrErrors[iArrPos][2] = EMMS001E;
					}
				}
			}
		}
	}
	return arrErrors;
}


/*
This function validates the data format depending on the data type.
Data type will be identified based on the field naming convention.
Field Naming Convention: <ElementType>_<Required/Optional><Data Type>_<FieldName>
Example:
txt_RN_NumericField, txt_OS_StringField, txt_RI_IntegerField, txt_OD_DateField

It will populate the arrErrors array with the list of all the fields 
for which data validation failed. It will be a multi-dimensional array.
Values will be stored as follows:
Column 0 -> Descriptive field name. Picked up from the attribute "descName"
Column 1 -> Error Code
Column 2 -> Error description. 
			Picked up from the global variable in the respective JSP defined as the error code.
*/
function validateDataFormat(frmReference, sDateFormat, arrErrors)
{
	var iCounter, iArrPos, iReturnValue;
	var fldName, iPosition, fldType;
	
	// Call function to convert the data to upper case.
	convertDataToUpperCase(frmReference);
	
	for (iCounter = 0; iCounter < frmReference.length; iCounter++)
	{
		// Validation needs to be performed only for Text / Combo fields
		if (frmReference(iCounter).type.search("text") < 0)
		{
			if (frmReference(iCounter).type.search("select") < 0)
			{
				continue ;
			}
		}
		/* Extract the name of the field and verify that if invalid date is
			entered.
		*/
		fldName = frmReference(iCounter).name ;
		iPosition = fldName.indexOf("_") ;
		if (iPosition >= 0)
		{
			// Call the Validate method based on the data type.
			fldType = fldName.charAt(iPosition + 2).toUpperCase() ;
			if (trimString(frmReference(iCounter).value).length > 0)
			{
				iReturnValue = validateValues(frmReference(iCounter), fldType, sDateFormat);
				if (iReturnValue != 0)
				{
					iArrPos = arrErrors.length;
					arrErrors[iArrPos] = new Array(3);
					// Error field descriptive name
					arrErrors[iArrPos][0] = frmReference(iCounter).getAttribute("descName");

					// Populate the error array with the error details based on the data type
					switch (fldType)
					{
						case "S":
							// Error code for String field
							arrErrors[iArrPos][1] = "EMMS021E";
							// Error description
							arrErrors[iArrPos][2] = EMMS021E;
							break ;
						case "N":
							// Error code for Numeric
							if (iReturnValue == -1)
							{
								arrErrors[iArrPos][1] = "EMMS022E";
								// Error description
								arrErrors[iArrPos][2] = EMMS022E;
							}
							else if (iReturnValue == -2)
							{     							
								
								// Error description
								if(frmReference(iCounter).getAttribute("numericScale")=="4.2")
								{
								arrErrors[iArrPos][1] = "EMMS025E";
								arrErrors[iArrPos][2] = EMMS025E ;
								}
								else if(frmReference(iCounter).getAttribute("numericScale")=="12.2")
								{
								arrErrors[iArrPos][1] = "EMMS024E";
								arrErrors[iArrPos][2] = EMMS024E ;
								}else
								{
								arrErrors[iArrPos][1] = "EMMS025E";
								arrErrors[iArrPos][2] = EMMS025E ;
								}
							}
							else
							{
								arrErrors[iArrPos][1] = "EMMS026E";
								// Error description
								arrErrors[iArrPos][2] = EMMS026E;
							}
							break ;
							
						case "I":
							// Error code for Integer
							if (iReturnValue == -1)
							{
								arrErrors[iArrPos][1] = "EMMS023E";
								// Error description
								arrErrors[iArrPos][2] = EMMS023E;
							}
							else
							{
								arrErrors[iArrPos][1] = "EMMS026E";
								// Error description
								arrErrors[iArrPos][2] = EMMS026E;
							}
							break ;
							
						case "T":
							// Error code for Time field
							arrErrors[iArrPos][1] = "EMMS024E";
							// Error description
							arrErrors[iArrPos][2] = EMMS024E;
							break ;
						
						case "D":
							switch (sDateFormat)
							{
								
								case "B":
									// Error code
									arrErrors[iArrPos][1] = "EMMS027E";
									// Error description
									arrErrors[iArrPos][2] = EMMS027E;
								break ;
								case "C":
									// Error code
									arrErrors[iArrPos][1] = "EMMS027E";
									// Error description
									arrErrors[iArrPos][2] = EMMS027E;
								break ;			
							}
					}
				}
			}
		}
	}
	return arrErrors;
}

/*
This Function validates whether the passed value is a Numeric / Integer.
*/
function validateValues(oCtl, sTypeToCheck, sDateFormat)
{
	var sValue, sScale, sFrac, iLenAfterDec, iLenBeforeDec ;
	
	sValue = trimString(oCtl.value);
	
	switch (sTypeToCheck)
	{
		case "S":	//	Check for " in strings
			if (sValue.indexOf('"') != -1)
				return -1 ;
			else
				return 0 ;
		
		case "N":	// Numeric value
			if (isNaN(sValue))
				return -1 ;
			else
			{
				// Check for more then two decimals
				if (sValue.indexOf('.') >= 0)	//' we have a decimal
				{
					sFrac = sValue.substring(sValue.indexOf('.') + 1) ;
					if (sFrac.indexOf('.') >= 0)
						return -1 ;
				}

				// Check if value entered is Numerical value
				if (sValue.indexOf('.') >= 0)	//' we have a decimal
				{
					sFrac = sValue.substring(0, sValue.indexOf('.')) ;
					if (isNaN(sFrac) || (parseInt(sFrac) > 0 && parseInt(sFrac, 10) == 0))
						return -1;

					sFrac = sValue.substring(sValue.indexOf('.') + 1) ;
					if (isNaN(sFrac) || (parseInt(sFrac) > 0 && parseInt(sFrac, 10) == 0))
						return -1;
				}
				else
				{
					// Not a decmial value
					if (isNaN(sValue) || (parseInt(sValue) > 0 && parseInt(sValue, 10) == 0))
						return -1;
				}
				
				// Error if -ve value
				if (parseFloat(sValue) < 0)
				{
					return -3;
				}
				
				// Validate if the value is as per the scale specified for the field
				sScale = oCtl.getAttribute("numericScale");
				
				if (sScale.indexOf('.') >= 0)
				{
					iLenBeforeDec = parseInt(sScale.substring(0, sScale.indexOf('.'))) ;
					iLenAfterDec = parseInt(sScale.substring(sScale.indexOf('.') + 1)) ;
					
					if (sValue.indexOf('.') >= 0)	// we have a decimal
					{
						if (sValue.substring(sValue.indexOf('.') + 1).length > iLenAfterDec)
							return -2;
						
						if (sValue.substring(0, sValue.indexOf('.')).length > (iLenBeforeDec - iLenAfterDec))
							return -2;
					}
					else
					{
						if (sValue.length > (iLenBeforeDec - iLenAfterDec))
							return -2;
					}
				}
				
				return 0 ;
			}

		case "I":	// Integer
			if (isNaN(sValue) || (parseInt(sValue) > 0 && parseInt(sValue, 10) == 0))
				return -1;

			// Check for any ".".
			if (sValue.indexOf(".") >= 0)
				return -1 ;
			
			if (parseInt(sValue) < 0)
				return -2;
			else
				return 0 ;
		
		case "D": // Date
			// This is to be coded.
			switch (sDateFormat)
			{
				case "A":
					if (checkAsianFormat(sValue))
						return 0 ;
					else
						return -1 ;
				case "U":
					if (checkAmericanFormat(sValue))
						return 0 ;
					else
						return -1 ;
				case "E":
					if (checkEuropeanFormat(sValue))
						return 0 ;
					else
						return -1 ;
			
				case "B":
					if (checkDateFormat(sValue))
						return 0 ;
					else
						return -1 ;
		      		 case "C":
					if (checkCDateFormat(sValue))
						return 0 ;
					else
						return -1 ;
			
						
			}
		
		case "T": // Time field (HH:MM format)
			if (sValue.length != 5)
				return -1;

			var sHours, sMin;
			
			// Check for ":" at position 3
			if (sValue.indexOf(":") != 2)
				return -1;
			
			sHours = sValue.substring(0, 2) ;
			sMin = sValue.substring(3) ;
			
			// Validate sHours is Integer value and is less than 24
			if (isNaN(sHours))
				return -1 ;
			// Check for any ".".
			if (sHours.indexOf(".") >= 0)
				return -1 ;
			if ((parseInt(sHours) > 23) || (parseInt(sHours) < 0))
				return -1 ;
			
			// Validate sMin is Integer value and is less than 59
			if (isNaN(sMin))
				return -1 ;
			// Check for any ".".
			if (sMin.indexOf(".") >= 0)
				return -1 ;
			if ((parseInt(sMin) > 59) || (parseInt(sMin) < 0))
				return -1 ;
				
			return 0;
			
	}
}



// Implementation of TRIM function available in VBScript
function trimString(str)
{
	while (true)
	{
		// Remove the spaces from the end of the string
		//	String starts with 0 to length - 1
		if (str.charAt(str.length - 1) == " ")
		{
			if (str.length > 1)
			{
				str = str.substring(0, str.length - 1) ;
				continue ;
			}
			else
			{
				str = "" ;
				return str ;
			}
		}
		// Remove the Spaces at the Start of the string.
		if (str.charAt(0) == " ")
		{
			if (str.length > 1)
			{
				str = str.substring(1, str.length) ;
				continue ;
			}
			else
			{
				str = "" ;
				return str ;
			}
		}
		// Return the string with the spaces removed.
		return str ;
	}
	return str;
}


// Validate Asian date format
function checkAsianFormat(sDate)
{	//  DD/MM/YYYY
	var sDay = "", sMonth = "", sYear = "" ;
	var sSeparator = "/" ;
	var sIsADate, sRemainingPart ;
	
	sIsADate = sDate + sSeparator + "-1" + sSeparator + "-1" + sSeparator + "-1" ;
	sDay = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sMonth = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sYear = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;

	return isValidDatePart(sMonth, sYear, sDay) ;
}

// Validate American date format
function checkAmericanFormat(sDate)
{	//  MM/DD/YYYY
	var sDay = "", sMonth = "", sYear = "" ;
	var sSeparator = "/" ;
	var sIsADate, sRemainingPart ;
	
	sIsADate = sDate + sSeparator + "-1" + sSeparator + "-1" + sSeparator + "-1" ;
	sMonth = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sDay = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sYear = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;

	return isValidDatePart(sMonth, sYear, sDay) ;
}

// Validate  date format
function checkDateFormat(sDate)
{	//  MM/DD/YY
	var sDay = "", sMonth = "", sYear = "", sYear1 = 0 ;
	var sSeparator = "/" ;
	var sIsADate, sRemainingPart ;
	
	if(sDate.length > 8)
	{
	return false;
	}
	
	sIsADate = sDate + sSeparator + "-1" + sSeparator + "-1" + sSeparator + "-1" ;
	sMonth = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	
	
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	
	sDay = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	
	
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sYear = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	
	if(sYear >= 0 && sYear <=49 ) {
		    sYear1 = parseInt(sYear, 10) + 2000;
	    }

	    else if(sYear >= 50 && sYear <=99 ) {
		sYear1 = parseInt(sYear, 10) + 1900;
    	}  else
    	{ return false;
    	}
    	sYear = sYear1.toString();
    	return isValidDatePart(sMonth, sYear, sDay) ;
}
// Validate  date format
function checkCDateFormat(sDate)
{	//  MMDDYY
	var sDay = "", sMonth = "", sYear = "", sYear1 = 0 ;
	var sSeparator = "" ;
	var sIsADate, sRemainingPart ;
	
	sMonth = sDate.substring(0, 2) ;
		
	sDay = sDate.substring(2, 4) ;
		
	sYear = sDate.substring(4, 6) ;
	
	if (isNaN(sYear))
	return false;
	
	if(sYear >= 0 && sYear <=49 ) {
		    sYear1 = parseInt(sYear, 10) + 2000;
	    }

	    else if(sYear >= 50 && sYear <=99 ) {
		sYear1 = parseInt(sYear, 10) + 1900;
    	}   else
    	{ return false;
    	}
    	sYear = sYear1.toString();
    	return isValidDatePart(sMonth, sYear, sDay) ;
}

function changeDateFormat(sDate)
{	//  MM-YY-DD to YYYY-MM-DD
	var sSeparator = "/" ;
	var sIsADate, sRemainingPart ;

	sIsADate = sDate + sSeparator + "-1" + sSeparator + "-1" + sSeparator + "-1" ;
	sMonth = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	


	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	
	sDay = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sYear = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	
	if (isNaN(sYear))
	return false;
	
	if(sYear >= 0 && sYear <=49 ) {
		    sYear1 = parseInt(sYear, 10) + 2000;
	    }

	    else if(sYear >= 50 && sYear <=99 ) {
		sYear1 = parseInt(sYear, 10) + 1900;
    	} 
    	sYear = sYear1.toString();
	return  sYear+'-'+ sMonth +'-'+ sDay ;
}
function changeCDateFormat(sDate)
{	//  MMDDYY to YYYY-MM-DD
	var sDay = "", sMonth = "", sYear = "", sYear1 = 0 ;
	var sSeparator = "" ;
	var sIsADate, sRemainingPart ;

	sMonth = sDate.substring(0, 2) ;

	sDay = sDate.substring(2, 4) ;

	sYear = sDate.substring(4, 6) ;

	if (isNaN(sYear))
	return false;

	if(sYear >= 0 && sYear <=49 ) {
		    sYear1 = parseInt(sYear, 10) + 2000;
	    }

	    else if(sYear >= 50 && sYear <=99 ) {
		sYear1 = parseInt(sYear, 10) + 1900;
	}  
	sYear = sYear1.toString();
		
	return  sYear+'-'+ sMonth +'-'+ sDay ;
}



// Validate Europoan date format
function checkEuropeanFormat(sDate)
{	//  DD/MMM/YYYY
	var sDay = "", sMonth = "", sYear = "" ;
	var sSeparator = "-" ;
	var sIsADate, sRemainingPart ;
	var noMonth = -1 ;
	
	sIsADate = sDate + sSeparator + "-1" + sSeparator + "-1" + sSeparator + "-1" ;
	sDay = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sMonth = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;
	sRemainingPart = sIsADate.substring(sIsADate.indexOf(sSeparator) + 1) ;

	sIsADate = sRemainingPart ;
	sYear = sIsADate.substring(0, sIsADate.indexOf(sSeparator)) ;

	//Convert the descriptive month into correcponding Integer value
	var str = new Array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
	for (var i = 0; i <= 11 ; i++)
	{
		if (sMonth.toLowerCase() == str[i])
		{
			noMonth = i + 1;
			break ;
		}
	}
	// if the description doesn't match, return false
	if (noMonth < 0)
		return false ;

	return isValidDatePart(noMonth, sYear, sDay) ;
}


function isValidDatePart(noMonth, noYear, noDay)
{
	if (noDay.length > 2)
		return false;
		
	if (isNaN(noDay) || (parseInt(noDay) > 0 && parseInt(noDay, 10) == 0))
		return false;
		
	if (noDay < 1 || noDay > 31)
		return false ;

	if (noMonth.length > 2)
		return false;

	if (isNaN(noMonth) || (parseInt(noMonth) > 0 && parseInt(noMonth, 10) == 0))
		return false;

	if (noMonth < 1 || noMonth > 12)
		return false ;
	
	if (noYear.length != 4)
		return false;
		
	if (isNaN(noYear) || (parseInt(noYear) > 0 && parseInt(noYear, 10) == 0))
		return false;

	if ((noYear < 1900) || (noYear < 0))
		return false ;

	if ((noMonth==4) || (noMonth==6) || (noMonth==9) || (noMonth==11))
	{
		if(noDay > 30)
		{
			return false;
		} //end if no of days in a month check
		
	} //end if no of month check
	
	if(noMonth == 2)
	{	// perform leap year check
		if (!isValidFeb(noYear,noDay))
		{
			return false;
		} //end if
	} //end if Feb is the month

	return true;
}


// validate leap year date
function isValidFeb(noYear , noDay)
{
	var rem ;
    
    rem = noYear % 4 ;
    if ((rem > 0) && (noDay > 28))
	{
		return false;
	} //end 28 days check
    
	if ((rem == 0) && (noDay > 29))
    {
		return false;
    } //end 29 days check
	
	return true;
} //end isValidFeb



// Validate empty mandatory combo on screen load
function validateEmptyCombo(frmReference)
{
	var iCounter, iArrPos ;
	for (iCounter = 0; iCounter < frmReference.length; iCounter++)
	{
		var fldName, iPosition;
		// Check if the field is a combo field
		if (frmReference(iCounter).type.search("select") < 0)
		{
			continue ;
		}

		/* Extract the name of the combo and verify that if it is
			mandatory.
		*/
		fldName = frmReference(iCounter).name ;
		iPosition = fldName.indexOf("_") ;
		if (iPosition >= 0)
		{
			// If the combo is mandatory, check if there is any option loaded
			if (fldName.charAt(iPosition + 1).toUpperCase() == "R")
			{
				if (frmReference(iCounter).length <= 0)
				{
					// display information message
					alert("EMMS002I:\n" + EMMS002I);
				}
			}
		}
	}
}


// Convert data for all the String fields to upper case 
// before submitting the page. This is required since all data in m/f is stored in
// upper case.
function convertDataToUpperCase(frmReference)
{
	var iCounter;
	for (iCounter = 0; iCounter < frmReference.length; iCounter++)
	{
		// Ignore the <SELECT> Tag fields.
		if (frmReference(iCounter).type.search("text") < 0)
		{
			continue ;
		}
		// Convert the data to Upper Case.
		frmReference(iCounter).value = (frmReference(iCounter).value).toUpperCase();
	}
}


// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// 
// This function uses the same format strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// 
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "m/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------
function getDateFromFormat(val,format) {
	val = val+"";
	format = format+"";
	var i_val = 0;
	var i_format = 0;
	var c = "";
	var token = "";
	var token2= "";
	var x,y;
	var now   = new Date();
	var year  = now.getYear();
	var month = now.getMonth()+1;
	var date  = now.getDate();
	var hh    = now.getHours();
	var mm    = now.getMinutes();
	var ss    = now.getSeconds();
	var ampm  = "";

	var MONTH_NAMES = Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");

	
	while (i_format < format.length) {
		// Get next token from format string
		c = format.charAt(i_format);
		token = "";
		while ((format.charAt(i_format) == c) && (i_format < format.length)) {
			token += format.charAt(i_format);
			i_format++;
			}
		// Extract contents of value based on format token
		if (token=="YYYY" || token=="YY" || token=="Y") {
			if (token=="YYYY") { x=4;y=4; }// 4-digit year
			if (token=="YY")   { x=2;y=2; }// 2-digit year
			if (token=="Y")    { x=2;y=4; }// 2-or-4-digit year
			year = _getInt(val,i_val,x,y);
			if (year == null) { return 0; }
			i_val += year.length;
			if (year.length == 2) {
				if (year > 70) {
					year = 1900+(year-0);
					}
				else {
					year = 2000+(year-0);
					}
				}
			}
		else if (token=="MMM"){// Month name
			month = 0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name = MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase() == month_name.toLowerCase()) {
					month = i+1;
					if (month>12) { month -= 12; }
					i_val += month_name.length;
					break;
					}
				}
			if (month == 0) { return 0; }
			if ((month < 1) || (month>12)) { return 0; }
			// TODO: Process Month Name
			}
		else if (token=="MM" || token=="M") {
			x=token.length; y=2;
			month = _getInt(val,i_val,x,y);
			if (month == null) { return 0; }
			if ((month < 1) || (month > 12)) { return 0; }
			i_val += month.length;
			}
		else if (token=="DD" || token=="D") {
			x=token.length; y=2;
			date = _getInt(val,i_val,x,y);
			if (date == null) { return 0; }
			if ((date < 1) || (date>31)) { return 0; }
			i_val += date.length;
			}
		else if (token=="hh" || token=="h") {
			x=token.length; y=2;
			hh = _getInt(val,i_val,x,y);
			if (hh == null) { return 0; }
			if ((hh < 0) || (hh > 23)) { return 0; }
			i_val += hh.length;
			hh--;
			}
		else if (token=="HH" || token=="H") {
			x=token.length; y=2;
			hh = _getInt(val,i_val,x,y);
			if (hh == null) { return 0; }
			if ((hh < 0) || (hh > 23)) { return 0; }
			i_val += hh.length;
			}
		else if (token=="KK" || token=="K") {
			x=token.length; y=2;
			hh = _getInt(val,i_val,x,y);
			if (hh == null) { return 0; }
			if ((hh < 0) || (hh > 11)) { return 0; }
			i_val += hh.length;
			}
		else if (token=="kk" || token=="k") {
			x=token.length; y=2;
			hh = _getInt(val,i_val,x,y);
			if (hh == null) { return 0; }
			if ((hh < 1) || (hh > 24)) { return 0; }
			i_val += hh.length;
			h--;
			}
		else if (token=="mm" || token=="m") {
			x=token.length; y=2;
			mm = _getInt(val,i_val,x,y);
			if (mm == null) { return 0; }
			if ((mm < 0) || (mm > 59)) { return 0; }
			i_val += mm.length;
			}
		else if (token=="ss" || token=="s") {
			x=token.length; y=2;
			ss = _getInt(val,i_val,x,y);
			if (ss == null) { return 0; }
			if ((ss < 0) || (ss > 59)) { return 0; }
			i_val += ss.length;
			}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase() == "am") {
				ampm = "AM";
				}
			else if (val.substring(i_val,i_val+2).toLowerCase() == "pm") {
				ampm = "PM";
				}
			else {
				return 0;
				}
			}
		else {
			if (val.substring(i_val,i_val+token.length) != token) {
				return 0;
				}
			else {
				i_val += token.length;
				}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) {
		return 0;
		}
	// Is date valid for month?
	if (month == 2) {
		// Check for leap year
		if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) { // leap year
			if (date > 29){ return false; }
			}
		else {
			if (date > 28) { return false; }
			}
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return false; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") {
		hh+=12;
		}
	else if (hh>11 && ampm=="AM") {
		hh-=12;
		}
	var newdate = new Date(y2k(year),month-1,date,hh,mm,ss);
	return newdate;
	}

function y2k(number) { return (number < 1000) ? number + 1900 : number; }

function _getInt(str,i,minlength,maxlength) {
	for (x=maxlength; x>=minlength; x--) {
		var token = str.substring(i,i+x);
		if (token.length < minlength) {
			return null;
			}
		if (_isInteger(token)) { 
			return token;
			}
		}
	return null;
	}

function _isInteger(val) {
	var digits = "1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i)) == -1) { return false; }
		}
	return true;
	}



/* ======================================================================
FUNCTION:  	IsAlpha

INPUT:		str (string) - the string to be tested

RETURN:  	true, if the string contains only alphabetic characters 
				false, otherwise.

====================================================================== */

function IsAlpha( str ) 
{
	// Return immediately if an invalid value was passed in
	if (str+"" == "undefined" || str+"" == "null" || str+"" == "")	
		return false;

	var isValid = true;

	str += "";	// convert to a string for performing string comparisons.

	// Loop through string one character at time,  breaking out of for
	// loop when an non Alpha character is found.
  	for (i = 0; i < str.length; i++) {
		// Alpha must be between "A"-"Z", or "a"-"z"
		if ( !( ((str.charAt(i) >= "a") && (str.charAt(i) <= "z")) ||
      			((str.charAt(i) >= "A") && (str.charAt(i) <= "Z")) ) ) {
         				isValid = false;
         				break;
      		}//end of if
   	} // end for loop
   
	return isValid;

}  // end IsAlpha 


/* ======================================================================
FUNCTION:  	validateOrderNbr

INPUT:		orderNbr (string) - the string to be tested, 
		errorArray (Array) - in which errorwillbe added

RETURN:  	errorArray, if the orderNbr is inValid errorArray will
		have corresponding error code

====================================================================== */

function validateOrderNbr( orderNbr, errorArray ) 
{
	var orderNumber = trimString(orderNbr);

	if( !( (IsAlpha(orderNumber.substring(0,1))) && (_isInteger(orderNumber.substring(1))) ) )
	{
		var iArrPos = errorArray.length;
		errorArray[iArrPos] = new Array(3);
		errorArray[iArrPos][0] = "Order Nbr";
		errorArray[iArrPos][1] = "TAS0117E";
		errorArray[iArrPos][2] =  TAS0117E;
	}

	return errorArray;
}

