
// Form Validation that displays inline error messages and highlights invalid form elements.


//Check Empty Text Field
function isEmpty(fld,msgBox) {
	var notValid = true;
	var errMsg;
	
    if (fld.value.length == 0) {
		errMsg = "The required field has not been filled in.\n";	
		displayError(fld,msgBox,errMsg);
    } else {
		resetDisplay(fld,msgBox);
		notValid = false;
    }

    return notValid;  
	
}
//Check number
function invalidPosInteger(fld,msgBox) {
	var numericExpression = /^[0-9]+$/;

 	var notValid = true;	
	var errMsg;
	if (fld.value == "") {
		errMsg = "The required field is blank.\n";
		displayError(fld,msgBox,errMsg);
	}
	else if(!(fld.value.match(numericExpression))) {
		errMsg = "The required field is not a valid number.\n";
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	
	return notValid;
}

//Check number
function invalidNumber(fld,msgBox) {
	var numericExpression = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;

 	var notValid = true;	
	var errMsg;
	if (fld.value == "") {
		errMsg = "The required field is blank.\n";
		displayError(fld,msgBox,errMsg);
	}
	else if(isNaN(fld.value)) {
		errMsg = "The required field is not a valid number.\n";
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	
	return notValid;
}

// Check range
function outOfRange(fld,msgBox, minVal,maxVal) {
	var notValid = true;
	var errMsg;
	
	if (isNaN(fld.value)) {
		errMsg = "The required field is not a valid number.\n";
		displayError(fld,msgBox,errMsg);
	} else if((fld.value<=minVal)&&(fld.value>=maxVal)) {
		errMsg = "The required field must be between "+minVal+" and "+maxVal+" \n";
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	return notValid;
	
}

//Check number of digits

function invalidDigits(fld,msgBox,numDigits) {
 	var notValid = true;	
	var errMsg;
	
	if(isNaN(fld.value)) {
		
		errMsg = "The required field is not a valid number.\n";
		displayError(fld,msgBox,errMsg);
	} else if(fld.value.length != numDigits) {
		errMsg = "The required field must have "+numDigits+" digits.\n"
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	
	return notValid;
}


//Check for Valid Date

function invalidDate(fld, msgBox) {
    var RegExPattern = /^([0-9]){2}(\/|-){1}([0-9]){2}(\/|-)([0-9]){4}$/;
 	var notValid = true;	
	var errMsg;
	
	if(fld.value.length==0) {
		errMsg = "The required field is not a validate date.\n";
		displayError(fld,msgBox,errMsg);
	} else if(!fld.value.match(RegExPattern)) {
		errMsg = "The format is invalid. Please enter valid date as mm/dd/yyyy (i.e. 04/15/2009).\n";
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	return notValid;

}
//Check Dollar Format
function invalidDollar(fld, msgBox) {
    var RegExPattern = /^\$?[1-9][0-9]{0,2}(,[0-9]{3})*(\.[0-9]{2})?$/;
 	var notValid = true;	
	var errMsg;
	
	if(fld.value.length==0) {
		errMsg = "The required field is blank.\n";
		displayError(fld,msgBox,errMsg);
	} else if(!fld.value.match(RegExPattern)) {
		errMsg = "The required field is in an invalid format. Please enter a dollar amount (i.e $99.99).\n";
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	return notValid;

}

//Check for Valid Username
function invalidUsername(fld,msgBox,minLength,maxLength) {
	var notValid = true;
	var errMsg;	
    var illegalChars = /\W/; // allow letters, numbers, and underscores
 
    if (fld.value == "") {
		
		errMsg = "You didn't enter a username.\n";
        displayError(fld,msgBox,errMsg);
        
    } else if ((fld.value.length < minLength) || (fld.value.length > maxLength)) {
		
		errMsg = "The username is the wrong length.\n";
       	displayError(fld,msgBox,errMsg);
		
    } else if (illegalChars.test(fld.value)) {
		
		errMsg = "The username contains illegal characters.\n";
        displayError(fld,msgBox,errMsg);
    } else {
		resetDisplay(fld,msgBox);
		notValid = false;
    } 

    return notValid;
}

//Check for Valid Password
function invalidPassword(fld,msgBox,minLength,maxLength) {
    var notValid = true;
	var errMsg;
    var illegalChars = /[\W_]/; // allow only letters and numbers 
 
    if (fld.value == "") {
		
		errMsg= "You didn't enter a password.\n";
       	displayError(fld,msgBox,errMsg);
       
    } else if ((fld.value.length < minLength) || (fld.value.length > maxLength)) {
		
        errMsg = "The password is the wrong length. \n";
        displayError(fld,msgBox,errMsg);
    } else if (illegalChars.test(fld.value)) {
		
        errMsg = "The password contains illegal characters.\n";
        displayError(fld,msgBox,errMsg);
    } else if (!((fld.value.search(/(a-z)+/)) && (fld.value.search(/(0-9)+/)))) {
        errMsg = "The password must contain at least one numeral.\n";
        displayError(fld,msgBox,errMsg);
    } else {
		resetDisplay(fld,msgBox);
		notValid = false;
    }

   return notValid;
}


function trim(s)
{
  return s.replace(/^\s+|\s+$/, '');
} 

// Check Email
function invalidEmail(fld,msgBox) {
    var notValid = true;
	var errMsg;
    var tfld = trim(fld.value);                        // value of field with whitespace trimmed off
    var emailFilter = /^[^@]+@[^@.]+\.[^@]*\w\w$/ ;
    var illegalChars= /[\(\)\<\>\,\;\:\\\"\[\]]/ ;
    
    if (fld.value == "") {
	
       	errMsg = "You didn't enter an email address.\n";
	   	displayError(fld,msgBox,errMsg);
        
    } else if (!emailFilter.test(tfld)) {              //test email for illegal characters
		
       	errMsg = "Please enter a valid email address.\n";
	   	displayError(fld,msgBox,errMsg);
        
    } else if (fld.value.match(illegalChars)) {
		
		
		errMsg = "The email address contains illegal characters.\n";
        displayError(fld,msgBox,errMsg);
        
    } else {
		resetDisplay(fld,msgBox);
		notValid = false;
		
    }
	
    return notValid;
}

// Check Phone
function invalidPhone(fld,msgBox) {
    var notValid = true;
	var errMsg;
    var stripped = fld.value.replace(/[\(\)\.\-\ ]/g, '');     

   if (fld.value == "") {
	   	
        errMsg = "You didn't enter a phone number.\n";
		displayError(fld,msgBox,errMsg);
        
    } else if (isNaN(parseInt(stripped))) {
		
        errMsg = "The phone number contains illegal characters.\n";
		displayError(fld,msgBox,errMsg);
        
    } else if (!(stripped.length == 10)) {
		
        errMsg = "The phone number is the wrong length. Make sure you included an area code.\n";
        displayError(fld,msgBox,errMsg);
		
    } else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}

    return notValid;
}

//Check Selection
function invalidSelection(fld,msgBox) {
 	var notValid = true;	
	var errMsg;
	
	if(fld.selectedIndex == 0) {
		
		errMsg = "Please make a selection.\n";
		displayError(fld,msgBox,errMsg);
	} else {
		resetDisplay(fld,msgBox);
		notValid = false;
	}
	
	return notValid;
}

//Check Radio Buttons
function invalidRadio(fld,msgBox) {
 	var notValid = true;	
	var errMsg;
	var checkvalue;
	
for (i=0; i<fld.length; i++) {
   if (fld[i].checked) {
      checkvalue=true;
      break;
   }
}

	if(!checkvalue) {
		errMsg = "No options selected. Please choose one.\n";
		displayError(fld,msgBox,errMsg);
		//msgBox.style.display = "inline";
		//msgBox.innerHTML = errMsg;
	} else {
		resetDisplay(fld,msgBox);
		//msgBox.style.display = "none";
		notValid = false;
	}
	
	return notValid;
}

//Check Checkboxes

function invalidCheckbox(fld,msgBox, minNum) {
 	var notValid = true;	
	var errMsg;
	var checkvalue;
	var counter;
	
	counter = 0;
	
	for (i=0; i<fld.length; i++) {
		
	   if (fld[i].checked) {
		  counter++;
		 
		  if (counter==minNum) {
			checkvalue=true;
			break;
		  }
	   }
}

	if(!checkvalue) {
		if (minNum>1) {
		errMsg = "At least "+minNum +" options are required.\n";
		} else {
		errMsg = "At least "+minNum +" option is required.\n";
		}
		displayError(fld,msgBox,errMsg);
		//msgBox.style.display = "inline";
		//msgBox.innerHTML = errMsg;
	} else {
		resetDisplay(fld,msgBox);
		//msgBox.style.display = "none";
		notValid = false;
	}
	return notValid;
}

function getID(elementToGet) {
	return document.getElementById(elementToGet);	
}

function displayError(field,spanBox,msg) {
		spanBox.style.display = "block";
		spanBox.innerHTML = msg;
		
		/*if(field.type) {
			field.style.background = '#ffa';
			field.style.borderWidth = '1px';
			field.style.borderColor= '#888';
			
		}*/
}

function resetDisplay(field,spanBox) {
		spanBox.style.display = "none";
		
		/*if(field.type) {
			field.style.backgroundColor = '#fff';
			field.style.borderWidth = '1px';
			field.style.borderColor= '#888';
		}*/
}

///////////////////////////////////////////////////////////////
//************************** NOTE ************************** //
// Need a 'resetAll' function that resets field style and 
// error span tags whenever the user click the 'Reset' button.
////////////////////////////////////////////////////////////////

function resetAll() {
							
	var spanArray = document.getElementsByTagName('span');
								
		for (i=0; i<spanArray.length;i++){
			if (spanArray[i].className=='reqfield') {
				spanArray[i].style.display = 'none';
			}
		}
		
	}


function validation() { //ie. validation(this,{reqID: "fName",reqType: "blank",errBox: "errfName"},{reqID: "age",reqType: "range",minRange: 18,maxRange: 64})

//Properties: reqID,reqType,errBox,[minRange, maxRange]
// 'this': form to validate
// reqID: element id of the required form element
// reqType: blank | number | range | digits| username | password | email | phone | selection | radio | checkbox
// errBox: element id to display error message
	var valid;
	var args = validation.arguments; //Grab arguments required.
	var frm = args[0]; // Get form 
	var obj;
	var i=1;
	//Loop through required arguments
	while (i<args.length) {
		
		obj = args[i];
		
		
		
		switch(obj.reqType) {
			case "blank": 
				if (isEmpty( frm.elements[obj.reqID],getID(obj.errBox) )){ 
					valid=false;
		 		}
				
				break;
			case "number":
				if (invalidNumber( frm.elements[obj.reqID],getID(obj.errBox) )){ 
					valid=false;
		 		}
				break;
				
			case "posNumber":
				if (invalidPosInteger( frm.elements[obj.reqID],getID(obj.errBox) )) {
				}
				break;
			
			case "range":
				if (outOfRange( frm.elements[obj.reqID],getID(obj.errBox), obj.minRange,obj.maxRange )){ 
					valid=false;
		 		}
				break;
			case "digits":
				if (invalidDigits( frm.elements[obj.reqID],getID(obj.errBox), obj.numdigits )){ 
					valid=false;
		 		}			
				break;
			
			case "date":
				if (invalidDate( frm.elements[obj.reqID],getID(obj.errBox) )) {
					valid=false;
				}
				break;

			case "dollar":
				if (invalidDollar( frm.elements[obj.reqID],getID(obj.errBox) )) {
					valid=false;
				}
				break;

			case "username":
				
				if ( invalidUsername( frm.elements[obj.reqID],getID(obj.errBox),obj.minRange,obj.maxRange )){ 
					valid=false;
		 		}
				break;
			case "password":
				
				if (invalidPassword( frm.elements[obj.reqID],getID(obj.errBox),obj.minRange,obj.maxRange )){ 
					valid=false;
		 		}				
				break;
			case "email": 
				
				if (invalidEmail( frm.elements[obj.reqID],getID(obj.errBox) )){ 
					valid=false;
		 		}				
				break;
			case "phone":
				
				if (invalidPhone( frm.elements[obj.reqID],getID(obj.errBox) )){ 
					valid=false;
		 		}
				break;	
			case "selection":
				if (invalidSelection( frm.elements[obj.reqID],getID(obj.errBox) )){ 
					valid=false;
		 		}			
				break;
			case "radio":
				
				if (invalidRadio( frm.elements[obj.reqID],getID(obj.errBox) )){ 
					valid=false;
		 		}			
				break;
				

			case "checkbox":
			
				if (invalidCheckbox( frm.elements[obj.reqID],getID(obj.errBox), obj.minRange )){ 
					valid=false;
		 		}	
				
		} //End Swtich
		i++;
	} //End for loop
	return valid;
	
}