var fv = new Array();

function FV_bs() {
	this.ver = navigator.appVersion;
	this.agent = navigator.userAgent;
    var minor = parseFloat(this.ver);
    var major = parseInt(minor);
	this.dom = document.getElementById?1:0;
	this.opera = (this.agent.indexOf("opera") != -1);
	var iePos  = this.ver.indexOf('msie');
	if (iePos !=-1) {
		minor = parseFloat(this.ver.substring(iePos+5,this.ver.indexOf(';',iePos)))
		major = parseInt(minor);
	}
	this.ie = ((iePos!=-1) && (!this.opera));
	this.gecko = ((navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;
    this.ie4   = (this.ie && major == 4);
    this.ie4up = (this.ie && minor >= 4);
    this.ie5   = (this.ie && major == 5);
    this.ie5up = (this.ie && minor >= 5);
    this.ie5_5  = (this.ie && (this.agent.indexOf("msie 5.5") !=-1));
    this.ie5_5up = (this.ie && minor >= 5.5);
    this.ie6   = (this.ie && major == 6);
    this.ie6up = (this.ie && minor >= 6);
	this.mac = this.agent.indexOf("Mac")>-1;
}

fv['bok'] = false;
fv['is'] = new FV_bs();

function CheckForm(Frm) {
	var testOk = false;
	for (var i=0; i<Frm.elements.length; i++) {
		if (Frm.elements[i].getAttribute('validate')) {
			var validateType = Frm.elements[i].getAttribute('validate');
			var validateObj = Frm.elements[i];
			testOk = false;
			var params = validateType.split("|");
			if (params[params.length-1] == 'bok')
				fv['bok'] = true;
			switch (params[0]) {
				case 'blank'	: if (validateBlank(validateObj)) testOk = true; break;
				case 'length'	: if (validateLength(validateObj, params[1])) testOk = true; break;
				case 'number'	: if (validateNumber(validateObj, params[1], params[2])) testOk = true; break;
				case 'numeric'	: if (validateNumeric(validateObj, params[1])) testOk = true; break;
				case 'alnum'	: if (validateAlnum(validateObj, params[1], params[2], params[3], params[4], params[5] )) testOk = true; break;
				case 'decimal'	: if (validateDecimal(validateObj, params[1], params[2] )) testOk = true; break;
				case 'phone'	: if (validatePhone(validateObj)) testOk = true; break;
				case 'email'	: if (validateEmail(validateObj)) testOk = true; break;
				case 'datetime'	: if (validateDateTime(validateObj)) testOk = true; break;
				case 'date'		: if (validateDate(validateObj)) testOk = true; break;
				case 'time'		: if (validateTime(validateObj)) testOk = true; break;
				case 'select'	: if (validateSelect(validateObj)) testOk = true; break;
				case 'file'		: if (validateFile(validateObj, params[1])) testOk = true; break;
				default			: testOk = true; break;
			}
			if (testOk) validateObj.className = 'FormInput';
			if (!testOk) return false;
		}
	}
	return true;
}

function validateBlank(formObj) {
	var objName = formatName(formObj);
	if (fv['is'].ie5 || fv['is'].mac) {
		if (formObj.value == "")
			return errorProcess(formObj,0,1,'Please enter the '+objName);
	} else {
		var regex = new RegExp(/\S/);
		if (!regex.test(formObj.value))
			return errorProcess(formObj,1,1,'Please enter the '+objName);
	}
	return true;
}

function checkBlank(formObj) {
	if (formObj.value == "")
		return true;
	var regex = new RegExp(/^\s+$/);
	if (regex.test(formObj.value))
		return true;
	return false;
}

function validateLength(formObj,len) {
	var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj)) {
		fv['bok']=false;
		return true;
	}
	if (formObj.value.length < parseInt(len))
		return errorProcess(formObj,1,1);
	return true;
}

function validateNumber(formObj, lb, ub) {
	var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj)) {
		fv['bok'] = false;
		return true;
	}
	var num = formObj.value;
	if (isNaN(num) || checkBlank(formObj))
		return errorProcess(formObj,1,1);	
	num = parseFloat(num);
	if (lb != '*' && num < lb)
		return errorProcess(formObj,1,1);
	if (ub != '*' && num > ub)
		return errorProcess(formObj,1,1);
	return true;
}

function validateNumeric(formObj, len) {
	if (fv['bok'] && checkBlank(formObj)) {
		fv['bok']=false;
		return true;
	}
	var objName = formatName(formObj);
	if (len == '*') {
		var regex = /^\d+$/;
		if (!regex.test(formObj.value))
			return errorProcess(formObj,1,1);
	} else {
		numReg = "^\\d{"+parseInt(len)+",}$"
		var regex = new RegExp(numReg);
		if (!regex.test(formObj.value))
			return errorProcess(formObj,1,1);
	}
	return true;
}

