﻿function fromSubmit(_e, _sAction, _fCheck, _vArguments)
{
	if (!_e) return false;
	var f, b = true;
	f = (_e.tagName=="FORM")? _e: _e.form;
	if (f){
		if (_fCheck && !_fCheck(_vArguments)) return false;
		if (_sAction && _sAction.length) f.action = _sAction;
		f.submit();
		f.onsubmit= new Function("return false;");
		formDisableAll(f); // have to be put after submit()
	}
	return false;
}
function formDisableAll(_eForm)
{
	var es = _eForm.elements;
	for (var i=0, l=es.length; i<l; i++) {
		var e = es[i];
		if (("disabled" in e) && e.name && e.name.length)
			e.disabled = true;
	}
}
function formClearAll(_eForm, _stcIgnoreID)
{
	var es = _eForm.elements;
	if (!_stcIgnoreID) _stcIgnoreID = {};
	for (var i=0, l=es.length; i<l; i++)
	{
		var e = es[i];
		if (e.id.length && (e.id in _stcIgnoreID)) continue;
		if(e.type == "text"|| e.type == "textarea" || e.type == "password")
			e.value = "";
		else if(e.type == "checkbox" || e.type == "radio")
			e.checked = false;
		else if(e.type == "select-one")
				e.value = -1;
		else if(e.type == "select-multiple") {
			var opt = e.options;
			var optLen = opt.length;
			for (var j=0; j < optLen; j++) {
				opt[j].selected = false;
			}
		}
	}
}

function formCheckAll(_eForm, _blChecked)
{
	var es = _eForm.elements;
	for (var i=0, l=es.length; i<l; i++)
		if (es[i].type == 'checkbox')
			es[i].checked = _blChecked;
}
function formCheckGroup(_eForm, _sName, _blChecked)
{
	var es = _eForm.elements;
	for (var i=0, l=es.length; i<l; i++)
		if ((es[i].name == _sName) && (es[i].type == 'checkbox'))
			es[i].checked = _blChecked;
}
function checkSomeoneChecked(_aryArgs)
{
	if (!document.getElementsByTagName) return true;
	var sName=_aryArgs[0],
		sMsg=_aryArgs[1],
		ret,
		es=document.getElementsByTagName("input");
	for (var i=0, l=es.length; i<l; i++)
		if(es[i].type=="checkbox" && es[i].name==sName && es[i].checked) break;
	if (!(ret = i<l) && sMsg) alert(sMsg);
	return ret;
}
function checkEvryoneChecked(_aryArgs)
{
	if (!document.getElementsByTagName) return true;
	var sName=_aryArgs[0],
		sMsg=_aryArgs[1],
		ret,
		es=document.getElementsByTagName("input");
	for (var i=0, l=es.length; i<l; i++)
		if(es[i].type=="checkbox" && es[i].name==sName && !es[i].checked) break;
	if (!(ret = i==l) && sMsg) { alert(sMsg); }
	return ret;
}

function CheckRegExp(_aryArgs/*_e, _msg, _regexp*/)
{
	var e		= _aryArgs[0],
		sMsg	= _aryArgs[1];
		re		= _aryArgs[2];
	var str;

	if (!e || !(str=e.value) || !str.length) return "";
	str = str.replace(/^\s+/, "").replace(/\s+$/, "");
	if(re.test(str)) return str;
	else if(sMsg) alert(sMsg+"\n正しい値を指定してください。");
	return null;
}
function ToNumber(_aryArgs/*_e, _msg, _isDecimal, _isPositive*/)
{
	var e		= _aryArgs[0],
		sMsg	= _aryArgs[1],
		blDec	= _aryArgs[2],
		blPos	= _aryArgs[3];
	var nMin	= ("Min" in e? e.Min: -9999999);
	var nMax	= ("Max" in e? e.Max: 9999999);
	var nStep	= ("Step" in e? e.Step: 1);
	var blFocus	= ("Focus" in e? 1: 0);
	var str;

	if (!e) return "";
	if (!(str = e.value)) {
		if (str !== "0") return "";
		else return 0;
	}
	str = str.replace(/^\s+/, "").replace(/\s+$/, "").replace(/,/g, "");
	if(/^[-+]?\d+(\.\d+)?$/.test(str))
	{
		var ret = str-0;
		if(!blDec && (str.indexOf(".")>=0)) { if(sMsg) sMsg += "\n整数を入力してください。"; }
		else if(!blPos || (ret>=0))
		{
			if (nMin > ret)		{ if(sMsg) sMsg += "\n"+ nMin +"より小さい値は指定できません。"; }
			else if (ret > nMax){ if(sMsg) sMsg += "\n"+ nMax +"より大きい値は指定できません。"; }
			else if (ret % nStep){ if(sMsg) sMsg += "\n"+ nStep +"単位で指定してください。"; }
			else return str;
		}
		else if(sMsg) sMsg+="\n正の数値を入力してください。";
	}
	else if(sMsg) { sMsg+="\n半角数字で正しい数値を指定してください。"; }
	if (sMsg) { alert(sMsg); }
	if (blFocus) e.focus();
	return null;
}

