// ==UserScript==
// @name		ExpandArea
// @version		1.1+
// @namespace	http://stilleye.com/greasemonkey
// @author		David Schontzler
// @description	Adds button to make textareas expandable
// @include		*
// @exclude		*gmail.google.com*
// @exclude		*.jot.com/*
// ==/UserScript==

(function() {
	function expandArea(elms) {
		var elms2 = [];
		for(var i = 0; i < elms.length; i++) { 
			elms2.push(elms[i]);
		}
		for(var i = 0; i < elms2.length; i++) { 
			applyArea(elms2[i]);
		}

		function applyArea(elm) {
			var w = elm.offsetWidth,
				h = elm.offsetHeight;
			var pos = getAbsolutePosition(elm);

			var overlay = document.createElement("div");
			overlay.style.width = w + "px";
			overlay.style.height = h + "px";
			overlay.style.position = "absolute";
			overlay.style.left = pos.x + "px";
			overlay.style.top = pos.y + "px";
			overlay.style.padding = "4px";
			overlay.style.zIndex = "999";
			overlay.className = "ExpandArea";

			var size = document.createElement("div");
			size.style.width = size.style.height = "8px";
			size.style.background = "#33f";
			size.style.position = "absolute";
			size.style.right = "-8px";
			size.style.bottom = "-8px";
			size.style.cursor = "nw-resize";
			size.style.MozBorderRadius = "4px";
			size.setAttribute("title", "Drag blue box to size the text area");
			var offX, offY;
			size.addEventListener("mousedown", function(e) {
				offX = e.layerX + 8; offY = e.layerY + 8;
				document.body.addEventListener("mousemove", doSize, false);
				document.body.addEventListener("mouseup", endSize, false);
			}, false);
			overlay.appendChild(size);

			var reset = size.cloneNode(false);
			reset.style.background = "#c00";
			reset.style.right = "1px";
			reset.style.cursor = "pointer";
			reset.setAttribute("title", "Click the red box to reset the size of the text area");
			reset.addEventListener("click", function(e) {
				overlay.style.width = w + "px";
				overlay.style.height = h + "px";
			}, false);
			overlay.appendChild(reset);

			var txt = document.createElement("textarea");
			txt.value = elm.value;
			txt.style.width = "100%";
			txt.style.height = "100%";
			txt.addEventListener('keyup', function(e) {
				elm.value = this.value;
			}, false);
			overlay.appendChild(txt);

			document.body.appendChild(overlay);
			elm.style.visibility = "hidden";

			function doSize(e) {
				var x = e.pageX - pos.x - offX;
				var y = e.pageY - pos.y - offY;
				if( x > 40 ) overlay.style.width = x + "px";
				if( y > 40 ) overlay.style.height = y + "px";
			}

			function endSize(e) {
				document.body.removeEventListener("mousemove", doSize, false);
				document.body.removeEventListener("mouseup", endSize, false);
			}
		}

		function getAbsolutePosition(elm) {
			var x = 0, y = 0;
			while( elm && elm != document.body ) {
				x += elm.offsetLeft;
				y += elm.offsetTop;
				elm = elm.offsetParent;
			}
			return { x: x, y: y };
		}
	}

	function setup() {
		if( !document.getElementsByTagName("textarea").length ) return;

		var on = document.createTextNode("Expand Textarea");
		var off = document.createTextNode(String.fromCharCode(160) + String.fromCharCode(171) + String.fromCharCode(160));

		var trigger = document.createElement("div");
		trigger.appendChild( off );
		with(trigger.style) {
			position = "fixed";
			right = bottom = "0px";
			color = "black";
			background = "white";
			border = "1px solid";
			padding = "3px";
			font = "10px sans-serif";
			cursor = "pointer";
			MozOpacity = ".4";
		}
		document.body.appendChild(trigger);

		trigger.addEventListener('mouseover', function() {
			this.replaceChild(on, off);
		}, false);
		trigger.addEventListener('mouseout', function() {
			this.replaceChild(off, on);
		}, false);
		trigger.addEventListener('click', function() {
			expandArea(document.getElementsByTagName("textarea"));
			this.parentNode.removeChild(this);
		}, false);
	}

	window.addEventListener("load", setup, false);
})();

