/*
Set to false if you don't want the error messages
*/
var err = true;

/*
Set to true if you want modal javascript dialogues instead of DOM messages
*/
var modal = true;

/*
Browser detect, need's a little work
*/
var ie;
if (navigator.appVersion.indexOf("MSIE")!=-1) {
	ie = true; 
} else {
	ie = false;
}

/**
* Loops through the page forms and add's onSubmit events to forms
* with the class name 'validate'.
**/
var addOnSubmitEvent = function() {
    var frms = document.getElementsByTagName('form');
    for (var i=0; i<frms.length; i++) {
        if (frms[i].className.indexOf('validate') != -1) {
            frms[i].onsubmit = function() {
                if(!validateName())
                    return false;
                else if(!validate(this))
                    return false;
                else if(!validateEmail())
                    return false;
                else if(!validateZipCode())
                    return false;
                else if(!validatePhone())
                    return false;
                else
                    return validateDOB();
            }
        }
    }
}
    function validateName() {
		var firstName = document.getElementById('applicantFirstName').value;
        if (firstName.length == 0) {
            alert("Please enter your first name.");
            return false;
        }
        else if (firstName.length > 20) {
            alert("Your first name cannot be more than 20 characters long.");
            return false;
        }
        
		var lastName = document.getElementById('applicantLastName').value;
        if (lastName.length == 0) {
            alert("Please enter your last name.");
            return false;
        }
        else if (lastName.length > 20) {
            alert("Your last name cannot be more than 20 characters long.");
            return false;
        }
        return true;
    }
    function validateZipCode() {
		var zipCode = document.getElementById('zipCode').value;
        var valid = "0123456789-";
        var hyphencount = 0;

        if (zipCode.length!=5 && zipCode.length!=10) {
            alert("Please enter your 5 digit or 5 digit+4 zip code.");
            return false;
        }
        for (var i=0; i < zipCode.length; i++) {
            temp = "" + zipCode.substring(i, i+1);
            if (temp == "-") hyphencount++;
            if (valid.indexOf(temp) == "-1") {
                alert("Invalid characters in your zip code.  Please try again.");
                return false;
            }
            if ((hyphencount > 1) || ((zipCode.length==10) && ""+zipCode.charAt(5)!="-")) {
                alert("The hyphen character should be used with a properly formatted 5 digit+four zip code, like '12345-6789'.   Please try again.");
                return false;
           }
        }
        return true;
    }
    function validatePhone() {
		var phone = document.getElementById('applicantPhone').value;
        var stripped = phone.replace(/[\(\)\.\-\ ]/g, '');
        //strip out acceptable non-numeric characters
        if (isNaN(parseInt(stripped))) {
           alert("Invalid phone number.");
           return false;
        }
        if (!(stripped.length == 10)) {
        	alert("The phone number is the wrong length. Make sure you included an area code.");
           return false;
        }
        return true;
    }
    function getAge(sCode)
    {
		var sDay = document.getElementById(sCode + 'DateOfBirthDay').value;
		var sMonth = document.getElementById(sCode + 'DateOfBirthMonth').value;
		var sYear = document.getElementById(sCode + 'DateOfBirthYear').value;
		
		if(sDay == "")
		    return -999;
		    
        var myDate=new Date()
        myDate.setFullYear(sYear,sMonth,sDay)
        var today = new Date()
        var yearApart = Math.round((today-myDate)/(86400000 * 365));
        return yearApart;
    }
    function getDateValue(sCode){
		var sDay = document.getElementById(sCode + 'DateOfBirthDay').value;
		var sMonth = document.getElementById(sCode + 'DateOfBirthMonth').value;
		var sYear = document.getElementById(sCode + 'DateOfBirthYear').value;
		
		if(sDay.length == 1) sDay = '0' + sDay;
		if(sMonth.length == 1) sMonth = '0' + sMonth;
		
		if(sDay != '' || sDay != '' || sDay != '')
		    return sDay + sMonth + sYear;
		    
		return '';
    }
    function setDateValue(sCode, error_message){
	    sDate = check_date(getDateValue(sCode));
	    if( sDate == 'ERROR'){
	        alert(error_message); 
	        return false;
        } else {
            document.getElementById(sCode + 'DateOfBirth').value = sDate;
            return true;
        }
    }
    function validateDOB() {
		var oRow = document.getElementById('covTypeID');
		var sValue = oRow.options[oRow.selectedIndex].value;
		if(sValue == "EE") {
			//'covTypeID-s'
            if(!setDateValue('s', 'Your DOB date is invalid!')) 
                return false;
            else {
                age = getAge('s');
                if(age != -999){
                    if(age < 18 || age > 64){ alert('The value of the Applicant Date of Birth field must represent an age greater than or equal to 18 and less than or equal to 64.'); return false; }
                    document.getElementById('sAge').value = age;
                } else {
                    alert('Your DOB is required!');
                    return false;
                }
            }
		}
		else if(sValue == "ES") {
			//'covTypeID-s'
			//'covTypeID-sp'
            if(!setDateValue('s', 'Your DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('s');
                if(age != -999){
                    if(age < 18 || age > 64){ alert('The value of the Applicant Date of Birth field must represent an age greater than or equal to 18 and less than or equal to 64.'); return false; }
                    document.getElementById('sAge').value = age;
                } else {
                    alert('Your DOB is required!');
                    return false;
                }
            }
            if(!setDateValue('sp', 'Your spouse\'s DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('sp');
                if(age != -999){
                    if(age < 18 || age > 64){ alert('The value of the Spouse Date of Birth field must represent an age greater than or equal to 18 and less than or equal to 64.'); return false; }
                    document.getElementById('spAge').value = age;
                }
            }
		}
		else if(sValue == "SENIOR") {
			//'covTypeID-s'
			//'covTypeID-sp'
            if(!setDateValue('s', 'Your DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('s');
                if(age != -999){
                    if(age < 65 || age > 99){ alert('The value of the Applicant Date of Birth field must represent an age greater than or equal to 65 and less than or equal to 99.'); return false; }
                    document.getElementById('sAge').value = age;
                } else {
                    alert('Your DOB is required!');
                    return false;
                }
            }
            if(!setDateValue('sp', 'Your spouse\'s DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('sp');
                if(age != -999){
                    if(age < 65 || age > 99){ alert('The value of the Spouse Date of Birth field must represent an age greater than or equal to 65 and less than or equal to 64.'); return false; }
                    document.getElementById('spAge').value = age;
                }
            }
		}
		else if(sValue == "EC") {
			//'covTypeID-s'
			//'covTypeID-c1'
            if(!setDateValue('s', 'Your DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('s');
                if(age != -999){
                    if(age < 18 || age > 64){ alert('The value of the Applicant Date of Birth field must represent an age greater than or equal to 18 and less than or equal to 64.'); return false; }
                    document.getElementById('sAge').value = age;
                } else {
                    alert('Your DOB is required!');
                    return false;
                }
            }
            if(!setDateValue('c1', 'Your child\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c1');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 1 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c1Age').value = age;
                } else {
                    alert('Child 1 DOB is required!');
                    return false;
                }
            }
		}
		else if(sValue == "EECh") {
			//'covTypeID-s'
			//'covTypeID-c1'
			//'covTypeID-c2'
			//'covTypeID-c3'
			//'covTypeID-c4'
			//'covTypeID-c5'
			//'covTypeID-sp'
            if(!setDateValue('s', 'Your DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('s');
                if(age != -999){
                    if(age < 18 || age > 64){ alert('The value of the Applicant Date of Birth field must represent an age greater than or equal to 18 and less than or equal to 64.'); return false; }
                    document.getElementById('sAge').value = age;
                } else {
                    alert('Your DOB is required!');
                    return false;
                }
            }
            if(!setDateValue('sp', 'Your spouse\'s DOB date is invalid!')) 
                return false;
            else { 
                age = getAge('sp');
                if(age != -999){
                    if(age < 18 || age > 64){ alert('The value of the Spouse Date of Birth field must represent an age greater than or equal to 18 and less than or equal to 64.'); return false; }
                    document.getElementById('spAge').value = age;
                }
            }
            if(!setDateValue('c1', 'Child 1\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c1');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 1 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c1Age').value = age;
                } else {
                    alert('Child 1 DOB is required!');
                    return false;
                }
            }
            if(!setDateValue('c2', 'Child 2\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c2');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 2 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c2Age').value = age;
                }
            }
            if(!setDateValue('c3', 'Child 3\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c3');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 3 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c3Age').value = age;
                }
            }
            if(!setDateValue('c4', 'Child 4\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c4');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 4 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c4Age').value = age;
                }
            }
            if(!setDateValue('c5', 'Child 5\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c5');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 5 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c5Age').value = age;
                }
            }
		}
		else if(sValue == "C") {
			//'covTypeID-c1'
			//'covTypeID-c2'
			//'covTypeID-c3'
			//'covTypeID-c4'
			//'covTypeID-c5'
            if(!setDateValue('c1', 'Child 1\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c1');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 1 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c1Age').value = age;
                } else {
                    alert('Child 1 DOB is required!');
                    return false;
                }
            }
            if(!setDateValue('c2', 'Child 2\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c2');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 2 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c2Age').value = age;
                }
            }
            if(!setDateValue('c3', 'Child 3\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c3');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 3 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c3Age').value = age;
                }
            }
            if(!setDateValue('c4', 'Child 4\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c4');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 4 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c4Age').value = age;
                }
            }
            if(!setDateValue('c5', 'Child 5\'s DOB date is invalid!')) 
                return false;
            else {
                age = getAge('c5');
                if(age != -999){
                    if(age < 0 || age > 17){ alert('The value of the Child 5 Date of Birth field must represent an age greater than or equal to 0 and less than or equal to 17.'); return false; }
                    document.getElementById('c5Age').value = age;
                }
            }
		}
		return true;
    }