function addBehaviors(_form)
{
	var es;
	if (!_form || !(es = _form.elements)) return true;

	for (var i=0, l=es.length; i<l; i++)
	{
		var e=es[i];
		if (e.tagName=="INPUT")
		{
			if(isClass(e.className,"Integer"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, ToNumber, Array(e,e.ErrMsg,false,true,e.Min,e.Max));
			else if(isClass(e.className,"Integers"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^\d+(,\d+)*$/));
			else if(isClass(e.className,"Decimal"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, ToNumber, Array(e,e.ErrMsg,true,true,e.Min,e.Max));
			else if(isClass(e.className,"Tel"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^\d{2,4}-\d{2,4}-\d{2,4}$/));
			else if(isClass(e.className,"Mail"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$/));
			else if(isClass(e.className,"Mail2"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^([^<>]+<)?[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})>?$/));
			else if(isClass(e.className,"Mails"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})(,[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,}))*$/));
			else if(isClass(e.className,"Numeric"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^\d+$/));
			else if(isClass(e.className,"Hiragana"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[ぁ-んー・ 　]+$/));
			else if(isClass(e.className,"Katakana"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[ァ-ヴー・ 　]+$/));
			else if(isClass(e.className,"Alpha"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[A-Za-z]+$/));
			else if(isClass(e.className,"AlphaS"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[a-z]+$/));
			else if(isClass(e.className,"AlphaL"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[A-Z]+$/));
			else if(isClass(e.className,"AlphaNum"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^[A-Za-z0-9]+$/));
			else if(isClass(e.className,"Date"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^\d{2,4}[-/]\d{1,2}[-/]\d{1,2}$/));
			else if(isClass(e.className,"Time"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^\d{1,2}:\d{1,2}:\d{1,2}$/));
			else if(isClass(e.className,"DateTime"))
				e.onblur=addBehaviorsDelegater(e, e.onblur, CheckRegExp, Array(e,e.ErrMsg,/^\d{2,4}[-/]\d{1,2}[-/]\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}$/));
		}
		if((e.tagName=="INPUT"||e.tagName=="TEXTAREA"||e.tagName=="SELECT") && e.type!="button" && e.type!="submit" && e.type!="reset" && e.type!="image" && e.style)
		{
			if(e.style)
			{
				e.normalFC = e.style.color;
				e.normalBC = e.style.backgroundColor;
			}
			e.onfocus=function(_e,_f){return function(){if(_f)_f(); _e.style.backgroundColor="#f6fcff";}}(e, e.onfocus);
			e.onblur =function(_e,_f){return function(){if(_f)_f(); _e.style.backgroundColor=_e.normalBC;}}(e, e.onblur);
		}
	}
}
function isClass(myClasses,myClass)
{
	return (myClasses==myClass || myClasses.match(" "+myClass+" ") || (myClasses.indexOf(" "+myClass)>-1 && myClasses.indexOf(" "+myClass)==(myClasses.length-(myClass.length+1))) || myClasses.indexOf(myClass+" ")==0);
}

function addBehaviorsDelegater(_e,_f,_fValidater,_arg)
{
	return function()
	{
		var r=true, v;
		_f && (r=_f());
		if(r && ((v=_fValidater(_arg))!=null))
		{
			_e.value=v;
			if (_e.style) _e.style.color=_e.normalFC;
			return true;
		}
		else
		{
			if (_e.style) _e.style.color="#F00";
			return false;
		}
	};
}
