'use strict'

//------------------------------------------------------------------------------
// 共通JavaScript
// @(#)commonUtil.js
//
// 変更履歴: 1.0.0<09/27/20>[GC0002]新規作成
//         1.0.1<21/01/14>[UI0022] UI刷新対応
//         1.0.2<21/01/16>[UI0027] UI刷新対応
//         1.0.3<21/01/26>[UI0027] UI刷新対応
//         1.0.4<21/02/18>[UN0010] 課題256対応
//         1.0.5<21/02/24>[UI0082] UI刷新対応
//         1.0.6<21/03/05>[UN0010] UI刷新対応 課題296対応   
//         1.0.7<21/03/08>[UI0027] UI刷新対応（キーボード操作時のチェックボックスでイベントが起動しない）
//         1.0.8<21/03/14>[UI0027] UI刷新対応（PMWB-1832：画面デザインを適用した様式のスクロールについて）
//         1.0.9<21/03/17>[UN0010] UI刷新対応(課題No315対応)
//         1.0.10<21/03/22>[UI0027] UI刷新対応（Excelレイアウトの「配色を変更する」ボタンの不具合対応）
//         1.0.11<21/04/27>[UN0010] UI刷新対応 (PMWB2052対応)
//         1.0.12<21/05/25>[UI0081] ボタン二度押し防止対応（性能影響大の処理）
//         1.0.13<21/07/26>[UI0165] 2021年度上期対応(項目「位置情報」追加)
//         1.0.14<23/11/08>[U-IP0167] A-0009-IP
//------------------------------------------------------------------------------
var commonUtil = commonUtil || {};

