/*
 *	Safariは文字列->日付の変換ができないが、navigator.appNameで"Netscape"
 *	と名乗って本物のNetscapeと区別が付けれられないため、変換をサポートして
 *	いるかどうかを関数でチェックする。
 */

var _supportDateConvert = null;

function supportDateConvert() {
	if (null == _supportDateConvert) {
		var tmp1 = "1963/7/20";
		var tmp2 = new Date(tmp1);
		tmp2 = tmp2.getFullYear() + "/" + (tmp2.getMonth() + 1) + "/" + tmp2.getDate();
		_supportDateConvert = (tmp1 == tmp2);
	}
	return _supportDateConvert;
}


function dateBind(y, m, d) {
	y.value = y.value.replace(/^\s+/, "").replace(/\s+$/, "");
	m.value = m.value.replace(/^\s+/, "").replace(/\s+$/, "");
	d.value = d.value.replace(/^\s+/, "").replace(/\s+$/, "");
	
	if (y.value && m.value && d.value) {
		return y.value + "/" + 
			   ((m.value.length < 2)? "0" : "") + m.value + "/" + 
			   ((d.value.length < 2)? "0" : "") + d.value;
	}
		
	return "";
}


var g___form;
var g___form_name;
var g___curent_item_index;

function viewError(err, item, obj, parm1) {
	if (err.length) {
		try {
			var desc = "";
			if (item.Description)
				desc = item.Description;
			err = err.replace(/%1/g, desc).replace(/%2/g, parm1);
			alert(err);
			if (item.FocusItem && document.forms[g___form_name].elements[item.FocusItem]) {
				var tmp = document.forms[g___form_name].elements[item.FocusItem];
				if ("select-one" == tmp.type || null == tmp.length)
					tmp = new Array(tmp);
				if ((tmp.length > g___current_item_index) && null != tmp[g___current_item_index]) {
					tmp[g___current_item_index].focus();
					return;
				}
			}
		
			if (obj && obj.focus) obj.focus();
		}
		catch (e) {
			// nop;
		}
		return false;
	}
	return true;
}


function noCheckObject(obj) {
    if (! obj) return true;
    return ((obj.style && obj.style.display && 'none' == obj.style.display)
            || obj.disabled || obj.readonly);
}

function getRequiredErr(obj) {
	if ('radio' == obj.type ||
		'checkbox' == obj.type ||
		'select-one' == obj.type ||
		'select-multiple' == obj.type)
		return FormErrors.REQUIRED2;
		
	return FormErrors.REQUIRED;
}


function isEmpty(value) {
	/*if (value instanceof Array)	instanceof は Mac IEで使用不可	*/
	
	if ("undefined" != typeof(value.length))
		return (0 == value.length);
		
	return value.match(/^\s*$/);
}


