
//javascript:window.history.forward(1);

function validateNotEmpty( strValue ) 
{
	/*******************************************************************************
	DESCRIPTION: Validates that a string is not all blank (whitespace) characters.
	PARAMETERS: strValue - String to be tested for validity
	RETURNS: True if valid, otherwise false.
	********************************************************************************/
	var strTemp = strValue;
	strTemp = trimAll(strTemp);
	if(strTemp.length > 0)
	{
		return true;
	}
	return false;
}

function validateInteger( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only  valid integer number.
PARAMETERS:   strValue - String to be tested for validity
RETURNS:   True if valid, otherwise false.
******************************************************************************/
  var objRegExp  = /(^-?\d\d*$)/;

  //check for integer characters
  return objRegExp.test(strValue);
}


function removeCommas( strValue ) {
/************************************************
DESCRIPTION: Removes commas from source string.

PARAMETERS:
  strValue - Source string from which commas will
    be removed;

RETURNS: Source string with commas removed.
*************************************************/
  var objRegExp = /,/g; //search for commas globally

  //replace all matches with empty strings
   return strValue.replace(objRegExp,'');
}



function trimAll( strValue ) 
{
	/*************************************************************
	DESCRIPTION: Removes leading and trailing spaces.
	PARAMETERS: Source string from which spaces will be removed;
	RETURNS: Source string with whitespaces removed.
	**************************************************************/
	var objRegExp = /^(\s*)$/;
	//check for all spaces
	if(objRegExp.test(strValue)) 
	{
		strValue = strValue.replace(objRegExp, '');
		if( strValue.length == 0)
			return strValue;
	}
   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) 
   {
		//remove leading and trailing whitespace characters
		strValue = strValue.replace(objRegExp, '$2');
	}
	return strValue;
}

function validateEmail( strValue) {
	/************************************************
	DESCRIPTION: Validates that a string contains a valid email pattern.
	PARAMETERS:  strValue - String to be tested for validity
	RETURNS: True if valid, otherwise false.
	REMARKS: Accounts for email with country appended does not validate that email contains valid URL
		  type (.com, .gov, etc.) or valid country suffix.
	*************************************************/


	var objRegExp  = /^[\w\.-]+@[\w-]+\.[\w\.-]+$/;

  //check for valid email
  return objRegExp.test(strValue);
}


function validateUSPhone( strValue ) 
{
	/************************************************
	DESCRIPTION: Validates that a string contains valid US phone pattern.  Ex. (999) 999-9999 or (999)999-9999
	PARAMETERS: strValue - String to be tested for validity
	RETURNS: True if valid, otherwise false.
	*************************************************/
  var objRegExp  = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;

  //check for valid us phone with or without space between area code
  return objRegExp.test(strValue);
}
function validateUSZip( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string a United States zip code in 5 digit format or zip+4  format. 99999 or 99999-9999
	PARAMETERS: strValue - String to be tested for validity
	RETURNS: True if valid, otherwise false.
	*************************************************/
var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;

  //check for valid US Zipcode
  return objRegExp.test(strValue);
}
function ValidateSSN(strValue) 
{
	var matchArr = strValue.match(/^(\d{3})-?\d{2}-?\d{4}$/);
	var numDashes = strValue.split('-').length - 1;
	if (matchArr == null || numDashes == 1) 
		return false;
	else 
	if (parseInt(matchArr[1],10)==0) 
		return false;
	else
		return true;
}



function comparedate(dateStr)
{    
    dateSer1=new Date(DateFromServer());
    dateStr1=new Date(dateStr);
    /***************/
   
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; 
	var matchArray = dateStr.match(datePat); 
	if (matchArray == null) 
	{				
		return false;
	}
	month = matchArray[1]; 
	day = matchArray[3];
	year = matchArray[4];
	if(year<1900)
	{
		return false;
	}
	if (month < 1 || month > 12)
	{ 
		return false;
	}
	
	if (day < 1 || day > 31)
	{			
		return false;
	}
	
	if ((month==4 || month==6 || month==9 || month==11) && day==31) 
	{
		return false;
	}
	if (month == 2)
	{ 
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day>29 || (day==29 && !isleap))
			{
			return false;
			}
	}			
