// web context
var context = "";


EventListener.addEvent(window, "load", function(e){
	var zf1 = new ZipFiller(document.getElementById("postalcode"),document.getElementById("number1"),
		document.getElementById("street"),document.getElementById("city"),
		document.getElementById("lookup"), null, null);	
});

// Contact Address Blok
EventListener.addEvent(window, "load", function(e){
	var zf2 = new ZipFiller(document.getElementById("contactAddressPostcode"),document.getElementById("contactAddressHouseNumber"),
		document.getElementById("contactAddressStreet"),document.getElementById("contactAddressCity"),
		document.getElementById("contactAddressLookup"), document.getElementById("_notNetherland_J"), document.getElementById("_notNetherland_N"));	
});

// New Contact Address Blok
EventListener.addEvent(window, "load", function(e){
	var zf3 = new ZipFiller(document.getElementById("newContactAddressPostcode"),document.getElementById("newContactAddressHouseNumber"),
		document.getElementById("newContactAddressStreet"),document.getElementById("newContactAddressCity"),
		document.getElementById("newContactAddressLookup"), document.getElementById("_newNotNetherland_J"), document.getElementById("_newNotNetherland_N"));	
});


// Address Blok
EventListener.addEvent(window, "load", function(e){
	var zf4 = new ZipFiller(document.getElementById("addressPostcode"),document.getElementById("addressHouseNumber"),
		document.getElementById("addressStreet"),document.getElementById("addressCity"),
		document.getElementById("addressLookup"), null, null);	
});

// New Address Blok
EventListener.addEvent(window, "load", function(e){
	var zf5 = new ZipFiller(document.getElementById("newAddressPostcode"),document.getElementById("newAddressHouseNumber"),
		document.getElementById("newAddressStreet"),document.getElementById("newAddressCity"),
		document.getElementById("newAddressLookup"), null, null);	
});

// Dutch Contact Address Blok
EventListener.addEvent(window, "load", function(e){
	var zf6 = new ZipFiller(document.getElementById("dutchContactAddressPostcode"),document.getElementById("dutchContactAddressHouseNumber"),
		document.getElementById("dutchContactAddressStreet"),document.getElementById("dutchContactAddressCity"),
		document.getElementById("dutchContactAddressLookup"), null, null);	
});

/*
Lost Boys 2006.

De inhoud van dit bestand is in opdracht vervaardigd en eigendom van onze opdrachtgever.
Niet hergebruiken zonder toestemming.
Neem voor vragen contact op met Lost Boys, www.lostboys.nl.

The contents of this file have been produced for and are the property of our client.
Do not reuse without permission.
Any questions? Please contact Lost Boys, www.lostboys.nl.

*/

