	var dragStartX = 0, dragStartY = 0;
	var dragStartH = 0, dragStartW = 0;
	var dragStartHandleL = 0, dragStartHandleT = 0;
	var elemHandle = null;
	var dragging = false;
	var c = 0
	var allowWidth = false;
	var minHeight = 25;
	
	function print_r(theObj, deep, onlyMethods) {
		if (deep == 0) {
			return 'Limit done.';
		}
	  if(typeof theObj == 'array' || typeof theObj == 'object') {
	    var str = ("<ul style='padding-left: 20px;'>");
	    for (var p in theObj) {
	    	var value = theObj[p] ? theObj[p] : null;
	      if ((typeof value == 'array' || typeof value == 'object') && !onlyMethods) {
	      	str += ("<li style='list-style-type: square;'>[<b>"+p+"</b>] => " + typeof(theObj) + "</li>");
	      	if (theObj[p]) {
		        str += ("<ul style='padding-left: 20px;'>");
		        str = print_r(theObj[p], deep - 1, onlyMethods);
		        str += ("</ul>"); 
	      	}
	      } 
	      else if (typeof value != 'function') {
	      	var val = "-- Not Defined --";
	      	if (theObj[p]) val = theObj[p];
					str += ("<li style='list-style-type: none;'>["+p+"] => "+val+"</li>");
	      }
	    }
	    str += ("</ul>");
	    return str;
	  }
	}
	
	function dragStart(evt) { 
		//Obj('err').innerHTML = print_r(evt, 2, true);   // Debug Mode
		var txtId = !isIE ? this.getAttribute('textareaId') : this.textareaId;
		var elem = Obj(txtId);
		dragging = true; 
		dragStartX = !evt.clientX ? evt.x : evt.clientX;
		dragStartY = !evt.clientY ? evt.y : evt.clientY;
		dragStartH = isIE ? elem.offsetHeight : elem.getHeight();
		dragStartW = isIE ? elem.offsetWidth : elem.getWidth();
		
		dragStartHandleL = this.offsetLeft;
		dragStartHandleT = this.offsetTop;
		
		elemHandle = txtId;
		bind_event(document, 'mousemove', dragMove, false);
		bind_event(document, 'mouseup', dragEnd, false);
		document.onselectstart = new Function ('return false');
	}
	
	function dragMove(evt) {
		if (!dragging) return;
		var txtId = elemHandle;
		var elem = Obj(txtId);
		
		var X = !evt.clientX ? evt.x : evt.clientX;
		var Y = !evt.clientY ? evt.y : evt.clientY;
		
		var incX = X - dragStartX;
		var incY = Y - dragStartY;
		
		if ((dragStartH + incY) < minHeight) return;
		if (!isIE) {
			elem.setStyle({height: (dragStartH + incY) + 'px'});
			if (allowWidth) {
				elem.setStyle({width: (dragStartW + incX) + 'px'});
				Obj('rhandle_' + txtId).setStyle({width: (dragStartW + incX - 2) + 'px'});
			}
		}
		else {  // Fucking IE
			elem.style.height = (dragStartH + incY) + 'px';
			if (allowWidth) {
				elem.style.width = (dragStartW + incX) + 'px';
				Obj('rhandle_' + txtId).style.width = (dragStartW + incX - 2) + 'px';
			}
		}
		
	}
	
	function dragEnd(evt) {
		drgging = false;
		stop_bind(document, 'mousemove', dragMove, false);
		stop_bind(document, 'mouseup', dragEnd, false);
		
		document.onselectstart = new Function('return true;');
	}

	function textarea_resizer() {
		if (navigator.userAgent.indexOf("Safari") != -1) return;
		for (var i=0; i<document.getElementsByTagName('textarea').length; i++) {
			var elem = document.getElementsByTagName('textarea')[i];
			if (elem.id && elem.className.indexOf('resizer') != -1) {
				
				var dv = document.createElement('div');
				dv.className = 'textarea-resizer';
				if (!isIE) dv.style.marginTop = '-13px';
				else dv.style.marginTop = '-19px';
				dv.setAttribute('textareaId', elem.id);
				if (!isIE) bind_event(dv, 'mousedown', dragStart, false);
				else bind_event(dv, 'mousedown', dragStart.bindCtx(dv), false);
				dv.id = 'rhandle_' + elem.id;
				
				if (!isIE) dv.setStyle({width: (elem.getWidth() - 4) + 'px'});
				else dv.style.width = (elem.offsetWidth - 2) + 'px';			// For fucking IE
				
				if (elem.parentNode) {
					elem.parentNode.insertBefore(dv, elem.nextSibling);
				}
			}
		};
	}
	
	
	isIE = (navigator.userAgent.indexOf("MSIE")!=-1);
	document.observe("dom:loaded", function(){
			textarea_resizer();
	});
