function validateFrom(formID, eng) {

	var frm = document.getElementById(formID);
	var identicalFields = new Array();
	var errorBGC = "#ffcccc";
	var correctBGC = "#ffffff";
	var dd=null, mm=null, mmm=null, yy=null;
	var smonth = {jan:0, feb:1, mar:2, apr:3, may:4,jun:5,jul:6, aug:7,sept:8,sep:8,oct:9,nov:10,dec:11}
	for (var i=0; i < frm.length; i++) {
		var field = frm.elements[i];
		var fieldValue = frm.elements[i].value;
		var fieldTitle = frm.elements[i].getAttribute("title");
		
		var identical = field.getAttribute("identical");
		var isDate = field.getAttribute("isDate");
		var isEmail = field.getAttribute("isEmail");
		var isRegExp = field.getAttribute("isRegExp");
		var maxchars = parseInt(field.getAttribute("maxchars"));
		var minchars = parseInt(field.getAttribute("minchars"));
		var requiredField = parseInt(field.getAttribute("required"));
		
		
		//requiredField 1 - select, 2 - input text, 3 - email
		//identical = "unique group name" so it can be used to compare
	
		if (requiredField) {
			field.style.backgroundColor = errorBGC;	
			
			var isSelect = (field.type=="select-one");
			if ((field.type=="textarea") || (field.type=="text") || (field.type=="password")) field.value = fieldValue = trim(fieldValue);
			
			if (fieldValue==""){
				var txt = isSelect?"選擇":"輸入";
				if (eng) { 
					var txt = isSelect?"select":"enter";
					alert("Please "+txt+" your '" + fieldTitle + "'." );
				} else {
					alert("請"+ txt +"你的 '" + fieldTitle + "'。" );
				}
				field.focus();			
				if (!isSelect) field.select();
				return false;
				break;
			} else if (field.type == "radio") {
				var fieldSelected = false;
				var groupname = field.getAttribute("groupname");
				fields = document.getElementsByName(field.id);
				for (var k=0; k< fields.length; k++) {
					if (fields[k].checked) {
					fieldSelected = true;
					break;
					}
				}
				if (!fieldSelected) {
					if (eng) {
						alert("Please select your '" + groupname + "'." );
					} else {
						alert("請選擇你的 '" + groupname + "'。" );
					}
					field.focus();
					return false;
				}
			}
			
			field.style.backgroundColor = correctBGC;	
		} 
		
		if (!isNaN(maxchars)) {
			field.style.backgroundColor = errorBGC;	
			var cl = frm.elements[i].value.length;
			var ml =maxchars;
			if (cl > ml) {
				if (eng) {
					alert( "'" + fieldTitle+"' can have a maximum of " + maxchars +"characters.");
				} else {
					alert( "'" + fieldTitle+"' 最多可以輸入" + maxchars +"個字。");
				}
				field.select();
				field.focus();
				return false;
				break;
			}
			field.style.backgroundColor = correctBGC;	
		} 
		
		if ( (!isNaN(minchars)) && (requiredField) ) {
			field.style.backgroundColor = errorBGC;	
			var cl = frm.elements[i].value.length;
			var ml =minchars;
			if (cl < ml) {
				if (eng) {
					alert( "'" + fieldTitle+"' must have at least" + minchars +" characters.");
				} else {
					alert( "'" + fieldTitle+"' 請最少輸入" + minchars +"個字。");
				}
				field.select();
				field.focus();
				return false;
				break;
			}
			field.style.backgroundColor = correctBGC;	
		}
		
		if (isEmail) {
			field.style.backgroundColor = errorBGC;
			var validEmail = validateEmail(fieldValue);
			if (!validEmail) {
				if (eng) {
					alert("Incorret email address, please enter again.'" );
				} else {
					alert("電郵地址不正確，請再次輸入。'" );
				}
				field.focus();
				field.select();
				return false;
			}
			field.style.backgroundColor = correctBGC;	
		}
		
		if (identical && (identicalFields[identical] == null) ) {
			// store the field value in reenterFields array and check if a sceond value matches
			identicalFields[identical] = fieldValue;
		} else if (identical) {
			field.style.backgroundColor = errorBGC;
			if (fieldValue != identicalFields[identical]) {
				if (eng) {
					alert("You '" + fieldTitle + "' mismatch, please enter again." );
				} else {
					alert("你的 '" + fieldTitle + "' 不相同， 請再次輸入。" );
				}
				field.focus();
				field.select();				
				return false;
			}
			field.style.backgroundColor = correctBGC;
		}
		
		if (isRegExp) {
			var regExp= eval(isRegExp);
			//var regExp = new RegExp();
			var correct = regExp.test(fieldValue);
			if(!correct) {
				if (eng) {
					alert("You '" + fieldTitle + "' is incorrect, please enter again." );
				} else {
					alert("你的 '" + fieldTitle + "' 格式不正確， 請再次輸入。" );
				}
				field.focus();
				field.select();				
				return false;
			}
		}
		
		
		if (isDate) {
			switch (isDate) {
				case "dd":
					dd = fieldValue
					var dField = field;
					var dFieldTitle = fieldTitle;
					break;
				case "mm":
					mm = fieldValue
					var mField = field;
					var mFieldTitle = fieldTitle;
					break;
				case "mmm":
					mm = smonth[String(fieldValue).toLowerCase()];
					var mField = field;
					var mFieldTitle = fieldTitle;
					break;
				case "yy":
					yy = fieldValue;
					var yField = field;
					var yFieldTitle = fieldTitle;
					break;
			}

			if (dd && (mm || mmm) && yy) {
				var enterDate = new Date();
				enterDate.setFullYear(yy, mm, dd, 0, 0, 0);
				correctDate = (enterDate.getDate() == dd);
				if (!correctDate) {
					if (eng) {
						alert("You '"+dFieldTitle+"' incorrect, please enter again." );
					} else {
						alert("你的 '"+dFieldTitle+"' 不正確，請再次輸入。'" );
					}
					dField.style.backgroundColor = errorBGC;
					mField.style.backgroundColor = errorBGC;
					yField.style.backgroundColor = errorBGC;
					dField.focus();
					return false;
				}
			}
			
			if (dField) dField.style.backgroundColor = correctBGC;
			if (mField) mField.style.backgroundColor = correctBGC;
			if (yField) yField.style.backgroundColor = correctBGC;
		}
		
	}
	
	return true;
}

