var inputFields, selectMenus, textareaFields, totalInputElements, totalRequiredFields;
var formElements = new Array();
var requiredFields_array = new Array();
var requiredFieldsClassnames_array = new Array();
var requiredFieldsInstructions_array = new Array();
var invalidRequiredFields_array = new Array();
var zipIndex = areaCodeIndex = phonePrefixIndex = phoneNumIndex = -1;
var checkbox_array = new Array();
var invalidFields = 0;
var formIsValid = false;

function doValidation(_className,_value) {
	//alert(_className + "; " + _value);
	var isValid = false;
	
	if (_className.indexOf('alphaNum') != -1) {
		//alert("alphaNum");
		isValid = validateAlphaNum(_value);
	} else if (_className.indexOf('alpha') != -1) {
		isValid = validateAlpha(_value);
	} else if (_className.indexOf('num') != -1) {
		isValid = validateNum(_value);
	} else if (_className.indexOf('email') != -1) {
		isValid = validateEmail(_value);
	} else if (_className.indexOf('phone') != -1) {
		isValid = validatePhone(_value);
		//alert(_className + "; " + _value + "; " + isValid);
	}
	
	return isValid;
}

function getNumFromAlpha(_alphaChar) {
	if (_alphaChar == "a" || _alphaChar == "b" || _alphaChar == "c") {
		return "2";
	} else if (_alphaChar == "d" || _alphaChar == "e" || _alphaChar == "f") {
		return "3";
	} else if (_alphaChar == "g" || _alphaChar == "h" || _alphaChar == "i") {
		return "4";
	} else if (_alphaChar == "j" || _alphaChar == "k" || _alphaChar == "l") {
		return "5";
	} else if (_alphaChar == "m" || _alphaChar == "n" || _alphaChar == "o") {
		return "6";
	} else if (_alphaChar == "p" || _alphaChar == "q" || _alphaChar == "r" || _alphaChar == "s") {
		return "7";
	} else if (_alphaChar == "t" || _alphaChar == "u" || _alphaChar == "v") {
		return "8";
	} else if (_alphaChar == "w" || _alphaChar == "x" || _alphaChar == "y" || _alphaChar == "z") {
		return "9";
	}
}

