
/*************************************************************************
 * 基本チェック（各画面から直接呼ばないこと）
 *************************************************************************/

/**
 * パラメータが存在しない(null)か空文字であればtrue.
 */
function isNullOrBlank(element) {
	return (!element || element.value=="");
}

/**
 * Emailチェック
 */
function isEmail(str) {
	// 文字チェック
	if (str.match(/[0-9a-zA-Z.@_-]+/g) != str) {
		return false;
	}
	// 形式チェック
	var check = /.+@.+\..+/;
	if (!str.match(check)) {
		return false;
	}
	// 文字数チェック
	if (!isLengthRange(str, 1, 60)) {
		return false;
	}
	return true;
}

/**
 * 半角英数字チェック
 * 0123456789,a〜z,A〜Zのみかをチェック出来ます。
 */
function isHankakuEisu(str) {
	return (str.match(/[0-9a-zA-Z]+/g) == str);
}

/**
 * 半角のID系文字列チェック.
 * 半角英数字とハイフン、アンダーバーチェック
 * 0123456789,a〜z,A〜Z,-,_のみかをチェック出来ます。
 */
function isHankakuID(str) {
	return (str.match(/[0-9a-zA-Z-_]+/g) == str);
}

/**
 * 数値チェック.
 * 空白はfalse.
 */
function isNumber(str) {
	// 空白だと0と判断されてしまうので最初にチェック
	var trimStr = replaceStr(str, " ", "");
	if (trimStr == "")  return false;
	// 数値チェック
	return !isNaN(trimStr);
}

/**
 * 数字＋ハイフンチェック
 * 0123456789,-のみかをチェック出来ます。
 */
function isNumberHyphen(str) {
	return (str.match(/[0-9-]+/g) == str);
}

/**
 * 文字数チェック
 * min 最小文字数
 * max 最大文字数
 */
function isLengthRange(str, min, max) {
	var length = str.length;
	if (length<min || max<length) {
		return false;
	}
	return true;
}

/**
 * 日付の妥当性チェック
 */
function isValidDateBase(y, m, d) {
	// 空白をブロックするためまずは数値チェック
	if (!isNumber(y) || !isNumber(m) || !isNumber(d)) {
		return false;
	}
	// 2037年以上はエラー
	if (y >= 2037) {
		return false;
	}
	var date = new Date(y, m-1, d);
	if (date.getFullYear()!=y || date.getMonth()!=m-1 || date.getDate()!=d) {
		return false;
	}
	return true;
}

/**
 * 日付の大小チェック
 */
function isValidPeriodBase(y1, m1, d1, y2, m2, d2) {
	// まずは妥当性チェック
	if (!isValidDateBase(y1, m1, d1))   return false;
	if (!isValidDateBase(y2, m2, d2))   return false;
	// 差を求める
	var date1 = new Date(y1, m1-1, d1);
	var date2 = new Date(y2, m2-1, d2);
	if (date2 - date1 < 0) {
		return false;
	}
	return true;
}

/**
 * 数値の大小チェック
 */
function isValidNumberRangeBase(num1, num2) {
	// まずは妥当性チェック
	if (!isNumber(num1))   return false;
	if (!isNumber(num2))   return false;
	// 大小チェック
	if (parseInt(num1) > parseInt(num2)) {
		return false;
	}
	return true;
}

/**
 * 日時の妥当性チェック
 */
function isValidDateTimeBase(y, m, d, h, mi, s) {
	// 空白をブロックするためまずは数値チェック
	if (!isNumber(y) || !isNumber(m) || !isNumber(d) ||
	    !isNumber(h) || !isNumber(mi) || !isNumber(s)) {
		return false;
	}
	// 2037年以上はエラー
	if (y >= 2037) {
		return false;
	}
	var date = new Date(y, m-1, d, h, mi, s);
	if (date.getFullYear()!=y || date.getMonth()!=m-1 || date.getDate()!=d ||
	    date.getHours()!=h || date.getMinutes()!=mi || date.getSeconds()!=s) {
		return false;
	}
	return true;
}

/**
 * 日時の大小チェック
 */
