function validateElements(elements) {
	for (var i = 0; i < elements.length; ++i) {
		var element = elements[i];
		if (element.getAttribute('data-bad')) {
			markRefill(element);
			return false;
		}
		var empty = (element.type == 'checkbox' && !element.checked) || !element.value || element.value.is_empty();
		if (empty) {
			var required = element.getAttribute('required');
			if (	!required
			||	/^\s*(?:false|no|0+)\s*$/.test(required)
			) {
				continue;
			}
			if (	element.nodeName != 'SELECT'
			||	!element.selectedIndex
			) {
				markRefill(element,'Je moet iets invullen! (%NAME%)');
				return false;
			}
			continue;
		}
		var pattern = element.getAttribute('pattern');
		if (pattern) {
			if (!RegExp(pattern).test(element.value)) {
				markRefill(element,'Invoer is niet correct! (%NAME%)'+(
					element.title
				?	"\n"+element.title
				:	''
				));
				return false;
			}
		}
		if (	element.nodeName == 'TEXTAREA'
		&&	element.name == 'PRESENCE'
		) {
			var lines = element.value.split(/[\r\n]+/);
			var oklines = [];
			var bad = false;
			for (var j = 0; j < lines.length; ++j) {
				var line = lines[j];
				if (line.match(/^\w+\s*:\s*(http.*)$/i)) {
					line = RegExp.$1;
				}
				if (line.match(/\s/)) {
					markRefill(element,'Je hebt spaties gebruikt. Zorg er voor dat je alleen exacte verwijzingen naar pagina\'s gebruikt!');
					return false;
				}
				oklines.push(line);
			}
			element.value = oklines.join('\n');
			continue;
		}
		var valid = element.getAttribute('data-valid');
		if (!valid) continue;
		switch (valid) {
		case 'float':
			if (!/^\s*\-?\d+(?:\.\d+)?\s*$/.test(element.value)) {
				markRefill(element,'Je moet een (fractioneel) getal invullen! (%NAME%)');
				return false;
			}
			continue;
		case 'email':
		case 'working-email':
			if (!/^\s*(?:[a-zA-Z0-9_\.\-]+)@(?:(?:[a-zA-Z0-9_\.\-]+)\.(?:[a-zA-Z]{2,4}))\s*$/.test(element.value)) {
				markRefill(element,'Je moet een emailadres invullen! (%NAME%)');
				return false;
			}
			if (	valid == 'working-email'
//			&&	element.value != element.getAttribute('data-original')
			) {
				var ereq = initrequest(true);
				if (!ereq) return false;
				ereq.open('POST','/email.check',false);
				ereq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
				ereq.send('EMAIL=' + urlencode_utf8_to_windows1252(element.value)[0]);
				if (ereq.status != 200) {
					markRefill(element,"Je moet een werkend emailadres invullen! (%NAME%)\n" + ereq.responseText);
					return false;
				}
			}
			continue;
 		case 'number_or_none':
			if (!/^\s*\d*\s*$/.test(element.value)) {
				markRefill(element,'Je moet een nummer of niets invullen! (%NAME%)');
				return false;
			}
		case 'number':
			if (	valid == 'number'
			&&	!/^\s*\d+\s*$/.test(element.value)
			) {
				markRefill(element,'Je moet een nummer invullen! (%NAME%)');
				return false;
			}
			var min = element.getAttribute('min');
			var max = element.getAttribute('max');
			if (min || max) {
				var num = parseInt(element.value);
				if (min != null && num < min) {
					markRefill(element,'Je moet minimaal %MIN% invullen! (%NAME%)',{MIN:min});
					return false;
				}
				if (max != null && num > max) {
					markRefill(element,'Je kan maximaal %MAX% invullen! (%NAME%)',{MAX:max});
					return false;
				}
			}
			continue;
		case 'intl-tel':
			if (!/^\s*\+/) {
				markRefill(element,'Je moet een internationaal telefoonnummer in vullen, beginnend met + en landencode (%NAME%)');
				return false;
			}
			continue;
		}
	}
	return true;
}
function submitForm(form,func,arg) { try {
	if (form.submitted) return false;
	form.submitted = true;
	hideSubmits(form,true);
	if (	!validateElements(form.elements)
	||	func
	&&	!func.call(this,form,arg)
	) {
		hideSubmits(form,false);
		form.submitted = false;
		return false;
	}
	return true;
} catch (e) {
	catchLog(e);
	return false;
}}
if (Browser.RemembersDOM) addevent(window,'pageshow',function(event) {
	if (!event.persisted) {
		return;
	}
	for (var i = 0; i < document.forms.length; ++i) {
		var form = document.forms[i];
		if (form.submitted) {
			hideSubmits(form,false);
			form.submitted = false;
		}
	}
},false);
function resetSubmits(form) {
	form.submitted = false;
	hideSubmits(form,false);
}
function hideSubmits(form,hide) {
	setclass(form,hide,'light');
/*	for (var i = 0; i < form.elements.length; ++i) {
		var inputelem = form.elements[i];
		if (	inputelem.tagName != 'INPUT'
		||	inputelem.type != 'submit'
		) {
			continue;
		}
		setclass(inputelem,hide,'light');
	}*/
}
function clearRefill(event) {
	remclass(this,'refill');
	setdisplay('messages',false,true);
	remevent(this,event.type,arguments.callee);
}
function markRefill(obj,errstr,map,type) {
	var formobj;
	if (obj.form) {
		formobj = obj.form;
	} else {
		var container = obj;
		formobj = obj;
		while ((formobj = formobj.parentNode) && !formobj.form) {}
	}
	obj.scrollIntoView(false);
	addclass(obj,'refill');
	addevent(obj,'change',clearRefill);
	addevent(obj,'keydown',clearRefill);
	if (formobj) {
		resetSubmits(formobj);
	}
	pf.focus(obj);
	if (!map) map = {};
	map.NAME = obj.name ? obj.name : obj.id;
	if (errstr) {
		showerrors(errstr,type ? type : ERR_TO_ALERT,map);
	}
}
function build_poststr(form,fields) {
	var poststr = '';
	for (var i = 0; i < form.elements.length; ++i) {
		var input = form.elements[i];
		if (!input.name || input.disabled) continue;
		if (fields) {
			if (	false && fields.indexOf
			?	-1 == fields.indexOf(input.name)
			:	!function(){
				for (var i = 0; i < fields.length; ++i) {
					if (fields[i] == input.name) {
						return true;
					}
				}
				return false;
			}()
			) {
				continue;
			}
		}
		switch (input.type) {
		case 'checkbox':
		case 'radio':
			if (input.checked) {
				if (poststr) poststr += '&';
				poststr += input.name + '=' + urlencode_utf8_to_windows1252(input.value)[0];
			}
			break;
		default:
			if (poststr) poststr += '&';
			poststr += input.name + '=' + urlencode_utf8_to_windows1252(input.value)[0];
			break;
		}
	}
	return poststr;
}
String.prototype.is_empty = function() {
	return !this.length || /^[0\n\r\t\s\xA0\xAD]*$/.test(this);
}
String.prototype.trim = function() {
	return this.replace(/^[\n\r\t\s\xA0\xAD]+/g,'').replace(/[\n\r\t\s\xA0\xAD]+$/g,'');
}
function disable(id) {
	enable(id,false);
}
function enable(arg,yes) {
	var objs = [];
	if (typeof arg == 'string') {
		arg = getobj(arg,true);
	}
	if (typeof arg != 'object') {
		return;
	}
	if (	!(arg instanceof NodeList)
	&&	!(arg instanceof Array)
	&&	!(arg instanceof HTMLCollection)
	) {
		arg.disabled = !yes;
		if (arg.nodeName == 'FIELDSET') {
			var objs = arg.getElementsByTagName('input');
			if (objs) enable(objs,yes);
			objs = arg.getElementsByTagName('textarea');
			if (objs) enable(objs,yes);
		}
		return;
	}
	for (var i = 0; i < arg.length; ++i) {
		var obj = arg[i];
		obj.disabled = !yes;
	}
}
function move_to_end(textarea) {
	//	textarea.createTextRange:	IE
	//	textarea.setSelectionRange:	Chrome, Firefox, Opera, Safari
	if (textarea.createTextRange) {
		var range = textarea.createTextRange();
		range.moveStart('character',textarea.value.length);
		range.select();
	} else if (textarea.setSelectionRange) {
		var textLen = textarea.textLength ? textarea.textLength : textarea.value.length;
		textarea.setSelectionRange(textLen,textLen);
	}
	textarea.scrollTop = textarea.scrollHeight;
}
/*function catch_ctrls(elem) {
	var areas = elem.getElementsByTagName('textarea');
	if (!areas) return;
	for (var i = 0; i < areas.length; ++i) {
		catch_ctrl(area);
	}
}
function catch_ctrl(area) {
	if (area.catchcrl) return;
	area.catctctrl = true;
	if (!area.form) return;
	var inputs = area.form.getElementsByTagName('input');
	var submits = 0;
	var submit;
	for (var j = 0; j < inputs.length; ++j) {
		var input = inputs[j];
		if (input.type == 'submit') ++submits;
		submit = input;
	}
	if (submits > 1) return;
	addevent(area,'keydown',function(e){
		if (!this.form) return;
		if (e.ctrlKey && e.keyCode == 13) {
			if (this.form.onsubmit()) {
				this.form.submit();
			}
		}
	});
}*/
function growMe(self) {
	if (!self.prevRows) {
		self.prevRows = self.rows;
	}
	self.rows = self.value.split('\n').length;
}
function shrinkMe(self) {
	if (self.prevRows) self.rows = self.prevRows;
}

