function isLeap(strYear)
{
	var nYear, strYearFormat, objRegExp ;
	
	strYearFormat = "^[0-9]{4}$"
	objRegExp = new RegExp(strYearFormat) ;
	if ( !objRegExp.test(strYear) )
	{
		delete objRegExp ;
		return false ;
	}
	delete objRegExp ;
	
	nYear = parseInt(strYear,10) ;
	nYear = isNaN(nYear)? 0 : nYear ;

	if ( nYear % 4 == 0 || (nYear % 100 == 0 && nYear % 400 == 0))
		return true ;
	else
		return false ;
}

function isDate(strDate, nDateFormat)
{
	var strDateFormat, strYear, strMonth, strDay, arrDate, nYear, nMonth, nDay, objRegExp ;
	
	if ( isEmpty(strDate) )
	{
		return true ;
	}
	
	switch(nDateFormat)
	{
		case DATE_YYYY_MM_DD	:	strDateFormat = "^[0-9]{4}\\/[0-9]{1,2}\\/[0-9]{1,2}$" ;
									break ;
				
		case DATE_MM_DD_YYYY	:	strDateFormat = "^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$" ;
									break ;
				
		case DATE_DD_MM_YYYY	:	strDateFormat = "^[0-9]{2}\\/[0-9]{2}\\/[0-9]{4}$" ;
									break ;
				
		default					:	strDateFormat = "^[0-9]{4}\\/[0-9]{1,2}\\/[0-9]{1,2}$" ;
									break ;
	}
	
	objRegExp = new RegExp(strDateFormat) ;
	if (!objRegExp.test(strDate))
	{
		delete objRegExp ;
		return false ;
	}
	delete objRegExp ;
	
	arrDate = strDate.split("/") ;
	
	switch(nDateFormat)
	{
		case DATE_YYYY_MM_DD	:	strYear = arrDate[0] ; strMonth = arrDate[1] ; strDay = arrDate[2] ;
									break ;
				
		case DATE_MM_DD_YYYY	:	strYear = arrDate[2] ; strMonth = arrDate[0] ; strDay = arrDate[1] ;
									break ;
				
		case DATE_DD_MM_YYYY	:	strYear = arrDate[2] ; strMonth = arrDate[1] ; strDay = arrDate[0] ;
									break ;
				
		default					:	strYear = arrDate[0] ; strMonth = arrDate[1] ; strDay = arrDate[2] ;
									break ;
	}
	
	nYear = parseInt(strYear, 10) ;
	nMonth = parseInt(strMonth, 10) ;
	nDay = parseInt(strDay, 10) ;
	
	nYear = isNaN(nYear)? 0 : nYear ;
	nMonth = isNaN(nMonth)? 0 : nMonth ;
	nDay = isNaN(nDay)? 0 : nDay ;

	if ( nMonth < 1 || nMonth > 12 ) 
	{
		return false ;
	}

	if ( nYear < 1 )
	{
		return false ;
	}

	if ( nDay < 1 )
	{
		return false ;
	}		

	if ( (nMonth == 1 || nMonth == 3 || nMonth == 5 || nMonth == 7 || nMonth == 8 || nMonth == 10 || nMonth == 12) && (nDay > 31) )
	{
		return false ;
	}

	if ( (nMonth == 4 || nMonth == 6 || nMonth == 9 || nMonth == 11) && (nDay > 30) )
	{
		return false ;
	}		

	if ( nMonth == 2 )
	{
		if ( isLeap(strYear) )
		{
			if ( nDay > 29 )
			{
				return false ;
			}
		}
		else
		{
			if ( nDay > 28 )
			{
				return false ;
			}
		}
	}
	
	return true	;
}


