// Javascript that validates forms have each unique question answered
// The question is the name of the input. For example <input name="Question1">
// This works for radio buttons, checkboxes and text areas. Select boxes have not been added.
// Written by Jerico Pena, jericop@gmail.com

var ignoreName = new Array('comments','undefined','');  // Array of input names that should be ignored
var ignoreType = new Array('hidden');                    // Array of input types that should be ignored

// Function adds the given name to the list of inputs to be ignored for form validation. Like an optional field.
function addIgnoreName (name) { ignoreName[ignoreName.length] = name; }

// Function scans the given form for unique names (which should be questions to a survey)
function getUniqueInputNames(form) {
    var names = new Array();
    var nameRegex = new RegExp('^(?:' + ignoreName.join('|') + ')$', 'i');
    var typeRegex = new RegExp('^(?:' + ignoreType.join('|') + ')$', 'i');
    
    for (var e = 0; e < form.elements.length; e++) {
        // Skip types types and names that should be ignored from global ignoreName and ignoreType arrays
        if (form.elements[e].type.match(typeRegex) || form.elements[e].name.match(nameRegex)) {continue;}
        // Add name to the names hash
        names[form.elements[e].name] = form.elements[e].value;
    }
    
    return names; // Return array of names
}

// Function returns an array of the elementName found in the given form
function getFormInputsByName(form,elementName) {
    var inputs = new Array();
    var length = form.elements.length;
    var regex = new RegExp('^' + elementName + '$', 'i');
    
    for (var i = 0; i < length; i++) {
        if (! form.elements[i].name) {continue;} // Skip null values
        if (form.elements[i].name.match(regex)) {inputs[inputs.length] = form.elements[i];}
    }
    
    return inputs; // Return array of input html element objects
}

// Function determines if array of input element objects with same name have some value
function hasNoInput(elem) {
    var length = elem.length;
    
    for (var e = 0; e < length; e++) {
        // If input type is checkbox|radio look at the checked attribue
        if (elem[e].type.match(/(?:radio|checkbox)/i)) { if (elem[e].checked) {return false;} }
        // If input type is text|select look at the value attribute
        else { if (elem[e].value.match(/\S+/i)) {return false;} }
    }
    return true;
}

// Function validates that given form has at least one value for each unique question (input name)
function validate(formName) {
    var form = document.forms[formName];
    var info = null;
    var warn = false;
    
    var names = getUniqueInputNames(form); // Which should be each different question
    
    for (var name in names) { if (hasNoInput(getFormInputsByName(form,name))) {warn = true;} }
    
    if (warn) {alert('Please fill in all areas'); return false;}
    else {return true;}
}