<!--

   function Validate() {};
      Validate.EMAIL   = 1;
      Validate.INT     = 2;
      Validate.STR     = 4;
      Validate.DATE    = 8;
      Validate.ZIP     = 16;   // either
      Validate.ZIP9    = 32;   // xxxxx-xxxx
      Validate.ZIP5    = 64;   // xxxxx
      Validate.DECIMAL = 128;
      Validate.CONFIRM = 256;
      Validate.REQ     = 512;
      Validate.TOPTYPE = 512;

      Validate.types = Array();

      Validate.types[ Validate.EMAIL   ] = "a valid Email Address";
      Validate.types[ Validate.INT     ] = "a Number";
      Validate.types[ Validate.STR     ] = "a String";
      Validate.types[ Validate.DATE    ] = "a Date";
      Validate.types[ Validate.ZIP     ] = "a valid US Zip Code (00000 or 00000-0000)";
      Validate.types[ Validate.ZIP9    ] = "a valid US Zip Code + 4 (00000-0000)";
      Validate.types[ Validate.ZIP5    ] = "a valid US Zip Code (00000)";
      Validate.types[ Validate.DECIMAL ] = "a valid Number with optional Decimal (0 or 0.00)";
      Validate.types[ Validate.REQ     ] = "completed";
      Validate.types[ Validate.CONFIRM ] = "an exact match";

      Validate.getType =
         function( type ) { return Validate.types[ type ]; }

      Validate.validateField =
         function( fieldSpecs, confirmationSpecs, field ) {
            var val = field.value;

            var r, tempType;

            var curType = Validate.TOPTYPE;
            var iType   = Validate.getIType( fieldSpecs, field );

            while( iType > 0 ) {
               tempType = iType - curType;

               if( tempType >= 0 ) {
                  iType = tempType;

                  try {
                     r = Validate.validateFunctions[ curType ]( val, field.name, confirmationSpecs ); }
                  catch( e ) {
                     r = Validate.validateFunctions[ curType ]( val ); }

                  if( !r ) { if( !document.layers ) { field.style.backgroundColor = '#ffeedd'; return curType; } } }

               curType /= 2; }

            if( !document.layers ) {
               field.style.backgroundColor = '#e2e2e2';

               return 0; } }

      Validate.getIType =
         function( fieldSpecs, field ) {
            var iType = fieldSpecs[ field.name ];

            if( !iType ) {
               return ( 0 ); }
            else {
               return ( iType ); } }

      Validate.containsType = function( field, checkType ) {
         var iType = Validate.getIType( field );
         var mi    = checkType;
         var ma    = checkType * 2 - 1;

         return( ( iType >= mi ) && ( iType <= ma ) ); }

      Validate.validateField.EMAIL =
         function( val ) {
            if( ( Validate.numOf( '@', val ) != 1 ) || ( Validate.numOf( '.', val ) < 1 ) ) {
               return false; }
            else {
               return true; } }

      Validate.validateField.DATE =
         function( val ) {
            while( val.indexOf( "-" ) != -1 ) { val = val.replace( "-", "/" ); }

            var firstSl = val.indexOf( "/" );

            if( firstSl == 1 ) { val = "0" + val; }

            var secondSl = val.substring( val.indexOf( "/" ) + 1 ).indexOf( "/" ) + 3;

            if( secondSl == 4 ) { val = val.substring( 0, 3 ) + "0" + val.substring( 3 ); }

            if( val.length != 10 ) { return false; }

            for( i = 0; ( i < 10 ) && ( valid == true ); i++ ) {
               cur = val.substring( i, i + 1 );

               if( ( i == 2 ) || ( i == 5 ) ) {
                  if( cur != "/" ) { return false; } }
               else if( Validate.isNumber( cur ) == false ) {
                  return false; } }

            return true; }

      Validate.validateField.ZIP5 =
         function( val ) {
            if( val.length != 5 ) { return false; }

            var cur;

            for( i = 0; i < 5; ++i ) {
               cur = val.substring( i, i + 1 );

               if( Validate.isNumber( cur ) == false ) { return false; } }

            return true; }

      Validate.validateField.ZIP9 =
         function( val ) {
            if( val.length != 10 ) { return false; }

            var cur;

            for( i = 0; i < 5; ++i ) {
               cur = val.substring( i, i + 1 );

               if( Validate.isNumber( cur ) == false ) { return false; } }

            cur = val.substring( i, i + 1 );

            if( cur != '-' ) { return false; }

            for( i = 6; i < 10; ++i ) {
               cur = val.substring( i,i + 1 );

               if( Validate.isNumber( cur ) == false ) { return false; } }

            return true; }

      Validate.validateField.ZIP =
         function( val ) {
            return( Validate.validateField.ZIP5( val ) || Validate.validateField.ZIP9( val ) ); }

      Validate.validateField.DECIMAL =
         function( val ) {
            var cur;

            while( val.indexOf( "," ) != -1 ) { val = val.replace( ",", "" ); }

            var numdot = 0;

            for( i = 0; i < val.length; i++ ) {
               cur = val.substring( i, i + 1 );

               if( cur == "." ) { numdot++; }
               if( !( ( ( ( cur >= "0" ) && ( cur <= "9" ) ) || ( cur == "." ) ) && ( numdot <= 1 ) ) ) { return false; } }

            return true; }

      Validate.validateField.INT =
         function( val ) {
            var cur;

            while( val.indexOf( "," ) != -1 ) { val = val.replace( ",", "" ); }

            for( i = 0; ( i <val.length ) && ( valid == true ); i++ ) {
               cur = val.substring( i, i + 1 );

               if( !( ( cur >= "0" ) && ( cur <= "9" ) ) ) { return false; } }

            return true; }

      Validate.validateField.STR =
         function( val ) { return true; }

      Validate.validateField.REQ =
         function( val ) { return ( val != '' ); }

      Validate.validateField.CONFIRM =
         function( val, key, confirmationSpecs ) {
            try {
               if( document.getElementById( confirmationSpecs[ key ] ).value ) {
                  if( val != document.getElementById( confirmationSpecs[ key ] ).value ) { return false; } } } catch( e ) {}

            return true; }

      // -- helpers --
      Validate.isNumber = function( val ) {
         return ( ( val >= "0" ) && ( val <= "9" ) ); }

      Validate.numOf =
         function( key, val ) {
            var numof = 0;

            var i;

            var kl   = key.length;
            var maxl = val.length - kl + 1;

            for( i = 0; i < maxl; i++ ) {
               if( val.substring( i, i + kl ) == key ) { numof++; } }

            return ( numof ); }

      // -- static form walker --
      Validate.validateForm =
         function( fieldSpecs, confirmationSpecs, form ) {
            var errorMsg   = '';
            var firstError = null;

            var result;

            for( var i in fieldSpecs ) {
               var cur = form[ i ];

               if( ( result = Validate.validateField( fieldSpecs, confirmationSpecs, cur) ) != 0 ) {
                  errorMsg += cur.name + ' must be ' + Validate.types[ result ] + '\n';

                  if( !firstError ) { firstError = cur; } } }

            if( errorMsg == '' ) {
               return true; }
            else {
               alert( 'Please correct any errors before continuing.\n\n' + errorMsg );

               firstError.focus();

               return false; } }

      // -- Functions array --
      Validate.validateFunctions = Array();

      Validate.validateFunctions[ Validate.EMAIL   ] = Validate.validateField.EMAIL;
      Validate.validateFunctions[ Validate.INT     ] = Validate.validateField.INT;
      Validate.validateFunctions[ Validate.STR     ] = Validate.validateField.STR;
      Validate.validateFunctions[ Validate.DATE    ] = Validate.validateField.DATE;
      Validate.validateFunctions[ Validate.ZIP     ] = Validate.validateField.ZIP;
      Validate.validateFunctions[ Validate.ZIP9    ] = Validate.validateField.ZIP9;
      Validate.validateFunctions[ Validate.ZIP5    ] = Validate.validateField.ZIP5;
      Validate.validateFunctions[ Validate.DECIMAL ] = Validate.validateField.DECIMAL;
      Validate.validateFunctions[ Validate.REQ     ] = Validate.validateField.REQ;
      Validate.validateFunctions[ Validate.CONFIRM ] = Validate.validateField.CONFIRM;

//-->
