var CTI = {};

if (document.addEventListener)
{
  CTI.addEventListener = function(target, type, listener)
  {
    target.addEventListener(type, listener, false);
  };

  CTI.removeEventListener = function(target, type, listener)
  {
    target.removeEventListener(type, listener, false);
  };

  CTI.preventDefault = function(event)
  {
    event.preventDefault();
  };
}
else if (document.attachEvent)
{
  CTI.addEventListener = function(target, type, listener)
  {
    if (CTI._findListener(target, type, listener) != -1) return;

    var listener2 = function()
    {
      var event = window.event;

      if (Function.prototype.call)
      {
        listener.call(target, event);
      }
      else
      {
        target._currentListener = listener;
        target._currentListener(event)
        target._currentListener = null;
      }
    };

    target.attachEvent("on" + type, listener2);

    var listenerRecord =
    {
      target: target,
      type: type,
      listener: listener,
      listener2: listener2
    };

    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    var listenerId = "l" + CTI._listenerCounter++;

    if (!targetWindow._allListeners) targetWindow._allListeners = {};
    targetWindow._allListeners[listenerId] = listenerRecord;

    if (!target._listeners) target._listeners = [];
    target._listeners[target._listeners.length] = listenerId;

    if (!targetWindow._unloadListenerAdded)
    {
      targetWindow._unloadListenerAdded = true;
      targetWindow.attachEvent("onunload", CTI._removeAllListeners);
    }
  };

  CTI.removeEventListener = function(target, type, listener)
  {
    var listenerIndex = CTI._findListener(target, type, listener);
    if (listenerIndex == -1) return;

    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    var listenerId = target._listeners[listenerIndex];
    var listenerRecord = targetWindow._allListeners[listenerId];

    target.detachEvent("on" + type, listenerRecord.listener2);
    target._listeners.splice(listenerIndex, 1);
    
    delete targetWindow._allListeners[listenerId];
  };

  CTI.preventDefault = function(event)
  {
    event.returnValue = false;
  };

  CTI._findListener = function(target, type, listener)
  {
    var listeners = target._listeners;
    if (!listeners) return -1;

    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    for (var i = listeners.length - 1; i >= 0; i--)
    {
      var listenerId = listeners[i];

      var listenerRecord = targetWindow._allListeners[listenerId];

      if (listenerRecord.type == type && listenerRecord.listener == listener)
      {
        return i;
      }
    }
    return -1;
  };

  CTI._removeAllListeners = function()
  {
    var targetWindow = this;

    for (id in targetWindow._allListeners)
    {
      var listenerRecord = targetWindow._allListeners[id];
      listenerRecord.target.detachEvent(
          "on" + listenerRecord.type, listenerRecord.listener2);
      delete targetWindow._allListeners[id];
    }
  };

  CTI._listenerCounter = 0;
}

CTI.start = function(runnable)
{
  CTI.addEventListener(window, "load", runnable.init);
};

var FormValidation =
{
  init: function()
  {
    var forms = document.getElementsByTagName("form");
    
    for (var i = 0; i < forms.length; i++)
    {
      CTI.addEventListener(forms[i], "submit", FormValidation.submitListener);
    }
  },

  rules:
  {
    name: /\S/,
    email: /^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/
  },

  errors:
  {
    name: "Please enter your name.",
    email: "Please enter a valid email address into this field."
  },
  
  submitListener: function(event)
  {
    var fields = this.elements;
    
    for (var i = 0; i < fields.length; i++)
    {
      var className = fields[i].className;
      var classRegExp = /(^| )(\S+)\b/g;
      var classResult;
      
      while (classResult = classRegExp.exec(className))
      {
        var oneClass = classResult[2];
        var rule = FormValidation.rules[oneClass];
        if (typeof rule != "undefined")
        {
          if (!rule.test(fields[i].value))
          {
            fields[i].focus();
            alert(FormValidation.errors[oneClass]);
            CTI.preventDefault(event);
            return;
          }
          else if (rule.test(fields[i].value))
          {
          	alert("Thank you for submitting. Your comment will be posted shortly.");
          	return;
          }
        }
      }
    }
  }
};

CTI.start(FormValidation);