var EmailPage = {

    _formObj: {},

    initialize: function(container_selector, toggle_selector, response_selector) {
      var $form_container = $(container_selector);
      this._formObj.container = $form_container;
      this._formObj.form = $form_container.children('form');
      this._formObj.toggle = $(toggle_selector);
      this._formObj.response = $(response_selector);
      this._initEventHandlers();
    },

    _initEventHandlers: function() {
      var _this = this,
          fo = _this._formObj;

      fo.toggle.click(function(e) {
        e.preventDefault();
        e.stopPropagation();
        fo.response.slideUp();
        if (fo.container.is(':visible')) {
          fo.container.hide();
        } else {
          fo.container.show();
          site.analytics.callAdapters('emailPage','open');
        }
      });

      fo.response.find('.close-button, .ok-button').click(function(e) {
        e.preventDefault();
        e.stopPropagation();
        fo.response.slideUp();
      });

      fo.container.find('.close-button, .ok-button').click(function(e) {
        e.preventDefault();
        e.stopPropagation();
        fo.container.slideUp();
      });

      fo.container.find('.send-email').click(function(e) {
        e.preventDefault();
        e.stopPropagation();
        fo.form.submit();
      });

      fo.form.submit(function() {        
        _this._sendEmail();
        return false;
      });

      fo.form.find('input[type="text"]').each(function() {
        $(this).placeholder();
      });

    },

    _validate: function() {

      var returnObj = {pass: true, validatedFields: []},
      validator = {
        "toName": {
          re: {
            test: new RegExp("[a-zA-Z0-9\- ]$"),
            msg: "Please enter the recipient's name"
          }
        },
        "toEmail": {
          re: {
            test: new RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)"),
            msg: "Enter a valid email address"
          }
        },
        "replyToAddress": {
          re: {
            test: new RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)"),
            msg: "Enter a valid email address"
          }
        },
        "fromName": {
          re: {
            test: new RegExp("[a-zA-Z0-9\- ]$"),
            msg: "Please enter your name"
          }
        },
        "fromAddress": {
          re: {
            test: new RegExp("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)"),
            msg: "Enter a valid email address"
          }
        },
        "message": {
          maxLength: {
            test: 500,
            msg: "Message must be less than 500 characters"
          }
        }
      },
      fo = this._formObj,
      runTests = function($element, validate) {

        var value = $.trim($element.val()),
            pass = true,
            validateMessage = '';

        for (var prop in validate) {
          if (validate.hasOwnProperty(prop)) {
            switch (prop) {
              case 're':
                pass = validate[prop].test.test(value);
                validateMessage = validate[prop].msg;
                break;
              case 'maxLength':
                pass = (value.length < validate[prop].test);
                validateMessage = validate[prop].msg;
                break;
            }
            if (!pass) break;
          }
        }

        if (pass) {
          $element.removeClass('invalid');
        } else {
          $element.attr('placeholder', validateMessage);
          $element.data('old-value', $element.val()).val('').focus(function() {
            $(this).val($(this).data('old-value')).unbind('focus');
          });
          $element.placeholder();
          $element.addClass('invalid');
        }

        return {pass: pass, msg: validateMessage};
      };

      fo.form.find('.validate').each(function(index, element) {

        var validate = validator[element.name],
            $el = $(element),
            validatedField = runTests($el, validate);
        
        if (!validatedField.pass) {
          returnObj.pass = false;
          returnObj.validatedFields.push(validatedField);
        }
        
      });

      return returnObj;

    },

    _sendEmail: function() {
      var fo = this._formObj,
          _this = this,
          validated = _this._validate();

      if (!validated.pass) {
        site.analytics.callAdapters('emailPage','error', validated.validatedFields[0].msg);
        return;
      }

      $.ajax({
        type: 'POST',
        url: window.location.href,
        data: fo.form.serialize(),
        success: function(data, textStatus, jqXHR) {
          site.analytics.callAdapters('emailPage','success');
          fo.form[0].reset();
          _this._showPopup('Your email has been sent!', true);
        },
        error: function() {
          site.analytics.callAdapters('emailPage','error','server error');
          _this._showPopup('There was an error sending this email.',false);
        }
      });         
    },

    _showPopup: function(text,autoUp) {
      var fo = this._formObj;

      fo.response.find('.message').html(text);
      fo.container.slideUp(function() {
        fo.response.slideDown();
        if (autoUp) fo.response.delay(4000).slideUp();
      });
    }

  };



  $(document).ready(function() {
    EmailPage.initialize('#email-form','#top-header li a.email','#email-status');
  });
