// Copyright 2001-4, John Lloyd-Jones
// Requires: base.js
var _init_validate = function () {};
var _init_required = function () {};
if (document.getElementsByTagName) _init_validate = function ()
{
   var is=document.getElementsByTagName('input');
   for(n=0;n<is.length;n++)
   {
      var i = is[n];
      if (hasClass (i, 'phone') && (i.id))
      {
         _makeValidateablePhone(i);
      }
      if(hasClass(i,'zipcode')&&(i.id))
      {
         _makeValidateableZip(i);
      }
   }
   is = getElementsByClassName ('required');
   for (n = 0; n < is.length; n++)
   {
      var i = is[n];
      _makeRequired(i);
   }
}
function _makeValidateablePhone (input){addEvent (input, "blur", _validateNumber);}
function _makeValidateableZip (input){addEvent (input, "blur", _validateZip);}
function _makeRequired (elm) {elm.required=true;updateValidationMarker(elm,_sRequiredBackground);}

var _sVoidBackground = 'url(images/void.png)';
var _sRequiredBackground = 'url(images/required.png)';
var _sPassBackground = 'url(images/pass.png)';
var _sFailBackground = 'url(images/fail.png)';

function _validateNumber (elm)
{
   var target = getEventSource (elm);
   normaliseNumber (target);
}
function formatUsaPhoneNumber (s)
{
   var sFormatted = '';
   var nLen = s.length;
   if (s.length > 10 && (s.charAt (0) == '1'))
   {
      nLen = 11;
      sFormatted = '1-';
   }
   else if (s.length != 10)
      return s;

   sFormatted += '(';
   sFormatted += s.substring (nLen-10, nLen-7);
   sFormatted += ') ';
   sFormatted += s.substring(nLen-7, nLen-4);
   sFormatted += ' ';
   sFormatted += s.substring(nLen-4);
   return sFormatted;
}
function updateValidationMarker (o, s)
{
   var obj = o;
   while (obj != null && ! (obj.tagName == 'SPAN' || obj.tagName == 'span'))
   {
      obj = obj.parentNode;
   }
   if (obj)
      obj.style.backgroundImage = s;
}

function isDisplayed (elm)
{
   var displayed = true;
   while (elm && elm.tagName != 'BODY')
   {
      elm = elm.parentNode;
      if (elm.style && (elm.style.display == 'none'))
      {
         displayed = false;
         break;
      }
   }
   return displayed;
}

function validateRequiredFields ()
{
   var invalid = 0;
   var is = getElementsByClassName ('required');
   for (var n= 0; n < is.length; n++)
   {
      var i = is [n];
      // NB! clientWidth will be zero if the container has display = 'none'
      if (i.value == '' && isDisplayed (i))
      {
         invalid++;
         s = _sFailBackground
      }
      else
      {
         s = _sPassBackground;
      }
      updateValidationMarker (i, s);
   }
   return (invalid == 0);
}

function normaliseNumber (obj)
{
   if (obj == null)
      return;

   var cFirst = ' ';
   var nDigits = 0;
   var sCanonical = "";
   var sEntered = obj.value;
   for (n = 0; n < sEntered.length; n++)
   {
      cFirst = sEntered.charAt (n);
      if (isDigit (cFirst))
         break;
   }
   for (n = 0; n < sEntered.length; n++)
   {
      c = sEntered.charAt (n);
      if (isDigit (c))
      {
         ++nDigits;
         sCanonical += c;
      }
      else if (c == '-' || c == '.')
      {
         // that's OK
      }
      else if (c == ' ')
      {
         // Check if a full number has been given
         if ((cFirst == '1' && nDigits == 11) || (cFirst != '1' && nDigits == 10))
         {
            break;
          }
      }
      else if (c == '(')
      {
          nLeftParenthesis = n;
      }
      else if (c == ')')
      {
         nRightParenthesis = n;
      }
      else
      {
         break;
      }
   }// end for
   if (sCanonical.length == 0 && cFirst == ' ')
   {
      sImage = obj.required?_sRequiredBackground:_sVoidBackground;
      obj.valid = null;
   }
   else if ((cFirst == '1' && nDigits != 11) || (cFirst != '1' && nDigits != 10))
   {
      bValid = false;
      sImage = _sFailBackground;
      obj.valid = false;
   }
   else
   {
     obj.value = formatUsaPhoneNumber (sCanonical);
     sImage = _sPassBackground;
     obj.valid = true;
   }
   updateValidationMarker (obj, sImage);
}
/* handler version */
function _validateZip(elm)
{
   var target = getEventSource (elm);
   doValidateZip (target);
}
/* callable version */
function doValidateZip(elm)
{
   var cFirst = ' ';
   var nDigits = 0;
   var sCanonical = "";
   var sEntered = elm.value;
   var n = 0;
   for (n = 0; n < sEntered.length; n++)
   {
      cFirst = sEntered.charAt (n);
      if (isDigit (cFirst))
         break;
   }
   for (; n < sEntered.length; n++)
   {
      c = sEntered.charAt (n);
      if (isDigit (c))
      {
         ++nDigits;
         sCanonical += c;
      }
   }
   if (sCanonical.length == 0 && cFirst == ' ')
   {
      sImage = elm.required?_sRequiredBackground:_sVoidBackground;
      elm.valid = null;
   }
   else if (sCanonical.length == 9)
   {
      elm.value = sCanonical.substring(0,5) + '-' + sCanonical.substring(5);
      elm.valid = true;
      sImage = _sPassBackground;
   }
   else if (sCanonical.length == 5)
   {
      elm.value = sCanonical;
      elm.valid = true;
      sImage = _sPassBackground;
   }
   else
   {
      elm.valid = false;
      sImage = _sFailBackground;
   }
   updateValidationMarker (elm, sImage);
}

addEvent(window, "load", _init_validate);
