PageSourceSearch

https://7beauty-academy.com/contents/js/standard.js?var=20261004

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

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.