// 最初のロードのフラグ
let isFirstLoad = true;

let siteName = $("#siteName").val();

// 電力会社マスタ一覧
let electricCompanies = electricCompanyJson;
// 大手10社 + その他
let mainElectricCompanies = "";
if (siteName != SITE_NAME_SHIJO) {
  mainElectricCompanies = electricCompanies.filter(
  (e) =>
    e.electricCompanyType == COMPANY_TYPE_MAJOR_10 ||
    e.electricCompanyType == COMPANY_TYPE_OTHERS
  );
} else {
  mainElectricCompanies = electricCompanies.filter(
  (e) =>
    e.electricCompanyType == COMPANY_TYPE_MAJOR_10 ||
    e.electricCompanyType == COMPANY_TYPE_OTHERS ||
    (e.electricCompanyType == COMPANY_TYPE_NOT_MAJOR_10 &&
     e.code == LOOOP_ELECTRIC_COMPANY_CODE)
  );
}
// その他の電力会社
let otherElectricCompanies = "";
if (siteName != SITE_NAME_SHIJO) {
  otherElectricCompanies = electricCompanies.filter(
    (e) => e.electricCompanyType == COMPANY_TYPE_NOT_MAJOR_10
  );
} else {
  otherElectricCompanies = electricCompanies.filter(
    (e) => e.electricCompanyType == COMPANY_TYPE_NOT_MAJOR_10 &&
    e.code != LOOOP_ELECTRIC_COMPANY_CODE
  );
}

// 生年月日を編集できるプルダウンに変更する
$(CONTRACTOR_YEAR_OF_BIRTH_ID).editableSelect({ filter: false });
$(CONTRACTOR_MONTH_OF_BIRTH_ID).editableSelect({ filter: false });
$(CONTRACTOR_DAY_OF_BIRTH_ID).editableSelect({ filter: false });

$("#previousUrl").val(document.referrer);

// 初期化
$(function () {
  // バリデーションフラグ処理
  if (!VALIDATION_FLAG) {
    $(".step2, .step3, .step4").prop("hidden", false);
    $("#submitBtn").prop("disabled", false).text("次へ進む");
  }

  // 電力会社マスタプルダウン作成
  createElectricCompanyDropdown();

  // その他電力事業者の表示
  toggleOtherElectricCompany();

  // 契約番号のテキストボックス作成
  generateCompanyNumberTextbox();

  // 供給番号のテキストボックス作成
  generateSubTextbox("2,4,4,4,4,4", "servicePointNumber");

  // 契約種別プルダウンの内容をロード
  changeContractTypeDropdown();

  // 割引ラジオ変更
  changeDiscountRadio();
  changeApplyDiscountRadio();

  // 郵便番号テキストボックス作成
  generateSubTextbox("3, 4", "usageLocationPostalCode");
  generateSubTextbox("3, 4", "applicantPostalCode");
  generateSubTextbox("3, 4", "UDMailingAddressPostalCode");
  generateSubTextbox("3, 4", "NSMailingAddressPostalCode");

  // 都道府県プルダウン作成
  generatePrefecturesDropdown("usageLocationPrefecture");
  generatePrefecturesDropdown("applicantPrefecture");
  generatePrefecturesDropdown("UDMailingAddressPrefecture");
  generatePrefecturesDropdown("NSMailingAddressPrefecture");

  // 生年月日プルダウン作成
  generateBirthDateDropdown(
    CONTRACTOR_YEAR_OF_BIRTH_ID,
    CONTRACTOR_MONTH_OF_BIRTH_ID,
    CONTRACTOR_DAY_OF_BIRTH_ID
  );
  updateContractorBirthdate();

  // 固定電話と携帯電話を切り替える
  togglePhoneType("contractorPhone");
  togglePhoneType("applicantPhone");
  togglePhoneType("nomusilicaPhone");

  // 条件付き必須項目の変換
  toggleApplicationContractorRelationship();
  toggleApplicantContractorLocationRelationship();
  toggleUsageDetailMailing();
  toggleUsageDetailMailingAddress();
  toggleNomuSilicaMailingAddress();

  // 最初のバリデーション
  validateAllField();

  // 管轄エリアをデフォルト選択
  selectDefaultArea();

  // ドメインによる表示切り替え
  checkDomain();

  // どこで知ったか_その他の表示
  toggleWhereDidYouKnowOther();

  checkCanceller("servicePointNumber");

  // 支払情報の初期選択
  if (siteName == SITE_NAME_SHIJO) {
    $("input[name=paymentMethodCode][value=01]").prop("checked", true);
  }

  //市場電力の場合バリデーションを通す
  if(siteName == SITE_NAME_SHIJO) {
    $("#contractCapacityFlag").val(FLAG_ON);
  }

  // 最初のロード完了
  isFirstLoad = false;
});

// 管轄エリアをデフォルト選択
function selectDefaultArea() {
  let defaultArea = DOMAIN_AREA_MAP[window.location.hostname];
  if (defaultArea != undefined && $("#areaCode").val() == "") {
    $("#areaCode").val(defaultArea).change();
  }
}

// 電力会社マスタプルダウン作成
function createElectricCompanyDropdown() {
  // 電力会社データプルダウンデータ更新
  let $mecDropdown = $("#mainElectricCompanyDropdown");
  let mecValue = $("#mainElectricCompany").val();

  if (siteName != SITE_NAME_SHIJO) {
    mainElectricCompanies.forEach((e) => {
	    $mecDropdown.append(`<option value="${e.code}" >${e.name}</option>`);
    });
  } else {
    mainElectricCompanies
      .filter((e) => e.code == LOOOP_ELECTRIC_COMPANY_CODE)
      .forEach((e) => {
	    $mecDropdown.append(`<option value="${e.code}" >${e.name}</option>`);
    });
    mainElectricCompanies
      .filter((e) => e.name != ELECTRIC_COMPANY_OKINAWA && e.code != LOOOP_ELECTRIC_COMPANY_CODE)
      .forEach((e) => {
	    $mecDropdown.append(`<option value="${e.code}" >${e.name}</option>`);
    });
  }

  if (mecValue != "") {
    $mecDropdown.val(mecValue);
  }

  // その他の電力会社のプルダウン作成
  loadOtherElectricCompanyDropdown();
}

// 他の電力会社の選択肢を表示する
function loadOtherElectricCompanyDropdown() {
  $("#otherElectricCompanyResult").empty();
  $("#otherElectricCompanySearch").val("");

  otherElectricCompanies.forEach((ele) => {
    $("#otherElectricCompanyResult").append(
      `<li onclick="selectOtherElectricCompany('${ele.code}', '${ele.name}')">${ele.name}</li>`
    );
  });
}

// 他の電力会社を選択する
function selectOtherElectricCompany(companyCode, companyName) {
  $("#electricCompanyCode").val(companyCode).change();
  $("#electricCompanyName").val(companyName);
  $("#otherElectricCompany").val(companyName).change();

  // 選択する他の電力会社を変更する
  $("#otherElectricCompanyDropdown")
    .empty()
    .append(
      $("<option></option>").attr("value", companyName).text(companyName)
    );

  // 他の電力会社検索ウィンドウを閉じる
  $("#otherElectricCompanySearchWindow").prop("hidden", true);
}

// その他電力事業者の表示
function toggleOtherElectricCompany() {
  if ($("#mainElectricCompanyDropdown").val() == OTHER_ELECTRIC_COMPANY_CODE) {
    $(".otherElectricCompanyGroup").prop("hidden", false);
    $(".companyNumber.textboxes").prop("hidden", true);
    $("#areaPlan-notice").prop("hidden", true);

    // 最初のロードではない場合
    if (!isFirstLoad) {
      $("#otherElectricCompanyDropdown")
        .empty()
        .append(`<option value="" hidden>電力会社を検索</option>`);
    }
  } else {
    $(".otherElectricCompanyGroup").prop("hidden", true);
    $("#otherElectricCompany").val("");
  }
}

// 契約番号のテキストボックス作成
function generateCompanyNumberTextbox() {
  let electricCompanyCode = $("#mainElectricCompany").val();
  let isTokyo = electricCompanyCode == TOKYO_ELECTRIC_COMPANY_CODE;
  $("#toSubText, #toFreeText").remove();

  if (!electricCompanyCode) {
    $("#companyNumber").prop("type", "text").prop("maxlength", 30);
    return;
  }

  // 現在契約している電力事業社の取得
  let electricCompanyInfo = electricCompanies.find(
    (e) => e.code == electricCompanyCode
  );

  // textboxPatternの例：[2,1,2,3,2]
  let { textboxPattern } = electricCompanyInfo;
  let isFreeText = $("#companyNumberType").val() == FREE_TEXTBOX;

  // 元のサブテキストボックスの削除
  $(".companyNumber.textboxes").empty();

  // patternなしテキストボックス
  if (!textboxPattern || isTokyo) {
    $("#companyNumber")
      .prop("type", "text")
      .prop("maxlength", 30)
      .css("width", "90%");
    $(".companyNumber.textboxes").prop("hidden", true);
    hideValidateSuccess("companyNumber");
    hideValidateError("companyNumber");
    validateCompanyNumber();
    return;
  } else {
    // フリーテキストの場合
    if (isFreeText) {
      $("#companyNumber")
        .prop("type", "text")
        .prop("maxlength", 30)
        .css("width", "60%")
        .after(
          `<a id="toSubText" href="#" class="a-blue" style="width: 30%">元の入力フォームにする</a>`
        );
      $(".companyNumber.textboxes").prop("hidden", true);
      hideValidateSuccess("companyNumber");
      hideValidateError("companyNumber");
      if ($("#companyNumber").val().length > 0) {
        $("#companyNumber").blur(); // 入力チェックさせる
      }
      return;
    } else {
      $(".companyNumber.textboxes").prop("hidden", false);
      $("#companyNumber").prop("type", "hidden");
    }
  }

  // サブテキストボックス追加
  generateSubTextbox(textboxPattern, "companyNumber");
  $("input[id^='companyNumber_']").attr("inputmode", "text");
  $(".companyNumber.textboxes").append(
    `<a id="toFreeText" href="#" class="a-blue">フリーテキストにする</a>`
  );

  // 契約番号のバリデーションチェック
  validateCompanyNumber();

  // 元のバリデーションチェック結果を隠す
  if (!isFirstLoad) {
    hideValidateSuccess("companyNumber");
    hideValidateError("companyNumber");
  }
}

