New Sado Version 1.1 released! Easily add ORM to your applications using our Sado Library

JavaScript Form Validation Helper

Javascript form validation helper:
/**
* @package form validation
* @author shay anderson 10.09
* @desc rules allowed:
*       alpha() - letters only
*       alphanumeric() - letters & numbers only
*       decimal() - decimal
*       min(int number) - minimum characters
*       max(int number) - maximum characters
*       numeric() - strict integer (no decimal)
* @example
*      // validation(string form, string output_div)
*       var v=new validation('form_example','errors');
*       // apply field
*       // add(string field, string message, string message_div)
*       v.add('example_field','The example field is required');
*       // apply field & rule
*       v.add('example_field','Example field requires a minimum of 2 characters');
*       v.min(2); // apply rule
*/
function validation(form, output_div) {
      if(!form || typeof form!='string') {
            return;
      } // if
      this.form=eval('document.'+form);
      if(typeof this.form!='object') {
            return;
      } // if
      var parts=new Array(); // form parts
      var form=this.form; // obj
      var silent=false; // alert|div output - default alert
      var out_div=output_div?eval('document.getElementById(\''+output_div+'\')'):false;
      var msg_alert='Please correct the following error(s):\n';
      var msg_sof='- ';
      var msg_eof='\n';
      var msg_eof_silent='';
      this.alertStart=function(str) { msg_alert=str; };
      this.alertLineStart=function(str) { msg_sof=str; };
      this.alertLineEnd=function(str) { msg_eof=str; };
      this.lineEnd=function(str) { msg_eof_silent=str; };
      this.submission=function() {
            var valid=true;
            var chars='abcdefghijklmnopqrstuvwxyz '; // allow whitespace
            var nums='0123456789';
            function isInteger(value) { return value==parseInt(value); } // isInteger
            function isFloat(value) { return value==parseFloat(value); } // isFloat
            function isAlpha(value) {
                  value=value.toLowerCase();
                  for(var i=0;i                        if(chars.indexOf(value.charAt(i))==-1) {
                              return false;
                        } // if
                  } // for
                  return true;
            } // isAlpha
            function isAlphanumeric(value) {
                  value=value.toLowerCase();
                  for(var i=0;i                        if(chars.indexOf(value.charAt(i))==-1 && nums.indexOf(value.charAt(i))==-1) {
                              return false;
                        } // if
                  } // for
                  return true;
            } // isAlphanumeric
            msg_alert=silent?'':msg_alert;
            msg_sof=silent?'':msg_sof;
            msg_eof=silent?msg_eof_silent:msg_eof;
            function msg(msg) {
                  if(msg) {
                        valid=false; // set to invalid
                  } // if
                  return msg_sof+msg+msg_eof;
            } // formatMsg
            var output=msg_alert;
            var ln='';
            var invoke_rule=false;
            var do_alert=false;
            if(typeof parts=='object' && parts.length>0) {
                  for(k in parts) {
                        var part=parts[k];
                        var field=eval('document.'+form.id+'.'+part.id);
                        if(typeof field!='object') { // ignore
                              continue;
                        } // if
                        // trigger rules
                        if(typeof part.rule.min=='number') { // min characters
                              invoke_rule=true;
                              if(part.rule.min>0 && field.value.length                                    ln=msg(part.msg);
                              } // if
                        } // if
                        if(typeof part.rule.max=='number') { // max characters
                              invoke_rule=true;
                              if(part.rule.max>0 && field.value.length>part.rule.max) { // trigger error
                                    ln=msg(part.msg);
                              } // if
                        } // if
                        if(typeof part.rule.numeric=='boolean') { // numeric - no decimal
                              invoke_rule=true;
                              if(!isInteger(field.value)) {
                                    ln=msg(part.msg);
                              } // if
                        } // if
                        if(typeof part.rule.decimal=='boolean') { // decimal
                              invoke_rule=true;
                              if(!isFloat(field.value)) {
                                    ln=msg(part.msg);
                              } // if
                        } // if
                        if(typeof part.rule.alpha=='boolean') { // alpha
                              invoke_rule=true;
                              if(!isAlpha(field.value)) {
                                    ln=msg(part.msg);
                              } // if
                        } // if
                        if(typeof part.rule.alphanumeric=='boolean') { // alphanumeric
                              invoke_rule=true;
                              if(!isAlphanumeric(field.value)) {
                                    ln=msg(part.msg);
                              } // if
                        } // if
                        if(!invoke_rule) { // require field only
                              if(field.value=='' || field.value=='undefined') {
                                    ln=msg(part.msg);
                              } // if
                        } // if
                        var div=part.div?eval('document.getElementById(\''+part.div+'\')'):'';
                        if(typeof out_div!='object') { // do not output if output div
                              if(typeof div=='object' && typeof div.innerHTML!='undefined') { // div message
                                    if(!div.innerHTML) { // do not overwrite message
                                          div.innerHTML=ln;
                                    } // if
                              } // if
                        } // if
                        output+=ln; // add message
                        if(ln) {
                              do_alert=true;
                        } // if
                        ln=''; // reset
                        invoke_rule=false; // reset
                  } // for
                  if(!silent && do_alert) { // output
                        alert(output);
                  } else if(typeof out_div=='object' && typeof out_div.innerHTML!='undefined') { // output div
                        out_div.innerHTML=output;
                  } // if
            } // if
            return valid;
      }; // submission
      this.form.onsubmit=this.submission; // submit event
      this.part=function(parts) {
            this.id=parts[0];
            this.msg=parts[1];
            this.div=parts[2];
            this.rule=new Object();
            if(this.div) { // div output do not alert
                  silent=true;
            } // if
      }; // part
      this.id=0;
      this.add=function(field, message, message_div) {
            this.rule_id=0; // reset
            var part=new this.part(new Array(field,message,message_div));
            if(!part.id || typeof part.id!='string') {
                  return;
            } // if
            if(!part.msg || typeof part.msg!='string') {
                  return;
            } // if
            parts[this.id]=part;
            this.id++;
      }; // add
      this.partId=function() { return this.id-1; }; // on next part, rewind
      this.partExists=function(id) {
            return typeof parts[id?id:this.partId()]=='object'?true:false;
      }; // partsExists
      this.applyRule=function(type, rule, value) { // type=number|boolean|string
            if(eval('typeof value!=\''+type+'\'' || !this.partExists())) {
                  return;
            } // if
            eval('parts['+this.partId()+'].rule.'+rule+'='+value);
      }; // applyRule
      this.min=function(num) { this.applyRule('number','min',num); }; // min
      this.max=function(num) { this.applyRule('number','max',num); }; // max
      this.numeric=function() { this.applyRule('boolean','numeric',true); }; // numeric
      this.decimal=function() { this.applyRule('boolean','decimal',true); }; // decimal
      this.alpha=function() { this.applyRule('boolean','alpha',true); }; // alpha
      this.alphanumeric=function() { this.applyRule('boolean','alphanumeric',true); }; // alphanumeric
} // validation