
// Begin EditTin.js
// Created by:  Steve Seaquist
//
function EditTin			(pFNam, pFVal, pReqd)	// (plus possible 4th, 5th and/or 6th parameters, see below)
{
if	(gDataValidation == 0)
	return true;

var	sMustBe							= "TIN";
if ((EditTin.arguments.length		> 3)			// (if 4th parameter is "EIN"/"SSN"/"TIN" = whether to restrict type)
&&	(typeof EditTin.arguments[3]	== "string")
&&	(	(EditTin.arguments[3]		== "EIN")
	||	(EditTin.arguments[3]		== "SSN")
	||	(EditTin.arguments[3]		== "TIN")
	))
	sMustBe							= arguments[3];

var	sDetectBogus					= true;
if ((EditTin.arguments.length		> 4)			// (if 5th parameter is true/false = whether to detect bogus TINs)
&&	(typeof EditTin.arguments[4]	== "boolean"))
	sDetectBogus					= arguments[4];

var	sLongMessages					= true;
if ((EditTin.arguments.length		> 5)			// (if 6th parameter is true/false = whether to show long messages)
&&	(typeof EditTin.arguments[5]	== "boolean"))
	sLongMessages					= arguments[5];

// alert("sMustBe = "+sMustBe+", sDetectBogus = "+sDetectBogus+", sLongMessages = "+sLongMessages);

var	sFLen	= pFVal.length;
if	((sFLen == 0) && (pReqd == 0))
	return true;

if ((sMustBe == "TIN")
||	(sMustBe == "EIN"))
	{
	gSilentEditMask = 1;
	if	(EditMask (pFNam, pFVal, "99-9999999",  1, 10, 10))
		{
		if	(sDetectBogus)
			{
			// It fits the pattern of 99-9999999, but also check whether it appears bogus/made-up: 
			var	sCloseDigits		= 0;
			var	sPrevDigit			= pFVal.substring(0,1);		// First digit
			for	(var i = 1; i < pFVal.length; i++)
				{
				var	sDigit			= pFVal.substring(i,i+1);	// Next digit
				if	(sDigit			!= "-")						// Ignore the "-"
					{
					var	sDiff		= sDigit - sPrevDigit;
					if ((sDiff		<=  1)
					&&	(sDiff		>= -1))
						sCloseDigits++;
				//	alert("sPrevDigit = "+sPrevDigit+", sDigit = "+sDigit+", sDiff = "+sDiff+", sCloseDigits = "+sCloseDigits);
					sPrevDigit		= sDigit;
					}
				}
			if	(sCloseDigits >= 6)
				{
				if	(sLongMessages)
					alert	("ERROR. " + pFNam + " appears to be a fictitious EIN. "
							+"All Tax IDs *MUST* be genuine. ");
				else
					alert	("ERROR. " + pFNam + " is an invalid EIN.");
				return false;
				}
			}
		return true;
		}
	}

if ((sMustBe == "TIN")
||	(sMustBe == "SSN"))
	{
	gSilentEditMask = 1;
	if	(EditMask (pFNam, pFVal, "999-99-9999", 1, 11, 11))
		{
		if	(sDetectBogus)
			{
			// It fits the pattern of 999-99-9999, but also check whether it appears bogus/made-up: 
			var	sArea	= parseInt(pFVal.substring(0,3), 10);	// (parseInt(...,10) strips leading zeroes)
			if	(!(((sArea >=   1) && (sArea <= 665))
				|| ((sArea >= 667) && (sArea <= 733))
				|| ((sArea >= 750) && (sArea <= 772))))
				{
				if	(sLongMessages)
					alert	("ERROR. Although " + pFNam + " is in SSN format (999-99-9999), "
							+"it does not begin with a valid \'area\' (first 3 digits), "
							+"as allocated by the Social Security Administration. ");
				else
					alert	("ERROR. " + pFNam + " is an invalid SSN.");
				return false;
				}
			else if	(pFVal.substring(4,6) == "00")				// (only 01 - 99 are valid)
				{
				if	(sLongMessages)
					alert	("ERROR. Although " + pFNam + " is in SSN format (999-99-9999), "
							+"it does not contain a valid \'group\' (middle 2 digits), "
							+"as allocated by the Social Security Administration.");
				else
					alert	("ERROR. " + pFNam + " is an invalid SSN.");
				return false;
				}
			else if	(pFVal.substring(7,11) == "0000")			// (only 0001 - 9999 are valid)
				{
				if	(sLongMessages)
					alert	("ERROR. Although " + pFNam + " is in SSN format (999-99-9999), "
							+"it does not end with a valid last 4 digits, "
							+"as allocated by the Social Security Administration.");
				else
					alert	("ERROR. " + pFNam + " is an invalid SSN.");
				return false;
				}
			}
		return true;
		}
	}

gSilentEditMask = 0;
switch	(sMustBe)
	{
	case "EIN":
		EditMask (pFNam, pFVal, "99-9999999",	1, 10, 10);
		break;
	case "SSN":
		EditMask (pFNam, pFVal, "999-99-9999",	1, 11, 11);
		break;
	default:
		alert	("ERROR. " + pFNam + " must be of the form 99-9999999 (EIN) or 999-99-9999 (SSN). "
				+"The following error message will be why it failed as an EIN.");
		EditMask (pFNam, pFVal, "99-9999999",	1, 10, 10);
	}

return false;
}
// End EditTin.js