// 申込者と契約者の関係の変更
function toggleApplicationContractorRelationship() {
  let value = $("input[name=applicationContractorRelationship]:checked").val();

  radioTrigger(value, ".applicantInfo");

  $(".spouseInfo").prop("hidden", value == RADIO_SAME);

  if (!isFirstLoad) {
    $(
      "input:radio[name=applicantContractorLocationRelationship][value=1]"
    ).click();
  }

  // 申込者住所がラジオボタンだった場合、契約者住所に変更
  if (value == "1") {
    let UDMA = $("input[name=usageDetailMailingAddress]:checked").val();
    let MSMA = $("input[name=nomuSilicaMailingAddress]:checked").val();
    if (UDMA == RADIO_APPLICANT) {
      $("input[name=usageDetailMailingAddress][value=1]").prop("checked", true);
    }
    if (MSMA == RADIO_APPLICANT) {
      $("input[name=nomuSilicaMailingAddress][value=1]").prop("checked", true);
    }
  }
}

// 契約者と同住所の変更
function toggleApplicantContractorLocationRelationship() {
  let value = $(
    "input[name=applicantContractorLocationRelationship]:checked"
  ).val();

  radioTrigger(value, ".applicantLocationInfo");

  $("#usageDetailMailingAddress_2").parent().prop("hidden", value == RADIO_SAME);
  $("#nomuSilicaMailingAddress_2").parent().prop("hidden", value == RADIO_SAME);

  // 申込者住所がラジオボタンだった場合、契約者住所に変更
  if (value == "1") {
    let UDMA = $("input[name=usageDetailMailingAddress]:checked").val();
    let MSMA = $("input[name=nomuSilicaMailingAddress]:checked").val();
    if (UDMA == RADIO_APPLICANT) {
      $("input[name=usageDetailMailingAddress][value=1]").prop("checked", true);
    }
    if (MSMA == RADIO_APPLICANT) {
      $("input[name=nomuSilicaMailingAddress][value=1]").prop("checked", true);
    }
  }
}

// 利用明細の郵送（電気使用量のお知らせ）の変更
function toggleUsageDetailMailing() {
  let value = $("input[name=usageDetailMailing]:checked").val();

  radioTrigger(value, ".UDMAaddress");

  if (value == "1") {
    $("input[name=usageDetailMailingAddress][value=1]").prop("checked", true);
    $(".UDMAOtherAaddress").prop("hidden", true);
  }
}

// 利用明細の郵送先住所の変更
function toggleUsageDetailMailingAddress() {
  let value = $("input[name=usageDetailMailingAddress]:checked").val();

  radioTrigger2(value, ".UDMAOtherAaddress", "0");
}

// のむシリカの郵送先住所の変更
function toggleNomuSilicaMailingAddress() {
  let value = $("input[name=nomuSilicaMailingAddress]:checked").val();

  radioTrigger2(value, ".NSMAOtherAaddress", "0");

  if (value != "0") {
    $("input[name=nomusilicaPhoneType][value=1]").prop("checked", true).click();
    togglePhoneType("nomusilicaPhone");
  }
}

// 固定電話と携帯電話を切り替える
function togglePhoneType(id) {
  if ($(`input[name=${id}Type]:checked`).val() == RADIO_LANDLINE) {
    $(`.${id}Landline.textboxes`).prop("hidden", false);
    $(`.${id}Mobile.textboxes`).prop("hidden", true);
    $(`.${id}Mobile.error`).prop("hidden", true);
    $(`.${id}Mobile.success`).prop("hidden", true);
    $(`.${id}Mobile.textboxes input`).val("").change();
    $(`#${id}Mobile`).val("");
  } else {
    $(`.${id}Mobile.textboxes`).prop("hidden", false);
    $(`.${id}Landline.textboxes`).prop("hidden", true);
    $(`.${id}Landline.error`).prop("hidden", true);
    $(`.${id}Landline.success`).prop("hidden", true);
    $(`.${id}Landline.textboxes input`).val("").change();
    $(`#${id}Landline`).val("");
  }
}

// 管轄エリアを切り替えたら電力事業者が切り替わる
function changeMainElectricCompany() {
  let areaCode = $("#areaCode").val();
  let mainCompanyCode = $("#mainElectricCompanyDropdown").val();

  // 管轄エリアと電力会社のマッピングが正しい場合
  if ($("#electricCompanyCode").val() == AREA_COMPANY_MAP[areaCode]) {
    return;
  }

  if (siteName != SITE_NAME_SHIJO) {
    $("#mainElectricCompanyDropdown").val(AREA_COMPANY_MAP[areaCode]).change();
  } else {
    if (mainCompanyCode != "" && mainCompanyCode != LOOOP_ELECTRIC_COMPANY_CODE) {
      $("#mainElectricCompanyDropdown").val(AREA_COMPANY_MAP[areaCode]).change();
    }
  }
}

// 電力事業者を切り替えたら管轄エリアが切り替わる
function changeAreaCode() {
  // 電力事業者コード
  let mainCompanyCode = $("#mainElectricCompanyDropdown").val();
  let areaCode;

  // 管轄エリアコード取得
  for (let [key, value] of Object.entries(AREA_COMPANY_MAP)) {
    if (value === mainCompanyCode) {
      areaCode = key;
      break;
    }
  }

  // 管轄エリアコードを切り替え
　　if (siteName != SITE_NAME_SHIJO) {
    $("#areaCode").val(areaCode).change();
  } else {
    if (mainCompanyCode != LOOOP_ELECTRIC_COMPANY_CODE) {
      $("#areaCode").val(areaCode).change();
	}
  }
}

// 郵便番号のフォーカスアウトの処理
let postalCodeErrMsg = {
  usageLocationPostalCode: [],
  applicantPostalCode: [],
  UDMailingAddressPostalCode: [],
  NSMailingAddressPostalCode: [],
};
function postalCodeFocusoutHandler(postalCodeTextbox) {
  let postalCodeTextboxId = postalCodeTextbox.attr("id");
  let postalCodeType = postalCodeTextboxId.split("_")[0];
  let postalCodeIndex = postalCodeTextboxId.split("_")[1];
  let maxLength = 7;
  let lengthArray = [3, 4];

  // 数字チェック
  validateNumber(postalCodeTextbox, postalCodeType, "郵便番号");

  // 現在のテキストボックスのバリデーションチェック
  let subPostalCodeValidateResult = validateSubPostalCode({
    val: postalCodeTextbox.val(),
    is: lengthArray[postalCodeIndex],
  });
  if (subPostalCodeValidateResult !== undefined) {
    subTextboxFailHandler(
      subPostalCodeValidateResult,
      postalCodeTextboxId,
      postalCodeErrMsg[postalCodeType]
    );
    validateResults[postalCodeType] = false;
    checkValidateResults();
  } else {
    postalCodeErrMsg[postalCodeType] = subTextboxSuccessHandler(
      postalCodeTextboxId,
      postalCodeErrMsg[postalCodeType]
    );
  }

  // 郵便番号の設定
  let postalCodeValue =
    $(`#${postalCodeType}_0`).val() + $(`#${postalCodeType}_1`).val();
  $(`#${postalCodeType}`).val(postalCodeValue);

  if (postalCodeValue.length != maxLength) {
    return;
  }

  checkArea(postalCodeValue, postalCodeType);
  if (!validateResults[postalCodeType]) {
	return;
  }

  //郵便番号のバリデーション
  let successCallback = (result) => {
    validateSuccessHandler(applyFormInfo[postalCodeType]);
    validateResults[postalCodeType] = true;
    checkValidateResults();
  };
  let errCallback = (result) => {
    let errMsg = result[postalCodeType][0].slice(
      result[postalCodeType][0].lastIndexOf(" ") + 1
    );
    validationFailHandler(applyFormInfo[postalCodeType], errMsg);
    validateResults[postalCodeType] = false;
    checkValidateResults();
  };

  validatePostalCode(postalCodeType, successCallback, errCallback);
}

// 生年月日の更新
function updateContractorBirthdate() {
  let selectedYear = $(CONTRACTOR_YEAR_OF_BIRTH_ID).val();
  let selectedMonth = $(CONTRACTOR_MONTH_OF_BIRTH_ID).val();
  let selectedDay = $(CONTRACTOR_DAY_OF_BIRTH_ID).val();

  if (selectedMonth.length < 2) {
    selectedMonth = "0" + selectedMonth;
  }
  if (selectedDay.length < 2) {
    selectedDay = "0" + selectedDay;
  }

  $("#contractorBirthdate").val(
    `${selectedYear}-${selectedMonth}-${selectedDay}`
  );
}

// 生年月日を変更する処理
function contractorBirthdateOnChangeHanlder() {
  updateContractorBirthdate();

  showValidateResultToScreen(
    applyFormInfo.contractorBirthdate,
    validateContractorBirthdate()
  );
}

// 参考マークの画像を切り替え
function changeRefImg(companyCode, field) {
  const REF_IMG_URL = "/img/apply_ref";
  let popupId = `${field}Popup`;
  let imgUrl = REF_IMG_URL + REF_MAP[companyCode][field];

  // 項目の画像がない場合
  if (imgUrl == REF_IMG_URL) {
    $(`.${field}.modaal`).prop("hidden", true);
    return;
  }

  $(`#${popupId} img`).attr("src", imgUrl);
}

function changeContractTypeDropdown() {
  let $contTypeDrop = $("#contractTypeCodeDropdown");
  let areaCd = $("#areaCode").val();
  let contTypeCd = $("#contractTypeCode").val();
  let electricCompanyCode = $("#electricCompanyCode").val();

  // 管轄エリアと契約種別がない場合
  if (isFirstLoad && areaCd == "" && contTypeCd == "") {
    return;
  }

  if(!(electricCompanyCode == OTHER_ELECTRIC_COMPANY_CODE)){
    // 「※（）内は...のプラン相当」を表示
    let companyName = mainElectricCompanies.filter(
      (e) => e.code == AREA_COMPANY_MAP[areaCd]
    )[0].name;

    $("#areaPlan-notice")
    .text(`※（ ）内は${companyName}のプラン`)
    .prop("hidden", false);
  } else {
    $("#areaPlan-notice").prop("hidden", true);
  }

  let contTypeOptions = "";
  planJson
    .filter((e) => e.areaCode == areaCd && e.planName && electricCompanyCode == e.electricCompanyCode && (APPLY_SAME == e.applyAdvisabilityStatus || APPLY_DISC == e.applyAdvisabilityStatus))
    .forEach(
      (e) =>
        (contTypeOptions += `<option value="${e.planCode}">${e.planName}</option>`)
    );
  contTypeOptions += `<option value="XXXX">その他又は不明</option>`;

  $contTypeDrop
    .prop("disabled", false)
    .empty()
    .append(`<option value="" hidden>選択してください</option>`)
    .append(contTypeOptions);

  if (isFirstLoad) {
    $contTypeDrop.val(contTypeCd).change();

  } else {
    $contTypeDrop.change();
  }
}

