function control(obj, typ) { //v2.0
	switch (typ) {
		case 'numeric':
			if (arguments[2]!=null) var retmp = "^\\d{" + arguments[2] + "}$"; else var retmp = "^\\d+$";
			var re = new RegExp(retmp);
			if (obj.length) {
				var result = true;
				for (var i=0;i<obj.length;i++) result = result && re.test(obj[i].value);
			} else {
				result = re.test(obj.value);
			}
			break;
		case 'range':
			if (obj.value!=''){
				if (arguments[3]!=null){
					if (obj.value>=arguments[2] && obj.value<=arguments[3]) var result = true; else var result = false;
				} else {
					if (obj.value>=arguments[2]) var result = true;	else var result = false;
				}
			}	else var result = false;
			break;
		case 'alpha':
			if (obj.length) {
				var result = true;
				for (var i=0;i<obj.length;i++) result = result && (obj[i].value!='');
			} else {
				result = (obj.value!='');
			}
			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*)+$/;
			if (obj.length) {
				var result = true;
				for (var i=0;i<obj.length;i++) result = result && re.test(obj[i].value + ";");
			} else {
				var result = re.test(obj.value + ";");
			}
			break;
		case 'date':
			if (obj.length) {
				var ovalue = obj[0].value + '/' + obj[1].value + '/' + obj[2].value;
				var d = parseInt(obj[0].value, 10);
				var m = parseInt(obj[1].value, 10);
				var y = parseInt(obj[2].value, 10);
			} else {
				var ovalue = obj.value;
				var d = parseInt(ovalue.substr(0,2), 10);
				var m = parseInt(ovalue.substr(3,2), 10);
				var y = parseInt(ovalue.substr(6), 10);
			}
			var re = /^(0?\d|[012]\d|[3][01])(\/|-|.)(0?\d|[01][012])\2\d{2,4}$/;
			var result = re.test(ovalue);
			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 '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 'password':
			if (obj.value!='' && obj.form.elements[obj.name + 'Bis'].value!='' && obj.value==obj.form.elements[obj.name + 'Bis'].value) var result = true; else var result = false;
			break;
		case 'phone':
			var re = /^(?:0\d(?:\s?\d){8})|(((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1})$/
			var result = re.test(obj.value);
			break;
		case 'captcha':
			var retmp = "^\\d{8}$";
			var re = new RegExp(retmp);
			var result = re.test(obj.value);
			break;
		default:
			var result = false;
			break;
	}
	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 getElementsByClassName(searchClass, node) {
	var classElements = new Array();
	if (node == null) node = document;
	var tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function controlFields(fields) {
	var ret = true;
	for (var i = 0;i<fields.length;i++) {
		var ctrl = fields[i][0];
		if (ctrl) {
			var nb; if (fields[i].length>2) nb = fields[i][2]; else nb = null;
			if (!control(ctrl, fields[i][1], nb)) {
				ret = false;
				if (ctrl.length) {
					for (var j=0;j<ctrl.length;j++) { ctrl[j].className += ' error'; ctrl[j].onclick = clickAfterError; }
				} else {
					ctrl.className += ' error'; ctrl.onclick = clickAfterError;
					if (fields[i][1]=='password') { ctrl.form.elements[ctrl.name + 'Bis'].className += ' error'; ctrl.form.elements[ctrl.name + 'Bis'].onclick = clickAfterError; }
				}
				var ctrlFE = getElementsByClassName("controlFieldsError", ctrl.form)[0];
				ctrlFE.style.display = 'block';
				if (arguments[1]!=null) ctrlFE.innerHTML = arguments[1];
			}
		}
		else ret = false;
	}
	return ret
}

function clickAfterError() {
	var items = getElementsByClassName("error", this.form);
	for (var i = 0;i<items.length; i++) items[i].className = items[i].className.replace(/\s*error/gi, '');
	getElementsByClassName("controlFieldsError", this.form)[0].style.display = 'none';
}

function controlRequired(form) {
	var req = '';
	if (arguments[1]!=null)
		req = arguments[1];
	else
		if (form.required.length) { req = form.required[0].value; for (var i = 1;i<form.required.length; i++) if (form.required[i].value.length>0) req = req + ', ' + form.required[i].value; } else req = form.required.value;

	if (req.length>0)
		return eval('controlFields([[form.' + req.replace(/, /gi, '\'], [form.').replace(/: /gi, ', \'') + '\']])');
	else
		return true;
}
