$(function() {
	
	//Postalcode control
	if ($.isFunction($(this).autocomplete)) {
		$('.jsPostalCode')
			.autocomplete("/dynamic.aspx?data=citynames", {
				formatItem: function(row, i, max) {
					return row[0].replace("_", " ");
				},
				max: 4,
				delay: 100,
				width: '200px'
			})
			.result(function(event, data, formated){
				var result = data[0].split("_");
				$(".jsPostalCode").val(result[0].replace(/<!DOCTYPE.*?>/gi,''));
				if ($(".jsPostalCode").val() != "") {
					$(".jsCity").val(result[1]);
				} else {
					$(".jsCity").val("");
				}
			})
			.keydown(isNumberKey)
		;
	
		$(".jsCity, .jsCity2").attr("readonly", true).addClass("disabled");
		
		$('.jsPostalCode2')
			.autocomplete("/dynamic.aspx?data=citynames", {
				formatItem: function(row, i, max) {
					return row[0].replace("_", " ");
				},
				max: 4,
				delay: 100,
				width: '200px'
			})
			.result(function(event, data, formated){
				var result = data[0].split("_");
				$(".jsPostalCode2").val(result[0].replace(/<!DOCTYPE.*?>/gi, ""));
				if ($(".jsPostalCode2").val() != "") {
					$(".jsCity2").val(result[1]);
				} else {
					$(".jsCity2").val("");
				}
			})
			.keydown(function(e){
				$('.jsPostalCode').unautocomplete();
				$(".jsCity").removeAttr("readonly").removeClass("disabled");
				//console.log(isNumberKey(e));
				return(isNumberKey(e));
			});
	} //end postalcode
	
	// form validation
	//validateForms();
	formValidation()
	
});


// validate forms on submit and on input typing and blur
function formValidation(){
	$('form').each(function(){
		var objForm = this;
		$(objForm).data('allOk','1');
		
		// select all fields that require a certain mask validation
		$('.jsValidate',objForm).bind('keyup blur',validateField);
		
		$(objForm).submit(formValidationCheck);
		
	});
}

// form validation
function formValidationCheck(objElement,bitOnlyTest){
	if(typeof bitOnlyTest == 'undefined') { var bitOnlyTest = false };
	var objForm = $(this);
	
	if (this == window) {
		objForm = $(objElement).closest('form');
	}
	
	$(this).data('allOk','1');
	var bitSendform = true;
	
	// Run a validation on all required fields
	$(':input[name*=_Required], :input[name*=_required]',objForm).each(function(){
		var relatedInput = $(':input[name=' + $(this).attr('name').replace(/_Required$/i,'').replace(/^_/,'') + ']',objForm);
		relatedInput.each(validateField)
	});
	
	// test if any active fields are not valid
	$(':input',objForm).not('[disabled]').each(function(){
		var $input = $(this);
		
		if ($input.data('validatedOk') == false){
			bitSendform = false;
		}
	});
	
	if (!bitSendform && bitOnlyTest == false){
		objForm.data('allOk','0');
		
		var strAlert = 'Du skal udfylde alle felter med * med korrekt data';
		alert(strAlert);
		return false;
	}
}

