// ==UserScript==
// @name           ResizableTextareaGM
// @namespace      http://www.otchy.com/
// @include        *
// ==/UserScript==
(function() {
	var RT = {
		edgeWidth: 6,
		init: function() {
			document.addEventListener('mousedown', RT.mousedown, false);
			document.addEventListener('mousemove', RT.setcursor, false);
		},
		mousedown: function(event) {
			var el = event.target;
			if (el.nodeName.toLowerCase()!='textarea') {
				return;
			}
			RT.el = el;
			if (RT.isEastEdge(el,event)) {
				RT.startW = el.clientWidth;
				RT.startX = event.clientX;
				RT.draggingWidth = true;
			} else {
				RT.draggingWidth = false;
			}
			if (RT.isSouthEdge(el, event)) {
				RT.startH = el.clientHeight;
				RT.startY = event.clientY;
				RT.draggingHeight = true;
			} else {
				RT.draggingHeight = false;
			}
			if (RT.draggingWidth || RT.draggingHeight) {
				document.addEventListener('mousemove', RT.mousemove, false);
				document.addEventListener('mouseup', RT.mouseup, false);
			}
		},
		setcursor: function(event) {
			var el = event.target;
			if (el.nodeName.toLowerCase()!='textarea') {
				return;
			}
			var isEE = RT.isEastEdge(el, event);
			var isSE = RT.isSouthEdge(el, event);
			if (isEE || isSE) {
				if (isEE && isSE) {
					el.style.cursor = 'se-resize';
				} else if (isEE) {
					el.style.cursor = 'e-resize';
				} else {
					el.style.cursor = 's-resize';
				}
			} else {
				el.style.cursor = 'auto';
			}
		},
		mousemove: function(event) {
			if (RT.draggingWidth) {
				RT.el.style.width = event.clientX - RT.startX + RT.startW + 'px';
			}
			if (RT.draggingHeight) {
				RT.el.style.height = event.clientY - RT.startY + RT.startH + 'px';
			}
		},
		mouseup: function(event) {
			document.removeEventListener('mousemove', RT.mousemove, false);
			document.removeEventListener('mouseup', RT.mouseup, false);
		},
		isEastEdge: function(el, event) {
			var eastEdge = el.clientWidth;
			do {
				eastEdge += el.offsetLeft;
				el = el.offsetParent;
			} while (el != document.body);
			var xpos = event.clientX + document.body.scrollLeft;
			return (eastEdge - RT.edgeWidth) < xpos && xpos <= eastEdge;
		},
		isSouthEdge: function(el, event) {
			var southEdge = el.clientHeight;
			do {
				southEdge += el.offsetTop;
				el = el.offsetParent;
			} while (el != document.body);
			var ypos = event.clientY + document.body.scrollTop;
			return (southEdge - RT.edgeWidth) < ypos && ypos <= southEdge;
		}
	}

	RT.init();
})();

