/* Copyright (C) 2005-2006 Six Ray Vision LLC.  All rights reserved.
 * $Id: validator.js,v 1.5 2006/01/15 17:08:49 blee Exp $
 */

// validator mini-framework (requires functions.js)
function Validator(m) {
  var msgs=
    [
      'DEFAULT',        'Error',
      'required',       'Required',
      'email',          'Email is invalid',
      'minmax_length',  'Invalid length',
      'zipcode',        'Invalid zip code',
      'US_phone',       'Invalid phone number',
    ]
    .concat(m);
  this.messages=new Object();
  for (var i=1; i<msgs.length; i+=2)
    this.messages[msgs[i-1]]=msgs[i];
}
Validator.prototype.validate=// return true if validated, false otherwise
function (form,valid) {
  if (valid===undefined) valid=true;
  for (var i=0; i<form.elements.length; i++) {
    var e=form.elements[i];
    var m=gE(e.name+':Message');
    if (m) hE(m);
    var v=gE(e.name+':Validate');
    if (v) {
      var val_fn; var err_msg='';
      var reqs=v.innerHTML.split(/\s*\|\s*/);
      for (var j=0; j < reqs.length; ++j) {
        if (!reqs[j]) next;
        var pos=reqs[j].indexOf('=');
        if (pos > 0) {
          val_fn =reqs[j].substr(0, pos);
          err_msg=reqs[j].substr(pos+1);
        }
        else {
          val_fn =reqs[j];
          err_msg=this.messages[val_fn]?this.messages[val_fn]:this.messages['DEFAULT'];
        }
        var val_params=val_fn.split(/\s*,\s*/);
        val_fn=val_params.shift();
        if (Validator[val_fn] && !Validator[val_fn](e, val_params)) {
          if (m) { wH(m, err_msg); sE(m); }
          valid=false;
          break;
        }
      }
    }
  }
  Validator.show_global_message(!valid);
  return valid;
}

Validator.show_global_message=
function(show, msg) {
  if (!msg) msg='Please fix errors on this page.';
  var e=gE('Validator:Global');
  if (e){ if (show) { wH(e, msg); sE(e); }
          else      hE(e); }
}

Validator.trim=function (e) {
  e.value.trim();
  return true;
}
Validator.unspace=function (e) {
  e.value.unspace();
  return true;
}
Validator.lcase=function (e) {
  e.value=e.value.toLowerCase();
  return true;
}
Validator.ucase=function (e) {
  e.value=e.value.toUpperCase();
  return true;
}

Validator.required=function (e) {
  return e.value != null && e.value.length > 0;
}
Validator.emailRE=/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
Validator.email=function (e) {
  var s=e.value;
  return s && s.search && s.search(Validator.prototype.emailRE) == 0;
}
Validator.minmax_length=function (e, params) {
  var len=e.value.length;
  return len >= params[0] && len <= params[1];
}
Validator.zipcode=function (e) {
  return e.value.search(/^\d{5}(-\d{4})?$/) == 0;
}
Validator.US_phone=function (e) {
  var s=e.value;
  s.replace(/[\(\)-\.\s]/g, '');
  return s.length == 7 || s.length == 10 || s.length == 11;
}
