/* $Id: handlers.js,v 1.4 2006/06/05 17:16:09 dmz Exp $ */
// Require regexpvalidate.js

//-------------------------------------------------------------------
// FieldType enumeration
var FieldType =
{
  TEXT:     0x00000001 /*  1 */,
  PASSWORD: 0x00000002 /*  2 */,
  EMAIL:    0x00000004 /*  4 */,
  REQUIRED: 0x00000010 /* 16 */,
  FIELD_TYPE_MASK: 0x0000000F,
  REQUIRED_MASK:   0x000000F0
};

//-------------------------------------------------------------------
// CharType enumeration (character classes)
var CharType =
{
  DEFAULT:  0x00000100 /*   256 */,
  RESTRICT: 0x00000200 /*   512 */,
  ALPHA:    0x00001000 /*  4096 */,
  NUMERIC:  0x00002000 /*  8192 */,
  OTHER:    0x00004000 /* 16384 */,
  DEFAULT_MASK:  0x00000100,
  RESTRICT_MASK: 0x0000FE00
};

function alertFocus(message, control, select)
{
  alert(message);
  if (control)
  {
    if (control.focus)
      control.focus();
    if (control.select && select)
      control.select();
  }
}

function emailValidator(field)
{
  var ft = field.fieldtype ? field.fieldtype : field.getAttribute ? field.getAttribute('fieldtype') : '';
  if (ft) ft = parseInt(ft); else ft = FieldType.TEXT | CharType.DEFAULT;
  if ((ft & FieldType.FIELD_TYPE_MASK) == FieldType.EMAIL)
  {
    if (!validateEmail(field.value))
    {
      alertFocus('The value you entered is not valid e-mail address.  Please correct it.', field, true);
      return false;
    }
  }
  return true;
}

// TODO:  DEBUG RESTRICTIONS !!!
function restrictInput(evt, field)
{
  var ft = field.fieldtype ? field.fieldtype : field.getAttribute ? field.getAttribute('fieldtype') : '';
  if (ft) ft = parseInt(ft); else ft = FieldType.TEXT | CharType.DEFAULT;
  if (((ft & FieldType.FIELD_TYPE_MASK) == FieldType.TEXT)
    && field.type && (field.type.toLowerCase() == 'text'))
  {
    evt = (evt) ? evt : event;
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : ((evt.which) ? evt.which : 0));
    if (((ft & CharType.RESTRICT_MASK) != 0) && (charCode > 31))
    {
      //*DEBUG*/ alert(charCode);
      var re = '';
      if ((ft & CharType.ALPHA) != 0)   re += '\\w';
      if ((ft & CharType.NUMERIC) != 0) re += '\\d';
      if ((ft & CharType.OTHER) != 0)   re += '\\W\\D';
      //*DEBUG*/ alert(re);
      if (re == '\\w\\d\\W\\D')  // Really no restrictions
        return true;
      if (re == '')  // All characters are prohibited
        return false;
      re = new RegExp('[' + re + ']');
      //if (!re.test(String.fromCharCode(charCode)))
      if (!String.fromCharCode(charCode).match(re))
        return false;
    }
  }
  return true;
}

function validateForm(frm)
{
  var i, elem, required;
  var elements = new Array();
  elements.addElement = function(elem)
  {
    if (typeof this[elem.name] != 'undefined')
      return true;

    var e = new Object();
    e.type = 'undefined';
    e.values = new Array();
    e.title = '';
    e.required = false;

    var node = document.getElementById(elem.name + '_title');
    var ft;
    if (node && node.hasChildNodes() && (node.firstChild.nodeType == 3))
      e.title = node.firstChild.nodeValue;

    switch (elem.tagName.toLowerCase())
    {
      case 'input':
        switch (elem.type.toLowerCase())
        {
          case 'text':
          case 'password':
            e.type = 'text';
            break;

          case 'checkbox':
            e.type = 'check';
            break;

          case 'radio':
            e.type = 'radio';
            break;

          case 'hidden':
          case 'button':
          case 'submit':
          case 'reset':
          case 'image':
            return false;
        }
        break;

      case 'textarea':
        e.type = 'text';
        break;

      case 'select':
        e.type = 'list';
        break;

      default:
        return false;
    }
    switch (e.type)
    {
      case 'text':
        ft = elem.getAttribute('fieldtype');
        if (ft)
        {
          ft = parseInt(ft);
          e.required = (ft & FieldType.REQUIRED_MASK) == FieldType.REQUIRED;
          if ((ft & FieldType.FIELD_TYPE_MASK) == FieldType.EMAIL)
            e.type = 'email';
        }
        break;

      case 'check':
      case 'radio':
      case 'list':
        e.required = elem.form.elements[elem.name + '_required'].value == '16';
        break;

      default:
        return false;
    }

    this.push(e);
    this[elem.name] = e;
    return true;
  };
  elements.add = function(elem)
  {
    if (this.addElement(elem))
    {
      var v = new Object();
      v.element = elem;
      v.value = elem.value;
      v.checked = (typeof elem.checked != 'undefined') ? elem.checked : false;
      this[elem.name].values.push(v);
    }
  };
  elements.validate = function()
  {
    var e, name, i;
    for (name in this)
    {
      e = this[name];
      if (e.required)
      {
        switch (e.type)
        {
          case 'text':
          case 'email':
          case 'list':
            for (i = 0; i < e.values.length; i++)
            {
              if (!validateNotEmpty(e.values[i].value))
              {
                alertFocus('The "' + (e.title ? e.title : name) + '" field is required.',
                    e.values[i].element, true);
                return false;
              }
            }
            break;

          case 'check':
          case 'radio':
            for (i = 0; i < e.values.length; i++)
              if (e.values[i].checked)
                break;
            if (i == e.values.length)
            {
              alertFocus('You must '
                  + ((e.type == 'check') ? 'check at least one checkbox.' : 'select one option.'),
                  e.values[0].element);
              return false;
            }
            break;

          default:
            break;
        }
      }
    }
    return true;
  }

  for (i = 0; i < frm.elements.length; i++)
    elements.add(frm.elements[i]);

  if (!elements.validate())
    return false;

  if (frm.autorespenabled.value == '1')
  {
    for (i = 0; i < elements.length; i++)
      if ((elements[i].type == 'email') && elements[i].required)
        break;

    if (i == elements.length)
    {
      alert('You have selected auto-response e-mail for this form.  For this feature to work '
          + 'the form must have required e-mail field.');
      return false;
    }
  }

  if ((typeof frm.siteurl != 'undefined') && (typeof frm.siteurl.value != 'undefined'))
  {
    var siteurl = location.href;
    i = siteurl.lastIndexOf('/');
    if (i >= 0) siteurl = siteurl.substring(0, i + 1);
    frm.siteurl.value = siteurl;
  }

  return true;
}