//return true;
    /******************/
    if ( dateSer1.getFullYear()  - dateStr1.getFullYear() ==  18)
	{
		if ( dateSer1.getMonth()-dateStr1.getMonth()>=0)
		{
			if ( dateSer1.getDate()-dateStr1.getDate()>=0)
				return true;
			else
				return false;
		}
		else
			return false;
	}
	else if  ( dateSer1.getFullYear() - dateStr1.getFullYear()>  18)
		return true;
	else
		return false;

}

function validateUSDate(dateStr ) 
{  
			var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/; 
			var matchArray = dateStr.match(datePat); 
			if (matchArray == null) 
			{				
				return false;
			}
			month = matchArray[1]; 
			day = matchArray[3];
			year = matchArray[4];
			if(year<1900)
			{
				return false;
			}
			if (month < 1 || month > 12)
			{ 
				return false;
			}
			
			if (day < 1 || day > 31)
			{			
				return false;
			}
			
			if ((month==4 || month==6 || month==9 || month==11) && day==31) 
			{
				return false;
			}
			if (month == 2)
			{ 
				var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
				if (day>29 || (day==29 && !isleap))
				 {
					return false;
				}
			}			
return true;
}

function validateUSDate1( strValue ) {
	/************************************************
	DESCRIPTION: Validates that a string contains only 	valid dates with 2 digit month, 2 digit day,
    	4 digit year. Date separator can be ., -, or /.	Uses combination of regular expressions and
    	string parsing to validate date. Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy
	PARAMETERS: strValue - String to be tested for validity
	RETURNS: True if valid, otherwise false.
	REMARKS:Avoids some of the limitations of the Date.parse() method such as the date separator character.
	*************************************************/

  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/

  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else{
    var strSeparator = strValue.substring(2,3) //find date separator
    var arrayDate = strValue.split(strSeparator); //split date into month, day, year
    //create a lookup for months not equal to Feb.
    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    var intDay = parseInt(arrayDate[1]);

    //check if month value and day value agree
    if(arrayLookup[arrayDate[0]] != null) {
      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
        return true; //found in lookup table, good date
    }

    //check for February
    var intYear = parseInt(arrayDate[2]);
    var intMonth = parseInt(arrayDate[0]);
    if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0)
      return true; //Feb. had valid number of days
  }
  return false; //any other values, bad date
}

