$modal: $()

in kitsune/sumo/static/sumo/js/gallery.js [85:187]


    $modal: $('#gallery-upload-modal'),
    // some mapping here for what to show/hide and when
    /*
    * -- check if a draft exists and open the modal if so
    * -- set up DOM events: selecting media type, click to cancel upload
    *    ajax uploads, require metadata, bind modal close event
    */
    init: function() {
      var self = this;
      self.forms.$image.showFade();

      // Bind cancel upload event.
      $('.progress a', self.$modal).on("click", function cancelUpload(ev) {
        var type = $(this).data('type');
        ev.preventDefault();
        self.cancelUpload($(this));
        self.setInputMessage(
          $(this).closest('.upload-form').find('input[name="' + type + '"]'),
          'cancelled'
        );
        return false;
      });

      // Bind ajax uploads for inputs
      $('input[type="file"]', self.$modal).each(function() {
        var $file = $(this), $form = $file.closest('.upload-form');
        $file.ajaxSubmitInput({
          url: $form.data('post-url'),
          beforeSubmit: function($input) {
            if (!self.isValidFile($file)) {
              self.uploadError($file, 'invalid');
              return false;
            }
            if (self.isTooLarge($file)) {
              self.uploadError($file, 'toolarge');
              return false;
            }
            return self.startUpload($file);
          },
          onComplete: function($input, iframeContent, options) {
            $input.closest('form')
            .trigger('ajaxComplete')[0].reset();
            self.uploadComplete($file, iframeContent, options);
          }
        });
      });

      // Deleting uploaded files sends ajax request.
      jQuery.fn.makeCancelUpload = function(options) {
        var $input = this,
          field_name = $input.data('name');
        if (!$input.is('input')) {
          return $input;
        }
        if ($input.length > 1) {
          // Apply to each individually.
          $input.each(function() {
            $(this).makeCancelUpload();
          });
          return $input;
        }

        var $form = $input.wrap('<form class="inline" method="POST" ' +
        'action=""/>').closest('form');
        // Also send the csrf token.
        $form.append($('input[name="csrfmiddlewaretoken"]')
        .first().clone());

        $input.on('click', function deleteField(ev) {
          ev.preventDefault();
          self.deleteUpload($input);
          return false;
        });
      };

      // Metadata should be required.
      self.$modal.find('.metadata input,.metadata textarea')
      .attr('required', 'required');

      // Closing the modal with top-right X cancels upload drafts
      self.$modal.on('click', 'a.close', function(e) {
        self.$modal.find('input[name="cancel"]:last').trigger("click");
      });

      // Submitting the form should call for validation first.
      function validateSubmit(ev) {
        if (!self.validateForm($(ev.target))) {
          ev.preventDefault();
          return false;
        }
      }
      self.forms.$image.find('input[name="upload"]').on("click", validateSubmit);


      if (self.forms.$image.hasClass('draft')) {
        // draft
        self.draftSetup();
      } else {
        // not draft
        self.modalReset();
      }

    },