    /** Validates form and displays alert if error */
    function validateForm() {
    	var msg = '';
    	for (var i = 0; i < custom_elements.length; i++) {
    		var obj = document.getElementById(custom_elements[i]);
    		obj.className = obj.className.replace('error', '');
    	}
    	for (var i = 0; i < required.length; i++) {
    		var obj = document.getElementById(required[i]);
    		obj.className = obj.className.replace('error', '');
    		if (obj.value == '') {
    		  msg += required_texts[i] + " cannot be blank.\r\n";
    		  obj.className += ' error';
    		}
    	}
    	
    	// errors found
    	if (msg != '') {
    		alert(msg);
    	  return false;
    	}
    	// no errors found
    	return true;
    }
    
    function validateElbow() {
    	var valid = validateForm();
    	var obj = document.getElementById('angle');
    	var angle = obj.value;
   		if (angle < 5 || angle > 90) {
   		  obj.className += ' error';
   			alert('Elbow Angle must be between 5 and 90 degrees');
   			return false;
   		} else { 
    		obj.className = obj.className.replace('error', '');
   			return valid; 
   		}
    }
    
    /** Adds new fields to required array based on parent */
    function addNewRequired(parent) {
    	var idx = getIndex(custom_parents, parent);
    	if (idx > -1) {
    		required.push(custom_elements[idx]);
    		required_texts.push(custom_texts[idx]);
    	}
    }

    /** Removes fields from required array based on parent */
    function delNewRequired(parent) {
    	var idx = getIndex(custom_parents, parent);
    	if (idx > -1)
    	  removeRequired(custom_elements[idx]);
    }
    
    /** Removes a field from required array and required_text array */
    function removeRequired(value) {
    	var idx = getIndex(required, value);
    	if (idx > -1) {
    		required.splice(idx,1);
    		required_texts.splice(idx,1);
    	}
    }
    
    /** Returns the index of value in array arr */
    function getIndex(arr, value) {
    	var idx = -1;
    	for (var i = 0; i < arr.length; i++) {
    		if (arr[i] == value) {
    		  idx = i;
    		  break;
    		}
    	}
    	return idx;
    }
    
    /** Displays a sub-menu based on selected value of parent **/
    function showSubmenu(parent, trigger) {
    	var sel = document.getElementById(parent).value;
    	var div = parent + '_options';
    	if (sel == trigger) {
    	  document.getElementById(div).className = '';
    	  addNewRequired(parent);
    	}	else { 
    		document.getElementById(div).className = 'hide'; 
    		delNewRequired(parent);
    	}
    }

    /** Hides a sub-menu based on selected value of parent **/
    function hideSubmenu(parent, trigger) {
    	var sel = document.getElementById(parent).value;
    	var div = parent + '_options';
    	if (sel == trigger) {
    	  document.getElementById(div).className = 'hide';
    	  delNewRequired(parent);
    	}	else { 
    		document.getElementById(div).className = ''; 
    		addNewRequired(parent);
    	}
    }    
    
    /** Toggles a sub-menu based on selected value of parent **/
    function toggleThroat() {
    	var sel = document.getElementById('tee_type').value;
    	if (sel == 'square') {
    	  document.getElementById('tee_type_radius_1').className = 'hide';
  	    delNewRequired('tee_type_radius_1');
    	  document.getElementById('tee_type_radius_2').className = 'hide';
  	    delNewRequired('tee_type_radius_2');
  	    document.getElementById('tee_type_throat_1').className = '';
   	    addNewRequired('tee_type_throat_1');
   	    document.getElementById('tee_type_throat_2').className = '';
   	    addNewRequired('tee_type_throat_2');
   	    document.getElementById('tee_type_throat_3').className = '';
   	    addNewRequired('tee_type_throat_3');
   	    document.getElementById('tee_type_throat_4').className = '';
   	    addNewRequired('tee_type_throat_4');
    	} else {
   	    document.getElementById('tee_type_throat_1').className = 'hide';
   	    delNewRequired('tee_type_throat_1');
   	    document.getElementById('tee_type_throat_2').className = 'hide';
   	    delNewRequired('tee_type_throat_2');
   	    document.getElementById('tee_type_throat_3').className = 'hide';
   	    delNewRequired('tee_type_throat_3');
   	    document.getElementById('tee_type_throat_4').className = 'hide';
   	    delNewRequired('tee_type_throat_4');
   	    document.getElementById('tee_type_radius_1').className = '';
   	    document.getElementById('tee_type_radius_2').className = '';
   	    // require radius if not already required
       	if (getIndex(required, 'radius1') < 0)
   	      addNewRequired('tee_type_radius_1');
       	if (getIndex(required, 'radius2') < 0)
     	    addNewRequired('tee_type_radius_2');
   	  }
    }
    
    /** Toggles a sub-menu based on selected value of parent **/
    function toggleElbowType() {
    	var sel = document.getElementById('elbow_type').value;
    	if (sel == 'radius') {
    	  document.getElementById('elbow_type_throat_1').className = 'hide';
  	    delNewRequired('elbow_type_throat_1');
    	  document.getElementById('elbow_type_throat_2').className = 'hide';
  	    delNewRequired('elbow_type_throat_2');
   	    document.getElementById('elbow_type_radius').className = '';
   	    addNewRequired('elbow_type_radius');
    	} else {
   	    document.getElementById('elbow_type_radius').className = 'hide';
   	    delNewRequired('elbow_type_radius');
     	  document.getElementById('elbow_type_throat_1').className = '';
     	  document.getElementById('elbow_type_throat_2').className = '';
     	  // require throat if not already required
      	if (getIndex(required, 'throat1') < 0)
    	    addNewRequired('elbow_type_throat_1');
      	if (getIndex(required, 'throat2') < 0)
    	    addNewRequired('elbow_type_throat_2');
    	}
    }
    
    function toggleDetails(id) {
    	var div = document.getElementById('details_' + id);
    	if (div && div.className == 'hide') {
    		div.className = '';
    		document.getElementById('adj_' + id).innerHTML = 'Hide Details';
    	} else {
    		if (div) {
    			div.className = 'hide';
    		  document.getElementById('adj_' + id).innerHTML = 'Show Details';
    		}
    	}
    }
    
    function toggleAddress(on) {
    	if (on == 1) {
    	  document.getElementById('addr1').className = '';
    	  document.getElementById('addr2').className = '';
    	} else {
    	  document.getElementById('addr1').className = 'hide';
    	  document.getElementById('addr2').className = 'hide';
    	}
    }
    
    /** Validates form and displays alert if error */
    function validateOrderForm() {
    	var msg = '';
    	for (var i = 0; i < required.length; i++) {
    		var obj = document.getElementById(required[i]);
    		obj.className = obj.className.replace('error', '');
    		if (obj.value == '') {
    		  msg += required_texts[i] + " cannot be blank.\r\n";
    		  obj.className = 'error';
    		}
    	}
    	
    	// errors found
    	if (msg != '') {
    		alert(msg);
    	  return false;
    	}
    	// no errors found
    	return true;
    }
    
