function closeWindow() {
	if( top != undefined ) {
		top.close();
	} else {
		window.close();
	}
}

// This function looks up all textareas and checks for the attribute maxlength
// If maxlength is set it will add the proper functions to the element.	
function fixMaxLengthTextAreas() {
	var textareas = document.getElementsByTagName( "TEXTAREA" );
	for( var i = 0; i < textareas.length; i++ ) {
		if( textareas[i].getAttribute( "maxlength" ) != undefined ) {
			setMaxLength( textareas[i] );
		}
	}
}

// Returns the keyCode for specified event object
function getKeycode(evt) {
	var charCode = (evt.which) ? evt.which : event.keyCode;
	return charCode;
}

// Adds maxlength functionality to an object (probably a textarea)
function setMaxLength( element ) {
	element.onkeypress = function( e ) {
		e = ( e == undefined ) ? window.event : e;
	 	// 8 = backspace, mozilla fix
		if( getKeycode( e ) == 8 ) {
			return true;
		} else {
			return ( this.value.length < this.getAttribute( "maxlength" ) );
		}
	}
}

// Returns a list of properties and their value for specified element
function showProps( element ) {
	var msg = "";
	for( var name in element ) {
		msg += name + " = " + element[name] + "\n";
	}
	return msg;
}

function checkForms() {
	if( !document.getElementById ) return;
	
	var forms = document.forms;
	for( var i = 0; i < forms.length; i++ ) {
		/*if( hasFormCheckableElements( forms[i] ) ) {
			forms[i].onsubmit = checkFormSubmit;
		}*/
		if( hasFormValidationElements( forms[i] ) ) {
			validateForm.apply( forms[i] );
		}
	}
}

function checkFormSubmit(target) {
	var returnMessage = ( target.getAttribute( "errorMessage" ) != undefined ) ? target.getAttribute( "errorMessage" ) + "\n" : "";
	
	var checkPassed = true;

	for( var i = 0; i < target.elements.length; i++ ) {
		var el = target.elements[i];
		var addErrorMessage = false;
		if( el.getAttribute( "formCheck" ) != undefined ) {
			var checkOn =  el.getAttribute( "formCheck" ).split( "," );
			for( var j = 0; j < checkOn.length; j++ ) {
				switch( checkOn[j] ) {
					case "bankNumber":
						var input = replaceChar( el.value, ".", "" );
						var tot = 0;
						var deel = 0;
						var rest = 0;
						var length = true;	
							
						if (input.length < 3 || input.length == 8 || input.length > 9) {
							length = false;
						}
						
						if (input.length == 9) {
							for (k=0; k < input.length; k++) {
								getal = input.substr(k, 1);
								tot += getal * (9 - k);
							}
							
							deel = tot/11;
							rest = tot%11;
						}
					
						if( isNaN( input ) || el.value == "" || rest!=0 || !length ) {
							addErrorMessage = true;
							checkPassed = false;
						}
						break;
					case "email":
						if( isEmail( el.value ) == false ) {
							addErrorMessage = true;
							checkPassed = false;
						}
						break;
					case "notEmpty":
						if( ( el.type == "radio" && getRadioValue( target.elements[ el.name ] ) == "" ) ||
							( el.type != "radio" && el.value == "" ) ) {
							
							var id = el.name.match(/[\d\.]+/g);
							if (id != null && $('productrow_'+id).style.display != 'none' || id == null) {
								addErrorMessage = true;
								checkPassed = false;
							}
						}
						break;
                    case "date" :
                        if (!/^[0-9]{2}\-[0-9]{2}\-[0-9]{4}$/.test(el.value)) {
                            addErrorMessage = true;
                            checkPassed = false;
                        }
                        break;
                    case "date18" :
                        if (!/^[0-9]{2}\-[0-9]{2}\-[0-9]{4}$/.test(el.value)) {
                            addErrorMessage = true;
                            checkPassed = false;
                        } else {
                            var dateparts = el.value.split("-");
                            
                            dateparts[0] = dateparts[0].replace(/^(0)/, "");
                            dateparts[1] = dateparts[1].replace(/^(0)/, "");
                            
                            birthdate   = new Date(dateparts[2], parseInt(dateparts[1]) - 1, parseInt(dateparts[0]));
                            year_in_ms  = 1000 * 3600 * 24 * 365.25;
                            if (((new Date()).getTime() - birthdate.getTime()) / year_in_ms <= 18) {
                                addErrorMessage = true;
                                checkPassed = false;
                            }
                        }
                        break;
                    case "date45days" :
                        if (!/^[0-9]{2}\-[0-9]{2}\-[0-9]{4}$/.test(el.value)) {
                            addErrorMessage = true;
                            checkPassed = false;
                        } else {
                            var dateparts = el.value.split("-");
                            
                            dateparts[0] = dateparts[0].replace(/^(0)/, "");
                            dateparts[1] = dateparts[1].replace(/^(0)/, "");
                            
                            dadate   = new Date(dateparts[2], parseInt(dateparts[1]) - 1, parseInt(dateparts[0]));
                            day_in_ms  = 1000 * 3600 * 24;
                            if (((new Date()).getTime() - dadate.getTime()) / day_in_ms > 45) {
                                addErrorMessage = true;
                                checkPassed = false;
                            }
                        }
                        break;
					case "postcode":
						el.value = el.value.toUpperCase();
						
						var numPart = el.value.substring(0,4);
						var strPart = el.value.substring(el.value.length - 2,el.value.length);
						
						var numCheck = ( !isNaN(numPart) && numPart.length == 4 );
						
						var strCheck = true;
						for( var k = 0; k < strPart.length; k++ ) {
							// A = 65
							// Z = 90
							if( strPart.charCodeAt(k) > 90 || strPart.charCodeAt(k) < 65 ) {
								strCheck = false;
							}
						}
						
						if( strCheck == true ) {
							strCheck = ( strPart.length == 2 );
						}

						if( strCheck == false || numCheck == false ) {
							addErrorMessage = true;
							checkPassed = false;
						}
						break;
				}
				if( addErrorMessage == true ) {
					if( el.getAttribute( "errorMessage" ) != undefined ) {
						returnMessage += el.getAttribute( "errorMessage" ) + "\n";
					} else {
						returnMessage += ucfirst( el.name ) + "\n";
					}
					checkPassed = false;
				}
				addErrorMessage = false;
			}				
		}
	}
	if( checkPassed == false ) {
		alert( returnMessage );
	}
	
	return checkPassed;
}

