/** * @file date.js * @brief JSで日付を扱う処理を纏めたファイル * 当初デフォルトで自動的にセットされるのはパラメータ判断しかなかった為、 * このファイルではパラメータを見る場合に限定しています。 * カレンダーによるプルダウン制御はajax_calendar.jsに退避させてます。 */ /** * @brief デフォルトでセレクトボックスに入る年(from用) */ var def_year; /** * @brief デフォルトでセレクトボックスに入る月(from用) */ var def_month; /** * @brief デフォルトでセレクトボックスに入る日(from用) */ var def_day; /** * @brief 月のセレクトボックスの最大要素数 */ var select_maxnum_mon; /** * @brief 初回ロード時のものか */ var is_def_load = 0; /** * @brief 年またぎフラグ */ var is_year_add; /** * @brief 月末判定フラグ */ var is_mon_last; /** * @brief ロード時に呼び出される関数。出発日のセレクトボックスに対応 * @param today SHMジェネレートされた日付 */ function getDefaultDate(today) { // 現在の日付に1日加算する処理(from用) def_date = addDay(today, 1); // 初回ロードフラグ is_def_load = 1; // 日付情報(from用) def_year = def_date.getFullYear(); def_month = def_date.getMonth() + 1; def_day = def_date.getDate(); // セレクトボックスの要素数算出 select_maxnum_mon = getSelectElementNum(); // 月末判定フラグ 月末のみ要素が5つになる判定 if (select_maxnum_mon == 5) { is_mon_last = 1; } else { is_mon_last = 0; } // 年のセレクトボックスの要素数 var select_counter = 0; // 年またぎの場合があったら、年のセレクトボックスの枠を2つ分用意する if (def_month + 7 > 12) { // 12月且つ月末は翌年からなので年またぎでない if (def_month == 12 && is_mon_last == 1) { select_counter = 1; } else { select_counter = 2; // 年またぎフラグオン is_year_add = 1; } } else { select_counter = 1; } // 年のセレクトボックスに値格納 makeDateSelectBox(document.OPS_SEARCH.dy, select_counter, def_year, _js_param['dy'], 0); selectYear(); } /** * @brief 年を変更した際の処理 月の部分の表示を変更する */ function selectYear() { var form_obj = document.OPS_SEARCH; // 選択された年の番地を取得 idx = form_obj.dy.selectedIndex; // 月のセレクトボックスの初期化 form_obj.dm.length = 1; // 表示する月のセレクトボックスの要素数 select_counter = 0; // セレクトボックスの最初の要素 select_value = 1; // 年またぎの時のセレクトボックス内の要素数 if (is_year_add == 1) { // 今年の処理 if (idx == 0) { // from基準月 select_value = def_month; // 12 - def_monthだけだと当月も引かれてしまうので +1 で調整 if (is_mon_last == 1) { select_counter = 12 - def_month; } else { select_counter = 12 - def_month + 1; } // 来年 } else { select_value = 1; if (is_mon_last == 1) { select_counter = select_maxnum_mon - (12 - def_month); } else { select_counter = select_maxnum_mon - (12 - def_month + 1); } } // 年またぎじゃ無い時 } else { select_value = def_month; if (is_mon_last == 1) { select_counter = select_maxnum_mon; } else { select_counter = select_maxnum_mon; } } // 月セレクトボックスに値をセット makeDateSelectBox(form_obj.dm, select_counter, select_value, _js_param['dm'], 0); selectMon(); } /** * @brief 月を変更した際の処理、日付のセレクトボックスの値をセットする */ function selectMon() { var form_obj = document.OPS_SEARCH; // 日にちのセレクトボックスを初期化 form_obj.dd.options.length = 1; // 日付出すセレクトボックスの開始日付 var select_start_day = 1; // 日付出すセレクトボックスの末尾の日付 var select_end_day = 31; // 現在の日付が選択されていた時の処理 if (form_obj.dy.selectedIndex == 0 && form_obj.dm.selectedIndex == 1) { // 開始日付をデフォルト値にする select_start_day = def_day; } else { select_start_day = 1; } val = form_obj.dm.options[form_obj.dm.selectedIndex].value; // 以下、日付出すセレクトボックスの終了日時取得処理 // 2月の時 if (val == 2) { // 閏年判定(選択されている年で閏年判定をかける) if (leapYear(form_obj.dy.options[form_obj.dy.selectedIndex].value)) { select_end_day = 29; } else { select_end_day = 28; } // 4月・6月・9月・11月の処理 } else if(val == 4 | val == 6 | val == 9 | val == 11) { select_end_day = 30; // 上記以外 } else { select_end_day = 31; } var select_counter = select_end_day - select_start_day + 1; // セレクトボックスに日付格納 makeDateSelectBox(form_obj.dd, select_counter, select_start_day, _js_param['dd'], 0); } /** * @brief 日を加える関数 */ function addDay(oldDate, num) { var newDate = new Date(oldDate); newDate.setDate(oldDate.getDate() + num); return newDate; } /** * @brief 閏年を判定する関数 * @param judg_year 月が入る(2月しか入らないから、呼び出し元に判定書くか思案中…) * @return うるう年の場合はtrue そうじゃない時はfalseを返す */ function leapYear(judg_year) { var tf; if (judg_year % 4 == 0) { if (judg_year % 100 == 0) { if (judg_year % 400 == 0) { tf = true; } else { tf = false; } } else { tf = true; } } else { tf = false; } return tf; } /** * @brief 実際にセレクトボックスの中身を書き換える関数 月日の処理の所は初期値として『--』があるので番号が一つずれる * GETパラメータが渡ってきた際に走る * @param obj 書き換える対象のセレクトボックス * @param select_counter roopの回数 * @param select_value セレクトボックスの先頭要素 * @param param * @prama sendBy どこから呼び出されたか。(当初パラメータしか見ることを考えていなかった為用意) * 0 -> プルダウン操作から呼ばれた * 1 -> カレンダーから呼ぶ時は一律これ */ function makeDateSelectBox(obj, select_counter, select_value, param, sendBy) { var form_obj = document.OPS_SEARCH; // パラメータが渡された時、値をデフォルトセットするかの判定をする為のフラグ var focus_flag = 0; // 年の場合 if (obj.name == 'dy') { tmp_idx = 0; focus_flag = 1; // 月の場合 } else if (obj.name == 'dm') { tmp_idx = 1; /** * 年に不正な値が入っていないかチェック * 年のセレクトボックスの0番地にデフォルトで今年が入る為、 * 渡ってきたGETパラメータを見に行く * 不正な値が来ていたら月は選択しない */ if (param != '') { for (i = 0; i < form_obj.dy.length; i++) { if (form_obj.dy.options[i].value == _js_param['dy']) { focus_flag = 1; } } } // 日の場合 } else if(obj.name == 'dd') { tmp_idx = 1; /** * 月が選択されているかチェック。 * 月が選択されていなかったら、日にちパラメータが渡ってきても処理しない。 */ if (form_obj.dm.selectedIndex > 0 && param != '') { focus_flag = 1; } else { focus_flag = 0; } /** * パラメータの値を保持し続けると、日付を操作する度に * パラメータの値でフォーカスになってしまうので、ここで初期化 */ if (_js_param['dy'] != '' || _js_param['dm'] != '' || _js_param['dd'] != '') { _js_param['dy'] = ''; _js_param['dm'] = ''; _js_param['dd'] = ''; } // エラー処理 パラメータが渡っていない時と同じで指定なしでセット。 } else { form_obj.dy.selectedIndex = 0; form_obj.dm.selectedIndex = 0; form_obj.dd.selectedIndex = 0; return; } for (i = 0; i < select_counter; i++) { if (obj.name != 'dd' || (obj.name == 'dd' && form_obj.dm.selectedIndex > 0)) { obj.options[i + tmp_idx] = new Option(select_value + i, select_value + i); } // セレクトボックスの中身をパラメータでデフォルトセットするかの判定 if (focus_flag == 1 && param == select_value + i) { if (obj.name != 'dd') { obj.options[i + tmp_idx].selected = true; } else if (obj.name == 'dd' && is_def_load == 1) { obj.options[i + tmp_idx].selected = true; is_def_load = 0; } } } } /** * @brief カレンダーで日付が選択されたら、 * プルダウンの中身を変更する関数 */ function changePullDownDate(year, mon, day) { var year_obj = document.OPS_SEARCH.dy; var mon_obj = document.OPS_SEARCH.dm; var day_obj = document.OPS_SEARCH.dd; // JSで読み込める様、日付作成 var get_day = new Date(year, mon-1, day); // これ以降プルダウン操作(後での追加機能なのでロジックががgg) for(var i = 0; i < year_obj.length; i++){ if(year_obj.options[i].value == get_day.getFullYear()){ year_obj.options[i].selected = true; } } selectYear(); for(var i = 0; i < mon_obj.length; i++){ if(mon_obj.options[i].value == get_day.getMonth() + 1){ mon_obj.options[i].selected = true; } } selectMon(); for(var i = 0; i < day_obj.length; i++){ if(day_obj.options[i].value == get_day.getDate()){ day_obj.options[i].selected = true; } } // 処理が終わったらカレンダーを閉じる deletePopWindow('atour_cal'); } /** * @brief セレクトボックスの要素数を算出する関数 */ function getSelectElementNum() { // 月末の日付 var last_day = 0; // セレクトボックスの要素数 var num_of_ele = 0; // 2月の時 if (def_month == 2) { // 閏年判定(選択されている年で閏年判定をかける) if (leapYear(def_year)) { last_day = 29; } else { last_day = 28; } // 4月・6月・9月・11月の処理 } else if(def_month == 4 | def_month == 6 | def_month == 9 | def_month == 11) { last_day = 30; // 上記以外 } else { last_day = 31; } if (last_day == def_day) { num_of_ele = 7; } else { num_of_ele = 8; } //091028 num_of_ele = 8; return num_of_ele; }