function validateControls(validationsArray)
{
	/*************************************************************
	DESCRIPTION: Validate controls against validators, calls markInvalid and markValid functions.
	PARAMETERS: Array of custom objects containing controls, validators, labels and error message.
	RETURNS: true if all controls are valid otherwise false.
	**************************************************************/
	var markInvalidArray = new Array();
	var markValidArray = new Array();
	//alert("in js file")
	var invalidFlag = false ;
	var j = 0, k = 0 ;
	var objControl ;
	for ( var i = 0 ; i < validationsArray.length ; i++ )
	{
		switch ( validationsArray[i].validator )
		{
			case "validateNotEmpty":
				objControl = document.getElementById(validationsArray[i].controlId);
				if ( validateNotEmpty(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}					
			break;
			
			case "validateEmail":
				objControl = document.getElementById(validationsArray[i].controlId);
				if ( validateEmail(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}					
			break;
			
			case "validateCombo":
				objControl = document.getElementById(validationsArray[i].controlId);
								
				if ( objControl.options[objControl.selectedIndex].value == "[Select One]" ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}					
			break ;
			
			case "validateComboZero":
				objControl = document.getElementById(validationsArray[i].controlId);
								
				if ( objControl.options[objControl.selectedIndex].value == "0" ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}					
			break ;			
			
			case "validateUSPhone":
				objControl = document.getElementById(validationsArray[i].controlId);
				if ( validateUSPhone(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}					
			break ;

			case "validateUSDate":
				objControl = document.getElementById(validationsArray[i].controlId);
				if ( validateUSDate(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}
			break;

			case "validateUSZip":
				objControl = document.getElementById(validationsArray[i].controlId);
			if ( validateUSZip(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}
			break;

			case "ValidateSSN":
				objControl = document.getElementById(validationsArray[i].controlId);
			if ( ValidateSSN(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}
			break;

			case "validatePasswordCompare":			

					// separate object IDs and obtain objects
					var stringa = validationsArray[i].controlId;
					id1=stringa.substring ( 0, stringa.indexOf ( "^") ) ;
					id2=stringa.substring ( stringa.indexOf ( "^") + 1, stringa.length) ;
					var objControl1 = document.getElementById(id1);
					var objControl2 = document.getElementById(id2);

					var stringb = validationsArray[i].controlId;
					id3=stringb.substring ( 0, stringb.indexOf ( "^") ) ;
					id4=stringb.substring ( stringb.indexOf ( "^") + 1, stringb.length) ;

					if ( validatePasswordCompare(objControl1.value,objControl2.value) == false ) {
							markInvalidArray[j] = id3; j++ ; 
							markInvalidArray[j] = id4; j++ ; 
							invalidFlag = true ; 
							} else {
							markValidArray[k] = id3; k++ ;
							markValidArray[k] = id4; k++ ;
							}
					break;
			case "validateinteger":
				// check integer
				objControl = document.getElementById(validationsArray[i].controlId);
					if ( validateNotEmpty(objControl.value) == false )
					{
						markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} 
					else 
					{
						var obj = removeCommas(objControl.value) 
						if  ( validateInteger( obj ) == false )
						{
							markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
						}
						else
						{
							markValidArray[k] = validationsArray[i].controlId ; k++ 
						}
					}
												
			break;
			case "comparedate":
			
			objControl = document.getElementById(validationsArray[i].controlId);
				if ( comparedate(objControl.value) == false ) {
					markInvalidArray[j] = validationsArray[i].controlId ; j++ ; invalidFlag = true ; 
					} else {
					markValidArray[k] = validationsArray[i].controlId ; k++ ;
					}
			break;
		}
	}
	
	if ( invalidFlag == true )
	{
		markInvalid(markInvalidArray)
		markValid (markValidArray)
	}
	else
		markValid (markValidArray)
		
	return invalidFlag ;
}

function markInvalid(markInvalidArray)
{
	/*************************************************************
	DESCRIPTION: Makes labels of invalid controls visible.
	PARAMETERS: Array of labels to be made visible. 
	RETURNS: Nothing.
	**************************************************************/
	for ( var i = 0 ; i < markInvalidArray.length ; i++ )
	{
		var objLabel = document.getElementById(markInvalidArray[i]);
		objLabel.style.backgroundColor ="YELLOW" ;

	}
}

function markValid(markValidArray)
{
	/*************************************************************
	DESCRIPTION: Makes labels of valid controls hidden.
	PARAMETERS: Array of labels to be made hidden. 
	RETURNS: Nothing.
	**************************************************************/
	for ( var i = 0 ; i < markValidArray.length ; i++ )
	{
		var objLabel = document.getElementById(markValidArray[i]);
		objLabel.style.backgroundColor = "#F6F6F6" ;
	}
}

function validation ( controlId, validator, label, errorMessage )
{
	/*************************************************************
	DESCRIPTION: This creates a validation object.
	PARAMETERS: Control, Validator and Label.
	RETURNS: Nothing.
	**************************************************************/
	this.controlId = controlId;
	this.validator = validator;
	this.label= label;
	this.errorMessage = errorMessage;
}


function validatePasswordCompare(first, second)
{
	if ( validateNotEmpty( first ) == false || validateNotEmpty( second ) == false )
		return false ;

	if ( first.length < 3 || second.length < 3 )
		return false ;

	return ( first == second ) ? true : false ;
}
