// 左右の余白削除（trim関数）
function jsTrim(strVal) {
    // [ ]全括弧内に半角スペースと全角スペースを指定
    return String(strVal).replace(/^[ 　]*/gim, "").replace(/[ 　]*$/gim, "");
}

//必須入力チェック
function requiredCheck(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        alert(name + "を入力してください。\r\n");
        elm.focus();
        return false;
    }
    if (jsTrim(val) == "") {
        alert(name + "に空白スペース以外の文字を入力してください。\r\n");
        elm.value = "";
        elm.focus();
        return false;
    }
    return true;
}

//必須入力チェック（チェックボックス用）
function requiredCheckBox(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        alert(name + "にチェックを入れてください。\r\n");
        return false;
    }
    return true;
}

// 数値型であるか検証
function isNumberType(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    var num = parseInt(val, 10);
    if (isNaN(num)) {
        alert(name + "は半角の数字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//数値であるか検証
function isNumber(elm, name) {
    var re  = /^(\d+)$/;
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    if (!(re.test(val))) {
        alert(name + "は半角の数字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//数値であるか検証
function isNumberVal(val, name) {
    var re  = /^(\d+)$/;
    if (val == "" || val == undefined) {
        return true;
    }
    if (!(re.test(val))) {
        alert(name + "は半角の数字で入力してください。\r\n");
        return false;
    }
    return true;
}

//数値であるか検証 (小数や負数も可)
function isNumeric(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }

    if (isNaN(val)) {
        alert(name + "は半角の数値で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 西暦年として正しいか検証
function isYear4(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    var num = parseInt(val, 10);
    if (isNaN(num)) {
        alert(name + "は4桁の半角数字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    if (num < 1902 || num > 2037) {
        alert(name + "は1902年～2037年の範囲で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 月として正しいか検証
function isMonth(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    var num = parseInt(val, 10);
    if (isNaN(num)) {
        alert(name + "は2桁の半角数字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    if (num < 1 || num > 13) {
        alert(name + "は1～12の範囲で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 日として正しいか検証
function isDay(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    var num = parseInt(val, 10);
    if (isNaN(num)) {
        alert(name + "は2桁の半角数字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    if (num < 1 || num > 31) {
        alert(name + "は1～31の範囲で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 数値4桁であるか検証
function isLen4(elm, name) {
    var val = elm.value;
    var num = parseInt(val, 10);

    if (val == "" || val == undefined || isNaN(num)) {
        alert(name + "は4桁の半角数字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    if (num < 1902 || num > 2037) {
        alert(name + "は1902年～2037年の範囲で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 半角チェック
function hankakuCheck(elm, name)  {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    var cnt = 0;
    for (var i = 0, len = val.length; i < len; i++) {
        if (escape(val.charAt(i)).length >= 4) {
            cnt += 3;
        } else {
            cnt++;
        }
    }
    if (cnt != val.length) {
        alert(name + "は半角の文字で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 文字長の範囲内チェック
function lengthCheck(elm, maxLen, name) {
    var val = elm.value;
    if (val == "" || val == undefined || maxLen == undefined) {
        return true;
    }
    if (val.length > maxLen) {
        alert(name + "は" + maxLen + "桁以下で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 桁数チェック
function lengthEqualCheck(elm, equLen, name) {
    var val = elm.value;
    if (val == "" || val == undefined || equLen == undefined) {
        return true;
    }
    if (val.length != equLen) {
        alert(name + "は、"+ equLen + "桁で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    return true;
}

//数値の桁数をチェック
function numericLengthCheck(elm, p, s, name) {
    var val = elm.value;
    if (val == "" || val == undefined || isNaN(val)) {
        return true;
    }

    var num = parseFloat(val);
    var err_flag = false;
    var num_str = num + "";
    var idx = num_str.indexOf(".");
    if (idx != -1) {
        var num_ary = num_str.split(".");
        if (num_ary[0].length > p || num_ary[1].length > s) {
            err_flag = true;
        }
    } else {
        if (num_str.length > p) {
            err_flag = true;
        }
    }

    if (err_flag) {
        alert(name + "は整数部" + p + "桁以内、小数部" + s + "桁以内で入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 文字の長さ範囲チェック
function rangeCheck(elm, minLen, maxLen, name) {
    var val = elm.value;
    if (val == "" || val == undefined || maxLen == undefined) {
        return true;
    }
    len = val.length;
    if (len < minLen) {
        alert(name + "は" + minLen + "桁以上で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    if (len > maxLen) {
        alert(name + "は" + maxLen + "桁以下で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 数値の範囲チェック
function numRangeCheck(elm, minNum, maxNum, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    if (!isNaN(minNum) && val < minNum) {
        alert(name + "は" + minNum + "以上で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    if (!isNaN(maxNum) && val > maxNum) {
        alert(name + "は" + maxNum + "以下で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    return true;
}

// バイト数チェック
function chkByte(elm, maxLen, name) {
    var val = elm.value;
    var cnt = 0;
    if (val == "" || val == undefined) {
        return true;
    }
    for (var i = 0, len = val.length; i < len; i++) {
        if (escape(val.charAt(i)).length < 4) {
            cnt++;
        } else {
            cnt += 3;
        }
    }
    if (cnt > maxLen) {
        alert(name + "は、全角" + Math.floor(maxLen / 3) + "文字（半角" + maxLen + "文字）以内で入力してください。 \r\n");
        elm.focus();
        return false;
    }
    return true;
}

// 正しい日付かチェック
function dateCheck(y, m, d, name) {
    var fy = parseInt(y.value, 10);
    var fm = parseInt(m.value, 10);
    var fd = parseInt(d.value, 10);
    var hizuke = new Date(fy, fm - 1, fd);

    if (hizuke.getFullYear() != fy || (hizuke.getMonth() + 1) != fm || hizuke.getDate() != fd) {
        alert(name + "に正しい日付を入力してください。\r\n");
        return false;
    }
    return true;
}

// 入力年月と現在年月のチェック
function nowYearMonthCheck(y, m, yname, mname) {
    var nowDate  = new Date();
    var nowYear  = nowDate.getFullYear();
    var nowMonth = nowDate.getMonth() + 1;
    var fy = parseInt(y.value, 10);
    var fm = parseInt(m.value, 10);

    if (nowYear < fy) {
        alert(yname + "は当年以前の年を入力してください。\r\n");
        return false;
    }
    if (nowYear == fy && nowMonth < fm) {
        alert(mname + "は当月以前の月を入力してください。\r\n");
        return false;
    }
    return true;
}

// 入力日と現在日のチェック
function nowDateCheck(y, m, d, name) {
    var fy = parseInt(y.value, 10);
    var fm = parseInt(m.value, 10);
    var fd = parseInt(d.value, 10);
    var inDate  = new Date(fy, fm - 1, fd);
    var nowDate = new Date();

    if (nowDate < inDate) {
        alert(name + "は本日以前の日付を入力してください。\r\n");
        return false;
    }
    return true;
}

// 日付From-Toチェック
function dateFromToCheck(sy, sm, sd, ey, em, ed, name) {
    var fy = parseInt(sy.value, 10);
    var fm = parseInt(sm.value, 10);
    var fd = parseInt(sd.value, 10);
    var ty = parseInt(ey.value, 10);
    var tm = parseInt(em.value, 10);
    var td = parseInt(ed.value, 10);
    var dateFm = new Date(fy, fm - 1, fd);
    var dateTo = new Date(ty, tm - 1, td);

    if (dateFm.getFullYear() != fy || (dateFm.getMonth() + 1) != fm || dateFm.getDate() != fd) {
        alert(name + "の開始日に正しい日付を入力してください。");
        return false;
    }
    if (dateTo.getFullYear() != ty || (dateTo.getMonth() + 1) != tm || dateTo.getDate() != td) {
        alert(name + "の終了日に正しい日付を入力してください。");
        return false;
    }
    if (dateTo < dateFm) {
        alert(name + "の開始日付と終了日付の期間が正しくありません。\r\n");
        return false;
    }
    return true;
}

//1文字以上の文字列であるか検証
function inNotEmpty(elm, name) {
    var val = elm.value;
    if (val == null || val.length == 0) {
        alert(name + "が入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//特殊文字がないか検証
function isSpecialChar(elm, name) {
    reg = new RegExp("[,-/]", "g");
    var val = elm.value;

    if (val != "" && val.search(reg) != -1) {
        alert(name + "には以下の半角記号を使用することができません。\r\n"
        + "ハイフン( - ) カンマ( , ) スラッシュ( / )\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//アルファベットであるか検証
function isAlpha(elm, name) {
    var val = elm.value;
    if (val.match(/[^a-zA-Z]/g)) {
        alert(name + "は半角のアルファベットで入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//全角カタカナであるか検証
function isKatakana(elm, name) {
    var val = elm.value;
    if (val.match(/[^ァ-ヾ　\s]+/)) {
        alert(name + "は全角のカタカナで入力してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//全てのチェックボックスにチェックを入れる
function chkAllBox(val) {
    for (var i = 0, len = document.forms[0].elements.length; i < len; i++) {
        if (document.forms[0].elements[i].name == "chkbox[]") {
            document.forms[0].elements[i].checked = val;
        }
    }
}

//セレクトされてるかチェック
function isSlct(elm, name) {
    var val = elm.value;

    if (val == "" || val == undefined) {
        alert(name + "を選択してください。\r\n");
        elm.focus();
        return false;
    }
    return true;
}

//ラジオボタンがチェックされてるか
function chkRadio(elm, name) {
    if (elm.length) {
        for (i = 0; i < elm.length; i++) {
            if (elm[i].checked) {
                return true;
            }
        }
    }
    alert(name + "を選択してください。\r\n");
    return false;
}

//本学用メールアドレスの妥当性チェック
function chkTusMail(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    // xxx@xxx.tus.ac.jp なのかチェック
    ml =  /.+@.+\.tus\.ac\.jp$/;
    if (!val.match(ml)) {
        alert(name + "には本学用の正しいメールアドレス(xxx@xxx.tus.ac.jp)を入力してください。\r\n");
        return false;
    }
    return true;
}

//メールアドレスの妥当性チェック
function chkMail(elm, name) {
    var val = elm.value;
    if (val == "" || val == undefined) {
        return true;
    }
    // xxx@xxx.xx.xx なのかチェック
    ml = /.+@.+\..+/;
    if (!val.match(ml)) {
        alert(name + "に正しいメールアドレスを入力してください。\r\n");
        return false;
    }
    return true;
}
