/* ------------------------------------------------------------+/
/+ rock, paper, scissors Class
/+ ------------------------------------------------------------*/
var rps = function() {
  // 手
  var types = ['Stone', 'Scissors', 'Paper'];
  // 勝敗結果
  var btlResult = ['引き分け', '勝利ッ！！', '敗北…'];
  // APIのURI
  var URI = '/rps.cgi?';
  // モード判別要
  var rpsMode = -1;
  // 監視君
  var rpsObserver = null;
  // 敵リスト
  var enemyList = [];
  // 相手の添え字
  var tarID = null;
  // 自分のID
  var myID = null;
  // 自分の名前
  var myName = null;
  // 自分のアイコン
  var myIcon = null;
  /* ------------------------------------------------------------+/
   * イベント監視(private)
   * 
   * ------------------------------------------------------------*/
  var _setObserver = function() {
    _stopObserver();
    
    rpsObserver = _eventExecute.applyInterval(this, [], 1000);
  }
  /* ------------------------------------------------------------+/
   * ストップ監視(private)
   * 
   * ------------------------------------------------------------*/
  var _stopObserver = function() {
    if (rpsObserver !== null)
      clearInterval(rpsObserver);
    
    rpsObserver = null;
    
    rpsMode = -1;
  }
  /* ------------------------------------------------------------+/
   * 同期通信(private)
   * 
   * ------------------------------------------------------------*/
  var _ajaxRequest = function(tarURI) {
    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Msxml2.XMLHTTP') || new ActiveXObject('Microsoft.XMLHTTP');
    if (xmlhttp) {
      xmlhttp.open('GET', tarURI, false);
      xmlhttp.setRequestHeader("If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT");
      xmlhttp.send(null);
      
      return eval(xmlhttp.responseText);
    }
    return;
  }
  /* ------------------------------------------------------------+/
   * イベント実行(private)
   * 
   * ------------------------------------------------------------*/
  var _eventExecute = function() {
    switch (rpsMode) {
      // リスト取得
      case 1:
        $('messageDiv').innerHTML = '＊ 「さんかしゃデータを　よみこみちゅう・・・」';
        _enemyListView();
        break;
      // 相手登録
      case 2:
        $('messageDiv').innerHTML = '＊ 「あいての　せつぞくまちです・・・」';
        if (tarID != null)
          _checkSyncronized();
        else
          $('messageDiv').innerHTML = '＊ 「さんかしゃから　あいてをせんたくしてくだちぃ」';
        break;
      // じゃんけんの手登録
      case 3:
        $('messageDiv').innerHTML = '＊ 「どのしゅだんで　いどむ？」';
        break;
      // 結果取得
      case 4:
        $('messageDiv').innerHTML = '＊ 「あいての　にゅうりょくまちです・・・」';
        _checkBattleResult();
        break;
      default:
        break;
    }
  }
  /* ------------------------------------------------------------+/
   * ログイン(public)
   * [mode: -1]
   * ------------------------------------------------------------*/
  this.init = function() {
    if (rpsMode != -1) return;
    
    if ($('Form0').value && $('Form1').value) {
      var idAndChk = _ajaxRequest(URI+'mode=0&id='+$('Form0').value+'&pass='+$('Form1').value+'&name='+$('Form2').value+'&icon='+$('Form3').src);
      if (idAndChk[0] > 0) {
        _setObserver();
        
        // 戦闘画面へ切り替え
        $('battleDiv').style.display  = 'block';
        $('firstDiv').style.display = 'none';
        
        // ユーザーデータ登録
        myID = $('Form0').value;
        myName = idAndChk[1];
        myIcon = idAndChk[2];
        
        // 戦闘画面へ名前出力
        $('your_name').innerHTML = myName;
        $('yourImage').src = myIcon;
        
        // セッションが破棄されていた場合
        if (idAndChk[0] == 2)
          alert('セッションが破棄されていたので初期化を行いました');
        
        rpsMode = 1;
      }
      else {
        alert('Login failed.');
      }
    }
    else {
      alert('Please input id and name.');
    }
  }
  /* ------------------------------------------------------------+/
   * 再対戦(private)
   * [-1]
   * ------------------------------------------------------------*/
  var _reTake = function() {
  }
  /* ------------------------------------------------------------+/
   * 敵リスト再読込(public)
   * [2]
   * ------------------------------------------------------------*/
  this.reLoad = function() {
    if (rpsMode != 2) return;
    
    _enemyListView();
  }
  /* ------------------------------------------------------------+/
   * リスト表示(private)
   * [1]
   * ------------------------------------------------------------*/
  var _enemyListView = function() {
    enemyList = _ajaxRequest(URI+'mode=1&id='+myID);
    
    _clearChilds($('rightDiv'));
    
    var ul = document.createElement('ul');
    $('rightDiv').appendChild(ul);
    
    var li = document.createElement('li');
    li.innerHTML = '[ 参加者 (<span class="selectable" onclick="rpsClass.reLoad()">Reload</span>) ]';
    ul.appendChild(li);
    
    for (var i in enemyList) {
      var li = document.createElement('li');
      li.innerHTML += '<div id="List-'+i+'" onclick="rpsClass.setEnemy('+i+')">' + 
                      '<span class="selectable" style="text-decoration:underline;">' + enemyList[i].name + '</span> [' + _checkWaitChar(enemyList[i].battle_target) + ']' + 
                      '</div>';
      ul.appendChild(li);
    }
    
    rpsMode = 2;
  }
  /* ------------------------------------------------------------+/
   * リストお掃除(private)
   * [1]
   * ------------------------------------------------------------*/
  var _clearChilds = function(targetParent) {
    for (var i=targetParent.childNodes.length-1;i>=0;i--)
      targetParent.removeChild(targetParent.childNodes[i]);
  }
  /* ------------------------------------------------------------+/
   * 戦闘状態判定(private)
   * [1]
   * ------------------------------------------------------------*/
  var _checkWaitChar = function(id) {
    for (var i in enemyList)
      if (enemyList[i].id == id)
        return 'wait for '+enemyList[i].name;
    
    if (id == myID)
      return '<em style="color:#CC0000;">wait for You</em>';
    
    return 'free';
  }
  /* ------------------------------------------------------------+/
   * 相手登録(public)
   * [2]
   * ------------------------------------------------------------*/
  this.setEnemy = function(i) {
    if (rpsMode != 2) return;
    
    // 対戦相手IDセット
    tarID = i;
    
    // ターゲット登録状態
    var enemyStatus = _ajaxRequest(URI+'mode=2&term=1&id='+myID+'&enemy_id='+enemyList[tarID].id);
    if (enemyStatus <= 0)
      alert('選択した敵は現在びぢーです！');
  }
  /* ------------------------------------------------------------+/
   * 同期確認(private)
   * [2]
   * ------------------------------------------------------------*/
  var _checkSyncronized = function() {
    var connectStatus = _ajaxRequest(URI+'mode=2&term=2&id='+myID+'&enemy_id='+enemyList[tarID].id);
    if (connectStatus == 1) {
      // 相手データをセット
      $('enemyName').innerHTML = enemyList[tarID].name;
      $('enemyType').innerHTML = '----';
      $('enemyImage').style.visibility = 'visible';
      $('enemyImage').src = enemyList[tarID].icon;
      
      // 手の選択肢を選択可能に
      $('type').disabled = false;
      
      rpsMode = 3;
    }
    else if (connectStatus < 0) {
      alert('現在相手は対戦中です ざんねん・・・おわり');
      
      _stopObserver();
    }
  }
  /* ------------------------------------------------------------+/
   * 自分の手法決定(public)
   * [3]
   * ------------------------------------------------------------*/
  this.setType = function() {
    if (rpsMode != 3) return;
    
    // 手のデータをDBに登録
    _ajaxRequest(URI+'mode=3&id='+myID+'&enemy_id='+enemyList[tarID].id+'&type='+$('type').value);
    
    // 自分の手
    $('yourType').innerHTML = types[$('type').value-1];
    
    rpsMode = 4;
  }
  /* ------------------------------------------------------------+/
   * 結果取得判定(private)
   * [4]
   * ------------------------------------------------------------*/
  var _checkBattleResult = function() {
    var resultArray = _ajaxRequest(URI+'mode=4&id='+myID+'&enemy_id='+enemyList[tarID]['id']);
    if (resultArray.length > 0) {
      // 敵の手
      $('enemyType').innerHTML = '' + types[resultArray[1]];
      
      $('yourSpace').style.backgroundImage = 'url(/images/rps/t'+resultArray[0]+'.png)';
      $('enemySpace').style.backgroundImage = 'url(/images/rps/t'+resultArray[1]+'.png)';
      
      // 戦闘結果判定
      if (resultArray[2] == 0) {
        alert('aiko!!');
        
        // 初期表示に戻す
        $('yourType').innerHTML = '----';
        $('enemyType').innerHTML = '----';
        
        rpsMode = 3;
      }
      else {
        $('messageDiv').innerHTML = btlResult[resultArray[2]];
        
        _stopObserver();
        
        rpsMode = -1;
        tarID   = null;
      }
    }
  }
}