function validateEmail(inputemail){
	var emailPattern = /[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/; 
	return emailPattern.test(inputemail);
}


function fn_formDataToString(formID) {
	var frm = document.getElementById(formID);
	var frmstring = '';
	for (var i=0; i < frm.length; i++) {
		if ( ((frm.elements[i].type == "radio") || (frm.elements[i].type == "checkbox")) && (!frm.elements[i].checked)) continue;

		frmstring += "&" + frm.elements[i].id + "=" + frm.elements[i].value;
	}
	return frmstring;
}

function fn_inputcountchar(inputId,maxchar,displayid, remain, restrict) {
	var dispObj = document.getElementById(displayid);
	var inputObj = document.getElementById(inputId);
	var maxchar = parseInt(maxchar);
	if (!inputObj || isNaN(maxchar)) return;
	
	//retrict only max char to input
	if (restrict) inputObj.value = String(inputObj.value).substring(0,maxchar);
	
	var charLength = String(inputObj.value).length;
	
	//cal char length or remain
	numchar = charLength;
	if (remain) {
		numchar = ((maxchar - charLength) < 0) ? 0: (maxchar - charLength);
	}
	
	
	//set display
	if (dispObj) {
		dispObj.innerHTML = numchar;
	}

	return numchar;
}

function trim (str) {
	if (str=="") return "";
	var	str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}