function GetBirthYear(currentAge)
{
	var now = new Date()
	return now.getYear() - currentAge
}

/*
Returns true if string s is empty.
*/
function isEmpty(s)
{
	return ((s == null) || (s.length == 0));
}

/*
Returns true if character c is a digit (0 .. 9).
*/
function isDigit(c)
{   
	return ((c >= "0") && (c <= "9"));
}

/*
Returns true if all characters in string s are numbers.
*/
function isInteger(s)
{
	var isOk = true;
	var i, c;

	if (isEmpty(s)) {
		isOk = false;
	}
	else {
		for (i=0; i<s.length; i++) {   
			c = s.charAt(i);
			if (!isDigit(c)) {
				isOk = false;
				break;
			}
		}
	}
    return isOk;
}

/*
Return true if string s is an unsigned floating point (real) number. 
*/
function isFloat(s)
{
	var isOk = true;
    	var seenDecimalPoint = false;
	var i, c;

	if (isEmpty(s)) 
	{
		isOk = false;
	}
	else 
	{
		for (i=0; i<s.length; i++) 
		{   
			c = s.charAt(i);
			if (c == "." && !seenDecimalPoint) 
			{
				seenDecimalPoint = true;
			}
			else if (c == ".") 
			{
				isOk = false;
				break;
			}
			else if (!isDigit(c)) 
			{
				isOk = false;
				break;
			}
		}
	}
    return isOk;
}

/*
Return true if value a integer within the specified range. Assume
2nd parameter a minimum value and the 3rd a maximum. If omitted
assume no range.
*/
function isIntegerValid(value)
{
	var isOk = true;
	var low = value;
	var high = value;

	if (isIntegerValid.arguments.length > 2) {
		low = isIntegerValid.arguments[1];
		high = isIntegerValid.arguments[2];
	}
	else if (isIntegerValid.arguments.length == 2) {
		low = isIntegerValid.arguments[1];
	}

	if (isInteger(value))
		isOk = !(value < low || value > high);
	else
		isOk = false;
	return isOk;
}

/*
Return true if value a float within the specified range. Assume
2nd parameter a minimum value and the 3rd a maximum. If omitted
assume no range.
*/
function isFloatValid(value)
{
	value = getFloat(value);
	
	var isOk = true;
	var low = value;
	var high = value;

	if (isFloatValid.arguments.length > 2) {
		low = isFloatValid.arguments[1];
		high = isFloatValid.arguments[2];
	}
	else if (isFloatValid.arguments.length == 2) {
		low = isFloatValid.arguments[1];
	}

	if (isFloat(value))
		isOk = !(value < low || value > high);
	else
		isOk = false;

	return isOk;
}


/*
Function formats numbers as text.  The following options are requested
by passing the following optional parameters:

	(	use parenthesis for negative numbers
	,	insert commas between thousands
	$	insert leading $ sign
	9	number inidcates number of decimals to display - 0 default

To format a number with 2 decimals, commas and parentheses for negatives
call function as follows

	fmtNum(25, 2, ",", "(")
*/
function fmtNum(number)
{
	if (!isFloat(number) && number == "")
		return "";
	
	var decimals = 0;
	var addCommas = false;
	var addParenth = false;
	var addDollarSign = false;
	var numOptions, option;
	var i, pos;
	var strNum, strInt, strFrct, strWrk;

	// determine formatting options
	numOptions = fmtNum.arguments.length;
	for (i=1; i<numOptions; i++) {
		option = fmtNum.arguments[i];
		if (isInteger(option))
			decimals = parseInt(option);
		else if (option == ",")
			addCommas = true;
		else if (option == "(")
			addParenth = true;
		else if (option == "$")
			addDollarSign = true;
	}
   
	// temporarily remove sign and separate integer and faction
	shift = Math.pow(10,decimals)
	strNum = String(Math.abs(Math.round(number * shift) / shift));
	pos = strNum.indexOf(".")
	if (pos < 0) {
		strInt  = strNum;
		strFrct = frontFill("", "0", decimals);
	}
	else {
		strInt  = frontFill(strNum.substr(0, pos), "0", "1");
		strFrct = backFill(strNum.substr(pos+1), "0", decimals);
	}

	// add commas
	if (addCommas) {
		pos = 0;
		strWrk = "";
		for (i=strInt.length-1; i>=0; i--) {
			if (pos++ == 3) {
				strWrk = "," + strWrk;
				pos = 1;
			}
			strWrk = strInt.charAt(i) + strWrk;
		}
		strInt = strWrk;
	}

	// recombine integer and fraction
	strNum = strInt + (decimals > 0 ? "." + strFrct : "");

	// add dollar sign
	strNum = (addDollarSign	? "$" : "") + strNum

	// format sign
	if (number < 0) {
		if (addParenth)
			strNum = "(" + strNum + ")";
		else
			strNum = "-" + strNum;
	}

	return strNum;
}

