function control(obj, typ) { //v1.5
	switch (typ) {
		case 'numeric':
			if (arguments[2]!=null) var retmp = "^\\d{" + arguments[2][2] + "}$"; else var retmp = "^\\d+$";
			var re = new RegExp(retmp);
			var result = re.test(obj.value);
			break;
		case 'range':
			if (obj.value!='' && arguments[2]!=null){
				if (arguments[2][3]!=null) {
					if (obj.value>=arguments[2][2] && obj.value<=arguments[2][3]) var result = true; else var result = false;
				} else {
					if (obj.value>=arguments[2][2]) var result = true; else var result = false;
				}
			}	else var result = false;
			break;
		case 'alpha':
			if (obj.value!='') var result = true; else var result = false;
			break;
		case 'email':
			var re = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
			var result = re.test(obj.value);
			break;
		case 'emails':
			var re = /^(\w+(?:[-+.]\w+)*@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*\s*;\s*)+$/;
			var result = re.test(obj.value + ";");
			break;
		case 'date':
			var re = /^(0?\d|[012]\d|[3][01])(\/|-|.)(0?\d|[01][012])\2\d{2,4}$/;
			var result = re.test(obj.value);
			var d = parseInt(obj.value.substr(0,2), 10);
			var m = parseInt(obj.value.substr(3,2), 10);
			var y = parseInt(obj.value.substr(6), 10);
			if (result) result = result && isDate(y, m, d);
			break;
		case 'heure':
			var re = /^(0?\d|[1]\d|[2][0123])(\:)(0?\d|[012345]\d)((\:)(0?\d|[012345]\d))?$/;
			var result = re.test(obj.value);
			break;
		case 'selected':
			var result = (obj.selectedIndex>0);
			break;
		case 'ifselected':
			var result = true;
			if (arguments[2]!=null) {
				var o = arguments[2][2];
				var i = arguments[2][3];
				var t = arguments[2][4];
				if (o[o.selectedIndex].value == i) result = control(obj, t);
			}
			break;
		case 'checked':
			var result = false;
			if (obj.length) {
				for (var i=0;i<obj.length;i++) if (obj[i].checked) result = true;
			} else {
				if (obj.checked) result = true;
			}
			break;
		case 'ifchecked':
			var result = true;
			if (arguments[2]!=null) {
				var o = arguments[2][2];
				var i = arguments[2][3];
				var t = arguments[2][4];
				if (o[i].checked) result = control(obj, t);
			}
			break;
		default:
			var result = false;
			break;
	}
	//if (!result) obj.focus();
	return result;
}

function getYear(d) { //v1.0
	return (d<1000) ? d + 1900 : d;
}

function isDate(year, month, day) { //v1.0
	month = month - 1;  // javascript month range : 0- 11
	var tempDate = new Date(year,month,day);
	if ((getYear(tempDate.getYear())==year) &&
		 (month==tempDate.getMonth()) &&
		 (day==tempDate.getDate()))
		return true;
	else
		return false;
}

function controlFields(fields) {
	var ret = true;
	for (i = 0; i<fields.length; i++) {
		var ctrl = fields[i][0];
		var nb; if (fields[i].length>2) nb = fields[i]; else nb = null;
		if (!control(ctrl, fields[i][1], nb)) {
			ret = false;
			if (fields[i][1]!='checked') {
				ctrl.className = 'error';
				ctrl.onclick = clickAfterError;
			} else {
				getElementByCondition(function(el) { if (el.id.indexOf(ctrl[0].name)>-1) { el.className = 'error'; el.onclick = clickAfterError; return el; }});
			}
			document.getElementById("controlFieldsError").style.display = 'block';
		}
	}
	return ret;
}

function clickAfterError() {
	getElementByCondition(function(el) { if (el.className=='error') { el.className = ''; return el; }});
	document.getElementById("controlFieldsError").style.display = 'none';
}

function getElementByCondition(condition, container) {
	container = container || document;
	var all = container.all || container.getElementsByTagName('*');
	var arr = [];
	for (var k=0;k<all.length;k++) {
		var elm = all[k];
		if (condition(elm, k)) arr[arr.length] = elm;
	}
	return arr;
}

function getElementByClassName(className) {
	return getElementByCondition(function(el) { if (el.className==className) return el; });
}