function changePricePlanDropdown() {
  let $pricePlanDrop = $("#pricePlanDropdown");
  let contTypeCd = $("#contractTypeCode").val();
  let areaCd = $("#areaCode").val();
  let otherPowerUnitCd = $("#otherPlanPowerUnitCode").val();
  let mainEleCom = $("#mainElectricCompany").val();

  // 管轄エリアと契約種別がない場合
  if (isFirstLoad && areaCd == "" && contTypeCd == "") {
    return;
  }

  let pricePlanOptions = "";

  if (!contTypeCd) {
    $pricePlanDrop.empty().append(`<option value="" hidden>選択してください</option>`).val("").change();
    return;
  }

  let tempPricePlanJson = '';
  if (contTypeCd != OTHER_PLAN) {
    let selectedContPlan = planJson
      .filter((e) => e.planCode == contTypeCd);
    let planCd = selectedContPlan[0].newPlanCode;
    let applyAdvisabilityStatus = selectedContPlan[0].applyAdvisabilityStatus;

    if (siteName != SITE_NAME_SHIJO) {
      if (mainEleCom != OTHER_ELECTRIC_COMPANY_CODE) {
        if (applyAdvisabilityStatus == APPLY_SAME) {
          tempPricePlanJson = planJson
            .filter((e) => e.areaCode == areaCd
              && (APPLY_SAME == e.applyAdvisabilityStatus)
              && e.planCode != OTHER_PLAN);
        } else {
          tempPricePlanJson = planJson
            .filter((e) => e.areaCode == areaCd
              && ((APPLY_SAME == e.applyAdvisabilityStatus && planCd != e.newPlanCode) || (APPLY_DISC == e.applyAdvisabilityStatus && planCd == e.newPlanCode))
              && e.planCode != OTHER_PLAN);
        }
      } else {
        if (applyAdvisabilityStatus == APPLY_SAME) {
          tempPricePlanJson = planJson
          .filter((e) => e.areaCode == areaCd
            && (APPLY_SAME == e.applyAdvisabilityStatus)
            && e.planCode != OTHER_PLAN);
        } else {
          tempPricePlanJson = planJson
            .filter((e) => e.areaCode == areaCd
              && ((APPLY_SAME == e.applyAdvisabilityStatus && planCd != e.newPlanCode) || (APPLY_DISC == e.applyAdvisabilityStatus && planCd == e.newPlanCode))
              && e.planCode != OTHER_PLAN);
        }
      }
    } else {
      tempPricePlanJson = planJson
        .filter((e) => e.areaCode == areaCd
          && (APPLY_SAME == e.applyAdvisabilityStatus
          || APPLY_DISC == e.applyAdvisabilityStatus)
          && e.planCode != OTHER_PLAN
          && e.planName == '');
    }
  } else {
    if (siteName != SITE_NAME_SHIJO) {
      tempPricePlanJson = planJson
        .filter((e) => e.areaCode == areaCd
          && (APPLY_SAME == e.applyAdvisabilityStatus)
          && e.planCode != OTHER_PLAN);
    } else {
      tempPricePlanJson = planJson
        .filter((e) => e.areaCode == areaCd
          && (APPLY_SAME == e.applyAdvisabilityStatus
          || APPLY_DISC == e.applyAdvisabilityStatus)
          && e.planCode != OTHER_PLAN
          && e.planName == '');
    }
  }

  if (contTypeCd != OTHER_PLAN) {

    let contType = planJson.filter((e) => e.planCode == contTypeCd);
    let contTypePtsc = contType[0].powerTranmissionServiceCode;
    let contTypePuc = contType[0].powerUnitCode;

    if (contTypePtsc) {
      tempPricePlanJson = tempPricePlanJson
        .filter((e) => e.powerTranmissionServiceCode.substring(0,1) == contTypePtsc.substring(0,1)
            && e.powerUnitCode == contTypePuc);
    }
  } else if (otherPowerUnitCd) {
	if (siteName != SITE_NAME_SHIJO) {
      tempPricePlanJson = tempPricePlanJson.filter((e) => e.powerUnitCode == otherPowerUnitCd);
	} else {
	  if (otherPowerUnitCd == POWER_UNIT_CODE_KW) {
	    // kWプラン
        tempPricePlanJson = tempPricePlanJson
          .filter((e) => e.powerUnitCode == otherPowerUnitCd || e.lowVoltagePowerTypeCode == '4');
	  } else {
        tempPricePlanJson = tempPricePlanJson
          .filter((e) => e.powerUnitCode == otherPowerUnitCd);
	  }
	}
  }

  $("#pricePlan-notice").prop("hidden", contTypeCd == OTHER_PLAN);
  $("#areaPlan-notice").prop("hidden", mainEleCom == OTHER_ELECTRIC_COMPANY_CODE);

  let capaText = $("#otherPlanPowerUnitDropDown").val();
  if (siteName != SITE_NAME_SHIJO) {
    if (mainEleCom != OTHER_ELECTRIC_COMPANY_CODE && contTypeCd != OTHER_PLAN) {
      tempPricePlanJson
        .forEach(
          (e) => {
              (pricePlanOptions += `<option value="${e.planCode}">
                ${e.newPlanName}（${e.planName}相当）
                </option>`)
      });
      $("#areaPlan-notice").prop("hidden", false);
    } else {
      tempPricePlanJson
        .forEach(
          (e) => {
            (pricePlanOptions += `<option value="${e.planCode}">
              ${e.newPlanName}
              </option>`)
      });
      $("#areaPlan-notice").prop("hidden", true);
    }
  } else {
    if (contTypeCd != OTHER_PLAN || (contTypeCd == OTHER_PLAN && capaText != '')) {
      tempPricePlanJson
        .forEach(
          (e) =>
            (pricePlanOptions += `<option value="${e.planCode}">
              ${e.newPlanName}
              </option>`)
      );
    }
  }

  $pricePlanDrop
    .empty()
    .append(`<option value="" hidden>選択してください</option>`)
    .append(pricePlanOptions);

  if (isFirstLoad) {
    $pricePlanDrop.val($("#compatiblePlanCode").val());

  } else {
	if (siteName != SITE_NAME_SHIJO) {
     if (contTypeCd && contTypeCd != OTHER_PLAN) {
     tempPricePlanJsonFiltered = tempPricePlanJson
       .filter((e) => e.planCode == contTypeCd);
     $pricePlanDrop.val(tempPricePlanJsonFiltered[0].planCode);
     }
	} else {
      if (contTypeCd && contTypeCd != OTHER_PLAN) {
	    $pricePlanDrop.prop('selectedIndex', 1);
      } else {
        if (contTypeCd && (capaText.includes(POWER_UNIT_CODE_A) || capaText.includes(POWER_UNIT_CODE_KVA) || capaText.includes(POWER_UNIT_CODE_NO_BASIC))) {
	      $pricePlanDrop.prop('selectedIndex', 1);
	    }
      }
	}
  }

  $pricePlanDrop.change();
}

function changeContractCapacityDropdown() {
  let contTypeCd = $("#contractTypeCode").val();
  let $contCapaDrop = $("#contractCapacityDropdown");
  let currUnitCd = $("#otherPlanPowerUnitCode").val();
  let contCapaCd = $("#contractCapacityCode").val();
  let powerCapacity = $("#powerCapacity").val();

  if (!contTypeCd) {
    dispContractCapacity(false);
    $contCapaDrop.val("").change();
    return;
  }
  if (contTypeCd == OTHER_PLAN) {
    $("#contractCapacity-container").prop("hidden", false);

    if (!currUnitCd || POWER_UNIT_NO_BASIC == currUnitCd) {
      dispContractCapacity(false);
      $contCapaDrop.empty().append(`<option value="" hidden>選択してください</option>`).change();
      $("#contractCapacity-container input").val(null);
      if(siteName == SITE_NAME_SHIJO){
        $("#contractCapacity-container input").val(FLAG_ON);
      }

    } else {
      $contCapaDrop.prop("disabled", false).empty().append(`<option value="" hidden>選択してください</option>`).change();
      let contCapaList = otherPlanUnitListJson.filter((e) => e.powerUnitCode == currUnitCd);

      if (contCapaList.length > 0) {

        contCapaList.forEach((e) => {
          $contCapaDrop.append(
              `<option
              data-capacity=${e.powerCapacity}
              data-power-unit="${e.powerUnitCode}"
              value="${e.id}">
              ${e.powerCapacityText}
              </option>`
          );
        });

        $contCapaDrop.prop("disabled", false).change();
      }
    }

  } else {

    let ddData = contractCapacityJson.filter(
      (e) => e.planCode == contTypeCd && e.powerCapacity != null
    );

    if (ddData.length == 0) {
      dispContractCapacity(false);
      $("#contractCapacity-container input").val(null);
      return;

    } else {

      dispContractCapacity(true);
      $contCapaDrop.empty().append(`<option value="" hidden>選択してください</option>`);


      ddData.forEach((e) => {
        $contCapaDrop.append(
            `<option
            data-capacity=${e.powerCapacity}
            data-power-unit="${e.powerUnitCode}"
            value="${e.id}">
            ${e.powerCapacityText}
            </option>`
        );
      });
    }
  }

  if (isFirstLoad && contCapaCd) {
    $contCapaDrop.val(contCapaCd).change();

  } else {
    $contCapaDrop.change();
  }
}

function toggleWhereDidYouKnowOther() {
  if ($("#whereDidYouKnow").val() != WHERE_DID_YOU_KNOW_OTHER) {
    $("#whereDidYouKnowOther-container").prop("hidden", true);
  } else {
    if (!isFirstLoad) {
      $("#whereDidYouKnowOther").val("").change();
      $(".whereDidYouKnowOther").prop("hidden", true);
    }
    $("#whereDidYouKnowOther-container").prop("hidden", false);
  }
}

function changeDiscountRadio() {
  let contractTypeCode = $("#contractTypeCode").val();
  let discountVal = $("#discount").val();

  $("#discount-container").prop("hidden", true);
  $("#radioDiscount").empty();
  $("#discount").val("");

  // プランがないまたは「その他又は不明」
  if (contractTypeCode === "" || contractTypeCode === OTHER_PLAN) {
    return;
  }

  // 割引オプションを取得
  let plan = planJson.filter((e) => e.planCode === contractTypeCode)[0];
  let discountOptions = [];
  for (const [key, value] of Object.entries(plan)) {
    if (key.includes("discountPremiumName") && value != null) {
      discountOptions.push(value);
    }
  }

  // 割引がない場合
  if (discountOptions.length === 0) {
    return;
  }

  // 割引がある場合
  $("#discount-container").prop("hidden", false);
  let radioAppend = (discount, isDiscount = true) => {
    $("#radioDiscount").append(
      `<label>
          <input type="radio" name="radioDiscount"
            value="${isDiscount ? discount : ""}"/>
          <span style="display: inline">
            ${discount ? discount + "が" : "いずれも"}適用されてい${
        isDiscount ? "る" : "ない"
      }
          </span>
        </label><br>`
    );
    $("input[name=radioDiscount][value='']").prop("checked", true);
  };

  // ラジオに割引オプションを追加
  if (discountOptions.length == 1) {
    let discount = discountOptions[0];
    radioAppend(discount, false);
    radioAppend(discount);
  } else {
    radioAppend("", false);
    discountOptions.forEach((e) => radioAppend(e));
  }

  // 最初のロード
  if (isFirstLoad) {
    $(`input[name=radioDiscount][value='${discountVal}']`).prop(
      "checked",
      true
    );
    $("#discount").val(discountVal);
  }
}

