function detectForm()
{
	var elems = $('.fillAssistant input,.fillAssistant select,.fillAssistant textarea');

	for (var i = 0; i < elems.length; i++) {

		var elem = elems[i];

		switch (elem.type) {
			case 'text':
				addEvent(elem, 'blur', blurTextfield, false);
				break;

			case 'textarea':
				addEvent(elem, 'blur', blurTextarea, false);
				break;

			case 'select-one':
				addEvent(elem, 'blur', blurOption, false);
				break;

			case 'radio':
				addEvent(elem, 'click', blurRadio, false);
				addEvent(elem, 'blur', blurRadio, false);
				break;

			default:
				break;
		}
	}
}

function addEvent(elem, type, func, flag)
{
	if (elem.addEventListener) elem.addEventListener(type, func, flag);
	else elem.attachEvent('on' + type, func);
}

function checkRequire(elem)
{
	var flag = true;

	switch (elem.type) {

		case 'text':
		case 'textarea':
			if (elem.value == '') {
				if (elem.attributes['class'] && (elem.attributes['class'].value.indexOf('fa_req') >= 0)) {
					flag = false;
				}
			}
			break;

		case 'select-one':
			if (elem.className && (elem.className.indexOf('fa_req') >= 0)) {
				if ((elem.selectedIndex == -1) || (elem.value == '0') || (elem.value== '')) {
					flag = false;
				}
				if (flag) colorElem(elem, false);
			}
			break;

		case 'radio':
			if (elem.className && (elem.className.indexOf('fa_req') >= 0)) {
				flag = false;
				var radio = document.getElementsByName(elem.name);
				for (var i = 0; i < radio.length; i++) if (radio[i].checked) flag = true;
				if (flag) for (var i = 0; i < radio.length; i++) colorElem(radio[i], false);
			}
			break;

		default:
			break;
	}

	if (flag == false) {
		showMessage('必須項目です。');
		colorElem(elem, true);
	}

	return flag;
}

function blurTextfield(e)
{
	if (e.target) tField = e.target;
	else tField = window.event.srcElement;

	checkTextfield();
}

function checkTextfield()
{
	if (!checkRequire(tField)) return;

	var allowed = {
		alpha : '半角アルファベット',
		nums  : '半角数字',
		ascii : '半角英数記号',
		space : '半角スペース',
		SPACE : '全角スペース',
		Space : 'スペース',
		HIRA  : '全角ひらがな',
		KATA  : '全角カタカナ',
		KANA  : '全角仮名',
		kata  : '半角ｶﾅ',
		KANJI : '漢字',
		zip   : '半角英数記号',
		tel   : '半角英数記号',
		email : '半角英数記号'
	}

	if ((tField.attributes['fa_allow'] == undefined) || (tField.attributes['fa_allow'].value == '')) {
		hideMessage();
		colorElem(tField, false);
		return;
	}

	var allowType = tField.attributes['fa_allow'].value.split(' ');

	if (isValid(tField.value, allowType)) {
		hideMessage();
		colorElem(tField, false);
	}

	else {
		var at = Array();
		for (var i = 0; i < allowType.length; i++) at.push(allowed[allowType[i]]);
		showMessage('登録できない文字が入力されました。<br />'
		          + '<br />'
		          + '入力できる文字：<br />'
		          + '( ' + at.join('、') + ' )');
		colorElem(tField, true);
	}
}

function isValid(val, atype)
{
	if (val.length == 0) return true;

	var chars = val.split('');
	var v = true;
	var reg = {
		alpha : '[a-zA-Z]',
		nums  : '[0-9]',
		ascii : '[\x20-\x7e]',
		space : '[ ]',
		SPACE : '[　]',
		Space : '[ 　]',
		HIRA  : '[ぁ-んー・]',
		KATA  : '[ァ-ヴー・]',
		KANA  : '[ぁ-んァ-ヴー・]',
		kata  : '[･-ﾟ]',
		KANJI : '[一-鿿]',
		zip   : '[0-9\-]',
		tel   : '[0-9\#\*\-]',
		email : '[0-9a-zA-Z\.\\-@_]'
	};

	for (var i = 0; i < chars.length; i++) {
		v = false;
		for (var j = 0; j < atype.length; j++) if (chars[i].match(reg[atype[j]]) && (v = true)) break;
		if (!v) break;
	}

	return v;
}

function blurTextarea(e)
{
	if (e.target) tField = e.target;
	else tField = window.event.srcElement;

	if (!checkRequire(tField)) return;
}

function blurOption(e)
{
	if (e.target) tField = e.target;
	else tField = window.event.srcElement;

	if (!checkRequire(tField)) return;
}

function blurRadio(e)
{
	if (e.target) tField = e.target;
	else tField = window.event.srcElement;

	if (!checkRequire(tField)) return;
}

function showMessage(str)
{
	tField.style.position = 'relative';
	var fa_msg = $('#fa_msg');

	fa_msg.html('<p>' + str + '</p>');

	fa_msg.css({
		'top' : (tField.offsetTop - fa_msg.height() * 2),
		'left' : (tField.offsetLeft),
		'display' : 'block'
	});
}

function hideMessage()
{
	$('#fa_msg').css({ display : 'none' });
}

function colorElem(elem, flag)
{
	if (!elem.attributes['class']) return;

	if (flag) {
		if (elem.attributes['class'].value.indexOf('fa_err') == -1) {
			elem.attributes['class'].value += ' fa_err';
		}
	}

	else {
		elem.attributes['class'].value = elem.attributes['class'].value.replace(' fa_err', '');
		hideMessage();
	}
}

var tField = undefined;
$(document).ready(detectForm);
