var QASClient = {
	QASServer: "",
	QASNamespace: "http://www.qas.com/web-2007-09",
	QASEngine: "Singleline",
	QASLayout: "Database layout",
	QASFlatten: "true",
	
	DoGetData: function(callback) {
		var so = new SOAPObject("QAGetData");
		so.ns = this.QASNamespace;
		
		var sr = new SOAPRequest(this.QASNamespace + "/DoGetData", so);
		var callBackList = new Array(handleResponse);
		
		SOAPClient.Proxy = this.QASServer;
		SOAPClient.ContentType = "text/xml";
		SOAPClient.CharSet = "utf-8";
		SOAPClient.SendRequest(sr, callBackList);
		
		function handleResponse(respObj) {
			var result = new Object();
			result.errorMessage = "";
			result.errorCode = 0;
			result.isOk = true;
			result.qaDataSets = new Array();
			
			if(respObj.Body[0].Fault != null) {
				result.errorMessage = respObj.Body[0].Fault[0].detail[0].QAFault[0].ErrorMessage[0].Text;
				result.errorCode = respObj.Body[0].Fault[0].faultstring[0].Text;
				result.isOk = false;
			} else if(respObj.Body[0].QAData != null) {
				for(var i = 0; i < respObj.Body[0].QAData.length; i++) {
					var qaDataSet = new Object();
					qaDataSet.id = respObj.Body[0].QAData[i].DataSet[0].ID[0].Text;
					qaDataSet.name = respObj.Body[0].QAData[i].DataSet[0].Name[0].Text;
					result.qaDataSets.push(qaDataSet);
				}
			}
			
			callback(result);
		}
	},
	
	DoSearch: function(country, search, callback) {
		var so = new SOAPObject("QASearch");
		so.ns = this.QASNamespace;
		so.appendChild(new SOAPObject("Country")).val(country);
		so.appendChild(new SOAPObject("Engine")).val(this.QASEngine).attr("Flatten", this.QASFlatten);
		so.appendChild(new SOAPObject("Search")).val(search);
		so.appendChild(new SOAPObject("Layout")).val(this.QASLayout);
		
		var sr = new SOAPRequest(this.QASNamespace + "/DoSearch", so);
		var callBackList = new Array(handleResponse);
		
		SOAPClient.Proxy = this.QASServer;
		SOAPClient.ContentType = "text/xml";
		SOAPClient.CharSet = "utf-8";
		SOAPClient.SendRequest(sr, callBackList);
		
		function handleResponse(respObj) {
			//alert(respObj.Body[0].QASearchResult[0].QAPicklist[0].PicklistEntry[0].PartialAddress[0].Text);
			var pickList = new Object();
			pickList.error = false;
			pickList.errorMessage = "";
			
			if(respObj.Body[0].Fault != null) {
				pickList.errorMessage = respObj.Body[0].Fault[0].detail[0].QAFault[0].ErrorMessage[0].Text;
				pickList.errorCode = respObj.Body[0].Fault[0].faultstring[0].Text;
				pickList.isOk = false;
				pickList.error = true;
			} else if(respObj.Body[0].QASearchResult[0].QAPicklist[0] != null) {
				var pickListElem = respObj.Body[0].QASearchResult[0].QAPicklist[0];
				pickList.matches = new Array();
				pickList.moniker = pickListElem.FullPicklistMoniker[0].Text;
				
				for(var i = 0; i < pickListElem.PicklistEntry.length; i++) {
					if(pickListElem.PicklistEntry[i].FullAddress == "true") {
						var match = new Object();
						match.moniker = pickListElem.PicklistEntry[i].Moniker[0].Text
						match.addressLines = pickListElem.PicklistEntry[i].Picklist[0].Text.split(", ");
						match.postcode = pickListElem.PicklistEntry[i].Postcode[0].Text;
						pickList.matches.push(match);
					}
					else {
						pickList.error = true;
						pickList.errorMessage = pickListElem.PicklistEntry[i].Picklist[0].Text;
					}
				}
			}
			
			callback(pickList);
		}
	},
	
	DoGetAddress: function(moniker, callback) {
		var so = new SOAPObject("QAGetAddress");
		so.ns = this.QASNamespace;
		so.appendChild(new SOAPObject("Layout")).val(this.QASLayout);
		so.appendChild(new SOAPObject("Moniker")).val(moniker);
		
		var sr = new SOAPRequest(this.QASNamespace + "/DoGetAddress", so);
		
		var callBackList = new Array(handleResponse);
		
		SOAPClient.Proxy = this.QASServer;
		SOAPClient.ContentType = "text/xml";
		SOAPClient.CharSet = "utf-8";
		SOAPClient.SendRequest(sr, callBackList);
		
		function handleResponse(respObj) {
			//alert(respObj.Body[0].Address[0].Text);
			var result = new Object();
			result.errorMessage = "";
			result.errorCode = 0;
			result.address = new Array();
			result.isOk = true;
			
			if(respObj.Body[0].Fault != null) {
				result.errorMessage = respObj.Body[0].Fault[0].detail[0].QAFault[0].ErrorMessage[0].Text;
				result.errorCode = respObj.Body[0].Fault[0].faultstring[0].Text;
				result.isOk = false;
			} else if(respObj.Body[0].Address[0].QAAddress[0].AddressLine != null) {
				var lines = respObj.Body[0].Address[0].QAAddress[0].AddressLine;

				for(var i = 0; i < lines.length; i++) {
					var line = new Object();
					line.label = (lines[i].Label[0].Text != undefined ? lines[i].Label[0].Text : "");
					line.content = (lines[i].Line[0].Text != undefined ? lines[i].Line[0].Text : "");
					result.address.push(line);
				}
			}
			
			callback(result);
		}
	},
	
	DoCanSearch: function(country, layout, callback) {
		var so = new SOAPObject("QACanSearch");
		so.ns = this.QASNamespace;
		so.appendChild(new SOAPObject("Layout")).val(this.QASLayout);
		so.appendChild(new SOAPObject("Engine")).val(this.QASEngine).attr("Flatten", this.QASFlatten);
		so.appendChild(new SOAPObject("Country")).val(country);
		
		var sr = new SOAPRequest(this.QASNamespace + "/DoCanSearch", so);
		
		var callBackList = new Array(handleResponse);
		
		SOAPClient.Proxy = this.QASServer;
		SOAPClient.ContentType = "text/xml";
		SOAPClient.CharSet = "utf-8";
		SOAPClient.SendRequest(sr, callBackList);
		
		function handleResponse(respObj) {
			//alert(respObj.Body[0].Address[0].Text);
			var result = new Object();
			result.errorMessage = "";
			result.errorCode = 0;
			result.isOk = true;
			
			if(respObj.Body[0].Fault != null) {
				result.errorMessage = respObj.Body[0].Fault[0].detail[0].QAFault[0].ErrorMessage[0].Text;
				result.errorCode = respObj.Body[0].Fault[0].faultstring[0].Text;
				result.isOk = false;
			} else if(respObj.Body[0].QASearchOk[0] != null) {
				result.isOk = (respObj.Body[0].QASearchOk[0].IsOk[0].Text == "true" ? true : false);
				if(respObj.Body[0].QASearchOk[0].ErrorMessage != null) {
					result.errorMessage = respObj.Body[0].QASearchOk[0].ErrorMessage[0].Text;
					result.errorCode = respObj.Body[0].QASearchOk[0].ErrorCode[0].Text;
				}
			}
			
			callback(result);
		}
	}
	
	
}