(function ($) {
  var handlers = {
    focus: function () {
      var jThis = this,
          options = jThis.data('settings.placeholder');

      if (jThis.val() === jThis.attr('placeholder')) {
        jThis.val('');
        jThis.removeClass(options.placeHolderClass);
      }
    },

    blur: function () {
      var jThis = this,
          options = jThis.data('settings.placeholder');

      if (jThis.val() === '') {
        jThis.val(jThis.attr('placeholder'));
        jThis.addClass(options.placeHolderClass);
      }
    },

    submit: function (evt) {
      var jThis = this;

      if (jThis.val() === jThis.attr('placeholder')) {
        jThis.val('');
      }
    }
  }

  $.fn.placeholder = function (options) {
    var settings = {
      placeHolderClass: 'placeholder'
    }

    $.extend(settings, options);

    return this.each(function () {
      var jThis = $(this);

      if (jThis.data('initialized.placeholder') === true) {
        return
      }

      jThis.data('initialized.placeholder', true);
      jThis.data('settings.placeholder', settings);

      jThis.bind('focus.placeholder', function () {
        return handlers.focus.apply(jThis, arguments);
      });

      jThis.bind('blur.placeholder', function () {
        return handlers.blur.apply(jThis, arguments);
      });

      $(jThis.closest('form')[0]).bind('submit.placeholder', function () {
        return handlers.submit.apply(jThis, arguments);
      });

      handlers.blur.apply(jThis);
    })
  }
})(jQuery);
