function validator(formName)
{
	this.formName = formName;
	this.fields = null;
	this.type = 1;
	
	
	this.setType = function(_tmpType)
	{
		this.type = _tmpType;
	}
	
	this.setFields = function(_tmpFields)
	{
		this.fields = _tmpFields;
	}
	
	this.validateAndSubmit = function()
	{
		 
		if (this.validatFormFields())
		{
			var _vForm = eval("document." + this.formName);
			_vForm.submit();
		}
		
		
	}
	this.validatFormFields = function()
	{
		var errors = new Array();
		var _vForm = eval("document." + this.formName);
		var _errorMsg = "";
		
		var _tempFirstField = null;
		
		for (var i=0;i<this.fields.length; i++)
		{
			
			
			var _tempField = this.fields[i];
			var _tempFunc = _tempField.func;
			
			var _vField = eval("document." + this.formName + "." +  _tempField.fieldName);
			if (_vField == null)
			{
					alert (_tempField.fieldName + " cannot be found. please check");
					return false;
			}
			var _vValue = _vField.value;
			
			
			if (((_vField.type+"").indexOf("text")!=-1) || ((_vField.type+"").indexOf("password")!=-1))
			{
				if (eval(_tempFunc).call(this, _vValue,_vField))
				{
					if (_tempFirstField == null)
					{
						_tempFirstField = _vField;
					}
					errors[errors.length] = _tempField.errorMsg;
				}
			}
			else
			{
				if (eval(_tempFunc).call(this, _vField))
				{
					if (_tempFirstField == null)
					{
						_tempFirstField = _vField;
					}
					errors[errors.length] = _tempField.errorMsg;
				}
			}
		}
		
		
		for (var i=0; i < errors.length; i++)
		{
			_errorMsg += errors[i] + "\n";
		}
		
		if (errors.length > 0)
		{
			alert (_errorMsg);
			
			if ((_tempFirstField.type+"").indexOf("text")!=-1)
			{
				_tempFirstField.focus();
			}
			else if ((_tempFirstField.type+"").indexOf("select")!=-1)
			{
				_tempFirstField.focus();
			}
			else if ((_tempFirstField.type+"").indexOf("password")!=-1)
			{
				_tempFirstField.focus();
			}
			else if(_tempFirstField.length > 0)
			{
				_tempFirstField[0].focus();
			}
			else
			{
				_tempFirstField.focus();
			}
			
		}
		else
		{
			return true;
		}
		return false;
	}
}

function fieldValidator(fieldName,errorMsg,func)
{
	this.fieldName = fieldName;
	this.errorMsg = errorMsg;
	this.func = func;
}


//========================================HELPER METHODS========================

