//
// $Id$
//
// Site javascript code
//


// Validate form
//
// Input: form = form object
//        valid_set = array of strings containing item descriptors:
//
//			items = new Array("name:req/filter:msg");
//
// Where name is the name of a form item, req is "req" (for required)
// or "opt" (for optional), filter is one of "word", "words", "email", "phone"
// or "any", or a regular expression (e.g., "name:req//\\w+ \\w+/:...").
// msg is the error message displayed if the form item fails validation.

function validate(form, valid_set, msg_prefix) {
 var wrong = '';
 var wrong_copy;
 var first_bad = '';
 var is_radio;

 for (i = 0; i < valid_set.length; i++) {
  is_radio = false;
  wrong_copy = wrong;

  s = valid_set[i];

  p = s.indexOf(':');
  q = p + 1;
  name = s.substring(0, p);

  p = s.indexOf(':', q);
  filter = s.substring(q, p);
  msg = s.substr(p + 1) + "\n";

  p = filter.indexOf('/');
  q = p + 1;
  req = filter.substring(0, p);
  type = filter.substr(p + 1);

  eval('v = form.' + name + '.value;');

  if (v == undefined) { // probably a radio button
   eval('itemSet = form.' + name);
   is_radio = !!itemSet.length;
   for (x = 0; x < itemSet.length; x++) {
    if (itemSet[x].checked == true) {
     v = itemSet[x].value;
     break;
    }
    v = '';
   }
  }

  // trim spaces from ends
  while (((p = v.indexOf(' ')) == 0 || (p > 0 && p == (v.length - 1))))
   v = p ? v.substr(0, v.length - 1) : v.substr(1);

  if (v == '' && req == 'req')
   wrong += msg;
  if (req == 'max') {
  	if (v.length > parseInt(type)) {
	   wrong += msg;
	}
  }
  else if (v != '') {
   switch (type) {

   case "any":
    break;

   case "word":
    if (v.indexOf(' ') != -1)
     wrong += msg;
    break;

   case "words":
    if (v.indexOf(' ') < 0)
     wrong += msg;
    break;

   case "email":
    var emf2 = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
    var emailFilter = /^.+@.+\..{2,4}$/;
    var illegalChars = /[\(\)\<\>\,\;\:\\\/\"\[\]]/;
    if (!(emailFilter.test(v)) || v.match(illegalChars))
     wrong += msg;
    break;

   case "phone":
    var isDigit = /[0123456789]/;
    var validChars = /[\(\)\s\.\-\+\/xX]/;
    var digits = 0;
    for (j = 0; j < v.length; j++) {
     c = v.charAt(j);
     if (c.match(isDigit))
      digits++;
     else if (!c.match(validChars))
      break;
    }
    if (digits < 10)
      wrong += msg;
    break;

   case "ccard":
    var cc = "", j, l, c, n = 0;
    for (j = 0; j < v.length; j++) {
      c = v.charAt(j);
      if (c >= '0' && c <= '9') cc += c;
    }
    if ((l = cc.length) >= 15) {
      for (j = 0; j < l; j++) {
	var d = (cc.charCodeAt(l - j - 1) - 48) * (j % 2 + 1);
	n += d > 9 ? d % 10 + 1 : d;
      }
      if (n % 10 == 0) {
	v.value = cc;
	break;
      } 
    }
    wrong += msg;
    break;

   default:
    // regexp
    eval('var re = ' + type + ';');
    ok = re.test(v);
    if (!ok)
     wrong += msg;
    break;
    
   }
  }

  if (wrong != wrong_copy && first_bad == '' && !is_radio)
	first_bad = name;
 }

 if (wrong != '') {
  alert(msg_prefix + wrong);
  eval('form.' + first_bad + '.focus()');
  return false;
 }

 return true;
}
