function isEmailAddr(email)
{
  var result = false;
  var theStr = new String(email);
  var index = theStr.indexOf("@");
  if (index > 0)
  {
    var pindex = theStr.indexOf(".",index);
    if ((pindex > index+1) && (theStr.length > pindex+1))
	result = true;
  }
  return result;
}

function validRequired(formField,fieldLabel)
{
	var result = true;
	
	if (formField.value == "")
	{
		alert('Please enter a value for "' + fieldLabel +'".');
		formField.focus();
		result = false;
		formField.className='FormError';
	}
	
	return result;
}

function inValidCharSet(str,charset)
{
	var result = true;
	// Note: doesn't use regular expressions to avoid early Mac browser bugs	
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))<0)
		{
			result = false;
			break;
		}	
	return result;
}

function allDigits(str)
{
	return inValidCharSet(str,"0123456789");
}

function validEmail(formField,fieldLabel,required)
{
	var result = true;
	
	if (required && !validRequired(formField,fieldLabel))
		result = false;

	if (result && ((formField.value.length < 3) || !isEmailAddr(formField.value)) )
	{
		alert("Please enter an e-mail address in the form: yourname@yourdomain.com");
		formField.focus();
		result = false;
		formField.className='FormError';
	}   
  return result;

}

function validNumCharacters(formfield,fieldLabel,minChar,maxChar) 
{
	var result = true;

	if (formfield.value.length < minChar) {
	alert('Help! Please re-enter a value for "' + fieldLabel +'". It must have "' + minChar +'" characters or more.');
	result = false;
	formField.className='FormError';
	}
	
	if (formfield.value.length > maxChar) {
	alert('Help! Please re-enter a value for "' + fieldLabel +'". It must have "' + maxChar +'" characters or less.');
	result = false;
	formField.className='FormError';
	}

return result;
}

function validNum(formField,fieldLabel,required)
{
	var result = true;
	
	if (required && !validRequired(formField,fieldLabel)) {
		result = false;
		formField.className='FormError';
	}
		
	var ValidChars = "0123456789.";   
	var Char;
	var i, start;
	
	if (result) {
		if (formField.value.charAt(0) == "-")
			start=1;
		else
			start=0;
	
		for (i = start; i < formField.value.length && result == true; i++) { 
			Char = formField.value.charAt(i); 
			if (ValidChars.indexOf(Char) == -1) {
				alert('Please enter a number for the "' + fieldLabel +'" field.');
				formField.focus();		
				result = false;
				formField.className='FormError';
				break;
			}
		}
	}
	return result;
}

function validNumRange(formField,fieldLabel,minValue,maxValue)
{
	var result = true;
	
	if (formField.value < minValue) {
	alert('The value for "' + fieldLabel +'" must be greater then or equal to ' + minValue +'.');
	result = false;
	formField.className='FormError';
	}
	
	if (formField.value > maxValue) {
	alert('The value for "' + fieldLabel +'" must be less then or equal to ' + maxValue +'.');
	result = false;
	formField.className='FormError';
	}

   return result;
}

function validInt(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel)) {
		result = false;
		formField.className='FormError';
	}
  
 	if (result && (formField.value.length > 0))
 	{
		var digits = "0123456789"+Intl_DecimalChar;
		var origstr = formField.value;
		var crunchedstr = "";
		var i, start;

		if (origstr.charAt(0) == "-")
			start=1;
		else
			start=0;

		for (i=start;i<origstr.length;i++) 
			if (digits.indexOf(origstr.charAt(i))>=0)
				crunchedstr += origstr.charAt(i);
 		var num = parseInt(crunchedstr,10);
 		if (isNaN(num))
 		{
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
			formField.focus();		
			result = false;
			formField.className='FormError';
		} else {
			if (num != formField.value) {
				formField.value = num;
			}
		}
	} 	
	return result;
}

function round2(num)
{
//	alert("round2("+num+")");
	if (isNaN(num))
		return ("0.00");
	var newnum = Math.round(num*100)/100;
	var s = ""+newnum; // converts to string
	if (s.indexOf(Intl_DecimalChar) < 0) {
		s = s+Intl_DecimalChar+"00";
	} else {
		if (s.length - s.indexOf(Intl_DecimalChar) < 3) {
			s=s+"0";
		}
	}
//	alert("round2("+num+") = "+s+" len:"+s.length+" s.Dot:"+s.indexOf(Intl_DecimalChar));
	return(s);
}

