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;
}

var defaultBorderColor = "#aab3b3";
var   errorBorderColor = "#f89408";

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] );
		}
		
		for(var j=0; j < forms[i].elements.length; j++) {
			var el = forms[i].elements[j];
			
			if(el.type == "text" || el.tagName.toLowerCase() == "select") {
				el.onblur = function() { 
					if (checkElement(this) === true) {
						this.style.border = "1px solid " + defaultBorderColor; 
					}
					if (this.getAttribute("rel") == "pc-check") {
					    searchAddress();
					}
				}
				
				if(el.tagName.toLowerCase() == "select") {
					el.onchanged = function() {
						checkElement(this);
					}
				}
				
				el.style.border = "1px solid " + defaultBorderColor;
			} else if(el.type == "radio") {
				el.oldOnClick = el.onclick;
			
				el.onclick = function() { 
					for(var x=0; x < this.form.elements[this.name].length; x++) {
						var label = document.getElementById("label_"+this.form.elements[this.name][x].id);
						if(label) {
							label.style.color = "#000";
							label.style.backgroundColor = "#fff";
						}
					} 
					if(this.oldOnClick) {
						this.oldOnClick();
					}
				}
			}
		}
	}
}

function checkFormSubmit() {
    
	var returnMessage = ( this.getAttribute( "errorMessage" ) != undefined ) ? this.getAttribute( "errorMessage" ) + "\n" : "";
	var checkPassed = true;
	var errorMessage = "";
	
	for (var i = 0; i < this.elements.length; i++ ) {
		var el = this.elements[i];
		var checkResult = checkElement(el, true);
		if (checkResult != '') {
			checkPassed = false;
			errorMessage += checkResult + ", ";
		}
	}
	
	if (!checkPassed) {
		returnMessage += errorMessage.substr(0,errorMessage.length-1);
		
		if (errorMessage && document.getElementById("errormessage")) {
			document.getElementById("errorMessage").innerHTML = returnMessage;
		}
	}

	return checkPassed;
}

function checkElement(el, doReturnString) {
	var addErrorMessage = false;
	var checkPassed = true;
	
	var returnMessage = '';
	
	if (el.getAttribute( "formCheck" ) != undefined && (el.getAttribute('disabled') == false || el.getAttribute('disabled') == null)) {
		var checkOn =  el.getAttribute( "formCheck" ).split( "," );
		for (var j = 0; j < checkOn.length; j++) {
			switch (checkOn[j]) {
				case "bankNumber":
					if( isNaN( el.value.replace( ".", "" ) ) || el.value == "" ) {
						addErrorMessage = true;
						checkPassed = false;
						el.style.borderColor = errorBorderColor;
					} else {
						el.style.borderColor = defaultBorderColor;
					}
					break;
				case "stopcode":
					var sc = createStopCode(el.form.elements['rekeningnummer'].value);
					if (sc != el.value) {
						addErrorMessage = true;
						checkPassed = false;
						el.style.borderColor = errorBorderColor;
					} else {
						el.style.borderColor = defaultBorderColor;
					}
					break;
				case "email":
					if( isEmail( el.value ) == false ) {
						addErrorMessage = true;
						checkPassed = false;
						el.style.borderColor = errorBorderColor;
					} else {
						el.style.borderColor = defaultBorderColor;
					}
					break;
				case "notEmpty":
					if( ( el.type == "radio" && getRadioValue( el.form.elements[ el.name ] ) == "" ) ||
						( el.type != "radio" && el.value == "" ) ) {
						addErrorMessage = true;
						checkPassed = false;
						
						if(el.tagName.toLowerCase() == 'select') {
							el.options[0].style.backgroundColor = errorBorderColor;
						} else if(el.type == "radio") {
							for(var x=0; x < el.form.elements[el.name].length; x++) {
								var label = document.getElementById("label_"+el.form.elements[el.name][x].id);
								if (label) {
									label.style.color = "#FFF";
									label.style.backgroundColor = errorBorderColor;
								}
							}
						} else {
							el.style.borderColor = errorBorderColor;
						}
						el.style.borderColor = errorBorderColor;
					} else {
						if(el.tagName.toLowerCase() == 'select') {
							el.options[0].style.backgroundColor = "";
						} else if(el.type == "radio") {
							for(var x=0; x < el.form.elements[el.name].length; x++) {
								var label = document.getElementById("label_"+el.form.elements[el.name][x].id);
								if (label) {
									label.style.color = "#000";
									label.style.backgroundColor = "#fff";
								}
							}
						} else {
							el.style.borderColor = defaultBorderColor;
						}
					}
					break;
				case "isChecked":
					if( el.checked != true ){
						addErrorMessage = true;
						checkPassed = false;
					}
					break;
		        case "phone" :
		            numbers = el.value.replace(/[^0-9]/g, '');
		            
		            if (numbers.length < 10) {
		                el.style.borderColor = errorBorderColor;
		                addErrorMessage = true;
		                checkPassed = false;
		            } else {
		                el.style.borderColor = defaultBorderColor;
		            }
		            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;
						
						el.style.borderColor = errorBorderColor;
					} else {
						el.style.borderColor = defaultBorderColor;
					}
					break;
				case "date60days" :
                       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 (( dadate.getTime() - (new Date()).getTime() ) / day_in_ms > 60) {
                               addErrorMessage = true;
                               checkPassed = false;
                           }
                       }
                       break;
			}
			if (addErrorMessage == true) {
				if (el.getAttribute( "errorMessage" ) != undefined) {
					$("#message_" + el.name).html($(el).attr("errorMessage"));
					returnMessage += el.getAttribute( "errorMessage" );
				} else {
					returnMessage += ucfirst(el.name);
				}
				checkPassed = false;
			} else {
				$("#message_" + el.name).html("");
			}
			addErrorMessage = false;
		}
	}
	return doReturnString ? returnMessage : 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 "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();
}
