// Function to check for valid email format before an email address 
// is saved into database
function isValidEmail(emailAddressStr)
{
	// A valid email addresses must be of form ---@---.---	
	// The position of "@" must not be 0, and must be more than 1 position to the left of the "."
	// Additional "." characters may also be located anywhere in the address.
	
	var index1 = 0;
	var index2 = 0;
	var index3 = -1;
	var lastDot = 0;
	
	// check first to see that address does not end with a '.'
	lastDot = emailAddressStr.indexOf('.',(emailAddressStr.length -1));
	if (lastDot != -1) 
	{
		return false;
	}
	// check for existence of @
	index1 = emailAddressStr.indexOf('@',0);
	if ((index1 == -1) || (index1 == 0))
	{
		return false;
	}
	else
	{
		// check for illegal 2nd occurrence of '@'
		index3 = emailAddressStr.indexOf('@',(index1 +1));
		if (index3 != -1)
		{
			return false;
		}
	}
	
	// check for existence of at least one "." following the "@" by at least 1 character
	index2 = emailAddressStr.indexOf('.',index1);		
	if(index2 == -1)		// no "." at all
	{
		return false;
	}
	else					// see if there is 1 "." that is following the "@" appropriately
	{			  
		do
		{
			if((index1+1) < index2)
			{
				
				return true;
			}		
				
			index2 = emailAddressStr.indexOf('.',index2 +1);
			if(index2 == -1)
			{
				return false;
			}	
		}
	
		while(!(index2 == -1))		
	}
	return true;
}

