/* ********************************************************
---------Suplite Simple Form Validation Library------------

Useage:
Include validation.js in the header of the page that you
want validated and call validateAllForms in the page footer.

Fields with the attribute noValidate will not be validated.

Requires:
core.js be loaded before validation.js for the extend method

********************************************************** */

Array.prototype.find = function(searchStr) {
  var returnArray = false;
  for (i=0; i<this.length; i++) {
    if (typeof(searchStr) == 'function') {
      if (searchStr.test(this[i])) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    } else {
      if (this[i]===searchStr) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    }
  }
  return returnArray;
}

Validation = {
    
    Fields: {
        input: function(ele){
            if (ele.type == 'submit') return true;
            if (ele.value == '') throw new ValidationError('-You must enter something in the ' + Validation.getFieldName(ele) + ' field');
            return true;
        },

        select: function(ele){
            if (ele.selectedIndex == -1) throw new ValidationError('-You must choose at least 1 of the ' + Validation.getFieldName(ele));
            return true; 
        },
        
        textarea: function(ele) {
            return Validation.Fields.input(ele);
        }
    },
    
    getFieldName: function(ele) {
        return ele.name.replace('_', ' ');
    },
    
    getAttr: function(ele, attr){
        if (ele && ele.attributes){
            if (ele.attributes[attr]) return ele.attributes[attr].value;
        }
        return 'true';
    },

    validateField: function(field){
        if(!field.tagName || Validation.getAttr(field, 'validate') == 'false') return true;
        var tagName = field.tagName.toLowerCase();
        var validator = Validation.Fields[tagName];
        if(typeof(validator) == 'function') {
            //alert(tagName + '  ' + field.id + '   ' + validator);
            validator(field);
        }
    },

    validateForm: function(evt){
        if (evt.target) var form = evt.target;
        else if (evt.srcElement) form = evt.srcElement;
        else return true;
        
        if(Validation.getAttr(form, 'validate') != 'false'){
            var errors = new Array();
            for (nEle in form.elements) {
                try {
                    Validation.validateField(form.elements[nEle]);
                }
                catch(error){
                    if( (error instanceof ValidationError) && (errors.find(error.message) === false))
                        errors.push(error.message);
                    //else alert(error);
                }
            }

            if (errors.length > 0) {
                alert(errors.join('\n'));
                preventDefault(evt);
                return false;
            }
        }
        return true;
    },
    
    validateAllForms: function(){
        //Attach yourself to all the forms
        var forms = document.forms;
        for (n in forms) {
            var objForm = forms[n];
            if (typeof(objForm) == 'object'){
                addListener(objForm, 'submit', Validation.validateForm);
            }
        }
        return true;
    },
    
    onLoad: function(evt){
        Validation.validateAllForms();
    }
}

addListener(this, 'load', Validation.onLoad);