function validateObject(obj, item, value, item_index) {
	g___current_item_index = item_index;
	if ('undefined' == typeof(UNICODE))
		UNICODE = 1;

	var required = (item.RequiredX)? item.RequiredX[item_index] : item.Required;
	if (item.RequiredIf) {
		required = true;
		for (var e in item.RequiredIf) {
			var val = item.RequiredIf[e];
			if (document.forms[g___form_name].elements[e]) {
				if (CheckValues[e][item_index] != val) {
					required = false;
					break
				}
			}
		}
	}
	
	if (required && isEmpty(value)) {
		var err = (item.RequiredError)? item.RequiredError : getRequiredErr(obj);
		return viewError(err, item, obj);
	}
	
	if (String(value).match(/^\s*$/))
		return true;
		
	var length = (UNICODE)? String(value).length : byteSize(String(value));
	if (item.MinLength || item.MaxLength) {
		if ((item.MinLength == item.MaxLength) && (item.MinLength != length)) {
			var err = (item.LengthError)? item.LengthError : FormErrors.LENGTH;
			return viewError(err, item, obj, item.MinLength);
		}
		
		if (item.MinLength && (item.MinLength > length)) {
			var err = (item.MinLengthError)? item.MinLengthError : FormErrors.MIN;
			return viewError(err, item, obj, item.MinLength);
		}
		
		if (item.MaxLength && (item.MaxLength < length)) {
			var err = (item.MaxLengthError)? item.MaxLengthError : FormErrors.MAX;
			return viewError(err, item, obj, item.MaxLength);
		}
	}
	
	var pattern = item.Pattern;
	if (! pattern) {
		if (item.Integer)
			pattern = /^\-?\d+$/;
		else if (item.Decimal)
			pattern = /^\-?\d+(?:\.\d+)$/;
	}
	
	if (pattern && ! obj.value.match(pattern)) {
		var err = (item.PatternError)? item.PatternError : FormErrors.PATTERN;
		return viewError(err, item, obj);
	}
	
	if (item.Date && supportDateConvert()) {
		if ("undefined" == typeof(toDateStr)) {
			alert("require toolbox.js");
			return false;
		}
		
		var tmpDate = new Date(toDateStr(value));
		tmpDate = tmpDate.getFullYear() + "/" + (tmpDate.getMonth() + 1) + "/" + tmpDate.getDate();
		
		value = value.replace(/\/(\d)\//, "/0$1/").replace(/\/(\d)$/, "/0$1");
		tmpDate = tmpDate.replace(/\/(\d)\//, "/0$1/").replace(/\/(\d)$/, "/0$1");
		if (value != tmpDate) {
			var err = (item.CheckDateError)? item.CheckDateError : FormErrors.CHECKDATE;
			return viewError(err, item, obj);
		}
		else if (false === item.FutureDate) {
			tmp1 = toDate(value);
			tmp2 = toDate();
			if (tmp1 > tmp2) {
				var err = (item.FutureDateError)? item.FutureDateError : FormErrors.FUTUREDATE;
				return viewError(err, item, obj);
			}
		}
	}
	
	if (! isNaN(item.MinValue) && (isNaN(value) || (Number(item.MinValue) > Number(value)))) {
		var err = (item.MinValueError)? item.MinValueError : FormErrors.MINVALUE;
		return viewError(err, item, obj, item.MinValue);
	}
	
	if (! isNaN(item.MaxValue) && (isNaN(value) || (Number(item.MaxValue) < Number(value)))) {
		var err = (item.MaxValueError)? item.MaxValueError : FormErrors.MAXVALUE;
		return viewError(err, item, obj, item.MaxValue);
	}
	
	var tmp = null;
	if (item.GT)
		tmp = item.GT;
	else if (item.GE)
		tmp = item.GE;
	else if (item.LT)
		tmp = item.LT;
	else if (item.LE)
		tmp = item.LE;
	
	if (null != tmp) {
		var tmp1 = CheckValues[tmp][item_index];
		if (null != tmp1) {
			tmp2 = value;
			var errs = null;
			if (item.Date) {
				tmp1 = toDate(tmp1);
				tmp2 = toDate(tmp2);
				errs = { 
					"GT" : (item.GT_Error)? item.GT_Error : FormErrors.GTDATE,
					"GE" : (item.GE_Error)? item.GE_Error : FormErrors.GEDATE,
					"LT" : (item.LT_Error)? item.LT_Error : FormErrors.LTDATE,
					"LE" : (item.LE_Error)? item.LE_Error : FormErrors.LEDATE
				};
			}
			else {
				errs = { 
					"GT" : (item.GT_Error)? item.GT_Error : FormErrors.GT,
					"GE" : (item.GE_Error)? item.GE_Error : FormErrors.GE,
					"LT" : (item.LT_Error)? item.LT_Error : FormErrors.LT,
					"LE" : (item.LE_Error)? item.LE_Error : FormErrors.LE
				};
			}
			
			if (item.Integer) {
				tmp1 = parseInt(tmp1, 10);
				tmp2 = parseInt(tmp2, 10);
			}
			else if (item.Decimal) {
				tmp1 = new Number(tmp1);
				tmp2 = new Number(tmp2);
			}

			if (item.GT && (tmp1 >= tmp2))
				return viewError(errs["GT"], item, obj, g___form[tmp].Description);
			else if (item.GE && (tmp1 > tmp2))
				return viewError(errs["GE"], item, obj, g___form[tmp].Description);
			else if (item.LT && (tmp1 <= tmp2))
				return viewError(errs["LT"], item, obj, g___form[tmp].Description);
			else if (item.LE && (tmp1 < tmp2))
				return viewError(errs["LE"], item, obj, g___form[tmp].Description);
		}
	}
	
	return true;
}

function getObjectValue(obj, form_name) {
	if ('radio' == obj.type) {
		obj = document.forms[form_name].elements[obj.name];
		if (! obj.length)
			obj = new Array(obj);
			
		for (var i = 0; i < obj.length; i++) {
			if (obj[i].checked) {
				return obj[i].value;
			}
		}
		return "";
	}
	else if ('select-one' == obj.type) {
		for (var i = 0; i < obj.length; i++) {
			if (obj.options[i].selected)
				return obj.options[i].value;
		}
		return "";
	}
	else if ('checkbox' == obj.type) {
		obj = document.forms[form_name].elements[obj.name];
		if (! obj.length)
			obj = new Array(obj);
			
		var value = new Array();
		for (var i = 0; i < obj.length; i++) {
			if (obj[i].checked)
				value[ value.length ] = obj[i].value;
		}
		return value;
	}
	else if ('select-multiple' == obj.type) {
		var value = new Array();
		for (var i = 0; i < obj.length; i++) {
			if (obj.options[i].selected)
				value[ value.length ] = obj.options[i].value;
		}
		return value;
	}
	else if ('file' == obj.type) {
		return obj.value;
	}
	else if ('undefined' != typeof(obj.value)) {
		obj.value = obj.value.replace(/^[\s　]+/, "").replace(/[\s　]+$/, "");
		return obj.value;
	}
	else {
		alert("object not supported: " + obj.type);
		return "";
	}
}

var CheckValues =  { };

function ValidateForm(form, form_name) {
	if (('undefined' != typeof(NoScriptCheck)) && NoScriptCheck)
		return true;
	
	/*	一時変数クリア */
	for (var e in form) {
		form[e].RequiredX = null;
	}
	
	g___form	  = form;
	g___form_name = form_name;
	for (var e in form) {
		var form_field = document.forms[form_name].elements[e];
		if (null == form_field)
			form_field = document.forms[form_name].elements[e + "[]"];	/* for PHP array	*/
		
		if ((null == form_field) || ("string" == typeof(form_field)))
			continue;
		
		if (form_field.type) {
			form_field = new Array(form_field);
		}
		else if (('radio' == form_field[0].type) || ('checkbox' == form_field[0].type)) {
			form_field = new Array(form_field[0]);
		}
		
		for (var i = 0; i < form_field.length; i++) {
			var field = form_field[i];
			if (noCheckObject(field))
				continue;
				
			var value = getObjectValue(field, form_name);
			if (form[e].RequiredAnd || form[e].RequiredOr) {
				var tmp = (form[e].RequiredAnd)? form[e].RequiredAnd : form[e].RequiredOr;
				var b = ! isEmpty(value);
				for (var x in tmp) {
					var name = tmp[x];
					var tmpField = document.forms[form_name].elements[name];
					if (null == tmpField)
						tmpField = document.forms[form_name].elements[name + "[]"];
					if (null == tmpField)
						continue;
					
					if (tmpField.type)
						tmpField = new Array(tmpField);
						
					if ((tmpField.length > i) && ! isEmpty(getObjectValue(tmpField[i], form_name)))
						b = true;
				}
				
				if (form[e].RequiredAnd) {
					/* form[e].Required = b;	自分自身もRequiredにする場合はRequiredAndのリストに自分のIDを含める */
					for (var x in tmp) {
						var name = tmp[x];
						if (! form[name].RequiredX)
							form[name].RequiredX = new Array();
						
						if (! form[name].RequiredX[i])
							form[name].RequiredX[i] = b;
					}
				}
				else {
					if (! b)
						form[e].Required = true;
					else {
						form[e].Required = false;
						for (var x in tmp) {
							var name = tmp[x];
							if (! form[name].RequiredX)
								form[name].RequiredX = new Array();
								
							if (! form[name].RequiredX[i])
								form[name].RequiredX[i] = b; /* /false;	// <= これはfalseではなく b では？ */
						}
					}
				}
			}

			if (form[e].FormatAnd) {
				var tmp = form[e].FormatAnd;
				var tmp2 = new Array();
				var noField = false;
				for (var x = 1; x < tmp.length; x++) {
					var name = tmp[x];
					var tmpField = document.forms[form_name].elements[name];
					if (null == tmpField)
						tmpField = document.forms[form_name].elements[name + "[]"];
					if (null == tmpField) {
						noField = true;
						break;
					}
						
					if (tmpField.type)
						tmpField = new Array(tmpField);
					
					if (tmpField.length <= i)
						break;
					
					var val = getObjectValue(tmpField[i], form_name);
					if (! isEmpty(val))
						tmp2[ tmp2.length ] = val;
				}
				
				if (! noField) {
					if (((tmp2.length > 0) && form[e].FormatAndAlways) || ((tmp2.length + 1) == tmp.length))
						value = field.value = format(tmp[0], tmp2);
					else
						value = field.value = "";
				}
			}

			if (null == CheckValues[ e ])
				CheckValues[ e ] = new Array();
				
			CheckValues[ e ][ i ] = value;

			if (! validateObject(field, form[e], value, i))
				return false;
		}
	}
	
	return true;
}


function getRadioValue(obj) {
	if (null == obj)
		return null;
		
	if (! obj.length)
		obj = new Array(obj);
	
	for (var i = 0; i < obj.length; i++) {
		if (obj[i].checked)
			return obj[i].value;
	}
	
	return null;
}

function setRadioValue(obj, value) {
	if (null == obj)
		return null;
		
	if (! obj.length)
		obj = new Array(obj);
	
	for (var i = 0; i < obj.length; i++) {
		if (obj[i].value == value) {
			obj[i].checked = true;
			break;
		}
	}
}


function getCheckboxValue(obj) {
	if (null == obj)
		return null;
		
	if (! obj.length)
		obj = new Array(obj);
		
	var r = new Array();
	for (var i = 0; i < obj.length; i++) {
		if (obj[i].checked)
			r[ r.length ] = obj.value;
	}
	
	return r;
}


function setCheckboxValue(obj, value) {
	if (null == obj)
		return null;
		
	if (! obj.length)
		obj = new Array(obj);
		
	if (! value.length)
		value = new Array(value);
		
	for (var i = 0; i < obj.length; i++) {
		obj[i].checked = false;
		for (var j = 0; j < value.length; j++) {
			if (obj[i].value == value[j]) {
				obj[i].checked = true;
				break;
			}
		}
	}
}
