   var labelRules = {};
  $$('label').each(function(labelElement)
    {
      var formInput = $(labelElement.readAttribute('for'));
      labelRules['#' + $(formInput).id] = function(el)
        {
          el.validationParams = { label: labelElement.innerHTML.substring(1) };
        };
    });
  Behaviour.register(labelRules);

var ValidationRules = 
  {
    messages: 
      {
        'validation.errors.required': '{0} is a required field',
        'validation.errors.validDomain': 'A corporate email domain is required to register.  Personal e-mail account domains such as yahoo.com and aol.com are not allowed'
      },

    getMessage: function(key, label)
      {
        var msg = ValidationRules.messages[key];
        if (label)
        {
          msg = msg.replace(/\{0\}/, label);
        }
        return msg;
      },

    invalidDomains:
      [
        'yahoo.com',
		'gmail.com',
        'msn.com',
        'aol.com',
		'inbox.com',
		'fastmail.com',
		'hotmail.com',
		'bluebottle.com',
		'bigstring.com',
		'goowy.com',
		'mywaymail.com',
		'care2.com',
		'hotpop.com',
		'mail.com',
		'shinyfeet.com',
		'myrealbox.com',
		'rock.com',
		'webpipe.net',
		'netzoola.com',
		'lycos.com',
		'comcast.net',
		'hushmail.com',
		'microsoft.com',
		'altiris.com',
		'symantec.com',
		'centennial.com',
		'expressmetrix.com',
		'dell.com',
		'esmart.com',
		'landesk.com',
		'ibm.com',
		'asap.com',
		'everdream.com',
		'silverback.com',
		'numarasoftware.com',
		'earthlink.net',
		'trackit.com',
		'magic.com',
		'kaseya.com',
		'nable.com',
		'n-able.com',
		'lpi.com',
		'levelplatforms.com',
		'netiq.com',
		'ca.com',
		'bmc.com',
		'sap.com',
		'paragent.com',
		'novell.com',
		'ingrammicro',
		'avocent',
		'adventnet.com',
        'gaggle.net'
      ],

    isNotEmpty: function(str)
      {
        return (str && str != '' && str.search(/\S/) > -1);
      },
        
    isValidDomain: function(str)
      {
        return (str && !$A(ValidationRules.invalidDomains).any(function(item) { return str.endsWith(item); }));
      },

    doSimpleTest: function(element, testName, validationTest)
      {
        element.validationTests = element.validationTests || {};
        element.validationTests[testName] = function(element)
          {
            if (!ValidationRules[validationTest](element.value))
            {
              return ValidationRules.getMessage("validation.errors." + testName,
                element.validationParams.label);
            }
            return '';
          };
      },
      
    handleRequired: function(element)
      {
        ValidationRules.doSimpleTest(element, 'required', 'isNotEmpty');
      },
      
    
    rules: function() {
        return {
          "INPUT.required": this.handleRequired,
          "TEXTAREA.required": this.handleRequired,
          "SELECT.required": this.handleRequired,         
            
          "INPUT.validDomain": function(element)
            {          
              ValidationRules.doSimpleTest(element, 'validDomain', 'isValidDomain');      
            },            
            
          
          "FORM.validatedForm": function(form)
            {
              form.submitted = false;
              form.validating = false;
              form.prepForResubmit = function() 
                {
                  // if submission was stopped for some reason besides invalid input
                  // this function will allow the form to be resubmitted
                  form.submitted = false;
                  form.validating = false;
                };
              form.onsubmit = function(event)
                {
                  // prevent user from clicking on submit button twice
                  if (!form.submitted && !form.validating)
                  {
                    form.validating = true;
                    // do any validations that affect the form as a whole, like checking for at least one input
                    var errorMsg = '';
                    var focusedField;
                    if (errorMsg == '') // if no problems yet
                    {
                      // do individual field validations
                      $A(form.elements).findAll(function(e) { return e.validationTests; }).each(function(e) 
                      {
                        if (!e.disabled)
                        {
                          for (test in e.validationTests)
                          {
                            var msg = e.validationTests[test](e);
                            if (msg != '') 
                            {
                              errorMsg += msg + '\n';
                              if (!focusedField && e.type != 'hidden') 
                                focusedField = e;
                            }
                          }
                        }
                      });
                    }
                    if (errorMsg != '')
                    {
                      alert(errorMsg);
                      if (focusedField)
                      {
                        focusedField.focus();
                      }
                      form.validating = false;
                      return false;
                    }
                    form.submitted = true;
                    return true;
                  }
                };
            }
        };
      }
  };
  
Behaviour.register(ValidationRules.rules());