function extractFloat(str)
{
//	alert("extractFloat("+str+")");
	var digits = "0123456789-"+Intl_DecimalChar;
	var crunchedstr = "";
	var i;
	
	for (i=0;i<str.length;i++) 
		if (digits.indexOf(str.charAt(i))>=0)
			crunchedstr += str.charAt(i);
//	alert("extractFloat("+str+") = :"+crunchedstr+":");
	if (crunchedstr.length < 1)
		return(0.0);
	return(parseFloat(crunchedstr));
}

function validFloat(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel)) {
		result = false;
		formField.className='FormError';
	}
 	if (result && (formField.value.length > 0)) {
		var digits = "0123456789"+Intl_DecimalChar;
		var origstr = formField.value;
		var crunchedstr = "";
		var i, start;
		
		if (origstr.charAt(0) == "-") {
			crunchedstr="-";
			start=1;
		} else
			start=0;

		for (i=start;i<origstr.length;i++) 
			if (digits.indexOf(origstr.charAt(i))>=0)
				crunchedstr += origstr.charAt(i);
 		var num = parseFloat(crunchedstr);
 		if (isNaN(num)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
			formField.focus();		
			result = false;
			formField.className='FormError';
		} else 
			if (num != formField.value) 
				formField.value = num;
	} 	
	return result;
}

function validDate(formField,fieldLabel,required)
{
	var result = true;
	var inrange = true;

	if (required && !validRequired(formField,fieldLabel)) {
		result = false;
		formField.className='FormError';
	}
	
	if (!required && formField.value.length == 0) {
		return true;
	}
  
 	if (result)
 	{
 		var elems = formField.value.split("/");
  		result = (elems.length == 3); // should be three components
 		
 		if (result)
 		{
			var month, day, year;
			if (Intl_MonthFirst) {
 				month = parseInt(parseFloat(elems[0]));
  				day = parseInt(parseFloat(elems[1]));
			} else {
  				day = parseInt(parseFloat(elems[0]));
 				month = parseInt(parseFloat(elems[1]));
			}
 			year = parseInt(parseFloat(elems[2]));
			
			// Day month and year need to be inside "normal" ranges
			inrange = (month >= 1) && (month <= 12) &&
					 (day >= 1) && (day <= 31) &&
					 ((year >= 1 && year <= 78) || (year >= 1901 && year <= 2078));		// year limitation based on definition of SQLServer smalldatetime type
			// Either the month is NOT Sept, Apr, Jun, Nov OR it has 30 days or less...
			inrange = inrange && (((month != 4) && (month != 6) && (month != 9) && (month != 11)) || (day <= 30));				 
			// Either the month is NOT Feb OR it has 29 days or less no matter what year it is...
			inrange = inrange && ((month != 2) || (day <= 29));
			// Check for non-leap years where Feb is 28 days
			if (year < 100) 
				if (year < 50) 
					year = year+2000;
				else
					year = year+1900;
			if (year % 4 != 0)
				inrange = inrange && ((month != 2) || (day <= 28));
			else
				if (year % 100 == 0)
					if (year % 400 != 0)
						inrange = inrange && ((month != 2) || (day <= 28));
			result = result && inrange;
 		}
 		
  		if (!result)
 		{
			if (inrange) {
				if (Intl_MonthFirst) 
		 			alert('Please enter a date in the format MM/DD/YYYY for "' + fieldLabel +'".');
				else
		 			alert('Please enter a date in the format DD/MM/YYYY for "' + fieldLabel +'".');
			} else
		 			alert('The day, month or year is invalid for "' + fieldLabel +'".');
 			formField.focus();
			formField.className='FormError';
		}
	} 	
	return result;
}

