var ResizingTextArea = Class.create();

ResizingTextArea.prototype = {
  defaultRows: 1,
  defaultCols: 20,
  defaultMaxCols: 80,

  initialize: function(field)
  {
    this.defaultRows = Math.max(field.rows, 1);
    this.defaultCols = Math.max(field.cols, 20);
    this.resizeNeeded = this.resizeNeeded.bindAsEventListener(this);
    Event.observe(field, "click", this.resizeNeeded);
    Event.observe(field, "keyup", this.resizeNeeded);
  },

  resizeNeeded: function(event)
  {
    var t = Event.element(event);
    var lines = t.value.split('\n');
    var newRows = Math.min(lines.length,this.defaultCols);
    var oldRows = t.rows;
    var maxCols = 0;
    for (var i = 0; i < lines.length; i++)
    {
      maxCols = Math.max(lines[i].length, maxCols);
    }
    
    t.cols = Math.min(this.defaultMaxCols, Math.max(maxCols, this.defaultCols));
    for (var i = 0; i < lines.length; i++)
    {
      var line = lines[i];
      if (line.length > t.cols) newRows += Math.floor(line.length / t.cols);
    }
    if (newRows > t.rows)
    {
      t.rows = newRows;
      t.style.height = newRows * 1.2 + "em";
    }
    if (newRows < t.rows)
    {
      t.rows = Math.max(this.defaultRows, newRows);
      t.style.height = Math.max(this.defaultRows, newRows) * 1.2 + "em";
    }
  }
}