function changeApplyDiscountRadio() {
  let pricePlanCode = $("#pricePlanCode").val();
  let applyDiscountVal = $("#applyDiscount").val();

  $("#apply-discount-container").prop("hidden", true);
  $("#radioApplyDiscount").empty();

  // 現在割引適用状況が表示されている場合
  if (!$("#discount-container").is(':hidden')) {
    return;
  }

  $("#applyDiscount").val("");

  // プランがない場合
  if (pricePlanCode === "") {
    return;
  }

  // 割引オプションを取得
  let plan = planJson.filter((e) => e.planCode === pricePlanCode)[0];
  let discountOptions = [];
  for (const [key, value] of Object.entries(plan)) {
    if (key.includes("discountPremiumName") && value != null) {
      discountOptions.push(value);
    }
  }

  // 割引がない場合
  if (discountOptions.length === 0) {
    return;
  }

  // 割引がある場合
  $("#apply-discount-container").prop("hidden", false);
  let radioAppend = (applyDiscount, isApplyDiscount = true) => {
    $("#radioApplyDiscount").append(
      `<label>
          <input type="radio" name="radioApplyDiscount"
            value="${isApplyDiscount ? applyDiscount : ""}"/>
          <span style="display: inline">
            ${applyDiscount ? applyDiscount + "の" : "いずれも"}適用を受け${
        isApplyDiscount ? "る" : "ない"
      }
          </span>
        </label><br>`
    );
    $("input[name=radioApplyDiscount][value='']").prop("checked", true);
  };

  // ラジオに割引オプションを追加
  if (discountOptions.length == 1) {
    let applyDiscount = discountOptions[0];
    radioAppend(applyDiscount, false);
    radioAppend(applyDiscount);
  } else {
    radioAppend("", false);
    discountOptions.forEach((e) => radioAppend(e));
  }

  // 最初のロード
  if (isFirstLoad) {
    $(`input[name=radioApplyDiscount][value='${applyDiscountVal}']`).prop(
      "checked",
      true
    );
    $("#applyDiscount").val(applyDiscountVal);
  }
}

function changeDiscountNotice() {
  let pricePlanCode = $("#pricePlanCode").val();
  let discount = $("#discount").val();

  if (!pricePlanCode) {
    return;
  }

  let plan = planJson.filter((e) => e.planCode === pricePlanCode)[0];
  for (const [key, value] of Object.entries(plan)) {
    if (key.includes("discountPremiumName") && value == discount) {
      $("#discountPlan-notice")
        .text(`※${discount}が適用されます`)
        .prop("hidden", false);
      break;
    } else {
      $("#discountPlan-notice").text("").prop("hidden", true);
    }
  }
}

function copyDiscount() {
  let pricePlanCode = $("#pricePlanCode").val();
  let discount = $("#discount").val();

  if (isFirstLoad) {
    return;
  }

  $("#applyDiscount").val("");
  let plan = planJson.filter((e) => e.planCode === pricePlanCode)[0];
  for (const [key, value] of Object.entries(plan)) {
    if (key.includes("discountPremiumName") && value == discount) {
      $("#applyDiscount").val(discount);
      break;
    }
  }
}

function checkDomain() {
  // STEP5の文言変更・のむシリカの郵送先住所表示/非表示
  if (siteName == "のむシリカ電力") {
    $(".step4 > h2").html("<span>STEP4.</span> 利用明細・のむシリカの郵送 ");
    $(".nomuSilica").prop("hidden", false);

  } else {
    $(".step4 > h2").html("<span>STEP4.</span> 契約資料・利用明細の郵送 ");
  }
}

function updatePowerUnitDropdown() {
  let areaCd = $("#areaCode").val();
  let $oppuDrop = $("#otherPlanPowerUnitDropDown");
  let contTypeCd = $("#contractTypeCode").val();
  let $oppuCd = $("#otherPlanPowerUnitCode");

  $oppuDrop.empty().append(`<option value="" hidden>選択してください</option>`);

  if (!areaCd || !contTypeCd || OTHER_PLAN != contTypeCd) {
    $oppuDrop.val("").change();
    $("#otherPlanPowerUnit-container").prop("hidden", true);
    checkShijo();
    return;
  }

  powerUnitListJson
    .filter((e) => e.areaCode == areaCd)
    .forEach((e) => {
      $oppuDrop.append(
          `<option
          value="${e.code}">
          ${e.codeDesc}
          </option>`
      );
  });

  $("#otherPlanPowerUnit-container").prop("hidden", false);
  $oppuDrop.prop("disabled", false);

  let currUnitCd = $oppuCd.val();

  if (isFirstLoad && currUnitCd) {
    $oppuDrop.val(currUnitCd).change();

  } else {
    $oppuDrop.change();
  }
}

function dispContractCapacity(isDisplay) {
  $("#contractCapacityDropdown").prop("disabled", !isDisplay);
  $("#contractCapacity-container").prop("hidden", !isDisplay);
}

// のむシリカ再契約チェック
function checkCanceller(itemName) {
  if (siteName != "のむシリカ電力") {
    return;
  }

  $(".canceller").remove();
  const SPNum = $("#servicePointNumber").val();
  const name = $("#contractorName").val();
  const birth = $("#contractorBirthdate").val();
  const csrfToken = $('input[name="_csrf"]').val();

  isNomusilicaCanceller({ SPNum, name, birth, csrfToken })
  .then((res) => {
    if (res.isValid) {
      // 再契約
      if ($('#' + itemName).parent().find(".canceller").length == 0) {
        const message = getErrMessage("MSGC0023");
        $('#' + itemName).parent().append('<p class="canceller">' + message + '</p>');
      }
    }
  })
  .catch((err) => console.log(err));
}

$("#areaCode").change(function () {
  // 管轄エリアを切り替えたら電力事業者が切り替わる
  changeMainElectricCompany();

  // 契約種別を切り替え
  changeContractTypeDropdown();

  // バリデーション
  showValidateResultToScreen(applyFormInfo.areaCode, validateAreaCode());
});

$("#mainElectricCompanyDropdown").change(function () {
  let companyCode = $(this).val();

  // 電力会社コードと名を設定
  $("#mainElectricCompany").val(companyCode).change();
  $("#mainElectricCompanyName").val($(this).children("option:selected").text());
  $("#electricCompanyCode").val(companyCode).change();
  $("#electricCompanyName").val($(this).children("option:selected").text());

  // 参考マークを切り替え
  if ($("#mainElectricCompanyDropdown").val() != OTHER_ELECTRIC_COMPANY_CODE && $("#mainElectricCompanyDropdown").val() != LOOOP_ELECTRIC_COMPANY_CODE) {
    $(".ref-popup a").prop("hidden", false);

    // 管理エリアを切り替え
    changeAreaCode();

    // 参考マーク画像を切り替え
    changeRefImg(companyCode, "companyNumber");
    changeRefImg(companyCode, "servicePointNumber");
    changeRefImg(companyCode, "contractTypeCode");
    changeRefImg(companyCode, "usageLocation");
    changeRefImg(companyCode, "contractorName");
  } else {
    $(".ref-popup a").prop("hidden", true);
    hideValidateError("companyNumber");
  }

  // バリデーションチェック
  showValidateResultToScreen(
    applyFormInfo.mainElectricCompany,
    validateMainElectricCompany()
  );

  // その他電力事業者の表示
  toggleOtherElectricCompany();

  //契約種別プルダウンの内容をロード
  changeContractTypeDropdown();

  // 契約番号のテキストボックスの作成
  $("#companyNumber").val("");
  $("#companyNumberType").val(SUB_TEXTBOX);
  generateCompanyNumberTextbox();
});

$("#otherElectricCompany").change(() => {
  showValidateResultToScreen(
    applyFormInfo.otherElectricCompany,
    validateOtherElectricCompany()
  );
});

$(document).mouseup(function (e) {
  // 他の電力会社ウィンドウを閉じる
  let otherElectricCompanyContainer = $("#otherElectricCompanyContainer");
  if (
    !otherElectricCompanyContainer.is(e.target) &&
    otherElectricCompanyContainer.has(e.target).length === 0
  ) {
    $("#otherElectricCompanySearchWindow").prop("hidden", true);
  }
});

$("#otherElectricCompanyDropdown").on("mousedown", function (e) {
  e.preventDefault();

  // 他の電力会社選択画面を表示する
  $("#otherElectricCompanySearchWindow").prop(
    "hidden",
    !$("#otherElectricCompanySearchWindow").prop("hidden")
  );
});

$("#otherElectricCompanySearch").on("keyup", function () {
  let key = normalize($(this).val());

  // 選択肢をフィルタリングする
  let filteredOtherCompany = otherElectricCompanies.filter(
    ({ name, nameHiragana, nameKatakana }) =>
      normalize(name).includes(key) ||
      normalize(nameHiragana).includes(key) ||
      normalize(nameKatakana).includes(key)
  );

  // 選択肢を更新する
  $("#otherElectricCompanyResult").empty();
  filteredOtherCompany.forEach((ele) =>
    $("#otherElectricCompanyResult").append(
      `<li onclick="selectOtherElectricCompany('${ele.code}', '${ele.name}')">${ele.name}</li>`
    )
  );
});

$("#companyNumber").on("keyup", function () {
  // 半角英数字チェック
  validateAlphaNumeric($(this), "companyNumber", "お客様番号");
});

$("#companyNumber").on("focusout change", function () {
  // 半角英数字チェック
  validateAlphaNumeric($(this), "companyNumber", "お客様番号");

  // 現在の電力事業社の最大長取得
  let electricCompanyCode = $("#mainElectricCompany").val();
  let isFreeText = $("#companyNumberType").val() == FREE_TEXTBOX;
  let maxlength = OTHER_ELECTRIC_COMPANY_MAXLENGTH;
  if (
    electricCompanyCode != OTHER_ELECTRIC_COMPANY_CODE &&
    electricCompanyCode != TOKYO_ELECTRIC_COMPANY_CODE &&
    electricCompanyCode != LOOOP_ELECTRIC_COMPANY_CODE &&
    !isFreeText
  ) {
    maxlength = electricCompanies
      .find((ele) => ele.code === $("#mainElectricCompany").val())
      .textboxPattern.split(",")
      .map((e) => +e)
      .reduce((a, b) => a + b);
  }

  showValidateResultToScreen(
    applyFormInfo.companyNumber,
    validateCompanyNumber({
      val: $(this).val(),
      max: maxlength,
      required: true,
      name: "現在契約している電力事業社の契約番号",
    })
  );
});

