// ==UserScript==
// @name Resizeable Texarea
// @author Jakub Roztocil <jakub@roztocil.name>
// @version 0.1
// @ujs:download http://www.webkitchen.cz/lab/opera/resizeable-textarea.js
// ==/UserScript==

window.addEventListener('DOMContentLoaded', function() {

	var resizeableTextarea = {

		current: null,

		init: function(ta) {
			var s = document.createElement('span');
			s.ta = ta;
			s.addEventListener('mousedown', resizeableTextarea.down, false);
			s.setAttribute('style', 'cursor: n-resize; height: 3px; display: block; width: ' + ta.offsetWidth + 'px');
			if (ta.nextSibling) {
				ta.parentNode.insertBefore(s, ta.nextSibling)
			} else {
				ta.parentNode.appendChild(s)
			}
		},

		down: function(e) {
			resizeableTextarea.current = e.currentTarget.ta;
			resizeableTextarea.current.style.cursor = document.body.style.cursor = 'n-resize';
			document.addEventListener('mousemove', resizeableTextarea.move, false);
			document.addEventListener('mouseup', resizeableTextarea.up, false);
		},

		move: function(e) {
			var ta = resizeableTextarea.current;
			var curHeight = parseInt(ta.style.height || getComputedStyle(ta).height);
			var diff =  e.clientY + window.pageYOffset - resizeableTextarea.getOffset();
			var newHeight = curHeight + diff;
			if (newHeight > 50) {
				ta.style.height = String(newHeight) + 'px';
			}
		},

		up: function(e) {
			resizeableTextarea.current.style.cursor = document.body.style.cursor = '';
			resizeableTextarea.current = null;
			document.removeEventListener('mousemove', resizeableTextarea.move, false);
			document.removeEventListener('mouseup', resizeableTextarea.up, false);
		},

		getOffset: function(ta) {
			var o = 0;
			var el = resizeableTextarea.current;
			while (el) {
				o += el.offsetTop;
				el = el.offsetParent;
			}
			o += resizeableTextarea.current.offsetHeight;
			return o;
		}

	}

	var tas = document.getElementsByTagName('textarea');
	for (var i = 0; i < tas.length; i++) {
		resizeableTextarea.init(tas[i]);
	}

}, false);

