/*!
 * @copyright 2010-Present Advanced Care Solutions, Inc.
 * @author Christopher Rahauiser <crahauiser@acs-web.com>
 * @depends jquery.ui.widget.js
 */
(function($) {
  $.widget('acs.watermark', {
    options: {
      hideAssociatedLabel: true,  // hide the label associated with the watermarked element
      watermarkClass: 'acs-watermark',  // the class applied to all watermarked elements
      watermarkCurrentClass: 'acs-watermark-current'  // the class applied to elements currently showing their watermark (removed on focus)
    },
    hideAllWatermarks: function() {
      if (this.options.disabled) {
        return;
      }
      var widget = this;
      this.element.each(function() {
        widget._hideWatermark(this);
      });
    },
    showAllWatermarks: function() {
      if (this.options.disabled) {
        return;
      }
      var widget = this;
      this.element.each(function() {
        widget._showWatermark(this);
      });
    },
    enable: function() {
      $.Widget.prototype.enable.apply(this, arguments);
    },
    disable: function() {
      $.Widget.prototype.disable.apply(this, arguments);
    },
    destroy: function() {
      var widget = this;

      this.element.each(function() {
        var elementLabel = $('label[for=' + this.id + ']');
        if (elementLabel.length < 1) {
          return;
        }

        var self = $(this);
        if (self.val() === self.data('watermarkText')) {
          self.val('');
        }
        var classes = widget.options.watermarkCurrentClass + ' ' +
          widget.options.watermarkClass;
        self
          .removeClass(classes)
          .removeData()
          .unbind('.watermark');

        if (widget.options.hideAssociatedLabel) {
          elementLabel.show();
        }
      });

      $.Widget.prototype.destroy.apply(this, arguments);
    },
    _create: function() {
      var widget = this;
      var watermarkData,
          removeElements = [];

      this.element.each(function(idx) {
        var elementLabel = $('label[for=' + this.id + ']');
        if (elementLabel.length < 1) {
          removeElements.push(idx);
          return;
        }
        var watermarkData = { watermarkText: elementLabel.text() };

        if (widget.options.hideAssociatedLabel) {
          elementLabel.hide();
        }

        var self = $(this);
        if ($.trim(self.val()) === '') {
          self.val(watermarkData.watermarkText);
        }

        if ($.trim(self.val()) === watermarkData.watermarkText) {
          self.addClass(widget.options.watermarkCurrentClass);
        }
        var clickFocusIn = $.proxy(widget._hideWatermarkHandler, widget);
        var focusOut = $.proxy(widget._showWatermarkHandler, widget);
        self
          .addClass(widget.options.watermarkClass)
          .data(watermarkData)
          .bind('click.watermark focusin.watermark', clickFocusIn)
          .bind('focusout.watermark', focusOut);
      });

      if (removeElements.length > 0) {  // remove elements without labels
        for (var i = -1, len = removeElements.length; ++i < len;) {
          this.element = this.element.not(':eq(' + removeElements[i] + ')');
        }
      }
    },
    _hideWatermarkHandler: function(event) {
      if (this.options.disabled) {
        return;
      }
      var wmarkObject = event.target;
      this._hideWatermark(wmarkObject);
    },
    _showWatermarkHandler: function(event) {
      if (this.options.disabled) {
        return;
      }
      var wmarkObject = event.target;
      this._showWatermark(wmarkObject);
    },
    _hideWatermark: function(wmarkObject) {
      wmarkObject = $(wmarkObject);
      if (wmarkObject.val() === wmarkObject.data('watermarkText')) {
        wmarkObject
          .val('')  // clear out value since watermark text is showing
          .removeClass(this.options.watermarkCurrentClass);
      }
    },
    _showWatermark: function(wmarkObject) {
      wmarkObject = $(wmarkObject);
      if ($.trim(wmarkObject.val()) === '') {
        wmarkObject
          .val(wmarkObject.data('watermarkText'))
          .addClass(this.options.watermarkCurrentClass);
      }
    }
  });
})(jQuery);