/*
Format javascript date to a comprehensible date string.
*/
function fmtDate(inDate, fmt)
{
	var str = "";
	var spr = "";
	
	for (var i=0; i<fmt.length; i++) {
		if (fmt.charAt(i) == "d") {
			spr = str.length > 0 ? "/" : "";
			str = str + spr + frontFill(String(inDate.getDate()), "0", 2);
		}
		else if (fmt.charAt(i) == "m") {
			spr = str.length > 0 ? "/" : "";
			str = str + spr + frontFill(String(inDate.getMonth()+1), "0", 2);
		}
		else if (fmt.charAt(i) == "y") {
			spr = str.length > 0 ? "/" : "";
			str = str + spr + frontFill(String(inDate.getYear()), "0", 2);
		}
		else if (fmt.charAt(i) == "Y") {
			spr = str.length > 0 ? "/" : "";
			str = str + spr + frontFill(String(inDate.getFullYear()), "0", 4);
		}
	}
	return str;
}

/*
Add "chr" s to the front of the string until its length is "size".
*/
function frontFill(inStr, chr, size)
{
	var wrkStr = inStr;
	while (wrkStr.length < size)
		wrkStr = chr + wrkStr;
	return wrkStr;
}

/*
Add "chr" s to the end of the string until its length is "size".
*/
function backFill(inStr, chr, size)
{
	var wrkStr = inStr;
	while (wrkStr.length < size)
		wrkStr = wrkStr + chr;
	return wrkStr;
}

/*
Return the number of days in the given month of the given year.
*/
function daysInMonth(mth, yr)
{
	var daysInMonthNorm = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var daysInMonthLeap = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
	var days = 0;

	if (!(mth < 0 || mth > 12)) {
		if (isLeapYear(yr))
			days = daysInMonthLeap[mth-1];
		else
			days = daysInMonthNorm[mth-1];
	}
	return days;
}

/*
Is given year a leap year.  Algorithm needs some more work.
*/
function isLeapYear(yr)
{
	return yr%4 == 0;
}

/*
Bind the value between the minimum and the maximum.
*/
function rng(val, low, high)
{
	return Math.min(Math.max(val, low), high);
}

/*
Is browser Internet Explorer or Netscape
*/
function IsIE()
{
	return navigator.appName.substr(0,1) == "M";
}

/*
Is Esker ActiveX PlugIn installed
*/
function IsEskerPlugInInstalled()
{
	var PlugInVersion = 6.7;
	var PlugIn = navigator.plugins["Esker ActiveX Plug-in for Netscape 6"];
	return PlugIn && parseFloat(PlugIn.description.substring(30, 40)) >= PlugInVersion;
}

function getFloat(numberString)
{
	var c;
	var s = new String(",");
	var t = new String("");
	s += numberString;
	for (var j = 0; j< s.length; j++)
	{
		c = s.charAt(j);
		if (c == "(") 
		{
			t = "-";
		}	
		if ((c != ",") && (c != "$") && (c != "(") && (c != ")")) 
		{
			t += c;
		}			
	}
	return t;
}


function stripFormat(numberString)
{
	return Number(getFloat(numberString));
}
