<!--
// Regular Expressions
//var dateRegexp = new RegExp('^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})$');
//var numberRegexp = new RegExp('^[\\-\\d\\.+,]+$');
//var alphaNumericsRegexp = new RegExp('^[0-9a-zA-Z]+$');
function CheckData(swo, action) {
	this.swo = swo;
	this.updateDatas = null;
	this.searchData = function(action) {
		var _checkDatasSpan = getChildTag(document.body, 'SPAN', 'nj:checkdatas', false);
		if (_checkDatasSpan == null) return;
		var _swoSpans = _checkDatasSpan.childNodes;
		if (_swoSpans == null) return;
		var _swoSpan = null;		
		for (var j=0; j<_swoSpans.length; j++) {
			if (_swoSpans[j].tagName == 'SPAN' && TAG_ATTRIBUTE.getNjType(_swoSpans[j]) == 'nj:checkdata') {
				var _swo = TAG_ATTRIBUTE.getNjSwo(_swoSpans[j]);
				if (_swo == this.swo) {
					_swoSpan = _swoSpans[j];
					break;
				}
			}
		}
		if (_swoSpan == null) return;
		var _children = _swoSpan.childNodes;
		if (_children == null) return;
		for (var i=0; i<_children.length; i++) {
			var _child = _children[i];
			if (_child.getAttribute(TAG_ATTRIBUTE.NJ_ACTION, 1) == action) {
				var _updateData = _child.getAttribute(TAG_ATTRIBUTE.NJ_UPDATE_DATA, 1);
				if (isNotNullString(_updateData)) {
					this.addUpdateData(_updateData.split(','));
				}
				break;
			}
		}
	}
	this.addUpdateData = function(addDataList) {
		if (addDataList == null) return;
		if (this.updateDatas == null) {
			this.updateDatas = addDataList;
		} else {
			for (var i=0; i<addDataList.length; i++) {
				var _found = false;
				for (var j=0; j<this.updateDatas.length; j++) {
					if (this.updateDatas[j] == addDataList[i]) {
						_found = true;
						break;
					}
				}
				if (!_found) {
					this.updateDatas.push(addDataList[i]);
				}
			}
		}
	}
	this.addTo = function(checkDataList) {
		var _found = false;
		for (var i=0; i<checkDataList.length; i++) {
			var _checkData = checkDataList[i];
			if (_checkData.swo == this.swo) {
				_checkData.addUpdateData(this.updateDatas);
				_found = true;
			}
		}
		if (!_found) {
			checkDataList.push(this);
		}
	}
	//---- initialize ----
	if (isNullString(this.swo)) {
		this.swo = Swo.name;
	}
	this.searchData(action);
	return this;
}
function checkNinjavaInputValue(checkDataList, checkNullable) {
	if (checkDataList == null || checkDataList.length == 0) return true;
	var _checkedElementNameList = new Array();
	for (var i=0; i<document.forms.length; i++) {
		var _els = document.forms[i].elements;
		if (_els != null) {
			for (var j=0; j<_els.length; j++) {
				var _e = _els[j];
				if (_e.disabled) continue;
				if (isNullString(_e.name)) continue;
				var _type = _e.type;
				if (_type == 'file' && Browser.isMSIE() && OS.isWindows()) {
					if (!ninjavaCheckFileElement(_e.value)) {
						_e.focus();
						return false;
					}
				}
				if (_type != 'text' && _type != 'password' && _type != 'textarea'
				  && _type != 'select-one' && _type != 'radio' && _type != 'checkbox') continue;
				var _found = false;
				for (var k=0; k<checkDataList.length; k++) {
					var _checkData = checkDataList[k];
					if (_checkData.updateDatas != null) {
						var _swo = _checkData.swo;
						for (var l=0; l<_checkData.updateDatas.length; l++) {
							var _updateData = _checkData.updateDatas[l];
							if (startsWith(_e.name, 'tl_' + _swo + '::' + _updateData + '__')) {
								_found = true;
								break;
							}
						}
					}
					if (_found) break;
				}
				if (_found) {
					if (contains(_checkedElementNameList, _e.name)) {
						continue;
					}
					_checkedElementNameList.push(_e.name);
					// check data
					if (!ninjavaCheckElementSub(_e, checkNullable)) {
						setFocus(_e.name, false);
						return false;
					}
				}
			}
		}
	}
	return true;
}
function ninjavaCheckElementSub(inputElement, checkNullable) {
	var _type = inputElement.type;
	var _v = inputElement.value;
	var _caption = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_CAPTION, 1);
	if (_type == 'text' || _type == 'password' || _type == 'textarea') {
		return ninjavaCheckTextElement(inputElement, _v, _caption, checkNullable);
	} else if (_type == 'select-one') {
		return ninjavaCheckSelectionListElement(inputElement, _v, _caption, checkNullable);
	} else if (_type == 'radio') {
		return ninjavaCheckRadioButtonElement(inputElement, _v, _caption, checkNullable);
	} else if (_type == 'checkbox') {
		return ninjavaCheckCheckBoxElement(inputElement, _v, _caption, checkNullable);
	}
	return true;
}
function ninjavaCheckTextElement(inputElement, value, caption, checkNullable) {
	var _minLength = 0;
	if (checkNullable) {
		_minLength = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_MINLENGTH, 0);
		if (isNullString(_minLength)) _minLength = 0;
	}
	var _maxLength = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_MAXLENGTH, 0);
	if (isNullString(_maxLength)) _maxLength = 0;
	if (_minLength > 0 || _maxLength > 0)
		if (!ninjavaCheckLengthSub(inputElement, value, caption, _minLength, _maxLength)) return false;
	var _constraint = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_CONSTRAINT, 1);
	if (isNotNullString(_constraint)) {
		if (_constraint == 'REQUIRED_NUMERICS') {
			if (!ninjavaCheckNumberSub(inputElement, value, caption)) return false;
		} else if (_constraint == 'REQUIRED_YYYYMMDD') {
			if (!ninjavaCheckDateSub(inputElement, value, caption)) return false;
		} else if (_constraint == 'REQUIRED_YYYYMM') {
			if (!ninjavaCheckDateYYYYMMSub(inputElement, value, caption)) return false;
		} else if (_constraint == 'REQUIRED_ALPHA_NUMERICS') {
			if (!ninjavaCheckAlphaNumericsSub(inputElement, value, caption)) return false;
		} else if (_constraint == 'REQUIRED_SINGLE_BYTES') {
			if (!ninjavaCheckSingleBytesSub(inputElement, value, caption)) return false;
		} else if (_constraint == 'REQUIRED_DOUBLE_BYTES') {
			if (!ninjavaCheckDoubleBytesSub(inputElement, value, caption)) return false;
		} else if (_constraint == 'REQUIRED_SINGLE_BYTES_WITHOUT_KANA') {
			if (!ninjavaCheckSingleBytesWithoutKanaSub(inputElement, value, caption)) return false;
		}
	}
	var _regexp = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_REGEXP, 1);
	if (isNotNullString(_regexp)) {
		if (!ninjavaCheckRegexpSub(inputElement, value, caption, _regexp)) return false;		
	}
	return true;
}
function ninjavaCheckSelectionListElement(inputElement, value, caption, checkNullable) {
	var _minLength = 0;
	if (checkNullable) {
		_minLength = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_MINLENGTH, 0);
		if (isNullString(_minLength)) _minLength = 0;
	}
	if (_minLength <= 0) return true;
	var _chk = true;
	if (inputElement.selectedIndex < 0) {
		_chk = false;
	} else {
		var v = inputElement.options[inputElement.selectedIndex].value;
		if (isNullString(v)) {
			_chk = false;
		}
	}
	if (!_chk) {
		alert(MSG.JS_NOT_SELECT_ERR.replace(/\{0\}/, caption));
		return false;
	}
	return true;
}
function ninjavaCheckRadioButtonElement(inputElement, value, caption, checkNullable) {
	var _minLength = 0;
	if (checkNullable) {
		_minLength = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_MINLENGTH, 0);
		if (isNullString(_minLength)) _minLength = 0;
	}
	if (_minLength <= 0) return true;
	//var _parentSpan = getParentTag(inputElement, 'SPAN', null);
	//if (_parentSpan == null) return true;
	//
	//var _children = _parentSpan.childNodes;
	//if (_children == null) return true;
	var _formTag = getParentTag(inputElement, 'FORM', null);
	if (_formTag == null) return true;
	var _children = _formTag.elements[inputElement.name];
	if (_children == null) return false;
	var _checked = false;
	if (_children.length > 0) {
		for (var i=0; i<_children.length; i++) {
			var _child = _children[i];
			if (_child.type == 'radio') {
				if (_child.checked) {
					_checked = true;
					break;
				}
			}
		}
	} else {
		if (_children.type == 'radio' && _children.checked) {
			_checked = true;
		}
	}
	if (!_checked) {
		alert(MSG.JS_NOT_SELECT_ERR.replace(/\{0\}/, caption));
		return false;
	}
	return true;
}
function ninjavaCheckCheckBoxElement(inputElement, value, caption, checkNullable) {
	var _minLength = 0;
	if (checkNullable) {
		_minLength = inputElement.getAttribute(TAG_ATTRIBUTE.NJ_MINLENGTH, 0);
		if (isNullString(_minLength)) _minLength = 0;
	}
	if (_minLength <= 0) return true;
	if (inputElement.checked == false) {
		alert(MSG.JS_NOT_SELECT_ERR.replace(/\{0\}/, caption));
		return false;
	}
	return true;
}
function ninjavaCheckFileElement(filename) {
	if (isNullString(filename)) return true;
	if (! filename.match(CONST.UPLOAD_FILE_REGEXP)) {
		alert(MSG.JS_UPLOAD_FILE_ERR.replace(/\{0\}/, filename));
		return false;
	}
	return true;
}
// Checks length of string.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @param minLength minimum length of string.
// @param maxLength maximum length of string.
// @return true: error not found., false:error found.
function ninjavaCheckLengthSub(element, v, captionName, minLength, maxLength) {
	var chk=true;
	if (isNullString(v)) {
		if (minLength > 0) {
			alert(MSG.JS_NOT_INPUT_ERR.replace(/\{0\}/, captionName));
			chk = false;
		}
	} else {
		v = v.replace(/^\\s+|\\s+$/g, '');
		if (minLength >= 0 && v.length < minLength) {
			if (minLength == 1) {
				alert(MSG.JS_NOT_INPUT_ERR.replace(/\{0\}/, captionName));
			} else {
				alert(MSG.JS_MIN_LENGTH_ERR.replace(/\{0\}/, captionName).replace(/\{1\}/, minLength));
			}
			chk = false;
		} else if (maxLength > 0 && v.length > maxLength) {
			alert(MSG.JS_MAX_LENGTH_ERR.replace(/\{0\}/, captionName).replace(/\{1\}/, maxLength));
			chk = false;
		}
	}
	return chk;
}
// Validates number.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckNumberSub(element, v, captionName) {
	if (!checkNumberValue(v)) {
		alert(MSG.JS_NUMBER_FORMAT_ERR.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Validates Single-Byte string.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckSingleBytesSub(element, v, captionName) {
	if (!checkSingleBytes(v)) {
		alert(MSG.JS_SINGLE_BYTES_ONLY.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Validates Single-Byte-Without-Kana string.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckSingleBytesWithoutKanaSub(element, v, captionName) {
	if (!checkSingleBytesWithoutKana(v)) {
		alert(MSG.JS_SINGLE_BYTES_ONLY_WITHOUT_KANA.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Validates Alphabet-or-Number string.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckAlphaNumericsSub(element, v, captionName) {
	if (!checkAlphaNumerics(v)) {
		alert(MSG.JS_ALPHA_NUMERICS_ONLY.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Validates Double-Byte string.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckDoubleBytesSub(element, v, captionName) {
	if (!checkDoubleBytes(v)) {
		alert(MSG.JS_DOUBLE_BYTES_ONLY.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Checks date (YYYY/MM/DD format).
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckDateSub(element, v, captionName) {
 if (!checkDate(v)) {
		alert(MSG.JS_DATE_FORMAT_ERR.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Checks date (YYYY/MM format).
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @return true: error not found., false:error found.
function ninjavaCheckDateYYYYMMSub(element, v, captionName) {
	if (isNotNullString(v)) {
		if (!checkDate(v+'/01')) {
			alert(MSG.JS_DATE_FORMAT_ERR.replace(/\{0\}/, captionName));
			return false;
		}
	}
	return true;
}
// Validates regular expression.
//
// @param element element.
// @param v value
// @param captionName caption when error occurs.
// @param regexp regular expression
// @return true: error not found., false:error found.
function ninjavaCheckRegexpSub(element, v, captionName, regexp) {
	if (!checkRegexp(v, regexp)) {
		alert(MSG.JS_FORMAT_ERR.replace(/\{0\}/, captionName));
		return false;
	}
	return true;
}
// Checks date(yyyy/MM/dd format).
//
// @param ymd date formated string
// @return true:error not found., false:error found.
function checkDate(ymd) {
	if (isNullString(ymd)) return true;
	// check by using regexp
	if (! ymd.match(CONST.DATE_REGEXP)) {
		return false;
	}
	var yy1 = RegExp.$1;
	var mm1 = RegExp.$2;
	var dd1 = RegExp.$3;
	if (mm1.length == 1) {
		mm1 = "0" + mm1;
	}
	if (dd1.length == 1) {
		dd1 = "0" + dd1;
	}
	var ymd1 = yy1 + mm1 + dd1;
	// check year
	//if ((ymd1 < "00000101") || (ymd1 > "99991231")) {
	//	return false;
	//}
	// check month
	if ((mm1 < "01") || (mm1 > "12")) {
		return false;
	}
	// check day
	if (dd1 > "31" || dd1 < "01") {
		return false;
	}
	if (mm1 == "04" || mm1 == "06" || mm1 == "09" || mm1 == "11") {
		if (dd1 > "30") {
			return false;
		}
	}
	if (mm1 == "02") {
		if (((yy1 % 4 == 0) && (yy1 % 100 != 0)) || ((yy1 % 4 == 0) && (yy1 % 400 == 0))) {
			if (dd1 > "29") {
				return false;
			}
		} else if (dd1 > "28") {
			return false;
		}
	}
	return true;
}
// Validates number.
//
// @param text	string for validate
// @return true:error not found., false:error found.
function checkNumberValue(text) {
	if (isNullString(text)) return true;
	return text.match(CONST.NUMBER_REGEXP);
}
// Validates Single-Byte-Kana string.
//
// @param text	string for validate
// @return true:Single-Byte-Kana., false:not Single-Byte-Kana character are found.
function checkSingleBytes(text) {
	if (isNullString(text)) return true;
	for (var i=0; i<text.length; i++) {
		var c = text.charCodeAt(i);
		if (!(32 <= c && c <= 127) && !(65377 <= c && c <= 65439)) {
			// 65377 - 65439 is single-byte-kana
			return false;
		}
	}
	return true;
}
// Validates Single-Byte-Without-Kana string.
//
// @param text	string for validate
// @return true:Single-Byte-Without-Kana., false:not Single-Byte-Without-Kana character are found.
function checkSingleBytesWithoutKana(text) {
	if (isNullString(text)) return true;
	for (var i=0; i<text.length; i++) {
		var c = text.charCodeAt(i);
		if (!(32 <= c && c <= 127)) {
			return false;
		}
	}
	return true;
}
// Validates Alphabet-or-Number string.
//
// @param text	string for validate
// @return true:Alphabet-or-Number., false:not Alphabet-or-Number character are found.
function checkAlphaNumerics(text) {
	if (isNullString(text)) return true;
	return text.match(CONST.ALPHA_NUMERICS_REGEXP);
}
// Validates Double-Byte-Kana string.
//
// @param text	string for validate
// @return true:Double-Byte-Kana., false:not Double-Byte-Kana character are found.
function checkDoubleBytes(text) {
	if (isNullString(text)) return true;
	for (var i=0; i<text.length; i++) {
		var c = text.charCodeAt(i);
		if ((c <= 127) || (65377 <= c && c <= 65439)) {
			// 65377 - 65439 is single-byte-kana
			return false;
		}
	}
	return true;
}
// Matches string to regular expression.
//
// @param text	string for validate
// @param chkRegexp	regular expression
// @return true:match to regular expression., false:unmatch to regular expression.
function checkRegexp(text, chkRegexp) {
	if (isNullString(text)) return true;
	var reg = new RegExp(chkRegexp);
	return text.match(reg);
}
//-->