let companyNumberErrMsg = [];
$(".companyNumber.textboxes").on(
  "focusout change",
  "[id^='companyNumber_']",
  function () {
    // 半角英数字チェック
    validateAlphaNumeric($(this), "companyNumber", "お客様番号");

    let electricCompanyCode = $("#mainElectricCompany").val();
    let subId = $(this).prop("id");
    let subIndex = subId.split("_")[1];

    // 現在の電力事業社の情報取得
    let electricCompanyInfo = electricCompanies.find(
      (ele) => ele.code === electricCompanyCode
    );

    // 現在のサブテキストボックスのmaxlength取得、textboxLengthArrayの例: [2,3,2,1]
    let textboxLengthArray = electricCompanyInfo.textboxPattern
      .split(",")
      .map((e) => +e);
    let companyNumberMaxLength = textboxLengthArray.reduce((a, b) => a + b);

    // 現在のサブテキストボックスのバリデーションチェック
    let subCompanyNumberValidateResult;
    if (electricCompanyCode == TOKYO_ELECTRIC_COMPANY_CODE) {
      subCompanyNumberValidateResult = validateSubCompanyNumber({
        val: $(this).val(),
        max: textboxLengthArray[subIndex],
        required: true,
      });
    } else {
      subCompanyNumberValidateResult = validateSubCompanyNumber({
        val: $(this).val(),
        is: textboxLengthArray[subIndex],
      });
    }

    if (subCompanyNumberValidateResult !== undefined) {
      subTextboxFailHandler(
        subCompanyNumberValidateResult,
        subId,
        companyNumberErrMsg
      );
    } else {
      companyNumberErrMsg = subTextboxSuccessHandler(
        subId,
        companyNumberErrMsg
      );
    }

    // 契約番号の設定
    let companyNumberValue = "";
    textboxLengthArray.forEach((length, i) => {
      companyNumberValue += $(`#companyNumber_${i}`).val();
    });
    $("#companyNumber").val(companyNumberValue);

    // 契約番号のバリデーション
    let validateCompanyNumberResult;
    if (electricCompanyCode == TOKYO_ELECTRIC_COMPANY_CODE) {
      validateCompanyNumberResult = validateCompanyNumber({
        val: companyNumberValue,
        max: companyNumberMaxLength,
        required: true,
      });
    } else {
      validateCompanyNumberResult = validateCompanyNumber({
        val: companyNumberValue,
        is: companyNumberMaxLength,
      });
    }

    if (validateCompanyNumberResult === undefined) {
      showValidateSuccess("companyNumber");
    }
  }
);

$(".companyNumber.textboxes").on(
  "keyup",
  "[id^='companyNumber_']",
  function () {
    // 半角英数字チェック
    validateAlphaNumeric($(this), "companyNumber", "お客様番号");

    subTextboxAutoFocusHanlder(
      $(this),
      $("[id^='servicePointNumber_']").first()
    );
  }
);

$("#companyNumber-container").on("click", "#toFreeText", function () {
  $("#companyNumberType").val(FREE_TEXTBOX);
  generateCompanyNumberTextbox();
});

$("#companyNumber-container").on("click", "#toSubText", function () {
  $("#companyNumberType").val(SUB_TEXTBOX);
  generateCompanyNumberTextbox();

  // サブテキストボックスのバリデーションをしない
  if ($("#companyNumber").val().length == 0) {
    return;
  }

  // サブテキストボックスをバリデーション
  $(`.companyNumber.textboxes input[id^='companyNumber_']`).each(function () {
    $(this).change();
  });
});

let servicePointNumberErrMsg = [];
$(".servicePointNumber.textboxes").on(
  "focusout change",
  "[id^='servicePointNumber_']",
  function () {
    // 数字チェック
    validateNumber($(this), "servicePointNumber", "供給地点特定番号");

    let lengthArray = [2, 4, 4, 4, 4, 4];
    let subId = $(this).prop("id");
    let subIndex = subId.split("_")[1];

    // 現在のテキストボックスのバリデーションチェック
    let subServicePointNumberValidateResult = validateSubServicePointNumber({
      val: $(this).val(),
      is: lengthArray[subIndex],
    });
    if (subServicePointNumberValidateResult !== undefined) {
      subTextboxFailHandler(
        subServicePointNumberValidateResult,
        subId,
        servicePointNumberErrMsg
      );
    } else {
      servicePointNumberErrMsg = subTextboxSuccessHandler(
        subId,
        servicePointNumberErrMsg
      );
    }

    // 供給地点特定番号の設定
    let servicePointNumberValue = "";
    lengthArray.forEach((length, i) => {
      servicePointNumberValue += $(`#servicePointNumber_${i}`).val();
    });
    $("#servicePointNumber").val(servicePointNumberValue);

    // 供給地点特定番号のバリデーション
    if (validateServicePointNumber() === undefined) {
      showValidateSuccess("servicePointNumber");
    }

    checkCanceller("servicePointNumber");
  }
);

$(".servicePointNumber.textboxes").on(
  "keyup",
  "[id^='servicePointNumber_']",
  function () {
    // 数字チェック
    validateNumber($(this), "servicePointNumber", "供給地点特定番号");

    subTextboxAutoFocusHanlder($(this), $("#contractTypeCodeDropdown"));
  }
);

$("#contractTypeCodeDropdown").change(async function () {
  let contTypeCd = $(this).val();
  $("#contractTypeCode").val(contTypeCd);
  $("#contractTypeName").val($(this).find("option:selected").text());

  changeDiscountRadio();

  if (!contTypeCd) {
    updatePowerUnitDropdown();
    showValidateResultToScreen(
      applyFormInfo.contractTypeCode,
      validateContractTypeCode()
    );
    return;
  }

  updatePowerUnitDropdown();
  checkShijo();

  if (siteName != SITE_NAME_SHIJO) {
    applicationCapacityContainer ();
    showDifferentPlanMessage();
  }
  // バリデーション
  showValidateResultToScreen(
    applyFormInfo.contractTypeCode,
    validateContractTypeCode()
  );
});

$("#otherPlanPowerUnitDropDown").change(function() {
  $("#otherPlanPowerUnitCode").val($(this).val());

  changeContractCapacityDropdown();
  changePricePlanDropdown();

  showValidateResultToScreen(
    applyFormInfo.otherPlanPowerUnitCode,
    validateOtherPlanPowerUnitCode()
  );

});

$("#contractCapacityDropdown").change(async function () {
  let $selected = $(this).find("option:selected");

  $("#contractCapacityCode").val($selected.val());
  $("#contractCapacityText").val($selected.text());
  $("#powerCapacity").val($selected.data("capacity"));
  checkShijo();

  if (siteName != SITE_NAME_SHIJO) {
    $("#contractCapacityFlag").val(await checkApplicationPowerCapacity());
    applicationCapacityContainer();
  }

  if (!isFirstLoad) {
    validateContractCapacityCode()
  }
});

$("#radioDiscount").on("change", "input[name=radioDiscount]", function () {
  $("#discount").val($(this).val());
  copyDiscount();

  changeDiscountNotice();

});

$("#radioApplyDiscount").on("change", "input[name=radioApplyDiscount]", function () {
  $("#applyDiscount").val($(this).val());
});

$(".usageLocationPostalCode.textboxes").on(
  "focusout change",
  "[id^='usageLocationPostalCode_']",
  function () {
    // フォーカスアウト処理
    postalCodeFocusoutHandler($(this));

    // 郵便番号変更の処理
    postalCodeChangeHandler("usageLocation", applyFormInfo);
  }
);

$(".usageLocationPostalCode.textboxes").on(
  "keyup",
  "[id^='usageLocationPostalCode_']",
  function () {
    // 数字チェック
    validateNumber($(this), "usageLocationPostalCode", "郵便番号");

    // 自動フォーカス
    subTextboxAutoFocusHanlder($(this), $("#usageLocationCity"));

    // 郵便番号変更の処理
    postalCodeChangeHandler("usageLocation", applyFormInfo);
  }
);

$("#usageLocationPrefectureDropdown").change(function () {
  $("#usageLocationPrefectureName").val(
    $(this).children("option:selected").text()
  );
  $("#usageLocationPrefecture").val($(this).val()).change();
});

$("#usageLocationPrefecture").change(function () {
  showValidateResultToScreen(
    applyFormInfo.usageLocationPrefecture,
    validateUsageLocationPrefecture()
  );
});

// 使用場所住所、フォーカスアウト時
$("#usageLocationCity").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.usageLocationCity,
    validateUsageLocationCity()
  );
});

// 使用場所住所、フォーカスアウト時
$("#usageLocationStreet").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.usageLocationStreet,
    validateUsageLocationStreet()
  );
});

// 使用場所住所、フォーカスアウト時
$("#usageLocationAddress").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.usageLocationAddress,
    validateUsageLocationAddress()
  );
});

// 契約者氏名変更時
$("#contractorName").on("change", function () {
  // 全角に変更
  toZenkaku($(this));

  showValidateResultToScreen(
    applyFormInfo.contractorName,
    validateContractorName()
  );

});

$("#contractorName").on("focusout", function () {

  $("#contractorName").change();
  checkCanceller("contractorName");
});

$("#contractorNameKana").focusout(() => {
  showValidateResultToScreen(
    applyFormInfo.contractorNameKana,
    validateContractorNameKana()
  );
});

$("#contractorYearOfBirth").change(() => {
  showValidateResultToScreen(
    applyFormInfo.contractorYearOfBirth,
    validateContractorYearOfBirth()
  );

  contractorBirthdateOnChangeHanlder();
  checkCanceller("contractorBirthdate");
});

$("#contractorMonthOfBirth").change(() => {
  showValidateResultToScreen(
    applyFormInfo.contractorMonthOfBirth,
    validateContractorMonthOfBirth()
  );

  contractorBirthdateOnChangeHanlder();
  checkCanceller("contractorBirthdate");
});

$("#contractorDayOfBirth").change(() => {
  showValidateResultToScreen(
    applyFormInfo.contractorDayOfBirth,
    validateContractorDayOfBirth()
  );

  contractorBirthdateOnChangeHanlder();
  checkCanceller("contractorBirthdate");
});

$("#contractorMonthOfBirth, #contractorYearOfBirth").on(
  "select.editable-select",
  function () {
    $(this).editableSelect("hide");

    // 生年月日プルダウンの更新
    updateBirthDateDropdown(
      CONTRACTOR_YEAR_OF_BIRTH_ID,
      CONTRACTOR_MONTH_OF_BIRTH_ID,
      CONTRACTOR_DAY_OF_BIRTH_ID
    );

    contractorBirthdateOnChangeHanlder();
    checkCanceller("contractorBirthdate");
  }
);