function isInteger(strVal, blAllowNegative)
{
	var objRegExp, strIntegerFormat, blValid ;

	if (blAllowNegative)
		strIntegerFormat = "(^0$|^-?[1-9]+[0-9]*$)" ;
	else
		strIntegerFormat = "(^0$|^[1-9]+[0-9]*$)" ;

	objRegExp = new RegExp(strIntegerFormat, "") ;
	blValid = objRegExp.test(strVal) ;
	delete objRegExp ;
	
	return blValid ;
}

function isDecimal(strVal, nDecimalPlaces, blAllowNegative)
{
	var objRegExp, strDecimalFormat, blValid ;

	if (blAllowNegative)
		strDecimalFormat = "(^0(\\.0{1,})?$|^-?[0-9]*(\\.?[0-9]{1," + nDecimalPlaces + "})?$)" ;
	else
		strDecimalFormat = "(^0(\\.0{1,})?$|^[0-9]*(\\.?[0-9]{1," + nDecimalPlaces + "})?$)" ;

	objRegExp = new RegExp(strDecimalFormat, "") ;
	blValid = objRegExp.test(strVal) ;
	delete objRegExp ;
	
	return blValid ;
}

function isEmpty(strVal)
{
	var objRegExp, strEmptyStringFormat, blValid ;

//	strEmptyStringFormat = "^( |\n|\s)*( |\n|\r|\s)*( |\n|\s)*$" ;
//	strEmptyStringFormat = "^( |\n|\s)*( |\n|\r|\s)*$" ;
	strEmptyStringFormat = "^( |\n|\r|\\s)*$" ;

	objRegExp = new RegExp(strEmptyStringFormat, "g") ;
	blValid = objRegExp.test(strVal) ;
	delete objRegExp ;
	
	return blValid ;
}


function isEmail(strVal)
{
	var objRegExp, strEmailFormat, blValid ;
	
//	strEmailFormat = "^\w+\.?\w+@\w+\.?\w{2,}$" ;
//	strEmailFormat = "^([a-z]|[0-9]|_|-)+(\.([a-z]|[0-9]|_|-)+)?@$" ;
//	strEmailFormat = "^([a-z]|[0-9]|_|-)([a-z]|[0-9]|_|-)*(\\.)$" ;
//	strEmailFormat = "^([a-z]|[0-9]|_|-)+(\\.)?([a-z]|[0-9]|_|-)+@([a-z]|[0-9]|_|-)+\\.([a-z]|[0-9]|_|-){2,}$" ;
//	strEmailFormat = "^([a-z]|[0-9]|_|-)+(\\.)?([a-z]|[0-9]|_|-)+@([a-z]|[0-9]|_|-)+(\\.([a-z]|[0-9]|_|-)+)?\\.([a-z]|[0-9]|_|-){2,}$" ;
	strEmailFormat = "^([a-z]|[0-9]|_|-)+((\\.)?([a-z]|[0-9]|_|-)+)*@([a-z]|[0-9]|_|-)+(\\.([a-z]|[0-9]|_|-)+)+$" ;

	objRegExp = new RegExp(strEmailFormat, "gi") ;
	blValid = objRegExp.test(strVal) ;
	delete objRegExp ;
	return blValid ;
}

function isUSTel(strVal, strSeparator)
{
	var objRegExp, strUSTelFormat, blValid ;
	
	if ( strSeparator == null )
		strSeparator = "-" ;

	strUSTelFormat = "^[0-9]{3}" + strSeparator + "[0-9]{3}" + strSeparator + "[0-9]{4}$" ;
	
	objRegExp = new RegExp(strUSTelFormat, "") ;
	blValid = objRegExp.test(strVal) ;
	delete objRegExp ;
	return blValid ;
}

function isSSN(strVal)
{
	var objRegExp, strSSNFormat, blValid ;

	strSSNFormat = "^(\\d{9}|\\d{3}-\\d{2}-\\d{4})$" ;
	objRegExp = new RegExp(strSSNFormat) ;
	blValid = objRegExp.test(strVal) ;
	delete objRegExp ;
	return blValid ;
}

function isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