function check_date(DateValue){
    var checkstr = "0123456789";
    var DateTemp = "";
    var seperator = "-";
    var day;
    var month;
    var year;
    var leap = 0;
    var err = 0;
    var i;
       err = 0;
       /* Delete all chars except 0..9 */
       for (i = 0; i < DateValue.length; i++) {
    	  if (checkstr.indexOf(DateValue.substr(i,1)) >= 0) {
    	     DateTemp = DateTemp + DateValue.substr(i,1);
    	  }
       }
       DateValue = DateTemp;
       /* Always change date to 8 digits - string*/
       /* if year is entered as 2-digit / always assume 20xx */
       if (DateValue.length == 6) {
          DateValue = DateValue.substr(0,4) + '20' + DateValue.substr(4,2); }
       if (DateValue.length != 8) {
          err = 19;}
       /* year is wrong if year = 0000 */
       year = DateValue.substr(4,4);
       if (year == 0) {
          err = 20;
       }
       /* Validation of month*/
       month = DateValue.substr(2,2);
       if ((month < 1) || (month > 12)) {
          err = 21;
       }
       /* Validation of day*/
       day = DateValue.substr(0,2);
       if (day < 1) {
         err = 22;
       }
       /* Validation leap-year / february / day */
       if ((year % 4 == 0) || (year % 100 == 0) || (year % 400 == 0)) {
          leap = 1;
       }
       if ((month == 2) && (leap == 1) && (day > 29)) {
          err = 23;
       }
       if ((month == 2) && (leap != 1) && (day > 28)) {
          err = 24;
       }
       /* Validation of other months */
       if ((day > 31) && ((month == "01") || (month == "03") || (month == "05") || (month == "07") || (month == "08") || (month == "10") || (month == "12"))) {
          err = 25;
       }
       if ((day > 30) && ((month == "04") || (month == "06") || (month == "09") || (month == "11"))) {
          err = 26;
       }
       /* if 00 ist entered, no error, deleting the entry */
       if ((day == 0) && (month == 0) && (year == 00)) {
          err = 0; day = ""; month = ""; year = ""; seperator = "";
       }
       /* if no error, write the completed date to Input-Field (e.g. 13.12.2001) */
       if (err == 0) {
          return month + seperator + day + seperator + year;
       }
       else {
         return "ERROR"; 
       }
}
	function validateEmail() {
		var addr = document.getElementById('applicantEmail').value;
		
		if (addr == '') {
		   alert('email address is mandatory');
		   return false;
		}
		if (addr == '') return true;
		var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
		for (i=0; i<invalidChars.length; i++) {
		   if (addr.indexOf(invalidChars.charAt(i),0) > -1) {
		      alert('email address contains invalid characters');
		      return false;
		   }
		}
		for (i=0; i<addr.length; i++) {
		   if (addr.charCodeAt(i)>127) {
		      alert("email address contains non ascii characters.");
		      return false;
		   }
		}

		var atPos = addr.indexOf('@',0);
		if (atPos == -1) {
		   alert('email address must contain an @');
		   return false;
		}
		if (atPos == 0) {
		   alert('email address must not start with @');
		   return false;
		}
		if (addr.indexOf('@', atPos + 1) > - 1) {
		   alert('email address must contain only one @');
		   return false;
		}
		if (addr.indexOf('.', atPos) == -1) {
		   alert('email address must contain a period in the domain name');
		   return false;
		}
		if (addr.indexOf('@.',0) != -1) {
		   alert('period must not immediately follow @ in email address');
		   return false;
		}
		if (addr.indexOf('.@',0) != -1){
		   alert('period must not immediately precede @ in email address');
		   return false;
		}
		if (addr.indexOf('..',0) != -1) {
		   alert('two periods must not be adjacent in email address');
		   return false;
		}
		var suffix = addr.substring(addr.lastIndexOf('.')+1);
		if (suffix.length != 2 && suffix != 'com' && suffix != 'net' && suffix != 'org' && suffix != 'edu' && suffix != 'int' && suffix != 'mil' && suffix != 'gov' & suffix != 'arpa' && suffix != 'biz' && suffix != 'aero' && suffix != 'name' && suffix != 'coop' && suffix != 'info' && suffix != 'pro' && suffix != 'museum') {
		   alert('invalid primary domain in email address');
		   return false;
		}
		return true;
	}
	
