PageSourceSearch

https://www.astyle.jp/astyle/contents/js/standard.js?var=20260926_test

js astyle.jp collected 2026-09-25 18:43:57 UTC 112,753 bytes, 3,531 lines download raw bytes

1// KeybordTrap
2var chk=0;
3var fnKeyName= new Array("F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","Esc");
4var fnKeyCode= new Array(113,114,115,116,117,118,119,120,121,122,123,27);
5var lastKeyCode = 0;
6
7var KEY_NONE = 0;            // Keyイベントの取り消し
8var KEY_BS = 8;                // BackSpace
9var KEY_TAB = 9;            // TAB
10var KEY_ENTER = 13;            // Enter
11
12var isInitFocus = true;
13
14/**
15 * DOMがロードされた時点で呼ばれる初期化処理です。
16 */
17function initDomReady() {
18    initializeScreenStatus();
19
20    // イベントハンドラの設定
21    initEvent();
22}
23
24function unloadPage() {
25    // イベントハンドラの削除
26    removeEvent();
27}
28
29/**
30 * bodyのonloadから呼ばれる処理です。
31 */
32function initBody(){
33    //カート数量リロード
34    cartNumReload();
35}
36
37function initializeScreenStatus() {
38    var obj;
39
40    // キーが押された時
41    document.onkeydown = eventKeyDown;
42
43    var objForm = document.forms;
44    var isFocused = false;
45    var isExistErrorMessage = Validator.isExistErrorMessage();
46    for (var i = 0 ; i < objForm.length ; i++) {
47        if (!isExistErrorMessage) {
48            // エラーメッセージの先頭に後程(タブの初期化などが完了した段階で)フォーカスさせるので、先頭フォーカスはしない
49            if (!isFocused) {
50                isFocused = focusEnabledFirst(objForm[i].elements);
51            }
52        }
53
54        for (var n = 0 ; n < objForm[i].elements.length; n++) {
55            obj = objForm[i].elements[n];
56               if (isObjectInputType(obj) || isObjectButtonType(obj)) {
57                obj.onkeydown = eventEntry;
58                obj.initValue = obj.value;
59            }
60        }
61    }
62
63    // validatorのロケール設定
64    var localeLangage = getValue("pageLocaleLangage");
65    if (!isNullorUndefinedorEmpty(localeLangage)) {
66        var ruleMessageObject = Validator.lang[localeLangage];
67        if (!isNullorUndefined(ruleMessageObject)) {
68            Validator.rule.msg = ruleMessageObject;
69        }
70    }
71}
72
73function focusEnabledFirst(elements) {
74    if (!isInitFocus) {
75        return false;
76    }
77
78    if (isNullorUndefined(elements)) {
79        return false;
80    }
81
82    for (var n = 0 ; n < elements.length; n++) {
83        obj = elements[n];
84        if (isNullorUndefined(obj)) {
85            continue;
86        }
87
88        if (obj.tabIndex != -1 && !obj.disabled){
89            if (isObjectInputType(obj)) {
90                obj.focus();
91                saveFocusValue(obj)
92                return true;
93            }
94        }
95    }
96
97    return false;
98}
99
100function isObjectInputType(obj) {
101    if (isNullorUndefined(obj)) {
102        return false;
103    }
104    if (isObjectTextInputType(obj) || isObjectRadioType(obj) || obj.type == 'checkbox' || isObjectSelectInputType(obj)) {
105        return true;
106    } else {
107        return false;
108    }
109}
110
111function isObjectRadioType(obj) {
112    if (isNullorUndefined(obj)) {
113        return false;
114    }
115
116    if (obj.type == 'radio') {
117        return true;
118    } else {
119        return false;
120    }
121}
122
123function isObjectTextInputType(obj) {
124    if (isNullorUndefined(obj)) {
125        return false;
126    }
127    if (obj.type == 'text' || obj.type == 'textarea' || obj.type == 'password' || obj.type == 'tel' || obj.type == 'email' || obj.type == 'number') {
128        return true;
129    } else {
130        return false;
131    }
132}
133
134function isObjectSelectInputType(obj) {
135    if (isNullorUndefined(obj)) {
136        return false;
137    }
138    if (obj.type == 'select-one' || obj.type == 'select-multiple') {
139        return true;
140    } else {
141        return false;
142    }
143}
144
145function isObjectButtonType(obj) {
146    if (isNullorUndefined(obj)) {
147        return false;
148    }
149    if (obj.type == 'button' || obj.type == 'submit' || obj.type == 'reset') {
150        return true;
151    } else {
152        return false;
153    }
154}
155
156function isObjectLinkType(obj) {
157    if (isNullorUndefined(obj)) {
158        return false;
159    }
160    if (!isNullorUndefined(obj.href)) {
161        return true;
162    } else {
163        return false;
164    }
165}
166
167// イベントハンドラの設定
168function initEvent() {
169    initOrRemoveEvent(initEventObject);
170    var divs = document.getElementsByTagName("DIV");
171    for(var i = 0; i < divs.length; i++) {
172        if (divs[i].className.indexOf("SCROLL_TABLE") >= 0) {
173            makeFixHeader(divs[i]);
174        }
175    }
176}
177
178function removeEvent() {
179    initOrRemoveEvent(removeEventObject);
180}
181
182// 全てのオブジェクトに対するイベントハンドラの設定か削除
183function initOrRemoveEvent(initOrRemoveFunction) {
184    // Formオブジェクト単位のフォーカスハンドラ削除
185    var objForms = document.forms;
186    for(var i = 0; i < objForms.length; i++) {
187        for(var j = 0; j < objForms[i].elements.length; j++) {
188            var obj = objForms[i].elements[j];
189
190            // disabledやreadonlyの場合は対象外
191            if (isObjectReadOnly(obj)) {
192                continue;
193            }
194
195            // 自動埋め込みを行わないオブジェクトは対象外
196            if (obj.className.indexOf("NON_AUTO") >= 0) {
197                continue;
198            }
199
200            // イベント設定 or 削除
201            initOrRemoveFunction(obj);
202        }
203    }
204}
205
206
207function initEventObject(obj) {
208    setOrRemoveEventListener(obj, setEventFunction);
209    initEventObjectAdd(obj);
210}
211
212function initEventObjectAdd(obj) {
213    // オブジェクトに追加のイベント処理があれば、追加
214}
215
216function removeEventObject(obj) {
217    setOrRemoveEventListener(obj, removeEventFunction);
218    removeEventObjectAdd(obj);
219}
220
221function removeEventObjectAdd(obj) {
222    // オブジェクトに追加のイベント処理があれば、追加
223}
224
225
226function isObjectReadOnly(obj) {
227    if (isNullorUndefined(obj)) {
228        return true;
229    }
230    if (obj.disabled || obj.readOnly) {
231        return true;
232    } else {
233        return false;
234    }
235}
236
237function setEventListener(obj) {
238    setOrRemoveEventListener(obj, setEventFunction);
239}
240
241function deleteEventListener(obj) {
242    setOrRemoveEventListener(obj, removeEventFunction);
243}
244
245function setOrRemoveEventListener(obj, setOrRemoveEventFunction) {
246    if (!isObjectInputType(obj)) {
247        return;
248    }
249    // フォーカスを受け取った時(関数を追加)
250    setOrRemoveEventFunction(obj, "onfocus", eventFocus);
251    var className = obj.className;
252
253        if (className != "") {
254            if (className.indexOf("MAIL_ADDRESS") >= 0 ||
255                className.indexOf("HALF_ENGLISH_NUMBER") >= 0 ||
256                className.indexOf("PASSWORD") >= 0 ||
257                className.indexOf("HALF_ENGLISH") >= 0 ||
258                className.indexOf("HIRAGANA_CHAR") >= 0) {
259                // 何もしない
260            } else if (className.indexOf("NUMBER") >= 0) {
261                setOrRemoveEventFunction(obj, "onfocus", eventForcusNumber);
262            }
263        }
264
265    // フォーカスを失った時
266    setOrRemoveEventFunction(obj, "onblur", eventBlur);
267    var eventName = "onblur";
268    if(obj.type == 'radio' || obj.type == 'checkbox') {
269       //radio checkboxはchangeタイミングでチェック
270       eventName = 'onchange';
271    }
272    //初期化
273    setOrRemoveEventFunction(obj, eventName, eventClearError);
274    //型変換
275    eventFormat(obj, eventName, setOrRemoveEventFunction);
276    //必須・形式チェック
277    setOrRemoveEventFunction(obj, eventName, eventCheck);
278}
279
280function setEventFunction(obj, e, func) {
281    if (obj.attachEvent != undefined) {
282        obj.attachEvent(e, func);
283    } else if (obj.addEventListener != undefined) {
284        var ev = e.replace(/^on/, "");
285        obj.addEventListener(ev, func, false);
286    }
287}
288
289function removeEventFunction(obj, e, func) {
290    if (obj.detachEvent != undefined) {
291        obj.detachEvent(e, func);
292    }
293    else if (obj.removeEventListener != undefined) {
294        var ev = e.replace(/^on/, "");
295        obj.removeEventListener(ev, func, false);
296    }
297}
298
299function getEventObject(event) {
300    return window.event?window.event.srcElement:event.target;
301}
302
303function eventFocus(e) {
304    var obj = getEventObject(e);
305    inCursor(obj);
306
307    // フォーカスが入ったときの値を記憶し、ユーザー入力があるか判定可能にする
308    saveFocusValue(obj);
309}
310
311function saveFocusValue(obj) {
312    obj.inFocusValue = obj.value;
313}
314
315function eventBlur(e) {
316    var ret =eventBlurBefore(e);
317    if(ret !== undefined && !ret) {
318        return;
319    }
320    var obj = getEventObject(e);
321    outCursor(obj);
322    if (isNullorUndefined(obj)) {
323        return;
324    }
325
326    var className = obj.className;
327    if (className.indexOf("TEL_1") >= 0 || className.indexOf("TEL_2") >= 0 || className.indexOf("ZIP_1") >= 0) {
328        if (obj.value != obj.inFocusValue) {
329            // 複数領域を1つの値として扱う電話番号(3カラム)、郵便番号(2カラム)のような領域の場合、前の領域の変更有無を記憶
330            // 最後のエリア入力時のAjaxなど実行判定で利用する
331            obj.isMultiPreAreaChangeFocusOutValue = true;
332        }
333    }
334
335    obj.inFocusValue = null;
336    eventBlurAfter(e);
337}
338function eventBlurBefore(e) {}
339function eventBlurAfter(e) {}
340
341/**
342 * 前領域フォーカスアウト時に値の変更がされたかを返却します。
343 *
344 * @param obj 対象エレメント
345 * @returns (前領域フォーカスアウト時の)対象エレメントとしての変更があった場合は、true
346 */
347function isChangeMultiPreAreaChangeFocusOutValue(obj) {
348    if (isNullorUndefined(obj)) {
349        return false;
350    }
351    if (isNullorUndefined(obj.isMultiPreAreaChangeFocusOutValue)) {
352        return false;
353    }
354
355    if (obj.isMultiPreAreaChangeFocusOutValue) {
356        return true;
357    }
358    return false;
359}
360
361/**
362 * 前領域フォーカスアウト時に値の変更がされたかの記憶をクリアします。
363 *
364 * @param obj 対象エレメント
365 */
366function clearMultiAreaChangeFocusOutValue(obj) {
367    if (!isNullorUndefined(obj)) {
368        obj.isMultiPreAreaChangeFocusOutValue = null;
369    }
370}
371
372/**
373 * 対象のエレメントの値にユーザー入力があったか判定します。
374 * @param obj 対象エレメント
375 * @returns ユーザー入力があった場合true
376 */
377function isChangeObject(obj) {
378    // objに入力がなければ戻る
379    if(obj === null){ return; }
380
381    if (obj.isChangeScriptLock) {
382        return false;
383    }
384
385    if (!isNullorUndefined(obj.isChangeByScript) && obj.isChangeByScript) {
386        obj.isChangeByScript = false;
387        return true;
388    }
389    if (obj.inFocusValue != obj.value) {
390        return true;
391    } else {
392        return false;
393    }
394}
395
396/**
397 * 画面にユーザー入力があったかを判定する
398 * @return ユーザー入力があった場合true
399 */
400function isInputScreenValue() {
401    var objForms = document.forms;
402    for(var i = 0; i < objForms.length; i++) {
403        for(var j = 0; j < objForms[i].elements.length; j++) {
404            var obj = objForms[i].elements[j];
405            if (isObjectInputType(obj)) {
406                var initValue = obj.initValue;
407                var nowValue = obj.value;
408                if (initValue != nowValue) {
409                    return true;
410                }
411            }
412        }
413    }
414    return false;
415}
416
417function eventForcusNumber(e) {
418    var obj = getEventObject(e);
419    var number = obj.value;
420    if(number == null || number == "") {
421        return;
422    } else {
423        // カンマを外す
424        obj.value = removeCanma(number);
425        return;
426    }
427}
428
429function removeCanma(number) {
430    if (number == null || number == undefined) {
431        return "";
432    } else {
433        return number.replace(/,/g, "");
434    }
435}
436
437function eventTohalf(e) {
438    var obj = getEventObject(e);
439//    Validator.init(obj);
440    if(obj.value == null || obj.value == "") {
441        return;
442    }
443
444    var half = Validator.tohalf(obj.value);
445    obj.value = half;
446}
447
448function eventFormatNumber(e) {
449    var obj = getEventObject(e);
450//    Validator.init(obj);
451    if(obj.value == null || obj.value == "") {
452        return;
453    }
454
455    var className = obj.className;
456    var isSeparate = true;
457    if (className.indexOf("NOT_SEPARATED") >= 0) {
458        isSeparate = false;
459    } else {
460        isSeparate = true;
461    }
462
463    var periodNumber = 0;
464    if (className.indexOf("PERIOD_") >= 0) {
465        var ns = className.split("PERIOD_");
466        if (ns.length > 1) {
467            periodNumber = Number(ns[1].split(" ")[0]);
468        }
469    } else {
470        periodNumber = 0;
471    }
472
473    try {
474        var half = Validator.tohalf(obj.value);
475        obj.value = half;
476        if (className.indexOf("NUMBER_STRING") >= 0) {
477            // データ型が文字列の数値は、ハイフンとカンマのみ削除する
478            var targets = ["-", ","];
479            obj.value = removeCharacters(obj.value, targets);
480        } else {
481            var formatNumber = getFormatedNumberString(obj.value, periodNumber, isSeparate, true);
482            obj.value = formatNumber;
483        }
484    } catch(e) {
485        if(e instanceof ExNumberException) {
486            Validator.output(obj, e.message);
487        } else {
488            throw e;
489        }
490    }
491}
492
493function eventFormatDate(e) {
494    var obj = getEventObject(e);
495    setFormatDate(obj);
496}
497
498function eventFormatDateYYMM(e) {
499    var obj = getEventObject(e);
500    setFormatDateYYMM(obj);
501}
502
503function eventFormatDateTime(e) {
504    var obj = getEventObject(e);
505    setFormatDateTime(obj);
506}
507
508function eventFormatDateHourMinutes(e) {
509    var obj = getEventObject(e);
510    setFormatDateHourMinutes(obj);
511}
512
513function eventFormatTimestamp(e) {
514    var obj = getEventObject(e);
515    setFormatTimestamp(obj);
516}
517
518function eventFormatTime(e) {
519    var obj = getEventObject(e);
520    setFormatTime(obj);
521}
522
523function eventClearError(e) {
524    var obj = getEventObject(e);
525    if(obj.type == 'radio' || obj.type == 'checkbox') {
526        obj = getFirstElement(obj.name);
527    }
528    Validator.init(obj);
529}
530
531function eventCheckFormat(e) {
532    var obj = getEventObject(e);
533    var className = obj.className;
534    if (className.indexOf("MAIL_ADDRESS") >= 0) {
535        return !Validator.check(obj, "mail", null, false);
536    } else if (className.indexOf("HALF_ENGLISH_NUMBER") >= 0) {
537        return !Validator.check(obj, "alphabetNumber", null, false);
538    } else if (className.indexOf("PASSWORD") >= 0) {
539        return !Validator.check(obj, "password", null, false);
540    } else if (className.indexOf("HALF_ENGLISH") >= 0) {
541        return !Validator.check(obj, "alphabet", null, false);
542    } else if (className.indexOf("HIRAGANA_CHAR") >= 0) {
543        return !Validator.check(obj, "hiragana", null, false);
544    } else if (className.indexOf("FULL_PITCH_CHAR_KANA") >= 0) {
545        return !Validator.check(obj, "kana", null, false);
546    }
547    return false;
548}
549
550function eventCheckRangeAndCount(e) {
551    var obj = getEventObject(e);
552    var className = obj.className;
553   var isExistError = false;
554    if (className.indexOf("NUMBER") >= 0 && className.indexOf("HALF_ENGLISH_NUMBER") < 0) {
555        var numFrom = "";
556        var numTo = "";
557         for(var i = 0; i < obj.classList.length; i++) {
558            var clazz = obj.classList[i];
559            if(clazz.indexOf("NUM_FROM_") >= 0) {
560                numFrom = clazz.replace("NUM_FROM_", "");
561            }
562            if(clazz.indexOf("NUM_TO_") >= 0) {
563                numTo = clazz.replace("NUM_TO_", "");
564            }
565        }
566         if(!isNullorUndefinedorEmpty(numFrom) || !isNullorUndefinedorEmpty(numTo)) {
567             if(!isNullorUndefinedorEmpty(numFrom) && !isNullorUndefinedorEmpty(numTo) && numFrom == numTo) {
568                 isExistError = !Validator.check(obj, "num"+numFrom);
569             } else {			 
570                 isExistError = !Validator.check(obj, "num"+numFrom+":"+numTo);
571             }
572         }
573    }
574    var countFrom = "";
575    var countTo = "";
576    for(var i = 0; i < obj.classList.length; i++) {
577        var clazz = obj.classList[i];
578        if(clazz.indexOf("COUNT_FROM_") >= 0) {
579            countFrom = clazz.replace("COUNT_FROM_", "");
580        }
581        if(clazz.indexOf("COUNT_TO_") >= 0) {
582            countTo = clazz.replace("COUNT_TO_", "");
583        }
584    }
585     if(!isNullorUndefinedorEmpty(countFrom) || !isNullorUndefinedorEmpty(countTo)) {
586        if (className.indexOf("NUMBER") >= 0  && className.indexOf("HALF_ENGLISH_NUMBER") < 0) {
587            if(!isNullorUndefinedorEmpty(countFrom) && !isNullorUndefinedorEmpty(countTo) && countFrom == countTo) {
588                isExistError = !Validator.check(obj, "numCount"+countFrom);			 
589            } else {
590                isExistError = !Validator.check(obj, "numCount"+countFrom+":"+countTo);
591            }
592        } else {
593            if(!isNullorUndefinedorEmpty(countFrom) && !isNullorUndefinedorEmpty(countTo)  && countFrom == countTo) {
594                isExistError = !Validator.check(obj, "count"+countFrom);				 
595            } else {				
596                isExistError = !Validator.check(obj, "count"+countFrom+":"+countTo);
597            }
598        }
599     }
600    return isExistError;
601}
602
603function eventCheck(e) {
604    var obj = getEventObject(e);
605    var className = obj.className;
606    var isExistError = false;
607    
608    eventCheckBefore(e);
609    
610    if(className.indexOf("TEL_") >= 0) {
611        var preId = obj.id.replace("Middle", "Pre").replace("Post", "Pre");
612        var middleId = obj.id.replace("Pre", "Middle").replace("Post", "Middle");
613        var postId = obj.id.replace("Pre", "Post").replace("Middle", "Post");
614        var pre = getValue(preId);
615        var middle = getValue(middleId);
616        var post = getValue(postId);
617        //すべて入力されていない場合はチェックしない
618        if(isNullorUndefinedorEmpty(pre) || isNullorUndefinedorEmpty(middle) || isNullorUndefinedorEmpty(post)) {
619          return false;
620        }
621        var id = obj.name.replace("Pre", "").replace("Middle", "").replace("Post", "");
622        var required = false;
623        if(className.indexOf("REQUIRED_") >= 0) {
624            required = true;
625        }
626        //indexSymbolが必要だが、submit処理でindexSymbolが設定されることはない(はず)
627        isExistError = checkTel(id, required, "");
628     } else if(className.indexOf("ZIP_") >= 0) {
629        var preId = obj.id.replace("Post", "Pre");
630        var postId = obj.id.replace("Pre", "Post");
631        var pre = getValue(preId);
632        var post = getValue(postId);
633        //すべて入力されていない場合はチェックしない
634        if(isNullorUndefinedorEmpty(pre) || isNullorUndefinedorEmpty(post)) {
635          return false;
636        }
637        var id = obj.name.replace("Pre", "").replace("Post", "");
638        var required = false;
639        if(className.indexOf("REQUIRED_") >= 0) {
640            required = true;
641        }
642        //indexSymbolが必要だが、submit処理でindexSymbolが設定されることはない(はず)
643        isExistError = checkZip(id, required, "");
644     } else {
645         isExistError = eventCheckRequired(e);
646         if(!isExistError) {
647             isExistError = eventCheckFormat(e);
648         }
649         if(!isExistError) {
650             isExistError = eventCheckRangeAndCount(e);
651         }
652     }
653    eventCheckAfter(e);
654     
655    return isExistError;
656}
657function eventCheckBefore(e) {
658    
659}
660function eventCheckAfter(e) {
661    
662}
663
664function eventFormat(obj,eventName, setOrRemoveEventFunction) {
665    var className = obj.className;
666    if (className.indexOf("NUMBER") >= 0 && className.indexOf("HALF_ENGLISH_NUMBER") < 0) {
667        setOrRemoveEventFunction(obj, eventName, eventFormatNumber);
668    } else if (className.indexOf("DATE_YYMM") >= 0) {
669        // YYYY/MM
670        setOrRemoveEventFunction(obj, eventName, eventFormatDateYYMM);
671    } else if (className.indexOf("DATE_TIME") >= 0) {
672        // YYYY/MM/DD hh:mi:ss
673        setOrRemoveEventFunction(obj, eventName, eventFormatDateTime);
674    } else if (className.indexOf("DATE_HOUR_MINUTES") >= 0) {
675        // YYYY/MM/DD hh:mi
676        setOrRemoveEventFunction(obj, eventName, eventFormatDateHourMinutes);
677    } else if (className.indexOf("TIMESTAMP") >= 0) {
678        // YYYY/MM/DD hh:mi:ss sss
679        setOrRemoveEventFunction(obj, eventName, eventFormatTimestamp);
680    } else if (className.indexOf("DATE") >= 0) {
681        // YYYY/MM/DD
682        setOrRemoveEventFunction(obj, eventName, eventFormatDate);
683    } else if (className.indexOf("TIME") >= 0) {
684        // hh:mi
685        setOrRemoveEventFunction(obj, eventName, eventFormatTime);
686    } else if (className.indexOf("TEL_") >= 0 || className.indexOf("ZIP_") >= 0) {
687        setOrRemoveEventFunction(obj, eventName, eventTohalf);
688    }
689}
690
691function eventCheckRequired(e) {
692    var obj = getEventObject(e);
693    var className = obj.className;
694    if(className.indexOf("REQUIRED_") >= 0 && className.indexOf("REQUIRED_CONDITION_") < 0) {
695        if(obj.type == 'radio' || obj.type == 'checkbox') {
696            obj = getFirstElement(obj.name);
697        }
698        return !Validator.check(obj, "input", null, false);
699    }
700    return false;
701}
702
703// FunctionKey Trap
704// idがFNxxをClickして実現します。例えば、<input type="hidden" id="F12" onClick="submit()">を
705// form中にコーディングしておくと、onClickを、F12で実行できる
706// または、    <button name="F12" type="submit" class="Button65" id="F12" tabindex="901">OK</button>
707function eventKeyDown(e){
708    var obj;
709    var objForm;
710    e = e || window.event;
711    eventKeyDownBefore(e);
712    var keyCode = getKeyCode(e);
713    var isMatchKeyCodeFnKey = false;
714    for (var f = 0; f < fnKeyCode.length; f++) {
715        if (keyCode == fnKeyCode[f]) {
716            isMatchKeyCodeFnKey = true;
717            break;
718        }
719    }
720
721    if (!isMatchKeyCodeFnKey) {
722        eventKeyDownAfter(e);
723        return;
724    }
725
726    objForm = document.forms;
727    var isCtrlKeyPush = e.ctrlKey;
728    for(var i = 0; i < objForm.length; i++) {
729        for(var n = 0; n < objForm[i].elements.length; n++) {
730            obj = objForm[i].elements[n];
731            for(var p = 0; p < fnKeyName.length; p++) {
732                var targetFnkeyName = fnKeyName[p];
733                if (isCtrlKeyPush) {
734                    targetFnkeyName = "Ctrl" + fnKeyName[p];
735                }
736                if (obj.id == targetFnkeyName && keyCode == fnKeyCode[p]) {
737                    if (obj.type != 'hidden') {
738                        // hiddenにfocusを送るとエラーとなるため、hidden項目の場合は除外
739                        obj.focus();
740                    }
741                    if (!obj.disabled) {
742                        obj.click();
743                    }
744                    setKeyCode(e, KEY_NONE);
745                    eventKeyDownAfter(e);
746                    return false;
747                }
748            }
749        }
750    }
751    eventKeyDownAfter(e);
752}
753/**
754 * keyDown前処理
755 */
756function eventKeyDownBefore(e){};
757/**
758 * keyDown後処理
759 */
760function eventKeyDownAfter(e){};
761
762function getKeyCode(e){
763    if (document.all) {
764        if (!isNullorUndefined(event)) {
765            return  event.keyCode;
766        }
767    }
768    else if (document.getElementById) {
769        return (e.keyCode)? e.keyCode: e.charCode;
770    }
771    else if (document.layers) {
772        return  e.which;
773    }
774}
775
776function setKeyCode(e, value){
777    if (document.all) {
778        if (!isNullorUndefined(event)) {
779            event.keyCode = value;
780        }
781    }
782    else if (e.preventDefault) {
783        e.preventDefault();
784        e.stopPropagation();
785    }
786    else if (document.layers) {
787        e.which = value;
788    }
789}
790
791// EnterKey Trap
792function eventEntry(e){
793    var obj = this;
794
795    keyCode = getKeyCode(e);
796    if (keyCode == KEY_BS){    //redaonlyのBackSpaceで「戻る」を防ぐ
797        var evObj = getEventObject(e);
798        if (evObj.type == "text") {
799             if (evObj.readOnly) {
800                setKeyCode(e, KEY_NONE);
801                return false;
802            }
803        }
804    }
805    return true;
806}
807
808// 入力フィールド全てをReadOnly
809function readOnlyBody(){
810    var n;
811    var i;
812    var obj;
813    var objForm;
814
815    objForm = document.forms;
816    for(i = 0; i < objForm.length; i++){
817        for(n = 0; n < objForm[i].elements.length; n++){
818            obj = objForm[i].elements[n];
819            if(isObjectInputType(obj) || isObjectButtonType(obj)){
820                obj.readOnly=true;
821                if(isObjectTextInputType(obj) || isObjectSelectInputType(obj) || isObjectButtonType(obj)){
822                    obj.style.backgroundColor = "#F6F4EA";
823                }
824            }
825        }
826    }
827}
828
829/*********************************************************************************************************************************************/
830/**  FireFox用 テーブルスクロール
831/*********************************************************************************************************************************************/
832function makeFixHeader(obj) {
833    // ヘッダーとなる行オブジェクトを取得
834    var thead = getFirstElementByTagName(obj, "THEAD");
835    // ヘッダーが見つからなければ処理しない
836    if (thead == null) return;
837
838    // スクロール設定するTABLEを取得(THEADの親ノードは必ずTABLE)
839    var table = thead.parentNode;
840
841    // 新しくヘッダーとなるTABLEを作成し、各属性をコピー
842    var newTable = document.createElement("TABLE");
843    newTable.width = table.offsetWidth;
844    newTable.className = table.className;
845    newTable.setAttribute("style", table.getAttribute("style"));
846    newTable.style.marginBottom = "0px";
847
848    // スクロールバーの幅
849    // センタリングした場合、スクロールバーの分だけ左にずれるので補正
850    var scrollBar = obj.offsetWidth - table.offsetWidth;
851    newTable.style.marginRight = scrollBar + "px";
852
853    var newHead = thead.cloneNode(true);
854    newTable.appendChild(newHead);
855
856    // Divの前に挿入
857    obj.parentNode.insertBefore(newTable, obj);
858
859    // THEADは非表示(ヘッダーのみにサイズ指定されている場合があるので、旧ヘッダーの非表示は必ず最後)
860    var tr = getFirstElementByTagName(thead, "TR");
861    if (tr != null) {
862        // ヘッダー部を隠し、行の高さを0にする。(display:none;を使用するとセル幅が変わってしまう)
863        tr.style.visibility = "hidden";
864        for(var i=0 ; i<tr.cells.length ; i++) {
865            var cell = tr.cells[i];
866            cell.innerHTML = "";
867            cell.style.padding = "0px";
868        }
869    }
870
871}
872
873function getFirstElementByTagName(obj, name) {
874    var child;
875    for(var i=0 ; i<obj.childNodes.length ; i++) {
876        child = obj.childNodes[i];
877        if (child.tagName == name) {
878            // 最初に見つかった
879            return child;
880        }
881        else if (child.hasChildNodes()) {
882            var find = getFirstElementByTagName(child, name);
883            if (find != null) return find;
884        }
885    }
886    return null;
887}
888
889function fixColWidth(obj, arr, current) {
890    if (obj == null) return;
891    current = (current==null)?0:current;
892
893    // セットした幅の配列
894    var result = new Array();
895
896    // セル幅を設定
897    var child;
898    var width;
899    for(var i=0 ; i<obj.childNodes.length ; i++) {
900        child = obj.childNodes[i];
901        if (child.tagName == "TD" || child.tagName == 'TH') {
902            if (arr != null && arr.length > current) {
903                width = arr[current];
904            }
905            else {
906                // 設定する値がなければ現在幅
907                width = child.offsetWidth;
908            }
909            child.style.width = width + "px";
910            child.width = width;
911
912            result[result.length] = width;
913            current ++;
914        }
915        else if (child.hasChildNodes()) {
916            var  ret = fixColWidth(child, arr, current);
917            for(var j=0 ; j<ret.length ; j++) result[result.length] = ret[j];
918        }
919    }
920
921    return result;
922}
923
924/*********************************************************************************************************************************************/
925/**  入力フォーカス
926/*********************************************************************************************************************************************/
927function inCursor(obj){
928    obj.className = removeStyleClass(obj.className) + " focus";
929}
930
931function outCursor(obj){
932    obj.className = removeStyleClass(obj.className);
933}
934
935function removeStyleClass(className) {
936    var ac = className.split(" ");
937    className = ac[0];
938    for (var i = 1; i < ac.length; i++) {
939        if (ac[i] != "focus") {
940            className += " " + ac[i];
941        }
942    }
943    return className;
944}
945
946/*********************************************************************************************************************************************/
947/**  Exception: 例外クラス
948/*********************************************************************************************************************************************/
949//
950// 数字例外
951//  数字以外の文字を検証した場合にスローする
952//
953var ExNumberException = function() {
954    this.initialize.apply(this, arguments);
955}
956ExNumberException.prototype = {
957    message: "",
958    name: "ExNumberException",
959
960    initialize: function(message) {
961        this.message = message;
962    },
963
964    toString: function () {
965        return this.name + ': "' + this.message + '"';
966    }
967};
968
969//
970// 日付例外
971//  認識できない日付書式や、日付の妥当性の検証でスローする
972//
973var ExDateTimeException = function() {
974    this.initialize.apply(this, arguments);
975}
976ExDateTimeException.prototype = {
977    message: "",
978    name: "ExDateTimeException",
979
980    initialize: function(message) {
981        this.message = message;
982    },
983
984    toString: function () {
985        return this.name + ': "' + this.message + '"';
986    }
987};
988
989/*********************************************************************************************************************************************/
990/**  ExNumber: 数字クラス
991/*********************************************************************************************************************************************/
992var ExNumber = function() {
993    this.initialize.apply(this, arguments);
994}
995ExNumber.prototype = {
996    // インスタンス変数
997    num: "",
998    minus: false,
999
1000    //
1001    // コンストラクタ
1002    //  str: 数字文字列
1003    //
1004    initialize: function(str) {
1005        if (str != null) {
1006            str = str.toString();
1007            str = trim(str);
1008            str = removeCanma(str);                        // カンマを外す
1009            str = this.zeroSuppress(str);                // ゼロサプレス
1010
1011            // 数値チェック
1012            for(var i=0 ; i<str.length ; i++) {
1013                var c = str.substring(i, i+1);
1014                if (c != "-" && c != "." && (c < "0" || c > "9")) {
1015                    throw new ExNumberException(Validator.rule.msg.num.nonumber);
1016                }
1017            }
1018
1019            // 途中にあるマイナスを除去(123-456 → 12345)
1020            str = str.replace(/([0-9.]+)\-+([0-9.]*?)/g, "$1$2");
1021
1022            // 複数ある"."を最後を残し除去(123.45.6 → 12345.6)
1023            var idx = str.lastIndexOf(".");
1024            if (idx >= 0) {
1025                var n = str.substring(0, idx);
1026                n = n.replace(/([0-9]*?)\.+([0-9]*?)/g, "$1$2");
1027                str = n + str.substring(idx);
1028                if (str.substring(idx).length <= 1) {
1029                    str += "0";
1030                }
1031            }
1032            if (str.replace(/[-0.]/g, "") == "") str = "0";
1033            this.num = str;
1034
1035            if (this.num.substring(0, 1) == "-") this.minus = true;
1036        }
1037    },
1038
1039    //
1040    // ゼロサプレス
1041    //  String num: 前ゼロサプレスする数字文字列
1042    //  return: 前ゼロサプレスした結果を返す
1043    //
1044    zeroSuppress: function(num) {
1045        return num.replace(/^(-*?)0+([0-9]+.*)/, "$1$2");
1046    },
1047
1048    //
1049    // 指定数字文字列のマイナス検証
1050    //  String num: 前ゼロサプレスする数字文字列
1051    //  return: 負の場合はtrue、正の場合はfalseを返す
1052    //
1053    isMinus: function() {
1054        return this.minus;
1055    },
1056
1057    //
1058    // 実数(小数点あり)検証
1059    //  return: 実数の場合はtrue、整数の場合はfalseを返す
1060    //
1061    isFloat: function() {
1062        return (this.num.indexOf(".") >= 0)?true:false;
1063    },
1064
1065    //
1066    // 絶対値の取得
1067    //  return: 絶対値を返す
1068    //
1069    abs: function() {
1070        return this.num.replace(/-/g, "");
1071    },
1072
1073    //
1074    // Numberクラスに変換
1075    //  return: Numberクラスを返す
1076    //
1077    toNumber: function() {
1078        return new Number(this.num);
1079    },
1080
1081    //
1082    // 数字文字列の取得
1083    //  return: 数字文字列を書式化せずそのまま返す
1084    //
1085    toString: function() {
1086        return this.num;
1087    },
1088
1089    //
1090    // 数字文字列の書式化取得
1091    //     fmt: 書式
1092    //       書式は"#,##0.0" か "000000"で指定可能(Default:"#,##0.0")
1093    //  return: 書式化した数字文字列を返す
1094    //
1095    toFormatString: function(fmt) {
1096        var s = this.num;
1097
1098        // サイン部を消し、整数部と小数部に分ける
1099        s = s.replace(/-/g, "");
1100        var idx = s.indexOf(".");
1101        var f = null;
1102        if (idx >= 0) {
1103            f = s.substring(idx+1);                // 小数
1104            s = s.substring(0, idx);                // 整数
1105        }
1106        if (s == "0" && fmt.indexOf("#.") >= 0) s = "";
1107        if (s == "" && fmt.indexOf("0.") >= 0) s = "0";
1108
1109        // 書式
1110        if (fmt == null || fmt == "") {
1111            fmt = "#,##0";
1112        }
1113        else {
1114            // 前後空白は無視
1115            fmt = trim(fmt);
1116        }
1117
1118        // 書式チェック("-#,##0.00" or "0000000")
1119        if (fmt.replace(/0/g, "") == "") {
1120            // 書式00000の場合は小数部は処理しない
1121            var len = fmt.length;
1122            if (s.length >= len) {
1123                return s;
1124            }
1125            else {
1126                var zero = "";
1127                for(var i=0 ; i<len-s.length ; i++) {
1128                    zero += "0";
1129                }
1130                return zero+s;
1131            }
1132        }
1133        else if (fmt.replace(/[-#0.,]/g, "") == "") {    // 書式は厳密なチェックはしない。指定文字があればOK
1134            var n = "";
1135            var canma = "";
1136            if (fmt.indexOf(",") >= 0) canma = ",";
1137
1138            // 整数部
1139            var len = s.length;
1140            for(var i=0 ; i<len ; i++) {
1141                if (i > 0 && (i%3) == 0) {
1142                    n = canma + n;
1143                }
1144                n = s.substring(len-i-1, len-i) + n;
1145            }
1146            // 小数部(指定がある場合。指定がない場合は処理しない)
1147            idx = fmt.indexOf(".");
1148            if (idx >= 0) {
1149                n += ".";
1150                len = fmt.substring(idx).length-1;
1151                if (f == null) {
1152                    for(var i=0 ; i<len ; i++) n += "0";
1153                }
1154                else {
1155                    if (f.length >= len) {
1156                        n += f.substring(0, len);
1157                    }
1158                    else {
1159                        n += f;
1160                        for(var i=0 ; i<len-f.length ; i++) n += "0";
1161                    }
1162                }
1163            }
1164            if (this.isMinus() && n.replace(/[0.]/g, "") != "") n = "-" + n;
1165            return n;
1166        }
1167
1168        // 該当しない書式では変換しない
1169        return this.num;
1170    }
1171};
1172
1173/*********************************************************************************************************************************************/
1174/**  ExDateTime: 日付/時間クラス
1175/*********************************************************************************************************************************************/
1176var ExDateTime = function() {
1177    this.initialize.apply(this, arguments);
1178}
1179ExDateTime.prototype = {
1180    date: null,
1181
1182    //
1183    // コンストラクタ
1184    //
1185    initialize: function() {
1186        this.date = new Date();
1187    },
1188
1189    //
1190    // 日時を取得
1191    //  return: 日時を返す
1192    //
1193    get: function() {
1194        return this.date;
1195    },
1196
1197    //
1198    // 日時を設定
1199    //  String(int) year  : 年(省略(null)した場合のDefaultは当年)
1200    //  String(int) month : 月(1~12の範囲。省略(null)した場合のDefaultは当月)
1201    //  String(int) day   : 日(1~31の範囲。省略(null)した場合のDefaultは当日)
1202    //  String(int) hour  : 時(0~23の範囲。省略(null)した場合のDefaultは0)
1203    //  String(int) minute: 分(0~59の範囲。省略(null)した場合のDefaultは0)
1204    //  String(int) second: 秒(0~59の範囲。省略(null)した場合のDefaultは0)
1205    //
1206    // 変換に失敗した場合はExceptionをスローする。
1207    //  ExDateTimeException: 日付の誤り
1208    //  ExNumberException  : 日付数字部分に文字
1209    //
1210    set: function(year, month, day, hour, minute, second, millisec) {
1211        var yy = this.toNumber(year, this.date.getFullYear());
1212        if (yy < 100) yy += 2000;                        // 2桁入力の場合は+2000(年)
1213        var mm = this.toNumber(month, this.date.getMonth() + 1);
1214        var dd = this.toNumber(day, this.date.getDate());
1215        var hh = this.toNumber(hour, 0);
1216        var mi = this.toNumber(minute, 0);
1217        var ss = this.toNumber(second, 0);
1218        var sss = this.toNumber(millisec, 0);
1219
1220        // For Debug
1221        // alert(yy + "," + mm + "," + dd + "," + hh + "," + mi + "," + ss + "," + sss);
1222
1223        // 日付の妥当性チェック
1224        if (!this.checkDate(yy, mm, dd, hh, mi, ss, sss)) {
1225            throw new ExDateTimeException(Validator.rule.msg.date.nodate);
1226        }
1227
1228        this.date = new Date(yy, mm-1, dd, hh, mi, ss, sss);
1229    },
1230
1231    //
1232    // 文字を数字に変換
1233    //  String strNum : 変換する数字文字列
1234    //  int def       : strNumがnullの場合のDefault値
1235    //  return : 変換した数字。
1236    //
1237    // 変換に失敗した場合はExceptionをスローする。
1238    //  ExNumberException  : 日付数字部分に文字
1239    //
1240    toNumber: function(strNum, def) {
1241        var num = 0;
1242        if (strNum == null || strNum == "") {
1243            return def;
1244        } else if (typeof strNum == "number") {
1245            return strNum;
1246        } else {
1247            num = parseInt(strNum, 10);
1248            if (isNaN(num)) {
1249                throw new ExNumberException(Validator.rule.msg.num.nonumber);
1250            }
1251        }
1252        return num;
1253    },
1254
1255    //
1256    // 日付の妥当性チェック
1257    //  int year   : å¹´
1258    //  int month  : 月
1259    //  int day    : 日
1260    //  int hour   : 時
1261    //  int minute : 分
1262    //  int second : 秒
1263    //  int msec   : ミリ秒
1264    //  return : 正常の場合はtrue、エラーがある場合はfalseを返す。
1265    //
1266    checkDate: function(year, month, day, hour, minute, second, msec) {
1267        // 月
1268        if (month < 1 || month > 12) return false;
1269
1270        // 日(閏年チェック含む)
1271        var lastDate = ExDateTimeUtils.getLastDayOfMonth(year, month);
1272        if (day < 1 || day > lastDate) return false;
1273
1274        // 時
1275        if (hour < 0 || hour > 23) return false;
1276
1277        // 分
1278        if (minute < 0 || minute > 59) return false;
1279
1280        // 秒
1281        if (second < 0 || second > 59) return false;
1282
1283        // ミリ秒
1284        if (msec < 0 || msec > 999) return false;
1285
1286        return true;
1287    },
1288
1289    //
1290    // 年月(YYYY/MM)形式の日付を解析
1291    //  String str : 解析する日付文字列
1292    //  return : 正常の場合は解析した日付を持つ自インスタンスを返す。
1293    //
1294    // 解析に失敗した場合はExceptionをスローする。
1295    //  ExDateTimeException: 日付の入力形式誤り
1296    //
1297    parseYM: function(str) {
1298        if (str.match(/^(\d{2})$/)) {                                // mm
1299            this.set(null, RegExp.$1, 1, 0, 0, 0);
1300        } else if (str.match(/^(\d{4})$/)) {                        // yymm
1301            this.set(str.substring(0, 2), str.substring(2), 1, 0, 0, 0);
1302        } else if (str.match(/^(\d{6})$/)) {                        // yyyymm
1303            this.set(str.substring(0, 4), str.substring(4), 1, 0, 0, 0);
1304        } else if (str.match(/^(\d{2,4})\/{0,1}(\d{1,2})$/)) {        // yyyy/mm
1305            this.set(RegExp.$1, RegExp.$2, 1, 0, 0, 0);
1306        } else {
1307            throw new ExDateTimeException(Validator.rule.msg.date.input_yyyymm);
1308        }
1309        return this;
1310    },
1311
1312    //
1313    // 日時(YYYY/MM/DD hh:mi:ss)形式の日付を解析
1314    //  String str : 解析する日付文字列
1315    //  return : 正常の場合は解析した日付を持つ自インスタンスを返す。
1316    //
1317    // 解析に失敗した場合はExceptionをスローする。
1318    //  ExDateTimeException: 日付の入力形式誤り
1319    //
1320    parseDate: function(str, isTimeNeed) {
1321        if (str.match(/^(\d{2})$/)) {                            // dd
1322            this.set(null, null, RegExp.$1, 0, 0, 0);
1323        } else if (str.match(/^(\d{4})$/)) {                        // mmdd
1324            this.set(null, str.substring(0, 2), str.substring(2), 0, 0, 0);
1325        } else if (str.match(/^(\d{6})$/)) {                        // yymmdd
1326            this.set(str.substring(0, 2), str.substring(2, 4), str.substring(4), 0, 0, 0);
1327        } else if (str.match(/^(\d{8})$/)) {                        // yyyymmdd
1328            this.set(str.substring(0, 4), str.substring(4, 6), str.substring(6), 0, 0, 0);
1329        } else if (str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})$/)) { // yyyy/mm/dd
1330            this.set(RegExp.$1, RegExp.$2, RegExp.$3, 0, 0, 0);
1331        } else if (isTimeNeed && str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})\s*?(\d{0,2})\:{0,1}(\d{0,2})\:{0,1}(\d{0,2})$/)) { // yyyy/mm/dd hh:mi:ss
1332            this.set(RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6);
1333        } else {
1334            var message;
1335            if (isTimeNeed) {
1336                message = Validator.rule.msg.date.input_yyyymmddhhmmss;
1337            } else {
1338                message = Validator.rule.msg.date.input_yyyymmdd;
1339            }
1340            throw new ExDateTimeException(message);
1341        }
1342        return this;
1343    },
1344
1345    //
1346    // 日時(YYYY/MM/DD hh:mi)形式の日付を解析
1347    //  String str : 解析する日付文字列
1348    //  return : 正常の場合は解析した日付を持つ自インスタンスを返す。
1349    //
1350    // 解析に失敗した場合はExceptionをスローする。
1351    //  ExDateTimeException: 日付の入力形式誤り
1352    //
1353    parseDateHourMinutes: function(str) {
1354        if (str.match(/^(\d{2})$/)) {                            // dd
1355            this.set(null, null, RegExp.$1, 0, 0, 0);
1356        } else if (str.match(/^(\d{4})$/)) {                        // mmdd
1357            this.set(null, str.substring(0, 2), str.substring(2), 0, 0, 0);
1358        } else if (str.match(/^(\d{6})$/)) {                        // yymmdd
1359            this.set(str.substring(0, 2), str.substring(2, 4), str.substring(4), 0, 0, 0);
1360        } else if (str.match(/^(\d{8})$/)) {                        // yyyymmdd
1361            this.set(str.substring(0, 4), str.substring(4, 6), str.substring(6), 0, 0, 0);
1362        } else if (str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})$/)) { // yyyy/mm/dd
1363            this.set(RegExp.$1, RegExp.$2, RegExp.$3, 0, 0, 0);
1364        } else if (str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})\s*?(\d{0,2})\:{0,1}(\d{0,2})$/)) { // yyyy/mm/dd hh:mi
1365            this.set(RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4, RegExp.$5, 0);
1366        } else {
1367            var message = Validator.rule.msg.date.input_yyyymmddhhmm;
1368            throw new ExDateTimeException(message);
1369        }
1370        return this;
1371    },
1372
1373    //
1374    // Timestamp(YYYY/MM/DD hh:mi:ss sss)形式の日付を解析
1375    //  String str : 解析する日付文字列
1376    //  return : 正常の場合は解析した日付を持つ自インスタンスを返す。
1377    //
1378    // 解析に失敗した場合はExceptionをスローする。
1379    //  ExDateTimeException: 日付の入力形式誤り
1380    //
1381    parseTimestamp: function(str, isTimeNeed) {
1382        if (str.match(/^(\d{2})$/)) {                            // dd
1383            this.set(null, null, RegExp.$1, 0, 0, 0);
1384        } else if (str.match(/^(\d{4})$/)) {                        // mmdd
1385            this.set(null, str.substring(0, 2), str.substring(2), 0, 0, 0);
1386        } else if (str.match(/^(\d{6})$/)) {                        // yymmdd
1387            this.set(str.substring(0, 2), str.substring(2, 4), str.substring(4), 0, 0, 0);
1388        } else if (str.match(/^(\d{8})$/)) {                        // yyyymmdd
1389            this.set(str.substring(0, 4), str.substring(4, 6), str.substring(6), 0, 0, 0);
1390        } else if (str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})$/)) { // yyyy/mm/dd
1391            this.set(RegExp.$1, RegExp.$2, RegExp.$3, 0, 0, 0);
1392        } else if (isTimeNeed && str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})\s*?(\d{0,2})\:{0,1}(\d{0,2})\:{0,1}(\d{0,2})$/)) { // yyyy/mm/dd hh:mi:ss
1393            this.set(RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6);
1394        } else if (isTimeNeed && str.match(/^(\d{2,4})\/{0,1}(\d{1,2})\/{0,1}(\d{1,2})\s*?(\d{0,2})\:{0,1}(\d{0,2})\:{0,1}(\d{0,2})\s*?(\d{0,3})$/)) { // yyyy/mm/dd hh:mi:ss sss
1395            this.set(RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6, RegExp.$7);
1396        } else {
1397            var message;
1398            if (isTimeNeed) {
1399                message = Validator.rule.msg.date.input_yyyymmddhhmmsssss;
1400            } else {
1401                message = Validator.rule.msg.date.input_yyyymmdd;
1402            }
1403            throw new ExDateTimeException(message);
1404        }
1405        return this;
1406    },
1407
1408    //
1409    // 時間(hh:mi:ss)形式の日付を解析
1410    //  String str : 解析する時間文字列
1411    //  return : 正常の場合は解析した時間を持つ自インスタンスを返す。
1412    //
1413    // 解析に失敗した場合はExceptionをスローする。
1414    //  ExDateTimeException: 時間の入力形式誤り
1415    //
1416    parseTime: function(str) {
1417        if (str.match(/^(\d{1,2})$/)) {                            // hh
1418            this.set(null, null, null, RegExp.$1, 0, 0);
1419        } else if (str.match(/^(\d{4})$/)) {                        // hhmm
1420            this.set(null, null, null, str.substring(0, 2), str.substring(2, 4), 0);
1421        } else if (str.match(/^(\d{6})$/)) {                        // hhmmss
1422            this.set(null, null, null, str.substring(0, 2), str.substring(2, 4), str.substring(4));
1423        } else if (str.match(/^(\d{1,2})\:(\d{1,2})$/)) {            // hh:mm
1424            try {
1425                this.set(null, null, null, RegExp.$1, RegExp.$2, 0);
1426            } catch (e) {
1427                e.message = Validator.rule.msg.date.notime;
1428                throw e;
1429            }
1430        } else if (str.match(/^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/)) {    // hh:mm:ss
1431            try {
1432                this.set(null, null, null, RegExp.$1, RegExp.$2, RegExp.$3);
1433            } catch (e) {
1434                e.message = Validator.rule.msg.date.notime;
1435                throw e;
1436            }
1437        } else {
1438            throw new ExDateTimeException(Validator.rule.msg.date.input_hhmm);
1439        }
1440        return this;
1441    },
1442
1443    //
1444    // 年の加算
1445    //  String(int) num : 加算する数値(マイナスの場合は減算)
1446    //  return : 加算後の自インスタンスを返す。
1447    //
1448    // 数字以外の文字を指定した場合はExceptionをスローする
1449    //  ExNumberException: 数字以外の文字
1450    //
1451    addYears: function(num) {
1452        num = this.toNumber(num, 0);
1453        this.date.setFullYear(this.date.getFullYear() + num);
1454        return this;
1455    },
1456
1457    //
1458    // 月の加算
1459    //  String(int) num : 加算する数値(マイナスの場合は減算)
1460    //  return : 加算後の自インスタンスを返す。
1461    //
1462    // 数字以外の文字を指定した場合はExceptionをスローする
1463    //  ExNumberException: 数字以外の文字
1464    //
1465    addMonths: function(num) {
1466        num = this.toNumber(num, 0);
1467        this.date.setMonth(this.date.getMonth() + num);
1468        return this;
1469    },
1470
1471    //
1472    // 日の加算
1473    //  String(int) num : 加算する数値(マイナスの場合は減算)
1474    //  return : 加算後の自インスタンスを返す。
1475    //
1476    // 数字以外の文字を指定した場合はExceptionをスローする
1477    //  ExNumberException: 数字以外の文字
1478    //
1479    addDays: function(num) {
1480        num = this.toNumber(num, 0);
1481        this.date.setDate(this.date.getDate() + num);
1482        return this;
1483    },
1484
1485    //
1486    // 時の加算
1487    //  String(int) num : 加算する数値(マイナスの場合は減算)
1488    //  return : 加算後の自インスタンスを返す。
1489    //
1490    // 数字以外の文字を指定した場合はExceptionをスローする
1491    //  ExNumberException: 数字以外の文字
1492    //
1493    addHours: function(num) {
1494        num = this.toNumber(num, 0);
1495        this.date.setHours(this.date.getHours() + num);
1496        return this;
1497    },
1498
1499    //
1500    // 分の加算
1501    //  String(int) num : 加算する数値(マイナスの場合は減算)
1502    //  return : 加算後の自インスタンスを返す。
1503    //
1504    // 数字以外の文字を指定した場合はExceptionをスローする
1505    //  ExNumberException: 数字以外の文字
1506    //
1507    addMinutes: function(num) {
1508        num = this.toNumber(num, 0);
1509        this.date.setMinutes(this.date.getMinutes() + num);
1510        return this;
1511    },
1512
1513    //
1514    // 秒の加算
1515    //  String(int) num : 加算する数値(マイナスの場合は減算)
1516    //  return : 加算後の自インスタンスを返す。
1517    //
1518    // 数字以外の文字を指定した場合はExceptionをスローする
1519    //  ExNumberException: 数字以外の文字
1520    //
1521    addSeconds: function(num) {
1522        num = this.toNumber(num, 0);
1523        this.date.setSeconds(this.date.getSeconds() + num);
1524        return this;
1525    },
1526
1527    //
1528    // 経過日数を取得
1529    //  Date(ExDateTime) date : 経過日数を計算する日付
1530    //  return 経過日数を返す。
1531    //
1532    progressDays: function(date) {
1533        var d1 = this.date.getTime();
1534        var d2;
1535        if (date instanceof ExDateTime) d2 = date.get().getTime();
1536        else if (date instanceof Date) d2 = date.getTime();
1537        else return null;
1538
1539        var d = d2 - d1;
1540        return Math.floor(d / (24*60*60*1000));
1541    },
1542
1543    //
1544    // 経過時間を取得
1545    //  Date(ExDateTime) date : 経過時間を計算する日付
1546    //  return 経過時間数を返す。
1547    //
1548    progressTimes: function(date) {
1549        var d1 = this.date.getTime();
1550        var d2;
1551        if (date instanceof ExDateTime) d2 = date.get().getTime();
1552        else if (date instanceof Date) d2 = date.getTime();
1553        else return null;
1554
1555        var d = d2 - d1;
1556        return Math.floor(d / (60*60*1000));
1557    },
1558
1559    //
1560    // 日付の比較
1561    //  Date(ExDateTime) date : 比較する日付
1562    //  return 比較する日付が大きい場合は負の数、同じ場合は0、小さい場合は正の数を返す。
1563    //
1564    compare: function(date) {
1565        var d1 = this.date.getTime();
1566        var d2;
1567        if (date instanceof ExDateTime) d2 = date.get().getTime();
1568        else if (date instanceof Date) d2 = date.getTime();
1569        else return null;
1570
1571        if (d1 == d2) return 0;
1572        else if (d1 < d2) return -1;
1573        else return 1;
1574    },
1575
1576    //
1577    // 日時の文字列取得
1578    //  return : 日時の文字列を返す。(書式はDate#toString()に依存する)
1579    //
1580    toString: function() {
1581        return this.date.toString();
1582    }
1583};
1584
1585/*********************************************************************************************************************************************/
1586/**  ExDateTimeUtils: 日付/時間ユーティリティクラス
1587/*********************************************************************************************************************************************/
1588var ExDateTimeUtils = {
1589
1590    //
1591    // 日付の書式化
1592    //  Date date  : 書式化する日付(Dateクラス)
1593    //  String fmt : 書式
1594    //   書式:
1595    //     # : Escape文字。連続する直後の書式文字をエスケープする
1596    //     Y : 4桁の西暦年
1597    //     y : 下2桁の西暦年
1598    //     m : 月(2桁)1桁の場合は前に0を付ける
1599    //     n : 月(1~2桁)前0は付けない
1600    //     d : 日(2桁)1桁の場合は前に0を付ける
1601    //     j : 日(1~2桁)前0は付けない
1602    //     w : 曜日(0:日曜日 ... 6:土曜日)
1603    //     a : 午前/午後の略号小文字(am/pm)
1604    //     A : 午前/午後の略号大文字(AM/PM)
1605    //     H : 時(24時間制 2桁)1桁の場合は前に0を付ける
1606    //     h : 時(12時間制 2桁)1桁の場合は前に0を付ける
1607    //     G : 時(24時間制 1~2桁)前0は付けない
1608    //     g : 時(12時間制 1~2桁)前0は付けない
1609    //     i : 分(2桁)1桁の場合は前に0を付ける
1610    //     s : 秒(2桁)1桁の場合は前に0を付ける
1611    //     f : ミリ秒(3桁)2桁以下の場合は前に0を付ける
1612    //     t : 指定月の最終日
1613    //     L : うるう年(うるう年の場合は"true"、以外の場合は"false")
1614    //     z : 指定日の同年1月1日から数えた経過日数
1615    //     以外: 変換せず
1616    //
1617    //  return: 指定書式で変換した日付文字列を返す。
1618    //
1619    //   例) "Y/m/d H:i:s" → "2008/10/10 18:00:00"
1620    //
1621    format: function(date, format) {
1622        if (typeof format != "string") return;
1623
1624        var d = date;
1625        if (date instanceof ExDateTime) d = date.get();
1626
1627        var dYear = d.getFullYear();
1628        var dMonth = d.getMonth() + 1;
1629        var dDate = d.getDate();
1630        var dDay = d.getDay();
1631        var dHours = d.getHours();
1632        var dMinutes = d.getMinutes();
1633        var dSeconds = d.getSeconds();
1634        var dMsec = d.getMilliseconds();
1635        var res = "";
1636
1637        for(var i=0, len=format.length ; i<len ; i++) {
1638            var c = format.charAt(i);
1639            switch(c) {
1640                case "#":
1641                    if (i == len - 1) break;
1642                    res += format.charAt(++i);
1643                    break;
1644                case "Y": res += dYear; break;
1645                case "y": res += dYear.toString().substr(2, 2); break;
1646                case "m": res += this.preZero(dMonth); break;
1647                case "n": res += dMonth; break;
1648                case "d": res += this.preZero(dDate); break;
1649                case "j": res += dDate; break;
1650                case "w": res += dDay; break;
1651                case "a": res += this.ampm(dHours); break;
1652                case "A": res += this.ampm(dHours).toUpperCase(); break;
1653                case "H": res += this.preZero(dHours); break;
1654                case "h": res += this.preZero(this.from24to12(dHours)); break;
1655                case "G": res += dHours; break;
1656                case "g": res += this.from24to12(dHours); break;
1657                case "i": res += this.preZero(dMinutes); break;
1658                case "s": res += this.preZero(dSeconds); break;
1659                case "t": res += this.getLastDayOfMonth(d); break;
1660                case "L": res += this.isLeapYear(dYear); break;
1661                case "z": res += this.getDayOfYear(dYear, dMonth, dDate); break;
1662                case "f": res += this.preWZero(dMsec); break;
1663                default : res += c; break;
1664            }
1665        }
1666        return res;
1667    },
1668
1669    //
1670    // 前ゼロ処理
1671    //  int value : 前ゼロ編集する数字
1672    //  return : 前ゼロ編集した数字文字列を返す。
1673    //
1674    preZero: function(value) {
1675        return (parseInt(value) < 10) ? "0" + value : value;
1676    },
1677
1678    //
1679    // 前ゼロ処理
1680    //  int value : 前ゼロ編集する数字
1681    //  return : 前ゼロ編集した数字文字列を返す。
1682    //
1683    preWZero: function(value) {
1684        var intVal = parseInt(value)
1685        if (intVal < 10) {
1686            return "00" + value;
1687        } else if (intVal < 100) {
1688            return "0" + value;
1689        } else {
1690            return value;
1691        }
1692    },
1693
1694    //
1695    // 24時間制の時間を12時間制に変換
1696    //  int hours : 変換する時間
1697    //  return : 12時間制に変換した時間文字列
1698    //
1699    from24to12: function(hours) {
1700        return (hours > 12) ? hours - 12 : hours;
1701    },
1702
1703    //
1704    // 午前/午後略号の取得(am/pm)
1705    //  int hours : 略号を取得する時間
1706    //  return 午前の場合はam、午後の場合はpmを返す。
1707    //
1708    ampm: function(hours) {
1709        return (hours < 12) ? "am" : "pm";
1710    },
1711
1712    //
1713    // 指定月の最終日を取得
1714    //  int(Date) year : å¹´
1715    //  int month: 月(年にDateクラスが指定された場合は無視される)
1716    //  return 指定月の最終日を返す。
1717    getLastDayOfMonth: function(year, month) {
1718        var yy = year;
1719        var mm = month;
1720        if (year instanceof Date) {
1721            yy = year.getFullYear();
1722            mm = year.getMonth() + 1;
1723        }
1724        var tmp = new Date(yy, mm-1+1, 0);        // -1+1は、JavaScript Dateクラスで月は0~11のため指定月から-1をし、
1725                                                    // 最終日を取得するため、翌月1日の前日とするため+1をする。
1726        return tmp.getDate();
1727    },
1728
1729    //
1730    // 指定年のうるう年検証
1731    //  int year : å¹´
1732    //  return : うるう年の場合はtrue、以外の場合はfalseを返す。
1733    //
1734    isLeapYear: function(year) {
1735        var sum = this.getDayOfYear(year, 12, 31);
1736        return (sum == 365) ? false : true;
1737    },
1738
1739    //
1740    // 指定日の経過日数を取得
1741    //  int year  : å¹´
1742    //  int month : 月
1743    //  int day   : 日
1744    //  return : 指定日の同年1月1日から指定日までの経過日数を返す。
1745    //
1746    getDayOfYear: function(year, month, day) {
1747        var sum = 0;
1748        for(var mm=1 ; mm<month ; mm++) {
1749            sum += this.getLastDayOfMonth(year, mm);
1750        }
1751        return sum + day;
1752    }
1753};
1754
1755function trim(str) {
1756    if (str == null) return null;
1757    return str.replace(/(^\s*)|(\s*$)/g, "");
1758}
1759
1760/*********************************************************************************************************************************************/
1761/**  日付補完: Form
1762/*********************************************************************************************************************************************/
1763
1764// 日付:YYYYMMDD形式
1765function setFormatDate(obj) {
1766    if (obj.value == null || obj.value == "") {
1767        return;
1768    }
1769
1770    try {
1771        obj.value = toDate(obj.value, true);
1772    } catch (e) {
1773        if (e instanceof ExDateTimeException) {
1774            Validator.output(obj, e.message);
1775        } else {
1776            throw e;
1777        }
1778    }
1779}
1780
1781function toDate(value, throwException) {
1782    if (value == null || value == "") {
1783        return;
1784    }
1785
1786    try {
1787        value = Validator.tohalf(value);
1788        var date = new ExDateTime().parseDate(value, false);
1789        return ExDateTimeUtils.format(date, "Y/m/d");
1790    } catch(e) {
1791        if (throwException) {
1792            throw e;
1793        } else {
1794            return value;
1795        }
1796    }
1797}
1798
1799// 日付:YYMM形式
1800function setFormatDateYYMM(obj) {
1801    if (obj.value == null || obj.value == "") {
1802        return;
1803    }
1804
1805    try {
1806        obj.value = toDateYYMM(obj.value, true);
1807    } catch (e) {
1808        if (e instanceof ExDateTimeException) {
1809            Validator.output(obj, e.message);
1810        } else {
1811            throw e;
1812        }
1813    }
1814}
1815
1816function toDateYYMM(value, throwException) {
1817    if (value == null || value == "") {
1818        return;
1819    }
1820
1821    try {
1822        value = Validator.tohalf(value);
1823        var date = new ExDateTime().parseYM(value);
1824        return ExDateTimeUtils.format(date, "Y/m");
1825    } catch(e) {
1826        if (throwException) {
1827            throw e;
1828        } else {
1829            return value;
1830        }
1831    }
1832}
1833
1834//日時: YYYYMMDD hhmiss
1835function setFormatDateTime(obj) {
1836//    Validator.init(obj);
1837    if (obj.value == null || obj.value == "") {
1838        return;
1839    }
1840
1841    try {
1842        obj.value = toDateTime(obj.value, true);
1843    } catch (e) {
1844        if (e instanceof ExDateTimeException) {
1845            Validator.output(obj, e.message);
1846        } else {
1847            throw e;
1848        }
1849    }
1850}
1851
1852function toDateTime(value, throwException) {
1853    if (value == null || value == "") {
1854        return;
1855    }
1856
1857    try {
1858        value = Validator.tohalf(value);
1859        var date = new ExDateTime().parseDate(value, true);
1860        return ExDateTimeUtils.format(date, "Y/m/d H:i:s");
1861    } catch(e) {
1862        if (throwException) {
1863            throw e;
1864        } else {
1865            return value;
1866        }
1867    }
1868}
1869
1870//日時: YYYYMMDD hhmi
1871function setFormatDateHourMinutes(obj) {
1872//    Validator.init(obj);
1873    if (obj.value == null || obj.value == "") {
1874        return;
1875    }
1876
1877    try {
1878        obj.value = toDateHourMinutes(obj.value, true);
1879    } catch (e) {
1880        if (e instanceof ExDateTimeException) {
1881            Validator.output(obj, e.message);
1882        } else {
1883            throw e;
1884        }
1885    }
1886}
1887
1888function toDateHourMinutes(value, throwException) {
1889    if (value == null || value == "") {
1890        return;
1891    }
1892
1893    try {
1894        value = Validator.tohalf(value);
1895        var date = new ExDateTime().parseDateHourMinutes(value);
1896        return ExDateTimeUtils.format(date, "Y/m/d H:i");
1897    } catch(e) {
1898        if (throwException) {
1899            throw e;
1900        } else {
1901            return value;
1902        }
1903    }
1904}
1905
1906//日時: YYYYMMDD hhmiss sss
1907function setFormatTimestamp(obj) {
1908//    Validator.init(obj);
1909    if (obj.value == null || obj.value == "") {
1910        return;
1911    }
1912
1913    try {
1914        obj.value = toTimestamp(obj.value, true);
1915    } catch (e) {
1916        if (e instanceof ExDateTimeException) {
1917            Validator.output(obj, e.message);
1918        } else {
1919            throw e;
1920        }
1921    }
1922}
1923
1924function toTimestamp(value, throwException) {
1925    if (value == null || value == "") {
1926        return;
1927    }
1928
1929    try {
1930        value = Validator.tohalf(value);
1931        var date = new ExDateTime().parseTimestamp(value, true);
1932        return ExDateTimeUtils.format(date, "Y/m/d H:i:s f");
1933    } catch(e) {
1934        if (throwException) {
1935            throw e;
1936        } else {
1937            return value;
1938        }
1939    }
1940}
1941
1942// 時刻: hhmm形式
1943function setFormatTime(obj) {
1944//    Validator.init(obj);
1945    if (obj.value == null || obj.value == "") {
1946        return;
1947    }
1948
1949    try {
1950        obj.value = toTime(obj.value, true);
1951    } catch (e) {
1952        if (e instanceof ExDateTimeException) {
1953            Validator.output(obj, e.message);
1954        } else {
1955            throw e;
1956        }
1957    }
1958}
1959
1960function toTime(value, throwException) {
1961    if (value == null || value == "") {
1962        return;
1963    }
1964
1965    try {
1966        value = Validator.tohalf(value);
1967        var date = new ExDateTime().parseTime(value);
1968        return ExDateTimeUtils.format(date, "H:i");
1969    } catch(e) {
1970        if (throwException) {
1971            throw e;
1972        } else {
1973            return value;
1974        }
1975    }
1976}
1977
1978/*********************************************************************************************************************************************/
1979/**  数字の補完: Form
1980/*********************************************************************************************************************************************/
1981/**
1982 * 指定された値をフォーマットして指定されたIDのエレメントに設定します。
1983 * @param id エレメントのID
1984 * @param value 指定値
1985 * @param n 小数点以下桁数
1986 * @param isSeparate カンマ区切りするか
1987 * @param isOverwrite 上書きするか
1988 */
1989function setFormatNumber(id, value, n, isSeparate, isOverwrite) {
1990    if (value == null || value == undefined || value == "") {
1991        return;
1992    }
1993
1994    var element = document.getElementById(id);
1995    if (isNullorUndefined(element)) {
1996        return;
1997    }
1998
1999    try {
2000
2001        if (element.value != undefined) {
2002            if (isOverwrite == false && element.value != "") {
2003                return;
2004            }
2005            var formatNumber = getFormatedNumberString(value, n, isSeparate);
2006            element.value = formatNumber;
2007        } else if (element.innerText != undefined) {
2008            if (isOverwrite == false && !isNullorUndefinedorEmpty(element.innerText)) {
2009                return;
2010            }
2011            if (isOverwrite == false && !isNullorUndefinedorEmpty(element.textContent)) {
2012                return;
2013            }
2014            var formatNumber = getFormatedNumberString(value, n, isSeparate);
2015            element.innerText = formatNumber;
2016            element.textContent = formatNumber;
2017        }
2018    } catch(e) {
2019        // 何もしない
2020    }
2021}
2022
2023/**
2024 * 指定された値をフォーマットされた値に変換して返却します。
2025 * @param value 指定値
2026 * @param n 小数点以下桁数
2027 * @param isSeparate カンマ区切りするか
2028 * @returns フォーマットされた文字列
2029 */
2030function getFormatedNumberString(value, n, isSeparate) {
2031    var fmt;
2032    if (isSeparate) {
2033        fmt = "#,##0";
2034    } else {
2035        fmt = "0";
2036    }
2037
2038    if(n != null && n > 0) {
2039        fmt += ".";
2040        for(var i=0 ; i < n; i++) {
2041            fmt += "0";
2042        }
2043    }
2044
2045    var numValue;
2046    try {
2047        var num = new ExNumber(value);
2048        numValue = num.toFormatString(fmt);
2049//        if ((n != null && n > 0) || (isSeparate != null && isSeparate == true)) {
2050            return numValue;
2051//        }
2052 //       return "";
2053    } catch(e) {
2054        throw e;
2055    }
2056
2057}
2058
2059/**
2060 * 文字列の中から特定の文字を削除した文字列を返却します。
2061 *
2062 * @param value 文字列
2063 * @param targets 削除したい文字列の配列
2064 */
2065function removeCharacters(value, targets) {
2066    if (isNullorUndefinedorEmpty(value) || isNullorUndefinedorEmpty(targets)) {
2067        return value;
2068    }
2069
2070    if (typeof(value) != 'string') {
2071        return value;
2072    }
2073
2074    if (Object.prototype.toString.call(targets) !== '[object Array]') {
2075        return value;
2076    }
2077
2078    for (key in targets) {
2079        value = value.replace(new RegExp(targets[key], "g"), "");
2080    }
2081    return value;
2082}
2083
2084/*********************************************************************************************************************************************/
2085/**  Parts: SubWindow関連
2086/*********************************************************************************************************************************************/
2087/**
2088 * モーダルで子画面表示
2089 *
2090 * showModalDialogで子画面を開くと子画面内でsubmit不可のためsubWindow.htmlをフレームとして使用する
2091 * @url : 遷移先URL
2092 * @titleString : 子画面タイトル
2093 * @s_width : 子画面幅
2094 * @s_height : 子画面高さ
2095 * @return : 子画面からのリターン値
2096 *
2097 */
2098function showSubModalWindow(url, titleString, s_width, s_height) {
2099    if (url == null || url == '') return '';
2100
2101    if (s_width == null) s_width = '1024';
2102    if (s_height == null) s_height = '768';
2103
2104    var arr = new Array();
2105    arr[0] = url;
2106    arr[1] = titleString;
2107    arr[2] = this;
2108
2109    var retVal;
2110    if (window.showModalDialog) {
2111        retVal = window.showModalDialog('contents/parts/calendar/subWindow.html', arr, 'status:no;scroll:no;help:no;dialogWidth:' + s_width + 'px;dialogHeight:' + s_height + 'px');
2112    }
2113
2114    if (typeof retVal == 'undefined') retVal='';
2115    if (typeof retVal == null) retVal='';
2116
2117    return retVal;
2118}
2119
2120/*
2121 * カレンダーのモーダルWindowの表示
2122 *   fromDate : 開始日時項目
2123 *   toDate   : 終了日時項目(nullを指定した場合はFROMのみの入力)
2124 *   setType  : 時間入力ありの場合はtrue、無しの場合はfalse
2125 */
2126function openCalendar(contextRoot, fromDate, toDate, setType) {
2127    var url = "";
2128    if (contextRoot != null && contextRoot != undefined && contextRoot != "") {
2129        url = contextRoot;
2130    }
2131
2132    url += "contents/parts/calendar/calendar.html?";
2133    url += "start_date=" + fromDate.value;
2134    url += "&start_date_field=" + fromDate.name;
2135
2136    var width;
2137    if (toDate == null) {
2138        url += "&end_date=";
2139        url += "&end_date_field=";
2140        width = 410;
2141    }
2142    else {
2143        url += "&end_date=" + toDate.value;
2144        url += "&end_date_field=" + toDate.name;
2145        width = 560;
2146    }
2147    if (setType) {
2148        url += "&time_selector=true";
2149    }
2150    else {
2151        url += "&time_selector=false";
2152    }
2153    url += "&seq=" + new Date().getTime();
2154
2155    var height = '390';
2156
2157
2158    var arr = new Array();
2159    arr[0] = url;
2160    arr[1] = '日付選択';
2161    arr[2] = this;
2162
2163    var retVal;
2164    if (window.showModalDialog) {
2165        retVal = showModalDialog(url, window, 'status:no;scroll:no;help:no;dialogWidth:' + width + 'px;dialogHeight:' + height + 'px');
2166    }
2167
2168    return false;
2169}
2170
2171/*********************************************************************************************************************************************/
2172/**  共通:その他ユーティリティ
2173/*********************************************************************************************************************************************/
2174function isArray(obj) {
2175  return !(
2176    !obj ||
2177    (!obj.length || obj.length == 0) ||
2178    typeof obj != 'object' ||
2179    !obj.constructor ||
2180    obj.nodeType ||
2181    obj.item
2182 );
2183}
2184
2185/**
2186 * 指定オブジェクトのページ内座標の取得
2187 * @obj    : 座標を取得するオブジェクト
2188 */
2189function getPagePosition(obj) {
2190    var pos = new Object();
2191    pos.x = obj.offsetLeft;
2192    pos.y = obj.offsetTop;
2193
2194    var parent = obj.parentNode;
2195    while(parent != null) {
2196        // TABLE関連のタグのOffset座標をオブジェクトのOffset座標に加算する
2197        if (parent.tagName == "TABLE" || parent.tagName == "TD" || parent.tagName == "TH") {
2198            pos.x += parent.offsetLeft;
2199            pos.y += parent.offsetTop;
2200        }
2201        parent = parent.parentNode;
2202    }
2203    return pos;
2204}
2205
2206function isEmpty(str) {
2207    if (str == null || trim(str) == "" || isUndefined(str)) return true;
2208    return false;
2209}
2210
2211function createElement(tag, id, name) {
2212    var str;
2213    var element = document.createElement(tag);
2214    if (!isEmpty(id)) {
2215        element.setAttribute("id", id);
2216    }
2217    if (!isEmpty(name)) {
2218        element.setAttribute("name", name);
2219    }
2220    return element;
2221}
2222
2223function isUndefined(obj) {
2224    return obj === undefined;
2225}
2226
2227function isDefined(obj) {
2228    return !isUndefined(obj);
2229}
2230
2231/**
2232 * 対象オブジェクトがNullか undefined か判定し、Nullか undefinedである場合trueを返却します。
2233 * @param obj オブジェクト
2234 * @returns 対象オブジェクトがNullか undefinedである場合true
2235 */
2236function isNullorUndefined(obj) {
2237    return isUndefined(obj) || obj === null;
2238}
2239
2240/**
2241 * 対象オブジェクトがNullか undefinedか 空文字か判定し、Nullか undefinedか 空文字である場合trueを返却します。
2242 * @param obj オブジェクト
2243 * @returns 対象オブジェクトがNullか undefinedか 空文字である場合true
2244 */
2245function isNullorUndefinedorEmpty(obj) {
2246    return isNullorUndefined(obj) || obj === "";
2247}
2248
2249/******************************************************************************************************************************/
2250/**  Keybord Eventクラス
2251/******************************************************************************************************************************/
2252var Keybord = {
2253    initialize: function() {
2254        setEventFunction(document, "onkeydown", this.onkeydown);
2255        setEventFunction(document, "onkeyup", this.onkeyup);
2256    },
2257
2258    onkeydown: function(e) {
2259        // Mozilla(Firefox, NN) and Opera
2260        if (e != null) {
2261            Keybord.keycode = e.which;
2262            Keybord.ctrl = isUndefined(e.modifiers) ? e.ctrlKey : e.modifiers & Event.CONTROL_MASK;
2263            Keybord.shift = isUndefined(e.modifiers) ? e.shiftKey : e.modifiers & Event.SHIFT_MASK;
2264        } else {
2265            Keybord.keycode = event.keyCode;
2266            Keybord.ctrl = event.ctrlKey;
2267            Keybord.shift = event.shiftKey;
2268        }
2269    },
2270
2271    onkeyup: function(e) {
2272        Keybord.ctrl = false;
2273        Keybord.shift = false;
2274    }
2275}
2276
2277/******************************************************************************************************************************/
2278/**  クリックイベント発生関数
2279/******************************************************************************************************************************/
2280function fireClick(id) {
2281    var obj = document.getElementById(id);
2282    if (obj.fireEvent) {
2283        obj.fireEvent("onclick");
2284    }
2285    else if (obj.dispatchEvent) {
2286        var evt = document.createEvent("MouseEvents");    // マウスイベントを作成
2287        evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, obj);                // イベントの詳細を設定
2288        obj.dispatchEvent(evt);
2289    }
2290}
2291
2292///**
2293// * 入力チェック
2294// */
2295//function formCheckAll(form) {
2296//    if (form == null || form == undefined) {
2297//        return false;
2298//    }
2299//
2300//    var isError = false;
2301//    for (var i = 0 ;i < form.elements.length; i++) {
2302//        obj = form.elements[i];
2303//        var type = obj.type;
2304//        var className = obj.className;
2305//        var value = obj.value;
2306//
2307//        if (type == 'text' || type == 'password') {
2308//            if (className.indexOf("REQUIRED_INPUT") >= 0) {
2309//                Validator.init(obj);
2310//                var checked = Validator.check(obj, "input");
2311//                if (!checked) {
2312//                    isError = true;
2313//                    continue;
2314//                }
2315//            }
2316//
2317//        } else if (type == 'textarea') {
2318//            if (className.indexOf("REQUIRED_TEXT_AREA") >= 0) {
2319//                Validator.init(obj);
2320//                var checked = Validator.check(obj, "input");
2321//                if (!checked) {
2322//                    isError = true;
2323//                    continue;
2324//                }
2325//            }
2326//        } else if (type == 'select-one') {
2327//            if (className.indexOf("REQUIRED_COMBO") >= 0) {
2328//                Validator.init(obj);
2329//                var checked = Validator.check(obj, "input");
2330//                if (!checked) {
2331//                    isError = true;
2332//                    continue;
2333//                }
2334//            }
2335//        } else if (type == 'select-multiple') {
2336//            if (className.indexOf("REQUIRED_SELECTLIST") >= 0) {
2337//                Validator.init(obj);
2338//                var checked = Validator.check(obj, "input");
2339//                if (!checked) {
2340//                    isError = true;
2341//                    continue;
2342//                }
2343//            }
2344//        }
2345//        if (value != null && value != undefined && value != "") {
2346//            if (type == 'text' || type == 'password') {
2347//                if (className.indexOf("MAIL_ADDRESS") >= 0) {
2348//                    Validator.init(obj);
2349//                    var checked = Validator.check(obj, "mail");
2350//                    if (!checked) {
2351//                        isError = true;
2352//                    }
2353//                } else if (className.indexOf("HALF_ENGLISH_NUMBER") >= 0) {
2354//                    Validator.init(obj);
2355//                    var checked = Validator.check(obj, "alphabetNumber");
2356//                    if (!checked) {
2357//                        isError = true;
2358//                    }
2359//                } else if (className.indexOf("HALF_ENGLISH") >= 0) {
2360//                    Validator.init(obj);
2361//                    var checked = Validator.check(obj, "alphabet");
2362//                    if (!checked) {
2363//                        isError = true;
2364//                    }
2365//                } else if (className.indexOf("FULL_PITCH_CHAR_KANA") >= 0) {
2366//                    Validator.init(obj);
2367//                    var checked = Validator.check(obj, "kana");
2368//                    if (!checked) {
2369//                        isError = true;
2370//                    }
2371//                } else if (className.indexOf("FULL_PITCH_CHAR") >= 0) {
2372//                    Validator.init(obj);
2373//                    var checked = Validator.check(obj, "zenkaku");
2374//                    if (!checked) {
2375//                        isError = true;
2376//                    }
2377//                } else if (className.indexOf("NUMBER") >= 0) {
2378//                    Validator.init(obj);
2379//                    var checked = Validator.check(obj, "num");
2380//                    if (!checked) {
2381//                        isError = true;
2382//                    }
2383//                } else if (className.indexOf("DATE_YYMM") >= 0) {
2384//                    // YYYY/MM
2385//                    Validator.init(obj);
2386//                    try {
2387//                        var date = new ExDateTime().parseYM(value);
2388//                    } catch (e) {
2389//                        isError = true;
2390//                        Validator.output(obj, e.message);
2391//                    }
2392//                } else if (className.indexOf("DATE_TIME") >= 0 || obj.className.indexOf("TIMESTAMP") >= 0) {
2393//                    // YYYY/MM/DD hh:mi:ss
2394//                    Validator.init(obj);
2395//                    try {
2396//                        var date = new ExDateTime().parseDate(value, true);
2397//                    } catch (e) {
2398//                        isError = true;
2399//                        Validator.output(obj, e.message);
2400//                    }
2401//                } else if (className.indexOf("DATE") >= 0) {
2402//                    // YYYY/MM/DD
2403//                    Validator.init(obj);
2404//                    try {
2405//                        var date = new ExDateTime().parseDate(value, false);
2406//                    } catch (e) {
2407//                        isError = true;
2408//                        Validator.output(obj, e.message);
2409//                    }
2410//                } else if (className.indexOf("TIME") >= 0) {
2411//                    Validator.init(obj);
2412//                    // hh:mi
2413//                    try {
2414//                        var date = new ExDateTime().parseTime(value);
2415//                    } catch (e) {
2416//                        isError = true;
2417//                        Validator.output(obj, e.message);
2418//                    }
2419//                }
2420//            }
2421//        }
2422//    }
2423//    return isError;
2424//}
2425
2426/**
2427 * 標準リストを制御するクラス
2428 */
2429var StandardList = function() {
2430    this.initialize.apply(this, arguments);
2431}
2432
2433StandardList.prototype = {
2434    /**
2435     * テーブルID
2436     */
2437    tableId: null,
2438
2439    /**
2440     * 対象テーブル
2441     */
2442    tableElement: null,
2443
2444    /**
2445     * 選択行オブジェクト
2446     */
2447    selectedRow: null,
2448
2449    /**
2450     * 移動時の行のスタイル
2451     */
2452    moveRowStyle: "MOUSE_OVER_DETAILS_ROW",
2453
2454    /**
2455     * 選択された行のスタイル
2456     */
2457    selectRowStyle: "SELECT_DETAILS_ROW",
2458
2459    /**
2460     * 初期化
2461     * @param tableId テーブルのID
2462     * @param table 対象テーブル
2463     * @param selectedRowId 初期選択行
2464     */
2465    initialize: function(tableId, table, selectedRowId) {
2466        this.tableId = tableId;
2467        this.tableElement = table;
2468        if (selectedRowId != null && selectedRowId != undefined) {
2469            this.selectRowById(selectedRowId);
2470        }
2471    },
2472
2473    /**
2474     * 行をRowIDから指定して選択します。
2475     * @param id RowID
2476     */
2477    selectRowById: function(id) {
2478        if (this.tableElement != null && this.tableElement != undefined && id != null && id != undefined) {
2479            var indexList = id.replace(this.tableId, "").split("_");
2480            var rows;
2481            if (indexList.length > 2) {
2482                if (!isNullorUndefined(this.tableElement[indexList[1]])) {
2483                    rows = this.tableElement[indexList[1]].rows;
2484                }
2485            } else {
2486                rows = this.tableElement[0].rows;
2487            }
2488            var row;
2489            if (!isNullorUndefined(rows)) {
2490                row = rows.namedItem(id);
2491            } else {
2492                row = document.getElementById(id);
2493            }
2494            if (!isNullorUndefined(row)) {
2495                this.selectRow(row);
2496                return true;
2497            }
2498        }
2499        return false;
2500    },
2501
2502    /**
2503     * 行の選択
2504     * @param object 選択された行オブジェクト
2505     */
2506    selectRow: function(object) {
2507        var selectedRow = this.getSelectedRowInSameDetails(object);
2508        if (!isNullorUndefined(selectedRow)) {
2509            this.changeRowStyle(selectedRow, "");
2510        }
2511        this.selectedRow = this.setSelectedRowInSameDetails(object);
2512        this.changeRowSelectColor(object);
2513    },
2514
2515    /**
2516     * 同明細の選択行の取得
2517     * @param object 選択された行オブジェクト
2518     */
2519    getSelectedRowInSameDetails: function(object) {
2520        var indexList = object.id.replace(this.tableId, "").split("_");
2521        var selectedRow;
2522        if (indexList.length > 2) {
2523            selectedRow = this.getSelectedRow(this.selectedRow, indexList, 1);
2524        } else {
2525            selectedRow = this.selectedRow;
2526        }
2527        return selectedRow;
2528    },
2529
2530    /**
2531     * 同明細の選択行の取得(再帰処理部)
2532     * @param object 選択された行オブジェクト
2533     * @param indexList インデックスリスト
2534     */
2535    getSelectedRow: function(elements, indexList, index) {
2536        if (index == indexList.length - 1) {
2537            return elements;
2538        } else {
2539            if (!isNullorUndefined(elements)) {
2540                return this.getSelectedRow(elements[indexList[index]], indexList, index + 1);
2541            }
2542        }
2543    },
2544
2545    /**
2546     * 同明細の選択行の取得
2547     * @param object 選択された行オブジェクト
2548     */
2549    setSelectedRowInSameDetails: function(object) {
2550        var indexList = object.id.replace(this.tableId, "").split("_");
2551        if (indexList.length > 2) {
2552            return this.setSelectedRow(this.selectedRow, indexList, 1, object, "");
2553        } else {
2554            return object;
2555        }
2556    },
2557
2558    /**
2559     * 同明細の選択行の取得(再帰処理部)
2560     * @param elements 現在選択行オブジェクト配列
2561     * @param indexList インデックスリスト
2562     * @param index インデックスリストのインデックス
2563     * @param object 選択された行オブジェクト
2564     * @param indexSymbol インデックスシンボル
2565     */
2566    setSelectedRow: function(elements, indexList, index, object, indexSymbol) {
2567        if (index == indexList.length - 1) {
2568            var indexElement = document.getElementById(this.tableId + "SelectedIndex" + indexSymbol);
2569            indexElement.value = indexList[index];
2570            return object;
2571        } else {
2572            if (isNullorUndefined(elements)) {
2573                elements = new Array();
2574            }
2575            indexSymbol = indexSymbol + "_" + indexList[index];
2576            elements[indexList[index]] = this.setSelectedRow(elements[indexList[index]], indexList, index + 1, object, indexSymbol);
2577            return elements;
2578        }
2579    },
2580
2581    /**
2582     * グリッドの行を移動する際に色を設定する
2583     * @param object 行オブジェクト
2584     */
2585    setRowMoveColor: function(object) {
2586        if (!this.checkSelectedRow(object)) {
2587            this.changeRowStyle(object, this.moveRowStyle);
2588        }
2589    },
2590
2591    /**
2592     * グリッドの行を離れる際、行の色をもとに戻す
2593     * @param object 行オブジェクト
2594     */
2595    resetRowMoveColor: function(object) {
2596        if (!this.checkSelectedRow(object)) {
2597            this.changeRowStyle(object, "");
2598        }
2599    },
2600
2601    /**
2602     * 対象行が選択中かをチェックする
2603     * @param object 行オブジェクト
2604     */
2605    checkSelectedRow: function(object) {
2606        var selectedRow = this.getSelectedRowInSameDetails(object);
2607        if (object == selectedRow) {
2608            return true;
2609        } else {
2610            return false;
2611        }
2612    },
2613
2614    /**
2615     * 選択されたグリッドの行の色を変更する
2616     * @param object 行オブジェクト
2617     */
2618    changeRowSelectColor: function(object) {
2619        this.changeRowStyle(object, this.selectRowStyle);
2620    },
2621
2622    /**
2623     * 行の色を変更する
2624     * @param object 行オブジェクト
2625     * @param className 色(空白の時は元の色(CSSなどã
2625§å®šç¾©ã•れている色)に戻す)
2626     */
2627    changeRowStyle: function(object, changeStyle) {
2628        if (object == undefined) {
2629            return;
2630        }
2631
2632        if (object.cells == undefined) {
2633            return;
2634        }
2635
2636        for (var i = 0; i < object.cells.length; i++) {
2637            var cell = object.cells[i];
2638
2639            this.changeCellStyle(cell, changeStyle);
2640            if (cell.hasChildNodes()) {
2641                for (var j = 0; j < cell.childNodes.length; j++) {
2642                    var childNode = cell.childNodes[j];
2643                    if (childNode.nodeType == 1) {
2644                        if (childNode.type == "text" || childNode.type == "password" || childNode.type == "select-one" || childNode.type == "select-multiple") {
2645                            this.changeCellStyle(childNode, changeStyle);
2646                        }
2647                    }
2648                }
2649            }
2650        }
2651    },
2652
2653    changeCellStyle: function(cell, changeStyle) {
2654        if (cell == null || cell == undefined) {
2655            return;
2656        }
2657
2658        var className = cell.className;
2659        if (changeStyle != "") {
2660            if (className.indexOf(this.moveRowStyle) >= 0 && changeStyle == this.selectRowStyle) {
2661                // 選択時は、移動スタイルをクリア
2662                className = className.replace(this.moveRowStyle, "");
2663            }
2664
2665            if (className.indexOf(this.selectRowStyle) >= 0 && changeStyle == this.moveRowStyle) {
2666                // 選択スタイルは移動スタイルで上書きしない
2667            } else {
2668                if (className.indexOf(changeStyle) < 0) {
2669                    className = className + " " + changeStyle;
2670                }
2671            }
2672        } else {
2673            // クリア
2674            if (className != null && className != undefined && className != "") {
2675                className = className.replace(this.selectRowStyle, "");
2676                className = className.replace(this.moveRowStyle, "");
2677                className = className.replace("  ", " ");
2678            }
2679        }
2680
2681        cell.className = className;
2682    },
2683
2684    /**
2685     * セルの色を親ノードと同一の色にします。
2686     */
2687    cellColorToParentNodeColor: function(cell) {
2688        if (cell != null && cell != undefined && cell.parentNode) {
2689            cell.style.background = cell.parentNode.style.background;
2690        }
2691    }
2692}
2693
2694/**
2695 * 指定されたURLのサブウィンドウダイアログを表示します。
2696 * @param url URL(encodeされます)
2697 * @param width ダイアログ幅(px)
2698 * @param height ダイアログ高さ(px)
2699 * @param target Window Target名
2700 */
2701function openWindow(url, width, height, target) {
2702    return openModalWindow(url, width, height, target);
2703}
2704
2705/**
2706 * ポップアップダイアログを閉じます。
2707 */
2708function windowClose() {
2709    window.close();
2710}
2711
2712/**
2713 * 指定されたURLのサブウィンドウダイアログをモードレスで表示します。
2714 * @param url URL(encodeされます)
2715 * @param width ダイアログ幅(px)
2716 * @param height ダイアログ高さ(px)
2717 * @param target Window Target名
2718 */
2719function openModelessWindow(url, width, height, target) {
2720    if (url == null || url == undefined) {
2721        return;
2722    }
2723
2724    width = width || 1024;
2725    height = height || 768;
2726    if (isNullorUndefined(target)) {
2727        target = "_blank";
2728    }
2729
2730    var win = window.open(encodeURI(url), target, "width=" + width + ", height=" + height + ",scrollbars=yes,resizable=yes,status=no");
2731    win.focus();
2732
2733    return win;
2734}
2735
2736/**
2737 * 指定されたURLのサブウィンドウダイアログをモーダルで表示します。
2738 * @param url URL(encodeされます)
2739 * @param width ダイアログ幅(px)
2740 * @param height ダイアログ高さ(px)
2741 * @param target Window Target名
2742 */
2743function openModalWindow(url, width, height, target) {
2744    if (url == null || url == undefined) {
2745        return;
2746    }
2747    width = width || 1024;
2748    height = height || 768;
2749
2750    var option = "status:no;resizable:yes;scroll:yes;help:no;dialogWidth:" + width + "px;dialogHeight:" + height + "px";
2751    return showModalDialog(encodeURI(url), window, option);
2752}
2753
2754/**
2755 * GETパラメータ(文字列)を取得します。[?以降を取得します。]
2756 * @returns GETパラメータの連想配列
2757 */
2758function getGetParameterString() {
2759    if(location.search.length > 1) {
2760        return location.search.substr(1);
2761    } else {
2762        return "";
2763    }
2764}
2765
2766/**
2767 * GETパラメータを取得します。
2768 * @returns GETパラメータの連想配列
2769 */
2770function getGetParameter() {
2771    var getParameter = getGetParameterString();
2772    if(!isNullorUndefinedorEmpty(getParameter)) {
2773        var get = new Object();
2774        var ret = getParameter.split("&");
2775        for(var i = 0; i < ret.length; i++) {
2776            var r = ret[i].split("=");
2777            get[r[0]] = r[1];
2778        }
2779        return get;
2780    } else {
2781        return new Object();
2782    }
2783}
2784
2785/**
2786 * 親のフィールドの指定したフィールドに指定した値を設定します。<br>
2787 * その際、指定があれば、親のフィールドにフォーカスを移動します。
2788 * @param parentId 親のフィールドID
2789 * @param value 設定する値
2790 * @param overwrite 上書きするか
2791 * @return 設定がされた場合true
2792 */
2793function setValueToParentWindowItem(parentId, value, overwrite) {
2794    var openerDocument = getOpenerDocument();
2795    if (openerDocument == null || openerDocument == undefined) {
2796        return false;
2797    }
2798
2799    var parentItem = openerDocument.getElementById(parentId);
2800    if (parentItem != null && parentItem != undefined) {
2801        if (parentItem.value != undefined) {
2802            if (overwrite || (!overwrite && parentItem.value == "")) {
2803                parentItem.value = value;
2804            }
2805        } else if (parentItem.innerText != undefined) {
2806            if (overwrite || (!overwrite && parentItem.innerText == "")) {
2807                parentItem.innerText = value;
2808            }
2809        } else if (parentItem.textContent != undefined) {
2810            if (overwrite || (!overwrite && parentItem.textContent == "")) {
2811                parentItem.textContent = value;
2812            }
2813        }
2814        return true;
2815    } else {
2816        // radioの可能性
2817        var elements = openerDocument.getElementsByName(parentId);
2818        if (!isNullorUndefined(elements) && elements.length > 0) {
2819            if (elements[0].type == "radio") {
2820                checkRadioElement(elements, value);
2821                return true;
2822            }
2823        }
2824        return false;
2825    }
2826}
2827
2828/**
2829 * 親のフィールドの指定したフィールドにフォーカスを移動します。
2830 * @param parentId 親のフィールドID
2831 */
2832function setFocusToParentWindowItem(parentId) {
2833    var parentItem = getParentItem(parentId);
2834    if (!isNullorUndefined(parentItem)) {
2835        parentItem.focus();
2836    }
2837}
2838
2839/**
2840 * 親のフィールドのアイテムを取得します。
2841 * @param parentId 親のフィールドID
2842 * @returns 親のフィールドのアイテム
2843 */
2844function getParentItem(parentId) {
2845    var openerDocument = getOpenerDocument();
2846    if (isNullorUndefined(openerDocument)) {
2847        return null;
2848    }
2849    var parentItem = openerDocument.getElementById(parentId);
2850    return parentItem;
2851}
2852
2853/**
2854 * 親WindowのDocumentオブジェクトを取得します。
2855 * @returns 親WindowのDocumentオブジェクト
2856 */
2857function getOpenerDocument() {
2858    if(window.dialogArguments) {
2859        opener = window.dialogArguments;
2860    } else if(window.opener){
2861        // FireFox対応
2862        opener = window.opener;
2863    } else if(window.parent.opener){
2864        // FireFox対応
2865        opener = window.parent.opener;
2866    }
2867
2868    if (opener == null) {
2869        return null;
2870    }
2871    var openerDocument = opener.document;
2872    return openerDocument;
2873}
2874
2875/**
2876 * 指定されたフォームアイテムに対し、クラス名の設定を行います。
2877 * @param id フォームID
2878 * @param className 指定クラス名
2879 */
2880function changeClassName(id, className) {
2881    var element = document.getElementById(id);
2882    if (element != null && element != undefined && element.className != undefined) {
2883        element.className = className;
2884    }
2885}
2886
2887/**
2888 * 指定されたフォームアイテムのクラス名をクリアします。
2889 * @param id フォームID
2890 */
2891function clearClassName(id) {
2892    changeClassName(id, "");
2893}
2894
2895/**
2896 * エレメントの値のコピーを行います。
2897 * @param from コピー元
2898 * @param to コピー先
2899 * @param isOverwrite 上書きするか
2900 */
2901function copyValueElements(from, to, isOverwrite) {
2902    var fromElement = document.getElementById(from);
2903    var toElement = document.getElementById(to);
2904    if (fromElement != null && fromElement != undefined && toElement != null && toElement != undefined) {
2905        if (isOverwrite) {
2906            toElement.value = fromElement.value;
2907        } else {
2908            if (toElement.value == null || toElement.value == "") {
2909                toElement.value = fromElement.value;
2910            }
2911        }
2912    }
2913}
2914
2915/**
2916 * 指定されたIDのコンボボックスを指定された値の選択値に切り替えます。
2917 * @param id コンボボックスID
2918 * @param value 指定値
2919 */
2920function selectCombobox(id, value) {
2921    var element = document.getElementById(id);
2922    var isSelect = false;
2923    if (element != null && element != undefined && element.options != undefined) {
2924        for (var i = 0; i < element.options.length; i++) {
2925            if (value == element.options[i].value) {
2926                element.selectedIndex = i;
2927                isSelect = true;
2928            }
2929        }
2930        if (!isSelect) {
2931            element.selectedIndex = -1;
2932        }
2933    }
2934}
2935
2936/**
2937 * 対象エレメントの値が空でないことを確認します。
2938 * @param element エレメント
2939 * @returns 空の場合true
2940 */
2941function isElementValueEmpty(element) {
2942    if (element != null && element != undefined && element.value != null &&
2943            element.value != undefined && element.value != "") {
2944        return false;
2945    } else {
2946        return true;
2947    }
2948}
2949
2950/**
2951 * 対象オブジェクトに紐づく子ノードを全て削除します。
2952 * コンボボックスのオプションをクリアする場合などに利用します。
2953 * @param x 対象オブジェクト
2954 */
2955function removeChildren(x) {
2956    if (isNullorUndefined(x)) {
2957        return;
2958    }
2959    if (x.hasChildNodes()) {
2960        while (x.childNodes.length > 0) {
2961            x.removeChild(x.firstChild)
2962        }
2963    }
2964}
2965
2966/**
2967 * エレメントのIDを指定し、指定されたIDのエレメント数値を加算して返却します。
2968 * @param 加算されるエレメントのID(複数指定可能)
2969 * @returns 加算された結果
2970 */
2971function plusForElements() {
2972    var total = 0;
2973    var isAllNaN = true;
2974    for (var i = 0; i < arguments.length; i++) {
2975        var id = arguments[i];
2976        var number = getElementValueNumber(id);
2977        if (!isNaN(number)) {
2978            isAllNaN = false;
2979            total += number;
2980        }
2981    }
2982
2983    if (isAllNaN) {
2984        return Number.NaN;
2985    } else {
2986        return total;
2987    }
2988}
2989
2990/**
2991 * エレメントのIDを指定し、指定されたIDのエレメント数値を減算して返却します。
2992 * 第一引数から、第二引数以降の値を減算します。
2993 * @param 減算されるエレメントのID(複数指定可能)
2994 * @returns 減算された結果
2995 */
2996function subtractForElements() {
2997    var total = 0;
2998    var isAllNaN = true;
2999    for (var i = 0; i < arguments.length; i++) {
3000        var id = arguments[i];
3001        var number = getElementValueNumber(id);
3002        if (!isNaN(number)) {
3003            if (i == 0) {
3004                total = number;
3005            } else {
3006                total -= number;
3007            }
3008            isAllNaN = false;
3009        }
3010    }
3011
3012    if (isAllNaN) {
3013        return Number.NaN;
3014    } else {
3015        return total;
3016    }
3017}
3018
3019/**
3020 * エレメントのIDを指定し、指定されたIDのエレメント数値を乗算して返却します。
3021 * @param 乗算されるエレメントのID(複数指定可能)
3022 * @returns 乗算された結果
3023 */
3024function multiplyForElements() {
3025    var total = 0;
3026    for (var i = 0; i < arguments.length; i++) {
3027        var id = arguments[i];
3028        var number = getElementValueNumber(id);
3029        if (isNaN(number)) {
3030            return Number.NaN;
3031        }
3032
3033        if (number == 0) {
3034            // 0は何回かけても0
3035            return 0;
3036        }
3037
3038        if (total == 0) {
3039            total = number;
3040        } else {
3041            total *= number;
3042        }
3043    }
3044    return total;
3045}
3046
3047/**
3048 * エレメントのIDを指定し、指定されたIDのエレメント数値を除算して返却します。
3049 * 第一引数から、第二引数以降の値を除算します。
3050 * @param 除算されるエレメントのID(複数指定可能)
3051 * @returns 除算された結果
3052 */
3053function divideForElements() {
3054    var total = 0;
3055    for (var i = 0; i < arguments.length; i++) {
3056        var id = arguments[i];
3057        var number = getElementValueNumber(id);
3058        if (isNaN(number)) {
3059            return Number.NaN;
3060        }
3061
3062        if (i == 0) {
3063            total = number;
3064            if (number == 0) {
3065                // 0は何回割っても0
3066                return 0;
3067            }
3068        } else {
3069            if (number == 0) {
3070                // 0割り不可
3071                return Number.NaN;
3072            }
3073            total /= number;
3074        }
3075    }
3076    return total;
3077}
3078
3079
3080/**
3081 * エレメントのIDを指定し、数値を取得します。
3082 * エレメントの値が数値でない場合、Number.NaNを返却します。
3083 * @param id エレメントのID
3084 * @returns エレメントの数値(or Number.NaN)
3085 */
3086function getElementValueNumber(id) {
3087    var idObjStr = getElementValue(id);
3088    return toNumber(idObjStr);
3089}
3090
3091/**
3092 * 文字列を数値に変換して返却します。
3093 * @param str 文字列
3094 * @returns 対象を数値変換した値(変換できなかった場合NaN)
3095 */
3096function toNumber(str) {
3097    if (!isNullorUndefinedorEmpty(str)) {
3098        var idNumber = new Number(removeCanma(str));
3099        if(!isNaN(idNumber)) {
3100            return idNumber;
3101        }
3102    }
3103    return Number.NaN;
3104}
3105
3106/**
3107 * エレメントのIDを指定し、値を文字列で取得します。
3108 * @param id エレメントのID
3109 * @returns エレメントの文字列
3110 */
3111function getElementValue(id) {
3112    var obj = document.getElementById(id);
3113    if (!isNullorUndefined(obj)) {
3114        if (obj.type == "checkbox") {
3115            if (obj.checked) {
3116                return "1";
3117            } else {
3118                return "0";
3119            }
3120        }
3121        return getValueFromElement(obj);
3122    } else {
3123        // radioまたはcheckboxesの可能性
3124        var elements = document.getElementsByName(id);
3125        if (!isNullorUndefined(elements) && elements.length > 0) {
3126            if (elements[0].type == "radio") {
3127                for(var i=0; i<elements.length; i++){
3128                    if (elements[i].checked) {
3129                        return elements[i].value;
3130                    }
3131                }
3132            } else if (elements[0].type == "checkbox") {
3133                var arr = [];
3134                for (var i = 0; i < elements.length; i++){
3135                    if(elements[i].checked)
3136                    arr.push(elements[i].value);
3137                }
3138                return arr.join(',');
3139            }
3140        }
3141
3142        // disabledの可能性
3143        var obj = document.getElementById(id + "_disabled_hidden");
3144        if (!isNullorUndefined(obj)) {
3145            return getValueFromElement(obj);
3146        }
3147
3148        // linkの可能性
3149        var obj = document.getElementById(id + "_link");
3150        if (!isNullorUndefined(obj)) {
3151            return getValueFromElement(obj);
3152        }
3153    }
3154}
3155
3156/**
3157 * エレメントから値を文字列で取得します。
3158 * @param element エレメント
3159 * @returns エレメントの文字列
3160 */
3161function getValueFromElement(element) {
3162    if (isNullorUndefined(element)) {
3163        return "";
3164    }
3165
3166    if (!isNullorUndefined(element.value)) {
3167        return element.value;
3168    } else if (!isNullorUndefined(element.innerText)) {
3169        return element.innerText;
3170    } else if (!isNullorUndefined(element.textContent)) {
3171        return element.textContent;
3172    } else {
3173        return "";
3174    }
3175}
3176
3177/**
3178 * valueと同一のエレメントにチェックをつけます。
3179 * @param elements radioのエレメント配列
3180 * @param value チェックする値
3181 */
3182function checkRadioElement(elements, value) {
3183    if (isNullorUndefined(elements)) {
3184        return;
3185    }
3186
3187    for (var i = 0; i < elements.length; i++) {
3188        var radioElement = elements[i];
3189        if (radioElement.value == value) {
3190            radioElement.checked = true;
3191            break;
3192        }
3193    }
3194}
3195
3196/**
3197 * 指定したエレメントのinnerTextを書き換えます。(label/textarea/pre/span/div etc.)
3198 * @param id エレメントのID
3199 * @param value 設定する値
3200 * @param isOverwrite 上書きするか
3201 */
3202function setInnerText(id, value, isOverwrite) {
3203    var element = document.getElementById(id);
3204    if (element != null && element != undefined) {
3205        if (isNullorUndefined(value)) {
3206            value = "";
3207        }
3208        if (element.type == 'textarea') {
3209            if (isOverwrite) {
3210                element.value = value;
3211            } else {
3212                if (element.value == null || element.value == "") {
3213                    element.value = value;
3214                }
3215            }
3216        } else {
3217            if (isOverwrite) {
3218                element.innerText = value;
3219                element.textContent = value;
3220            } else {
3221                if (isNullorUndefined(element.innerText)) {
3222                    element.innerText = value;
3223                } else if (isNullorUndefined(element.textContent)) {
3224                    // FireFox
3225                    element.textContent = value;
3226                }
3227            }
3228
3229        }
3230    }
3231}
3232
3233/**
3234 * 指定したエレメントのsrcを書き換えます。(img)
3235 * @param id エレメントのID
3236 * @param value 設定する値
3237 * @param isOverwrite 上書きするか
3238 */
3239function setSrc(id, value, isOverwrite) {
3240    var element = document.getElementById(id);
3241    if (element != null && element != undefined) {
3242        if (isNullorUndefined(value)) {
3243            value = "";
3244        }
3245        if(isOverwrite) {
3246            element.src = value;
3247        } else {
3248            if(element.src == null || element.src == "") {
3249                element.src = value;
3250            }
3251        }
3252    }
3253}
3254
3255/**
3256 * 指定したエレメントのvalueをコピーします。(label/textarea/pre/span/div etc.)
3257 * @param from コピー元エレメントのID
3258 * @param to コピー先エレメントのID
3259 * @param isOverwrite 上書きするか
3260 */
3261function copyInnerText(from, to, isOverwrite) {
3262    var fromElement = document.getElementById(from);
3263    var toElement = document.getElementById(to);
3264
3265    if (!isNullorUndefined(fromElement) && !isNullorUndefined(toElement)) {
3266        if(isOverwrite) {
3267            if (isNullorUndefined(fromElement.innerText)) {
3268                toElement.innerText = fromElement.innerText;
3269            } else if (isNullorUndefined(fromElement.textContent)) {
3270                // FireFox
3271                toElement.textContent = fromElement.textContent;
3272            }
3273        } else {
3274            if(toElement.innerText == null || toElement.innerText == "") {
3275                if (isNullorUndefined(fromElement.innerText)) {
3276                    toElement.innerText = fromElement.innerText;
3277                } else if (isNullorUndefined(fromElement.textContent)) {
3278                    // FireFox
3279                    toElement.textContent = fromElement.textContent;
3280                }
3281            }
3282        }
3283    }
3284}
3285
3286/**
3287 * 指定したエレメントのsrcをコピーします。(img)
3288 * @param from コピー元エレメントのID
3289 * @param to コピー先エレメントのID
3290 * @param isOverwrite 上書きするか
3291 */
3292function copySrc(from, to, isOverwrite) {
3293    var fromElement = document.getElementById(from);
3294    var toElement = document.getElementById(to);
3295
3296    if (fromElement != null && fromElement != undefined && toElement != null && toElement != undefined) {
3297        if(isOverwrite) {
3298            toElement.src = fromElement.src;
3299        } else {
3300            if(toElement.src == null || toElement.src == "") {
3301                toElement.src = fromElement.src;
3302            }
3303        }
3304    }
3305}
3306
3307/**
3308 * GETパラメータを取得します。
3309 * @returns GETパラメータの連想配列
3310 */
3311function getRequestParameter() {
3312    if(location.search.length > 1) {
3313        var get = new Object();
3314        var ret = location.search.substr(1).split("&");
3315        for(var i = 0; i < ret.length; i++) {
3316            var r = ret[i].split("=");
3317            get[r[0]] = r[1];
3318        }
3319        return get;
3320    } else {
3321    return;
3322    }
3323}
3324
3325/**
3326 * 名前を指定した要素の先頭を取得
3327 * @param name 要素名
3328 * @return 取得したelement
3329 */
3330function getFirstElement(name){
3331    var elements = document.getElementsByName(name);
3332    if (isNullorUndefined(elements) || elements.length == 0){
3333        return undefined;
3334    }
3335    return elements[0];
3336}
3337
3338/**
3339 * Debug用テキスト表示
3340 */
3341function writeDebugText(message) {
3342    var debugArea = document.createElement("div");
3343    var message = document.createTextNode(ExDateTimeUtils.format(new Date(), "Y/m/d H:i:s : ") + message);
3344    debugArea.appendChild(message);
3345    document.body.appendChild(debugArea);
3346}
3347
3348/**
3349 * 指定したIDのint値を取得します。
3350 * @param id ID
3351 * @returns int値
3352 */
3353function getIntValue(id) {
3354    var element = document.getElementById(id);
3355    if (element != null && element != undefined) {
3356        var intValue = parseInt(element.value);
3357        if (intValue != NaN) {
3358            return intValue;
3359        } else {
3360            return 0;
3361        }
3362    } else {
3363        return 0;
3364    }
3365}
3366
3367/**
3368 * 先頭を大文字に変換して返却します。
3369 * @param str 対象文字列
3370 * @returns 対象文字列の先頭を大文字にした文字列
3371 */
3372function capitalize(str) {
3373    if (isNullorUndefinedorEmpty(str)) {
3374        return "";
3375    }
3376
3377    return str.charAt(0).toUpperCase() + str.slice(1);
3378}
3379
3380/**
3381 * 有効な生年月日かどうか判定します。
3382 * @param targetDateText 判定対象日付
3383 * @param isIncludeToday 有効日付に今日を含めるか
3384 * @returns 有効ならtrue 無効ならfalse
3385 */
3386function isAvailableBirthDay(targetDateText, isIncludeToday) {
3387    var compareResult = compareDateWithToday(targetDateText);
3388    if (isIncludeToday) {
3389        if (compareResult == 0 || compareResult == 1) {
3390            return true;
3391        } else {
3392            return false;
3393        }
3394    } else {
3395        if (compareResult == 1) {
3396            return true;
3397        } else {
3398            return false;
3399        }
3400    }
3401}
3402
3403/**
3404 * 本日日付と比較して、比較対象日時の方が未来日の時は-1 等しい時は0  過去日の時は 1を返却します。
3405 * @param targetDateText 比較対象日時
3406 */
3407function compareDateWithToday(targetDateText) {
3408    var date = new Date(targetDateText);
3409    var now = new Date();
3410    var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
3411    return compareDate(today, date);
3412}
3413
3414/**
3415 * 2つの日付を比較して日付1の方が未来日の時は1 等しい時は0  過去日の時は -1を返却します。
3416 * @param targetDate1 日付1
3417 * @param targetDate2 日付2
3418 * @returns 比較結果
3419 */
3420function compareDate(targetDate1, targetDate2) {
3421    if (targetDate1 > targetDate2) {
3422        return 1;
3423    } else if ((targetDate1 - targetDate2) == 0){
3424        return 0;
3425    } else {
3426        return -1;
3427    }
3428}
3429
3430/**
3431 * サニタイズ関数です。
3432 * @param target サニタイズの対象です。文字列以外の場合はそのまま返却します。
3433 * @return サニタイズされた文字列(対象が文字列以外の場合は引数をそのまま返却)
3434 */
3435function escapeHTML(target) {
3436    if (isNullorUndefined(target)) {
3437        return target;
3438    }
3439
3440    if (typeof target != 'string') {
3441        return target;
3442    }
3443    target = target.replace(/</g, '&lt;');
3444    target = target.replace(/>/g, '&gt;');
3445    target = target.replace(/&/g, '&amp;');
3446    target = target.replace(/"/g, '&quot;');
3447    target = target.replace(/'/g, '&#039;');
3448    target = target.replace(/javascript:/g, '');
3449    return target;
3450}
3451
3452/**
3453 * 複数選択用のリストが少なくとも一つ選択されているか判定します。
3454 * @param id 項目ID
3455 * @param indexSymbol 項目のインデックスシンボル
3456 * @returns 複数選択用のリストが少なくとも一つ選択されている場合true
3457 */
3458function isMultipleSelect(id, indexSymbol) {
3459    var targetId = id;
3460    if (!isNullorUndefinedorEmpty(indexSymbol)) {
3461        targetId = id + indexSymbol;
3462    }
3463    var element = document.getElementById(targetId);
3464    if (isNullorUndefined(element)) {
3465        return;
3466    }
3467    if (isNullorUndefined(element.multiple) || !element.multiple) {
3468        return;
3469    }
3470    var multipleSelects = new Array();
3471    for (var i = 0; i < element.options.length; i++) {
3472        if (element.options[i].selected) {
3473            return true;
3474        }
3475    }
3476    return false;
3477}
3478
3479/**
3480 * 複数選択用のリストの選択を全て解除します。
3481 * @param id 項目ID
3482 * @param indexSymbol 項目のインデックスシンボル
3483 */
3484function releaseMultipleSelect(id, indexSymbol) {
3485    var targetId = id;
3486    if (!isNullorUndefinedorEmpty(indexSymbol)) {
3487        targetId = id + indexSymbol;
3488    }
3489
3490    var element = document.getElementById(targetId);
3491    if (isNullorUndefined(element)) {
3492        return;
3493    }
3494    if (isNullorUndefined(element.multiple) || !element.multiple) {
3495        return;
3496    }
3497    var multipleSelects = new Array();
3498    for (var i = 0; i < element.options.length; i++) {
3499        element.options[i].selected = false;
3500    }
3501}
3502
3503/**
3504 * 複数選択用のリストで選択されている値をリストで取得します。
3505 * @param id 項目ID
3506 * @param indexSymbol 項目のインデックスシンボル
3507 * @returns 選択されている値のリスト
3508 */
3509function getMultiSelectValues(id, indexSymbol) {
3510    var targetId = id;
3511    if (!isNullorUndefinedorEmpty(indexSymbol)) {
3512        targetId = id + indexSymbol;
3513    }
3514
3515    var element = document.getElementById(targetId);
3516    if (isNullorUndefined(element)) {
3517        return;
3518    }
3519    if (isNullorUndefined(element.multiple) || !element.multiple) {
3520        return;
3521    }
3522
3523    var values = new Array();
3524    for (var i = 0; i < element.options.length; i++) {
3525        var option = element.options[i];
3526        if (option.selected) {
3527            values.push(option.value);
3528        }
3529    }
3530    return values;
3531}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.