/* spaties voor en achter string verwijderen */ 
	function trim(value) {
		value = value.replace(/^\s+/,'');
		value = value.replace(/\s+$/,'');
		return value;
	}
	function formValidator(formElement) {
		this.form = formElement;
	}

	/* Private functions */
	formValidator.prototype.isTextElement = function(element) {
		if ((element.type) && (element.type.match(/^(text|textarea|file|password|hidden)$/i))) return true; else return false;
	}
	formValidator.prototype.giveFocus = function(element) {
		if ((!element.disabled)&&(element.focus)) element.focus();
	}

	/* Public functions */
	formValidator.prototype.inputValueTest = function(elementName, required, validRegEx) {
		var element     = this.form.elements[elementName];
		var elementType = element.nodeName?(element.nodeName.toLowerCase()=="input"?(element.type?element.type.toLowerCase():"unknown"):(element.nodeName.toLowerCase().search(/^(textarea|select)$/i)>=0?element.nodeName.toLowerCase():"unknown")):(element[0]?(element[0].type?(element[0].type.toLowerCase()=="radio"?"radio":"unknown"):"unknown"):"unknown");
		switch (elementType) {
			case "text" :
			case "textarea" :
			case "hidden" :
				var value = element.value;
				value = value.replace(/^\s+|\s+$/mg, '');		// strip leading & trailing spaces
				value = value.replace(/[ \t]+/g, ' ');			// strip subsequent spaces, respects newlines
				if ((value == '') && (!required)) return true;				
				if (validRegEx.test(value)) { element.value = value; return true; } else { this.giveFocus(element); return false; }
			break;
			case "select" :
				var value = element.value;
				if (!required) return true;
				if (validRegEx.test(value)) { return true; } else { this.giveFocus(element); return false; }
			break;
			case "file" :
				var value = element.value;
				if ((value == '') && (!required)) return true;
				if (validRegEx.test(value)) { return true; } else { return false; }
			break;
			case "password" :
				var value = element.value;
				if ((value == '') && (!required)) return true;
				if (validRegEx.test(value)) { return true; } else { this.giveFocus(element); return false; }
			break;
			case "checkbox" :
				if (!required) { return true; } else { return element.checked; }
			break;
			case "radio" :
				if (!required) return true;
				for (var i=0; i<element.length; i++) if (element[i].checked) { return true; break; }
				return false;
			break;
		}
	}

	formValidator.prototype.inputCompare = function(elementName1, elementName2) {
		var element1 = this.form.elements[elementName1];
		var element2 = this.form.elements[elementName2];
		if (element1.value&&element2.value) {
			if (element1.value == element2.value) return true; else return false;
		} else return false;
	}

	formValidator.prototype.inputArrayCountTest = function(elementName, minCount, maxCount) {
		var cBoxes = this.form.elements[elementName];
		var checkCount = 0; for (var i=0; i<cBoxes.length; i++) if (cBoxes[i].checked) checkCount++;
		if (checkCount < minCount) return false;
		if (maxCount&&(checkCount>maxCount)) return false;
		return true;
	}

	formValidator.prototype.inputArrayIndexTest = function(elementName, index) {
		var cBoxes = this.form.elements[elementName];
		if (index<cBoxes.length) { return cBoxes[index].checked; } else { return false; }
	}


	/* Preformatting functions */

	// preFormatInitials: zet ingevulde waarden om in hoofdletters met punten ertussen
	formValidator.prototype.preFormatInitials = function(elementName) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			var value    = element.value.replace(/[^a-zA-Z]/g,"");
			var newvalue = "";
			for (var i=0;i<value.length;i++) {
				newvalue += value.charAt(i).toUpperCase()+".";
			}
			element.value = newvalue;
		}
	}

	// preFormatNumeric: verwijdert alle tekens dat geen cijfer is uit de ingevulde waarden
	formValidator.prototype.preFormatNumeric = function(elementName) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			element.value = element.value.replace(/\D/g,"");
		}
	}

	// preFormatUcfirst: zet de ingevulde waarden om in 1e teken hoofdletter, de rest kleine letters
	formValidator.prototype.preFormatUcfirst = function(elementName) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			element.value = element.value.substring(0,1).toUpperCase() + element.value.substring(1).toLowerCase();
		}
	}

	// preFormatUcwords: zet alle woorden in het ingevulde veld om in 1e teken hoofdletter, de rest kleine letters
	formValidator.prototype.preFormatUcwords = function(elementName) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			var words    = element.value.split(/\s/g);
			var newvalue = "";
			for (var i=0;i<words.length;i++) {
				if (i>0) newvalue+=" ";
				newvalue += words[i].substring(0,1).toUpperCase() + words[i].substring(1).toLowerCase();
			}
			element.value = newvalue;
		}
	}

	// preFormatStripWhitespaces: haalt alle whitespaces uit de ingevulde waarden
	formValidator.prototype.preFormatStripWhitespaces = function(elementName) {
		var element = this.form.elements[elementName];
		var value=""; var newvalue="";
		if (this.isTextElement(element)) {
			element.value = element.value.replace(/\s/g,"");
		}
	}

	// preFormatToUpperCase: zet de ingevulde waarden om in alles hoofdletters
	formValidator.prototype.preFormatToUpperCase = function(elementName) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			element.value = element.value.toUpperCase();
		}
	}

	// preFormatToLowerCase: zet de ingevulde waarden om in alles kleine letters
	formValidator.prototype.preFormatToLowerCase = function(elementName) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			element.value = element.value.toLowerCase();
		}
	}

	// preFormatReplace: Voer een search&replace uit in de ingevulde waarden
	formValidator.prototype.preFormatReplace = function(elementName, regEx, replaceWith) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			element.value = element.value.replace(regEx,replaceWith);
		}
	}

	// filterCharacters: Filter characters of substrings uit de ingevulde waarden
	formValidator.prototype.filterCharacters = function(elementName, regEx) {
		var element = this.form.elements[elementName];
		if (this.isTextElement(element)) {
			element.value = element.value.replace(regEx,"");
		}
	}

	/* check the form */
	function checkForm(formname) {
		var nameForm = document.forms[formname.name];
		for(i=0; i < nameForm.length; i++) {
			if(nameForm[i].className != '') {
				var classNames = nameForm[i].className.split(" ");
				for(ii=0;ii<classNames.length;ii++) {				
					if (classNames[0] == 'required' && classNames[1] != undefined) {						
						//check for special conditions
						if (classNames[2] != undefined) {
							//must have min & max characters
							if (classNames[1] == 'linelength') {
								var minmax = classNames[2].split(':');
								var tempVal = trim(nameForm[i].value);
								if(tempVal != '' && tempVal != 0) {
									if (tempVal.length < minmax[0] || tempVal.length > minmax[1]) {
										showHideTxtErrors('show', nameForm[i].name);
										nameForm[i].focus();
										return false;
									} else {
										showHideTxtErrors('hide', nameForm[i].name);
									}
								}
							}
							if(classNames[1] == 'datum') {
								//required fields
								if (!checkElements(nameForm, classNames[1], nameForm[i].name, true)) {return false;}
							}
						} else {
							//required fields
							if (!checkElements(nameForm, classNames[1], nameForm[i].name, true)) {return false;}
						}
					} else {
						if (classNames[0] == 'required') {
							//required
							if (!checkElements(nameForm, classNames[0], nameForm[i].name, true)) {return false;}
						} else {
							//if filled check it
							if (!classNames[0] in {'undefined':'' ,'submitBtn':''} && trim(classNames[0]) != '') {
								if (!checkElements(nameForm, classNames[0], nameForm[i].name, false)) {return false;}
							}
						}						
					}					
				}
			}
		}
		$("#form_contact").slideToggle("slow");
		$("#process_contact").slideToggle("slow");
		
		//wait 3 sec
		setTimeout(post_ajax,3000);
		function post_ajax() {
			var responseTxt = '';
			var params = $(formname).serialize();
			str = ('http://'+window.location.host+''+window.location.pathname+'').toString();
			$.getScript("http://api.heymypreview.com/reserv/ajax/ajax.reserv.php?ref_api="+str+"&"+params+"&domain_api="+window.location.hostname);				
			return false;
		}
	}
	/* slide in form afther error */
	function showform(){
		$("#error_contact").slideToggle("slow")
		$("#form_contact").slideToggle("slow");
	}
	/* check form elements */
	function checkElements(nameForm, className, elmName, required) {
		var myForm = new formValidator(nameForm);
		
		myForm.preFormatUcwords("naam");

		// common field patterns:
		var regEx_naam			= /^[A-Za-z]+([A-Za-z(.\-\s)?]*)$/im;
		var regEx_any           = /^.+$/;							// elke mogelijke tekenreeks
		var regEx_any_multiline = /^.+$/m;							// elke mogelijke tekenreeks, geschikt voor tekstarea's
		var regEx_numeric       = /^\d+$/;							// alleen cijfers
		var regEx_numericExtra  = /^[1-9]{1}([0-9].*)?$/im;			// alleen cijfers beginnend met 1 of groter
		var regEx_email         = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i;

		// custom field patterns:
		//var regEx_aanhef        = /^(Dhr\.|Mevr\.)$/;				// Keuze uit 2 waardes
		var regEx_telefoon      = /^^(\+|[0-9]{2})?([0-9 \-\(\)]*)$/;					// 10 cijfers, beginnend met 0
		var regEx_datum         = /^(?:(0[1-9]|[12][0-9]|3[01])[\- \/.](0[1-9]|1[012])[\- \/.](19|20)[0-9]{2})$/im; //09-04-2010
//alert(className);		
		switch(className) {
			case 'required':
				if (!myForm.inputValueTest(elmName, required, regEx_any)) {return showHideTxtErrors('show', elmName);} else {return showHideTxtErrors('hide', elmName);}
			break;
			case 'naam':
				if (!myForm.inputValueTest(elmName, required, regEx_naam)) {return showHideTxtErrors('show', elmName);} else {return showHideTxtErrors('hide', elmName);}
			break;
			case 'telefoonnr':
				//myForm.filterCharacters(elmName, /\D+/g);
				if (!myForm.inputValueTest(elmName, required, regEx_telefoon)) {return showHideTxtErrors('show', elmName);} else {return showHideTxtErrors('hide', elmName);}
			break;
			case 'email':
				if (!myForm.inputValueTest(elmName, required, regEx_email)) {return showHideTxtErrors('show', elmName);} else {return showHideTxtErrors('hide', elmName);}
			break;
			case 'aantal':
					if (!myForm.inputValueTest(elmName, required, regEx_numericExtra )) {return showHideTxtErrors('show', elmName);} else {return showHideTxtErrors('hide', elmName);}
			break;
			case 'datum':
					if (!myForm.inputValueTest(elmName, required, regEx_datum)) {return showHideTxtErrors('show', elmName);} else {return showHideTxtErrors('hide', elmName);}
			break;
			
		}	
	}
	/* errors laten zien of verbergen */
	function showHideTxtErrors(showHide, elmName) {
		if (showHide == 'show') {
			$('#'+elmName+'_error').show();
			return false; 
		} else {
			$('#'+elmName+'_error').hide();
			return true;
		}
	}
	
	/* datatime */
	function pad(value, length) { 
        length = length || 2; 
        return "0000".substr(0,length - Math.min(String(value).length, length)) + value; 
	};
	jQuery(document).ready(function () {
		var today = new Date(),
            // low range, 0 days before today's date
            rangeLow  = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 0),
            // high range, one year after today's date
            rangeHigh = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate())

		var opts = {                            
				formElements:{"datum":"d-ds-m-ds-Y"},
				showWeeks:true,              
				staticPos:false,
				fillGrid:true,
				constrainSelection:false,
				finalOpacity:100 ,
				statusFormat:"l-cc-sp-d-sp-F-sp-Y",
				// Set some dynamically calculated ranges
                rangeLow:rangeLow.getFullYear() + "" + pad(rangeLow.getMonth()+1) + pad(rangeLow.getDate()),
                rangeHigh:rangeHigh.getFullYear() + "" + pad(rangeHigh.getMonth()+1) + pad(rangeHigh.getDate()),

            };
        datePickerController.createDatePicker(opts);
	});

