summaryrefslogtreecommitdiff
path: root/share/www/script/jquery.resizer.js
blob: f020d3e2de29184719c11719072b68da8295e3fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License.  You may obtain a copy
// of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
// License for the specific language governing permissions and limitations under
// the License.

(function($) {

  $.fn.makeResizable = function(options) {
    options = options || {};
    options.always = options.always || false;
    options.grippie = options.grippie || null;
    options.minWidth = options.minWidth || 100;
    options.maxWidth = options.maxWidth || null;
    options.minHeight = options.minHeight || 32;
    options.maxHeight = options.maxHeight || null;

    if (!options.always && $.browser.safari && parseInt($.browser.version) >= 522)
      return this; // safari3 and later provides textarea resizing natively

    return this.each(function() {
      var grippie = options.grippie;
      if (!grippie) grippie = $("<div></div>").appendTo(this.parentNode);
      grippie.addClass("grippie");
      var elem = $(this);
      grippie.mousedown(function(e) {
        var pos = {x: e.screenX, y: e.screenY};
        var dimensions = {width: elem.width(), height: elem.height()};
        $(document)
          .mousemove(function(e) {
            if (options.horizontal) {
              var offset = e.screenX - pos.x;
              if (offset) {
                var newWidth = dimensions.width + offset;
                if (newWidth >= options.minWidth &&
                    (!options.maxWidth || newWidth <= options.maxWidth)) {
                  elem.width(newWidth);
                  dimensions.width = newWidth;
                }
                pos.x = e.screenX;
              }
            }
            if (options.vertical) {
              var offset = e.screenY - pos.y;
              if (offset) {
                var newHeight = dimensions.height + offset;
                if (newHeight >= options.minHeight &&
                    (!options.maxHeight || newHeight <= options.maxHeight)) {
                  elem.height(newHeight);
                  dimensions.height = newHeight;
                }
                pos.y = e.screenY;
              }
            }
            document.onselectstart = function() { return false }; // for IE
            return false;
          })
          .one("mouseup", function() {
            $(document).unbind("mousemove");
            document.onselectstart = null; // for IE
          });
        return false;
      });
    });
  }

})(jQuery);