;(function($) {
  $.fn.twTextarea = function(c_obj, options) {
    var timer;
    var c_settings;
    var mc_passed = false;
    if (typeof c_obj == 'string') {
      c_settings = $.extend({}, $.fn.twTextarea.defaults, options);
      if (typeof options != 'undefined') {
        mc_passed = ((typeof options.max_chars == 'number') ? true : false);
      }
      return this.each(function() {
        var $this = $(this);
        attach_nobility($this, c_obj, c_settings, mc_passed);
      });
    }
    return this;
  };

  $.fn.twTextarea.defaults = {
    on_negative: null,
    on_positive: null,
    max_chars: 140
  };

  function attach_nobility(t_obj, c_obj, c_settings, mc_passed) {
    var max_char = c_settings.max_chars;
    var char_area = $(c_obj);
    if (!mc_passed) {
      var tmp_num = char_area.text();
      var isPosNumber = (/^[1-9]\d*$/).text(tmp_num);
      if (isPosNumber) {
        max_char = tmp_num;
      }
    }
    check_length(t_obj, char_area, c_settings, max_char, true);
    $(t_obj).focus(function(evt) {
      timer = setInterval(function() {
        check_length(t_obj, char_area, c_settings, max_char, false);
      }, 100);
    });
    $(t_obj).blur(function(evt) {
      check_length(t_obj, char_area, c_settings, max_char, false);
      clearTimeout(timer);
    });
  }

  function find_remaining(t_obj, max_char) {
    return max_char - ($(t_obj).val()).length;
  }

  function check_length(t_obj, char_area, c_settings, max_char, init_disp) {
    var char_rem = find_remaining(t_obj, max_char);
    if (char_rem < 0) {
      toggle_status(c_settings.on_negative, c_settings.on_positive, t_obj, char_area, c_settings, char_rem);
    } else {
      toggle_status(c_settings.on_positive, c_settings.on_negative, t_obj, char_area, c_settings, char_rem);
    }
    char_area.text(char_rem);
  }

  function toggle_status(toggle_on, toggle_off, t_obj, char_area, c_settings, char_rem) {
    if (toggle_on != null) {
      toggle_on(t_obj, char_area, c_settings, char_rem);
    }
  }

  $.twTextarea = {};
  $.twTextarea.find_remaining = function(t_obj, max_char) {
    return max_char - ($(t_obj).val()).length;
  }
})(jQuery);