/**
* Function for displaying error message to user.
* @param frm [Object HTMLFormElement] The form
* @param el [Object HTMLInputElement] Source of the error message
**/
var displayErrorMessage = function(frm, el) {
   
    var labels = document.getElementsByTagName('label');
    var errorMsg = '';
   
    if (el.type=='radio'||el.type=='checkbox') {
        for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor== el.name) {
                errorMsg = 'You must enter a value for ' + labels[i].innerHTML.replace('*','');
            }
        }
    } else {
        for (var i = 0; i<labels.length; i++) {
            if (labels[i].htmlFor==el.id) {
                errorMsg = 'You must enter a value for ' + labels[i].innerHTML.replace('*','');
            }
        }
    }
   
    if (err) {
        if (modal) {
            alert(errorMsg);
            el.focus();
        }
        else {
            if (document.getElementById(frm.id+'_errorMessage')) {
                frm.removeChild( document.getElementById (frm.id+'_errorMessage'));
            }
            var errorDiv = document.createElement('div');
            errorDiv.id = frm.id+'_errorMessage';
            errorDiv.className = 'errorMessage';
            errorDiv.innerHTML = errorMsg;
            frm.insertBefore(errorDiv, frm.childNodes[0]);
            el.focus();
        }
    }
}

/**
* Function called to validate form elements.
* @param frm [Object HTMLFormElement] The form to validate
*Â @return [Boolean] Did the form validate or not
**/
var validate = function(frm) {
	var el = frm.elements;
	for (var i=0; i<el.length; i++) {
    	if (el[i].className.indexOf('req') != -1) {
			
			// Text, Textarea, File
			if (el[i].type=='text'||el[i].type=='textarea'||el[i].type=='file') {
				if (el[i].value=="") {
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
 				} else {
					el[i].className = el[i].className.replace('error','');
				}

			}

			// Radio
			else if (el[i].type=='radio') {
				var radiogroup = el[el[i].name];
		        var itemchecked = false;
		        for(var j = 0 ; j < radiogroup.length ; ++j) {
					if(radiogroup[j].checked) {
						itemchecked = true;
						break;
					}
		        }
		        if(!itemchecked) { 
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
		        }
			}
			
			// Checkbox
			else if (el[i].type=='checkbox') {
				var itemchecked = false;
		        var elems = document.getElementsByTagName("input");
		        for(var j=0; j<elems.length; j++) {
					if(elems[j].type=='checkbox'&&elems[j].name==el[i].name) {
		        		if(elems[j].checked) {
		        			itemchecked = true;
		        			break;
		        		}
		        	}
		        }
		        if(!itemchecked) { 
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
				}
			}
			
			// Select-one
			else if (el[i].type=='select-one') {
				if (el[i].selectedIndex==0) {
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
		        } else {
		        	el[i].className = el[i].className.replace('error','');
		        }
			}
			
			// Select-multiple
			else if (el[i].type=='select-multiple') {
				var optionselected = false;
		      	for(var j=0;j<el[i].options.length; ++j) {
		      		if (el[i].options[j].selected) {
		      			optionselected = true;
		      			break;
		      		}
		      	}
		      	if (!optionselected) {
					el[i].className = el[i].className + ' error';
 					err == true ? displayErrorMessage(frm, el[i]) : null;
					return false;
		        } else {
		        	el[i].className = el[i].className.replace('error','');
		        }
			}
		}
	}
	return true;
}


