blob: 4fcd8538a7434229bca121d79a4270353a0d71f7 (
plain) (
blame)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
if (isJsEnabled()) {
addLoadEvent(function() {
// Attach to all visible textareas
textareas = document.getElementsByTagName('textarea');
var textarea;
for (var i = 0; textarea = textareas[i]; ++i) {
if (hasClass(textarea, 'resizable')) {
if (typeof dimensions(textarea).width != 'undefined' && dimensions(textarea).width != 0) {
new textArea(textarea);
}
}
}
});
}
function textArea(element) {
var ta = this;
this.element = element;
this.parent = this.element.parentNode;
this.dimensions = dimensions(element);
// Prepare wrapper
this.wrapper = document.createElement('div');
this.wrapper.className = 'resizable-textarea';
this.parent.insertBefore(this.wrapper, this.element);
// Add grippie and measure it
this.grippie = document.createElement('div');
this.grippie.className = 'grippie';
this.wrapper.appendChild(this.grippie);
this.grippie.dimensions = dimensions(this.grippie);
this.grippie.onmousedown = function (e) { ta.beginDrag(e); };
// Set wrapper and textarea dimensions
this.wrapper.style.height = this.dimensions.height + this.grippie.dimensions.height + 1 +'px';
this.element.style.marginBottom = '0px';
this.element.style.width = '100%';
this.element.style.height = this.dimensions.height +'px';
// Wrap textarea
removeNode(this.element);
this.wrapper.insertBefore(this.element, this.grippie);
// Measure difference between desired and actual textarea dimensions to account for padding/borders
this.widthOffset = dimensions(this.wrapper).width - this.dimensions.width;
// Make the grippie line up in various browsers
if (window.opera) {
// Opera
this.grippie.style.marginRight = '4px';
}
if (document.all && !window.opera) {
// IE
this.grippie.style.width = '100%';
this.grippie.style.paddingLeft = '2px';
}
// Mozilla
this.element.style.MozBoxSizing = 'border-box';
this.heightOffset = absolutePosition(this.grippie).y - absolutePosition(this.element).y - this.dimensions.height;
}
textArea.prototype.beginDrag = function (event) {
if (document.isDragging) {
return;
}
document.isDragging = true;
event = event || window.event;
// Capture mouse
var cp = this;
this.oldMoveHandler = document.onmousemove;
document.onmousemove = function(e) { cp.handleDrag(e); };
this.oldUpHandler = document.onmouseup;
document.onmouseup = function(e) { cp.endDrag(e); };
// Store drag offset from grippie top
var pos = absolutePosition(this.grippie);
this.dragOffset = event.clientY - pos.y;
// Make transparent
this.element.style.opacity = 0.5;
// Process
this.handleDrag(event);
}
textArea.prototype.handleDrag = function (event) {
event = event || window.event;
// Get coordinates relative to text area
var pos = absolutePosition(this.element);
var y = event.clientY - pos.y;
// Set new height
var height = Math.max(32, y - this.dragOffset - this.heightOffset);
this.wrapper.style.height = height + this.grippie.dimensions.height + 1 + 'px';
this.element.style.height = height + 'px';
// Avoid text selection
stopEvent(event);
}
textArea.prototype.endDrag = function (event) {
// Uncapture mouse
document.onmousemove = this.oldMoveHandler;
document.onmouseup = this.oldUpHandler;
// Restore opacity
this.element.style.opacity = 1.0;
document.isDragging = false;
}
|