topical media & game development

talk show tell print

lib-jquery-style-custom-development-bundle-ui-ui.selectable.js / js



  /*
   * jQuery UI Selectable 1.7.1
   *
   * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
   * Dual licensed under the MIT (MIT-LICENSE.txt)
   * and GPL (GPL-LICENSE.txt) licenses.
   *
   * http://docs.jquery.com/UI/Selectables
   *
   * Depends:
   *        ui.core.js
   */
  (function() {
  
  .widget("ui.selectable", .extend({}, .ui.mouse, {
  
          _init: function() {
                  var self = this;
  
                  this.element.addClass("ui-selectable");
  
                  this.dragged = false;
  
                  // cache selectee children based on filter
                  var selectees;
                  this.refresh = function() {
                          selectees = $(self.options.filter, self.element[0]);
                          selectees.each(function() {
                                  var this = this;
                                  var pos = this.offset();
                                  .data(this, "selectable-item", {
                                          element: this,
                                          element: this,
                                          left: pos.left,
                                          top: pos.top,
                                          right: pos.left + this.outerWidth(),
                                          bottom: pos.top + this.outerHeight(),
                                          startselected: false,
                                          selected: this.hasClass('ui-selected'),
                                          selecting: this.hasClass('ui-selecting'),
                                          unselecting: this.hasClass('ui-unselecting')
                                  });
                          });
                  };
                  this.refresh();
  
                  this.selectees = selectees.addClass("ui-selectee");
  
                  this._mouseInit();
  
                  this.helper = $(document.createElement('div'))
                          .css({border:'1px dotted black'})
                          .addClass("ui-selectable-helper");
          },
  
          destroy: function() {
                  this.element
                          .removeClass("ui-selectable ui-selectable-disabled")
                          .removeData("selectable")
                          .unbind(".selectable");
                  this._mouseDestroy();
          },
  
          _mouseStart: function(event) {
                  var self = this;
  
                  this.opos = [event.pageX, event.pageY];
  
                  if (this.options.disabled)
                          return;
  
                  var options = this.options;
  
                  this.selectees = $(options.filter, this.element[0]);
  
                  this._trigger("start", event);
  
                  $(options.appendTo).append(this.helper);
                  // position helper (lasso)
                  this.helper.css({
                          "z-index": 100,
                          "position": "absolute",
                          "left": event.clientX,
                          "top": event.clientY,
                          "width": 0,
                          "height": 0
                  });
  
                  if (options.autoRefresh) {
                          this.refresh();
                  }
  
                  this.selectees.filter('.ui-selected').each(function() {
                          var selectee = .data(this, "selectable-item");
                          selectee.startselected = true;
                          if (!event.metaKey) {
                                  selectee.element.removeClass('ui-selected');
                                  selectee.selected = false;
                                  selectee.element.addClass('ui-unselecting');
                                  selectee.unselecting = true;
                                  // selectable UNSELECTING callback
                                  self._trigger("unselecting", event, {
                                          unselecting: selectee.element
                                  });
                          }
                  });
  
                  $(event.target).parents().andSelf().each(function() {
                          var selectee = .data(this, "selectable-item");
                          if (selectee) {
                                  selectee.element.removeClass("ui-unselecting").addClass('ui-selecting');
                                  selectee.unselecting = false;
                                  selectee.selecting = true;
                                  selectee.selected = true;
                                  // selectable SELECTING callback
                                  self._trigger("selecting", event, {
                                          selecting: selectee.element
                                  });
                                  return false;
                          }
                  });
  
          },
  
          _mouseDrag: function(event) {
                  var self = this;
                  this.dragged = true;
  
                  if (this.options.disabled)
                          return;
  
                  var options = this.options;
  
                  var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
                  if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
                  if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
                  this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
  
                  this.selectees.each(function() {
                          var selectee = .data(this, "selectable-item");
                          //prevent helper from being selected if appendTo: selectable
                          if (!selectee || selectee.element == self.element[0])
                                  return;
                          var hit = false;
                          if (options.tolerance == 'touch') {
                                  hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
                          } else if (options.tolerance == 'fit') {
                                  hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
                          }
  
                          if (hit) {
                                  // SELECT
                                  if (selectee.selected) {
                                          selectee.element.removeClass('ui-selected');
                                          selectee.selected = false;
                                  }
                                  if (selectee.unselecting) {
                                          selectee.element.removeClass('ui-unselecting');
                                          selectee.unselecting = false;
                                  }
                                  if (!selectee.selecting) {
                                          selectee.element.addClass('ui-selecting');
                                          selectee.selecting = true;
                                          // selectable SELECTING callback
                                          self._trigger("selecting", event, {
                                                  selecting: selectee.element
                                          });
                                  }
                          } else {
                                  // UNSELECT
                                  if (selectee.selecting) {
                                          if (event.metaKey && selectee.startselected) {
                                                  selectee.element.removeClass('ui-selecting');
                                                  selectee.selecting = false;
                                                  selectee.element.addClass('ui-selected');
                                                  selectee.selected = true;
                                          } else {
                                                  selectee.element.removeClass('ui-selecting');
                                                  selectee.selecting = false;
                                                  if (selectee.startselected) {
                                                          selectee.element.addClass('ui-unselecting');
                                                          selectee.unselecting = true;
                                                  }
                                                  // selectable UNSELECTING callback
                                                  self._trigger("unselecting", event, {
                                                          unselecting: selectee.element
                                                  });
                                          }
                                  }
                                  if (selectee.selected) {
                                          if (!event.metaKey && !selectee.startselected) {
                                                  selectee.element.removeClass('ui-selected');
                                                  selectee.selected = false;
  
                                                  selectee.element.addClass('ui-unselecting');
                                                  selectee.unselecting = true;
                                                  // selectable UNSELECTING callback
                                                  self._trigger("unselecting", event, {
                                                          unselecting: selectee.element
                                                  });
                                          }
                                  }
                          }
                  });
  
                  return false;
          },
  
          _mouseStop: function(event) {
                  var self = this;
  
                  this.dragged = false;
  
                  var options = this.options;
  
                  $('.ui-unselecting', this.element[0]).each(function() {
                          var selectee = .data(this, "selectable-item");
                          selectee.element.removeClass('ui-unselecting');
                          selectee.unselecting = false;
                          selectee.startselected = false;
                          self._trigger("unselected", event, {
                                  unselected: selectee.element
                          });
                  });
                  $('.ui-selecting', this.element[0]).each(function() {
                          var selectee = .data(this, "selectable-item");
                          selectee.element.removeClass('ui-selecting').addClass('ui-selected');
                          selectee.selecting = false;
                          selectee.selected = true;
                          selectee.startselected = true;
                          self._trigger("selected", event, {
                                  selected: selectee.element
                          });
                  });
                  this._trigger("stop", event);
  
                  this.helper.remove();
  
                  return false;
          }
  
  }));
  
  .extend(.ui.selectable, {
          version: "1.7.1",
          defaults: {
                  appendTo: 'body',
                  autoRefresh: true,
                  cancel: ":input,option",
                  delay: 0,
                  distance: 0,
                  filter: '*',
                  tolerance: 'touch'
          }
  });
  
  })(jQuery);
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.