$("#contractorDayOfBirth").on("select.editable-select", function () {
  $(this).editableSelect("hide");

  contractorBirthdateOnChangeHanlder();
  checkCanceller("contractorBirthdate");
});

$("input[name=contractorPhoneType]").change(() => {
  // 固定電話と携帯電話を切り替える
  togglePhoneType("contractorPhone");
  validateContractorPhoneLandline1();
  validateContractorPhoneLandline2();
  validateContractorPhoneLandline3();
  validateContractorPhoneMobile1();
  validateContractorPhoneMobile2();
  validateContractorPhoneMobile3();
  showValidateResultToScreen(
    applyFormInfo.contractorPhoneType,
    validateContractorPhoneType()
  );
});

$("#contractorPhoneLandline").on("change", function () {
  // 数字チェック
  validateNumber($(this), "contractorPhoneLandline", "固定電話");

  validateContractorPhoneLandline();
});

$(".contractorPhoneLandline.textboxes").on(
  "keyup",
  "[id^='contractorPhoneLandline_']",
  function () {
    // 数字チェック
    validateNumber($(this), "contractorPhoneLandline", "固定電話");

    subTextboxAutoFocusHanlder($(this), $("#contractorEmail"));
  }
);

let contractorPhoneLandlineErrMsg = [];
$(".contractorPhoneLandline.textboxes").on(
  "focusout",
  "[id^='contractorPhoneLandline_']",
  function () {
    // 数字チェック
    validateNumber($(this), "contractorPhoneLandline", "固定電話");

    let subId = $(this).attr("id");
    let validateFuncName = "validate" + subId[0].toUpperCase() + subId.slice(1);
    validateFuncName = validateFuncName.replace("_", "");

    // 現在のテキストボックスのバリデーションチェック
    let subResult = eval(validateFuncName)();
    if (subResult !== undefined) {
      subTextboxFailHandler(subResult, subId, contractorPhoneLandlineErrMsg);
    } else {
      contractorPhoneLandlineErrMsg = subTextboxSuccessHandler(
        subId,
        contractorPhoneLandlineErrMsg
      );
    }

    // 契約者固定電話番号の設定
    let contractorPhoneLandline = "";
    for (let i = 1; i <= 3; i++) {
      contractorPhoneLandline += $(`#contractorPhoneLandline_${i}`).val();
    }
    $("#contractorPhoneLandline").val(contractorPhoneLandline).change();

    // 契約者固定電話番号のバリデーション
    if (
      validateContractorPhoneLandline1() === undefined &&
      validateContractorPhoneLandline2() === undefined &&
      validateContractorPhoneLandline3() === undefined &&
      validateContractorPhoneLandline() === undefined
    ) {
      showValidateSuccess("contractorPhoneLandline");
    }
  }
);

$("#contractorPhoneMobile").on("change", function () {
  // 数字チェック
  validateNumber($(this), "contractorPhoneMobile", "携帯電話");

  validateContractorPhoneMobile();
});

$(".contractorPhoneMobile.textboxes").on(
  "keyup",
  "[id^='contractorPhoneMobile_']",
  function () {
    // 数字チェック
    validateNumber($(this), "contractorPhoneMobile", "携帯電話");

    subTextboxAutoFocusHanlder($(this), $("#contractorEmail"));
  }
);

let contractorPhoneMobileErrMsg = [];
$(".contractorPhoneMobile.textboxes").on(
  "focusout",
  "[id^='contractorPhoneMobile_']",
  function () {
    // 数字チェック
    validateNumber($(this), "contractorPhoneMobile", "携帯電話");

    let subId = $(this).attr("id");
    let validateFuncName = "validate" + subId[0].toUpperCase() + subId.slice(1);
    validateFuncName = validateFuncName.replace("_", "");

    // 現在のテキストボックスのバリデーションチェック
    let subResult = eval(validateFuncName)();
    if (subResult !== undefined) {
      subTextboxFailHandler(subResult, subId, contractorPhoneMobileErrMsg);
    } else {
      contractorPhoneMobileErrMsg = subTextboxSuccessHandler(
        subId,
        contractorPhoneMobileErrMsg
      );
    }

    // 契約者携帯電話番号の設定
    let contractorPhoneMobileValue = "";
    for (let i = 1; i <= 3; i++) {
      contractorPhoneMobileValue += $(`#contractorPhoneMobile_${i}`).val();
    }
    $("#contractorPhoneMobile").val(contractorPhoneMobileValue).change();

    // 契約者携帯電話番号のバリデーション
    if (
      validateContractorPhoneMobile1() === undefined &&
      validateContractorPhoneMobile2() === undefined &&
      validateContractorPhoneMobile3() === undefined &&
      validateContractorPhoneMobile() === undefined
    ) {
      showValidateSuccess("contractorPhoneMobile");
    }
  }
);

$("#contractorEmail").focusout(() => {
  let successCallback = (result) => {
    validateSuccessHandler(applyFormInfo.contractorEmail);
    validateResults["contractorEmail"] = true;
    checkValidateResults();
  };
  let errCallback = (result) => {
    let errMsg = result["contractorEmail"][0].slice(
      result["contractorEmail"][0].lastIndexOf(" ") + 1
    );
    validationFailHandler(applyFormInfo.contractorEmail, errMsg);
    validateResults["contractorEmail"] = false;
    checkValidateResults();
  };

  validateContractorEmail(successCallback, errCallback);
});

$("input[name=contractorGender]").change(function () {
  showValidateResultToScreen(
    applyFormInfo.contractorGender,
    validateContractorGender()
  );
});

$("#contractorHouseholdMembers").change(function () {
  showValidateResultToScreen(
    applyFormInfo.contractorHouseholdMembers,
    validateContractorHouseholdMembers()
  );
});

$("#pricePlanDropdown").change(async function () {
  let pricePlanCd = $(this).val();
  $("#compatiblePlanCode").val(pricePlanCd);
  if(pricePlanCd) {
    let filteredPlanJson = planJson.filter((e) =>
    e.planCode == pricePlanCd);
    pricePlanCd = filteredPlanJson[0].newPlanCode;
  }

  $("#pricePlanCode").val(pricePlanCd);
  $("#pricePlanName").val($(this).find("option:selected").text());

  changeApplyDiscountRadio();

  if (!pricePlanCd) {

    showValidateResultToScreen(
      applyFormInfo.pricePlanCode,
      validatePricePlanCode()
    );

    return;
  }
  copyDiscount();
  changeDiscountNotice();


  if (siteName != SITE_NAME_SHIJO) {
    $("#contractCapacityFlag").val(await checkApplicationPowerCapacity());
    showDifferentPlanMessage();
    applicationCapacityContainer();
  }

  showValidateResultToScreen(
    applyFormInfo.pricePlanCode,
    validatePricePlanCode()
  );
  validateContractCapacityCode()
});

$("input[name=applicationContractorRelationship]").change(() => {
  toggleApplicationContractorRelationship();

  showValidateResultToScreen(
    applyFormInfo.applicationContractorRelationship,
    validateApplicationContractorRelationship()
  );

  validateApplicantRelationshipStatus();
  validateApplicantName();
  validateApplicantNameKana();
  validateApplicantPhoneLandline();
  validateApplicantPhoneLandline1();
  validateApplicantPhoneLandline2();
  validateApplicantPhoneLandline3();
  validateApplicantPhoneMobile();
  validateApplicantPhoneMobile1();
  validateApplicantPhoneMobile2();
  validateApplicantPhoneMobile3();
});

$("#applicantRelationshipStatus").change(function () {
  showValidateResultToScreen(
    applyFormInfo.applicantRelationshipStatus,
    validateApplicantRelationshipStatus()
  );
});

// 申込者氏名、フォーカスアウト時
$("#applicantName").focusout(function () {
  // 全角に変更
  toZenkaku($(this));

  showValidateResultToScreen(
    applyFormInfo.applicantName,
    validateApplicantName()
  );
});

$("#applicantNameKana").focusout(() => {
  showValidateResultToScreen(
    applyFormInfo.applicantNameKana,
    validateApplicantNameKana()
  );
});

$("input[name=applicantPhoneType]").change(() => {
  // 固定電話と携帯電話を切り替える
  togglePhoneType("applicantPhone");
  validateApplicantPhoneLandline1();
  validateApplicantPhoneLandline2();
  validateApplicantPhoneLandline3();
  validateApplicantPhoneMobile1();
  validateApplicantPhoneMobile2();
  validateApplicantPhoneMobile3();
  showValidateResultToScreen(
    applyFormInfo.applicantPhoneType,
    validateApplicantPhoneType()
  );
});

$("#applicantPhoneLandline").on("change", function () {
  // 数字チェック
  validateNumber($(this), "applicantPhoneLandline", "固定電話");

  validateApplicantPhoneLandline();
});

$(".applicantPhoneLandline.textboxes").on(
  "keyup",
  "[id^='applicantPhoneLandline_']",
  function () {
    // 数字チェック
    validateNumber($(this), "applicantPhoneLandline", "固定電話");

    subTextboxAutoFocusHanlder(
      $(this),
      $("input[name=applicantContractorLocationRelationship]")
    );
  }
);

let applicantPhoneLandlineErrMsg = [];
$(".applicantPhoneLandline.textboxes").on(
  "focusout",
  "[id^='applicantPhoneLandline_']",
  function () {
    // 数字チェック
    validateNumber($(this), "applicantPhoneLandline", "固定電話");

    let subId = $(this).attr("id");
    let validateFuncName = "validate" + subId[0].toUpperCase() + subId.slice(1);
    validateFuncName = validateFuncName.replace("_", "");

    // 現在のテキストボックスのバリデーションチェック
    let subResult = eval(validateFuncName)();
    if (subResult !== undefined) {
      subTextboxFailHandler(subResult, subId, applicantPhoneLandlineErrMsg);
    } else {
      applicantPhoneLandlineErrMsg = subTextboxSuccessHandler(
        subId,
        applicantPhoneLandlineErrMsg
      );
    }

    // 申込者固定電話番号の設定
    let applicantPhoneLandline = "";
    for (let i = 1; i <= 3; i++) {
      applicantPhoneLandline += $(`#applicantPhoneLandline_${i}`).val();
    }
    $("#applicantPhoneLandline").val(applicantPhoneLandline).change();

    // 申込者固定電話番号のバリデーション
    if (
      validateApplicantPhoneLandline1() === undefined &&
      validateApplicantPhoneLandline2() === undefined &&
      validateApplicantPhoneLandline3() === undefined &&
      validateApplicantPhoneLandline() === undefined
    ) {
      showValidateSuccess("applicantPhoneLandline");
    }
  }
);