function isValidDateTimePeriodBase(y1, m1, d1, h1, mi1, s1, y2, m2, d2, h2, mi2, s2) {
	// まずは妥当性チェック
	if (!isValidDateBase(y1, m1, d1, h1, mi1, s1))   return false;
	if (!isValidDateBase(y2, m2, d2, h2, mi2, s2))   return false;
	// 差を求める
	var date1 = new Date(y1, m1-1, d1, h1, mi1, s1);
	var date2 = new Date(y2, m2-1, d2, h2, mi2, s2);
	if (date2 - date1 < 0) {
		return false;
	}
	return true;
}

/**
 * ファイル名チェック.
 * 半角英数字、ハイフン、アンダーバー、ドットのみOK.
 */
function isFileName(str) {
	return (str.match(/[a-zA-Z0-9][a-zA-Z0-9-_.]*/g) == str);
}

/*************************************************************************
 * 共通チェック（各画面から直接呼ばないこと）
 *************************************************************************/

/**
 * パスワード形式チェック
 */
function isPassword(element, word) {
	// 空ならOK
	if (isNullOrBlank(element)) {
		return true;
	}
	// 形式チェック
	if (!isHankakuID(element.value)) {
		errorElement(element);
		alert(createMsg(m_invalidFormat, word, "", ""));
		return false;
	}
	// 文字数チェック
	if (!isLengthRange(element.value, 6, 20)) {
		errorElement(element);
		alert(createMsg(m_invalidLength, word, "", ""));
		return false;
	}
	return true;
}

/**
 * コンテンツIDチェック
 */
function isContentsId(element, word) {
	// 空ならOK
	if (isNullOrBlank(element)) {
		return true;
	}
	// 形式チェック
	if (!isHankakuEisu(element.value)) {
		errorElement(element);
		alert(createMsg(m_invalidFormat, word, "", ""));
		return false;
	}
	// 文字数チェック
	if (!isLengthRange(element.value, 1, 16)) {
		errorElement(element);
		alert(createMsg(m_invalidLength, word, "", ""));
		return false;
	}
	return true;
}

/**
 * 商品コードチェック.
 * 半角英数、ハイフン、アンダーバー可.
 * 12桁以下であること.
 */
function isCommodityCd(element, word) {
	// 空ならOK
	if (isNullOrBlank(element)) {
		return true;
	}
	// 形式チェック
	if (!isHankakuID(element.value)) {
		errorElement(element);
		alert(createMsg(m_invalidFormat, word, "", ""));
		return false;
	}
	// 文字数チェック
	if (!isLengthRange(element.value, 1, 12)) {
		errorElement(element);
		alert(createMsg(m_invalidLength, word, "", ""));
		return false;
	}
	return true;
}


/*************************************************************************
 * 共通ユーティリティFunction（各画面から直接呼ばないこと）
 *************************************************************************/

/** エラー要素の背景色 */
var errorBgColor = "pink";

/** エラー発生前の色 */
var orgBgColor;

/**
 * エラーが発生したフォームエレメントを変化させる.
 * 背景色を変えて、フォーカスをあてる.
 */
function errorElement(element) {
	orgBgColor = element.style.backgroundColor;
	element.style.backgroundColor = errorBgColor;
	element.focus();
}

/**
 * エラーが発生したフォームエレメントを変化させる.
 * 背景色を変えて、フォーカスをあてる.
 * elementが複数あるパターン.
 * elements 要素の配列
 */
function errorElements(elements) {
	for (i=0 ; i<elements.length ; i++) {
		orgBgColor = elements[i].style.backgroundColor;
		elements[i].style.backgroundColor = errorBgColor;
	}
	elements[0].focus();
}

/**
 * エラーで背景色が変わったものを元に戻す.
 */
function errorClear(myform) {
	for (i=0 ; i<myform.elements.length ; i++) {
		if (myform.elements[i].style.backgroundColor == errorBgColor) {
			myform.elements[i].style.backgroundColor = orgBgColor;
		}
	}
}

/**
 * 文字列の置換.
 * {}にも対応.
 */
function replaceStr(orgStr, before, after) {
	orgStr = orgStr.split(before);
	orgStr = orgStr.join(after);
	return orgStr;
}

/**
 * {0}{1}{2}を置換してメッセージを作成する.
 */
function createMsg(orgMsg, param0, param1, param2) {
	orgMsg = replaceStr(orgMsg, "{0}", param0);
	orgMsg = replaceStr(orgMsg, "{1}", param1);
	orgMsg = replaceStr(orgMsg, "{2}", param2);
	return orgMsg;
}

