
// EmailService
var EmailService = 
{
	proxy : RegServiceUtils.proxyURI + "EmailService",
	devURL : RegServiceUtils.serviceURI + "EmailService",
	
	add: function(email, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("email_add_request");
		
		if(email)
		{
			soapBody.appendChild(emailToSoap(email));
		}
		
		bam.soap.SOAPClient.Proxy = EmailService.proxy; 
		bam.soap.SOAPClient.SOAPServer = EmailService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/add", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_add_response)
			{
				var responseBodyElement = data.Body[0].email_add_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (callback)
					{
						callback(responseBodyElement.emailId[0].Text);
					}
				}
				else
				{
					errorCallback("Email.add", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Email.add", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	findAll: function(callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("email_findAll_request");
		bam.soap.SOAPClient.Proxy = ProfileService.proxy; 
		bam.soap.SOAPClient.SOAPServer = ProfileService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/findAll", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_findAll_response)
			{
				var responseBodyElement = data.Body[0].email_findAll_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (responseBodyElement.email)
					{
						var emailList = new Array();
						for (var i = 0; i < responseBodyElement.email.length; i++)
						{
							emailList.push(EmailService.soapToEmail(responseBodyElement.email[i]));
						}
						callback(emailList);
					}
				}
				else
				{
					errorCallback("Email.findAll", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Email.findAll", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	findById: function(emailId, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("email_findById_request");
		
		soapBody.appendChild(new bam.soap.SOAPObject("emailId")).val(emailId);
		
		bam.soap.SOAPClient.Proxy = EmailService.proxy; 
		bam.soap.SOAPClient.SOAPServer = EmailService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/findById", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_findById_response)
			{
				var responseBodyElement = data.Body[0].email_findById_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement) && responseBodyElement.email)
				{
					callback(EmailService.soapToEmail(responseBodyElement.email[0]));
				}
				else
				{
					errorCallback("Email.findById", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Email.findById", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}	
		});
	},

	findPrimary : function(callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("email_findPrimary_request");
		
		bam.soap.SOAPClient.Proxy = EmailService.proxy; 
		bam.soap.SOAPClient.SOAPServer = EmailService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/findPrimary", soapBody);

		return bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_findPrimary_response)
			{
				var responseBodyElement = data.Body[0].email_findPrimary_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement) && responseBodyElement.email)
				{
					callback(EmailService.soapToEmail(responseBodyElement.email[0]));
				}
				else
				{
					errorCallback("Email.findPrimary", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Email.findPrimary", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}	
		});
	},

	setPrimary: function(emailId, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("email_setPrimary_request");
		
		soapBody.appendChild(new bam.soap.SOAPObject("emailId")).val(emailId);
		
		bam.soap.SOAPClient.Proxy = EmailService.proxy; 
		bam.soap.SOAPClient.SOAPServer = EmailService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/setPrimary", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_setPrimary_response)
			{
				var responseBodyElement = data.Body[0].email_setPrimary_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (callback)
					{
						callback();
					}
				}
				else
				{
					errorCallback("Email.setPrimary", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Email.setPrimary", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},


    sendVerification : function(options) {

		var soapBody = RegServiceUtils.createRequestBody("email_sendVerification_request"),
            soapRequest,
            identityPointElement,
            responseBodyElement;

        identityPointElement = IdentityPointService.identityPointToSoap(options.identification); 

        if (identityPointElement) {
            soapBody.appendChild(identityPointElement);
        }

		bam.soap.SOAPClient.Proxy = EmailService.proxy; 
		bam.soap.SOAPClient.SOAPServer = EmailService.devURL;

		soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/sendVerification", soapBody);

		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_sendVerification_response)
			{
                responseBodyElement = data && data.Body && data.Body[0].email_sendVerification_response;

				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (options.success) {
						options.success();
					}
				}
				else
				{
					options.error("Email.sendVerification", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				options.error("Email.sendVerification", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
    },
	
	update: function(email, persistNullValues, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("email_update_request");
		
		soapBody.attr("persistNullValues", persistNullValues===true ? true : false);
		
		if(email)
		{
			soapBody.appendChild(EmailService.emailToSoap(email));
		}
		
		bam.soap.SOAPClient.Proxy = EmailService.proxy; 
		bam.soap.SOAPClient.SOAPServer = EmailService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/email/update", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].email_update_response)
			{
				var responseBodyElement = data.Body[0].email_update_response[0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					if (callback)
					{
						callback();
					}
				}
				else
				{
					errorCallback("Email.update", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Email.update", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	emailToSoap: function(email)
	{
		var emailElement = null;
		
		if(email)
		{
			emailElement = new bam.soap.SOAPObject("email");
		
			if(email.id) {emailElement.appendChild(new bam.soap.SOAPObject("id")).val(email.id);}
			if(email.address) {emailElement.appendChild(new bam.soap.SOAPObject("address")).val(email.address);}
			if(email.formatId) {emailElement.appendChild(new bam.soap.SOAPObject("formatId")).val(email.formatId);}
		}
		
		return emailElement;
	},
	
	soapToEmail: function(emailElement)
	{
		var email = null;
		
		if(emailElement)
		{
			email = {};
			
			if (emailElement.id) {email.id = emailElement.id[0].Text;}
			if (emailElement.address) {email.address = emailElement.address[0].Text;}
			if (emailElement.formatId) {email.formatId = emailElement.formatId[0].Text;}

            // email verification flag that's introduced as of registration service 1.6
            if (emailElement.verified) { 
                email.verified = (emailElement.verified[0].Text === "true") ? true : false;
            }
		}
		
		return email;
	}

};

