(function(){
  ///
  /// logics
  ///
  var form_disabler = {
    // configs
    FORM_TITLE   : '規約同意の必要あり' ,
    FORM_TITLE2  : 'コメントを入力する場合には規約同意の必要あり' ,
    SUBMIT_TITLE : '送信する' ,

    groups       : {} ,

    'checkbox:agree'         : function( obj ){ return obj.checked; },
    'radio:agree_policy'     : function( obj ){ return ( !obj.checked  || obj.id == 'agree_yes' || obj.value == '1' ); } ,
    'checkbox:agree_policy'  : function( obj ){ return obj.checked; },
    'checkbox:agreement_flg' : function( obj ){ return obj.checked; },
    
    ///
    /// formの有効無効を切り替える
    ///
    toggleSubmit : function( e ){
      if( !e ){ e = window.event; e.target = e.srcElement; }
      var form        = getParentByTagName( e.target, 'form' );
      var submit      = form_disabler.getSubmit( form );
      var key = e.target.type + ':' + e.target.name;
      submit.disabled = ( !form_disabler.canSubmit( form, form_disabler.groups[key] ) );
      form.onsubmit   = submit.disabled ? function(){ return false; } : null;
    },

    ///
    /// 条件が全部満たせてるか
   ///
    canSubmit : function( form, grp ){
      var inputs = form.getElementsByTagName( 'input' );
      for( var i = 0, l = inputs.length; i < l; i++ ){
        var key = inputs[i].type + ':' + inputs[i].name;
        if( grp[key] ) {
          var flg = form_disabler[key]( inputs[i] );
          if( !flg )  return false;
        }
      }
      return true;
    },
    
    ///
    /// submitを取得する
    ///
    getSubmit    : function( form ){
      var inputs = form.getElementsByTagName( 'input' );
      for( var i = 0, l = inputs.length; i < l; i++ )
        if( inputs[i].title == form_disabler.SUBMIT_TITLE ) return inputs[i];
    },
    
    toggleSubmit2 : function( e ){
      if( !e ){ e = window.event; e.target = e.srcElement; }
      var form   = getParentByTagName( e.target, 'form' );
      var inputs = form.getElementsByTagName('input');
      var text_areas = form.getElementsByTagName( 'textarea' );
      var comment, agree, submit;

      for( var i = 0, l = inputs.length; i < l; i++ ){
        if( inputs[i].name  == 'comment' ) comment = inputs[i];
        if( inputs[i].name  == 'agree'   ) agree   = inputs[i];
        if( inputs[i].title == form_disabler.SUBMIT_TITLE ) submit = inputs[i];
      }
      for( var i = 0, m = text_areas.length; i < m; i++ ) {
        if( text_areas[i].name  == 'comment' ) comment = text_areas[i];
        if( text_areas[i].name  == 'agree'   ) agree   = text_areas[i];
        if( text_areas[i].title == form_disabler.SUBMIT_TITLE ) submit = text_areas[i];
      }

      
      submit.disabled        = ( comment.value && !agree.checked );
      form.onsubmit = submit.disabled ? function(){ return false; } : null;
    },
    
    ///
    /// eventを設定する
    ///
    install : function(){
      var forms = document.getElementsByTagName( 'form' );
      for( var i = 0, l = forms.length; i < l; i++ ){
        ///
        ///
        if( forms[i].title == form_disabler.FORM_TITLE ){

          forms[i].onsubmit = function(){ return false; }
          var inputs =  forms[i].getElementsByTagName( 'input' );

          var groups = {};
          for( var j = 0, m = inputs.length; j < m; j++ ){
            var key = inputs[j].type + ':' + inputs[j].name;
            if( form_disabler[key] && !groups[key] ) groups[key] = 1;
          }

          // イベントを制御する
          for( var j = 0, m = inputs.length; j < m; j++ ){
            var key = inputs[j].type + ':' + inputs[j].name;
            if( inputs[j].title == form_disabler.SUBMIT_TITLE )  inputs[j].disabled = true;
            if( form_disabler[key] ) {
              inputs[j].checked = false;
              inputs[j].onclick = form_disabler.toggleSubmit;
              form_disabler.groups[key]  = groups;
            }
          }
        }
        
        ///
        ///
        else if( forms[i].title == form_disabler.FORM_TITLE2 ){
          var inputs     =  forms[i].getElementsByTagName( 'input' );
          var text_areas = forms[i].getElementsByTagName( 'textarea' );
          
          // イベントを制御する
          for( var j = 0, m = inputs.length; j < m; j++ ){
            if( inputs[j].name  == 'comment' )  inputs[j].onkeyup      = form_disabler.toggleSubmit2;
            if( inputs[j].name  == 'comment' )  inputs[j].onchange     = form_disabler.toggleSubmit2;
            if( inputs[j].name  == 'comment' )  inputs[j].oncmouseup   = form_disabler.toggleSubmit2;
            if( inputs[j].name  == 'comment' )  inputs[j].oncmouseover = form_disabler.toggleSubmit2;
            if( inputs[j].name  == 'agree'   )  inputs[j].onchange     = form_disabler.toggleSubmit2;
          }
          for( var j = 0, m = text_areas.length; j < m; j++ ) {
            if( text_areas[j].name  == 'comment' )  text_areas[j].onkeyup      = form_disabler.toggleSubmit2;
            if( text_areas[j].name  == 'comment' )  text_areas[j].onchange     = form_disabler.toggleSubmit2;
            if( text_areas[j].name  == 'comment' )  text_areas[j].oncmouseup   = form_disabler.toggleSubmit2;
            if( text_areas[j].name  == 'comment' )  text_areas[j].oncmouseover = form_disabler.toggleSubmit2;
            if( text_areas[j].name  == 'agree'   )  text_areas[j].onchange     = form_disabler.toggleSubmit2;
          }

        }
      }
    }
  }
    
  ///
  /// formとsubmitterにイベント登録と初期化する
  ///
  observe( window, 'load', form_disabler.install );

  //
  //
  function $( id ){ return document.getElementById( id ); }

  ///
  /// 親要素の中からタグ名で特定のElementを取得する
  ///
  function getParentByTagName( node, tagName ){
    if( node.tagName.toLowerCase() == tagName.toLowerCase() ) return node;
    if( !node.parentNode )                                    return null;
    return getParentByTagName( node.parentNode, tagName );
  }

  function observe( target, type, listener ) {
    if	 (target.addEventListener) target.addEventListener(type, listener, false);
    else target.attachEvent('on' + type, function() { listener.call( target, window.event ); });
  }
} )();