function getRequiredFields(_formid) {
	var formChildren = "";
	var tableChildren = "";
	var fullPhone;
	/*
	nodeType
	1 == ELEMENT
	3 == TEXT
	8 == COMMENT
	*/
	totalInputElements = document.getElementById(_formid).elements.length;
	for (var i=0; i<totalInputElements; i++) {
		formChildren += document.getElementById(_formid).elements[i].tagName + " | " + document.getElementById(_formid).elements[i].type + "\n";
	}
	
	inputFields = document.getElementById(_formid).getElementsByTagName('input');
	selectMenus = document.getElementById(_formid).getElementsByTagName('select');
	textareaFields = document.getElementById(_formid).getElementsByTagName('textarea');
	
	var inputFieldsClassnames = "";
	totalRequiredFields = 0;
	
	formElements = document.getElementById(_formid).elements;
	
	for (var i=0; i<totalInputElements; i++) {
		inputFieldsClassnames += formElements[i].className + "; ";
		
		if (formElements[i].id.toLowerCase().indexOf('zip') != -1) {
			zipIndex = i;
		} else if (formElements[i].id.toLowerCase().indexOf('phone') != -1) {
			if (formElements[i].id.toLowerCase().indexOf('area') != -1) {
				areaCodeIndex = i;
			} else if (formElements[i].id.toLowerCase().indexOf('prefix') != -1) {
				phonePrefixIndex = i;
			} else if (formElements[i].id.toLowerCase().indexOf('num') != -1) {
				phoneNumIndex = i;
			}
		}
		
		if (formElements[i].type.toLowerCase() == "checkbox") {
			checkbox_array.push(formElements[i]);
		}
		
		if (formElements[i].className.indexOf('required') != -1) {
			totalRequiredFields++;
			requiredFields_array.push(formElements[i].id);
			requiredFieldsInstructions_array.push(formElements[i].title);
			
			if (formElements[i].tagName.toLowerCase() == "input") {
				if (formElements[i].type.toLowerCase().length == 0) {
					//no type attribute, set text to default
					//formElements[i].type = "text";
				}
				
				switch (formElements[i].type.toLowerCase()) {
					case "text":
						document.getElementById(formElements[i].id).onfocus = document.getElementById(formElements[i].id).onkeyup = function(ev) {
							//(validateAlphaNum(this.value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'nostatus';
							
							var ev = ev || window.event; // gets the event in ie or ns
							
							if (ev.type == "focus") {
								(doValidation(this.className,this.value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'nostatus';
							} else if (ev.type == "keyup") {
								if (this.id.toLowerCase().indexOf('phone') == -1 && this.id.toLowerCase().indexOf('zip') == -1) {
									(doValidation(this.className,this.value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'nostatus';
								}
								
								var kCode = ev.keyCode || ev.which;
								
								if (kCode != 9 && kCode != 16) { //tab key, shift key
								
									if (this.id.toLowerCase().indexOf('zip') != -1 || this.id.toLowerCase().indexOf('phone') != -1) {
										var lastChar = this.value.charAt(this.value.length-1).toLowerCase();
										if (validateAlpha(lastChar)) {
											this.value = this.value.substring(0,this.value.length-1) + getNumFromAlpha(lastChar);
											//alert(this.value.charAt(this.value.length-1));
										}
									}
									
									if (this.maxLength == this.value.length) {
										if (this.id.toLowerCase().indexOf('zip') != -1) {
											(doValidation(this.className,this.value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'nostatus';
											if (zipIndex != -1) {
												formElements[zipIndex+1].focus();
											}
										} else if (this.id.toLowerCase().indexOf('phone') != -1) {
											fullPhone = formElements[areaCodeIndex].value + "-" + formElements[phonePrefixIndex].value + "-" + formElements[phoneNumIndex].value;
											
											if (this.id.toLowerCase().indexOf('area') != -1) {
												if (areaCodeIndex != -1) {
													formElements[areaCodeIndex+1].focus();
												}
											} else if (this.id.toLowerCase().indexOf('prefix') != -1) {
												if (phonePrefixIndex != -1) {
													formElements[phonePrefixIndex+1].focus();
												}
											} else if (this.id.toLowerCase().indexOf('num') != -1) {
												if (phoneNumIndex != -1) {
													//Official phone field
													document.getElementById('Phone').value = fullPhone;
													
													(doValidation(document.getElementById('Phone').className,fullPhone)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'invalid';
													
													formElements[phoneNumIndex+2].focus(); //+1 is 'Phone' hidden field
												}
											}
										}
									}
								}
							}
							
						};
						
						document.getElementById(formElements[i].id).onkeydown = function() {
							if (this.id.toLowerCase().indexOf('zip') != -1 || this.id.toLowerCase().indexOf('phone') != -1) {
								var lastChar = this.value.charAt(this.value.length-1).toLowerCase();
								if (validateAlpha(lastChar)) {
									this.value = this.value.substring(0,this.value.length-1) + getNumFromAlpha(lastChar);
									//alert(this.value.charAt(this.value.length-1));
								}
							}
						};
						
						document.getElementById(formElements[i].id).onblur = function() {
							if (this.id.toLowerCase().indexOf('phone') == -1) {
								(doValidation(this.className,this.value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'invalid';
							} else {
								if (isNaN(this.value)) {
									var tmpVal = "";
									for (var i=0; i<this.value.length; i++) {
										if (isNaN(this.value.charAt(i))) {
											tmpVal += getNumFromAlpha(this.value.charAt(i))
										} else {
											tmpVal += this.value.charAt(i);
										}
									}
									this.value = tmpVal;
								}
								fullPhone = formElements[areaCodeIndex].value + "-" + formElements[phonePrefixIndex].value + "-" + formElements[phoneNumIndex].value;
								document.getElementById('Phone').value = fullPhone;
								(doValidation(document.getElementById('Phone').className,document.getElementById('Phone').value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'invalid';
							}
							
							if (document.getElementById('error_msg').className == 'displayBlock') {
								validateForm('contactForm');
							}
							
							
						};
						break;
					case "radio":
						
						break;
					case "checkbox":
						//alert(formElements[i].type);
						break;
					case "password":
						
						break;
					case "hidden":
						
						break;
				} //end switch
			} else if (formElements[i].tagName.toLowerCase() == "select") {
				/*formElements[i].onfocus = function() {
					//(validateAlphaNum(this.value)) ? this.parentNode.className = 'valid' : this.parentNode.className = 'nostatus';
					(this.selectedIndex > 0) ? this.parentNode.className = 'valid' : this.parentNode.className = 'nostatus';
				}*/
				document.getElementById(formElements[i].id).onchange = document.getElementById(formElements[i].id).onblur = function(ev) {
					var ev = ev || window.event;
					//alert(ev.type);
					
					(this.selectedIndex > 0) ? this.parentNode.className = 'valid' : this.parentNode.className = 'invalid';
					
					
					/* Custom */
					if (ev.type == "change") {
						//alert(this.id);
						if (this.id == "Custom_1_") {
							//alert(this.id);
							fillCity(this.value);
						}
					}
					
					if (document.getElementById('error_msg').className == 'displayBlock') {
						validateForm('contactForm');
					}
				}
				
			} else if (formElements[i].tagName.toLowerCase() == "textarea") {
				
			} else if (formElements[i].tagName.toLowerCase() == "button") {
			
			}
		}
	}
	
}

function updateMsg() {
	//get invalid fields
	if (invalidFields > 0) {
		var errorMsg = "";
		var invalidPhone = false;
		for (var p=0; p<requiredFieldsClassnames_array.length; p++) {
			if (requiredFieldsClassnames_array[p].toLowerCase().indexOf('phone') != -1) {
				invalidPhone = true;
				p = requiredFieldsClassnames_array.length + 1;
			}
		}
		
		if (invalidFields == 1) {
			errorMsg = "There is " + invalidFields + " incomplete required field.";
		} else {
			if (invalidPhone) { invalidFields -= 3; }
			errorMsg = "There are " + invalidFields + " incomplete required fields.";
		}
		
		//display "error" message
		var msgTextNode = document.createTextNode(errorMsg);
		for (var i=0; i<document.getElementById("error_msg").childNodes.length; i++) {
			document.getElementById("error_msg").removeChild(document.getElementById("error_msg").childNodes[i]);
		}
		document.getElementById("error_msg").appendChild(msgTextNode);
		document.getElementById("error_msg").className = "displayBlock";
		
		//place cursor in first invalid field, if not phone area code or phone prefix (should jump to prefix or number, respectively)
		//document.getElementById(invalidRequiredFields_array[0]).focus();
	} else {
		document.getElementById("error_msg").className = "displayNone";
	}
}

function inspectRequiredFields() {
	invalidFields=0;
	if (invalidRequiredFields_array.length > 0) {
		for (var i=invalidRequiredFields_array.length-1; i>=0; i--) {
			invalidRequiredFields_array.pop();
		}
	}
	
	//cycle through required fields, find those that are not valid and add to requiredFieldsClassnames_array
	for (var i=0; i<requiredFields_array.length; i++) {
		if (document.getElementById(requiredFields_array[i]).parentNode.className != "valid") {
			//alert(document.getElementById(requiredFields_array[i]).id + " is not valid.");
			
			if (document.getElementById(requiredFields_array[i]).parentNode.className == "invalid") {
				requiredFieldsClassnames_array.push(document.getElementById(requiredFields_array[i]).className);
				invalidRequiredFields_array.push(requiredFields_array[i]);
				//return false;
				formIsValid = false;
				
				//mark fields
				document.getElementById(requiredFields_array[i]).parentNode.className = 'invalid';
				invalidFields ++;
			} else { //neither valid or invalid status
				
				if (document.getElementById(requiredFields_array[i]).tagName.toLowerCase() == "select") {
					if (document.getElementById(requiredFields_array[i]).selectedIndex > 0) {
						document.getElementById(requiredFields_array[i]).parentNode.className = 'valid';
					} else {
						document.getElementById(requiredFields_array[i]).parentNode.className = 'invalid';
						invalidFields++;
					}
				} else if (document.getElementById(requiredFields_array[i]).tagName.toLowerCase() == "input") {
					//check phone
					if (document.getElementById(requiredFields_array[i]).id.toLowerCase().indexOf('phone') != -1) {
						if (doValidation(document.getElementById('Phone').className,document.getElementById('Phone').value)) {
							document.getElementById(requiredFields_array[i]).parentNode.className = 'valid';
						} else {
							document.getElementById(requiredFields_array[i]).parentNode.className = 'invalid';
							invalidFields++;
						}
					} else {
						if (doValidation(document.getElementById(requiredFields_array[i]).className,document.getElementById(requiredFields_array[i]).value)) {
							document.getElementById(requiredFields_array[i]).parentNode.className = 'valid';
						} else {
							document.getElementById(requiredFields_array[i]).parentNode.className = 'invalid';
							invalidFields++;
						}
					}
				}
			}
		}
	}
	if (invalidFields < 1) {
		formIsValid = true;
	}
}

function validateForm(_form) {
	//clear requiredFieldsClassnames_array first
	if (requiredFieldsClassnames_array.length > 0) {
		for (var i=requiredFieldsClassnames_array.length-1; i>=0; i--) {
			requiredFieldsClassnames_array.pop();
		}
	}
	
	inspectRequiredFields();
	updateMsg();
	
	return formIsValid;
}


function showHideAnswer()
	{
		var numericID = this.id.replace(/[^\d]/g,'');
		var obj = document.getElementById('a' + numericID);
		var plus = document.getElementById('q'+ numericID + 'plus'); 
		if(obj.style.display=='block'){
			obj.style.display='none';
			plus.innerHTML = '<img src="../images/plus.gif" />'; 
		}else{
			obj.style.display='block';
			plus.innerHTML = '<img src="../images/minus.gif" />'; 
		}		
	}
	
	
function initShowHideContent()
	{ 
		var divs = document.getElementsByTagName('DIV');
		for(var no=0;no<divs.length;no++){
			if(divs[no].className=='product'){
				divs[no].onclick = showHideAnswer;
			}	
			
		}	
	}

window.onload = function() {
	
	initShowHideContent(); 
	
};