
// AddressService
var AddressService = 
{
	proxy : RegServiceUtils.proxyURI + "AddressService",
	devURL : RegServiceUtils.serviceURI + "AddressService",
	
	add: function(address, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("address_add_request");
		if(address) 
		{
			soapBody.appendChild(AddressService.addressToSoap(address));
		}
		
		bam.soap.SOAPClient.Proxy = AddressService.proxy; 
		bam.soap.SOAPClient.SOAPServer = AddressService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/address/add", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].address_add_response)
			{
				var responseBodyElement = data.Body[0].address_add_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement) && responseBodyElement.addressId)
				{
					callback(responseBodyElement.addressId[0].Text);
				}
				else
				{
					errorCallback("Address.add", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Address.add", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	findAll: function(callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("address_findAll_request");
		bam.soap.SOAPClient.Proxy = AddressService.proxy; 
		bam.soap.SOAPClient.SOAPServer = AddressService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/address/findAll", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].address_findAll_response)
			{
				var responseBodyElement = data.Body[0].address_findAll_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					var addressList = new Array();

					if (responseBodyElement.address)
					{
						for (var i = 0; i < responseBodyElement.address.length; i++)
						{
							addressList.push(AddressService.soapToAddres(responseBodyElement.address[i]));
						}
					}
					
					callback(addressList);
				}
				else
				{
					errorCallback("Address.findAll", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Address.findAll", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}

		});
	},
	
	findById: function(addressId, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("address_findById_request");
		
		soapBody.appendChild(new bam.soap.SOAPObject("addressId")).val(addressId);
		
		bam.soap.SOAPClient.Proxy = AddressService.proxy; 
		bam.soap.SOAPClient.SOAPServer = AddressService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/address/findById", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].address_findById_response)
			{
				var responseBodyElement = data.Body[0].address_findById_response[0];
			
				if (!RegServiceUtils.isErrorThrown(responseBodyElement) && responseBodyElement.address)
				{
					callback(AddressService.soapToAddress(responseBodyElement.address[0]));
				}
				else
				{
					errorCallback("Address.findById", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Address.findById", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},

	findShipping: function(callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("address_findShipping_request");
		
		bam.soap.SOAPClient.Proxy = AddressService.proxy; 
		bam.soap.SOAPClient.SOAPServer = AddressService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/address/findShipping", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].address_findShipping_response)
			{
				var responseBodyElement = data.Body[0].address_findShipping_response[0];
			
				if (!RegServiceUtils.isErrorThrown(responseBodyElement) && responseBodyElement.address)
				{
					callback(AddressService.soapToAddress(responseBodyElement.address[0]));
				}
				else
				{
					errorCallback("Address.findShipping", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Address.findShipping", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
				
		});
	},

	setShipping: function(addressId, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("address_setShipping_request");
		
		soapBody.appendChild(new bam.soap.SOAPObject("addressId")).val(addressId);
		
		bam.soap.SOAPClient.Proxy = AddressService.proxy; 
		bam.soap.SOAPClient.SOAPServer = AddressService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/address/setShipping", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].address_setShipping_response)
			{
				var responseBodyElement = data.Body[0].address_setShipping_response[0];
			
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (callback)
					{
						callback();
					}
				}
				else
				{
					errorCallback("Address.setShipping", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Address.setShipping", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	update: function(address, persistNullValues, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("address_update_request");
		
		soapBody.attr("persistNullValues", persistNullValues==true ? true : false);
		
		if(address) 
		{
			soapBody.appendChild(AddressService.addressToSoap(address));
		}
		
		bam.soap.SOAPClient.Proxy = AddressService.proxy; 
		bam.soap.SOAPClient.SOAPServer = AddressService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/address/update", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].address_update_response)
			{
				var responseBodyElement = data.Body[0].address_update_response[0];
			
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (callback)
					{
						callback();
					}
				}
				else
				{
					errorCallback("Address.update", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Address.update", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	}, 
	
	addressToSoap: function(address)
	{
		var addressElement = null;
		
		if(address)
		{
			addressElement = new bam.soap.SOAPObject("address");
		
			if(address.id) {addressElement.appendChild(new bam.soap.SOAPObject("id")).val(address.id);}
			if(address.street1) {addressElement.appendChild(new bam.soap.SOAPObject("street1")).val(address.street1);}
			if(address.street2) {addressElement.appendChild(new bam.soap.SOAPObject("street2")).val(address.street2);}
			if(address.city) {addressElement.appendChild(new bam.soap.SOAPObject("city")).val(address.city);}
			if(address.state) {addressElement.appendChild(new bam.soap.SOAPObject("state")).val(address.state);}
			if(address.zipCode) {addressElement.appendChild(new bam.soap.SOAPObject("zipCode")).val(address.zipCode);}
			if(address.country) {addressElement.appendChild(new bam.soap.SOAPObject("country")).val(address.country);}
		}
		
		return addressElement;
	},
	
	
	soapToAddress: function(addressElement)
	{
		var address = null;
		
		if(addressElement)
		{
			var address = new Object();
			
			if(addressElement.id) {address.id = addressElement.id[0].Text};
			if(addressElement.street1) {address.street1 = addressElement.street1[0].Text};
			if(addressElement.street2) {address.street2 = addressElement.street2[0].Text};
			if(addressElement.street3) {address.street3 = addressElement.street3[0].Text};
			if(addressElement.city) {address.city = addressElement.city[0].Text};
			if(addressElement.state) {address.state = addressElement.state[0].Text};
			if(addressElement.zipCode) {address.zipCode = addressElement.zipCode[0].Text};
			if(addressElement.country) {address.country = addressElement.country[0].Text};
		}
		
		return address;
	}

}
