
// FriendService
var FriendService = 
{
	proxy : RegServiceUtils.proxyURI + "FriendService",
	devURL : RegServiceUtils.serviceURI + "FriendService",
	
	updateOperation: function(operation, identityPointId, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("friend_"+operation+"_request");
		
		soapBody.appendChild(new bam.soap.SOAPObject("identityPointId")).val(identityPointId);
		
		bam.soap.SOAPClient.Proxy = FriendService.proxy; 
		bam.soap.SOAPClient.SOAPServer = FriendService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/friend/"+operation, soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0]["friend_"+operation+"_response"])
			{
				var responseBodyElement = data.Body[0]["friend_"+operation+"_response"][0];
				
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					callback();
				}
				else
				{
					errorCallback("Friend."+operation, RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Friend."+operation, {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	requestFriend: function(identityPointId, callback, errorCallback)
	{
		FriendService.updateOperation("requestFriend", identityPointId, callback, errorCallback);
	},
	
	confirmFriend: function(identityPointId, callback, errorCallback)
	{
		FriendService.updateOperation("confirmFriend", identityPointId, callback, errorCallback);
	},
	
	denyFriend: function(identityPointId, callback, errorCallback)
	{
		FriendService.updateOperation("denyFriend", identityPointId, callback, errorCallback);
	},
	
	deleteFriend: function(identityPointId, callback, errorCallback)
	{
		FriendService.updateOperation("deleteFriend", identityPointId, callback, errorCallback);
	},
	
	block: function(identityPointId, callback, errorCallback)
	{
		FriendService.updateOperation("block", identityPointId, callback, errorCallback);
	},

	unblock: function(identityPointId, callback, errorCallback)
	{
		FriendService.updateOperation("unblock", identityPointId, callback, errorCallback);
	},
	
	findOperation: function(operation, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("friend_"+operation+"_request");
		
		bam.soap.SOAPClient.Proxy = FriendService.proxy; 
		bam.soap.SOAPClient.SOAPServer = FriendService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/friend/"+operation, soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0]["friend_"+operation+"_response"])
			{
				var responseBodyElement = data.Body[0]["friend_"+operation+"_response"][0];
			
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					var communityMemberList = new Array();

					if (responseBodyElement.communityMember)
					{
						for (var i = 0; i < responseBodyElement.communityMember.length; i++)
						{
							communityMemberList.push(FriendService.soapToCommunityMember(responseBodyElement.communityMember[i]));
						}
					}
					
					callback(communityMemberList);
				}
				else
				{
					errorCallback("Friend."+operation, RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Friend."+operation, {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},

	findFriendsToConfirm: function(callback, errorCallback)
	{
		FriendService.findOperation("findFriendsToConfirm", callback, errorCallback);
	},

	findFriendRequests: function(callback, errorCallback)
	{
		FriendService.findOperation("findFriendRequests", callback, errorCallback);
	},
	
	findBlocked: function(callback, errorCallback)
	{
		FriendService.findOperation("findBlocked", callback, errorCallback);
	},

	findFriends: function(targetIdentityPointId, findOption, callback, errorCallback)
	{
		var soapBody = RegServiceUtils.createRequestBody("friend_findFriends_request");
		
		soapBody.appendChild(new bam.soap.SOAPObject("targetIdentityPointId")).val(targetIdentityPointId);
		
		if(findOption)
		{
			soapBody.appendChild(FriendService.findOptionToSoap(findOption));
		}
		
		bam.soap.SOAPClient.Proxy = FriendService.proxy; 
		bam.soap.SOAPClient.SOAPServer = FriendService.devURL;
		
		var soapRequest = new bam.soap.SOAPRequest("http://services.bamnetworks.com/registration/friend/findFriends", soapBody);
		bam.soap.SOAPClient.SendRequest(soapRequest, function(data) 
		{
			if (data && data.Body && data.Body[0].friend_findFriends_response)
			{
				var responseBodyElement = data.Body[0].friend_findFriends_response[0];
			
				if (!RegServiceUtils.isErrorThrown(responseBodyElement))
				{
					var communityMemberList = new Array();

					if (responseBodyElement.communityMember)
					{
						for (var i = 0; i < responseBodyElement.communityMember.length; i++)
						{
							communityMemberList.push(FriendService.soapToCommunityMember(responseBodyElement.communityMember[i]));
						}
					}
					
					callback(communityMemberList);
				}
				else
				{
					errorCallback("Friend.findFriends", RegServiceUtils.getStatus(responseBodyElement));
				}
			}
			else
			{
				errorCallback("Friend.findFriends", {code:-100000, message:RegServiceUtils.getServiceErrorMessage(data)});
			}
		});
	},
	
	soapToCommunityMember: function(communityMemberElement)
	{
		var communityMember = null;
		
		if(communityMemberElement)
		{
			communityMember = new Object();
			
			if(communityMemberElement.identityPointId) {communityMember.identityPointId = communityMemberElement.identityPointId[0].Text};
			if(communityMemberElement.nickname) {communityMember.nickname = communityMemberElement.nickname[0].Text};
			if(communityMemberElement.avatar) {communityMember.avatar = communityMemberElement.avatar[0].Text};
			if(communityMemberElement.favoriteTeam) {communityMember.favoriteTeam = communityMemberElement.favoriteTeam[0].Text};
			if(communityMemberElement.status) {communityMember.status = communityMemberElement.status[0].Text};
			if(communityMemberElement.relationshipType) {communityMember.relationshipType = communityMemberElement.relationshipType[0].Text};
		}
		
		return communityMember;
	},
	
	findOptionToSoap: function(findOption)
	{
		var findOptionElement = null;
		
		if(findOption)
		{
			findOptionElement = new bam.soap.SOAPObject("findOption");
		
			if(findOption.detailLevel)
			{
				findOptionElement.attr("detailLevel", findOption.detailLevel);
			}
			
			if(findOption.startIndex)
			{
				findOptionElement.attr("startIndex", findOption.startIndex);
			}

			if(findOption.endIndex)
			{
				findOptionElement.attr("endIndex", findOption.endIndex);
			}
			
			if(findOption.sortAsc)
			{
				findOptionElement.attr("sortAsc", findOption.sortAsc);
			}
			
			if(findOption.sortField)
			{
				for (var i=0; i<findOption.sortField.length; i++)
				{
					findOptionElement.appendChild(new bam.soap.SOAPObject("sortField")).val(findOption.sortField[i]);
				}
			}
		}
		
		return findOptionElement;
	}

}

