addLoadEvent(validateLoad);
addEvent.guid = 1;
function validateLoad(){
	
	
	// check for input/select/aso. input boxes and ad onchange validate event
	var elms = document.getElementsByTagName('INPUT');
	var debug = "";
	for(i = 0; i < elms.length; i++){
		// match name with validate array
		for(k = 0; k < validate.length; k++){
			if(validate[k][0] == elms[i].name || validate[k][0]+"[]" == elms[i].name){
				//debug += "Added validate to: "+elms[i].name+"\n";
				var data1 = elms[i];
				var data2 = validate[k][1];
				elms[i].onchange = prepareValidate(elms[i], validate[k][1]);
			}
			
			//enable validation for mail forms. Using the hidden ! notation
			if(elms[i].name.substring(0,1) == "!"){
				elms[i].onchange = prepareValidate(elms[i], 'str(1,*)');
			}
		}
	}
	if(debug != "")
		alert(debug);
	// ad onsubmit validation on forms
	var elms = document.getElementsByTagName('FORM');
	for(i = 0; i < elms.length; i++){
		var data = new Array();
		// find all input elements in the form
		var inputs = elms[i].getElementsByTagName('INPUT');	
		for(q = 0; q < inputs.length; q++){
			// match name with validate array
			for(k = 0; k < validate.length; k++){
				if(validate[k][0] == inputs[q].name || validate[k][0]+"[]" == inputs[q].name){
					data.push(new Array(inputs[q], validate[k][1]));
				}
				
				//enable validation for mail forms. Using the hidden ! notation
				if(inputs[q].name.substring(0,1) == "!"){
					data.push(new Array(inputs[q], 'str(1,*)'));
				}
			}
		}
		
		var areas = elms[i].getElementsByTagName('TEXTAREA');	
		for(q = 0; q < areas.length; q++){
			// match name with validate array
			for(k = 0; k < validate.length; k++){
				if(validate[k][0] == areas[q].name || validate[k][0]+"[]" == areas[q].name){
					data.push(new Array(areas[q], validate[k][1]));
				}
				
				//enable validation for mail forms. Using the hidden ! notation
				if(areas[q].name.substring(0,1) == "!"){
					data.push(new Array(areas[q], 'str(1,*)'));
				}
			}
		}
		
		if(typeof elms[i].onsubmit != 'function'){
			elms[i].onsubmit = prepareValidateForm(data);
		}else{
			var handler = prepareValidateForm(data);
			// assign each event handler a unique ID
			  if (!handler.$$guid) handler.$$guid = addEvent.guid++;
			  // create a hash table of event types for the element
			  if (!elms[i].events) elms[i].events = {};
			  // create a hash table of event handlers for each element/event pair
			  var handlers = elms[i].events["submit"];
			  if (!handlers) {
			    handlers = elms[i].events["submit"] = {};
			    // store the existing event handler (if there is one)
			    if (elms[i]["onsubmit"]) {
			      handlers[0] = elms[i]["onsubmit"];
			    }
			  }
			  // store the event handler in the hash table
			  handlers[handler.$$guid] = handler;
			  // assign a global event handler to do all the work
			  elms[i]["onsubmit"] = handleEvent;
		}
	}
}

function prepareValidateForm(data){
	return ( function() { 
		var failed = false;
		for(i = 0; i < data.length; i++){
			if(!validateSpec(data[i][0], data[i][1])){
				failed = true;
			}
		}
		if(failed){
			alert("Ret venligst de røde felter");
			return false;
		}else{
			return true;
		}
	} );
}

function prepareValidateFormDual(data){
	var failed = false;
	for(i = 0; i < data.length; i++){
		if(!validateSpec(data[i][0], data[i][1])){
			failed = true;
		}
	}
	if(failed){
		alert("Ret venligst de røde felter");
		return false;
	}else{
		return true;
	}
}

function prepareValidate(elm, spec){
	if(typeof elm.onchange != 'function'){
		return( function() { return validateSpec(elm, spec) } );
	}else{
		var old = elm.onchange;
		return( function() { old(); return validateSpec(elm, spec) } );
	}
}

function validateSpec(elm, spec){
	// parse spec
	var type = spec.substring(0, 3);
	switch(type){
		case 'int':
			// check length (1,4)
			var reg = new RegExp(/(\d+),(\d+|\*)/);
			var data = reg.exec(spec);
			if(data[2] == '*') data[2] = 100000;
			if(!elm.value.match(/^\d+$/) && data[1] != 0) // data is integer
				return validateShowError(elm, spec);
			if(elm.value.length < data[1] || elm.value.length > data[2]){
				return validateShowError(elm, spec);
			}
		break;
		case 'str':
			// check length (1,4)
			var reg = new RegExp(/(\d+),(\d+|\*)/);
			var data = reg.exec(spec);
			if(data[2] == '*') data[2] = 100000;
			if(elm.value.length < data[1] || elm.value.length > data[2]){
				return validateShowError(elm, spec);
			}
		break;
		case 'prx':
			if(!elm.value.match(/^\d+\.\d{2}$/)){
				// do we have an int
				if(!elm.value.match(/^\d+$/)){
					return validateShowError(elm, spec);
				}else{
					elm.value += '.00';
				}
			}
		break;
		case 'adr':
			if(!elm.value.match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/)){
				return validateShowError(elm, spec);
			}
		break;
		case 'dat':
			if(!elm.value.match(/^\d{4}-\d{2}-\d{2}$/)){
				if(!(elm.value.length == 0)){
					return validateShowError(elm, spec);
				}
			}
	}
	return validateShowOk(elm, spec);
}

function validateShowError(elm, spec){
	elm.style.backgroundColor = 'red';
	return false;
}

function validateShowOk(elm, spec){
	elm.style.backgroundColor = '';
	elm.style.color = '';
	return true;
}