function Gang(cntrl)
{
	var gang 	= {};
	gang 		= new NET(cntrl);// inherit net class
	
	/* Attributes */
	
	gang.allMySpaceFriendsLoaded 		= false; // specifies if all myspace friends have been loaded from the myspace server
	gang.appShareMessage 				= opensocial.newMessage("[sender] would like you to join their clan in [app].");
	gang.current_sub_page				= "invite_friends";
	gang.friends4Invite 				= new Array(); // array of selected friend ids
	gang.gangLoaded						= false;
	gang.familyLoaded					= false;
	gang.familyTreeLoaded				= false;
	gang.gang_num_per_page				= 20;
	gang.gang_page_num					= null;
	gang.gangs							= new Array();
	gang.invited						= new Array();
	gang.invitedFriendsIndex 			= new Array(); // array of invited+accepted friends ids
	gang.invitedFriendsLoaded 			= false; // specifies if invitedFriends have been loaded from the server
	gang.invite_friend_page_num 		= null; // specifies the current page (invite friend page)
	gang.invite_friend_num_per_page 	= 20; // max nos of friends displayed in a single invite friend page
	gang.max_invites 					= 20; // maximum nos of invitations in a request
	gang.max_num 						= 100; // max num of friends requested in a single sendRequest() call
	gang.mySpaceFriendsArr 				= new Array(); //array of myspace friends (contains id as index of array, thumbnail_url, profile_url, display_name)
	gang.mySpaceFriendsIndex 			= new Array(); //array containing only ids of mySpace friends
	gang.mySpaceFriendsObj 				= new Array(); //array of myspace friend objects
	gang.numMySpaceFriends 				= null;
	gang.temp_numMySpaceFriends			= 0;
	gang.progress						= 0;
	gang.requests						= new Array();
	gang.requestsLoaded					= false;
	gang.request_num_per_page			= 15;
	gang.unpromotedfriend_num_per_page	= 15;
	gang.request_page_num				= null;
	gang.requestedFriendsIndex			= new Array(); // array of pending requested friend ids
	gang.requested_friend_num_per_page	= 15;// max nos of friends displayed in a single requested friend page
	gang.requested_friend_page_num		= null;// specifies the current page (requested friend page)
	gang.start_index 					= 1;
	gang.temp_start_index 				= null;
	gang.unInvitedFriends 				= new Array(); //array of uninvited friends ids
	gang.rank1Index						= new Array();// array of rank1 ids
	gang.rank2Index						= new Array();// array of rank2 ids
	gang.rank3Index						= new Array();// array of rank3 ids
	gang.rank4Index						= new Array();// array of rank4 ids
	gang.rank5Index						= new Array();// array of rank5 ids
	gang.familyTree 					= new Array();
	gang.unPromotedFriends			 	= new Array();
	gang.familyTreeArray				= new Array();
	/* EOF Attributes */
	
	/* Function Declaration */
	
	gang.acceptAll						= acceptAll;
	gang.acceptAllRequests				= acceptAllRequests;
	gang.acceptAllRequestsCallback		= acceptAllRequestsCallback;
	gang.acceptRequest					= acceptRequest;
	gang.acceptRequestCallback			= acceptRequestCallback;
	gang.cancelAll						= cancelAll;
	gang.cancelAllRequests				= cancelAllRequests;
	gang.cancelAllRequestsCallback		= cancelAllRequestsCallback;
	gang.cancelRequest					= cancelRequest;
	gang.cancelRequestCallback			= cancelRequestCallback;
	gang.clearSelection 				= clearSelection;
	gang.getAllMySpaceFriends 			= getAllMySpaceFriends;
	gang.getAllMySpaceFriendsCallback 	= getAllMySpaceFriendsCallback;
	gang.getGangs						= getGangs;
	gang.getGangsCallback				= getGangsCallback;
	gang.getInvitedFriends 				= getInvitedFriends;
	gang.getInvitedFriendsCallback 		= getInvitedFriendsCallback;
	gang.getRequests					= getRequests;
	gang.getRequestsCallback			= getRequestsCallback;
	gang.getUnInvitedFriends 			= getUnInvitedFriends;
	gang.invite 						= invite;
	gang.inviteCallback 				= inviteCallback;
	gang.loadFriends4Invite 			= loadFriends4Invite;
	gang.loadGangMembers				= loadGangMembers;
	gang.loadGangsPagination			= loadGangsPagination;
	gang.loadInviteFriendPagination 	= loadInviteFriendPagination;
	//gang.loadButtonMen					= loadButtonMen;
	gang.loadPage 						= loadPage;
	gang.loadRequestedFriends			= loadRequestedFriends;
	gang.loadRequestedFriendsPagination	= loadRequestedFriendsPagination;
	gang.loadRequests					= loadRequests;
	gang.loadRequestsPagination			= loadRequestsPagination;
	gang.loadSubPage 					= loadSubPage;
	gang.refresh						= refresh;
	gang.rejectAll						= rejectAll;
	gang.rejectAllRequests				= rejectAllRequests;
	gang.rejectAllRequestsCallback		= rejectAllRequestsCallback;
	gang.rejectRequest					= rejectRequest;
	gang.rejectRequestCallback			= rejectRequestCallback;
	gang.removeGang						= removeGang;
	gang.removeGangCallback				= removeGangCallback;
	gang.select4Invite 					= select4Invite;
	gang.selectRandom 					= selectRandom;
	gang.sendBulletins					= sendBulletins;
	gang.sendInvite 					= sendInvite;
	gang.addInvited						= addInvited;
	gang.removeInvited					= removeInvited;
	gang.getFamilyTree					= getFamilyTree;
	gang.getFamilyTreeCallback			= getFamilyTreeCallback;
	gang.loadManageFamily				= loadManageFamily;
	gang.makeFamilyTree					= makeFamilyTree;
	gang.getUnPromotedFriends			= getUnPromotedFriends;
	gang.appoint						= appoint;
	gang.appointCallback				= appointCallback;
	gang.deleteFamilyMember				= deleteFamilyMember;
	gang.deleteFamilyMemberCallback		= deleteFamilyMemberCallback;
	gang.getFamily						= getFamily;
	gang.getFamilyCallback				= getFamilyCallback;
	gang.loadUnpromotedFriends			= loadUnpromotedFriends;
	gang.loadPromoteFriendBar			=loadPromoteFriendBar;	
	//gang.getFamilyListForManage			= getFamilyListForManage;
	//gang.getFamilyListForManageCallback	= getFamilyListForManageCallback; 
	
	
	/* EOF Function Declaration */
	
	/* Function Definition */
	
	function acceptAll()
	{
		var xml = "<requests>";
		for(i in gang.requests)
		{
			xml += "<id>"+gang.requests[i]+"</id>";
		}
		xml += "</requests>";
		gang.acceptAllRequests(xml);
	};
	
	function acceptAllRequests(xml)
	{
		gang.makeRequest();
	};
	
	function acceptAllRequestsCallback(xml)
	{
		$('req', xml).each(function(){
			var id = parseInt($(this).attr('id'));
			var index = $.inArray(id, gang.requests);
			gang.requests.splice(index, 1);
			gang.invitedFriendsIndex.push(id);
			gang.addInvited(id);
			gang.gangs.push(id);
		});
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		gang.loadRequests(gang.request_page_num);
	};
	
	function addInvited(id)
	{
		gang.invited['id_'+id] = true;
		index = $.inArray(id, gang.unInvitedFriends);
		gang.unInvitedFriends.splice(index, 1);
	};
	
	function removeInvited(id)
	{
		gang.invited['id_'+id] = false;
		gang.unInvitedFriends.push(id);
	};
	
	function acceptRequest(id)
	{
		gang.makeRequest();
	};
	
	function acceptRequestCallback(xml)
	{
		var id = parseInt($(xml).find('data').find('request').attr('id'));
		var index = $.inArray(id, gang.requests);
		gang.requests.splice(index, 1);
		gang.invitedFriendsIndex.push(id);
		gang.addInvited(id);
		gang.gangs.push(id);
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		gang.loadRequests(gang.request_page_num);
	};
	
	function cancelAll()
	{
		var xml = "<requests>";
		for(i in gang.requestedFriendsIndex)
		{
			xml += "<id>"+gang.requestedFriendsIndex[i]+"</id>";
		}
		xml += "</requests>";
		gang.cancelAllRequests(xml);
	};
	
	function cancelAllRequests(xml)
	{
		gang.makeRequest();
	};
	
	function cancelAllRequestsCallback(xml)
	{
		$('req', xml).each(function(){
			var id = parseInt($(this).attr('id'));
			var index = $.inArray(id, gang.requestedFriendsIndex); 
			gang.requestedFriendsIndex.splice(index, 1);
			var index = $.inArray(id, gang.invitedFriendsIndex);
			gang.invitedFriendsIndex.splice(index, 1);
			gang.removeInvited(id);
		});
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		gang.loadRequestedFriends(gang.requested_friend_page_num);
	};
	
	function cancelRequest(id)
	{
		gang.makeRequest();
	};
	
	function cancelRequestCallback(xml)
	{
		var id = parseInt($(xml).find('requests').find('id').text());
		var index = $.inArray(id, gang.requestedFriendsIndex); 
		gang.requestedFriendsIndex.splice(index, 1);
		var index = $.inArray(id, gang.invitedFriendsIndex);
		gang.invitedFriendsIndex.splice(index, 1);
		gang.removeInvited(id);
		$('#gang_requested'+id).fadeOut('slow', function(){setTimeout("gang.loadRequestedFriends(gang.requested_friend_page_num)", 1000);});
	};
	
	function clearSelection()
	{
		gang.friends4Invite = new Array();
		$('#gang_invite_friends .invite_form_box').removeClass('invite_form_box_selected');
	};
	
	/**
	 * loads myspace friends
	 * @return
	 */

	function getAllMySpaceFriends(start)
	{
		if(gang.allMySpaceFriendsLoaded)
		{
			gang.getAllMySpaceFriendsCallback(); return;
		}
		if(!start)
			gang.temp_start_index = gang.start_index;
		else
			gang.temp_start_index = start;
		var params = {};
		params[opensocial.DataRequest.PeopleRequestFields.MAX] = gang.max_num;
		params[opensocial.DataRequest.PeopleRequestFields.FIRST] = gang.temp_start_index;
		//params[opensocial.DataRequest.PeopleRequestFields.SORT_ORDER] = opensocial.DataRequest.SortOrder.NAME;
		var req = opensocial.newDataRequest();
		var idspec = opensocial.newIdSpec({'userId': 'OWNER', 'groupId': 'FRIENDS'});
		req.add(req.newFetchPeopleRequest(idspec, params), 'friends');
		req.send(function(resp)
		{
			 var response = resp.get('friends');
			  if(response.hadError())
				{
					$.prompt('Error in Execution. '+response.getErrorMessage());  
					if(eval(gang.temp_start_index+gang.max_num) <= gang.numMySpaceFriends)
					{
						gang.getAllMySpaceFriends(eval(gang.temp_start_index+gang.max_num));
					}
					else
					{
						gang.allMySpaceFriendsLoaded = true;
						gang.getAllMySpaceFriendsCallback();					
					}
					return;
				}
				friends = response.getData();
				friends.each(function(friend){
									  gang.mySpaceFriendsObj[strtok(friend.getId(), 'myspace.com:')] = friend;
									  var fren = new Array();
									  	fren['user_id'] = parseInt(parseInt(friend.getId().substr(12)));//strtok(friend.getId(), 'myspace.com:')
										fren['display_name'] = friend.getDisplayName();
										fren['thumbnail_url'] = friend.getField('thumbnailUrl');
										if(fren['thumbnail_url'] == '' || fren['thumbnail_url'] == undefined || fren['thumbnail_url'] == null)
											fren['thumbnail_url'] = config.base_url+'/uploaded/no-pic.jpg';
										fren['profile_url'] = friend.getField('profileUrl');
										fren['hasApp'] = friend.getField('hasApp');
										gang.mySpaceFriendsArr[parseInt(friend.getId().substr(12))] = fren;
										gang.mySpaceFriendsIndex.push(parseInt(friend.getId().substr(12)));
										//filtering uninvited friends
										if(!gang.invited['id_'+fren['user_id']])
											gang.unInvitedFriends.push(fren['user_id']);
										gang.temp_numMySpaceFriends++;
									  });
				gang.numMySpaceFriends = friends.getTotalSize();
				var pct = 100/(Math.ceil(gang.numMySpaceFriends/gang.max_num)+1);
				gang.progress = eval(gang.progress+pct);
				$("#progressbar").reportprogress(gang.progress);
				$("#progressbar_text").html("Loading your "+gang.numMySpaceFriends+" friends... Please wait...");
				if(eval(gang.temp_start_index+gang.max_num) <= gang.numMySpaceFriends)
				{
					gang.getAllMySpaceFriends(eval(gang.temp_start_index+gang.max_num));
				}
				else
				{
					gang.allMySpaceFriendsLoaded = true;
					gang.numMySpaceFriends = gang.temp_numMySpaceFriends;
					gang.temp_numMySpaceFriends = 0;
					gang.getAllMySpaceFriendsCallback();
				}
				});
	};
	
	function getAllMySpaceFriendsCallback()
	{
		gang.loadPage();
	};
	
	function getGangs()
	{
		gang.makeRequest();
	};
	
	function getGangsCallback(xml)
	{
		gang.gangLoaded = true;
		gang.gangs = new Array();
		$('gang', xml).each(function(){
			var id = parseInt($(this).attr('id'));
			gang.gangs.push(id);
		});
		gang.loadGangMembers();
	};
	
	/**
	 * get all friends requested + accepted
	 * if friends already loaded i.e gang.invitedFriendsLoaded == true 
	 * then directly loads the page
	 * @return
	 */
	function getInvitedFriends()
	{
		if(gang.invitedFriendsLoaded)
		{
			gang.getUnInvitedFriends();
			gang.loadFriends4Invite();
			return;
		}
		gang.makeRequest(false);
	};
	
	/**
	 * parses the xml and sets the gang.invitedFriendsIndex, gang.requestedFriendsIndex
	 * @param xml returned from the server
	 * @return
	 */
	function getInvitedFriendsCallback(xml)
	{
		$("#progressbar").reportprogress(0);
		gang.invitedFriendsLoaded = true;
		gang.invitedFriendsIndex = new Array();
		$('frn', xml).each(function(){
					var id = parseInt($(this).attr('id'));
					gang.invitedFriendsIndex.push(id);
					gang.invited['id_'+id] = true;
					var status = parseInt($(this).attr('stat'));
					if(status == 0)
					{
						gang.requestedFriendsIndex.push(id);
					}
				});
		gang.loadPage();
	};
	 
	function getRequests()
	{
		gang.makeRequest();
	};
	
	function getRequestsCallback(xml)
	{
		gang.requestsLoaded = true;
		gang.requests = new Array();
		$('req', xml).each(function(){
			var id = parseInt($(this).attr('id'));
			gang.requests.push(id);
		});
		gang.loadRequests();
	};
	
	/**
	 * get uninvited friends
	 * i.e. all myspace friends - all invited(and accepted) friends
	 * @return it sets the result in gang.unInvitedFriends
	 */
	function getUnInvitedFriends()
	{
		var invited = new Array();
		for(i in gang.invitedFriendsIndex)
		{
			invited.push(gang.invitedFriendsIndex[i]);
		}
		var friends = new Array();
		for(i in gang.mySpaceFriendsIndex)
		{
			friends.push(gang.mySpaceFriendsIndex[i]);
		}
		var unInvited = new Array();
		unInvited = array_diff(friends, invited);
		gang.unInvitedFriends = new Array();
		for(i in unInvited)
		{
			gang.unInvitedFriends.push(unInvited[i]);
		}
	};
	
	/**
	 * send request to the server for adding the invitation
	 * @param xml containing ids of friends to send invitation 
	 * @return calls gang.inviteCallback()
	 */
	function invite(xml)
	{
		gang.makeRequest(false);
	};
	
	/**
	 * parses the response (xml) returned from the server
	 * and sets gang.invitedFriendsIndex
	 * then calls the gang.loadFriends4Invite() in return
	 * @param xml collection of recently invited friends return by the server
	 * @return
	 */
	function inviteCallback(xml)
	{
		$('frn', xml).each(function(){
					var id = parseInt($(this).attr('id'));
					gang.invitedFriendsIndex.push(id);
					gang.addInvited(id);
					var status = parseInt($(this).attr('stat'));
					if(status == 0)
					{
						gang.requestedFriendsIndex.push(id);
					}
									});
		gang.clearMessage();
		gang.outputMessage($(xml).find('data').find('message').text());
		gang.clearSelection();
		gang.loadFriends4Invite();
	};
	
	function loadGangMembers(page_num)
	{
		if(!gang.gangLoaded)
		{
			gang.getGangs(); return;
		}
		gang.clearMessage();
		if(page_num == undefined)
		{
			paginationNew('#gang_my_allies_family_pagination', gang.gangs.length, gang.gang_num_per_page, gang.loadGangMembers); return;
		}
		if(!page_num)
			page_num = 0;
		gang.gang_page_num = page_num;
		page_num++;
		var start = (parseInt(page_num)-1)*gang.gang_num_per_page;
		var end = start+parseInt(gang.gang_num_per_page);
		var str = "";
		for(i= start; i<end; i++)
		{
			var id = gang.gangs[i];
			if(!id)
				continue;
			var friend = gang.mySpaceFriendsArr[id];
			if(!friend)
			{
				str += 		"<div class=\"invite_form_box\" id=\"gang_gang_members"+id+"\">"+
								"<div class=\"cross\" title=\"Remove Clan\" onClick=\"gang.removeGang("+id+")\" "+config.hoverEffect+" ></div>"+
								"<div class=\"clear\"></div>"+
							  	img(config.base_url+'/uploaded/no-pic.jpg', id, 'Friend info n/a (friend was either removed or deleted by MySpace)')+
								"<div class=\"invite_form_txt\" >"+p('Unknown', id)+"</div>"+
								"<div class=\"clear\"></div>"+
							"</div>";
			}
			else
				str +="<div class=\"invite_form_box\" id=\"gang_gang_members"+id+"\">"+
							"<div class=\"cross\" title=\"Remove Clan\" onClick=\"gang.removeGang("+id+")\" "+config.hoverEffect+" ></div>"+
							"<div class=\"clear\"></div>"+
						  	img(friend['thumbnail_url'], id, friend['display_name'])+
							"<div class=\"invite_form_txt\" >"+p(friend['display_name'], id)+"</div>"+
							"<div class=\"clear\"></div>"+
						"</div>";
		}
		if(str == "")
			str = "No Clan Members. Invite your friends and become more powerful.";
		str += "<div class=\"clear\"></div>";
		$('#gang_my_allies_family').html(str);
		$('#gang_my_allies_family').fadeIn('slow');
		gang.loadGangsPagination(page_num);
	};
	 
	function loadGangsPagination(page)
	{
		return;
		var pageEnd = Math.ceil(gang.gangs.length/gang.gang_num_per_page);
		var content = pagination(page, "gang.loadGangMembers", pageEnd);
		$('#gang_my_allies_family_pagination').html(content);
		if(gang.gangs.length>gang.gang_num_per_page)
			$('#gang_my_allies_family_pagination').show();
		else
			$('#gang_my_allies_family_pagination').hide();
	};
	
	/**
	 * loads the invite friends page i.e. makes it visible
	 * @param page_num
	 * @return
	 */
	function loadFriends4Invite(page_num)
	{
		if(page_num == undefined)
		{
			paginationNew('#gang_invite_friend_pagination', gang.unInvitedFriends.length, gang.invite_friend_num_per_page, gang.loadFriends4Invite, gang.invite_friend_page_num);
			return;
		}
		if(!page_num)
			page_num = 0;
		gang.clearSelection();
		gang.invite_friend_page_num = page_num;
		page_num++;
		var start = (parseInt(page_num)-1)*gang.invite_friend_num_per_page;
		var end = start+parseInt(gang.invite_friend_num_per_page);
		var str = "<div class=\"clear\"></div>";
		for(i= start; i<end; i++)
		{
			var id = Number();
			id = gang.unInvitedFriends[i];
			if(!id)
				continue;
			var friend = new Array();
			friend = gang.mySpaceFriendsArr[id];
			if(!friend)
			{
				str += 		"<div class=\"invite_form_box\" "+config.hoverEffect+" id=\"gang_inv_box"+id+"\" onClick=\"gang.select4Invite("+id+", this)\" style=\"height:105px;\" >"+
								img(config.base_url+'/uploaded/no-pic.jpg', id, 'Friend info n/a (friend was either removed or deleted by MySpace)')+
								"<div class=\"invite_form_txt\" >"+p('Unknown', id)+"</div>"+
								"<div class=\"clear\"></div>"+
							"</div>";
			}
			else
				str += 		"<div class=\"invite_form_box\" "+config.hoverEffect+" id=\"gang_inv_box"+id+"\" onClick=\"gang.select4Invite("+id+", this)\" style=\"height:105px;\" >"+
							  	img(friend['thumbnail_url'], id, friend['display_name'])+
								"<div class=\"invite_form_txt\" >"+p(friend['display_name'], id)+"</div>"+
								"<div class=\"clear\"></div>"+
							"</div>";
		}
		if(str == "<div class=\"clear\"></div>")
			str = "You have already Invited all of your friends";
		str += "<div class=\"clear\"></div>";
		$('#gang_invite_friends').html(str);
		$('#gang_invite_friends').fadeIn('slow');
		gang.loadInviteFriendPagination(page_num);
	};
	
	function loadInviteFriendPagination(page)
	{
		return;
		var pageEnd = Math.ceil(gang.unInvitedFriends.length/gang.invite_friend_num_per_page);
		var content = pagination(page, "gang.loadFriends4Invite", pageEnd);
		$('#gang_invite_friend_pagination').html(content);
		if(gang.unInvitedFriends.length>gang.invite_friend_num_per_page)
			$('#gang_invite_friend_pagination').show();
		else
			$('#gang_invite_friend_pagination').hide();
	};
	
	function loadPage(sub_page)
	{	
		if(sub_page)
			gang.current_sub_page = sub_page;
		gang.adjustWindowHeight();
		$('#gang_loading').show();
		$('#gang_sub_menu').hide();
		$('#gang_bulletin_box').hide();
		$('#gang_new_request_info').hide();
		$('#gang_requested_info').hide();
		$('.invite_form').hide();
		$('.gang_pagination').hide();
		if(!gang.invitedFriendsLoaded)
		{
			gang.getInvitedFriends();
			return;
		}
		if(!gang.allMySpaceFriendsLoaded)
		{
			gang.getAllMySpaceFriends();
			return;
		}
		$('#gang_loading').hide();
		gang.clearMessage();
		gang.loadSubPage(gang.current_sub_page);
	};
	
	function loadRequestedFriends(page_num)
	{
		if(page_num == undefined)
		{
			paginationNew('#gang_requested_pagination', gang.requestedFriendsIndex.length, gang.requested_friend_num_per_page, gang.loadRequestedFriends); return;
		}
		gang.clearMessage(); 
		if(!page_num)
			page_num = 0;
		gang.requested_friend_page_num = page_num;
		page_num++;
		var start = (parseInt(page_num)-1)*gang.requested_friend_num_per_page;
		var end = start+parseInt(gang.requested_friend_num_per_page);
		var str = "";
		for(i= start; i<end; i++)
		{
			var index = gang.requestedFriendsIndex[i];
			if(!index)
				continue;
			var friend = gang.mySpaceFriendsArr[index];
			if(!friend)
			{
				str += 		"<div class=\"invite_form_box\" id=\"gang_requested"+index+"\" style=\"height:120px;\" ><div class=\"cross\" "+config.hoverEffect+" title=\"Cancel Request\" onClick=\"gang.cancelRequest("+index+")\"></div><div class=\"clear\"></div>"+
								img(config.base_url+'/uploaded/no-pic.jpg', index, 'Friend info n/a (friend was either removed or deleted by MySpace)')+
								"<div class=\"invite_form_txt\" >"+p('Unknown', index)+"</div>"+
							"</div>";
			}
			else
				str += 		"<div class=\"invite_form_box\" id=\"gang_requested"+index+"\" style=\"height:120px;\" ><div class=\"cross\" "+config.hoverEffect+" title=\"Cancel Request\" onClick=\"gang.cancelRequest("+index+")\"></div><div class=\"clear\"></div>"+
							  	img(friend['thumbnail_url'], index, friend['display_name'])+
								"<div class=\"invite_form_txt\" >"+p(friend['display_name'], index)+"</div>"+
							"</div>";
		}
		if(str == "")
		{
			str = "You have not invited any friends recently";
			$('#gang_requested_info').hide();
		}
		else
		{
			$('#gang_num_requested').html(gang.requestedFriendsIndex.length);
			$('#gang_requested_info').fadeIn('slow');
		}
		str += "<div class=\"clear\"></div>";
		$('#gang_requested').html(str);
		$('#gang_requested').fadeIn('slow');
		gang.loadRequestedFriendsPagination(page_num);
	};
	
	function loadRequestedFriendsPagination(page)
	{
		return;
		var pageEnd = Math.ceil(gang.requestedFriendsIndex.length/gang.requested_friend_num_per_page);
		var content = pagination(page, "gang.loadRequestedFriends", pageEnd);
		$('#gang_requested_pagination').html(content);
		if(gang.requestedFriendsIndex.length > gang.requested_friend_num_per_page)
			$('#gang_requested_pagination').show();
		else
			$('#gang_requested_pagination').hide();
	};
	
	function loadRequests(page_num)
	{
		if(!gang.requestsLoaded)
		{
			gang.getRequests(); return;
		}
		gang.clearMessage();
		if(page_num == undefined)
		{
			paginationNew('#gang_send_request_pagination', gang.requests.length, gang.request_num_per_page, gang.loadRequests); return;
		}
		if(!page_num)
			page_num = 0;
		gang.request_page_num = page_num;
		page_num++;
		var start = (parseInt(page_num)-1)*gang.request_num_per_page;
		var end = start+parseInt(gang.request_num_per_page);
		var str = "";
		for(i= start; i<end; i++)
		{
			var index = gang.requests[i];
			if(!index)
				continue;
			var friend = gang.mySpaceFriendsArr[index];
			if(!friend)
			{
				str += 		"<div class=\"invite_form_box\" style=\"padding-top:1px; height:120px;\">"+
								"<div><span class=\"cross\" "+config.hoverEffect+" style=\"float:right;\" title=\"Reject\" onClick=\"gang.rejectRequest("+index+")\"></span><span class=\"ok\" style=\"float:right;\" "+config.hoverEffect+" title=\"Accept\" onClick=\"gang.acceptRequest("+index+")\"></span>"+
									"<div class=\"clear\"></div>"+
								"</div>"+
							  	"<span>"+img(config.base_url+'/uploaded/no-pic.jpg', index, 'Friend info n/a (friend was either removed or deleted by MySpace)')+"</span>"+
								"<div class=\"invite_form_txt\" >"+p('Unknown', index)+"</div>"+
								"<div class=\"clear\"></div>"+
							"</div>";
			}
			else
				str += 		"<div class=\"invite_form_box\" style=\"padding-top:1px; height:120px;\">"+
								"<div><span class=\"cross\" "+config.hoverEffect+" style=\"float:right;\" title=\"Reject\" onClick=\"gang.rejectRequest("+index+")\"></span><span class=\"ok\" style=\"float:right;\" "+config.hoverEffect+" title=\"Accept\" onClick=\"gang.acceptRequest("+index+")\"></span>"+
									"<div class=\"clear\"></div>"+
								"</div>"+
							  	"<span>"+img(friend['thumbnail_url'], index, friend['display_name'])+"</span>"+
								"<div class=\"invite_form_txt\" >"+p(friend['display_name'], index)+"</div>"+
								"<div class=\"clear\"></div>"+
							"</div>";
		}
		if(str == "")
		{
			str = "No new clan requests";
			$('#gang_new_request_info').hide();
		}
		else
		{
			$('#gang_num_req').html(gang.requests.length);
			$('#gang_new_request_info').fadeIn('slow');
		}
		str += "<div class=\"clear\"></div>";
		$('#gang_send_request').html(str);
		$('#gang_send_request').fadeIn('slow');
		gang.loadRequestsPagination(page_num);
	};

	function loadRequestsPagination(page)
	{
		return;
		var pageEnd = Math.ceil(gang.requests.length/gang.request_num_per_page);
		var content = pagination(page, "gang.loadRequests", pageEnd);
		$('#gang_send_request_pagination').html(content);
		if(gang.requests.length > gang.request_num_per_page)
			$('#gang_send_request_pagination').show();
		else
			$('#gang_send_request_pagination').hide();
	};

	function loadSubPage(sub_page)
	{
		gang.current_sub_page = sub_page;
		$('#gang_bulletin_box').hide();
		$('.invite_form').hide();
		$('#gang_new_request_info').hide();
		$('#gang_requested_info').hide();
		$('.pagination').hide();
		$('#manage_family').hide();
		$('#gang_sub_menu').show();
		
		
		switch(gang.current_sub_page)
		{
			default:
			case 'invite_friends':
				gang.loadFriends4Invite();
				$('#gang_bulletin_box').show();
				break;
			case 'send_request':
				if(home.fren_reqs)
				{
					gang.requests						= new Array();
					gang.requestsLoaded					= false;
					gang.request_page_num				= null;
					home.fren_reqs = null;
				}
				gang.loadRequests();
				break;
			case 'my_allies_family':
				gang.loadGangMembers();
				break;
			case 'requested':
				gang.loadRequestedFriends();
				break;
			case 'manage_family':
				gang.loadManageFamily();
				break;
		}
	};

	function rejectAll()
	{
		var xml = "<requests>";
		for(i in gang.requests)
		{
			xml += "<id>"+gang.requests[i]+"</id>";
		}
		xml += "</requests>";
		gang.rejectAllRequests(xml);
	};
	
	function rejectAllRequests(xml)
	{
		gang.makeRequest();
	};
	
	function rejectAllRequestsCallback(xml)
	{
		$('req', xml).each(function(){
			var id = parseInt($(this).attr('id'));
			var index = $.inArray(id, gang.requests);
			gang.requests.splice(index, 1);
			var index = $.inArray(id, gang.invitedFriendsIndex);
			gang.invitedFriendsIndex.splice(index, 1);
			gang.removeInvited(id);
		});
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		gang.loadRequests(gang.request_page_num);
	};
	
	function refresh()
	{
		gang.allMySpaceFriendsLoaded 		= false; // specifies if all myspace friends have been loaded from the myspace server
		gang.friends4Invite 				= new Array(); // array of selected friend ids
		gang.gangLoaded						= false;
		gang.gang_page_num					= null;
		gang.gangs							= new Array();
		gang.invited 						= new Array();
		gang.invitedFriendsIndex 			= new Array(); // array of invited+accepted friends ids
		gang.invitedFriendsLoaded 			= false; // specifies if invitedFriends have been loaded from the server
		gang.invite_friend_page_num 		= null; // specifies the current page (invite friend page)
		gang.mySpaceFriendsArr 				= new Array(); //array of myspace friends (contains id as index of array, thumbnail_url, profile_url, display_name)
		gang.mySpaceFriendsIndex 			= new Array(); //array containing only ids of mySpace friends
		gang.mySpaceFriendsObj 				= new Array(); //array of myspace friend objects
		gang.temp_numMySpaceFriends 		= 0;
		gang.numMySpaceFriends 				= null;
		gang.progress						= 0;
		gang.requests						= new Array();
		gang.requestsLoaded					= false;
		gang.request_page_num				= null;
		gang.requestedFriendsIndex			= new Array(); // array of pending requested friend ids
		gang.requested_friend_page_num		= null;// specifies the current page (requested friend page)
		gang.start_index 					= 1;
		gang.temp_start_index 				= null;
		gang.unInvitedFriends 				= new Array(); //array of uninvited friends ids
		$("#progressbar").reportprogress(0);
		gang.loadPage();
	};
	
	function rejectRequest(id)
	{
		gang.makeRequest();
	};
	
	function rejectRequestCallback(xml)
	{
		var id = parseInt($(xml).find('data').find('id'));
		var index = $.inArray(id, gang.requests);
		gang.requests.splice(index, 1);
		var index = $.inArray(id, gang.invitedFriendsIndex);
		gang.invitedFriendsIndex.splice(index, 1);
		gang.removeInvited(id);
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		gang.loadRequests(gang.request_page_num);
	};
	
	function removeGang(id)
	{
		gang.makeRequest();
	};
	
	function removeGangCallback(xml)
	{
		var id = parseInt($(xml).find('removed').find('friend').attr('id'));
		var index = $.inArray(id, gang.gangs);
		gang.gangs.splice(index, 1);
		var index = $.inArray(id, gang.invitedFriendsIndex);
		gang.invitedFriendsIndex.splice(index, 1);
		gang.removeInvited(id);
		$('#gang_gang_members'+id).fadeOut('slow', function(){setTimeout("gang.loadGangMembers(gang.gang_page_num)", 1000);} );
	};
	
	function select4Invite(id, obj)
	{
		gang.clearMessage();
		var index = $.inArray(id, gang.friends4Invite);
		if(index > -1)
		{
			gang.friends4Invite.splice(index, 1);
			$('#gang_inv_box'+id).removeClass('invite_form_box_selected'); return;
		}
		if(gang.friends4Invite.length >= gang.max_invites)
		{
			gang.outputMessage('You have already selected '+gang.max_invites+' friends for invite.');
			return;
		}
		gang.friends4Invite.push(id);
		$('#gang_inv_box'+id).addClass("invite_form_box_selected");
	};
	
	/**
	 * select randomly up to gang.max_invites no of friends for sending invitation
	 * @return
	 */
	function selectRandom()
	{
		var mess = new Array();
		var selected = new Array();
		var start = (parseInt(gang.invite_friend_page_num))* gang.invite_friend_num_per_page;
		var end = (gang.invite_friend_page_num+1)*gang.invite_friend_num_per_page;
		for(i=start; i<end; i++)
		{
			if(gang.unInvitedFriends[i])
				mess.push(gang.unInvitedFriends[i]);
			$('#gang_inv_box'+gang.unInvitedFriends[i]).removeClass("invite_form_box_selected");
		}
		for(i=0; i<gang.max_invites; i++)
		{
			if(mess.length == 0)
				break;
			var num = Math.floor((Math.random()*mess.length));
			selected.push(mess[num]);
			mess.splice(num, 1);
			}
		gang.friends4Invite = selected;
		for(i in gang.friends4Invite)
		{
			$('#gang_inv_box'+selected[i]).addClass("invite_form_box_selected");
			}
		gang.sendInvite();
	};
	
	function sendBulletins()
	{
		var params = [];
		params[opensocial.Message.Field.TITLE] = "Invitation By "+owner.display_name;
		params[opensocial.Message.Field.TYPE] = opensocial.Message.Type.NOTIFICATION;
		var message = opensocial.newMessage('Come and join me in <a href="'+config.appUrl+'">Dark Wars</a>', params);
		opensocial.requestSendMessage("OWNER_FRIENDS", message, function(response){}, params); return;
	};
	 
	/**
	 * prepares the xml containing id of friends to be invited
	 * and then calls the gang.invite() in return
	 * @return
	 */
	function sendInvite()
	{ 
		if(!gang.friends4Invite.length)
		{
			gang.outputMessage('Please select friend(s) for invitation.'); return;
		}
		opensocial.requestShareApp(gang.friends4Invite, gang.appShareMessage, function(response)
				   {
					   if(response.getData())
					   {
						   var xml = "<friends>";
						   $.each(gang.friends4Invite, function(i, n){
													xml += "<friend>";
													xml += "<id>"+n+"</id>";
													xml += "</friend>";
												});
						   xml += "</friends>";
						   gang.invite(xml);
					   }
					   });
	};
	
	function setButtonMen(id, type)
	{
		if(type!='1' && type!= '2')
		{
			gang.outputMessage('Please Select Type', 'info'); return;
		}
		gang.makeRequest();
	}
	
	function setButtonMenCallback(xml)
	{
		var id 		= parseInt($(xml).find('button_man').attr('id'));
		var type 	= $(xml).find('button_man').attr('type');
		switch(type)
		{
		case '1': // energy
			gang.buttonMenEnergy.push(id);
			break;
		case '2': // stamina
			gang.buttonMenStamina.push(id);
			break;
		case '3':
			gang.buttonMen
		}
		gang.loadButtonMen();
	};
	
	function loadManageFamily()
	{
		$('#manage_family').show();
		$('#gang_family_tree').hide();
		gang.makeFamilyTree();
	};
	
	function getFamilyTree()
	{
		gang.makeRequest();
	};
	
	
	function getFamilyTreeCallback(xml)
	{
		gang.familyTree = new Array();
		gang.familyTreeLoaded = true;
		$('member', xml).each(function()
				{	
					var id = parseInt($(this).find('id').text());
					gang.familyTree.push(id);
					var member 		= new Array();	
					member['id']	= id;
					member['pic'] 	= uuescape($(this).find('pic').text());
					member['name'] 	= $(this).find('name').text();
					member['rank']	= parseInt($(this).find('rank').text());
					gang.familyTreeArray[''+id] = member;
					
					
				});
		gang.makeFamilyTree();
	};
		
	function makeFamilyTree(page_num)
	{
		if(!gang.familyTreeLoaded)
		{
			gang.getFamilyTree(); return;
		}
		if(!gang.gangLoaded)
		{
			gang.getFamily(); return;
		}
		$('#gang_family_tree').show();
		var race = owner.race;
		var content ="";
		var content ="<div><strong>"+stringifyRank(race, 1)+"</strong></div>"+
					"<img src=\""+uuescape(owner.thumbnail_url)+"\" />"+
					"<div class=\"invite_form_txt\" >"+uuescape(owner.name)+"</div>"+
					"<div class=\"clear\"></div>";
		$('#gang_rank_1').html(content);
		
		gang.rank2Index = new Array();
		gang.rank3Index = new Array();
		gang.rank4Index = new Array();
		gang.rank5Index = new Array();		

		
		for(var i in gang.familyTree)
		{
			var id = gang.familyTree[i];
			var member = gang.familyTreeArray[''+id];
			switch(member['rank'])
			{
			case 1:
				gang.rank1Index.push(id);
				break;
			case 2:
				gang.rank2Index.push(id);
				break;
			case 3:
				gang.rank3Index.push(id);
				break;
			case 4:
				gang.rank4Index.push(id);
				break;
			case 5:
				gang.rank5Index.push(id);
				break;
			}
		}
		for(var rank=2; rank<=5; rank++)
		{
			var content ="";
		
			for(var count = 0; count < rank; count++)
			{
				switch(rank)
				{
					case 2:
						var index = gang.rank2Index[count];
						var currRank = gang.familyTreeArray[index];
						break;
					case 3:
						var index = gang.rank3Index[count];
						var currRank = gang.familyTreeArray[index];
						break;
					case 4:
						var index = gang.rank4Index[count];
						var currRank = gang.familyTreeArray[index];
						break;
					case 5:
						var index = gang.rank5Index[count];
						var currRank = gang.familyTreeArray[index];
						break;
				}
				/*if(rank==5)
				{
					if(!currRank || currRank==null)
					{
						content += 	"<div class=\"caporegime_box\" style=\"margin:10px 15px ; \" >"+
										"<div><strong>"+stringifyRank(race,rank)+"</strong></div>"+
										"<img src=\""+config.imageUrl+"/8.png\" />"+
										"<div class=\"invite_form_txt\" >&nbsp;</div>"+
										"<div class=\"clear\"></div>"+
									"</div>";
						continue;
					}
					var id 		= currRank.id;
					var name 	= currRank.name;
					var uRank 	= currRank.rank;
					var pic 	= currRank.pic;
					content += 	"<div class=\"caporegime_box\" style=\"margin:10px 15px ; \" >"+
									"<div><strong>"+stringifyRank(race,uRank)+"</strong></div>"+
									"<div class=\"cross_img\" onclick=\"gang.deleteFamilyMember("+id+","+uRank+")\" ></div>"+
									"<div><img src=\""+pic+"\" /></div>"+
									"<div class=\"invite_form_txt\" >"+p(name,id)+"</div>"+
									"<div class=\"clear\"></div>"+
								"</div>";
				}
				else
				{*/
					
					if(!currRank || currRank==null)
					{
						content += 	"<div class=\"invite_form_box\">"+
										"<div><strong>"+stringifyRank(race,rank)+"</strong></div>"+
										"<img src=\""+config.imageUrl+"/8.png\" width=\"75\" height=\"75\" />"+
										"<div class=\"invite_form_txt\" >&nbsp;</div>"+
										"<div class=\"clear\"></div>"+
									"</div>";
						continue;
					}
					var id 		= currRank.id;
					var name 	= currRank.name;
					var uRank 	= currRank.rank;
					var pic 	= currRank.pic;
					content += 	"<div class=\"invite_form_box\">"+
									"<div><strong>"+stringifyRank(race,uRank)+"</strong></div>"+
									"<div class=\"cross_img\" onclick=\"gang.deleteFamilyMember("+id+","+uRank+")\" ></div>"+
									"<div><img src=\""+pic+"\" width=\"75\" height=\"75\" /></div>"+
									"<div class=\"invite_form_txt\" >"+p(name,id)+"</div>"+
									
									"<div class=\"clear\"></div>"+
								"</div>";
				//}
			}
			$('#gang_rank_'+rank).html(content);
		}
		gang.loadPromoteFriendBar();
		gang.loadUnpromotedFriends(gang.request_page_num);
	};
	
	function loadUnpromotedFriends(page_num)
	{
		gang.getUnPromotedFriends();
		if(page_num == undefined)
		{
			paginationNew('#gang_unpromoted_friends_pagination', gang.unPromotedFriends.length, gang.unpromotedfriend_num_per_page, gang.loadUnpromotedFriends); return;
		}
		if(!page_num)
			page_num = 0;
		gang.request_page_num = page_num;
		page_num++;
		var start = (parseInt(page_num)-1)*gang.request_num_per_page;
		var end = start+parseInt(gang.unpromotedfriend_num_per_page);
		var str = "";
		for(var i=start ; i<end; i++)
		{
			
			var id = gang.unPromotedFriends[i];
			if(!id)
			{
				
				continue;
			}
			var friend = gang.mySpaceFriendsArr[id];
			if(!friend)
			{
				str += 		"<div class=\"invite_form_box\" "+config.hoverEffect+" id=\"gang_inv_box"+id+"\" onClick=\"gang.select4Invite("+id+", this)\" style=\"height:120px;\" >"+
								img(config.base_url+'/uploaded/no-pic.jpg', id, 'Friend info n/a (friend was either removed or deleted by MySpace)')+
								"<div class=\"invite_form_txt\" >"+p('Unknown', id)+"</div>"+
								"<div class=\"clear\"></div>"+
							"</div>";
			}
			else
				str += 		"<div class=\"invite_form_box\" style=\"width:110px; height:150px;\" ><!--mycrew_box starts-->"+
								img(friend['thumbnail_url'], id, friend['display_name'])+
								"<div class=\"invite_form_txt\" >"+p(friend['display_name'], id)+"</div>"+
									"<div class=\"select_div\" ><!--select_div starts-->"+
										"<span><span>"+
										"<select id = \"gang_select_appoint"+id+"\"name=\"select\" style=\"width:90px; margin-top:2px; margin-bottom:5px;\">"+
										  "<option value=\"2\">"+stringifyRank(owner.race,2)+"</option>"+
										  "<option value=\"3\">"+stringifyRank(owner.race,3)+"</option>"+
										  "<option value=\"4\">"+stringifyRank(owner.race,4)+"</option>"+
										  "<option value=\"5\">"+stringifyRank(owner.race,5)+"</option>"+
										"</select>"+																					//("+parent_id+", $('#property_sell_qty"+parent_id+"').val())
										"</span><span class=\"btn_div\"><span class=\"button_new_buy\" onclick=\"gang.appoint("+id+",$('#gang_select_appoint"+id+"').val())\" >Promote</span></span>										</span>"+
										"<div class=\"clear\"></div>"+
									 "</div><!--select_div ends-->"+
									 "<div class=\"clear\"></div>"+
							  "</div><!--mycrew_box ends-->";
		}
		$('#gang_family_list').html(str);
	};
	
	function loadPromoteFriendBar()
	{
		var str="";
		str +=	"<span>Friend ID <input id=\"gang_promote_friend_id\" type=\"text\" style=\"width: 150px;\"/> promote to </span>"+
				"<select id = \"gang_select_appoint_friend\" style=\"width:90px; margin-top:2px; margin-bottom:5px;\">"+
				  "<option value=\"2\">"+stringifyRank(owner.race,2)+"</option>"+
				  "<option value=\"3\">"+stringifyRank(owner.race,3)+"</option>"+
				  "<option value=\"4\">"+stringifyRank(owner.race,4)+"</option>"+
				  "<option value=\"5\">"+stringifyRank(owner.race,5)+"</option>"+
				"</select>"+
				"  <span class=\"button_new\" onclick=\"gang.appoint($('#gang_promote_friend_id').val(),$('#gang_select_appoint_friend').val())\">Promote</span>";
		
		$('#gang_promote_friend_manually').html(str);
				
	};
	
	function appoint(memberId, newRank)
	{
		gang.makeRequest();
	};
	
	function appointCallback(xml)
	{
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		var id = parseInt($(xml).find('data').find('id').text());
		var name = $(xml).find('data').find('name').text();
		var pic = uuescape($(xml).find('data').find('pic').text());
		var rank =parseInt( $(xml).find('data').find('rank').text());
		var member = new Array();
		member['id']=id;
		member['name']=name;
		member['pic']=pic;
		member['rank']=rank;
		gang.familyTree.push(id);
		gang.familyTreeArray[''+id]=member;
		gang.loadManageFamily();
	};
	
	function deleteFamilyMember(friendId, rank)
	{
		gang.makeRequest();	
	};
	
	function deleteFamilyMemberCallback(xml)
	{
		var message = $(xml).find('data').find('message').text();
		gang.outputMessage(message);
		var id = parseInt($(xml).find('data').find('id').text());
		var rank = parseInt($(xml).find('data').find('rank').text());
		var index = $.inArray(id, gang.familyTree);
		if(index > -1)
		{
			gang.familyTree.splice(index, 1);
		}
		gang.loadManageFamily();
	};
	
	function getUnPromotedFriends()
	{
		var unPromotedFriends = new Array();
		gang.unPromotedFriends = new Array();
		var promoted = new Array();
		for(i in gang.familyTree)
			promoted.push(parseInt(gang.familyTree[i]));
		unPromotedFriends = array_diff(gang.gangs, promoted);
		for(i in unPromotedFriends)
		{
			gang.unPromotedFriends.push(parseInt(unPromotedFriends[i]));
		}
	};
	
	function getFamily()
	{
		gang.makeRequest();
	};
	
	function getFamilyCallback(xml)
	{
		gang.gangLoaded = true;
		gang.gangs = new Array();
		$('gang', xml).each(function(){
			var id = parseInt($(this).attr('id'));
			gang.gangs.push(id);
		});
		gang.makeFamilyTree();
		
	};
	return gang;
	
	
	/* EOF Function Definition */
	
	return gang;
};