(function($) {
  $.widget("ui.gallery_in_place_edit", {
    options: {},

    _create: function() {
      var self = this;
      this.element.click(function(event) {
        event.preventDefault();
        self._show(event.currentTarget);
        return false;
      });
    },

    _show: function(target) {
      if ($(target).data("gallery_in_place_edit") == true) {
        return;
      }
      $(target).data("gallery_in_place_edit", true);
      var self = this;
      var tag_width = $(target).width();
      $(self).data("tag_width", tag_width);

      var form = $("#g-in-place-edit-form");
      if (form.length > 0) {
        self._cancel();
      }

      $.get(self.options.form_url.replace("__ID__", $(target).attr('rel')), function(data) {
        var parent = $(target).parent();
        parent.children().hide();
        parent.append(data);
        self._setup_form(parent.find("form"));
      });
    },

    _setup_form: function(form) {
      var self = this;
      var width = $(self).data("tag_width");
      form.find(":text").width(width).focus();
      form.find(".g-cancel").click(function(event) {
        self._cancel();
        event.preventDefault();
        return false;
      });
      $(".g-short-form").gallery_short_form();
      this._ajaxify_edit();
    },

    _cancel: function() {
      var parent = $("#g-in-place-edit-form").parent();
      $("#g-in-place-edit-form").remove();
      $(parent).children().show();
      $(parent).find(".g-editable").data("gallery_in_place_edit", false);
    },

    _ajaxify_edit: function() {
      var self = this;
      var form = $("#g-in-place-edit-form");
      $(form).ajaxForm({
        dataType: "json",
        success: function(data) {
          if (data.result == "success") {
            window.location.reload();
          } else {
            var parent = $(form).parent();
            $(form).replaceWith(data.form);
            self._setup_form(parent.find("form"));
          }
        }
      });
    }
  });
})(jQuery);