ZipFiller = function (zipNode, numNode, streetNode, cityNode, lookupNode, foreignNodeYes, foreignNodeNo) {

	if(!zipNode || !numNode || !streetNode || !cityNode) return;
	
	this.foreignYes = foreignNodeYes;
	this.foreignNo = foreignNodeNo;	
	this.zip = zipNode;
	this.num = numNode;
	this.street = streetNode;
	this.city = cityNode;
		
	//Hold the value to return when the user switched to foreign address
	this.storedNum = this.num.value;
	this.storedZip = this.zip.value;
	
	// if we have JavaScript support, we dont need the lookup link
	if(lookupNode) lookupNode.parentNode.removeChild(lookupNode);

	if (this.foreignYes && this.foreignNo) {
		EventListener.addEvent(this.foreignYes, "change", this.scope(this.foreignChange));
		EventListener.addEvent(this.foreignNo, "change", this.scope(this.foreignChange));
	}
	
	//july 2010: postbox fix. Do not disable street/city when 'postbox.checked==true'
	var postbox = document.getElementById("command.newContactAddress.hasPostBox");

	//Disable the street and city field
	if (this.foreignYes && this.foreignNo) {
		if (this.foreignYes.checked == true || (postbox && postbox.checked == true)) {
			this.street.readOnly = false;
			this.city.readOnly = false;		
		} else {
			this.street.readOnly = true;
			this.city.readOnly = true;				
		}
	} else {
		this.street.readOnly = true;
		this.city.readOnly = true;			
	}


	EventListener.addEvent(this.zip, "change", this.scope(this.getAddress));
	EventListener.addEvent(this.num, "change", this.scope(this.getAddress));

	
	if (window.XMLHttpRequest) {
		this.xmlhttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	//If zip and number are filled we get the street and city straight a way.
	if (this.zip.value != "" && this.num.value != "") {
		this.getAddress();
	}
}

ZipFiller.prototype.foreignChange = function () {
	if (this.foreignYes && this.foreignNo) {
		if (this.foreignYes.checked == true) {
			this.street.readOnly = false;
			this.city.readOnly = false;
		} else {
			this.street.readOnly = true;
			this.city.readOnly = true;
			this.resetAddress();
			this.num.value = this.storedNum;
			this.zip.value = this.storedZip;
			this.getAddress();
		}
	}
}

ZipFiller.prototype.getAddress = function () {
	// Keep the stored values in sync.
	this.storedNum = this.num.value;
	this.storedZip = this.zip.value;
	
	if (this.zip.value != "" && this.num.value != "") {
		this.resetAddress();
		try {
			this.removeErrorMessage();		
			this.message("Straatnaam en woonplaats worden opgezocht");
			
			//for Retail, the context is empty...
			var contextPath = "";
			//now, we use the window.location.protocol, so the js can switch dynamically between http and https
			var str_host = window.location.protocol + "//" + window.location.host;
			this.xmlhttp.open("GET", str_host + contextPath + "/system/postcoderesponder.jsp?postcode="+this.zip.value+"&houseNumber="+this.num.value+"&rnd="+Math.random(), true);
			
			var app = this;
			this.xmlhttp.onreadystatechange = function() {
				if (app.xmlhttp.readyState == 4 && app.xmlhttp.status == 200) {
					app.removeErrorMessage();
					app.fillAddress(app.xmlhttp.responseXML);
				} 
			};
			this.xmlhttp.send(null);
		} catch (e) {
			alert(e);
		}
	}
}

ZipFiller.prototype.fillAddress = function (xml) {
	if (xml != null) {
		var element1 = xml.getElementsByTagName("straatnaam");
		var element2 = xml.getElementsByTagName("woonplaats");
		if ((element1 != null) && (element2 != null) && (element1.length > 0) && (element2.length > 0)) {
			var node1 = element1[0];
			var node2 = element2[0];
			if ((node1 != null) && (node2 != null)) {
				this.street.value = this.getValue(node1);
				this.city.value = this.getValue(node2);
				this.removeErrorMessage();
			} else {
				this.errorMessage("Algemene foutmelding: geen geldige XML gevonden.");
				this.resetAddress();
			}
		} else {
			var errorNodes = xml.getElementsByTagName("errormessage");
			if(errorNodes != null & errorNodes.length > 0){
				var errorNode = errorNodes[0];
				if (errorNode != null) {
					this.errorMessage(this.getValue(errorNode));
				} else {
					this.errorMessage("Algemene foutmelding: geen geldige XML gevonden.");
				}
			}
			this.resetAddress();
		}
	} else {
		this.errorMessage("Algemene foutmelding: geen geldige XML gevonden. Geen response");
		this.resetAddress();
	}
}

ZipFiller.prototype.resetAddress = function () {
	this.street.value = "";
	this.city.value = "";
}

ZipFiller.prototype.removeErrorMessage = function () {
	if (this.error) {
		this.num.parentNode.parentNode.removeChild(this.error);
		this.error = null;
	}

	this.num.parentNode.parentNode.className = this.num.parentNode.parentNode.className.replace(/error/g, "");
	this.num.parentNode.className = this.num.parentNode.className.replace(/error/g, "");
	this.zip.parentNode.className = this.zip.parentNode.className.replace(/error/g, "");
	
	// to remove errors from server side validation
	this.removeErrorMessageByParentNode(this.num.parentNode.parentNode);
	this.removeErrorMessageByParentNode(this.zip.parentNode);
}

ZipFiller.prototype.removeErrorMessageByParentNode = function (parentNode) {	
	var spans = null;
	spans = parentNode.getElementsByTagName("span");
	for (var i=0; i < spans.length; i++) {
		if (spans[i].className.search(/error/) > -1) {
			parentNode.removeChild(spans[i]);
		}
	}
}

ZipFiller.prototype.errorMessage = function (txt) {
	if(!this.error) {
		var error = document.createElement("span");
		error.className = "errormessage show";
		error.appendChild(document.createTextNode(txt));
		this.error = this.num.parentNode.parentNode.appendChild(error);
		this.zip.parentNode.appendChild(error.cloneNode(true));

		// make border arround input boxes red
		this.num.parentNode.parentNode.className = this.num.parentNode.parentNode.className + " error";
		this.num.parentNode.className = this.num.parentNode.className + " error";
		this.zip.parentNode.className = this.zip.parentNode.className + " error";
	}
}

ZipFiller.prototype.message = function (txt) {
	if(!this.error) {
		var error = document.createElement("span");
		error.className = "errormessage show";
		error.appendChild(document.createTextNode(txt));
		this.error = this.num.parentNode.parentNode.appendChild(error);
	}
}

ZipFiller.prototype.getValue = function (element) {//some DOM's add a text Node, some don't
	var s = (element.firstChild) ? element.firstChild.nodeValue : element.nodeValue;
	s = s.replace( /^\s+/g, "" );
	s = s.replace( /\s+$/g, "" );
	return s;
}

ZipFiller.prototype.scope = function(method) {
	var scope = this;
	return function() {
		return method.apply(scope, arguments);
	}
}

