diff options
Diffstat (limited to 'misc/textarea.js')
-rw-r--r-- | misc/textarea.js | 140 |
1 files changed, 26 insertions, 114 deletions
diff --git a/misc/textarea.js b/misc/textarea.js index 3e5f4789c..bf8932937 100644 --- a/misc/textarea.js +++ b/misc/textarea.js @@ -1,122 +1,34 @@ // $Id$ -if (isJsEnabled()) { - addLoadEvent(textAreaAutoAttach); -} - -function textAreaAutoAttach(event, parent) { - if (typeof parent == 'undefined') { - // Attach to all visible textareas. - textareas = document.getElementsByTagName('textarea'); - } - else { - // Attach to all visible textareas inside parent. - textareas = parent.getElementsByTagName('textarea'); - } - var textarea; - for (var i = 0; textarea = textareas[i]; ++i) { - if (hasClass(textarea, 'resizable') && !hasClass(textarea.nextSibling, 'grippie')) { - if (typeof dimensions(textarea).width != 'undefined' && dimensions(textarea).width != 0) { - new textArea(textarea); - } +Drupal.textareaAttach = function() { + $('textarea.resizable:not(.processed)').each(function() { + var textarea = $(this).addClass('processed'), staticOffset = null; + + $(this).wrap('<div class="resizable-textarea"></div>') + .parent().append($('<div class="grippie"></div>').mousedown(startDrag)); + + var grippie = $('div.grippie', $(this).parent())[0]; + grippie.style.marginRight = (grippie.offsetWidth - $(this)[0].offsetWidth) +'px'; + + function startDrag(e) { + staticOffset = textarea.height() - Drupal.mousePosition(e).y; + textarea.css('opacity', 0.25); + $(document).mousemove(performDrag).mouseup(endDrag); + return false; } - } -} - -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'; + function performDrag(e) { + textarea.height(Math.max(32, staticOffset + Drupal.mousePosition(e).y) + 'px'); + return false; + } - // Avoid text selection - stopEvent(event); + function endDrag(e) { + $(document).unmousemove(performDrag).unmouseup(endDrag); + textarea.css('opacity', 1); + } + }); } -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; +if (Drupal.jsEnabled) { + $(document).ready(Drupal.textareaAttach); } - |