var textMax = {
  checkTextAreas: function() {
    if(!document.getElementsByTagName || !document.getElementById) return;
    if(document.getElementsByTagName('textarea').length == 0) return;
    
    var texts = document.getElementsByTagName('textarea');
    for(var i = 0; i < texts.length; i++) {
      if(texts[i].getAttribute('maxlength')) texts[i].onkeyup = texts[i].onchange = textMax.checkLength;
    }
  },

  checkLength: function() {
    var max = this.getAttribute('maxlength');
    var displayWarning = document.getElementById('warning'+this.id);
    var textLength = textMax.getTextLength(this.value);
 
    if(textLength > max) {
      if(!displayWarning) {
        displayWarning = document.createElement('div');
        displayWarning.id = 'warning' + this.id;
        displayWarning.className = 'warning';
        displayWarning.innerHTML = 'You have typed <strong>' + textLength + '</strong> characters; the maximum is <strong>' + max + '</strong>.';
        this.parentNode.insertBefore(displayWarning,this.nextSibling);
      } else {
        displayWarning.innerHTML = 'You have typed <strong>' + textLength + '</strong> characters; the maximum is <strong>' + max + '</strong>.';
      }
    } else {
      if(displayWarning) this.parentNode.removeChild(displayWarning);
    }
  },

  getTextLength: function(txt) {
    // makes sure newlines are counted properly
    var newlines = txt.match(/\n/g);
    if(newlines && (newlines.length > 0)) {
      var newlineadjust = newlines.length;
      return txt.length + newlineadjust;
    } else return txt.length;
  }
}

addEvent(window, 'load', textMax.checkTextAreas);