/**
 * 処理タイプが'submit'の場合は、対象オブジェクトの親フォームをサブミットする。
 * 処理タイプが'link'の場合は、アクションURLに遷移する。
 *
 * ダブルサミット対策のため、ボタンがクリックされたら、同一画面のすべてのボタンを無効にする。
 *
 * @param string type 処理タイプ('submit'|'link')
 * @param string actionUrl アクションURL
 * @param object targetId 対象オブジェクトのid(処理タイプが'submit'の場合のみ必須)
 */
function doSubmit(type, actionUrl, targetId){
    disableAllButtons();

    if(type == 'submit'){
        targetObject = $(targetId);
        targetForm = targetObject.form;
        targetForm.action = actionUrl;
        targetForm.method = 'POST';
        targetForm.submit();
    }else if(type == 'link'){
        location.href = actionUrl;
    }
}

/**
 * すべてのボタンを無効にする。
 */
function disableAllButtons() {
    var buttons = document.getElementsByTagName('BUTTON');
    for (var i = 0; i < buttons.length; i++){
        buttons[i].disabled = true;
    }
}

/** 
 * 指定されたURLを別ウィンドウで開く。
 * 
 * @param string url 別ウィンドウで開くURL
 */ 
function windowOpen(url){
    var newWindow = window.open(url, '_blank', 'width=800, height=600, location=no, menubar=no, toolbar=no, status=no, scrollbars=yes');
    newWindow.focus();
}

//TODO:ここより下の関数は移行が終わり次第、削除予定。
function submitForm(form, action){
    children = form.childNodes;
    for (i = 0; i < children.length; i++) {
        if(children[i].type == 'button'){
            children[i].disabled = true;
        }
    }
    form.action = action;
    form.submit();
}

function dialog(message){
    return confirm(message);
}


//TODO:(moritama)小野里氏に確認して、コメント付けないと…
var SelectBox = {
  createSelectBox: function(element, valueLabels, defaultValue) {

    element = SelectBox.removeOptions(element);
    valueLabels = valueLabels || [];
    for (var i = 0; i < valueLabels.length; i++) {
      var option = element.appendChild(document.createElement('option'));

      option.value = valueLabels[i][0];
      if (defaultValue != null && defaultValue == option.value) {
        option.selected = true;
      }
      option.appendChild(document.createTextNode(valueLabels[i][1]));
    }

    return element;
  },
  removeOptions: function(element) {
    element = $(element);

    while (element.hasChildNodes()) {
      element.removeChild(element.lastChild);
    }
    return element;
  }
};

//TODO:(moritama)小野里氏に確認して、コメント付けないと…
/**
 * 連携する2つのセレクトボックスを作成します。
 * 
 * parentElement: 親となるセレクトボックス
 * childElement : 子となるセレクトボックス
 * valueLabels  : セレクトボックスの中身となるデータ※1
 *
 * ※1 valueLabels は、下記のような配列を指定します。
 *     [親のvalue, 親のラベル, 左記が選択された際に作成する子のセレクトボックスのvalueとラベルの配列]
 *        : 親のセレクトボックスの項目数分繰り返し
 *
 *     具体的には、下記のような配列になります。
 *     var valueLabels = [["親value1", "親ラベル1", [["親1の子value1", "親1の子ラベル1"], ["親1の子value2", "親1の子ラベル2"]]],
 *                        ["親value2", "親ラベル2", [["親2の子value1", "親2の子ラベル1"], ["親2の子value2", "親2の子ラベル2"]]]];
 *
 * new した後、initを呼び出すことにより、セレクトボックスが作成されます。
 * なお、initのパラメータとして、セレクトボックスの初期値を指定できます。
 *
 */
SelectBox.SyncLocal = Class.create();
SelectBox.SyncLocal.prototype = {
  initialize: function(parentElement, childElement, valueLabels) {
    this.parentElement = $(parentElement);
    this.childElement = $(childElement);
    this.valueLabels = valueLabels;
  },
  init: function(defaultParent, defaultChild) {
    SelectBox.createSelectBox(this.parentElement, this.valueLabels, defaultParent);

    Event.observe(this.parentElement, 'change', this.change.bind(this));

    setTimeout(this.change.bind(this, defaultChild), 1);  // すぐに呼び出すとIEで描画がくずれるため
  },
  change: function(defaultValue) {
    this.createChild(this.valueLabels[this.parentElement.selectedIndex][2], defaultValue);
  },
  createChild: function(valueLabels, defaultValue) {
    SelectBox.createSelectBox(this.childElement, valueLabels, defaultValue);

    if (valueLabels == null || valueLabels.length == 0) {
      this.hideChild();
    } else {
      this.showChild();
    }
  },
  showChild: function() { 
    this.childElement.style.display = '';
  },
  hideChild: function() {
    this.childElement.style.display = 'none';
  }
};

//TODO:(moritama)小野里氏に確認して、コメント付けないと…
/**
 * 連携する2つのセレクトボックスを作成します。
 * 子のセレクトボックスの内容はAjaxで取得します。
 * 
 * parentElement    : 親となるセレクトボックス
 * childElement     : 子となるセレクトボックス
 * parentValueLabels: 親となるセレクトボックスの中身となるデータ※1
 * uri              : 子のセレクトボックスの内容を取得するURI
 *
 * ※1 parentValueLabels は、valueとラベルの配列を指定します。
 *
 *     具体的には、下記のような配列になります。
 *     var parentValueLabels = [["value1", "ラベル1"], ["value2", "ラベル2"], ["value3", "ラベル3"]];
 *
 * new した後、initを呼び出すことにより、セレクトボックスが作成されます。
 * なお、initのパラメータとして、セレクトボックスの初期値を指定できます。
 *
 */
SelectBox.SyncAjax = Class.create();
Object.extend(Object.extend(SelectBox.SyncAjax.prototype, SelectBox.SyncLocal.prototype), {
  initialize: function(parentElement, childElement, parentValueLabels, uri) {
    this.parentElement = $(parentElement);
    this.childElement = $(childElement);
    this.parentValueLabels = parentValueLabels;
    this.uri = uri;
  },
  init: function(defaultParent, defaultChild) {
    SelectBox.createSelectBox(this.parentElement, this.parentValueLabels, defaultParent);

    Event.observe(this.parentElement, 'change', this.change.bind(this));

    this.change(defaultChild);
  },
  change: function(defaultValue) {
    if (!this.parentElement.value == '') {
      var reqUri = this.uri + this.parentElement.value;
      new Ajax.Request(
        reqUri,
        {
          method: 'post',
          onSuccess: function(res) {
            var valueLabels = eval(res.responseText);
            this.createChild(valueLabels, defaultValue);
          }.bind(this)
        });
    } else {
      this.createChild(null, defaultValue);
    }
  }
});

