(function() {
  $.fn.easyStrValidate = function(options){

    options = $.extend({
      minLength: 5,
      maxLength: 100,
      messageID: null,
      allowNullValue: false
    },options);

    var $$ = $(this);
    var $message = "";
    if(options.messageID){
      $message = $("#" + options.messageID);
    } else {
      $message = $("<span>");
      $$.after($message);
    }

    var retrieveMessage = function(n,length){
      if (length < 1 && !options.allowNullValue) {
        return "内容を入力して下さい";
      } else if (length < options.minLength && !options.allowNullValue) {
        return options.minLength + "文字以上入力して下さい";
      } else if(n > 0){
        return "あと" + n + "文字入力できます";
      } else if(n == 0){
        return "これ以上入力できません";
      } else{
        return "入力できる文字数をオーバーしています";
      }
    };

    var toggleSwitch=function(){
      var length = $$.val().length;
      var length_diff = options.maxLength - length;
      if ($message.css("display") != "block") {
        $message.show();
      }
      var $form = $$.parents("form");
      var $submit = $form.find(":image, :submit");
      $message.html(retrieveMessage(length_diff,length));
      if (length > options.maxLength
             || ( length < options.minLength && !options.allowNullValue) ){
        $submit.attr("disabled","disabled");
        $form.bind("submit",function(){ return false });
      } else if( length < 1 && !options.allowNullValue){
        $submit.attr("disabled","disabled");
        $form.bind("submit",function(){ return false });
      }else{
        $submit.removeAttr("disabled");
        $form.unbind();
      }
    };

    toggleSwitch();
    $$.bind("keyup blur click",toggleSwitch);
    return this;
  }

})(jQuery);