function isBlank(str)
{
	try
	{
		var found = str.match(/\S+/);
		if(found==null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	catch (e)
	{
		
	}
}

function isNotBlank(str)
{
	return !isBlank(str);
}

function isNoneSelected (field)
{
	if (field.selectedIndex == -1)
	{
		return true;
	}
	return false;
}

function isEmptySelected (field)
{
	if (field[field.selectedIndex].value == "")
	{
		return true;
	}
	return false;
}

function isFirstSelected (field)
{
	if (field.selectedIndex == 0)
	{
		return true;
	}
	return false;
}
function isNotChecked(field)
{
	var checked = false;
	for (var i=0; i < field.length; i++)
	{
		if (field[i].checked)
		{
			checked = true;
		}
	}
	return !checked;
}

function validatePhone (phoneNumber)
{
	// accepts -().0123456789.
	// needs to have atleast 10 numbers.
	phoneNumber = trim(phoneNumber);
	
	if (phoneNumber.length < 10)
		return false;
	
	validEntries = " -().0123456789";
	numbers = "0123456789";
	
	numOfDigits = 0;
	validPhoneNumber = "";
	for (i=0; i < phoneNumber.length; i++)
	{
		// checks if the phone has invalid characters
		if (validEntries.indexOf(phoneNumber.charAt(i))==-1)
			return false;
			
		if (numbers.indexOf(phoneNumber.charAt(i))!= -1)
		{
			numOfDigits = numOfDigits + 1;
		}
	}	
	
	if (numOfDigits != 10)
	{
		return false;
	}		
	
	return true;
}

function isInvalidEmail(email) 
{
	if (!validEmail(email))
	{
		return true;
	}
	return false;
}

function validEmail(email) 
 {
	invalidChars = " /:,;"
	if (email == "") {
		return false
	}
	for (i=0; i<invalidChars.length; i++) {
		   badChar = invalidChars.charAt(i)
		   if (email.indexOf(badChar,0) != -1) {
				   return false
		   }
	}
   
	atPos = email.indexOf("@",1)
	if (atPos == -1) {
	  return false
	}

	if (email.indexOf("@",atPos+1) != -1) {
	  return false
	}

	periodPos = email.indexOf(".",atPos+1)
	if (periodPos == -1) {
	  return false
	}	     
	      		
	/*	
	if (periodPos+3 > email.length || periodPos+4 < email.length) {
	  return false
	}
	*/
	
	return true
}

function trim(inputString) {
   // Removes leading and trailing spaces from the passed string. If something besides
   // a string is passed in (null, custom object, etc.) then return the input.
   if (typeof inputString != "string") { return inputString; }
   var retValue = inputString;
   var ch = retValue.substring(0, 1);
   while (ch == " ") { // Check for spaces at the beginning of the string
      retValue = retValue.substring(1, retValue.length);
      ch = retValue.substring(0, 1);
   }
   ch = retValue.substring(retValue.length-1, retValue.length);
   while (ch == " ") { // Check for spaces at the end of the string
      retValue = retValue.substring(0, retValue.length-1);
      ch = retValue.substring(retValue.length-1, retValue.length);
   }
   return retValue; // Return the trimmed string back to the user
} // Ends the "trim" function


function isOlderDate (iDate)
{
	//not a date is automatically invalid
	if (isInvalidDate(iDate))
	{
		return true;
	}
	
	var sdate = iDate.split("/");
	var tempDateObj=new Date(Date.parse(iDate));
	
	var dNow = new Date();
	
	if (dNow > tempDateObj)
	{
		return true; 
	}
	return false;
	
	
}

function isInvalidDate(datein)
{
	if (!validDateMMDDYYYY(datein))
	{
		return true;
	}
	return false;
}

if (!Date.prototype.getFullYear) { // needs full test, all browsers
  Date.prototype.getFullYear =
    new Function("return (X=this.getYear())>999 ? X : 1900+X") }
    

function validDateMMDDYYYY(datein)
{
   var indate=datein;
   var sdate = indate.split("/");
   
   var chkDate=new Date(Date.parse(indate))
   var cmpDate=(chkDate.getMonth()+1)+"/"+(chkDate.getDate())+"/"+(chkDate.getFullYear())
   var indate2=(Math.abs(sdate[0]))+"/"+(Math.abs(sdate[1]))+"/"+(Math.abs(sdate[2]))

   var pos1=datein.indexOf("/")
   var pos2=datein.indexOf("/",pos1+1)
   var strYear=datein.substring(pos2+1)
   
   if (strYear.length < 4)
   {
		return false;
   }
   else
   {
	   //alert (indate2 + "====" + cmpDate); 
	   if (indate2!=cmpDate)
	   {
		   return false;
	   }
	   else 
	   {
		   if (cmpDate=="NaN/NaN/NaN")
		   {
			   return false;
		   }
	   }
   }
   return true;
}

function validDateMMDDYY(datein)
{
   var indate=datein;
   var sdate = indate.split("/")
   
   var chkDate=new Date(Date.parse(indate))
   var cmpDate=(chkDate.getMonth()+1)+"/"+(chkDate.getDate())+"/"+(chkDate.getYear())
   var indate2=(Math.abs(sdate[0]))+"/"+(Math.abs(sdate[1]))+"/"+(Math.abs(sdate[2]))

   var pos1=datein.indexOf("/")
   var pos2=datein.indexOf("/",pos1+1)
   var strYear=datein.substring(pos2+1)
   
   if (strYear.length < 2)
   {
	//	alert("You've entered an invalid date or date format.  Please use the mm/dd/yy format.");
		return false;
   }
   else
   {
   
	   if (indate2!=cmpDate)
	   {
		//   alert("You've entered an invalid date or date format.  Please use the mm/dd/yy format.");
		   return false;
	   }
	   else 
	   {
		   if (cmpDate=="NaN/NaN/NaN")
		   {
			//   alert("You've entered an invalid date or date format.  Please use the mm/dd/yy format.");
			   return false;
		   }
	   }
   }
   return true;
}

function isNonnegativeInteger (number)
{
	return (!isNaN(number)) && number > 0;
}

function isNotInteger(number)
{
	if (isInteger(number))
	{
		return false;
	}
	return true;
}
function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function getNumOfCharactersInHtml(targetString)
{
	// see http://www.ascii.cl/htmlcodes.htm for codes
	var htmlCarriageReturn = "<br>";
	var htmlTradeMark = "&#8482;";
	var htmlRegisteredTradeMarks = "&#174;";
	var htmlCopyrights = "&#169;";
	var htmlEngravedRightDoubleQuotes = "&#8221;";
	var htmlEngravedLeftDoubleQuotes = "&#8220;";
	var htmlEngravedRightSingleQuotes = "&#8217;";
	var htmlEngravedLeftSingleQuotes = "&#8216;";
	var htmlEmDash = "&#8212;";
	var numOfCarriageReturns = 0;
	var numOfTradeMarks = 0;
	var numOfRegisteredTradeMarks = 0;
	var numOfCopyrights = 0;
	var numOfEngravedRightDoubleQuotes = 0;
	var numOfEngravedLeftDoubleQuotes = 0;
	var numOfEngravedRightSingleQuotes = 0;
	var numOfEngravedLeftSingleQuotes = 0;
	var numOfEmDash = 0;
	
	var tempString = targetString;
	// count number of carriage returns
	while (tempString.indexOf("\n")!=-1)
	{
		numOfCarriageReturns = numOfCarriageReturns+1;
		tempString = tempString.substring(tempString.indexOf("\n")+1);
	}
	
	// count number of trade mark symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfTradeMarks = numOfTradeMarks+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of registered trade mark symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfRegisteredTradeMarks = numOfRegisteredTradeMarks+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of copyright symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfCopyrights = numOfCopyrights+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of right engraved double quotes symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfEngravedRightDoubleQuotes = numOfEngravedRightDoubleQuotes+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of left engraved double quotes symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfEngravedLeftDoubleQuotes = numOfEngravedLeftDoubleQuotes+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of right engraved single quotes symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfEngravedRightSingleQuotes = numOfEngravedRightSingleQuotes+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of left engraved single quotes symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfEngravedLeftSingleQuotes = numOfEngravedLeftSingleQuotes+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	// count number of em dash symbol
	tempString = targetString;
	while (tempString.indexOf("?")!=-1)
	{
		numOfEmDash = numOfEmDash+1;
		tempString = tempString.substring(tempString.indexOf("?")+1);
	}
	
	
	var totalCharLength = 
		(targetString.length 
		- numOfCarriageReturns - numOfTradeMarks 
		- numOfRegisteredTradeMarks - numOfCopyrights 
		- numOfEngravedRightDoubleQuotes - numOfEngravedLeftDoubleQuotes
		- numOfEngravedRightSingleQuotes - numOfEngravedLeftSingleQuotes
		- numOfEmDash) 
		+ (numOfCarriageReturns * htmlCarriageReturn.length) 
		+ (numOfTradeMarks * htmlTradeMark.length)
		+ (numOfRegisteredTradeMarks * htmlRegisteredTradeMarks.length)
		+ (numOfCopyrights * htmlCopyrights.length)
		+ (numOfEngravedRightDoubleQuotes * htmlEngravedRightDoubleQuotes.length)
		+ (numOfEngravedLeftDoubleQuotes * htmlEngravedLeftDoubleQuotes.length)
		+ (numOfEngravedRightSingleQuotes * htmlEngravedRightSingleQuotes.length)
		+ (numOfEngravedLeftSingleQuotes * htmlEngravedLeftSingleQuotes.length)
		+ (numOfEmDash * htmlEmDash.length);
		
	return totalCharLength;
}

function isDateValid(day, month, year) {
 
	var dteDate=new Date(year,month,day);
	
	return ((day==dteDate.getDate()) && (month==dteDate.getMonth()) && (year==dteDate.getFullYear()));
 
} 

function isDocTxtPdfFile(fileInput)
{
	var ext = getFileExtension(fileInput);
	if( ext.toLowerCase() == ".pdf" || ext.toLowerCase() == ".txt" || ext.toLowerCase() == ".doc" || ext.toLowerCase() == ".docx") 
	{
		return false;
	} 
	return true;
}

function getFileExtension(inputId) 
{ 
	 var fileinput = inputId; 
	 if(!fileinput ) return ""; 
	 var filename = fileinput.value; 
	 if( filename.length == 0 ) return ""; 
	 var dot = filename.lastIndexOf("."); 
	 if( dot == -1 ) return ""; 
	 var extension = filename.substr(dot,filename.length);
	 return extension; 
} 
 



