function contactForm (formId, action) {
	
	var self				= this;
	var _base				= document.getElementById(formId);
	var _tagNamesArray		= new Array();
	var _typeNamesArray 	= new Array();
	var _validationTypes	= new Array();
	var _inputsArray		= new Array();
	var action				= action;
	
	_tagNamesArray[_tagNamesArray.length] = 'input';
	_tagNamesArray[_tagNamesArray.length] = 'textarea';
	_tagNamesArray[_tagNamesArray.length] = 'select';
	
	_typeNamesArray[_typeNamesArray.length] = 'text';
	_typeNamesArray[_typeNamesArray.length] = 'password';
	_typeNamesArray[_typeNamesArray.length] = 'radio'; 
	_typeNamesArray[_typeNamesArray.length] = 'checkbox';
	_typeNamesArray[_typeNamesArray.length] = 'file';
	_typeNamesArray[_typeNamesArray.length] = 'hidden';
	
	_validationTypes[_validationTypes.length] = 'vText';
	_validationTypes[_validationTypes.length] = 'vMail';
	_validationTypes[_validationTypes.length] = 'vTel';
	_validationTypes[_validationTypes.length] = 'vSelect';
	_validationTypes[_validationTypes.length] = 'vZipCode';
	_validationTypes[_validationTypes.length] = 'vNo';
	
	
	var _init = function () {
		if (_base === undefined || _base == null) {
			return false;
		}
		
		_formLoop(_base);
		
	};
	
	var _formLoop = function (object) {
		for ( var i = 0; i < object.children.length; i++ ) {
			
			if (in_array(object.children[i].tagName.toLowerCase(), _tagNamesArray)) {
				_setActions(object.children[i]);
			} else {
				if (object.children[i].children.length > 0)
					_formLoop(object.children[i]);
			}
				
		}
		return;
	};
	
	var _setActions = function (object) {
		if (object.tagName.toLowerCase() == 'input') {
			if (in_array(object.type.toLowerCase(), _typeNamesArray)) {
				var validationType = object.className.split(' ');
				if (validationType.length == 2) {
					validationType = validationType[1];
					for ( var i = 0; i < _validationTypes.length; i++ ) {
						if (validationType == _validationTypes[i]) {
							_inputsArray[_inputsArray.length] = object;
							eval('_set' + _validationTypes[i] + '(object)');
						}
					}
				} else {
					for ( var i = 0; i < _validationTypes.length; i++ ) {
						if (object.className == _validationTypes[i]) {
							_inputsArray[_inputsArray.length] = object;
							eval('_set' + _validationTypes[i] + '(object)');
						}
					}
				}
			} else {
				var validationType = object.className.split(' ');
				if (validationType.length == 2) {
					if (validationType[1] == 'SEND') {
						_setSubmitAction(object);
					}
				} else {
					if (object.className == 'SEND') {
						_setSubmitAction(object);
					}
				}
			}
		} else if (object.tagName.toLowerCase() == 'textarea') { 
			var validationType = object.className.split(' ');
			if (validationType.length == 2) {
				validationType = validationType[1];
				for ( var i = 0; i < _validationTypes.length; i++ ) {
					if (validationType == _validationTypes[i]) {
						_inputsArray[_inputsArray.length] = object;
						eval('_set' + _validationTypes[i] + '(object)');
					}
				}
			} else {
				for ( var i = 0; i < _validationTypes.length; i++ ) {
					if (object.className == _validationTypes[i]) {
						_inputsArray[_inputsArray.length] = object;
						eval('_set' + _validationTypes[i] + '(object)');
					}
				}
			}
		} else if (object.tagName.toLowerCase() == 'select') {
			var validationType = object.className.split(' ');
			if (validationType.length == 2) {
				validationType = validationType[1];
				for ( var i = 0; i < _validationTypes.length; i++ ) {
					if (validationType == _validationTypes[i]) {
						_inputsArray[_inputsArray.length] = object;
						eval('_set' + _validationTypes[i] + '(object)');
					}
				}
			} else {
				for ( var i = 0; i < _validationTypes.length; i++ ) {
					if (object.className == _validationTypes[i]) {
						_inputsArray[_inputsArray.length] = object;
						eval('_set' + _validationTypes[i] + '(object)');
					}
				}
			}
		} else {
			var validationType = object.className.split(' ');
			if (validationType.length == 2) {
				if (validationType[1] == 'SEND') {
					_setSubmitAction(object);
				}
			} else {
				if (object.className == 'SEND') {
					_setSubmitAction(object);
				}
			}	
		}
	};
	
	var _setvText = function (object) {
		_addFlush(object);
		
		object.onchange = function () {
			self.vText(this);
		};
	};
	
	var _setvMail = function (object) {
		_addFlush(object);
		
		object.onchange = function () {
			self.vMail(this);
		};	
	};	
	
	var _setvSelect = function (object) {
		object.onchange = function () {
			self.vSelect(this);
		};
	};
	
	var _setvTel = function (object) {
		_addFlush(object);
		
		object.onchange = function () {
			self.vTel(this);
		};
	};
	
	var _setvZipCode = function (object) {
		_addFlush(object);
		
		object.onchange = function () {
			self.vZipCode(this);
		};
	};
	
	var _setvNo = function (object) {
		_addFlush(object);
	};
	
	var _setSubmitAction = function (object) {
		object.onclick = function () {
			self.send();
			return false;
		};
	};
	
	var _addFlush = function (object) {
		object.style.fontStyle = 'italic';
		object.onfocus = function () {
			if (this.value == this.defaultValue) {
				this.value = '';
				this.style.fontStyle = '';
			}
		};
		object.onblur = function () {
			if (this.value == '') {
				this.value = this.defaultValue;
				this.style.fontStyle = 'italic';
			}
		};
		return;
	};
	
	// onchange Validation functies
	this.vText = function (object) {
		if (object.type != 'hidden') {
			if (object.value != object.defaultValue) {
				
				if (object.value.length > 1) {
					valid(object);
				} else {
					invalid(object);
				}
				
			} else {
				invalid(object);
			}
		}
	};
	
	this.vSelect = function (object) {
		if (object.selectedIndex == 0) {
			invalid(object);
		} else {
			valid(object); 
		}
	};
	
	this.vMail = function (object) {
		if (object.value != object.defaultValue) {
			var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
			if(reg.test(object.value)) {
				valid(object);
			} else {
				invalid(object);
			}
		} else {
			invalid(object);
		}
	};
	
	this.vTel = function (object) {
		if (object.value != object.defaultValue) {
			var reg = /^([0-9_\-\_\(\_\)\.])/;
			if (object.value.length > 9) {
				if (reg.test(object.value)) {
					valid(object);
				} else {
					invalid(object);
				}
			} else {
				invalid(object);
			}
		} else {
			invalid(object);
		}
	};
	
	this.vZipCode = function (object) {
		if (object.value != object.defaultValue) {
			var splitter = object.value.split(' ');
			if (splitter.length == 2) {
				var reg = /^([0-9])/;
				if(reg.test(splitter[0]) && splitter[0].length == 4) {
					var reg = /^([A-Z])/;
					if (reg.test(splitter[1]) && splitter[1].length == 2) {
						valid(object);
					} else {
						invalid(object);
					}
				} else {
					invalid(object);
				}
 			} else {
 				invalid(object);
 			}
		} else {
			invalid(object);
		}
	};
	
	this.vNo = function (object) {
		valid(object);
		return;
	};
	
	// Invalid & valid Functies
	var invalid = function (object) {
		var splitter = object.className.split(' ');
		var classname = '';
		var check = false;
		for ( var i in splitter) {
			if (splitter[i] != 'valid') {
				classname += splitter[i] + ' ';
			}
			if (splitter[i] == 'invalid') {
				check = true;
			}
		}
		
		if (!check) {
			object.className = 'invalid ' + classname;
		}
		return;
	};
	
	var valid = function (object) {
		var splitter = object.className.split(' ');
		var classname = '';
		var check = false;
		for ( var i in splitter) {
			if (splitter[i] != 'invalid') {
				classname += splitter[i] + ' ';
			}
			if (splitter[i] == 'valid') {
				check = true;
			}
		}
		
		if (!check) {
			object.className = 'valid ' + classname;
		}
		return;
	};
	
	
	// Send functie 
	this.send = function () {
		_validateForm(_base);
		if (_checkForm(_base)) {
			if (action != 'vacatures') { 
				var post = _getPostData();
				
				_base.innerHTML = '';
				
				var image = document.createElement('img');
					image.src = baseUrl + 'source/img/ajax-loader.gif';
					image.alt = 'Uw bericht wordt verzonden';
					image.title = 'Uw bericht wordt verzonden';
					_base.appendChild(image);
				
				var ajax = new ajaxcall(siteUrl + action + '/verzenden', post);
				ajax.onload = function (data) {
					data = ajax.toJSON(data);
					_base.removeChild(image);
					if (data[0] == 'true') {
						_succes();
					} else {
						_error();
					}
				};
			} else {
				_base.submit();
				return true;
			}	
			
		} else {
			return false;
		}
	};
	
	var _validateForm = function (object) {
		for ( var i = 0; i < _inputsArray.length; i++ ) {
			var validationType = _inputsArray[i].className.split(' ');
			if (validationType.length == 2) {
				validationType = validationType[1];
				for ( var i2 = 0; i2 < _validationTypes.length; i2++ ) {
					if (validationType == _validationTypes[i2])
						eval('self.' + _validationTypes[i2] + '(_inputsArray[i])');
				}
			} else {
				for ( var i2 = 0; i2 < _validationTypes.length; i2++ ) {
					if (_inputsArray[i].className == _validationTypes[i2]) {
						eval('self.' + _validationTypes[i2] + '(_inputsArray[i])');
					}
				}
			}
		}
		return;
	};
	
	var _checkForm = function () {
		for ( var i = 0; i < _inputsArray.length; i++ ) {
			var validationType = _inputsArray[i].className.split(' ');
			for ( var i2 = 0; i2 < validationType.length; i2++) {
				if (validationType[i2] == 'invalid') {
					return false;
				}
			}
		}
		
		return true;
	};
	
	var _getPostData = function () {
		var url = '';
		for ( var i = 0; i < _inputsArray.length; i++ ) {
			url += _inputsArray[i].name + '=' + _inputsArray[i].value.replace('&', '&amp;');
			if (i != (_inputsArray.length - 1)) {
				url += '&';
			}
		}
		return url;
	};
	
	
	var _succes = function () {
		var comment 			= document.createElement('span');
			comment.className 	= 'comment';
			comment.innerHTML 	= 'Uw e-mailbericht is verzonden en wordt zo spoedig mogelijk gelezen en waar nodig beantwoord.';
			_base.appendChild(comment);
	};
	
	var _error = function () {
		var comment 			= document.createElement('span');
			comment.className 	= 'comment';
			comment.innerHTML 	= 	'Er is een fout opgetreden tijdens het verzenden van het contactformulier. <br />' + 
									'Probeert u het later nog eens.';
			_base.appendChild(comment);
	};
	
	_init();
};