commonUtil = {
    initColor: function(colorStr, urlPath) {
        if (!urlPath) {
            urlPath = '..';
        }
/*Delete Start 2021/03/17[UN0010] UI刷新対応(課題No315対応)*/
        /*document.write("<link href='"+ urlPath +"/common/css/common_"+ commonUtil.colorSwitchFull(colorStr) +".css?ver=1.0' rel='stylesheet' type='text/css' id='changeColorCss'>");
        document.write("<link href='"+ urlPath +"/common/css/style.css?ver=1.0' rel='stylesheet' type='text/css'>");
        document.write("<link href='"+ urlPath +"/common/css/style_"+ commonUtil.colorSwitchFull(colorStr) +".css?ver=1.0' rel='stylesheet' type='text/css' id='changeStyleColorCss'>");*/
/*Delete End   2021/03/17[UN0010] UI刷新対応(課題No315対応)*/
//##### Add Start 2021/01/16 [UI0027] UI刷新対応
//##### Delete Start 2021/03/22 [UI0027] UI刷新対応（Excelレイアウトの「配色を変更する」ボタンの不具合対応）
// 実装方法が変わったため、不要となった
/*
        // 旧デザインの色設定
        commonUtil.initOldDesignColor(colorStr);
*/
//##### Delete End   2021/03/22 [UI0027] UI刷新対応（Excelレイアウトの「配色を変更する」ボタンの不具合対応）
//##### Add End   2021/01/16 [UI0027] UI刷新対応
    },
    colorSwitchFull: function(color) {
        if(color ==='title') {
            color = document.getElementById("initColor").title;
        }
        if(color ==='b') {
            color = 'blue';
        } else if(color ==='g') {
            color = 'green';
        }  else if(color ==='o') {
            color = 'orange';
        }  else if(color ==='p') {
            color = 'purple';
        }  else if(color ==='y') {
            color = 'yellow';
        }  else if(color ==='bl') {
            color = 'black';
        } 
        return color;
    },
    changeColorCss:function (colorStr) {
        // cookieにカラーを設定 ブラウザを閉める時、cookieを削除する。
//##### Update Start 2021/01/26 [UI0027] UI刷新対応
//      Cookies.set('cookieColorCss', colorStr);
//##### Update Start 2022/07/01 [UI0050] 脆弱性診断対応_cookie
//      Cookies.set('cookieColorCss', colorStr, { expires: COOKIE_SAVE_DAYS });
        setCookieProperties('cookieColorCss', colorStr);
//##### Update End   2022/07/01 [UI0050] 脆弱性診断対応_cookie
//##### Update End   2021/01/26 [UI0027] UI刷新対応
        const cssObj = document.getElementById("changeColorCss");
        const cssStyleObj = document.getElementById("changeStyleColorCss");
        if(colorStr === '') {
            //##### Update Start 2021/02/18 [UN0010] 課題256対応
            /*if(cssObj)cssObj.href="../common/css/common"+colorStr+".css?ver=1.00";
            if(cssStyleObj)cssStyleObj.href="../common/css/style"+colorStr+".css?ver=1.00";*/
//##### Add Start 2021/03/05 [UN0010] UI刷新対応 課題296対応
            if(window.ActiveXObject||"ActiveXObject" in window){
                if(cssObj)cssObj.href="../resources/common/css/common"+colorStr+".css?ver=1.00";
                if(cssStyleObj)cssStyleObj.href="../resources/common/css/style"+colorStr+".css?ver=1.00"
            }else{
//##### Add End 2021/03/05 [UN0010] UI刷新対応 課題296対応
                if(cssObj){
                    var linkStr = "<link href='../resources/common/css/common_"+colorStr+".css?ver=1.00' rel='stylesheet' type='text/css' id='changeColorCss_Temp'>";
//##### Update Start 2021/02/18 [UN0010] PWMB1951対応                   
                    $("#changeColorCss").after(linkStr);
                    $("#changeColorCss").attr("id","");
                    $("#changeColorCss_Temp").attr("id","changeColorCss");
                    /*setTimeout(function(){
                        $("#changeColorCss").remove();
                    },200);
                    $("#changeColorCss_Temp").attr("id","changeColorCss");*/
//##### Update End   2021/02/18 [UN0010] PWMB1951対応
                }
                if(cssStyleObj){
                    var linkStr = "<link href='../resources/common/css/style_"+colorStr+".css?ver=1.00' rel='stylesheet' type='text/css' id='changeStyleColorCss_Temp'>"
//##### Update Start 2021/02/18 [UN0010] PWMB1951対応
                    $("#changeStyleColorCss").after(linkStr);
                    $("#changeStyleColorCss").attr("id","");
                    $("#changeStyleColorCss_Temp").attr("id","changeStyleColorCss");
                    /*setTimeout(function(){
                        $("#changeStyleColorCss").remove();
                    },200);
                    $("#changeStyleColorCss_Temp").attr("id","changeStyleColorCss")*/;
//##### Update End   2021/02/18 [UN0010] PWMB1951対応
                }
            } //##### Add 2021/03/05 [UN0010] UI刷新対応 課題296対応
            //##### Update End 2021/02/18 [UN0010] 課題256対応
        } else if(colorStr === 'title') {
            // 「標準」ボタンをクリックの場合
            commonUtil.changeColorByTitle(colorStr);
        } else {
            // 「標準」以外のボタンをクリックの場合
            //##### Update Start 2021/02/18 [UN0010] 課題256対応
            /*if(cssObj)cssObj.href="../common/css/common_"+colorStr+".css?ver=1.00";
            if(cssStyleObj)cssStyleObj.href="../common/css/style_"+colorStr+".css?ver=1.00";*/
//##### Add Start 2021/03/05 [UN0010] UI刷新対応 課題296対応
            if(window.ActiveXObject||"ActiveXObject" in window){
                if(cssObj)cssObj.href="../resources/common/css/common_"+colorStr+".css?ver=1.00";
                if(cssStyleObj)cssStyleObj.href="../resources/common/css/style_"+colorStr+".css?ver=1.00";
            }else{
//##### Add End 2021/03/05 [UN0010] UI刷新対応 課題296対応
            if(cssObj){
                var linkStr = "<link href='../resources/common/css/common_"+colorStr+".css?ver=1.00' rel='stylesheet' type='text/css' id='changeColorCss_Temp'>";
                $("#changeColorCss").after(linkStr);
                $("#changeColorCss").attr("id","");
                $("#changeColorCss_Temp").attr("id","changeColorCss");
                /*setTimeout(function(){
                    $("#changeColorCss").remove();
                },200);
                $("#changeColorCss_Temp").attr("id","changeColorCss");*/
            }
            if(cssStyleObj){
                var linkStr = "<link href='../resources/common/css/style_"+colorStr+".css?ver=1.00' rel='stylesheet' type='text/css' id='changeStyleColorCss_Temp'>"
                $("#changeStyleColorCss").after(linkStr);
                $("#changeStyleColorCss").attr("id","");
                $("#changeStyleColorCss_Temp").attr("id","changeStyleColorCss");
                /*setTimeout(function(){
                    $("#changeStyleColorCss").remove();
                },200);
                $("#changeStyleColorCss_Temp").attr("id","changeStyleColorCss");*/
                
                }
            } //##### Add End 2021/03/05 [UN0010] UI刷新対応 課題296対応
            //##### Update End 2021/02/18 [UN0010] 課題256対応
        }
//##### Add Start 2021/01/16 [UI0027] UI刷新対応
        // 旧デザインの色変更
        commonUtil.changeOldDesignColor(colorStr);
//##### Add End   2021/01/16 [UI0027] UI刷新対応
        return false;
    },
    changeColorByTitle:function(colorCssTitle, urlPath) {
        if (!urlPath) {
            urlPath = '..';
        }
        const cssObj = document.getElementById("changeColorCss");
        const cssStyleObj = document.getElementById("changeStyleColorCss");
//##### Update Start 2021/02/18 [UN0010] 課題256対応
        /*if(cssObj)cssObj.href= urlPath + "/common/css/common_" + commonUtil.colorSwitchFull(colorCssTitle) + ".css?ver=1.00";
        if(cssStyleObj)cssStyleObj.href=urlPath + "/common/css/style_" + commonUtil.colorSwitchFull(colorCssTitle) + ".css?ver=1.00";*/
//##### Add Start 2021/03/05 [UN0010] UI刷新対応 課題296対応        
        if(window.ActiveXObject||"ActiveXObject" in window){
            if(cssObj)cssObj.href= urlPath + "/resources/common/css/common_" + commonUtil.colorSwitchFull(colorCssTitle) + ".css?ver=1.00";
            if(cssStyleObj)cssStyleObj.href=urlPath + "/resources/common/css/style_" + commonUtil.colorSwitchFull(colorCssTitle) + ".css?ver=1.00";
        }else{
//##### Add End   2021/03/05 [UN0010] UI刷新対応 課題296対応
        if(cssObj){
            var linkStr = "<link href='../resources/common/css/common_"+commonUtil.colorSwitchFull(colorCssTitle)+".css?ver=1.00' rel='stylesheet' type='text/css' id='changeColorCss_Temp'>";
//##### Update Start 2021/02/18 [UN0010] PWMB1951対応
            $("#changeColorCss").after(linkStr);
            $("#changeColorCss").attr("id","");
            $("#changeColorCss_Temp").attr("id","changeColorCss");
            /*setTimeout(function(){
                $("#changeColorCss").remove();
            },200);
            $("#changeColorCss_Temp").attr("id","changeColorCss");*/
//##### Update End   2021/02/18 [UN0010] PWMB1951対応
        }
        if(cssStyleObj){
            var linkStr = "<link href='../resources/common/css/style_"+commonUtil.colorSwitchFull(colorCssTitle)+".css?ver=1.00' rel='stylesheet' type='text/css' id='changeStyleColorCss_Temp'>"
//##### Update Start 2021/02/18 [UN0010] PWMB1951対応           
            $("#changeStyleColorCss").after(linkStr);
            $("#changeStyleColorCss").attr("id","");
            $("#changeStyleColorCss_Temp").attr("id","changeStyleColorCss");
            /*setTimeout(function(){
                $("#changeStyleColorCss").remove();
            },200);
            $("#changeStyleColorCss_Temp").attr("id","changeStyleColorCss");*/
//##### Update End   2021/02/18 [UN0010] PWMB1951対応
            }
        }
//##### Update End   2021/02/18 [UN0010] 課題256対応
    },
    scrollToId: function(scrollUrl, scrollTopId) {
        let client_h = 0;
        if (window.matchMedia( "(max-width: 960px)" ).matches) {
            if(document.getElementById('js-header')) {
                client_h = document.getElementById('js-header').clientHeight;
            }
        }
        const url = window.location.toString();
        if(url.indexOf(scrollUrl) > -1 || scrollUrl.indexOf('scrollClick') > -1) {
            if(typeof($('#'+ scrollTopId).offset()) !== "undefined") {
                if(navigator.userAgent.indexOf("Firefox") >= 0) {
                    $(document).scrollTop($('#'+ scrollTopId).offset().top - client_h);
                } else {
                    $(window).scrollTop($('#'+ scrollTopId).offset().top - client_h);
                }
                
            }
        }
    },
    buttonClick: function(switchButtonId) {
        $('#controlLink_'+switchButtonId).toggleClass("active");
        if ($('#controlLink_'+switchButtonId).html() === "開く") {
            $('#controlLink_'+switchButtonId).html("閉じる");
            $("dd[id^='controlDiv_"+switchButtonId+"']").each(function(){
                $(this).show();
            });
        }else{
            $('#controlLink_'+switchButtonId).html("開く");
            $("dd[id^='controlDiv_"+switchButtonId+"']").each(function(){
                $(this).hide();
            });
        }
        return;
    },
    redirectUrl: function(urlId) {
        $('#'+urlId).click();
        return false;
    },
    showHideDiv: function(objId){
        objId = objId.replace('Div','');
        const obj = $('#'+objId);
        if(obj.hasClass('hide')){
            obj.removeClass('hide');
        } else {
            obj.addClass('hide');
        }
        return false;
    },
    pageJump: function(objId, event){
        if(event.which == 13) {
            document.getElementById(objId).click();
        }
        event.stopPropagation();
        return false;
    },
    eventStop: function(event){
        event.stopPropagation();
        return false;
    },
    changeBackColor: function(obj, currentFlag) {
        if(currentFlag === 'current'){
            if($(obj).hasClass('blurbackground')){
                $(obj).removeClass('blurbackground');
            } else {
                $(obj).addClass('blurbackground');
            }
        } else if(currentFlag === 'parent'){
            if($(obj).parent().hasClass('blurbackground')){
                $(obj).parent().removeClass('blurbackground');
            } else {
                $(obj).parent().addClass('blurbackground');
            }
        } else if(currentFlag === 'children'){
            if($(obj).children().hasClass('blurbackground')){
                $(obj).children().removeClass('blurbackground');
            } else {
                $(obj).children().addClass('blurbackground');
            }
        }
        
    },
//##### Add Start 2021/02/24 [UI0082] UI刷新対応
    radioFocusAndSelect: function() {
        
        // カスタム画面項目「申請者」のラジオボタンの初期値を設定
        $(function() {
            const $radioCovers = $('.checkCover');
            $radioCovers.each(function(_, radioCover){
                const $radioCover = $(radioCover);
                const $radioElem = $radioCover.find('label:first input[type="radio"]')
                if ($radioElem.is(':checked')) {
                    $radioElem.click();
                    $radioCover.addClass('checked');
                }
            });
        });

        // ラジオボタンパーツにフォーカスが当たった場合クラス名「onfocus」を追加する。
        $(".radio-parts").parent('.checkCover').focus(function(e){
            $(e.target).addClass('onfocus');
        });
        
        // ラジオボタンからフォーカスが外れた場合クラス名「onfocus」を削除する。
        $(".radio-parts").parent('.checkCover').blur(function(e){
            $(e.target).removeClass('onfocus');
        });

        // ラジオボタンが選択された場合の処理
        const afterFocusEvent = function(e) {
            if ($(e.target).hasClass('onfocus') || $(e.target).parent().hasClass('onfocus')) {
                // 選択されたラジオパーツの取得
                const $focusingElem = $(e.target).hasClass('onfocus') ? $(e.target) : $(e.target).parent();
                const $targetRadioElem = $focusingElem.find('label:first input[type="radio"]')
                
                $targetRadioElem.click();
                $focusingElem.addClass('checked');
                // 選択したラジオボタンのid属性とname属性を取得
                const clickedId = $targetRadioElem.attr('id');
                const searchName = $targetRadioElem.attr('name');
                $('input[name="' + searchName + '"]').each(function(_, otherRadio) {
                    // 選択したラジオボタンとは別のボタンにチェックがあれば外す
                    if ($(otherRadio).attr('id') !== clickedId) {
                        $(otherRadio).parent('label').parent('.checkCover').removeClass('checked')
                    }
                });
            }
        };
        
        // ラジオパーツがクリックされた場合
        $(".radio-parts").parent('.checkCover').click(function(e) {
            afterFocusEvent(e);
        });

        // ラジオパーツをフォーカス後にキーボードが押下された場合
        $(".radio-parts").parent('.checkCover').keypress(function(e) {
            if(e.which == 32) {
                // スペースキー押下時のみイベント起動
                afterFocusEvent(e);
            }
        });
    },
//##### Add End   2021/02/24 [UI0082] UI刷新対応
    radioAndCheckbox: function() {
        // radioのtabindexを追加
        $(".radio-parts").parent().attr('tabindex','0');
        $(".radio-parts").parent().addClass('radio-outline');
        // checkboxのtabindexを追加
        $(".checkbox-parts").parent().attr('tabindex','0');
        $(".checkbox-parts").parent().addClass('radio-outline');
        
//##### Add Start 2021/02/24 [UI0082] UI刷新対応
        // ラジオパーツのフォーカス時、選択時の処理
        this.radioFocusAndSelect();
//##### Add End   2021/02/24 [UI0082] UI刷新対応
        // radioのcheckを追加
        $(".radio-parts").parent().keypress(function(e){
            if(e.which == 32) {
                var radioObj = $(this).children('input[type="radio"]');
//##### Update Start 2021/04/29[UN0010]UI刷新対応 (PMWB2052対応)
                /*if (!radioObj.is(':checked')) {
                radioObj.prop('checked', true);
                }*/
                if (!radioObj.is(':checked')) {
                    if (!radioObj.prop('disabled')) {
                        radioObj.prop('checked', true);
//##### Add Start 2023/01/08 [U-IP0167] A-0009-IP
                        radioObj.trigger('change');
//##### Add End   2023/01/08 [U-IP0167] A-0009-IP
                        radioObj.click();
                    }
                }
//##### Update End   2021/04/29[UN0010]UI刷新対応 (PMWB2052対応)
//##### Add Start 2021/01/20 [UI0082] UI刷新対応
//##### Delete Start 2021/04/29[UN0010]UI刷新対応 (ソース位置調整 PMWB2052対応)
                /*radioObj.click();*/
//##### Delete End   2021/04/29[UN0010]UI刷新対応 (ソース位置調整 PMWB2052対応)       
//##### Add End   2021/01/20 [UI0082] UI刷新対応
                return false;
            } else if(e.which == 13) {
                let parentTag = $(this)[0].parentNode;
                while(parentTag.tagName.toLowerCase() !== 'form') {
                    parentTag = parentTag.parentNode;
                }
                if(parentTag) {
                    for(var i = 0;i < parentTag.length; i++) {
                        if(parentTag[i].type === 'submit') {
                            if(!(window.ActiveXObject || "ActiveXObject" in window)){
                                $(parentTag[i]).click();
                                break;
                            }
                        }
                        if(parentTag[i].type === 'button') {
                            if($(parentTag[i]).parent().hasClass('c-btn--submit')){
                                $(parentTag[i]).click();
                                break;
                            }
                        }
                    }
                }
            }
        })
        
        // checkboxのcheckを追加
        $(".checkbox-parts").parent().keypress(function(e){
            if(e.which == 32) {
                var radioObj = $(this).children('input[type="checkbox"]');
//##### Update Start 2021/03/08 [UI0027] UI刷新対応（キーボード操作時のチェックボックスでイベントが起動しない）
/*
                if (radioObj.is(':checked')) {
                    radioObj.prop('checked', false);
                } else {
                    radioObj.prop('checked', true);
                }
*/
                radioObj.parent().click();
//##### Update End   2021/03/08 [UI0027] UI刷新対応（キーボード操作時のチェックボックスでイベントが起動しない）
                return false;
            } else if(e.which == 13) {
                let parentTag = $(this)[0].parentNode;
                while(parentTag.tagName.toLowerCase() !== 'form') {
                    parentTag = parentTag.parentNode;
                }
                if(parentTag) {
                    for(var i = 0;i < parentTag.length; i++) {
                        if(parentTag[i].type === 'submit') {
                            if(!(window.ActiveXObject || "ActiveXObject" in window)){
                                $(parentTag[i]).click();
                                break;
                            }
                        }
                        if(parentTag[i].type === 'button') {
                            if($(parentTag[i]).parent().hasClass('c-btn--submit')){
                                $(parentTag[i]).click();
                                break;
                            }
                        }
                    }
                }
            }
        })
//##### Add Start 2023/01/08 [U-IP0167] A-0009-IP

      /* セレクター内の特殊文字をエスケープする */
      const escapeSelector = (str) => {
        return str.replace(/[ !"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
      }

      /* 引数の要素よりも上位にあたり、かつ指定したクエリの直近の親である要素を検索するメソッド */
      const findRadioCheckboxParent = ($elm, targetQuery) => {
        const $parent = $elm.parent();
        if ($parent.length == 0) return $parent;
        const $targetElm = $parent.children(targetQuery);
        return $targetElm.length > 0 ? $parent : findRadioCheckboxParent($parent);
      }

      /**
      * 初期処理（チェックボックス）
      * 読み上げ用の属性（role）と読み上げ用チェック状態（aria-checked）を設定
      */
      $(".checkbox-parts")
        .parent()
        .each(function () {
          const $checkbox = $(this).find("input[type='checkbox']");
          if ($checkbox.length > 0) {
            const isChecked = $checkbox.is(":checked");
            $(this)
              .attr("role", "checkbox")
              .attr("aria-checked", isChecked ? "true" : "false");
          }
        });

      /**
      * 初期処理（ラジオ）
      * 読み上げ用の属性（role）と読み上げ用チェック状態（aria-checked）を設定
      */
      $(".radio-parts")
        .parent()
        .each(function () {
          const $radio = $(this).find("input[type='radio']");
          if ($radio.length > 0) {
            const isChecked = $radio.is(":checked");
            $(this)
              .attr("role", "radio")
              .attr("aria-checked", isChecked ? "true" : "false");
          }
        });

      /**
      * チェックボックスON/OFF変更に伴う読み上げ値の変更処理
      */
      $(".checkbox-parts")
        .parent()
        .find("input[type='checkbox']")
        .on("change", (e) => {
          const $target = $(e.target);
          const isChecked = $target.is(":checked");
          const $inputParent = findRadioCheckboxParent($target, ".checkbox-parts");
          $inputParent.attr("aria-checked", isChecked ? "true" : "false");
        });

      /**
      * ラジオON/OFF変更に伴う読み上げ値の変更処理
      */
      $(".radio-parts")
        .parent()
        .find("input[type='radio']")
        .on("change", (e) => {
          const $target = $(e.target);
          const radioName = $target.attr("name");
          const selectorStr = `input[name='${escapeSelector(radioName)}']`;
          $(document).find(selectorStr).each((i, e) => {
            const isChecked = $(e).is(":checked");
            const $inputParent = findRadioCheckboxParent($(e), ".radio-parts");
            $inputParent.attr("aria-checked", isChecked ? "true": "false");
          });
        });
//##### Add End   2023/11/08 [U-IP0167] A-0009-IP
    },
    buttonTab: function() {
        $(".c-label--submit").attr('tabindex','0');
        $(".c-label--submit").addClass('button-outline');
        
        $(".c-label--submit").children('.c-label--btn').attr('tabindex', '-1');
        
        $(".c-label--submit").keypress(function(e){
            if(e.which == 13) {
                $(this).click();
                return false;
            }
        })
    }
//##### Add Start 2021/01/14 [UI0022] UI刷新対応
    ,buttonTabLarge: function() {
        $(".c-btn--submit--large").attr('tabindex','0');
        $(".c-btn--submit--large").addClass('button-outline');
        
        $(".c-btn--submit--large").children('.c-label--btn').attr('tabindex', '-1');
        
        $(".c-btn--submit--large").keypress(function(e){
            if(e.which == 13) {
                $(this).click();
                return false;
            }
        })
    }
//##### Add End   2021/01/14 [UI0022] UI刷新対応

//##### Add Start 2021/01/16 [UI0027] UI刷新対応
    /* 旧デザインの色の初期化 */
    , initOldDesignColor: function(color) {
        const oldDesignJsElem = document.getElementById('oldDesignCommonUtil');
        if (oldDesignJsElem) {
            oldDesignCommonUtil.initColor(color);
        }
    }
    
    /* 旧デザインの色の変更 */
    , changeOldDesignColor: function(color) {
        const oldDesignJsElem = document.getElementById('oldDesignCommonUtil');
        if (oldDesignJsElem) {
            oldDesignCommonUtil.changeColorCss(color);
        }
    }
//##### Add End   2021/01/16 [UI0027] UI刷新対応
}

var reserveTime = reserveTime || {};
var pcFlg = false;
var spFlg = false;
reserveTime = {
    bindWindowLoad: function() {
        if (window.matchMedia( "(max-width: 960px)" ).matches) {
            if(!spFlg) {
                spFlg = true;
                pcFlg = false;
                reserveTime.pcspSwitch('first');
            }
        } else {
            if(!pcFlg) {
                pcFlg = true;
                spFlg = false;
                $('div[id="sp_reserve"] table tbody tr td').each(function(){
                    var tdId = $(this).attr('id');
                    var tdIdArr = tdId.split('-');
                    if(tdIdArr[1]) {
                        $('#sp-' + tdIdArr[1]).removeClass('selected');
                    }
                });
            }
        }
    },
    bindWindowResize: function() {
        $(window).on('resize', function(){
            if (window.matchMedia( "(max-width: 960px)" ).matches) {
                if(!spFlg) {
                    spFlg = true;
                    pcFlg = false;
                    reserveTime.pcspSwitch('');
                }
            } else {
                if(!pcFlg) {
                    spFlg = false;
                    pcFlg = true;
                    reserveTime.pcspSwitch('');
                }
            }
        })
    },
    pcspSwitch: function(firstFlg) {
        var set = [];
        if(spFlg) {
            $('div[id="pc_reserve"] table tbody tr td').each(function(){
                var tdId = $(this).attr('id');
                var tdIdArr = tdId.split('-');
                if(tdIdArr[1]) {
                    $('#sp-' + tdIdArr[1]).html($(this).html());
                    $(this).html('');
                    if($(this).hasClass('selected')){
                        $(this).removeClass('selected');
                        $(this).addClass('enable');
                        if(firstFlg !== 'first') {
                            reserveTime.tdClick($('#sp-' + tdIdArr[1]));
                            var checkObj = $('#sp-' + tdIdArr[1]).children('input[type="checkbox"]');
                            if($('#sp-' + tdIdArr[1]).hasClass('selected')) {
                                checkObj.prop('checked',true);
                            }
                        }
                    }
                    $('#pc-' + tdIdArr[1]).removeClass('selected');
                }
            });
        }
        
        if(pcFlg) {
            $('div[id="sp_reserve"] table tbody tr td').each(function(){
                var tdId = $(this).attr('id');
                var tdIdArr = tdId.split('-');
                if(tdIdArr[1]) {
                    $('#pc-' + tdIdArr[1]).html($(this).html());
                    $(this).html('');
                    if($(this).hasClass('selected')){
                        $(this).removeClass('selected');
                        $(this).addClass('enable');
                        reserveTime.tdClick($('#pc-' + tdIdArr[1]));
                        var checkObj = $('#pc-' + tdIdArr[1]).children('input[type="checkbox"]');
                        if($('#pc-' + tdIdArr[1]).hasClass('selected')) {
                            checkObj.prop('checked',true);
                        }
                    }
                    $('#sp-' + tdIdArr[1]).removeClass('selected');
                }
                
            });
        }
        return false;
    },
    tdClick: function(obj) {
        var checkObj = $(obj).children('input[type="checkbox"]');
        onChangeTime(checkObj[0]);
        return false;
    },
    childItemListener: function(checkList) {
        for (var j = 0; j < checkList.length; j++) {
            var chkElm = checkList[j];
            var parentTdElm = chkElm.parentNode;
            var tdId = $(parentTdElm).attr('id');
            var tdIdArr = tdId.split('-');
            if(tdIdArr[1]) {
                if(spFlg) {
                    $('#pc-'+tdIdArr[1]).on("click", onClickTimeCell);
                }
                if(pcFlg) {
                    $('#sp-'+tdIdArr[1]).on("click", onClickTimeCell);
                }
            }
        }
    }

}

//並び替え  件数のutil
var pager = pager || {};
pager = {
        
    selectChangeBind:function () {
        if($('#top_ken_selectbox')){
            $('#top_ken_selectbox').change(function(){
                pager.kenChange(this);
            });
        }
        
        if($('#top_orderby_selectbox')){
            $('#top_orderby_selectbox').change(function(){
                pager.sortData(this);
            });
        }
    },
    
    // 並び替え
    sortData:function (optionObj) {
//##### Add Start 2021/05/25 [UI0081] ボタン二度押し防止対応（性能影響大の処理）
        if (alreadySubmitFlg) {
            return;
        }
        alreadySubmitFlg = true;
//##### Add End   2021/05/25 [UI0081] ボタン二度押し防止対応（性能影響大の処理）
        window.location.href = $(optionObj).val();
    },
    
    // 件数
    kenChange:function (optionObj){
//##### Add Start 2021/05/25 [UI0081] ボタン二度押し防止対応（性能影響大の処理）
        if (alreadySubmitFlg) {
            return;
        }
        alreadySubmitFlg = true;
//##### Add End   2021/05/25 [UI0081] ボタン二度押し防止対応（性能影響大の処理）
        window.location.href = $(optionObj).val();
    }
}
// textareaのutil
var textareaCount = textareaCount || {};
textareaCount = {
    init: function(textareaId, maxlength, spanId) {
        // 入力文字数総数に「maxlength」を設定
        $('#' + spanId + 'Total').html(maxlength);
        // 入力文字数の変更
        spanId = spanId + 'Count';
        // textarea入力場合
        $("[id='" + textareaId + "']").off('keyup').on('keyup', function() {
          textareaCount.remainCharCount(this, maxlength, spanId);
        });
        // textarea入力場合
        $("[id='" + textareaId + "']").off('mousedown').on('mousedown', function() {
          textareaCount.remainCharCount(this, maxlength, spanId);
        });
        // textarea値変更場合
        $("[id='" + textareaId + "']").change(function() {
          textareaCount.remainCharCount(this, maxlength, spanId);
        });
        // textarea入力初期表示場合
        $("[id='" + textareaId + "']").show(function() {
          neoMobicoCom.remainCharCount(this, maxlength, spanId);
        });
    },
    // テキストエリアを文字数によって可変
    textAreaHeightSet:function (argObj){
         // 一旦テキストエリアを小さくしてスクロールバー（縦の長さを取得）
         argObj.style.height = "120px";
         var wSclollHeight = parseInt(argObj.scrollHeight);
         // 1行の長さを取得する
         var wLineH = parseInt(argObj.style.lineHeight.replace(/px/, ''));
         // 最低2行の表示エリアにする
         if(wSclollHeight < (wLineH * 3)){wSclollHeight=(wLineH * 3);}
         // テキストエリアの高さを設定する
         argObj.style.height = wSclollHeight + "px";
         argObj.style.overflow = "hidden";
    },
    remainCharCount: function(c, maxstrlen, spanId) {
        /**
         * 入力文字数をチェックする。<br>
         * 
         * @param {String}
         *          s 取得変化対象
         * @return {String} ページ入力対象
         */
        function wordCheck(s) {
          return document.getElementById(s);
        }
        /** @const 文字入れられる */
        var str = c.value;

        /**
         * 入力文字数をチェックする。<br>
         * 
         * @param {String}
         *          定数 ページ取得対象
         * @return {String} ページ入力対象
         */
        var wck = wordCheck(spanId);
        var myLen = 0
        for (var i = 0; i < str.length; i++) {

          if (str.charCodeAt(i) == 10) {
            myLen += 2;
          } else {
            myLen++;
          }
        }
        /** 英数字を判断する、英数1バイト1漢字2バイト */
        if (myLen > maxstrlen) {
          c.value = str.substring(0, maxstrlen);
          wck.innerHTML = maxstrlen;
        } else {
          wck.innerHTML = myLen;
        }
      }
}

//##### Add Start 2021/03/14 [UI0027] UI刷新対応（PMWB-1832：画面デザインを適用した様式のスクロールについて）
/** スクロールのドラッグ制御 */
var dragUtil = {

    /** クリック可能にする要素リスト */
    clickableTagNames: ['input', 'button', 'label', 'select', 'textarea', 'a', 'option', 'optgroup'],

    /** 
     * クリック可否の判定
     * @param 判定対象の要素
     * @return true：クリック可能/false：クリック不可
     */
    canClick: function(target) {
        // クリック可能要素名判定
        const tagName = $(target).prop('tagName');
        let canClick = false;
        if (tagName) {
            canClick = this.clickableTagNames.indexOf(tagName.toLowerCase()) !== -1;
            if (canClick) {
                return canClick;
            }
        }
        // tabIndexの判定
        const tabIndex = $(target).attr('tabindex');
        if (tabIndex && tabIndex >= 0) {
            return true;
        }

        return canClick;
    },
    
    /**
     * 指定セレクタの要素におけるスクロールのドラッグを可能にする
     * @param selector セレクタ
     * @param dragCursor ドラッグ時のカーソル
     * @param maxChildrenLayerNum 左右スクロールの可否をチェックする最大子要素数（デフォルト：3）
     *                            指定セレクタの要素の子要素をチェック
     */
    setDraggableScroll: function(selector, dragCursor, maxChildrenLayerNum){
        const self = this;
        // 初期表示時/リサイズ時にドラッグ可能か判定する
        const judgeOverflow = function() {
            let checkLayerNum = 3;
            if (maxChildrenLayerNum) {
                checkLayerNum = maxChildrenLayerNum;
            }
            $(selector).each(function(index, element) {
                // ドラッグ可否設定
                // 親要素  ＜ 子要素の場合はスクロール可能（overflow状態）
                let canDrag = false;
                let parentWidth = $(element).width();
                let parentHeight = $(element).height();
                let $nextElement = $(element);
                for (let i=0; i < checkLayerNum; i++) {
                    if (parentWidth < $nextElement.children().width()
                            || parentHeight < $nextElement.children().height()) {
                        canDrag = true;
                        break;
                    }
                    if ($nextElement.children() && $nextElement.children().length === 0) {
                        break;
                    }
                    $nextElement = $nextElement.children();
                }
                $(element).data({
                    "overflow": canDrag
                });
            });
        };
        judgeOverflow();
        $(window).on("resize", judgeOverflow);

        // ドラッグ中の要素
        let dragTarget;
        $(selector).each(function(index, element) {
            // ドラッグ開始
            $(element).mousedown(function(event) {
                // 対象外要素は無視
                if (self.canClick(event.target)) {
                    return true;
                }
                // 既存のイベントは終了
                event.preventDefault();
                // ドラッグ可否
                if (!$(element).data("overflow")) {
                    return false;
                }
                // 各種情報を設定
                dragTarget = $(element);
                $(element).data({
                    "drag": true,       // ドラッグ中フラグ
                    "move": false,      // スクロール中フラグ
                    "x": event.clientX, // ドラッグ開始時のx座標
                    "y": event.clientY, // ドラッグ開始時のy座標
                    "scrollLeft": $(element).scrollLeft(), // ドラッグ開始時のスクロール上の左位置
                    "scrollTop": $(element).scrollTop()    // ドラッグ開始時のスクロール上の上位置
                });
                // ドラッグ状態をわかりやすくするため、カーソルを変更
                $(element).css({
                    'cursor': dragCursor || 'move',
                })
                return false;
            });
            // スクロール中のクリックイベント防止
            $(element).click(function(event) {
                if (!self.canClick(event.target) && $(element).data("move")) {
                    return false;
                }
                return true;
            });
        });

        // ドラッグ中
        $(document).mousemove(function (event) {
            if ($(dragTarget).data("drag")) {
                // 既存のイベントは終了
                event.preventDefault();
                // ドラッグ開始時からの移動距離を計算
                let moveX = $(dragTarget).data("x") - event.clientX;
                let moveY = $(dragTarget).data("y") - event.clientY;
                if (moveX !== 0 || moveY !== 0) {
                    $(dragTarget).data("move", true);
                } else {
                    return;
                };
                // 移動距離分だけスクロールさせる
                $(dragTarget).scrollLeft($(dragTarget).data("scrollLeft") + moveX);
                $(dragTarget).scrollTop($(dragTarget).data("scrollTop") + moveY);
                return false;
            }
        })

        // ドラッグ終了
        $(document).mouseup(function(event) {
            $(dragTarget).data("drag", false);
            $(dragTarget).css({
                'cursor': 'auto',
            })
            return false;
        });
    }
};
//##### Add Start 2021/07/26 [UI0165] 2021年度上期対応(項目「位置情報」追加)
var locationItemSeqList;
//------------------------------------------------------------------------------
//ユーザーの現在位置を取得して地図表示する。
//@param itemSeq 項目シーケンス
//------------------------------------------------------------------------------
function getLocationInfo(itemSeq) {
    // 項目タイプ「位置情報」の要素取得
    var locationElements = document.getElementsByClassName('locationInfo');
    // 項目タイプ「位置情報」が存在しない場合は、処理終了
    if (typeof locationElements == 'undefined' || locationElements.length == 0) {
        return;
    }
    // 初期化
    locationItemSeqList = new Array();
    // 処理対象の項目シーケンスを設定
    if (itemSeq === undefined) {
        // 申込画面初期表示時
        for (var i = 0; i < locationElements.length ; i++) {
            var idName = locationElements[i].id;
            locationItemSeqList.push(idName.split('_')[1]);
        }
    } else {
        // 位置情報取得ボタン押下時
        locationItemSeqList.push(itemSeq);
    }
    // geolocationに対応しているか否かを確認
    if("geolocation" in navigator) {
        var options = {
                "enableHighAccuracy": true,
                "timeout": 5000,
                "maximumAge": 0
        };
        navigator.geolocation.getCurrentPosition(successLocation, errorLocation, options);
    } else {
        for (var i = 0; i < locationItemSeqList.length; i++) {
            var itemSeq = locationItemSeqList[i];
            document.getElementById('locationInfo_' + itemSeq).style.display='none';
            document.getElementById('locationErr_' + itemSeq).style.display='';
            document.getElementById('latlon_' + itemSeq).value = "";
            var eleLcErr = document.getElementById('locationErr_' + itemSeq);
            while (eleLcErr.firstChild) {
                eleLcErr.removeChild(eleLcErr.firstChild);
            }
            eleLcErr.insertAdjacentHTML('afterbegin', 'ブラウザが位置情報取得に対応していません');
        }
    }
}
//------------------------------------------------------------------------------
//getCurrentPosition成功時実行されるコールバック関数
//------------------------------------------------------------------------------
function successLocation(pos) {
    // 緯度・経度を取得
    var lat = pos.coords.latitude;
    var lon = pos.coords.longitude;
    // GoogleMap表示URL
    var url = "https://maps.google.com/maps?output=embed&q=" + lat + "," + lon + "&t=m&hl=ja&z=18";
    for (var i = 0; i < locationItemSeqList.length; i++) {
        var itemSeq = locationItemSeqList[i];
        document.getElementById('locationInfo_' + itemSeq).style.display='';
        document.getElementById('locationErr_' + itemSeq).style.display='none';
        document.getElementById('locationMap_' + itemSeq).contentWindow.location.replace(url);
        document.getElementById('latlon_' + itemSeq).value = lat+","+lon;
    }
}
//------------------------------------------------------------------------------
//getCurrentPositionエラー時実行されるコールバック関数
//------------------------------------------------------------------------------
function errorLocation(err) {
    var msg;
    switch(err.code){
        case 1 : msg = "位置情報の利用が許可されていません"; break;
        case 2 : msg = "デバイスの位置が判定できません"; break;
        case 3 : msg = "タイムアウトしました"; break;
        default : msg = err.message;
    }
    for (var i = 0; i < locationItemSeqList.length; i++) {
        var itemSeq = locationItemSeqList[i];
        document.getElementById('locationInfo_' + itemSeq).style.display='none';
        document.getElementById('locationErr_' + itemSeq).style.display='';
        document.getElementById('latlon_' + itemSeq).value = "";
        var eleLcErr = document.getElementById('locationErr_' + itemSeq);
        while (eleLcErr.firstChild) {
            eleLcErr.removeChild(eleLcErr.firstChild);
        }
        eleLcErr.insertAdjacentHTML('afterbegin', '<p class="error"><strong>' + msg + '</strong></p>');
    }
}
//##### Add End   2021/07/26 [UI0165] 2021年度上期対応(項目「位置情報」追加)
//##### Add Start 2022/06/30 [UI0050] 脆弱性診断対応_cookie
//------------------------------------------------------------------------------
//Cookieに設定する項目に属性を付与する。
//@param name   cookie名
//@param value  cookieの値
//@param properties 属性
//------------------------------------------------------------------------------
function setCookieProperties(name, value, properties = { expires: COOKIE_SAVE_DAYS }) {
    // Secure属性とSameSiteを設定
    properties.Secure = true;
    properties.SameSite = 'strict';
    Cookies.set(name, value, properties);
}
//##### Add End   2022/06/30 [UI0050] 脆弱性診断対応_cookie
