var areaForm = Class.create({
  initialize: function() {
    this.stateSelect = $('state_cd');
    this.localAreaSelect = $('local_area_cd');
    this.ensenSelect = $('ensen_cd');
    this.enEkiSelect = $('en_eki_cd');
    this.requestItemData();
  },

  requestItemData: function() {
    this.loadingStart();
    new Ajax.Request('/master_data/part/state_local_area,local_area_cd,state_ensen,ensen_cd.js', {
      method: 'get',
      onSuccess: function(res) {
        var result = $H(res.responseText.evalJSON());
        this.stateLocalArea = $H(result.get('state_local_area'));
        this.stateEnsen = $H(result.get('state_ensen'));
        this.localAreaCd = $H(result.get('local_area_cd'));
        this.ensenCd = $H(result.get('ensen_cd'));
        this.stateEnsenEnEki = $H({});
        this.stateEnEkiCd = $H({});
        var stateValue = this.stateSelect.value;
        if (stateValue) {
          this.requestStateEnsenEnEki(stateValue);
        }
        this.loadingFinish();
      }.bind(this)
    });
  },

  requestStateEnsenEnEki: function(stateValue) {
    if (stateValue) {
      new Ajax.Request('/master_data/part/state_ensen_en_eki,' + stateValue + '.js', {
        method: 'get',
        onSuccess: function(res) {
          var result = $H(res.responseText.evalJSON());
          this.stateEnsenEnEki._object[stateValue] = $H(result.get('ensen_en_eki'));
          this.stateEnEkiCd._object[stateValue] = $H(result.get('en_eki_cd'));
          this.stateEnEkiCd.get(stateValue);
        }.bind(this)
      });
    }
  },

  loadingStart: function() {
    this.stateSelect.disabled = true;
    this.localAreaSelect.disabled = true;
    this.ensenSelect.disabled = true;
    this.enEkiSelect.disabled = true;
    var form = $('search_form');
    Element.insert(form, Builder.node('input', { type:'hidden', name:'state_cd', id:'loading_state_cd', value:this.stateSelect.value }));
    Element.insert(form, Builder.node('input', { type:'hidden', name:'local_area_cd', id:'loading_local_area_cd', value:this.localAreaSelect.value }));
    Element.insert(form, Builder.node('input', { type:'hidden', name:'ensen_cd', id:'loading_ensen_cd', value:this.ensenSelect.value }));
    Element.insert(form, Builder.node('input', { type:'hidden', name:'en_eki_cd', id:'loading_en_eki_cd', value:this.enEkiSelect.value }));
    Element.insert(this.localAreaSelect, { after: Builder.node('span', { id: 'area_form_now_loading' }, 'データ読み込み中...') });
  },

  loadingFinish: function() {
    this.stateSelect.disabled = false;
    if (this.stateSelect.value || this.localAreaSelect.value) {
      this.localAreaSelect.disabled = false;
    }
    if (this.stateSelect.value || this.ensenSelect.value) {
      this.ensenSelect.disabled = false;
    }
    if (this.ensenSelect.value || this.enEkiSelect.value) {
      this.enEkiSelect.disabled = false;
    }

    if (this.stateSelect.value && (this.localAreaSelect.childNodes.length == 1 && this.ensenSelect.childNodes.length == 1)) {
      this.selectState();
    }

    Element.remove($('loading_state_cd'));
    Element.remove($('loading_local_area_cd'));
    Element.remove($('loading_ensen_cd'));
    Element.remove($('loading_en_eki_cd'));
    Element.remove($('area_form_now_loading'));
  },

  selectState: function() {
    var stateValue = this.stateSelect.value;
    if (!this.stateEnsenEnEki.get(stateValue) || !this.stateEnEkiCd.get(stateValue)) {
      this.requestStateEnsenEnEki(stateValue);
    }
    this.updateChildSelect(stateValue, this.localAreaSelect, this.stateLocalArea, this.localAreaCd);
    this.updateChildSelect(stateValue, this.ensenSelect, this.stateEnsen, this.ensenCd);
    this.updateChildSelect(this.ensenSelect.value, this.enEkiSelect, this.stateEnsenEnEki.get(stateValue), this.stateEnEkiCd.get(stateValue));
  },

  selectEnsen: function() {
    var stateValue = this.stateSelect.value;
    if (!this.stateEnsenEnEki.get(stateValue) || !this.stateEnEkiCd.get(stateValue)) {
      this.requestStateEnsenEnEki(stateValue);
    }
    var ensenValue = this.ensenSelect.value;
    this.updateChildSelect(this.ensenSelect.value, this.enEkiSelect, this.stateEnsenEnEki.get(stateValue), this.stateEnEkiCd.get(stateValue));
  },

  updateChildSelect: function(parentValue, childSelect, relationalMaster, nameMaster) {
    childSelect.disabled = true;
    this.clearOptions(childSelect);
    if (parentValue == "") {
      this.insertDefaultOption(childSelect, '選択してください');
    } else {
      this.insertOptions(childSelect, $A(relationalMaster.get(parentValue)), nameMaster);
      childSelect.disabled = false;
    }
  },

  clearOptions: function(select) {
    while(select.childNodes.length > 0) {
      select.removeChild(select.lastChild);
    }
  },

  insertOptions: function(select, values, labelMaster) {
    var stateValue = this.stateSelect.value
    var defaultOption = this.insertDefaultOption(select, 'こだわらない');
    values.each( function(v) {
      option = Builder.node('option', { value:v }, labelMaster.get(v));
      Element.insert(select, option);
    }.bind(this));
    defaultOption.selected = true;
  },

  insertDefaultOption: function(select, label) {
    var option = Builder.node('option', { value:'' }, label);
    Element.insert(select, option);
    return option;
  }
});

