// ==UserScript==
// @name		AutoResizeTextareas
// @namespace	http://www.kanasansoft.com/
// @description auto resize textareas
// @include		*
// ==/UserScript==

(function(){
	var addEvent=
		function(element,eventName,handler){
			if(element.addEventListener){
				element.addEventListener(eventName,handler,true);
		}else{
			element.attachEvent("on"+eventName,handler);
		}
	}

addEvent(
	window,
	"load",
	function(){
		var getLength=
			function(str){
				return str.length+str.replace(/[\x0-\xff]/g,"").length;
			}
		var sort=
			(function(getLength){
				var _getLength=getLength;
				return function(a,b){
					return _getLength(a)-_getLength(b);
				}
			})(getLength);
		var getColsAndRows=
			function(str){
				var ary=str.
						replace(/\r\n/ig,"\n").
						replace(/\r/ig,"\n").
						split("\n");
				ary.sort(sort);
				return {
					"cols":getLength(ary[ary.length-1]),
					"rows":ary.length
				};
			}
		var resizeTextarea=
			function(){
				var colsAndRows=getColsAndRows(this.value);
				this.setAttribute("cols",colsAndRows.cols+1);
				this.setAttribute("rows",colsAndRows.rows+1);
			}
		var resizeTextareaHandler=
			function(textarea){
				var _textarea=textarea;
				return function(){
					resizeTextarea.call(_textarea);
				}
			}
		var addAutoResizeTextarea=
			function(textarea){
				var handler=resizeTextareaHandler(textarea);
				handler();
				addEvent(textarea,"keyup",handler);
				addEvent(textarea,"change",handler);
			}
		var addAutoResizeTextareas=
			function(){
				var textareas=
						document.getElementsByTagName("textarea");
				for(var i=0;i<textareas.length;i++){
					addAutoResizeTextarea(textareas[i]);
				}
			}
		addAutoResizeTextareas();
	}
);
})();