// function to do general form validation.
//	Form fields named according to the following convention
//		will be check for valid contents.
//	Name matching this  RE - [ro][ceif]_.*
//		where the first character indicates required (r) or optional (o)
//			  the second character indicates type of field
//					i - integer field
//					f - float field
//					c - character field
//					e - email address field
//				the portion following the _ is the field name - this portion
//					will be displayed in the error message about the field, any
//					_'s in this portion will be replaced with spaces in the error
//					message
//  Hidden, submit and image type fields will be ignored in this validation
//	select fields with a selected value of #err.* will display the string following #err
//			as an error message
//	Returns true if no validation problems, returns false when first error is encountered
function GeneralValidation(theForm)
{
	re = /\s/g; 
	for (i = 0; i < theForm.length; i++)
	{
		fieldType = theForm.elements[i].type;
		fieldName = theForm.elements[i].name;
		if (fieldType == "password" || fieldType == "text" || fieldType == "textarea" || fieldType == "file")
		{
			found = fieldName.match(/^[ro][ceifd]_/);
			if (found != null && found.length > 0)
			{
				messageName = fieldName.substr(3).replace(/_/g, " ");
				if (fieldName.substr(0,1) == 'r')
				{
					if (theForm.elements[i].value.replace(re,'').length == 0)
					{
						alert(messageName + " is a required field.");
						theForm.elements[i].focus();
						return false;
					}
				}
				fieldDataType = fieldName.substr(1,1);
				if (fieldDataType == "f")
				{	// float field
					if (theForm.elements[i].value.replace(re,'').length > 0 && ((theForm.elements[i].value.indexOf(",") != -1)
							|| isNaN(parseFloat(theForm.elements[i].value))
							|| theForm.elements[i].value != parseFloat(theForm.elements[i].value)))
					{
						alert(messageName + " field must contain a decimal number.\nIt must not contain currency symbols or commas.");
						theForm.elements[i].focus();
						return false;
					}
				}
				else if (fieldDataType == "i")
				{	// integer field
					if (theForm.elements[i].value.replace(re,'').length > 0 && ((theForm.elements[i].value.indexOf(",") != -1)
							 || isNaN(parseInt(theForm.elements[i].value))
							 || theForm.elements[i].value != parseInt(theForm.elements[i].value)))
					{
						alert(messageName + " field must contain an integer. \nIt must not contain currency symbols or commas.");
						theForm.elements[i].focus();
						return false;
					}
				}
				else if (fieldDataType == "e")
				{	// email address field
					if (theForm.elements[i].value.replace(re,'').length > 0)
					{
						emailArray = theForm.elements[i].value.split(",");
						for (j = 0; j < emailArray.length; j++)
						{
							email = emailArray[j].replace(/ */,""); //remove any spaces
							if (!isValidEmail(email))
							{
								alert(messageName + " contains an invalid email address.");
								theForm.elements[i].focus();
								return false;
							}
						}
					}
				}
				else if (fieldDataType == "d")
				{	// a data field
					if (theForm.elements[i].value.replace(re,'').length > 0)
					{
						d = parseDate(theForm.elements[i].value)
						if (d == null)
						{
							alert(messageName + " is not a valid date.");
							theForm.elements[i].focus();
							return false;
						}
					}
				}
			}
		}
		if (typeof fieldType != "undefined")
		{
			if (fieldType.indexOf("select-one") == 0 && fieldName.substr(0,1) == 'r' && theForm.elements[i].disabled == false)
			{
				if (theForm.elements[i].options[theForm.elements[i].selectedIndex].value.indexOf("#err") != -1)
				{
					// Display error message that is included as part of the value of the option. Strips off #err
					//	before displaying.
					alert(theForm.elements[i].options[theForm.elements[i].selectedIndex].value.substr(4));
					theForm.elements[i].focus();
					return false;
				}
			}
		}
	}
	return true;
}
//Function to check for valid credit card expiration date
function isValidExpirationDate(expMo, expYr)
{
	today = new Date();
	if ((parseInt(expYr) < today.getFullYear()) ||
			((parseInt(expYr) == today.getFullYear()) && parseInt(expMo) < (today.getMonth() + 1)))
		return false
	else
		return true
}
//Function to check for valid credit card number
function isValidCreditCardNumber(ccType, ccNumber)
{
	if (ccNumber.length == 0)
		return false;
				
	/* get rid of any non-numeric characters in the number */
	cardNum = new String();
	for (i = 0; i < ccNumber.length; i++)
	{
		c = ccNumber.charAt(i);
		if (c >= '0' && c <= '9')
		{
			cardNum = cardNum + c
		}
	}
	switch (parseInt(ccType))
	{
		case 0:	/* Visa */
			cclength="13;16";
			ccprefix="4";
			break;
		case 1: /* MasterCard */
			cclength="16";
			ccprefix="51;52;53;54;55";
			break;
		case 2: /* American Express */
			cclength="15";
			ccprefix="34;37";
			break;
		case 3: /* DiscoverCard */
			cclength="16";
			ccprefix="6011";
			break;
		case 4: /* Diner Card */
			cclength="14";
			ccprefix="300;301;302;303;304;305;36;38";
			break;
		case 5: /* EuroCard */
			break;
		case 6: /* BancCard */
			break;
		case 7: /* JBC */
			cclength="15;16";
			ccprefix="3;2131;1800";
			break;
		default:
			alert("Invalid card type");
						
	}
	lengths = cclength.split(';');
	prefixes = ccprefix.split(';');
	validprefix = false;
	validlength = false;
	validchecksum = false;
	for (i = 0; i < prefixes.length; i++)
	{
		if (cardNum.indexOf(prefixes[i]) == 0)
		{
			validprefix = true;
		}
	}
	for (i = 0; i < lengths.length; i++)
	{
		if (cardNum.length == parseInt(lengths[i]))
		{
			validlength = true;
		}
	}
	var qsum = 0;
	var sum = 0;
	for (i = 0; i < cardNum.length; i++)
	{
		c = parseInt(cardNum.charAt(cardNum.length-i-1));
		if ((i+1) % 2 == 0)
		{
			sum = c * 2;
			qsum = qsum + (sum % 10);
			if (sum > 9)
			{
				qsum++;
			}
		}
		else
		{
			qsum = qsum + c;
		}
	}
	if (qsum % 10 == 0)
	{
		validchecksum = true;
	}
	if (!validlength || !validprefix || !validchecksum)
		return false
	else
		return true
}


// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.
//
// You may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used. You
// may not put the plain javascript up on your site for download or
// include it in your javascript libraries for download. 
// If you wish to share this code with others, please just point them
// to the URL instead.
// Please DO NOT link directly to my .js files from your site. Copy
// the files to your server and use them there. Thank you.
// ===================================================================

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x){return(x<0||x>9?"":"0")+x}
function isDate(val,format){var date=getDateFromFormat(val,format);if(date==0){return false;}return true;}
function compareDates(date1,dateformat1,date2,dateformat2){var d1=getDateFromFormat(date1,dateformat1);var d2=getDateFromFormat(date2,dateformat2);if(d1==0 || d2==0){return -1;}else if(d1 > d2){return 1;}return 0;}
function formatDate(date,format){format=format+"";var result="";var i_format=0;var c="";var token="";var y=date.getYear()+"";var M=date.getMonth()+1;var d=date.getDate();var E=date.getDay();var H=date.getHours();var m=date.getMinutes();var s=date.getSeconds();var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;var value=new Object();if(y.length < 4){y=""+(y-0+1900);}value["y"]=""+y;value["yyyy"]=y;value["yy"]=y.substring(2,4);value["M"]=M;value["MM"]=LZ(M);value["MMM"]=MONTH_NAMES[M-1];value["NNN"]=MONTH_NAMES[M+11];value["d"]=d;value["dd"]=LZ(d);value["E"]=DAY_NAMES[E+7];value["EE"]=DAY_NAMES[E];value["H"]=H;value["HH"]=LZ(H);if(H==0){value["h"]=12;}else if(H>12){value["h"]=H-12;}else{value["h"]=H;}value["hh"]=LZ(value["h"]);if(H>11){value["K"]=H-12;}else{value["K"]=H;}value["k"]=H+1;value["KK"]=LZ(value["K"]);value["kk"]=LZ(value["k"]);if(H > 11){value["a"]="PM";}else{value["a"]="AM";}value["m"]=m;value["mm"]=LZ(m);value["s"]=s;value["ss"]=LZ(s);while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++);}if(value[token] != null){result=result + value[token];}else{result=result + token;}}return result;}
function _isInteger(val){var digits="1234567890";for(var i=0;i < val.length;i++){if(digits.indexOf(val.charAt(i))==-1){return false;}}return true;}
function _getInt(str,i,minlength,maxlength){for(var x=maxlength;x>=minlength;x--){var token=str.substring(i,i+x);if(token.length < minlength){return null;}if(_isInteger(token)){return token;}}return null;}
function getDateFromFormat(val,format){val=val+"";format=format+"";var i_val=0;var i_format=0;var c="";var token="";var token2="";var x,y;var now=new Date();var year=now.getYear();var month=now.getMonth()+1;var date=1;var hh=now.getHours();var mm=now.getMinutes();var ss=now.getSeconds();var ampm="";while(i_format < format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c) &&(i_format < format.length)){token += format.charAt(i_format++);}if(token=="yyyy" || token=="yy" || token=="y"){if(token=="yyyy"){x=4;y=4;}if(token=="yy"){x=2;y=2;}if(token=="y"){x=2;y=4;}year=_getInt(val,i_val,x,y);if(year==null){return 0;}i_val += year.length;if(year.length==2){if(year > 70){year=1900+(year-0);}else{year=2000+(year-0);}}}else if(token=="MMM"||token=="NNN"){month=0;for(var i=0;i<MONTH_NAMES.length;i++){var month_name=MONTH_NAMES[i];if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()){if(token=="MMM"||(token=="NNN"&&i>11)){month=i+1;if(month>12){month -= 12;}i_val += month_name.length;break;}}}if((month < 1)||(month>12)){return 0;}}else if(token=="EE"||token=="E"){for(var i=0;i<DAY_NAMES.length;i++){var day_name=DAY_NAMES[i];if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()){i_val += day_name.length;break;}}}else if(token=="MM"||token=="M"){month=_getInt(val,i_val,token.length,2);if(month==null||(month<1)||(month>12)){return 0;}i_val+=month.length;}else if(token=="dd"||token=="d"){date=_getInt(val,i_val,token.length,2);if(date==null||(date<1)||(date>31)){return 0;}i_val+=date.length;}else if(token=="hh"||token=="h"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>12)){return 0;}i_val+=hh.length;}else if(token=="HH"||token=="H"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>23)){return 0;}i_val+=hh.length;}else if(token=="KK"||token=="K"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>11)){return 0;}i_val+=hh.length;}else if(token=="kk"||token=="k"){hh=_getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>24)){return 0;}i_val+=hh.length;hh--;}else if(token=="mm"||token=="m"){mm=_getInt(val,i_val,token.length,2);if(mm==null||(mm<0)||(mm>59)){return 0;}i_val+=mm.length;}else if(token=="ss"||token=="s"){ss=_getInt(val,i_val,token.length,2);if(ss==null||(ss<0)||(ss>59)){return 0;}i_val+=ss.length;}else if(token=="a"){if(val.substring(i_val,i_val+2).toLowerCase()=="am"){ampm="AM";}else if(val.substring(i_val,i_val+2).toLowerCase()=="pm"){ampm="PM";}else{return 0;}i_val+=2;}else{if(val.substring(i_val,i_val+token.length)!=token){return 0;}else{i_val+=token.length;}}}if(i_val != val.length){return 0;}if(month==2){if( ((year%4==0)&&(year%100 != 0) ) ||(year%400==0) ){if(date > 29){return 0;}}else{if(date > 28){return 0;}}}if((month==4)||(month==6)||(month==9)||(month==11)){if(date > 30){return 0;}}if(hh<12 && ampm=="PM"){hh=hh-0+12;}else if(hh>11 && ampm=="AM"){hh-=12;}var newdate=new Date(year,month-1,date,hh,mm,ss);return newdate.getTime();}
function parseDate(val){var preferEuro=(arguments.length==2)?arguments[1]:false;generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');var d=null;for(var i=0;i<checkList.length;i++){var l=window[checkList[i]];for(var j=0;j<l.length;j++){d=getDateFromFormat(val,l[j]);if(d!=0){return new Date(d);}}}return null;}



