	function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

function isWhitespace (s)
{	var whitespace = " \t\n\r";
	var i;

	if (isEmpty(s)) return true;

	for (i = 0; i < s.length; i++)
	{   
		var c = s.charAt(i);

		if (whitespace.indexOf(c) == -1) return false;
	}

	return true;
}

function isEmail (s)
{   if (isEmpty(s)) 
	   if (isEmail.arguments.length == 1) return false;
	   else return (isEmail.arguments[1] == true);
   
	if (isWhitespace(s)) return false;

	var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
	var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid
	return (!reg1.test(s) && reg2.test(s));
}

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function isFloat (s)
{   var i;
	var seenDecimalPoint = false;

	if (isEmpty(s)) 
	   if (isFloat.arguments.length == 1) return false;
	   else return (isFloat.arguments[1] == true);

	if (s == ".") return false;

	for (i = 0; i < s.length; i++)
	{   
		var c = s.charAt(i);

		if ((c == ".") && !seenDecimalPoint) seenDecimalPoint = true;
		else if (!isDigit(c)) return false;
	}
	return true;
}

function isIntegerInRange (s, a, b)
{	if (isEmpty(s)) 
	   if (isIntegerInRange.arguments.length == 1) return false;
	   else return (isIntegerInRange.arguments[1] == true);

	if (!isInteger(s, false)) return false;

	var num = parseInt (s);
	return ((num >= a) && (num <= b));
}

function isMonth (s)
{   if (isEmpty(s)) 
	   if (isMonth.arguments.length == 1) return false;
	   else return (isMonth.arguments[1] == true);
	s = new Number(s)
	return isIntegerInRange (s, 1, 12);
}

function isDay (s)
{   if (isEmpty(s)) 
	   if (isDay.arguments.length == 1) return false;
	   else return (isDay.arguments[1] == true);   
	s = new Number(s)
	return isIntegerInRange (s, 1, 31);
}

function isInteger (s)
{	var i;

	if (isEmpty(s)) 
	   if (isInteger.arguments.length == 1) return false;
	   else return (isInteger.arguments[1] == true);

	for (i = 0; i < s.length; i++)
	{   
		var c = s.charAt(i);

		if (!isDigit(c)) return false;
	}

	return true;
}

function isSignedInteger (s)
{	if (isEmpty(s)) 
	   if (isSignedInteger.arguments.length == 1) return false;
	   else return (isSignedInteger.arguments[1] == true);

	else {
		var startPos = 0;
		var secondArg = false;

		if (isSignedInteger.arguments.length > 1)
			secondArg = isSignedInteger.arguments[1];

		if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
		   startPos = 1;	
		return (isInteger(s.substring(startPos, s.length), secondArg))
	}
}

function isNonnegativeInteger (s)
{	var secondArg = false;

	if (isNonnegativeInteger.arguments.length > 1)
		secondArg = isNonnegativeInteger.arguments[1];

	return (isSignedInteger(s, secondArg)
		 && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

function isYear (s)
{   if (isEmpty(s)) 
	   if (isYear.arguments.length == 1) return false;
	   else return (isYear.arguments[1] == true);
	if (!isNonnegativeInteger(s)) return false;
	return (s.length == 4);
}

function makeArray(n)
{	for (var i = 1; i <= n; i++) {
	  this[i] = 0
   } 
   return this
}

function daysInMonth(m)
{
	switch(m)
	{
		case 2:
			return 29;
			break;
		case 4:
			return 30;
			break;
		case 6:
			return 30;
			break;
		case 9:
			return 30;
			break;
		case 11:
			return 30;
			break;
		default:
			return 31;
	}
}

function daysInFebruary (year)
{	return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (year, month, day)
{
	if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

	var intYear = parseInt(year);
	var intMonth = parseInt(month);
	var intDay = parseInt(day);

	if (intDay > daysInMonth[intMonth]) return false; 

	if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

	return true;
}

function isValidDate (s, emptyOK)
{
	if (isEmpty(s)) 
	{
		if (isValidDate.arguments.length == 1) return false;
		else return (isValidDate.arguments[1] == true);
	}

	var aDateParts = s.split("/");
	
	if (aDateParts.length != 3) return false;
	
	month = aDateParts[0];
	day = aDateParts[1];
	year = aDateParts[2];
	
	return isDate(year, month, day);
}

function stripNumber(n)
{
	n = new String(n)
	var regexp = /,/g;
	var regexp2 = / /g;
	n = n.replace(regexp, "");
	n = n.replace(regexp2, "");
	return n;
}

function formatNumber(n, dec, curr)
{
	if (!curr) curr = "";

	n = stripNumber(n);
	n = n.replace(curr, "");
	n = parseFloat(n);
	if (isNaN(n)) return NaN;

	var bNeg = (n < 0);
	n = Math.abs(n);

	n = new String(n)
	var iStop = n.indexOf(".");
	if (iStop == -1)
		iStop = n.length;

	if (dec)
	{
		var sZeros = "";
		for (var i = 0; i < dec; i++)
			sZeros += "0";
			
		if (iStop == n.length)
			n += "." + sZeros;
		else
		{
			var dDec = parseFloat(n.substr(iStop, n.length - iStop));
			dDec += parseFloat("." + sZeros + "5");
			n = n.substr(0, iStop) + dDec.toString().substr(1, dec + 1);
		}
	}
		
	var sReturn = "";
	for (var j = 0, i = iStop % 3; i < iStop; i+=3)
	{
		if (i > j)
			sReturn += n.substring(j, i) + ",";
			
		j = i;
	}

	sReturn += n.substring(j, n.length);
	if (bNeg)
		sReturn = "(" + sReturn + ")";
	return curr + sReturn;
}