$("#applicantPhoneMobile").on("change", function () {
  // 数字チェック
  validateNumber($(this), "applicantPhoneMobile", "携帯電話");

  validateApplicantPhoneMobile();
});

$(".applicantPhoneMobile.textboxes").on(
  "keyup",
  "[id^='applicantPhoneMobile_']",
  function () {
    // 数字チェック
    validateNumber($(this), "applicantPhoneMobile", "携帯電話");

    subTextboxAutoFocusHanlder(
      $(this),
      $("input[name=applicantContractorLocationRelationship]")
    );
  }
);

let applicantPhoneMobileErrMsg = [];
$(".applicantPhoneMobile.textboxes").on(
  "focusout",
  "[id^='applicantPhoneMobile_']",
  function () {
    // 数字チェック
    validateNumber($(this), "applicantPhoneMobile", "携帯電話");

    let subId = $(this).attr("id");
    let validateFuncName = "validate" + subId[0].toUpperCase() + subId.slice(1);
    validateFuncName = validateFuncName.replace("_", "");

    // 現在のテキストボックスのバリデーションチェック
    let subResult = eval(validateFuncName)();
    if (subResult !== undefined) {
      subTextboxFailHandler(subResult, subId, applicantPhoneMobileErrMsg);
    } else {
      applicantPhoneMobileErrMsg = subTextboxSuccessHandler(
        subId,
        applicantPhoneMobileErrMsg
      );
    }

    // 申込者携帯電話番号の設定
    let applicantPhoneMobileValue = "";
    for (let i = 1; i <= 3; i++) {
      applicantPhoneMobileValue += $(`#applicantPhoneMobile_${i}`).val();
    }
    $("#applicantPhoneMobile").val(applicantPhoneMobileValue).change();

    // 申込者携帯電話番号のバリデーション
    if (
      validateApplicantPhoneMobile1() === undefined &&
      validateApplicantPhoneMobile2() === undefined &&
      validateApplicantPhoneMobile3() === undefined &&
      validateApplicantPhoneMobile() === undefined
    ) {
      showValidateSuccess("applicantPhoneMobile");
    }
  }
);

$("input[name=applicantContractorLocationRelationship]").change(() => {
  toggleApplicantContractorLocationRelationship();

  showValidateResultToScreen(
    applyFormInfo.applicantContractorLocationRelationship,
    validateApplicantContractorLocationRelationship()
  );

  validateApplicantPostalCode();
  validateApplicantPrefecture();
  validateApplicantCity();
  validateApplicantStreet();
  validateApplicantAddress();
});

$(".applicantPostalCode.textboxes").on(
  "focusout",
  "[id^='applicantPostalCode_']",
  function () {
    // フォーカスアウト処理
    postalCodeFocusoutHandler($(this));

    // 郵便番号変更の処理
    postalCodeChangeHandler("applicant", applyFormInfo);
  }
);

$(".applicantPostalCode.textboxes").on(
  "keyup",
  "[id^='applicantPostalCode_']",
  function () {
    // 数字チェック
    validateNumber($(this), "applicantPostalCode", "郵便番号");

    // 自動フォーカス
    subTextboxAutoFocusHanlder($(this), $("#applicantCity"));

    // 郵便番号変更の処理
    postalCodeChangeHandler("applicant", applyFormInfo);
  }
);

$("#applicantPrefectureDropdown").change(function () {
  $("#applicantPrefectureName").val($(this).children("option:selected").text());

  $("#applicantPrefecture").val($(this).val()).change();
});

$("#applicantPrefecture").change(function () {
  showValidateResultToScreen(
    applyFormInfo.applicantPrefecture,
    validateApplicantPrefecture()
  );
});

// 申込者住所、フォーカスアウト時
$("#applicantCity").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.applicantCity,
    validateApplicantCity()
  );
});

// 申込者住所、フォーカスアウト時
$("#applicantStreet").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.applicantStreet,
    validateApplicantStreet()
  );
});

// 申込者住所、フォーカスアウト時
$("#applicantAddress").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.applicantAddress,
    validateApplicantAddress()
  );
});

$("input[name=usageDetailMailing]").on("change", function () {
  toggleUsageDetailMailing();

  showValidateResultToScreen(
    applyFormInfo.usageDetailMailing,
    validateUsageDetailMailing()
  );

  validateUsageDetailMailingAddress();
});

$("input[name=usageDetailMailingAddress]").on("change", function () {
  toggleUsageDetailMailingAddress();

  showValidateResultToScreen(
    applyFormInfo.usageDetailMailingAddress,
    validateUsageDetailMailingAddress()
  );

  validateUDMailingAddressName();
  validateUDMailingAddressNameKana();
  validateUDMailingAddressPostalCode();
  validateUDMailingAddressPrefecture();
  validateUDMailingAddressCity();
  validateUDMailingAddressStreet();
  validateUDMailingAddressAddress();
});

$("#UDMailingAddressName").on("focusout change", function () {
  // 全角に変更
  toZenkaku($(this));

  showValidateResultToScreen(
    applyFormInfo.UDMailingAddressName,
    validateUDMailingAddressName()
  );
});

$("#UDMailingAddressNameKana").focusout(() => {
  showValidateResultToScreen(
    applyFormInfo.UDMailingAddressNameKana,
    validateUDMailingAddressNameKana()
  );
});

$(".UDMailingAddressPostalCode.textboxes").on(
  "focusout change",
  "[id^='UDMailingAddressPostalCode_']",
  function () {
    // フォーカスアウト処理
    postalCodeFocusoutHandler($(this));

    // 郵便番号変更の処理
    postalCodeChangeHandler("UDMailingAddress", applyFormInfo);
  }
);

$(".UDMailingAddressPostalCode.textboxes").on(
  "keyup",
  "[id^='UDMailingAddressPostalCode_']",
  function () {
    // 数字チェック
    validateNumber($(this), "UDMailingAddressPostalCode", "郵便番号");

    // 自動フォーカス
    subTextboxAutoFocusHanlder($(this), $("#UDMailingAddressCity"));

    // 郵便番号変更の処理
    postalCodeChangeHandler("UDMailingAddress", applyFormInfo);
  }
);

$("#UDMailingAddressPrefectureDropdown").change(function () {
  $("#UDMailingAddressPrefectureName").val(
    $(this).children("option:selected").text()
  );
  $("#UDMailingAddressPrefecture").val($(this).val()).change();
});

$("#UDMailingAddressPrefecture").change(function () {
  showValidateResultToScreen(
    applyFormInfo.UDMailingAddressPrefecture,
    validateUDMailingAddressPrefecture()
  );
});

// 利用明細の郵送先住所、フォーカスアウト時
$("#UDMailingAddressCity").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.UDMailingAddressCity,
    validateUDMailingAddressCity()
  );
});

// 利用明細の郵送先住所、フォーカスアウト時
$("#UDMailingAddressStreet").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.UDMailingAddressStreet,
    validateUDMailingAddressStreet()
  );
});

// 利用明細の郵送先住所、フォーカスアウト時
$("#UDMailingAddressAddress").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.UDMailingAddressAddress,
    validateUDMailingAddressAddress()
  );
});

$("input[name=nomuSilicaMailingAddress]").on("change", function () {
  toggleNomuSilicaMailingAddress();

  showValidateResultToScreen(
    applyFormInfo.nomuSilicaMailingAddress,
    validateNomuSilicaMailingAddress()
  );
  validateNSMailingAddressName();
  validateNSMailingAddressNameKana();
  validateNomusilicaPhoneLandline();
  validateNomusilicaPhoneLandline1();
  validateNomusilicaPhoneLandline2();
  validateNomusilicaPhoneLandline3();
  validateNomusilicaPhoneMobile();
  validateNomusilicaPhoneMobile1();
  validateNomusilicaPhoneMobile2();
  validateNomusilicaPhoneMobile3();
  validateNSMailingAddressPostalCode();
  validateNSMailingAddressPrefecture();
  validateNSMailingAddressCity();
  validateNSMailingAddressStreet();
  validateNSMailingAddressAddress();
});

$("#NSMailingAddressName").on("focusout change", function () {
  // 全角に変更
  toZenkaku($(this));

  showValidateResultToScreen(
    applyFormInfo.NSMailingAddressName,
    validateNSMailingAddressName()
  );
});

$("#NSMailingAddressNameKana").focusout(() => {
  showValidateResultToScreen(
    applyFormInfo.NSMailingAddressNameKana,
    validateNSMailingAddressNameKana()
  );
});

$("input[name=nomusilicaPhoneType]").change(() => {
  // 固定電話と携帯電話を切り替える
  togglePhoneType("nomusilicaPhone");
  validateNomusilicaPhoneLandline1();
  validateNomusilicaPhoneLandline2();
  validateNomusilicaPhoneLandline3();
  validateNomusilicaPhoneMobile1();
  validateNomusilicaPhoneMobile2();
  validateNomusilicaPhoneMobile3();
  showValidateResultToScreen(
    applyFormInfo.nomusilicaPhoneType,
    validateNomusilicaPhoneType()
  );
});

$("#nomusilicaPhoneLandline").on("change", function () {
  // 数字チェック
  validateNumber($(this), "nomusilicaPhoneLandline", "固定電話");

  validateNomusilicaPhoneLandline();
});

$(".nomusilicaPhoneLandline.textboxes").on(
  "keyup",
  "[id^='nomusilicaPhoneLandline_']",
  function () {
    // 数字チェック
    validateNumber($(this), "nomusilicaPhoneLandline", "固定電話");

    subTextboxAutoFocusHanlder(
      $(this),
      $("input[name=nomusilicaContractorLocationRelationship]")
    );
  }
);

let nomusilicaPhoneLandlineErrMsg = [];
$(".nomusilicaPhoneLandline.textboxes").on(
  "focusout",
  "[id^='nomusilicaPhoneLandline_']",
  function () {
    // 数字チェック
    validateNumber($(this), "nomusilicaPhoneLandline", "固定電話");

    let subId = $(this).attr("id");
    let validateFuncName = "validate" + subId[0].toUpperCase() + subId.slice(1);
    validateFuncName = validateFuncName.replace("_", "");

    // 現在のテキストボックスのバリデーションチェック
    let subResult = eval(validateFuncName)();
    if (subResult !== undefined) {
      subTextboxFailHandler(subResult, subId, nomusilicaPhoneLandlineErrMsg);
    } else {
      nomusilicaPhoneLandlineErrMsg = subTextboxSuccessHandler(
        subId,
        nomusilicaPhoneLandlineErrMsg
      );
    }

    // のむシリカ配送先固定電話番号の設定
    let nomusilicaPhoneLandline = "";
    for (let i = 1; i <= 3; i++) {
      nomusilicaPhoneLandline += $(`#nomusilicaPhoneLandline_${i}`).val();
    }
    $("#nomusilicaPhoneLandline").val(nomusilicaPhoneLandline).change();

    // のむシリカ配送先固定電話番号のバリデーション
    if (
      validateNomusilicaPhoneLandline1() === undefined &&
      validateNomusilicaPhoneLandline2() === undefined &&
      validateNomusilicaPhoneLandline3() === undefined &&
      validateNomusilicaPhoneLandline() === undefined
    ) {
      showValidateSuccess("nomusilicaPhoneLandline");
    }
  }
);