/**
* Function called when a element changes it's value.
**/
var evaluate = function() {
	for (i=0; i<conds.length; i++) {
		var element = document.getElementsByName(conds[i][0]);
		var elemVal = conds[i][1];
		var elements = document.getElementsByName(conds[i][2]);
		var bol = conds[i][3];
		
		if (ie) {
		/* For Internet Explorer */
			for (var k=0; k<element.length; k++) {
				if (element[k].name==event.srcElement.name) {
					if (event.srcElement.type=='select-one') {
						if(event.srcElement[event.srcElement.selectedIndex].value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else if (event.srcElement.type=='select-multiple') {
						var optionselected = false;
						for(var j=0; j<event.srcElement.options.length; j++) {
		      				if (event.srcElement.options[j].value==elemVal&&event.srcElement.options[j].selected) {
		      					optionselected = true;
		      					break;
		      				}
		      			}
						if (optionselected) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else {
						if(event.srcElement.value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					}
				}
			}
		} else {
		/* For other browsers */
			for (var k=0; k<element.length; k++) {
				if (element[k].name==this.name) {
					if (this.type=='select-one') {
						if(this[this.selectedIndex].value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else if (this.type=='select-multiple') {
						var optionselected = false;
						for(var j=0; j<this.options.length; j++) {
		      				if (this.options[j].value==elemVal&&this.options[j].selected) {
		      					optionselected = true;
		      					break;
		      				}
		      			}
						if (optionselected) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					} else {
						if(this.value==elemVal) {
							setState(elements, bol);
						} else {
							setState(elements, !bol);
						}
					}
				}
			}
		}
	}
}

/**
* Set a single or a group of elements to required or not required.
* @param elements [Object HTMLCollection] The elements to set required states on
* @param bol [Boolean] Set elements required or not required
**/
var setState = function(elements, bol) {
	if (bol) {
		for (var j=0; j<elements.length; j++) {
			if (elements[j].className.indexOf('req')==-1) {
				elements[j].className += ' req';
			}
		}
	} else {
		for (var j=0; j<elements.length; j++) {
			newClassName = elements[j].className.replace('req','');
			elements[j].className = newClassName;
		}
	}
}

/**
* Attach conditions to form elements.
**/
var attachConditions = function() {
	attachBlurs(document.getElementsByTagName('input'));
	attachBlurs(document.getElementsByTagName('select'));
}

/**
* Attach onBlur or onClick to elements depending on element type.
* @param elements [Object HTLMCollection] The elements to attach onBlur events to
**/
var attachBlurs = function(elements) {
	for (var i=0; i<elements.length; i++) {
		if (elements[i].type=='checkbox'||elements[i].type=='radio') {
			if (ie) {
				elements[i].attachEvent('onclick', evaluate, false);
			} else {
				elements[i].addEventListener('click', evaluate, false);
			}
		} else {
			if (ie) {
				elements[i].attachEvent('onblur', evaluate, false);
			} else {
				elements[i].addEventListener('blur', evaluate, false);
			}
		}
	}
}

/*
Conditions
Syntax: conds.push(Array('element name','element value','element name', false));
You should put your conditions in a seperate file and include in the page.
*/
var conds = Array();

/*
Add onLoad events to start the whole thing
*/
if(window.addEventListener){ // Mozilla, Netscape, Firefox
	window.addEventListener("load", addOnSubmitEvent, false);
	window.addEventListener("load", attachConditions, false);
} else { // IE
	window.attachEvent("onload", addOnSubmitEvent, false);
	window.attachEvent("onload", attachConditions, false);
}