// ----------------------------------------------------------------------------
// Microsoft Internet Explorer?
function isIE() {
	return (navigator.appName == "Microsoft Internet Explorer");
}
// Implements function - event.srcElement of IE .
if (window.Event) {
	Event.prototype.__defineGetter__("srcElement", 
		function() {
    		var node = this.target;
    		while (node.nodeType != 1) {
    			node = node.parentNode;
    		}
    		return node;
    	}
    );
}
// Get/set text of <SPAN> .
function getSpanValue(id) {
	return document.getElementById(id).innerHTML;
}
function setSpanValue(id, text) {
	document.getElementById(id).innerHTML = text;
}
// Create element .
function createElem(tagName) {
	return document.createElement(tagName);
}
// Fill SELECT with string(v1=n1,v2=n2,...) .
function fillSelect(selectItem, optionData) {
	// Clear options .
	var i, n = selectItem.options.length;
	for (i = 0; i < n; i++) {
		selectItem.removeChild(selectItem.options[0]);
	}
	// Append options .
	if (optionData != "") {
		var optionPairs = optionData.split(";");
		for (i = 0; i < optionPairs.length; i++) {
			var pos = optionPairs[i].indexOf("=");
			if (pos != -1) {
				var optionElem = createElem("OPTION");
				optionElem.value = optionPairs[i].substr(0, pos);
				optionElem.text = optionPairs[i].substr(pos+1);
				if (isIE()) {
					selectItem.add(optionElem);
				} else {
					selectItem.appendChild(optionElem);
				}
			}
		}
	}
}
// Get main form .
function getMainForm() {
	return document.mainForm;
}
// Get root path .
function getRootPath() {
	return getMainForm().elements["context_path"].value;
}
// Submit main form with validation.
var __SUBMITTED__ = false;
function submitMain(action) { // -> submitData(action)
	var frmMain = getMainForm();
	if (checkForm(frmMain)) { //システムチェック
		if (!(typeof window.userCheck === 'undefined')) {
			if (!userCheck()) { //カスタマイズチェック
				return;
			}
		}
		frmMain.selects_info.value = getSelectsInfo(frmMain);
		submitHref(action);
	}
}
// Submit main form for paging .
function submitHref(action) { // -> submitOnly(action)
	var frmMain = getMainForm();
	frmMain.is_submitted.value = "true";
	submitLink(action);
}
// Submit main form for paging .
function submitLink(action) { // -> submitForm(action)
	var frmMain = getMainForm();
	frmMain.action = getRootPath() + action;
	if (!__SUBMITTED__) {
		__SUBMITTED__ = true;
		frmMain.submit();
	}
}
// Open new window .
function openWindow(action, features) {
	window.open(getRootPath() + action, "", features);
}
// Goto history .
function gotoBy(index) {
	var frmMain = getMainForm();
	frmMain.elements["history_goto"].value = index;
}
// Submit main form .
function submitPage() {
	var frmMain = getMainForm();
	frmMain.action = getRootPath() + frmMain.paging_action.value;
	frmMain.submit();
}
// Turn page (delta: -1 => Prev Page; 1 => Next Page; 0 => Query) .
function turnBy(delta) {
	var frmMain = getMainForm();
	var pageNo = parseInt(frmMain.paging_no.value);
	var pageNoDelta = parseInt(delta);
	frmMain.paging_no.value = pageNo + pageNoDelta;
	submitPage();
}
// Turn page .
function turnTo(pageNo) {
	var frmMain = getMainForm();
	frmMain.paging_no.value = pageNo;
	submitPage();
}
// Sort page .
function sortBy(order) {
	var frmMain = getMainForm();
	var item = frmMain.paging_order;
	item.value = order + (order == item.value? " DESC" : "");
	submitPage();
}
// Uncheck all items (radiobutton or checkbox) .
function uncheckItems(items) {
	for (var i = 0, n = items.length; i < n; i++) {
		items[i].checked = false;
	}
}
// Check all items (radiobutton or checkbox) .
function checkItems(items) {
	for (var i = 0, n = items.length; i < n; i++) {
		items[i].checked = true;
	}
}
// Get value of a group radios .
function getValueOfRadios(radioItems) {
	for (var i = 0; i < radioItems.length; i++) {
		if (radioItems[i].checked) {
			return radioItems[i].value;
		}
	}
	return "";
}
function disableRadios(radioItems, disable) {
	for (var i = 0; i < radioItems.length; i++) {
		radioItems[i].disabled = disable;
	}
}
// Add new item into form .
function addNewItem(itemForm, itemName, itemValue) {
	var item = document.createElement("INPUT");
	item.type = "hidden";
	item.name = itemName;
	item.value = itemValue;
	itemForm.appendChild(item);
	return item;
}
// Check values of specified form .
function checkForm(aForm) {
	var items = aForm.elements;
	for (var i = 0; i < items.length; i++) {
		var item = items[i];
		if (!item.disabled && item.getAttribute("label") != null) {
			if (item.tagName == "SELECT") {
				if (item.value == "") {
					item.focus();
					alert(item.getAttribute("label") + "を選択してください");
					return false;
				}
			}
			if (item.tagName == "INPUT" && item.type == "radio") {
				var subItems = items[item.name];
				var checked = false;
				for (var ri = 0; ri < subItems.length; ri++) {
					checked = checked || subItems[ri].checked;
				}
				if (!checked) {
					item.focus();
					alert(item.getAttribute("label") + "を選択してください");
					return false;
				}
			}
			if ((item.tagName == "TEXTAREA") || 
				(item.tagName == "INPUT" && (item.type == "text" || item.type == "password") && !item.readOnly)) {
				
				var value = item.value;
				if (item.tagName == "INPUT" && item.type == "text") {
					value = trim(value);
					item.value = value;
				}
				
				// 桁数チェック .
				if (item.getAttribute("range") != null) {
					var range = item.getAttribute("range");
					var pos = range.indexOf(",");
					if (pos == -1) {
						if (value != "" && value.length != range) {
							item.focus();
							alert(item.getAttribute("label") + "の桁数は" + range + "です");
							return false;
						}
						
					} else {
						if (value == "") {
							if (pos > 0) {
								item.focus();
								alert(item.getAttribute("label") + "を入力してください");
								return false;
							}
							
						} else {
							if (pos > 0) {
								var lbound = range.substr(0, pos);
								if (value.length < lbound) {
									item.focus();
									alert(item.getAttribute("label") + "の最小桁数は" + lbound + "です");
									return false;
								}
							}
							if (pos < range.length - 1) {
								var ubound = range.substr(pos+1);
								if (value.length > ubound) {
									item.focus();
									alert(item.getAttribute("label") + "の最大桁数は" + ubound + "です");
									return false;
								}
							}
						}
					}
				}
				// 全角と半角チェック .
				if (item.getAttribute("ctype") != null) {
					var ctype = item.getAttribute("ctype");
					var ctypeName = "";
					if (ctype == "zen") {
						for (var zi = 0; ctypeName == "" && zi < value.length; zi++) {
							if (!isZenkaku(value.charAt(zi))) {
								ctypeName = "全角";
							}
						}
						
					} else if (ctype == "han") {
						for (var hi = 0; ctypeName == "" && hi < value.length; hi++) {
							if (isZenkaku(value.charAt(hi))) {
								ctypeName = "半角";
							}
						}
						
					} else if (ctype == "flt") {
						if (!isFloat(value)) {
							//ctypeName = "フロート";
							ctypeName = "半角数字";
						}
						
					} else if (ctype == "int") {
						if (!isInteger(value)) {
							ctypeName = "整数";
						}
						
					} else if (ctype == "num") {
						if (!isPositive(value)) {
							ctypeName = "数字";
						}
						
					} else if (ctype == "no.") {
						if (!isNumber(value)) {
							ctypeName = "番号";
						}
						
					} else if (ctype == "mail") {
						if (!isMail(value)) {
							ctypeName = "メール";
						}
					} else if (ctype == "ymd") {
						if (!isYyyymmdd(value)) {
							ctypeName = "日付[yyyymmdd]";
						}
					}
					if (ctypeName != "") {
						item.focus();
						alert(item.getAttribute("label") + "に" + ctypeName + "を入力してください");
						return false;
					}
				}
				// 他のチェック .
				if (value != "" && item.getAttribute("valid") != null) {
					if (!eval(item.getAttribute("valid"))) {
						item.focus();
						alert(item.getAttribute("label"));
						return false;
					}
				}
			}
		}
	}
	return true;
}
// Create info of html:selects and html:input:radio .
function getSelectsInfo(aForm) {
	var selectsInfo = "";
	var items = aForm.elements;
	for (var i = 0; i < items.length; i++) {
		var item = items[i];
		if (item.tagName == "SELECT") {
			if (item.value != "") {
				if (selectsInfo != "") selectsInfo += ";";
				var text = item.options[item.selectedIndex].text;
				selectsInfo += item.name + "=" + text;
			}
		}
		if (item.tagName == "INPUT" && item.type == "radio") {
			if (item.checked) {
				if (selectsInfo != "") selectsInfo += ";";
				selectsInfo += item.name + "=" + item.getAttribute("text");
			}
		}
		if (item.tagName == "INPUT" && item.type == "hidden") {
			if (item.name == "hiddens_text") {
				if (selectsInfo != "") selectsInfo += ";";
				selectsInfo += item.value;
			}
		}
	}
	return selectsInfo;
}