function date1BeforeDate2(date1,date2) // date1 is before or the same as date 2 returns true. dates are *strings* not fields!
{
	var result = true;
	
 	var elems1 = date1.split("/");
 	var elems2 = date2.split("/");
	
  	if (elems1.length != 3) { // should be three components: won't get this error if you call validDate first!!!!
		return false;
	}
  	if (elems2.length != 3) { // should be three components: won't get this error if you call validDate first!!!!
		return false;
	}
 		
	var month1, day1, year1;
	var month2, day2, year2;
	if (Intl_MonthFirst) {
			month1 = parseInt(parseFloat(elems1[0]));
 			day1 = parseInt(parseFloat(elems1[1]));
			month2 = parseInt(parseFloat(elems2[0]));
 			day2 = parseInt(parseFloat(elems2[1]));
	} else {
 			day1 = parseInt(parseFloat(elems1[0]));
			month1 = parseInt(parseFloat(elems1[1]));
 			day2 = parseInt(parseFloat(elems2[0]));
			month2 = parseInt(parseFloat(elems2[1]));
	}
	year1 = parseInt(parseFloat(elems1[2]));
	year2 = parseInt(parseFloat(elems2[2]));

	// need to be careful here: dates should be converted to 4-digit years before being passed here! uses sqlserver date logic.
	if (year1 < 50) { 
		year1 += 2000;
	} else {
		if (year1 < 100) 
			year1 += 1900;
	}
	if (year2 < 50) { 
		year2 += 2000;
	} else {
		if (year2 < 100) 
			year2 += 1900;
	}
	
	if (year1 > year2) {
		result = false;
	} else {
		if (year1 < year2) {
			return true;
		} else { // years are identical
			if (month1 > month2) {
				result = false;
			} else {
				if (month1 < month2) {
					return true;
				} else { // years and months are identical
					if (day1 > day2) {
						result = false;
					} else {
						if (day1 <= day2) {
							return true;
						}
					}
				}
			}
		}
	}
	return result;
}

function confirmMatch(formField1, formField2, fieldLabel1, fieldLabel2)
{
	var result = true;
	
	if (formField1.value != formField2.value)
	{
		alert('Your entries for "' + fieldLabel1 +'" and "' + fieldLabel2 +'" must match.');
		formField1.value = "";
		formField2.value = "";
		formField1.focus();
		result = false;
		formField.className='FormError';
	}	
	return result;
}

function currfmt(num){
	var sign = "";
	if(isNaN(num))
		num = 0;
	if (num < 0.0) {
		sign = "-";
		num = -num;
	}
	var dol = Math.floor(num).toString();
	var cents = Math.floor((Math.abs(num)*100+.5)%100).toString();
	for (var i = 0; i < Math.floor((dol.length-1)/3)-i; i++)
		dol = dol.slice(0,-(4*i+3))+','+dol.slice(-(4*i+3));
	while (cents.length<2)
		cents = "0"+cents;
	return sign+dol+"."+cents;
}

// same as currfmt but does NOT insert commas....
function currfmt_nc(num){
	var sign = "";
	if(isNaN(num))
		num = 0;
	if (num < 0.0) {
		sign = "-";
		num = -num;
	}
	var dol = Math.floor(num).toString();
	var cents = Math.floor((Math.abs(num)*100+.5)%100).toString();
	while (cents.length<2)
		cents = "0"+cents;
	return sign+dol+"."+cents;
}

function parseDate(s) {
	var month, day, year;
	var str, elems, retdate;
	str = String(s);
	if (str.length < 6) { 
		retdate = new Date();
	} else {
		elems = str.split("/");
		if (elems.length == 3) {	// should be three components
			if (Intl_MonthFirst) {
					month = parseInt(parseFloat(elems[0]));
	 				day = parseInt(parseFloat(elems[1]));
			} else {
	 				day = parseInt(parseFloat(elems[0]));
					month = parseInt(parseFloat(elems[1]));
			}
			year = parseInt(parseFloat(elems[2]));
			
			retdate = new Date(year, month-1, day);
		} else {
			retdate = new Date();
		}
	}
	return retdate.valueOf();
}

function formatDateShort(dt) {
	var month, day, year;
	var retstr;
	month=dt.getMonth()+1;
	day=dt.getDate();
	year=dt.getFullYear();
	if (Intl_MonthFirst) {
		retstr = month+"/"+day+"/"+year;
	} else {
		retstr = day+"/"+month+"/"+year;
	}
	return retstr;
}

function checktextsize(f,fldname,maxlen) {
	var val;
	val=f.value; 
	if (val.length > maxlen) {
		alert('Sorry, you are over the limit of '+maxlen+' characters for the '+fldname+' field.'); 
		f.value = val.substring(0,maxlen); 
		f.focus();
	}
}