// Returns the value of a radio-button group
function getRadioValue( radioGroup ) {
	for( var i = 0; i < radioGroup.length; i++ ) {
		if( radioGroup[i].checked ) {
			return radioGroup[i].value;
		}
	}
	return "";
}

// Returns whether the specified form has elements in it that has a "formcheck" attribute
function hasFormCheckableElements( form ) {
	for( var i = 0; i < form.elements.length; i++ ) {
		if( form.elements[i].getAttribute( "formCheck" ) != undefined ) {
			return true;
		}
	}
	return false;
}

// Returns whether the specified form has elements in it that has a "validation" attribute
function hasFormValidationElements( form ) {
	for( var i = 0; i < form.elements.length; i++ ) {
		if( form.elements[i].getAttribute( "validation" ) != undefined ) {
			return true;
		}
	}
	return false;
}

// Checks a string
function isEmail( email ) {
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)){
		return true;
	}
	return false;
}

function validateForm() {
	for( var i = 0; i < this.elements.length; i++ ) {
		var el = this.elements[i];
		if( el.getAttribute( "validation" ) != undefined ) {
			var checkOn =  el.getAttribute( "validation" ).split( "," );
			for( var j = 0; j < checkOn.length; j++ ) {
				switch( checkOn[j] ) {
					case "bankNumber":
						el.onkeypress = function(e) {
							e = ( e == undefined ) ? window.event : e;
						 	// 8 = backspace, mozilla fix
							// 0 = 48, 9 = 57, . = 46
							var key = getKeycode( e );
							if( key == 8 || ( key >= 48 && key <= 57 ) || key == 46 ) {
								return true;
							} else {
								return false;
							}
						}
						break;
					case "numberOnly":
						el.onkeypress = function(e) {
							e = ( e == undefined ) ? window.event : e;
						 	// 8 = backspace, mozilla fix
							// 0 = 48, 9 = 57
							var key = getKeycode( e );
							if( key == 8 || ( key >= 48 && key <= 57 ) ) {
								return true;
							} else {
								return false;
							}
						}
						break;
					case "amount" :
						el.onkeypress = function(e) {
							e = (e == undefined) ? window.event : e;
						 	// 8 = backspace, mozilla fix
							// 0 = 48, 9 = 57
							// . = 46
                            // , = 44
							var key = getKeycode(e);
							
                            if (key == 8) {
                                return true;
                            } else if (key >= 48 && key <= 57) {
								return true;
                            } else if (key == 44 || key == 46) {
                                if (this.value.indexOf(".") != -1) {
                                    return false;
                                } else {
                                    if (key == 44) {
                                        this.value = this.value + ".";
                                        return false;
                                    }
                                    return true;
                                }
                                return true;
							} else {
								return false;
							}
						}
						break;
                    case "date" :
						el.onkeypress = function(e) {
							e = (e == undefined) ? window.event : e;
						 	// 8 = backspace, mozilla fix
							// 0 = 48, 9 = 57
							// - = 45
							var key = getKeycode(e);
                            if (key == 8) {
                                return true;
                            } else if ((key >= 48 && key <= 57) && (this.value.length < 2 || this.value.length == 3 || this.value.length == 4 || this.value.length == 6 || this.value.length == 7 || this.value.length == 8 || this.value.length == 9)) {
								return true;
                            } else if ((key == 45) && (this.value.length == 2 || this.value.length == 5)) {
                                return true;
							} else {
								return false;
							}
						}
                        break;
					case "postcode" :
						el.onkeypress = function(e) {
							e = (e == undefined) ? window.event : e;
						 	// 8 = backspace, mozilla fix
							// 0 = 48, 9 = 57
							// A = 65, Z = 90
							// a = 97, z = 122
							var key = getKeycode( e );
							
							if (key == 8) {
								return true;							
							} else if (key >= 48 && key <= 57) {
								// Alle nummbers zijn toegestaan
								return true;
							} else if (key >= 65 && key <= 90 || key >= 97 && key <= 122) {
								// Alle letters zijn toegestaan
								/*if (key >= 97 && key <= 122 && this.value.length < 6){
									// Als geen hoofdletter is, dit ervan maken
									this.value = this.value + String.fromCharCode(key - 32);
									return false;
								}*/
								return true;	
							} else {
								return false;	
							}
						}
						break;
                    case "phone":
						el.onkeypress = function(e) {
							e = ( e == undefined ) ? window.event : e;
						 	// 8 = backspace, mozilla fix
							// 0 = 48, 9 = 57
							// - = 45
							// + = 43
							// space = 32
							var key = getKeycode( e );
							
							if( key == 8 || key == 45 || key == 43 || key == 32 || ( key >= 48 && key <= 57 ) ) {
								return true;
							} else {
								return false;
							}
						}
						break;
				}
			}
		}
	}
}

function ucfirst( str ) {
	return str.substr(0,1).toUpperCase() + str.substr( 1, str.length ).toLowerCase();
}