$("#nomusilicaPhoneMobile").on("change", function () {
  // 数字チェック
  validateNumber($(this), "nomusilicaPhoneMobile", "携帯電話");

  validateNomusilicaPhoneMobile();
});

$(".nomusilicaPhoneMobile.textboxes").on(
  "keyup",
  "[id^='nomusilicaPhoneMobile_']",
  function () {
    // 数字チェック
    validateNumber($(this), "nomusilicaPhoneMobile", "携帯電話");

    subTextboxAutoFocusHanlder(
      $(this),
      $("input[name=nomusilicaContractorLocationRelationship]")
    );
  }
);

let nomusilicaPhoneMobileErrMsg = [];
$(".nomusilicaPhoneMobile.textboxes").on(
  "focusout",
  "[id^='nomusilicaPhoneMobile_']",
  function () {
    // 数字チェック
    validateNumber($(this), "nomusilicaPhoneMobile", "携帯電話");

    let subId = $(this).attr("id");
    let validateFuncName = "validate" + subId[0].toUpperCase() + subId.slice(1);
    validateFuncName = validateFuncName.replace("_", "");

    // 現在のテキストボックスのバリデーションチェック
    let subResult = eval(validateFuncName)();
    if (subResult !== undefined) {
      subTextboxFailHandler(subResult, subId, nomusilicaPhoneMobileErrMsg);
    } else {
      nomusilicaPhoneMobileErrMsg = subTextboxSuccessHandler(
        subId,
        nomusilicaPhoneMobileErrMsg
      );
    }

    // のむシリカ配送先携帯電話番号の設定
    let nomusilicaPhoneMobileValue = "";
    for (let i = 1; i <= 3; i++) {
      nomusilicaPhoneMobileValue += $(`#nomusilicaPhoneMobile_${i}`).val();
    }
    $("#nomusilicaPhoneMobile").val(nomusilicaPhoneMobileValue).change();

    // のむシリカ配送先携帯電話番号のバリデーション
    if (
      validateNomusilicaPhoneMobile1() === undefined &&
      validateNomusilicaPhoneMobile2() === undefined &&
      validateNomusilicaPhoneMobile3() === undefined &&
      validateNomusilicaPhoneMobile() === undefined
    ) {
      showValidateSuccess("nomusilicaPhoneMobile");
    }
  }
);

$(".NSMailingAddressPostalCode.textboxes").on(
  "focusout change",
  "[id^='NSMailingAddressPostalCode_']",
  function () {
    // フォーカスアウト処理
    postalCodeFocusoutHandler($(this));

    // 郵便番号変更の処理
    postalCodeChangeHandler("NSMailingAddress", applyFormInfo);
  }
);

$(".NSMailingAddressPostalCode.textboxes").on(
  "keyup",
  "[id^='NSMailingAddressPostalCode_']",
  function () {
    // 数字チェック
    validateNumber($(this), "NSMailingAddressPostalCode", "郵便番号");

    // 自動フォーカス
    subTextboxAutoFocusHanlder($(this), $("#NSMailingAddressCity"));

    // 郵便番号変更の処理
    postalCodeChangeHandler("NSMailingAddress", applyFormInfo);
  }
);

$("#NSMailingAddressPrefectureDropdown").change(function () {
  $("#NSMailingAddressPrefectureName").val(
    $(this).children("option:selected").text()
  );
  $("#NSMailingAddressPrefecture").val($(this).val()).change();
});

$("#NSMailingAddressPrefecture").change(function () {
  showValidateResultToScreen(
    applyFormInfo.NSMailingAddressPrefecture,
    validateNSMailingAddressPrefecture()
  );
});

// のむシリカの郵送先住所、フォーカスアウト時
$("#NSMailingAddressCity").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.NSMailingAddressCity,
    validateNSMailingAddressCity()
  );
});

// のむシリカの郵送先住所、フォーカスアウト時
$("#NSMailingAddressStreet").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.NSMailingAddressStreet,
    validateNSMailingAddressStreet()
  );
});

// のむシリカの郵送先住所、フォーカスアウト時
$("#NSMailingAddressAddress").on("focusout change", function () {
  // 全角に変更
  toZenkakuForAddress($(this));

  showValidateResultToScreen(
    applyFormInfo.NSMailingAddressAddress,
    validateNSMailingAddressAddress()
  );
});

$("#whereDidYouKnow").on("change", function () {
  // どこで知ったか_その他の表示
  toggleWhereDidYouKnowOther();

  showValidateResultToScreen(
    applyFormInfo.whereDidYouKnow,
    validateWhereDidYouKnow()
  );
});

$("#whereDidYouKnowOther").on("focusout, change", function () {
  showValidateResultToScreen(
    applyFormInfo.whereDidYouKnowOther,
    validateWhereDidYouKnowOther()
  );
});

$("#notes").on("focusout", function () {
  showValidateResultToScreen(applyFormInfo.notes, validateNotes());
});

function checkArea(postalCode, postalCodeType) {
  let url = "/api/check_area";
  let headers = {};
  headers["X-CSRF-Token"] = $('input[name="_csrf"]').val();

  return $.ajax({
    url,
    type: "POST",
    dataType: "json",
    data: {
      postalCode: postalCode
    },
    headers
  }).then((res) => {
     // 失敗のメッセージを表示/非表示
    if (res.result) {
      showValidateError("usageLocationPostalCode", "電力供給対象外地域のため、お申し込みできません。");
      validateResults[postalCodeType] = false;
    } else {
      hideValidateError("usageLocationPostalCode");
      validateResults[postalCodeType] = true;
    }
    checkValidateResults();
  });
}

function showEstimeMessage(){
  let contTypeCd = $("#contractTypeCode").val();
  let mainElectricCompanyCode = $("#mainElectricCompanyDropdown").val();
  if (mainElectricCompanyCode == OTHER_ELECTRIC_COMPANY_CODE) {
    if (contTypeCd == OTHER_PLAN) {
      $("#estimeMessage")
      .text(`ご希望の場合は、お問い合わせより試算をご依頼ください`)
      .prop("hidden", false);
    } else {
      $("#estimeMessage")
      .prop("hidden", true);
    }
  } else {
    if (contTypeCd == OTHER_PLAN) {
      $("#estimeMessage")
      .text(`必ずお得になるとは限りません。お問い合わせより試算をご依頼ください`)
      .prop("hidden", false);
    } else {
      $("#estimeMessage")
      .prop("hidden", true);
    }
  }
}

function checkShijo() {
  if (siteName == SITE_NAME_SHIJO) {
    changePricePlanDropdown();
  } else {
    showEstimeMessage();
  }
}

function showDifferentPlanMessage() {
  let contTypeCd = $("#contractTypeCode").val();
  let compatiblePlanCd = $("#compatiblePlanCode").val();
  let mainElectricCompanyCd = $("#mainElectricCompanyDropdown").val();
  if (contTypeCd && compatiblePlanCd) {
    if (contTypeCd != compatiblePlanCd && contTypeCd != OTHER_PLAN) {
      if (mainElectricCompanyCd == OTHER_ELECTRIC_COMPANY_CODE) {
        $("#differentPlanMessage")
          .text(`ご希望の場合は、お問い合わせより試算をご依頼ください`)
          .prop("hidden", false);
      } else {
        $("#differentPlanMessage")
          .text(`必ずお得になるとは限りません。お問い合わせより試算をご依頼ください`)
          .prop("hidden", false);
      }
    } else {
      $("#differentPlanMessage")
      .prop("hidden", true);
    }
  } else {
    $("#differentPlanMessage")
    .prop("hidden", true);
  }
}

function checkApplicationPowerCapacity() {
  return new Promise(resolve => {
    let powerCapacity = $("#powerCapacity").val();
    let contTypeCd = $("#contractTypeCode").val();
    let pricePlanCd = $("#pricePlanCode").val();
    if(contTypeCd && pricePlanCd && powerCapacity) {
      checkCapacity({
        powerCapacity,
        pricePlanCd,
        csrfToken: $('input[name="_csrf"]').val()
      }).then((res) => {
        let result = res.result;
        let message = res.message;
        if (result) {
          // お申込み契約容量・メッセージの表示/非表示
          $("#application-contractCapacity-container").prop("hidden", false);
          $("#applicationCapacityFlag").val(FLAG_ON);
          $("#applicationPowerCapacity").text($("#contractCapacityText").val());
          $(".contractCapacityCodeMessage.error.client").prop("hidden", true);
          resolve(FLAG_ON);
        } else {
          $('.contractCapacityCodeMessage.error.client').text(message).prop('hidden', false);
          $("#application-contractCapacity-container").prop("hidden", true);
          $("#applicationCapacityFlag").val(FLAG_OFF);
          resolve(FLAG_OFF);
        }
      });
    } else {
      resolve(FLAG_OFF);
    }
  })
}

function applicationCapacityContainer(){
  let contTypeCd = $("#contractTypeCode").val();
  let powerCapacity = $("#powerCapacity").val();
  let pricePlanCd = $("#pricePlanCode").val();
  let contCapaFlag = $("#contractCapacityFlag").val();

  if (powerCapacity && pricePlanCd) {
    //エラーメッセージ表示チェック
    if (contCapaFlag == FLAG_ON) {
      //エラーメッセージがない場合
      let selectedPlan = planJson.filter((e) => e.planCode == pricePlanCd);
      //お申込み契約種別が「実量契約」の場合
      if (selectedPlan[0].smartContractCode == FLAG_ON) {
        $("#application-contractCapacity-container").prop("hidden", true);
        $("#applicationCapacityFlag").val(FLAG_OFF);
      } else {
        //契約種別が「実量契約」ではない or その他又は不明でお申込み契約種別が実量ではない場合
        $("#application-contractCapacity-container").prop("hidden", false);
        $("#applicationCapacityFlag").val(FLAG_ON);
        $("#applicationPowerCapacity").text($("#contractCapacityText").val());
      }
    } else {
      //エラーメッセージがある場合
      $("#application-contractCapacity-container").prop("hidden", true);
      $("#applicationCapacityFlag").val(FLAG_OFF);
    }
  } else if (!powerCapacity || !pricePlanCd) {
    $(".contractCapacityCodeMessage.error.client").prop("hidden", true);
    $("#application-contractCapacity-container").prop("hidden", true);
    $("#applicationCapacityFlag").val(FLAG_OFF);
  }
}