// single field validation
function validateField(evt){
	var $this = $(this),
			objForm = $this.closest('form'),
			strActivateKeyup = 'jsTextfieldactivatekeyup',
			bitOk = true,
			re;
	
	if (evt.type != "keyup" || $this.hasClass(strActivateKeyup)){
		// if the input doesn't allow keyup events, activate it (this happens at first blur event)
		if (!$this.hasClass(strActivateKeyup)){
			$this.addClass(strActivateKeyup);
		}
		
		// validate field
		
		/*
		 * Valideringen skal underst�tte f�lgende data, krav og afgr�nsninger:
		 * 
		 * Fornavn og efternavn skal indeholde tekst.
		 * Gade skal indeholde min. et ord efterfulgt af et mellemum og et tal.
		 * postnummer skal v�re 4 tegn i Danmark.
		 * By bliver automatisk indsat efter postnummer.
		 * Telefon skal indeholde 8 tegn for dansk tlf.nummer.
		 * E-mail skal indeholde min. 1 tegn efterfulgt af et @ (snabel a) efterfulgt af min. 1 tegn efterfulgt af et . (punktum) efterfulgt af 2-4 karakterer. 
		 * 
		 * 
		 * For at identificere de forskellige felttyper, skal hvert felt have en css klasse der fort�ller hvordan feltet skal valideres.
		 * Forslag til css klasser, der kan benyttes til validering samt beskrivelse af hvad de skal validere:
		 * 
		 * jsValidate: bruges kun til at identificere hvilke felter der skal valideres.
		 * jsValidatetext: validerer om feltet ikke er tomt - dette skal v�re basis form for validering, alle andre valideringstyper g�r automatisk dette
		 * jsValidatefullname: kontrollerer om der er minimum 2 ord i feltet 
		 * jsValidatepostalcode: tester om postnummeret er korrekt i forhold til det enkelte lands krav
		 * jsValidatephone: Ser om telefonnummeret er indtastet korrekt i forhold til landets krav
		 * jsValidatemail: E-mail skal indeholde de p�kr�vede dele specificeret ovenfor
		 * jsValidateaddress: Korrekt indtastet adresse - efter ovenst�ende specifikation
		 * jsValidaterepeat: Tester om teksten i feltet er det samme som i feltet med det tilknyttede ID (i css klassen "jsValidaterepeatfromIDP�FELT"
		 * 
		 * 
		 */

		// test if there is a required field for this input field
		var strCurrentName = $this.attr('name');
		var objRequiredField = $('input[name=_' + strCurrentName + '_required],input[name=' + strCurrentName + '_Required]',objForm);
		var bitRequired = (objRequiredField.size() > 0);
		
		if ($this.hasClass('jsValidatetext')){
			re = /.+/;
		}
		else if ($this.hasClass('jsValidatefullname')){
			re = /.+\s.+/;
		}
		else if ($this.hasClass('jsValidatepostalcode')){
			// her b�r man have forskellige landevalg, s� valideringen ved hvordan den skal validere? ligenu g�r den kun efter 4 cifre
			re = /^\d{4}$/;
		}
		else if ($this.hasClass('jsValidatephone')){
			// her b�r man have forskellige landevalg, s� valideringen ved hvordan den skal validere? ligenu g�r den kun efter 8 cifre
			re = /^\d{8}$/;
		}
		else if ($this.hasClass('jsValidatemail')){
			re = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]+$/i;
		}
		else if ($this.hasClass('jsValidateaddress')){
			re = /^(.)+\s[1-9]/;
		}
		else {
			// hvis der ikke er nogen specifik validering, skal der alligevel valideres p� om der er indhold i feltet.
			re = /.+/;
		}
		
		bitOk = re.test($this.val());
		
		// hvis feltet er et repeat felt, f.eks. gentag password eller e-mail,
		// skal valideringen i stedet g� p� om feltets indhold er det samme som det tilknyttede
		if ($this.hasClass('jsValidaterepeat')){
			var strAllclasses = $this.attr('class').split(' '),
					strOriginalInputId;
			
			$.each(strAllclasses, function(i,val){
				if (val.indexOf('jsValidaterepeatfrom') > -1){
					strOriginalInputId = val.replace('jsValidaterepeatfrom','');
					
					return false;
				}
			});
			
			bitOk = ($this.val() == $('#'+strOriginalInputId).val() && $this.val != '');
		}
		
		
		if ((bitRequired && bitOk) || (!bitRequired && $this.val() != '' && bitOk)){
			// hvis feltet er korrekt udfyldt
			$this.removeClass('textfield_error');
			$this.addClass('textfield_valid');
			
			$this.data('validatedOk',true);
		}
		else if ((bitRequired && !bitOk) || (!bitRequired && $this.val() != '' && !bitOk) || (bitRequired && $this.val() == '')){
			// hvis feltet ikke er udfyldt korrekt.
			$this.removeClass('textfield_valid');
			$this.addClass('textfield_error');
			
			$this.data('validatedOk',false);
		}
		else if ($this.val() == '' && !bitRequired){
			// hvis feltet ikke er udfyldt og det ikke er p�kr�vet
			$this.removeClass('textfield_error');
			$this.removeClass('textfield_valid');
			
			$this.data('validatedOk',true);
		}
		else {}
		
	}
}


