/**
* Display interactive character limit feedback for text field or text area.
* see http://ndpsoftware.com/show_char_limit.php
*/
jQuery.fn.show_char_limit = function(limit, opts) {

  if (!opts.status_element && !opts.status_element_suffix) {
    throw new Exception("Must provide status_element or status_element_suffix");
  }
  
  var o = jQuery.extend({
    error_class: 'error',
    status_style: 'text'
  }, opts);
  
  var show_limit = function(src) {
    var chars_typed = jQuery(src).val().length;
    var left = limit - chars_typed;
    var msg;
    if (o.status_style == 'chars_typed') {
      msg = "" + chars_typed;
    } else if (o.status_style == 'chars_left') {
      msg = "" + left;
    } else {
       var status = left >= 0 ? 'left' : 'over';
       var unit = (Math.abs(left) != 1 ? "characters" : "character");
     msg = "" + Math.abs(left) + " " + unit + " " + status;
    }
    var e = o.status_element ? o.status_element : ("#" + jQuery(src).attr('id') + o.status_element_suffix);
    jQuery(e).html(msg);
    if (o.error_element || o.error_element_suffix) {
    var e = o.error_element ? o.error_element : ("#" + jQuery(src).attr('id') + o.error_element_suffix);
    if (left < 0) {
      jQuery(e).addClass(o.error_class);
    } else {
      jQuery(e).removeClass(o.error_class);
    }
    }
  };
  
  return this.each(function() {
    show_limit(this);
    jQuery(this).keyup(function() {
    show_limit(this);
    });
  });
};