// ----------------------------------------------------------------------------
// Spaces .
function getSpaces() {
	return " \t\n\r　";
}
// Trim string .
function trim(s) {
	if (s == "") return s;
	var spaceChars = getSpaces();
	var head, tail, size = s.length;
	for (head = 0; head < size; head++) {
		if (spaceChars.indexOf(s.charAt(head)) == -1) {
			break;
		}
	}
	if (head == size) {
		return "";
	}
	for (tail = size - 1; tail > head; tail--) {
		if (spaceChars.indexOf(s.charAt(tail)) == -1) {
			break;
		}
	}
	return s.substring(head, tail+1);
}
// Is starts with prefix? .
function startsWith(s, prefix) {
	if (s.length < prefix.length) {
		return false;
	}
	if (s.length > prefix.length) {
		s = s.substr(0, prefix.length);
	}
	return s == prefix;
}
// Is contains in array? .
function contains(s, array) {
	if (array != null) {
		for (var i = 0; i < array.length; i++) {
			if (s == array[i]) {
				return true;
			}
		}
	}
	return false;
}
// Is positive? [88888888] .
function isPositive(s) {
	return s == "" || s.match(/^\d+$/);
}
// Is integer? [-88888888] .
function isInteger(s) {
	return s == "" || s.match(/^-?\d+$/);
}
// Is float? [-888.88888] .
function isFloat(s) {
	return isInteger(s) || s.match(/^-?\d+\.?\d+$/);
}
// Is number? [0086-021-88888888] .
function isNumber(s) {
	return s == "" || s.match(/^[-\d]+$/);
}
// Is mail address? [user@mail.com] .
function isMail(s) {
	return s == "" || s.match(/^[\w\-\.]+@\w+[\w\-\.]*\.\w+$/);
}
// Is yyyymmdd? [20010101] .
function isYyyymmdd(s) {
	return s == "" || (/\d{8}/).test(s);
}
// Is zenkakau? .
function isCrLf(xb) {
	return (xb == '0D' || xb == '0A') || (xb == '000D' || xb == '000A');
}
function isZenkaku(s) {
	var result = true;
	var xb, xb2;
	var str = new String(s);
	for (var i = 0; i < str.length; i++) {
		// char -> %xx(0-255) or %uxxxx(255+)
		xb = escape(str.substring(i,i+1));
		if (xb.length == 3) {
			if ((navigator.appName.charAt(0) == "N")
					&& (navigator.appVersion.substring(0,4) >= "4.06")) {
				xb2 = xb.substring(1,3);
				if ( (("80" <= xb2) & (xb2<"A1")) | ("DF"<xb2) ) {
					result = true;
				} else {
					result = isCrLf(xb2); //false
					break;
				}
				
			} else {
				xb2 = xb.substring(1,3);
				if ( (("80"<=xb2) & (xb2<"A1")) | ("DF"<xb2) ) {
					i++;
					
				} else {
					result = isCrLf(xb2); //false
					break;
				}
			}
			
		} else {
			if (xb.length == 6) {
				if (xb.substring(0,2) == "%u") {
					xb2 = xb.substring(2,6);
					if ((xb2<"FF61") | ("FF9F" < xb2)) {
						result = true;
						
					} else {
						result = isCrLf(xb2); //false
						break;
					}
					
				} else {
					xb2 = xb.substring(1,3);
					if ( (("80"<=xb2) & (xb2<"A1")) | ("DF" < xb2) ) {
						result = true;
						
					} else {
						result = isCrLf(xb2); //false
						break;
					}
				}
				
			} else {
				if (xb.length == 4){
					xb2 = xb.substring(1,3);
					if ( (("80"<=xb2) & (xb2<"A1")) | ("DF"<xb2) ) {
						result = true;
						
					} else {
						result = isCrLf(xb2); //false
						break;
					}
					
				} else {
					if (xb.length != 1) {
						result = false;
						break;
					}
					result = false;
					break;
				}
			}
		}
	}
	return result;
}

// メッセージ画面印刷用 .
function openPrintWindow() {
	openWindow("/contents/jsp/print.jsp", 
		"width=705,height=650,toolbar=yes,scrollbars=yes"
		+",location=yes,menubar=yes,status=yes");
}
