/* ASCII文字か確認 */
function isAscii(c) {
	return new String(" !\\\"#\$\%&'()*+,-./"
	    + "0123456789"
		+ ":;<=>?\@"
		+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		+ "[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~").indexOf(c) >= 0 ;
}

/* 半角カタカナか確認 */
function isHankakuKana(c) {
	return "｡｢｣､･ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ".indexOf(c) >= 0 ;
}

/* 文字列の長さを確認 */
function checkStringLength(name, value, minLength, maxLength) {
	value = (value != undefined) ? String(value) : "" ;
	
	/* 最小桁数確認 */
	minLength = isNaN(minLength) ? 0 : parseInt(minLength) ;
	if (value.length < minLength) {
		alert(name + ((minLength > 1) ? "は" + minLength + "文字以上で入力してください。" : "を入力してください。")) ;
		return false ;
	}
	
	/* 最大桁数確認 */
	maxLength = isNaN(maxLength) ? 0 : parseInt(maxLength) ;
	if ((maxLength > 0) && (value.length > maxLength)) {
		alert(name + "の入力桁数オーバーです。") ;
		return false ;
	}
	
	return true ;
}


/* メールアドレスを確認 */
function checkMailAddress(value) {
    value = (value != undefined) ? String(value) : "" ;

    /* 桁数確認 */
    if (!checkStringLength("メールアドレス", value, 1))
        return false ;

    /* アカウントとホスト名を分割 */
    var pos = value.indexOf('\@') ;
    if (pos < 0) {
        alert("メールアドレスに\@が含まれていません。") ;
        return false ;
    }
    var account = value.substr(0, pos) ;
    var host = value.substr(pos + 1) ;

    /* ホスト名に'\@'が含まれない事を確認 */
    if (host.indexOf('\@') >= 0) {
        alert("メールアドレスに\@が複数含まれています。") ;
        return false ;
    }

    /* ホスト名に'.'が含まれる事を確認 */
    if (host.indexOf('.') < 0) {
        alert("メールアドレスが正しくありません。") ;
        return false ;
    }

    /* '.'が連続していない事を確認 */
    value = '.' + account  + '.' + host + '.' ;
    if (value.indexOf("..") >= 0) {
        alert("メールアドレスが正しくありません。") ;
        return false ;
    }

    for (var i = 0; i < value.length; ++i) {
        var c = value.charAt(i) ;
        /* 入力文字の確認 */
        if (".-_\@0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(c) < 0) {
            alert("メールアドレスに使えない文字が含まれています。") ;
            return false ;
        }
    }

    return true ;
}


/* 文字列値を確認 */
function checkStringValue(name, value, minLength, maxLength, invalidValues) {
    value = (value != undefined) ? String(value) : "" ;
    invalidValues = (invalidValues != undefined) ? String(invalidValues) : "" ;
    if (invalidValues == "") invalidValues = ",'\\\"" ;

    /* 桁数確認 */
    if (!checkStringLength(name, value, minLength, maxLength))
        return false ;

    /* 未入力なら正常終了 */
    if (value.length == 0)
        return true ;

    var valid = false ;
    for (var i = 0; i < value.length; ++i) {
        var c = value.charAt(i) ;
        /* 半角空白以外の入力がある事を確認 */
        valid = valid || (" \\r\\n".indexOf(c) < 0) ;
        /* 不正な文字の入力を抑制 */
        if (invalidValues.indexOf(c) >= 0) {
            var msg = name + "の入力が不正です。" ;
            switch (c) {
            case ',':
                msg += "(カンマが含まれています)" ;
                break ;
            case '\\\'':
                msg += "(シングルコーテーションが含まれています)" ;
                break ;
            case '"':
                msg += "(ダブルコーテションが含まれています)" ;
                break ;
            }
            alert(msg) ;
            return false ;
        }
        /* 半角カタカナの入力を抑制 */
        if (isHankakuKana(c)) {
            alert(name + "は全角文字で入力してください。") ;
            return false ;
        }
    }
    /* 半角空白のみの入力を抑制 */
    if (!valid) {
        alert(name + "の入力が不正です。") ;
        return false ;
    }

    return true ;
}


/* 数値を確認 */
function checkNumberValue(name, value, minLength, maxLength) {
	value = (value != undefined) ? String(value) : "" ;
	
	/* 桁数確認 */
	if (!checkStringLength(name, value, minLength, maxLength))
		return false ;
	
	for (var i = 0; i < value.length; ++i) {
		var c = value.charAt(i) ;
		/* 数値以外の入力を抑制 */
		if ("-0123456789".indexOf(c) < 0) {
			alert(name + "を正しく入力してください。") ;
			return false ;
		}
	}
	
	return true ;
}

function checkBox(value, msg) {
	if (value) {
		return true ;
	} else {
		msg && alert(msg) ;
		return false ;
	}
}

function onFormSubmit(frm) {
	return checkStringValue("お名前", frm.id100.value, 1)
		&& checkNumberValue("郵便番号(親)", frm.id103.value, 1)
		&& checkNumberValue("郵便番号(子)", frm.id104.value, 1)
		&& checkBox(frm.id105.selectedIndex > 0, "都道府県名を選択してください。")
		&& checkStringValue("住所(市区郡名以下)", frm.id106.value, 1)
		&& checkNumberValue("電話番号", frm.id107.value, 1)
		&& checkMailAddress(frm.id108.value, 1) ;
}


/**
 * 二つの値が同じかどうかを調べる。
 * @param left メールアドレス
 * @param right メールアドレス
 * @return 真偽を返す
 */
function checkMailAddressEquals(leftName, rightName, message) {
    var left  = leftName.value;
    var right = rightName.value;
    
    if (!checkMailAddress(left)) {
        leftName.style.backgroundColor= "#ff7777";
        return false;
    }
    if (!checkMailAddress(right)) {
        rightName.style.backgroundColor= "#ff7777";
        return false;
    }
    if (left != right) {
        alert(message);
        return false;
    }
    return true;
}