function validateAlnum(formObj, minLen, tCase, numbers, spaces, puncs) {
	var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }
	var arrE = new Array();
	arrE[0] = (minLen == "*") ? "None" : minLen;
	var okChars = "";
	switch (tCase.toUpperCase()) {
		case 'U'	:	okChars = "A-Z"; arrE[1] = "UPPER"; break
		case 'L'	:	okChars = "a-z"; arrE[1] = "lower"; break;
		case 'C'	:	okChars = "A-Z][a-z"; if (minLen != "*") minLen--; arrE[1]="Initial capital"; break;
		default		:	okChars = "a-zA-Z"; arrE[1]="Any"; break;
	}
	if (parseInt(numbers)) { okChars += "0-9"; arrE[2] = "Yes"; } else arrE[2] = "No";
	if (parseInt(spaces)) { okChars += " "; arrE[3] = "Yes"; } else arrE[3] = "No";
	if (puncs == "all") { okChars += "."; arrE[4] = "All"; }
	if (puncs == "all") { okChars += puncStr("!@#$%^&*()_+-={}|[]:\";'<\\>?,.?~`"); arrE[4] = "All"; }
	else if (puncs == "none") arrE[4] = "None";
	else { okChars += puncStr(puncs); arrE[4] =  puncStr(puncs).replace(/\\/g,""); }
	var length = (minLen == "*") ? "+" : "{"+minLen+",}";
	var alnumReg = "^["+okChars+"]"+length+"$";
	var regex = new RegExp(alnumReg);
	if (!regex.test(formObj.value) )
		return errorProcess(formObj,1,1);
	return true;
}

function validateDecimal(formObj, lval, rval) {
	var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }
	
	(lval == '*')? lval = '*': lval = parseInt(lval);
	(rval == '*')? rval = '*': rval = parseInt(rval);
	var decReg = "";
	if (lval == 0)
		decReg = "^\\.[0-9]{"+rval+"}$";	
	else if (lval == '*')
		decReg = "^[0-9]"+lval+"\\.[0-9]{"+rval+"}$";
	else if (rval == '*')
		decReg = "^[0-9]{"+lval+"}\\.[0-9]"+rval+"$";
	else
		decReg = "^[0-9]{"+lval+"}\\.[0-9]{"+rval+"}$";
	var regex = new RegExp(decReg);
	if (!regex.test(formObj.value))
		return errorProcess(formObj,1,1);
	return true;
}

function validateSelect(formObj) {
	var objName = formatName(formObj);
	if (formObj.selectedIndex == 0)
		return errorProcess(formObj,0,1);
	return true;
}

function validateEmail(formObj)	{
	if (fv['bok'] && checkBlank(formObj)) {
		fv['bok']=false;
		return true;
	}
	var emailStr = formObj.value;
	var emailReg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid
	var emailReg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,6}|[0-9]{1,3})(\]?)$/; // valid
	if (!(!emailReg1.test(emailStr) && emailReg2.test(emailStr)))
		return errorProcess(formObj,1,1);
	return true;
}

function validateDateTime(formObj) {
	
      var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }
	datetimeReg = "^[0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2}[ ]?[0-9]{2}[:]?[0-9]{2}[:]?[0-9]{2}$";
	var regex = new RegExp(datetimeReg);
	if (!regex.test(formObj.value))
		return errorProcess(formObj,1,1);
	return true;
}

function validateDate(formObj) {
	
      var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }
	dateReg = "^[0-9]{4}[-]?[0-9]{2}[-]?[0-9]{2}$";
	var regex = new RegExp(dateReg);
	if (!regex.test(formObj.value))
		return errorProcess(formObj,1,1);
	return true;
}

function validateTime(formObj) {
	
      var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }
	timeReg = "^[0-9]{2}[:]?[0-9]{2}[:]?[0-9]{2}$";
	var regex = new RegExp(timeReg);
	if (!regex.test(formObj.value))
		return errorProcess(formObj,1,1);
	return true;
}

function validatePhone(formObj)	{

	var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }
	phoneReg = "^[0-9]{3}[-. ]?[0-9]{6}$";
	var regex = new RegExp(phoneReg);
	if (!regex.test(formObj.value))
		return errorProcess(formObj,1,1);
	return true;
}

function validateFile(formObj, extensions, cSens) {
	var objName = formatName(formObj);
	if (fv['bok'] && checkBlank(formObj))
		{ fv['bok']=false; return true; }

	cSens = (cSens) ? "" : "i";
	regExten = extensions.replace(/,/g,"|");
	var fileReg = "^.+\\.("+regExten+")$";
	var regex = new RegExp(fileReg,cSens);
	if (!regex.test(formObj.value)) {
		return errorProcess(formObj,1,1);
		}
	return true;
}

function addError(o) {
	errorData[errorData.length] = o;
	}

function formatName(o) {
	var wStr = (o.name) ? o.name : o.id;
	wStr = wStr.replace(/_/g," ");
	return wStr;
}

function errorProcess(o, sel, foc) {
	var ret = false;
	alert(o.getAttribute('error'));
	if (sel) o.select();
	if (foc) o.focus();
	o.className = 'FormInputError';
	return ret;
}

function clearStyle(o) {
	if (o.className == 'FormInputError')
		o.className = 'FormInput';
}

function puncStr(str) {
	str = str.replace("pipe", "|");
	return str.replace(/([\\\|\(\)\[\{\^\$\*\+\?\.])/g,"\\$1");
}


