/**
 * SS
 * SocialSite REST Service interface & Utility methods for Social Profile Pages
 * @author adam.housman
 * @example : 
		var ss = new SS();
		jQuery(document).ready(function(){
			f4a = new f4a_js_flash({'id':'f4a_nike','swfname':'f4a.swf','swfuri':'/nikeos/global/swf/f4a/f4a.swf'});
			f4a.createSwfObject();
			var intervalKey = window.setInterval(function(){	
				if (f4a.checkFlash()){
					ss.init(false);
					window.clearInterval(intervalKey);
				}
			}, 100);
		});
 */
if(typeof(site_prefix)=='undefined'){ var site_prefix = ''; }
if(typeof(track_site)!='undefined'){ site_prefix = track_site; }
var SS = function(socialSiteURL,default_app_id){
	var self = this;
	self.json = '';
	self.DPSID = null;
	self.ST = null;
	self.REQUEST_QUEUE = [];
	self.DATE_FORMAT_REQUEST_QUEUE = [];
	self.DATE_FORMAT = null;
	self.f4a_swf_URL = '/nikeos/global/swf/f4a/f4a.swf';
	self.OLD_ss_getST_URL = socialSiteURL + 'nikegadgets/getToken?moduleId='+Math.floor(Math.random()*10000000)+'&appId=' + default_app_id;
	self.ss_getST_URL = socialSiteURL + 'socialsite/getTokenSession?appId=' + default_app_id;
	self.ss_REST_URL = socialSiteURL + 'nikegadgets/nikeSocial/';
	self.ss_NIKEOS_USER_URL = socialSiteURL + 'nikeosuser/people';
	self.ss_OLD_SYNC_URL = socialSiteURL + 'socialsite/work?name=UpmSyncJobImpl&method=upmProfileUpdate&values=';
	self.ss_SYNC_URL = socialSiteURL + 'socialsite/upmSessionSync?value=';
	self.ss_EMAIL_INVITATIONS_URL = socialSiteURL + 'socialsite/emailinvitations.jsp';
	self.ss_GET_GOOGLE_CONTACTS_URL = socialSiteURL + 'socialsite/getGoogleContacts';
	self.nikeplus_GET_USER_DATA_URL = '/nikeplus/v2/services/app/get_user_data.jsp';
	self.nikeplus_SET_USER_OPTIONS_URL = '/nikeplus/v2/services/app/set_user_options.jsp';
	self.nikeplus_SET_DISPLAY_OPTIONS_URL = '/nikeplus/v2/services/app/set_display_options.jsp';
	self.nikeplus_SET_NOTIFICATION_OPTIONS_URL = '/nikeplus/v2/services/app/set_notification_options.jsp';
	self.nikeplus_SYNC_PROFILE_SETTINGS_URL = '/nikeplus/v2/services/app/sync_profile_settings.jsp';
	self.ss_GOOGLE_IMPORT_JSP = '/nikeos/site/profile_v1.0b/global/jsp/google_contacts_import.jsp';
	self.ss_TWITTER_CONNECT_JSP = '/nikeos/site/profile_v1.0b/global/jsp/twitter_oauth.jsp';
	self.ss_TWITTER_GET_ACCESS_INFO_URL = socialSiteURL + 'nikeosuser/getTwitterAccessInfo';
	self.EMAIL_REFERENCE = {};
	self.FB_CONNECTED = false;
	self.TWITTER_CONNECTED = false;
	self.RUN_GRANULARITY = null;
	self.NOTIFICATIONS_DISPLAY_PAGE = false;
	self.DISPLAYFRIENDS = false;
	self.NIKE_USERS = null;
	self.TOTAL_PAGES_TO_DISPLAY = 3;
	self.COUNTER = 0;
	self.LINK_REF = [];
	self.MESSAGE_COUNT = 0;
	self.START_INDEX = 0;
	self.COUNT = 0;
	self.TOTAL_MESSAGE_COUNT = 0;
	self.TIMEOUT = false;
	self.IS_USER = false;
	self.lang = UPM.lang.toLowerCase();
	self.country = UPM.country.toLowerCase();
	self.category = 'bootcamp'; //this value should be hardcoded in our environment
	
	/**
	 * init
	 * Initializes a SocialSite REST Service interface to return data in either XML or JSON format.
	 * @param {bool} json : if true, data will be returned in JSON format
	 * @see beginning of document for init example.
	 */
	self.init = function(json){
		if(json){ self.json = 'y'; }
		self._getDPSID();
		self.setUpSubnav();
	};
	
	self.setUpSubnav = function() {
		JQ('#subnavigation li, #subnavigation_sequel li').hover(function() {
			JQ(this).not('.selected').addClass('hover');
		}, function() {
			JQ(this).not('.selected').removeClass('hover');
		});
	}
	/**
	 * _f4aRequest
	 * Cross-domain Ajax Request interface
	 * @private
	 * @see beginning of document for example of how to initiate f4a.
	 */
	self._f4aRequest = function(data, callback){
		this.url = data['url'] || '';
		this.method = data['method'] || 'POST';
		this.data = data['post_data'] || {};
		this.contenttype = data['contenttype'] || null;
		this.callback = callback || function(){ return; };
		this.req = {'url':this.url,'meth':this.method,'contenttype':this.contenttype,'data':this.data,'onready':function(data){ callback(data); }};
		f4a.open(this.req);
	};

	/**
	 * _getDPSID
	 * Gets logged-in user's DPS ID from cookie.
	 * @private
	 */
	self._getDPSID = function(){
		if (JQ.cookie('id.nike.com')){
			var decoded = Base64.decode(JQ.cookie('id.nike.com'));
			if(decoded){
				if(decoded.split(':')[1] != 'null'){
					logged_in_status = true;
					self.DPSID = decoded.split(':')[0];
				}
			}
		} else {
			//console.log('NOT LOGGED IN');
			self.DPSID = null;
		}
	};

	/**
	 * _getSecurityToken
	 * Gets a security token to be used in all SocialSite REST API calls. First checks 'st.nike.com' cookie, if it is unavailable, retrieves new token from SS getToken REST service and sets 'st.nike.com'.
	 * @private
	 */
	self._getSecurityToken = function(callback){
		//If we don't yet have a valid security token, queue the requests until we have one.
		if (!JQ.cookie('st.nike.com')){
			requestQueue(callback);
		} else {
			if (!self.ST){ self.ST = JQ.cookie('st.nike.com'); }
			for(var i = 0; i < self.REQUEST_QUEUE.length; i++){
				self.REQUEST_QUEUE.shift()();
			}
			callback();
		}
		
		function requestQueue(cb){
			self.REQUEST_QUEUE.push(cb);
			if(self.REQUEST_QUEUE.length == 1){
				var params = {};
				var anonymous = '';
				var cookie = '';
				if(self.DPSID == null){
					anonymous += '&anonymous=true';
				}
				if(JQ.cookie('PSESSIONID')){
					cookie += '&PSESSIONID=' + self.URLEncodeString(JQ.cookie('PSESSIONID'));
				}
				if(JQ.cookie('JSESSIONID')){
					cookie += '&JSESSIONID=' + self.URLEncodeString(JQ.cookie('JSESSIONID'));
				}
				if(JQ.cookie('BSESSIONID')){
					cookie += '&BSESSIONID=' + self.URLEncodeString(JQ.cookie('BSESSIONID'));
				}
				params['url'] = self.ss_getST_URL + cookie + anonymous;
				params['method'] = 'GET';
				self._f4aRequest(params, function(data){
					if(typeof(data) == 'string'){
						self.ST = data;
						if(typeof(window.PUBLIC)=='undefined'){
							if(JQ.cookie('id.nike.com')){
								if(Base64.decode(JQ.cookie('id.nike.com')).split(':')[0] != 'null'){
									JQ.cookie('st.nike.com',data,{expires:'300',path:'/'});
								}
							}
						} else {
							JQ.cookie('st.nike.com',data,{expires:'300',path:'/'});
						}
						for(var i = 0; i < self.REQUEST_QUEUE.length; i++){
							self._getSecurityToken(self.REQUEST_QUEUE.shift());
						}
					} else {
						//console.warn('couldn\'t get valid security token');
					}
				});
			}
		}
	};

	self.getDateFormat = function(cb){
		if(!JQ.cookie('me.nike.com')){
			self.setDateFormat(cb);
		} else {
			if(typeof(NIKEOS.ME.getCookie().dateFormat)!='undefined'){
				self.DATE_FORMAT = NIKEOS.ME.getCookie().dateFormat;
				cb();
			} else {
				console.log('setDateFormat');
				self.setDateFormat(cb);
			};
		}
	}

	self.setDateFormat = function(cb){
		self.getNikeOSUser(function(data){
			data = self.xml2json(data);
			if(typeof(data.user)!='undefined'){
				if(typeof(data.user.dateFormat)!='undefined' && data.user.dateFormat != ''){
					NIKEOS.ME.addToCookie({'dateFormat':data.user.dateFormat});
					self.DATE_FORMAT = NIKEOS.ME.getCookie().dateFormat;
					if(cb){cb();}
				} else {
					if(UPM.locale=='en_US'){
						NIKEOS.ME.addToCookie({'dateFormat':'m'});
					} else {
						NIKEOS.ME.addToCookie({'dateFormat':'d'});
					}
					self.DATE_FORMAT = NIKEOS.ME.getCookie().dateFormat;
					if(cb){cb();}
				}
			} else {
				if(UPM.locale=='en_US'){
					NIKEOS.ME.addToCookie({'dateFormat':'m'});
				} else {
					NIKEOS.ME.addToCookie({'dateFormat':'d'});
				}
				self.DATE_FORMAT = NIKEOS.ME.getCookie().dateFormat;
				if(cb){cb();}
			}
		});
	}

	/**
	 * getLocalizedActivities
	 * Gets a list of user's activities and those of his/her friends (optional)
	 * @param {string} DPSID : ID of profile to get activities for
	 * @param {function} callback
	 * @param {bool} friends (optional): passing true will return user's friends' activities also
	 * @param {string} altTemplate (optional): alternative template suffix - this will be appended to the bodyId of the message template you are receiving (i.e. FRIENDS:you)
	 * @return XML or JSON activity list
	 */
	self.getLocalizedActivities = function(DPSID,callback,friends,altTemplate,startIndex,count){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getActivities?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&id=' + DPSID + '&rand=' + self.randomInt() + '&appId=' + default_app_id;
			if(friends){ url += '&friends=y'; }
			if(altTemplate){ url += '&altTemplate=' + altTemplate; }
			if(startIndex){ url += '&startIndex=' + startIndex; }
			if(count){ url += '&count=' + count; }
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * postActivity
	 * Posts an activity to the specified user's activity feed
	 * @param {string} DPSID : ID of profile to post activity for
	 * @param {string} activity : HTML string to be displayed in activity feed
	 * @param {function} callback
	 * @return 'OK'
	 * TODO: Agree on standard format of activity for universal styling.
	 */
	self.postActivity = function(DPSID,activity,callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'postActivity?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&id=' + DPSID + '&rand=' + self.randomInt();
			url += '&body=' + activity;
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * getFriends
	 * Gets a list of user's friends
	 * @param {string} DPSID : ID of profile to get activities for
	 * @param {function} callback
	 * @return XML or JSON friends list
	 */
	self.getFriends = function(DPSID,callback,startIndex,count){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getFriends?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&id=' + DPSID + '&rand=' + self.randomInt();
			if(startIndex){ url += '&startIndex=' + startIndex; }
			if(count){ url += '&count=' + count; }
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * updateFriend
	 * (Re)sets relationship level between two users
	 * @param {string} DPSID1 : ID of first user
	 * @param {string} DPSID2 : ID of second user
	 * @param {enum(0,1,2)} friendshipLevel : new friendship level (0 none, 1 contact, 2 friend)
	 * @param {function} callback
	 * TODO: Hash out relationship levels
	 * TODO: Test
	 */
	self.updateFriend = function(DPSID1,DPSID2,friendshipLevel,callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'updateFriend?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&id=' + DPSID1 + '&friendId=' + DPSID2 + '&level=' + friendshipLevel + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * deleteFriend
	 * Negates friendship between two users
	 * @param {string} DPSID1 : ID of first user
	 * @param {string} DPSID2 : ID of second user
	 * @param {function} callback
	 * TODO: Test
	 */
	self.deleteFriend = function(DPSID1,DPSID2,callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'deleteFriend?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&id=' + DPSID1 + '&friendId=' + DPSID2 + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * getFriendRequests
	 * Get a list of user's pending friendship requests
	 * @param {string} DPSID : ID of the user to get requests for
	 * @param {function} callback
	 * TODO: Test
	 */
	self.getFriendRequests = function(DPSID,callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getFriendRequests?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&id=' + DPSID + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * friendRequest
	 * Request that a user be added to sending user's friend list. Request may or may not need to be approved. If there is an outstanding request from the receiving user, the relationship is automatically created.
	 * @param {string} DPSID1 : ID of requesting user
	 * @param {string} DPSID2 : ID of requested user
	 * @param {function} callback
	 * @param {string} howknow (optional) : string detailing the context of this friend request - should contain meta-info about which application this request was generated from(?)
	 * TODO: Test
	 */
	self.friendRequest = function(DPSID1,DPSID2,callback,howknow){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'friendRequest?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&level=2&id=' + DPSID1 + '&friendId=' + DPSID2 + '&rand=' + self.randomInt();
			if(howknow){ url += '&howknow=' + howknow; }
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * acceptRequest
	 * Accept a pending request from a user. Acting user is implied from security token.
	 * @param {string} DPSID : ID of the user who requested the friendship
	 * @param {function} callback
	 * TODO: Test
	 */
	self.acceptRequest= function(DPSID,callback){
		self._getSecurityToken(function(){
			var params = {};
			url += '&json='+self.json;
			var url = self.ss_REST_URL + 'acceptRequest?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&level=2&friendId=' + DPSID + '&rand=' + self.randomInt();
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * rejectRequest
	 * Reject a pending request from a user. Acting user is implied from security token.
	 * @param {string} DPSID : ID of the user who requested the friendship
	 * @param {function} callback
	 * TODO: Test
	 */
	self.rejectRequest= function(DPSID,callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'rejectRequest?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&friendId=' + DPSID + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * getPrivacy
	 * Get current privacy settings.
	 */
	 self.getPrivacy = function(callback, id){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getPrivacy?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&rand=' + self.randomInt();
			if(id){ url += '&id=' + id; }
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	 };

	/**
	 * postPrivacy
	 * Sets privacy for a user.
	 * @param {string} namekey
	 * @param {string} sectionName
	 * @private {string} _privacyLevel : currently hardcoded to '2'
	 * @param {function} callback
	 */
	 self.postPrivacy = function(privacy_level,namekey,sectionName,callback){
		self._getSecurityToken(function(){
			var _relationshipLevel = '2';
			var params = {};
			var url = self.ss_REST_URL + 'postPrivacy?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&namekey=' + namekey + '&sectionName=' + sectionName + '&visibility=' + privacy_level + '&relationshipLevel=' + _relationshipLevel + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	 };

	/**
	 * getMessages
	 * Gets current viewer's messages
	 * @param {function} callback
	 * @param {bool} friends (optional): passing true will return user's friends' activities also
	 * @param {string} altTemplate (optional): alternative template suffix - this will be appended to the bodyId of the message template you are receiving (i.e. FRIENDS:you)
	 * @return XML or JSON message list
	 */
	self.getMessages = function(callback,altTemplate,startIndex,count){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getMessages?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&rand=' + self.randomInt();
			if(altTemplate){ url += '&altTemplate=' + altTemplate; }
			if(startIndex){ url += '&startIndex=' + startIndex; }
			if(count){ url += '&count=' + count; }
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * deleteMessage
	 * Deletes one message
	 * @param {string} id
	 * @param {function} callback
	 * @return XML or JSON message list
	 */
	self.deleteMessage = function(id,callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'deleteMessage?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&messageId='+id + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * getProfile
	 * Gets current viewer's profile or, if supplied an id, the profile of that user
	 * @param {function} callback
	 * @param {string} id (optional)
	 * @return XML or JSON profile
	 */
	self.getProfile = function(callback, id){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getProfile?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&rand=' + self.randomInt();
			if(id){ url += '&id=' + id; }
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * getEmailSettings
	 * Gets the settings for email preferences for the current viewer. Any missing entry means it uses from the system default.
	 * @param {function} callback
	 */
	self.getEmailSettings = function(callback){
		self._getSecurityToken(function(){
			var params = {};
			var url = self.ss_REST_URL + 'getEmailSettings?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};	

	/**
	 * postEmailSettings
	 * Sets email preferences for the current viewer.
	 * @param {function} callback
	 */
	self.postEmailSettings = function(settings_obj,callback){
		self._getSecurityToken(function(){
			var settings = '';
			for(var i in settings_obj){
				settings += '&' + i + '=' + settings_obj[i];
			}
			var params = {};
			var url = self.ss_REST_URL + 'postEmailSettings?st=' + self.ST + '&lang=' + self.lang + '&rand=' + self.randomInt() + '&country=' + self.country + settings;
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};	

	/**
	 * search
	 * Search for profiles whose first name, last name, or screen name match the specified string
	 * @param {string} query : string to match
	 * @param {function} callback
	 * TODO: Test
	 */
	self.search = function(query,callback,startIndex,count){
		self._getSecurityToken(function(){
			var params = {};
			var url = socialSiteURL + '/socialsite/social/rest/search/' + query + '/profile?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&startIndex=' + startIndex + '&count=' + count + '&format=xml';
			//var url = self.ss_REST_URL + 'search?st=' + self.ST + '&lang=' + self.lang + '&country=' + self.country + '&type=profile&query=' + query + '&startIndex=' + startIndex + '&count=' + count + '&rand=' + self.randomInt();
			url += '&json='+self.json;
			params['url'] = url;
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		});
	};

 	/**
 	 * sendEmailInvitations
 	 * Send invitations to a list of email addresses
 	 * @param {array} emailArray : array of email addresses
 	 * @param {string} knows : represents the context in which the user is inviting these friends
 	 * @param {function} callback
 	 */
	self.sendEmailInvitations = function(emailArray,callback,knows){
		self._getSecurityToken(function(){
			var params = {};
			var emails = '';
			for(var i = 0;i<emailArray.length;i++){
				if(i!=0){
					emails += ',';
				}
				emails += emailArray[i];
			}
			var url = self.ss_EMAIL_INVITATIONS_URL + '?st=' + self.ST + '&emailList=' + emails+ '&userId=' + self.DPSID + '&howknow=' + self.category;
			url += '&json='+self.json;
			params['post_data'] = 'optionMsg=' + JQ('#message').val();
			params['url'] = url;
			params['method'] = 'POST';
			params['contenttype'] = 'application/x-www-form-urlencoded;charset=UTF-8';
			self._f4aRequest(params, callback);
		});
	};

	/**
	 * requestRelationship
	 * Generates a friendship request between two users.
	 * @param {string} id : requestor
	 * @param {string} friendId : requestee
	 * @param {function} callback
	*/
 	self.requestRelationship = function(id, friendId, callback) {
		if(!ss){
			//console.warn('no ss instantiated');
			return false;
		}
		ss.friendRequest(id,friendId,function(data){
			if(data == 'OK'){
				callback();
			} else {
				//console.warn('Error Requesting Friendship');
			}
		}, self.category);
	};

	/**
	 * getNikeOSUser
	 * retrieve user data from nike OS DB
	 * @param {function} callback
	 */	 
	self.getNikeOSUser = function(callback){
		if(ss.DPSID != null){
			var params = {};
			params['url'] = self.ss_NIKEOS_USER_URL + '/' + self.DPSID + '?rand=' + self.randomInt();
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		} else {
			//console.warn('Not logged in.');
		}
	};

	/**
	 * editOSUser
	 * sets OS settings for a user, or creates new entry if "newUser" != null
	 * @param {object} data : hash of key/values - keys must match columns in nikeOS table
	 * @param {boolean} newUser : if user doesn't exist yet, pass "true"
	 */
	self.editOSUser = function(data, newUser){
		var xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
		xml += '<nikeOSUser>';
		for(i in data){
			xml += '<'+i+'>' + data[i] + '</'+i+'>';
		}
		xml += '</nikeOSUser>';
		var params = {};
		params['url'] = self.ss_NIKEOS_USER_URL + '/';
		if(!newUser){
			params['url'] += self.DPSID;
		}
		params['method'] = 'POST';
		params['post_data'] = xml;
		params['contenttype'] = 'text/xml';
		self._f4aRequest(params, function(obj){
			NIKEOS.ME.addToCookie(data);
		});
	};

	/**
	 * getNetworkInfo
	 * gets a user's network session info (facebook/twitter)
	 * @param {function} callback
	 */
	self.getNetworkInfo = function(callback){
		if(ss.DPSID != null){
			var params = {};
			params['url'] = self.ss_NIKEOS_USER_URL + '/' + self.DPSID + '/networkInfo';
			params['method'] = 'GET';
			self._f4aRequest(params, callback);
		} else {
			//console.warn('Not logged in.');
		}
	}

	/**
	 * setNetworkInfo
	 * @param {object} data : hash of key/values - keys must match columns in nikeOS table
	 */
	self.setNetworkInfo = function(data){
		var xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
		xml += '<nikeOSNetInfo>';
		xml += '<userId>' + ss.DPSID + '</userId>';
		for(i in data){
			xml += '<'+i+'>' + data[i] + '</'+i+'>';
		}
		xml += '</nikeOSNetInfo>';
		var params = {};
		params['url'] = self.ss_NIKEOS_USER_URL + '/' + self.DPSID + '/networkInfo?rand=' + self.randomInt();
		params['method'] = 'POST';
		params['post_data'] = xml;
		params['contenttype'] = 'text/xml';
		self._f4aRequest(params, function(obj){
			//NIKEOS.ME.addToCookie(data);
		});
	};
	
	/**
	 * initShareStatus
	 * Set up the facebook/twitter "share status" buttons based on response from NikeOSUser DB
	 */
	self.initShareStatus = function(){
		JQ('#broadcast_activity').hover(function(){
			JQ(this).addClass('on');
		}, function(){
			JQ(this).removeClass('on');
		}).click(ss.broadcastDialog);

		self.TWITTER_CONNECTED = "false";
		self.FB_CONNECTED = "false";

		if(!NIKEOS.ME.getCookie().twitterConnected || !NIKEOS.ME.getCookie().facebookConnected){
			self.getNetworkInfo(function(data){
				data = self.xml2json(data);
				if(data.networkInfoList == ''){
					//console.warn('User has no network info yet.');
					self.setShareStatus();
				} else {
					if(typeof(data.networkInfoList.nikeOSNetInfo[0])=='undefined'){
						data.networkInfoList.nikeOSNetInfo = [data.networkInfoList.nikeOSNetInfo];
					}
					var info = data.networkInfoList.nikeOSNetInfo;
					for(var i = 0; i < info.length; i++){
						if(info[i]['networkName'] == 'facebook'){
							if(info[i]['sessionId'] != 'null' && info[i]['sessionId'] != ''){
								self.FB_CONNECTED = "true";
							}
						}
						if(info[i]['networkName'] == 'twitter'){
							if(info[i]['sessionId'] != 'null' && info[i]['sessionId'] != ''){
								self.TWITTER_CONNECTED = "true";
							}
						}
					}
					self.setShareStatus();
				}
			});
		} else {
			if (typeof(NIKEOS.ME.getCookie().twitterConnected) != 'undefined'){
				self.TWITTER_CONNECTED = NIKEOS.ME.getCookie().twitterConnected;
			}
			if (typeof(NIKEOS.ME.getCookie().facebookConnected) != 'undefined'){
				self.FB_CONNECTED = NIKEOS.ME.getCookie().facebookConnected;
			}
			self.setShareStatus();
		}
		
		try {
			supersleight.init();
		} catch (e) {}
		
	}
	
	self.setShareStatus = function(){
		JQ('.broadcaster').hide();
		if (self.FB_CONNECTED == 'true' && self.TWITTER_CONNECTED == 'true'){
			JQ('#broadcasting_both').show();
			NIKEOS.ME.addToCookie({twitterConnected:"true"});
			NIKEOS.ME.addToCookie({facebookConnected:"true"});
		} else if (self.FB_CONNECTED == 'true'){
			JQ('#broadcasting_fb').show();
			NIKEOS.ME.addToCookie({facebookConnected:"true"});
			NIKEOS.ME.addToCookie({twitterConnected:"false"});
		} else if (self.TWITTER_CONNECTED == 'true'){
			JQ('#broadcasting_twitter').show();
			NIKEOS.ME.addToCookie({twitterConnected:"true"});
			NIKEOS.ME.addToCookie({facebookConnected:"false"});
		} else {
			JQ('#not_broadcasting').show();
			NIKEOS.ME.addToCookie({twitterConnected:"false"});
			NIKEOS.ME.addToCookie({facebookConnected:"false"});
		}
		JQ('#broadcast_activity').addClass('ready');
		if(JQ.getURLParam('showSharePopup')){
			self.broadcastDialog();
		}
	}
	
	self.broadcastDialog = function(){
		var html = new Array();
		html.push('<div class="modal_confirm" id="broadcast_modal">');
		html.push('<div class="modal_container" id="broadcast_modal_inside">');
		html.push('<div class="close_x" onclick="JQ.unblockUI()"><img src="/nikeos/global/image/blank.gif" alt=""/></div>')
		if(typeof(NIKEOS.ME.getCookie().privacy_level)!='undefined'){
			if(NIKEOS.ME.getCookie().privacy_level == 'PRIVATE'){
				html.push('<h3>'+_('shareActivity')+'</h3>');
				html.push('<p style="border-bottom:none;">'+_('needToShareMore')+'</p>');
				html.push('<div class="button_container"><input type="button" value="'+_('sharingSettings')+'" onclick="javascript:location.href=\'profile?page=privacy_settings&broadcast=true\'"/><span></span></div>');
				html.push('<div class="clear"></div>');
				html.push('</div>');
				html.push('</div>');
				self.confirmWindow(html.join(''));
				if(typeof(window.tracking!="undefined")){
					page_tracker_obj['prop19'] = "share_activity";
					s['prop19'] = "share_activity";
					s['g_prop19'] = "share_activity";
					tracking.click({pageName:track_site+'>profile>my_profile>share_activity>change_settings'});
				}
				return;
			}
		}
		html.push('<h3>'+_('shareActivity')+'</h3>');
		html.push('<p>'+_('shareActivityInfo')+'</p>');
		html.push('<div class="facebook_connection">');
		html.push('	<div id="facebook_on">');
		html.push('		<div class="logo_container"><img src="/nikeos/site/profile_v1.0b/global/images/facebook_word_logo.png" alt="Facebook"/><span class="on">'+_('connected')+'</span></div>');
		html.push('		<div class="button_container white"><span></span><input type="button" value="'+_('disconnect')+'" onclick="ss.facebookConnect()"/></div>');
		html.push('		<div class="clear"></div>');
		html.push('	</div>');
		html.push('	<div id="facebook_off">');
		html.push('		<div class="logo_container"><img src="/nikeos/site/profile_v1.0b/global/images/facebook_word_logo.png" alt="Facebook"/><span>'+_('notConnected')+'</span></div>');
		html.push('		<div class="button_container white"><span></span><input type="button" value="'+_('connect')+'" onclick="ss.facebookConnect()"/></div>');
		html.push('		<div class="clear"></div>');
		html.push('	</div>');
		html.push('</div>');
		html.push('<div class="twitter_connection">');
		html.push('	<div id="twitter_on">');
		html.push('		<div class="logo_container"><img src="/nikeos/site/profile_v1.0b/global/images/twitter_word_logo.png" alt="Twitter"/><span class="on">'+_('connected')+'</span></div>');
		html.push('		<div class="button_container white"><span></span><input type="button" value="'+_('disconnect')+'" onclick="ss.twitterConnect()"/></div>');
		html.push('		<div class="clear"></div>');
		html.push('	</div>');
		html.push('	<div id="twitter_off">');
		html.push('		<div class="logo_container"><img src="/nikeos/site/profile_v1.0b/global/images/twitter_word_logo.png" alt="Twitter"/><span>'+_('notConnected')+'</span></div>');
		html.push('		<div class="button_container white"><span></span><input type="button" value="'+_('connect')+'" onclick="ss.twitterConnect()"/></div>');
		html.push('		<div class="clear"></div>');
		html.push('	</div>');
		html.push('</div>');
		html.push('<div class="clear"></div>');
		html.push('</div>');
		self.confirmWindow(html.join(''));
		if(self.FB_CONNECTED == "true"){
			JQ('#facebook_on').show();
			JQ('#facebook_off').hide();
		} else {
			JQ('#facebook_off').show();
			JQ('#facebook_on').hide();
		}
		if(self.TWITTER_CONNECTED == "true"){
			JQ('#twitter_on').show();
			JQ('#twitter_off').hide();
		} else {
			JQ('#twitter_off').show();
			JQ('#twitter_on').hide();
		}
		if(typeof(window.tracking!="undefined")){
			page_tracker_obj['prop19'] = "share_activity";
			s['prop19'] = "share_activity";
			s['g_prop19'] = "share_activity";
			tracking.click({pageName:track_site+'>profile>my_profile>share_activity'});
		}
	}
	
	self.setFacebookStatus = function(on){
		if(on == "true"){
			JQ('#facebook_off').hide();
			JQ('#facebook_on').show();
			self.FB_CONNECTED = "true";
			self.setShareStatus();
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['prop19'] = "share_activity";
				s['prop19'] = "share_activity";
				s['g_prop19'] = "share_activity";
				tracking.click({pageName:track_site+'>profile>my_profile>share_activity>facebook>success'});
			}
		} else {
			JQ('#facebook_on').hide();
			JQ('#facebook_off').show();
			self.FB_CONNECTED = "false";
			self.setShareStatus();
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['prop19'] = "share_activity";
				s['prop19'] = "share_activity";
				s['g_prop19'] = "share_activity";
				tracking.click({pageName:track_site+'>profile>my_profile>share_activity>facebook>disconnect'});
			}
		}
	}

	self.setTwitterStatus = function(on){
		if(on == "true"){
			JQ('#twitter_off').hide();
			JQ('#twitter_on').show();
			self.TWITTER_CONNECTED = "true";
			self.setShareStatus();
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['prop19'] = "share_activity";
				s['prop19'] = "share_activity";
				s['g_prop19'] = "share_activity";
				tracking.click({pageName:track_site+'>profile>my_profile>share_activity>twitter>success'});
			}
		} else {
			JQ('#twitter_on').hide();
			JQ('#twitter_off').show();
			self.TWITTER_CONNECTED = "false";
			self.setShareStatus();
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['prop19'] = "share_activity";
				s['prop19'] = "share_activity";
				s['g_prop19'] = "share_activity";
				tracking.click({pageName:track_site+'>profile>my_profile>share_activity>twitter>disconnect'});
			}
		}
	}
	
	/**
	 * facebookConnect
	 */
	self.facebookConnect = function(){
		if(self.FB_CONNECTED == "true"){ //disconnect
			var params = {};
			params['sessionId'] = 'null';
			params['networkName'] = 'facebook';
			self.setNetworkInfo(params);
			self.setFacebookStatus("false");
		} else { //connect
			var api = FB.Facebook.apiClient;
			FB.Connect.requireSession(function(){
				var permissions = 'offline_access,status_update';
				FB.Connect.showPermissionDialog(permissions, function(){
					var userId = api.get_session().uid;
					var sessionKey = api.get_session().session_key;
					var params = {};
					params['sessionId'] = sessionKey;
					params['networkName'] = 'facebook';
					self.setNetworkInfo(params);
					self.setFacebookStatus("true");
				});
			});
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['prop19'] = "share_activity";
				s['prop19'] = "share_activity";
				s['g_prop19'] = "share_activity";
				tracking.click({pageName:track_site+'>profile>my_profile>share_activity>facebook'});
			}
		}
	}
	
	self.facebookLogout = function(){
		FB.Connect.logout(function() {
			console.warn('logged out of facebook');
		});
	}
	
	self.twitterConnect = function(token){
		if(!token){
			if(self.TWITTER_CONNECTED == "false"){
				var url = self.ss_TWITTER_CONNECT_JSP + '?locale=' + UPM.locale;
				self.TWITTER_WINDOW = window.open(url, 'twitter_connect',"width=800,height=400,scrollbars=1");
				if(typeof(window.tracking!="undefined")){
					page_tracker_obj['prop19'] = "share_activity";
					s['prop19'] = "share_activity";
					s['g_prop19'] = "share_activity";
					tracking.click({pageName:track_site+'>profile>my_profile>share_activity>twitter'});
				}
			} else {
				var params = {};
				params['sessionId'] = 'null';
				params['secretKey'] = 'null';
				params['networkName'] = 'twitter';
				self.setNetworkInfo(params);
				self.setTwitterStatus("false");
			}
		} else {
			self.TWITTER_WINDOW.close();
			var params = {};
			params['oauth_token'] = token;
			params['url'] = self.ss_TWITTER_GET_ACCESS_INFO_URL;
			params['method'] = 'GET';
			self._f4aRequest(params, function(data){
				data = self.xml2json(data);
				if(data.status == 'success'){
					var params = {};
					params['secretKey'] = data.networkInfoList.nikeOSNetInfo.secretKey;
					params['sessionId'] = data.networkInfoList.nikeOSNetInfo.sessionId;
					params['networkName'] = data.networkInfoList.nikeOSNetInfo.networkName;
					self.setNetworkInfo(params);
					self.setTwitterStatus("true");
				}
			});
		}
	}
	
	self.shutOffSharing = function(){
		if(self.TWITTER_CONNECTED=='true'){
			self.twitterConnect();
		}
		if(self.FB_CONNECTED=='true'){
			self.facebookConnect();
		}
		self.updatePrivacy('private', function(){
			JQ.unblockUI();
			NIKEOS.ME.addToCookie({'privacy_level':'PRIVATE'});
			JQ('#privacy_public').hide();
			JQ('#privacy_private').show();
			JQ('p.success').show();
			if(typeof(window.nikeplus)!='undefined'){
				nikeplus.plus.syncProfileSettings(function(data){});
			}
			if(typeof(window.tracking!="undefined")){
				tracking.click({pageName:track_site+'>profile>my_profile>my_settings>privacy_settings>save'});
			}
		});
	};
	
	/**
	 * displayLastActivity
	 * Displays most recent activity in top-right header.
	 * @param {object} data : list of owner activities (obtained from ss.getLocalizedActivities)
	 */
	self.displayLastActivity = function(){
		var id = ss.DPSID;
		if(typeof(window.PUBLIC)!='undefined'){
			id = JQ.getURLParam('id');
		}
		ss.getLocalizedActivities(id, function(data){
			if(!data){
				NIKEOS.ME.clearSocialCookies();
				return false;
			}
			data = data.split('</response>')[0] + '</response>';
			var activities = self.xml2json(data);
			var html = new Array();
			if (parseInt(activities.totalResults,10) > 0){
				var activity_array = activities.entry;
				if(!activity_array[0]){
					activity_array = new Array(activity_array);
				}
				var act = activity_array[0].activity;
				var time = self.date_utils.getLocalizedTime(act.postedTime);
				if(act.templateParams.entry[0]){
					for(var j = 0; j < act.templateParams.entry.length; j++){
						if(act.templateParams.entry[j].key == 'application.thumbnail.url'){
							var icon = act.templateParams.entry[j].value;
						}
					}
				} else {
					//console.warn('incorrectly formatted activity');
				}
				html.push('<div class="last_activity">');
				if(icon){
					html.push('<div class="icon"><img src="' + icon + '" alt="" /></div><div class="clear"></div>');
				}
				html.push('<div class="body">');
				html.push('<div class="text">' + self.unescapeHTML(act.body) + '</div>');
				html.push('<div class="posted_time">' + time + '</div>');
				html.push('</div></div>');
				JQ('#last_activity_container').html(html.join(''));
				//track clicks to featured activity
				JQ('#last_activity_container a').each(function(){
					JQ(this).click(function(){
						if(typeof(window.tracking!="undefined")){
							tracking.trackClick({pageName:track_site+'>profile>my_profile>feed>activity'});
						}
					});
				});
			} else {
				//console.warn('Owner has no activities.');
			}
		},null,'feature',0,1);
	};

	self.displayLatestActivities = function(startIndex,count){
		var thisFn = arguments.callee;
		var startIndex = startIndex || 0;
		var count = count || 10;
		self.getLocalizedActivities(ss.DPSID, function(data){
			if(!data){
				NIKEOS.ME.clearSocialCookies();
				return false;
			}
			data = data.split('</response>')[0] + '</response>';
			var activities = self.xml2json(data);
			var html = new Array();
		
			if(activities.totalResults > count){ self.paginate(startIndex,count,activities.totalResults,thisFn,'latest_activity','friends_activity_gadget'); }
			
			if (parseInt(activities.totalResults,10) > 0){
				var activity_array = activities.entry;
				if(!activity_array[0]){
					activity_array = new Array(activity_array);
				}
				for(var i = 0;i<activity_array.length;i++){
					var act = activity_array[i].activity;
					var postedTime = act.postedTime;
					if(act.templateParams.entry[0]){
						for(var j = 0; j < act.templateParams.entry.length; j++){
							if(act.templateParams.entry[j].key == 'imageUrl'){
								var icon = act.templateParams.entry[j].value;
							}
						}
					} else {
						//console.warn('incorrectly formatted activity');
					}
					if(icon == '' || typeof(icon) == 'undefined'){
						icon = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
					}
					if (i == activity_array.length-1) {
						html.push('<div class="activity last">');
					} else {
						html.push('<div class="activity clearfloat">');
					}
					html.push('<div class="icon"><img src="'+ icon +'" alt=""/></div>');
					html.push('<div class="body">');
					html.push('  <div class="posted_time">' + self.date_utils.getLocalizedTime(postedTime) + '</div>');	
					html.push('  <p class="text">' + self.unescapeHTML(act.body) + '</p>');
					html.push('</div><div class="clear"></div>');
					html.push('</div><div class="clear"></div>');
				}
				JQ('#latest_activity').html(html.join(''));
				//track clicks to featured activity
				JQ('#latest_activity a').each(function(){
					JQ(this).click(function(){
						if(typeof(window.tracking!="undefined")){
							tracking.trackClick({pageName:track_site+'>profile>my_profile>profile>overview>friends_activity>feed'});
						}
					});
				});
			} else {
				html.push('<div class="activity no_activities">');
				html.push('<div class="body">');
				html.push('<div class="text no_activity">'+_('addFriends')+'</div>');
				html.push('</div></div>');
				JQ('#latest_activity').html(html.join(''));
			}
		}, true, null, startIndex, count)
	};

	self.displayMyActivities = function(startIndex,count){
		var thisFn = arguments.callee;
		var startIndex = startIndex || 0;
		var count = count || 10;
		self.getLocalizedActivities(ss.DPSID, function(data){
			if(!data){
				NIKEOS.ME.clearSocialCookies();
				return false;
			}
			data = data.split('</response>')[0] + '</response>';
			var activities = self.xml2json(data);
			var html = new Array();
			
			if(activities.totalResults > count){ self.paginate(startIndex,count,activities.totalResults,thisFn,'my_activity','my_activity_gadget'); }
			
			if (parseInt(activities.totalResults,10) > 0){
				var activity_array = activities.entry;
				if(!activity_array[0]){
					activity_array = new Array(activity_array);
				}
				for(var i = 0;i<activity_array.length;i++){
					var act = activity_array[i].activity;
					var postedTime = act.postedTime;
					if(act.templateParams.entry[0]){
						for(var j = 0; j < act.templateParams.entry.length; j++){
							if(act.templateParams.entry[j].key == 'application.thumbnail.url'){
								var icon = act.templateParams.entry[j].value;
							}
						}
					} else {
						//console.warn('incorrectly formatted activity');
					}
					if(icon == '' || typeof(icon) == 'undefined'){
						icon = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
					}
					if (i == activity_array.length-1) {
						html.push('<div class="activity last">');
					} else {
						html.push('<div class="activity clearfloat">');
					}
					html.push('<div class="icon"><img src="'+ icon +'" alt=""/></div>');
					html.push('<div class="body">');
					html.push('  <div class="posted_time">' + self.date_utils.getLocalizedTime(postedTime) + '</div>');	
					html.push('  <p class="text">' + self.unescapeHTML(act.body) + '</p>');
					html.push('</div><div class="clear"></div>');
					html.push('</div><div class="clear"></div>');
				}
				JQ('#my_activity').html(html.join(''));
				//track clicks to featured activity
				JQ('#my_activity a').each(function(){
					JQ(this).click(function(){
						if(typeof(window.tracking!="undefined")){
							tracking.trackClick({pageName:track_site+'>profile>my_profile>profile>overview>activity>feed'});
						}
					});
				});
			} else {
				html.push('<div class="activity">');
				html.push('<div class="body">');
				html.push('<div class="text no_activity">'+_('noActivity')+'</div>');
				html.push('</div></div>');
				JQ('#my_activity').html(html.join(''));
			}
		}, null, 'you', startIndex, count)
	};

	self.displayMyActivitiesPublic = function(startIndex,count){
		var thisFn = arguments.callee;
		var startIndex = startIndex || 0;
		var count = count || 10;
		if(!JQ.getURLParam('id')){
			return;
		} else {
			self.getLocalizedActivities(JQ.getURLParam('id'), function(data){
				if(!data){
					NIKEOS.ME.clearSocialCookies();
					return false;
				}
				data = data.split('</response>')[0] + '</response>';
				var activities = self.xml2json(data);
				var html = new Array();
			
				if (parseInt(activities.totalResults,10) > 0){
					var activity_array = activities.entry;
					if(!activity_array[0]){
						activity_array = new Array(activity_array);
					}
					for(var i = 0;i<activity_array.length;i++){
						var act = activity_array[i].activity;
						var postedTime = act.postedTime;
						if(act.templateParams.entry[0]){
							for(var j = 0; j < act.templateParams.entry.length; j++){
								if(act.templateParams.entry[j].key == 'application.thumbnail.url'){
									var icon = act.templateParams.entry[j].value;
								}
							}
						} else {
							//console.warn('incorrectly formatted activity');
						}
						if(icon == '' || typeof(icon) == 'undefined'){
							icon = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
						}
						if (i == activity_array.length-1) {
							html.push('<div class="activity last">');
						} else {
							html.push('<div class="activity clearfloat">');
						}
						html.push('<div class="icon"><img src="'+ icon +'" alt=""/></div>');
						html.push('<div class="body">');
						html.push('  <div class="posted_time">' + self.date_utils.getLocalizedTime(postedTime) + '</div>');	
						html.push('  <p class="text">' + self.unescapeHTML(act.body) + '</p>');
						html.push('</div><div class="clear"></div>');
						html.push('</div><div class="clear"></div>');
					}
					JQ('#my_activity').html(html.join(''));
					//track clicks to featured activity
					JQ('#my_activity a').each(function(){
						JQ(this).click(function(){
							if(typeof(window.tracking!="undefined")){
								tracking.trackClick({pageName:page_tracker_obj['pageName']+'>activity>feed'});
							}
						});
					});
				} else {
					html.push('<div class="activity">');
					html.push('<div class="body">');
					html.push('<div class="text no_activity">'+_('noActivity')+'</div>');
					html.push('</div></div>');
					JQ('#my_activity').html(html.join(''));
				}
			}, null, null, startIndex, count)
		}
	};
	
	self.setUpNotificationTout = function(){
			
		JQ('#notifications_settings_tout').hover(function(){
			JQ(this).addClass('on');
		}, function(){
			JQ(this).removeClass('on');
		}).click(function(){
			location.href = JQ(this).find('a').attr('href');
		});
	};

	/**
	 * displayMessages
	 * Displays most recent activity message on My Profile page.
	 * @param {object} data : list of owner messages (obtained from ss.getMessages)
	 */
	self.displayMessages = function(data){
		if(data){
			data = data.split('</response>')[0] + '</response>';
			var messages = self.xml2json(data);
			NIKEOS.ME.addToCookie({messageCount:messages.totalResults});
			if(typeof(window.nikeplus)!='undefined'){ nikeplus.nav.setNotificationsCookie(messages.totalResults); }
			self.updateMessageCount(messages.totalResults);
			if(messages.totalResults == '0'){
				return;
			}
			JQ('#li_notifications').show();
			if(!messages.entry[0]){
				messages.entry = new Array(messages.entry);
			}
			var html = new Array();
			for(var i = 0; i < messages.entry.length; i++){
				var msg = messages.entry[i].message;
				var notification_class = '';
				if(msg.title == 'WELCOME_CHANGE_SCREENNAME' || msg.title == 'WELCOME_YOUR_PROFILE_IS_PUBLIC'){
					notification_class = 'long';
				}
				var zebra = (i == 0) ? 'first ' : '';
				if(i == messages.entry.length - 1){
					zebra += 'last';
				}
				html.push('<div class="notification overview ' + zebra + ' ' + notification_class + '" id="notification_' + i + '"><p class="icon">');
				html.push(msg.body);
				html.push('</p>');
				if(msg.extendedType == 'RELATIONSHIP_REQUEST'){
					if(msg.templateParams.entry[0]){
						for(var j = 0; j < msg.templateParams.entry.length; j++){
							if(msg.templateParams.entry[j].key == 'userId'){
								var id = msg.templateParams.entry[j].value;
							}
						}
					} else {
						var id = msg.body.match(/id\=[0-9]*/);
						id = id[0].split('=')[1];
					}
					if(typeof(id)!='undefined'&&typeof(id)!=null){
						html.push('<a class="close" href="javascript:void(0);" onclick="ss.rejectRelationship(\'' + id + '\',' + i + ')"></a>');
						html.push('<a class="accept" href="javascript:void(0);" onclick="ss.acceptRelationship(\'' + id + '\',' + i + ')"></a>');
					}
				} else if (msg.extendedType == 'PRIVATE_MESSAGE'){
					var message_id = msg.id;
					html.push('<a class="close" href="javascript:void(0);" onclick="ss.dismissMessage(\'' + message_id + '\',' + i + ')"></a>');
				}
				html.push('<div class="clear"></div></div>');
			}
			JQ('#notifications_container').html(self.unescapeHTML(html.join('')));
			JQ('#notifications_overview').show();
		} else {
			//console.warn('displayMessages - no data');
			NIKEOS.ME.clearSocialCookies();
		}
	};

	/**
	 * displayAllMessages
	 * Displays most recent activity message on My Profile page.
	 * @param {object} data : list of owner messages (obtained from ss.getMessages)
	 * @param {int} startIndex : starting index of result list
	 * @param {int} count : number of results to return
	 */
	self.displayAllMessages = function(startIndex,count){
		self.thisFn = arguments.callee; //globalize so that removeMessage can get reference to this fn
		var startIndex = startIndex || 0;
		var count = count || 10;
		self.NOTIFICATIONS_DISPLAY_PAGE = true;
		ss.getMessages(function(data){
			if(data){
				data = data.split('</response>')[0] + '</response>';
				var messages = self.xml2json(data);
				NIKEOS.ME.addToCookie({messageCount:messages.totalResults});
				if(typeof(window.nikeplus)!='undefined'){ nikeplus.nav.setNotificationsCookie(messages.totalResults); }
				self.updateMessageCount(messages.totalResults);
				
				if(messages.totalResults == '0'){
					return;
				}
				
				if(!messages.entry[0]){
					messages.entry = new Array(messages.entry);
				}
				
				self.MESSAGE_COUNT = messages.entry.length;
				self.REMOVED_MESSAGE_COUNT = 0;
				self.TOTAL_MESSAGE_COUNT = messages.totalResults;
				self.START_INDEX = startIndex;
				self.COUNT = count;
				
				if(messages.totalResults > count){ self.paginate(self.START_INDEX,self.COUNT,self.TOTAL_MESSAGE_COUNT,self.thisFn,'notifications_container'); }
				
				var html = new Array();
				for(var i = 0; i < messages.entry.length; i++){
					var msg = messages.entry[i].message;
					var zebra = (i == 0) ? 'first ' : '';
					if(i == messages.entry.length - 1){
						zebra += 'last';
					}
					html.push('<div class="notification ' + zebra + '" id="notification_' + i + '"><div class="border_container">');
					var msg_obj = {};
					if(msg.templateParams){
						var params = msg.templateParams.entry;
						var msg_obj = {};
						msg_obj.displayTime = false;
						for(var j = 0; j < params.length; j++){
							switch(params[j].key){
								case 'postedTime':
									msg_obj.postedTime = self.date_utils.getLocalizedTime(params[j].value);
									msg_obj.displayTime = true;
								break;
								case 'imageUrl':
									msg_obj.imageUrl = params[j].value.replace('_LRG.jpg','_MED.jpg');
								break;
								case 'userId':
									msg_obj.userId = params[j].value;
									msg_obj.profileUrl = location.protocol + '//' + location.host + location.pathname + '?page=public&id=' + params[j].value;
								break;
								case 'dpsUserId':
									msg_obj.userId = params[j].value;
									msg_obj.profileUrl = location.protocol + '//' + location.host + location.pathname + '?page=public&id=' + params[j].value;
								break;
								case 'profileFromDisplayName':
									msg_obj.profileFromDisplayName = params[j].value;
								break;
								case 'icon':
									msg_obj.icon = params[j].value;
								break
							}
						}
						if(msg_obj.imageUrl == ''){
							msg_obj.imageUrl = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
						}
					}
					//If this is from a user display image, else display icon (default to "!")
					if(!msg_obj.imageUrl){
						if(msg_obj.icon){
							html.push('<div class="profile_icon">');
							html.push('<img src="' + msg_obj.icon + '" alt="" />');
							html.push('</div>');
							html.push('<div class="text"><p class="icon" style="background-image:url(' + msg_obj.icon + ');">' + msg.body + '</p></div>');
						} else {
							html.push('<div class="profile_icon default">');
							html.push('</div>');
							if(msg.title == 'CONFIRMED_FRIENDSHIP_REQUEST'){
								html.push('<div class="text"><p class="icon padded">' + msg.body + '</p></div>');
							} else {
								html.push('<div class="text"><p class="icon">' + msg.body + '</p></div>');
							}
						}
						msg_obj.displayTime = false;
					} else {
						html.push('<div class="profile_icon">');
						html.push('<img src="' + msg_obj.imageUrl + '" alt="" />');
						html.push('</div>');
						html.push('<div class="text">');
						if(msg_obj.displayTime == true){
							html.push('<p class="time">' + msg_obj.postedTime + '</p>');
						}
						html.push('<p>' + msg.body + '</p>');
						html.push('</div>');
						html.push('<div class="clear"></div>');
					}
					html.push('<div class="message_buttons">');
					if(msg.extendedType == 'RELATIONSHIP_REQUEST'){
						if(msg.templateParams.entry[0]){
							for(var j = 0; j < msg.templateParams.entry.length; j++){
								if(msg.templateParams.entry[j].key == 'userId'){
									var id = msg.templateParams.entry[j].value;
								}
							}
						} else {
							var id = msg.body.match(/id\=[0-9]*/);
							id = id[0].split('=')[1];
						}
						if(typeof(id)!='undefined'&&typeof(id)!=null){
							html.push('<a class="accept" href="javascript:void(0);" onclick="ss.acceptRelationship(\'' + id + '\',' + i + ')">'+_('accept')+'</a>');
							html.push('<a class="close" href="javascript:void(0);" onclick="ss.rejectRelationship(\'' + id + '\',' + i + ')">'+_('dismiss')+'</a>');
						}
					} else if (msg.extendedType == 'PRIVATE_MESSAGE'){
						var message_id = msg.id;
						html.push('<a class="close" href="javascript:void(0);" onclick="ss.dismissMessage(\'' + message_id + '\',' + i + ')">'+_('dismiss')+'</a>');
					}
					html.push('</div>');
					html.push('<div class="clear"></div></div></div><div class="clear"></div>');
				}
				JQ('#notifications_container').html(self.unescapeHTML(html.join('')));
				if(!JQ('#notifications_list_sifr_header').hasClass('sifr')){
					ss.minifield('notifications_list_sifr_header', '#666666', 260, 23, true);
					JQ('#notifications_list_sifr_header').addClass('sifr');
				}
				JQ('#notifications').show();
			} else {
				//console.warn('displayMessages - no data');
				NIKEOS.ME.clearSocialCookies();
			}
		}, 'you',startIndex,count);
	};

	self.acceptRelationship = function(id,notification_counter){
		var old_message_count = NIKEOS.ME.getCookie().messageCount;
		var message_count;
		if((old_message_count - 1) == 0){ message_count = false; }
		else { message_count = old_message_count - 1; }
		NIKEOS.ME.addToCookie({messageCount:message_count});
		if(typeof(window.nikeplus)!='undefined'){ nikeplus.nav.setNotificationsCookie(message_count); }
		self.updateMessageCount(message_count);
		self.removeMessage(id,notification_counter);
		self.acceptRequest(id, function(data){
			if(data == 'OK'){
			}
			if(typeof(window.tracking!="undefined")){
				if(self.NOTIFICATIONS_DISPLAY_PAGE){
					tracking.trackClick({pageName:track_site+'>profile>my_profile>profile>notifications>accept'});
				} else {
					tracking.trackClick({pageName:track_site+'>profile>my_profile>profile>overview>notifications>accept'});
				}
			}
		});
	};

	self.rejectRelationship = function(id,notification_counter){
		var old_message_count = NIKEOS.ME.getCookie().messageCount;
		var message_count;
		if((old_message_count - 1) == 0){ message_count = false; }
		else { message_count = old_message_count - 1; }
		NIKEOS.ME.addToCookie({messageCount:message_count});
		if(typeof(window.nikeplus)!='undefined'){ nikeplus.nav.setNotificationsCookie(message_count); }
		self.updateMessageCount(message_count);
		self.removeMessage(id,notification_counter);
		self.rejectRequest(id, function(data){
			if(data == 'OK'){
			}
		});
	};

	self.dismissMessage = function(id,notification_counter){
		var old_message_count = NIKEOS.ME.getCookie().messageCount;
		var message_count;
		if((old_message_count - 1) == 0){ message_count = false; }
		else { message_count = old_message_count - 1; }
		NIKEOS.ME.addToCookie({messageCount:message_count});
		if(typeof(window.nikeplus)!='undefined'){ nikeplus.nav.setNotificationsCookie(message_count); }
		self.updateMessageCount(message_count);
		self.removeMessage(id,notification_counter);
		self.deleteMessage(id, function(data){
			if(data == 'OK'){
			}
			if(self.NOTIFICATIONS_DISPLAY_PAGE){
				tracking.trackClick({pageName:track_site+'>profile>my_profile>profile>notifications>dismiss'});
			} else {
				tracking.trackClick({pageName:track_site+'>profile>my_profile>profile>overview>notifications>dismiss'});
			}
		});
	};

	self.removeMessage = function(id,notification_counter){
		if (self.NOTIFICATIONS_DISPLAY_PAGE == true){
			self.MESSAGE_COUNT--;
			self.TOTAL_MESSAGE_COUNT--;
			self.REMOVED_MESSAGE_COUNT++;
			var msg_count = JQ('#notifications_container .notification').length;
			if(msg_count == 1){
				if(self.TOTAL_MESSAGE_COUNT == 0){
					JQ('#notifications').slideUp();
				} else {
					self.showLoadingDiv('notifications_container');
					self.thisFn();
				}
			} else {
				JQ('#notification_' + notification_counter).slideUp().html('').removeClass('notification');
			}
			if(self.TOTAL_MESSAGE_COUNT > self.MESSAGE_COUNT){
				self.paginate(self.START_INDEX,self.COUNT,self.TOTAL_MESSAGE_COUNT,self.thisFn,'notifications_container');
			}
		} else {
			if(JQ('#notification_'+notification_counter).hasClass('last')){
				JQ('#notifications_overview').slideUp();
			} else {
				var current_top = parseInt(JQ('#notifications_container').css('top').replace('px',''),10);
				var height_of_notification = JQ('#notification_' + notification_counter).outerHeight();
				JQ('#notifications_container').animate({
					top: +(current_top - height_of_notification)
				});
			}
		}
	}

	/**
	 * getFriendCountAndUpdate
	 * Displays number of friends on My Friends tab.
	 * @param {object} data : list of friends (obtained from ss.getFriends)
	 */
	self.getFriendCountAndUpdate = function(data, callback){
		if(data){
			data = data.split('</response>')[0] + '</response>';
			var friends = self.xml2json(data);
			NIKEOS.ME.addToCookie({friendCount:friends.totalResults});
			self.updateFriendCount(friends.totalResults);
			if(self.DISPLAYFRIENDS == true){
				self.displayFriendsList(friends);
			}
		}
	};
	
	self.getFriendCountAndUpdatePublic = function(data, callback){
		if(data){
			data = data.split('</response>')[0] + '</response>';
			var friends = self.xml2json(data);
			if(self.DISPLAYFRIENDS == true){
				self.displayFriendsListPublic(friends);
			}
		}
	};
	
	self.displayFriendsList = function(startIndex,count){
		self.thisFn = arguments.callee; //globalize so that removeMessage can get reference to this fn
		var startIndex = startIndex || 0;
		var count = count || 10;
		var html = [];
		self.getFriends(self.DPSID, function(data){
			if(data){
				data = data.split('</response>')[0] + '</response>';
				var friends = self.xml2json(data);
				NIKEOS.ME.addToCookie({friendCount:friends.totalResults});
				self.updateFriendCount(friends.totalResults);
				if(self.DISPLAYFRIENDS == true){
					if(friends.totalResults == '0'){
						JQ('#friends_container_top').hide();
						JQ('#loading_friends').hide();
						JQ('#no_friends_content').show();
					} else {
		
						self.MESSAGE_COUNT = friends.entry.length;
						self.REMOVED_MESSAGE_COUNT = 0;
						self.TOTAL_MESSAGE_COUNT = friends.totalResults;
						self.START_INDEX = startIndex;
						self.COUNT = count;
						
						if(friends.totalResults > count){ self.paginate(self.START_INDEX,self.COUNT,self.TOTAL_MESSAGE_COUNT,self.thisFn,'my_friends_container'); }
		
						if(typeof(friends.entry)!='undefined'){
							var friends_array = [];
							if(!friends.entry[0]){
								friends_array[0] = friends.entry;
							} else {
								friends_array = friends.entry;
							}
							for(var i = 0; i<friends_array.length; i++){
								var person = friends_array[i].person;
								html += '<div class="friend clearfloat" id="friend_'+person.id+'">';
								html += '<div class="friend_link_wrapper"><a class="remove_friend" href="javascript:void(0)" onclick="ss.confirmRemoveFriend(\''+person.id+'\'); return false;">'+_('removeFriend')+'</a>';
								html += '<span class="removed">Friend Removed</span></div>';
								var imageUrl = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
								if(person.imageUrl && person.imageUrl != ''){
									imageUrl = person.imageUrl.replace('_LRG.jpg','_MED.jpg');
								}
								html += '<div class="icon"><img src="' + imageUrl + '"/></div>';
								html += '<div class="text"><h2>';
								if(person.visibilityType == 'PUBLIC' && person.profileUrl){
									html += '<a href="'+ person.profileUrl +'">' + person.displayName + '</a>';
								} else {
									html += person.displayName;
								}
								html += '</h2>';
								var profileURL = person.profileUrl;
								
								// add location
								if(person.currentLocation){
									var currLoc = person.currentLocation;
									var city = currLoc.locality;
									var state = currLoc.region;
									var location = '';
									if (city != null && state != null && city != '' & state != '') {
										location = city + ', ' + state;
									} else if (state != null && state != '') {
										location = state;
									} else if (city != null && city != '') {
										location = city;
									}
									html += '<div class="location">' + location + '</div>';
								}
								
								// add status
								if (typeof(person.status) != 'undefined') {
									var status = self.unescapeHTML(person.status);
									status = unescape(status);
									status = status.replace(/\+/g,' ');
									status = self.unescapeHTML(status);
									//console.log(status);
									//status.replace(/\<a.*\>(.*)\<\/a\>/,'');
									
									html += '<div class="status">' + status + '</div>';
								}
								
								html += '</div>';
								html += '<div class="clear"></div>';
								html += '</div>';
								html += '';
				
							}
							setUpHoverStates();
							JQ('#loading_friends').hide();
							JQ('#my_friends_container').html(html);
							JQ('.friends_container_top').show();
						}
					}
				}
			} else {
				//console.warn('displayMessages - no data');
				NIKEOS.ME.clearSocialCookies();
			}
		}, startIndex, count);
		
		function setUpHoverStates(){
			JQ('div.friend').hover(function(){
				JQ(this).addClass('hover');
			}, function(){
				JQ(this).removeClass('hover');
			});
		}

	}

	self.displayFriendsListPublic = function(friends){
		var html = [];
		if(friends.totalResults == '0'){
			JQ('#friends_container_top').hide();
			JQ('#loading_friends').hide();
			JQ('#no_friends_content').show();
		} else {
			if(typeof(friends.entry)!='undefined'){
				var friends_array = [];
				if(!friends.entry[0]){
					friends_array[0] = friends.entry;
				} else {
					friends_array = friends.entry;
				}
				for(var i = 0; i<friends_array.length; i++){
					var person = friends_array[i].person;
					html += '<div class="friend clearfloat" id="friend_'+person.id+'">';
					var imageUrl = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
					if(person.imageUrl && person.imageUrl != ''){
						imageUrl = person.imageUrl.replace('_LRG.jpg','_MED.jpg');
					}
					html += '<div class="icon"><img src="' + imageUrl + '"/></div>';
					html += '<div class="text"><h2>';
					html += person.displayName;
					html += '</h2>';
					var profileURL = person.profileUrl;
					
					// add location
					if(person.currentLocation){
						var currLoc = person.currentLocation;
						var city = currLoc.locality;
						var state = currLoc.region;
						var location = '';
						if (city != null && state != null && city != '' & state != '') {
							location = city + ', ' + state;
						} else if (state != null && state != '') {
							location = state;
						} else if (city != null && city != '') {
							location = city;
						}
						html += '<div class="location">' + location + '</div>';
					}
					
					// add status
					if (typeof(person.status) != 'undefined') {
						var status = self.unescapeHTML(person.status);
						status = unescape(status);
						status = status.replace(/\+/g,' ');
						status = self.unescapeHTML(status);
						//console.log(status);
						//status.replace(/\<a.*\>(.*)\<\/a\>/,'');
						html += '<div class="status">' + status + '</div>';
					}
					
					html += '</div>';
					html += '<div class="clear"></div>';
					html += '</div>';
					html += '<div class="clear"></div>';
	
				}
				JQ('#loading_friends').hide();
				JQ('#my_friends_container').html(html);
				JQ('.friends_container_top').show();
			}
		}
	}

	self.updateMessageCount = function(number){
		if(number == 'false' || number == false){
			setTimeout('setNavProfile({messageCount:"false"})', 500);
			JQ('#notifications_number').html('');
		} else {
			JQ('#notifications_number').html('(' + number + ')');
			setTimeout('setNavProfile({messageCount:' + number + '})', 500);
		}
	};

	self.updateFriendCount = function(number){
		var friends = _('friends');
		if(number == 0){
			friends = _('friend');
		}
		if(number != 0){
			JQ('#friends_number').html('(' + number + ')');
		}
		JQ('.my_friends_header h3').html(number + ' ' + friends);
		ss.minifield('my_friends_list_sifr_header', '#666666', 260, 23, true);
	};

	self.setUpFriendSearch = function(){
		JQ('#search_nike_members').click(function(){
			if(JQ(this).val() == _('enterName')){
				JQ(this).val('');
			}
		});
		JQ('#search_form').show();
		JQ('#no_search_results').hide();
		JQ('#invite_contacts_tout').show();
	}

	/**
	 * friendSearch
	 * Populate list of nike users on Find Friends page
	 */
	self.friendSearch = function(startIndex, count){
		if(typeof(window.tracking!="undefined")){
			tracking.click({pageName:track_site+'>profile>my_profile>my_friends>find>search'});
		}
		JQ('.pagination').hide();
		var thisFn = arguments.callee;
		var startIndex = startIndex || 0;
		var count = count || 10;
		var query = escape(JQ('#search_nike_members').val());
		if(query == '' || query == _('enterName')){
			JQ('#search_nike_members').val(_('enterName'));
			return;
		}
		JQ('#search_results_container').html('');
		JQ('#too_many_results').hide();
		JQ('#successful_search').hide();
		JQ('#invite_contacts_tout').hide();
		JQ('#no_search_results').hide();
		JQ('.query').html(unescape(query));
		JQ.blockUI();
		self.search(query, function(data){
			if(!data){
				NIKEOS.ME.clearSocialCookies();
				JQ.unblockUI();
				return false;
			}
			var data = self.xml2json(data);
			if(data.totalResults == '0' || !data.entry){
				JQ.unblockUI();
				JQ('#search_form').hide();
				JQ('#no_search_results').fadeIn('slow');
				JQ('#successful_search').hide();
				if(typeof(window.tracking!="undefined")){
					tracking.click({pageName:track_site+'>profile>my_profile>my_friends>find>no_results'});
				}
				return false;
			}
			var person_array = [];
			if(!data.entry[0]){
				person_array[0] = data.entry;
			} else {
				person_array = data.entry;
			}
			
			if(data.totalResults > count){ self.paginate(startIndex,count,data.totalResults,thisFn); }
			
			var html = [];
			html.push('<ul id="people_list">');	
			for (i in person_array) {
		        var person = person_array[i].person;
				var isFriend = (person.viewerRelationship['status'] == 'TWOWAY' || person.viewerRelationship['status'] == 'MUTUAL');
				var location = '';
				var name = '';
				if(person.currentLocation){
					if (person.currentLocation.locality && person.currentLocation.region){
						location = person.currentLocation.locality + ', ' + person.currentLocation.region;
					} else {
						if (person.currentLocation.country){
							location = person.currentLocation.country;
							if(location == 'US'){
								location = 'U.S.A.';
							}
						}
					}
				}
				if(person.name){
					if(person.name.givenName && person.name.familyName){
						name = person.name.givenName + ' ' + person.name.familyName;
					}
				}
				html.push('<li><div class="person_container');
				if(isFriend){
					html.push(' friend');
				} else if(person.viewerRelationship['status'] == 'PENDING'){
					html.push(' friended');
				}
				if(i == person_array.length-1){
					html.push(' last');
				}
				html.push('"><div class="friend_link_wrapper">');
				html.push('<a class="add_friend" href="javascript:void(0);" onclick="ss.confirmAddFriend(\''+person.id+'\',this); return false;">' + _('addFriend') + '</a>');
				html.push('<span class="friended_notification">' + _('friendRequested') + '</span>');
				html.push('<span class="is_friend">' + _('friend') + '</span>');
				html.push('</div>');
				
				var image = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
				if(person['imageUrl']){
					image = person.imageUrl.replace('_LRG.jpg','_MED.jpg');
				}
				html.push('<img width="80" height="49" src="'+image+'" alt=""/>');
				if(person.visibilityType == 'PRIVATE'){
					html.push('<div class="text_container"><h3>'+person.displayName+'</a></h3>');
				} else {
					html.push('<div class="text_container"><h3><a href="profile?page=public&id='+person.id+'" title="' + _('viewProfile') + '">'+person.displayName+'</a></h3>');
				}
				if(name != ''){
					html.push('<p class="subtext">'+name+'</p>');
				}
				if(location != ''){
					html.push('<p class="subtext">'+location+'</p>');
				}
				html.push('<div class="clear"></div></div><div class="clear"></div></div></li>');
			}
			html.push('</ul>');	
			JQ('#search_results_container').html(html.join(''));
			var returned_results = data.totalResults;
			if(returned_results == '1'){
				returned_results += ' ' + _('nikeMemberReturned');
			} else {
				returned_results += ' ' + _('nikeMembersReturned');
			}
			JQ.unblockUI();
			JQ('.find_friends_header h3').html(returned_results);
			JQ('#successful_search').fadeIn('slow');
			if(data.totalResults == '200'){
				JQ('#too_many_results').show();
			}
			self.setUpFriendsJS();
		}, startIndex, count);
	};

	/**
	 * paginate
	 * @param {int} startIndex : starting index of result list
	 * @param {int} count : number of results to return
	 * @param {int} totalResults : total number of results in the list (should be available in original calling function, fn)
	 * @param {function} fn : function to paginate the results for
	 * @param {string} content_container (optional): id of the DOM element containing the content to be paginated
	 * @param {string} pagination_container (optional): id of the DOM element containing the pagination controls
	 */
	self.paginate = function(startIndex,count,totalResults,fn,content_container,pagination_container){
		var pc = '';
		if(pagination_container){ pc = '#'+pagination_container; }
		JQ(pc+' .pagination').show();
		JQ(pc+' .previous_pagination, '+pc+' .next_pagination').remove();
		JQ(pc+' .pagination_numbers').html('');
		if(self.NOTIFICATIONS_DISPLAY_PAGE || self.DISPLAYFRIENDS){
			var totalPages = Math.ceil(self.TOTAL_MESSAGE_COUNT/count);
			var removed_message_count = self.REMOVED_MESSAGE_COUNT;
			var startIndex = startIndex - removed_message_count;
			if(startIndex < 0){ startIndex = 0; }
		} else {
			var totalPages = Math.ceil(totalResults/count);
		}
		var currentPage = Math.round(startIndex/count);
		var html = [];
		var pageCount = self.TOTAL_PAGES_TO_DISPLAY;
		if(currentPage == 0){ //FIRST PAGE
			createNextButtons();
			for(var i = 0; i < pageCount; i++){
				if(i < totalPages){
					self.COUNTER++;
					self.LINK_REF[self.COUNTER] = document.createElement('a');
					JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','rel':i}).html(i+1+'');
					if(i != currentPage){
						JQ(self.LINK_REF[self.COUNTER]).click(function(){
							if(content_container){ showLoadingDiv(content_container); }
							fn(parseInt(JQ(this).attr('rel'))*count,count);
						});
					} else {
						JQ(self.LINK_REF[self.COUNTER]).addClass('selected');
					}
					JQ(pc+' .pagination_numbers').append(self.LINK_REF[self.COUNTER]);
				}
			}
		} else if(currentPage == (totalPages - 1)){ //LAST PAGE
			createPreviousButtons();
			for(var i = totalPages-pageCount; i < totalPages; i++){
				if(i >= 0){
					self.COUNTER++;
					self.LINK_REF[self.COUNTER] = document.createElement('a');
					JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','rel':i}).html(i+1+'');
					if(i != currentPage){
						JQ(self.LINK_REF[self.COUNTER]).click(function(){
							if(content_container){ showLoadingDiv(content_container); }
							fn((parseInt(JQ(this).attr('rel')))*count,count);
						});
					} else {
						JQ(self.LINK_REF[self.COUNTER]).addClass('selected');
					}
					JQ(pc+' .pagination_numbers').append(self.LINK_REF[self.COUNTER]);
				}
			}
		} else { //EVERY OTHER PAGE
			createPreviousButtons();
			createNextButtons();
			for(var i = (currentPage-((pageCount-1)/2)); i <= (currentPage+((pageCount-1)/2)); i++){
				if(i >= 0){
					self.COUNTER++;
					self.LINK_REF[self.COUNTER] = document.createElement('a');
					JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','rel':i}).html(i+1+'');
					if(i != currentPage){
						JQ(self.LINK_REF[self.COUNTER]).click(function(){
							if(content_container){ showLoadingDiv(content_container); }
							fn((parseInt(JQ(this).attr('rel')))*count,count);
						});
					} else {
						JQ(self.LINK_REF[self.COUNTER]).addClass('selected');
					}
					JQ(pc+' .pagination_numbers').append(self.LINK_REF[self.COUNTER]);
				}
			}
		}
		
		function createPreviousButtons(){
			self.COUNTER++;
			self.LINK_REF[self.COUNTER] = document.createElement('a');
			JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','id':'previous_'+self.COUNTER}).addClass('previous_pagination').prependTo(pc+' .pagination_top');
			JQ('#previous_'+self.COUNTER).click(function(){
				JQ(pc+' .pagination').hide();
				if(content_container){ showLoadingDiv(content_container); }
				fn(startIndex-count,count);
			});
			self.COUNTER++;
			self.LINK_REF[self.COUNTER] = document.createElement('a');
			JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','id':'previous_'+self.COUNTER}).addClass('previous_pagination').prependTo(pc+' .pagination_bottom');
			JQ('#previous_'+self.COUNTER).click(function(){
				JQ(pc+' .pagination').hide();
				if(content_container){ showLoadingDiv(content_container); }
				fn(startIndex-count,count);
			});
		}

		function createNextButtons(){
			self.COUNTER++;
			self.LINK_REF[self.COUNTER] = document.createElement('a');
			JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','id':'next_'+self.COUNTER}).addClass('next_pagination').appendTo(pc+' .pagination_top');
			JQ('#next_'+self.COUNTER).click(function(){
				JQ(pc+' .pagination').hide();
				if(content_container){ showLoadingDiv(content_container); }
				fn(startIndex+count,count);
			});
			self.COUNTER++;
			self.LINK_REF[self.COUNTER] = document.createElement('a');
			JQ(self.LINK_REF[self.COUNTER]).attr({'href':'javascript:void(0)','id':'next_'+self.COUNTER}).addClass('next_pagination').appendTo(pc+' .pagination_bottom');
			JQ('#next_'+self.COUNTER).click(function(){
				JQ(pc+' .pagination').hide();
				if(content_container){ showLoadingDiv(content_container); }
				fn(startIndex+count,count);
			});
		}
		
		function showLoadingDiv(div){
			JQ('#'+content_container).html('<div class="loading_activities"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="32" HEIGHT="32" id="loader_swf"><param name="wmode" value="transparent"><PARAM NAME="movie" VALUE="/nikeos/global/image/nikeOS_loader.swf"><PARAM NAME="quality" VALUE="best"><embed width="32" height="32"  salign="tl" allowscriptaccess="always" wmode="transparent" menu="false" scale="noscale" quality="best" name="loader_swf" id="loader_swf" style="width: 32px; height: 32px;" src="/nikeos/global/image/nikeOS_loader.swf" type="application/x-shockwave-flash"/></object></div>');
		}
	}
	
	/**
	 * setUpFriendsJS
	 * Adds hover states to friends list.
	 */
	self.setUpFriendsJS = function(){
		JQ('.person_container').hover(function(){
			JQ(this).addClass('hovered');
		}, function(){
			JQ(this).removeClass('hovered');
		});
	};

	self.confirmAddFriend = function(personId,link){
		var pId = personId;
		var lnk = JQ(link);
		var html = new Array();
		html.push('<div class="modal_friend modal_confirm">');
		html.push('<div class="modal_friend_container">');
		html.push('<p>'+_('addFriendAreYouSure')+'</p>');
		html.push('<div class="button_container white" style="margin-left: 20px; float: left;"><span></span><input type="button" id="modal_friend_confirm" class="padded" value="'+_('yes')+'"/></div><div class="button_container white" style="margin-bottom:10px; margin-right: 20px;"><span></span><input type="button" class="padded" value="'+_('no')+'" onclick="JQ.unblockUI();"/></div>');
		html.push('<div class="clear"></div>');
		html.push('</div>');
		html.push('</div>');
		self.confirmWindow(html.join(''));
		JQ('#modal_friend_confirm').click(function() {
			ss.addFriend(pId, lnk);
		});
	}

	/**
	 * addFriend
	 * requestRelationship container
	 * param {string} personId : id of friend to add
	 * param {DOMobject} link : reference to link clicked to add friend
	 */
	self.addFriend = function(personId,link){
		JQ.unblockUI();
		JQ.blockUI();
		self.requestRelationship(ss.DPSID, personId, function(){
			JQ(link).parents('.person_container').addClass('friended');
			if(typeof(window.tracking!="undefined")){
				tracking.click({pageName:track_site+'>profile>my_profile>my_friends>find>add_friend'});
			}
			JQ.unblockUI();
		});
		return false;
	};
	
	self.inviteEmailList = function(){
		if(JQ('#to').val() == _('typeEmailAddresses')){
			return;
		}
		var emailArray = makeEmailArray(JQ('#to').val());
		var total_email_invites = emailArray.length;
		var total_friend_requests = 0;
		if(emailArray.length == 0){
			if(self.isEmpty(self.EMAIL_REFERENCE)){
				return;
			} else {
				var id_array = new Array();
				for(var j in self.EMAIL_REFERENCE){
					id_array.push(self.EMAIL_REFERENCE[j]);
				}
				self.ID_ARRAY = id_array.slice(0);
				friendRequestMultiple(id_array);
			}
		} else {
			self.sendEmailInvitations(emailArray, function(data){
				data = self.xml2json(data);
				if(data.status == 'success'){
					if(!self.isEmpty(self.EMAIL_REFERENCE)){
						var id_array = new Array();
						for(var j in self.EMAIL_REFERENCE){
							id_array.push(self.EMAIL_REFERENCE[j]);
						}
						self.ID_ARRAY = id_array.slice(0);
						friendRequestMultiple(id_array);
					} else {
						JQ.unblockUI();
						JQ('#invite_friends').hide();
						JQ('#search_form').hide();
						JQ('.invite_total').html(total_friend_requests + total_email_invites);
						JQ('#successful_invite').show();
						if(typeof(window.tracking!="undefined")){
							tracking.click({pageName:track_site+'>profile>my_profile>my_friends>invite>success'});
						}
					}
				} else {
					JQ.unblockUI();
					//console.warn('Problem sending email invitations');
				}
			}, 'Invited via "Invite Friends" page');
			JQ.blockUI();
		}

		function makeEmailArray(string){
			string = string.replace(/(\s)+/g,',').replace(/,,/g,',');
			string = string.split(',');
			for(var i = 0; i < string.length; i++){
				if(!string[i].match('@')){
					string.splice(i,1);
				}
			}
			return string;
		}
		
		function friendRequestMultiple(array_of_ids){
			total_friend_requests = array_of_ids.length;
			if(typeof(self.FRIEND_REQUEST_COUNT == 'undefined')){
				self.FRIEND_REQUEST_COUNT = array_of_ids.length;
			}
			self.friendRequest(self.DPSID,array_of_ids.pop(),function(data){
				if(data == 'OK'){
					if(array_of_ids.length == 0){
						var html = [];
						html.push('<p><span id="nike_members_count">' + self.ID_ARRAY.length + '</span> ' + _('ofThePeople') + '</p>');
						for(var i = 0; i < self.ID_ARRAY.length; i++){
							for(var j in self.NIKE_USERS){
								if(self.NIKE_USERS[j].id == self.ID_ARRAY[i]){
									var image = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image_MED.png';
									if(typeof(self.NIKE_USERS[j].imageUrl) != 'undefined'){
										if(self.NIKE_USERS[j].imageUrl != ''){
											image = self.NIKE_USERS[j].imageUrl.replace('_LRG.jpg','_MED.jpg');
										}
									}
									html.push('<div class="profile_block" rel="profile?page=public&id='+self.NIKE_USERS[j].id+'"><img src="'+image+'" alt=""/><span><a href="profile?page=public&id='+self.NIKE_USERS[j].id+'">'+self.NIKE_USERS[j].displayName+'</a></span></div>');
								}
							}
						}
						JQ('#invite_friends').hide();
						JQ('#search_form').hide();
						JQ('.invite_total').html(total_friend_requests + total_email_invites);
						JQ('#nike_members_invited_content').html(html.join(''));
						JQ('#successful_invite').show();
						JQ('#nike_members_invited').show();
						JQ.unblockUI();
						delete self['FRIEND_REQUEST_COUNT'];
					} else {
						friendRequestMultiple(array_of_ids);
					}
				} else {
					JQ.unblockUI();
					//console.warn('Error during friend requests');
					delete self['FRIEND_REQUEST_COUNT'];
				}
			},self.category);
		}
	};

	/**
	 * syncProfile
	 * after a change is made to UPM, this will sync the data to SS database.
	 * param {string} values : comma-separated list of DPSIDs
	 */
	self.syncProfile = function(values,callback){
		var params = {};
		
		var cookie = '';
		if(JQ.cookie('PSESSIONID')){
			cookie += '&PSESSIONID=' + self.URLEncodeString(JQ.cookie('PSESSIONID'));
		}
		if(JQ.cookie('BSESSIONID')){
			cookie += '&BSESSIONID=' + self.URLEncodeString(JQ.cookie('BSESSIONID'));
		}
		if(JQ.cookie('JSESSIONID')){
			cookie += '&JSESSIONID=' + self.URLEncodeString(JQ.cookie('JSESSIONID'));
		}
		var url = self.ss_SYNC_URL + values + cookie;

		params['url'] = url;
		params['method'] = 'GET';
		if (!callback){
			callback = function(){};
		}
		self._f4aRequest(params,callback);
	};
	
	/**
	 * setUpSwitches
	 * sets up hover/click states for display settings switches
	 */
	 self.setUpSwitches = function(){
	 	JQ('ul.switch li').click(function(){
	 		if( !JQ(this).hasClass('on') ){
	 			JQ(this).siblings().removeClass('on').end().addClass('on');
	 		}
		});
	 };

	/**
	 * setUpCheckboxes
	 * sets up hover/click states for notification settings checkboxes
	 */
	self.setUpCheckboxes = function(){
	 	JQ('.checkbox li').click(function(){
	 		JQ(this).toggleClass('on');
		});
	};

	self.getSwitches = function(data){
		var obj = self.xml2json(data);
		if(UPM.locale=='en_US'){
			var dateFormat = 'm';
			var weightUnit = 'l';
			var dayOfWeek = 's';
			var distanceUnit = 'm';
		} else {
			var dateFormat = 'd';
			var weightUnit = 'k';
			var dayOfWeek = 'm';
			var distanceUnit = 'k';
		}
		if(obj.status != 'error'){
			if(obj.user.dateFormat && obj.user.dateFormat != ''){
				dateFormat = obj.user.dateFormat;
			}
			if(obj.user.dayOfWeek && obj.user.dayOfWeek != ''){
				dayOfWeek = obj.user.dayOfWeek;
			}
			if(obj.user.distanceUnit && obj.user.distanceUnit != ''){
				distanceUnit = obj.user.distanceUnit;
			}
			if(obj.user.weightUnit && obj.user.weightUnit != ''){
				weightUnit = obj.user.weightUnit;
			}
		} else {
			self.setSwitches(true);
		}
		if(window.nikeplus){
			self.getNikeplusSettings(function(data){
				data = self.xml2json(data);
				if(data.status == 'failure' || data.status == 'error'){
					//console.warn('Not a nikeplus user');
				} else {
					if(data.userOptions){
						var plus_dateFormat = data.userOptions.dateFormat;
						var plus_distanceUnit = data.userOptions.distanceUnit;
						var plus_dayOfWeek = data.userOptions.startWeek;
						if(plus_dateFormat && plus_dateFormat != ''){
							switch(plus_dateFormat){
								case 'MM/DD/YY':
									dateFormat = 'm';
								break;
								case 'DD/MM/YY':
									dateFormat = 'd';
								break;
								case 'YY/MM/DD':
									dateFormat = 'y';
								break;
							}
						}
						if(plus_dayOfWeek && plus_dayOfWeek != ''){
							switch(plus_dayOfWeek){
								case 'Su':
									dayOfWeek = 's';
								break;
								case 'Mo':
									dayOfWeek = 'm';
								break;
							}
						}
						if(plus_distanceUnit && plus_distanceUnit != ''){
							switch(plus_distanceUnit){
								case 'km':
									distanceUnit = 'k';
								break;
								case 'mi':
									distanceUnit = 'm';
								break;
							}
						}
					}
				}
				setSwitches();
				nikeplus.userCookie.rebuild(function(){ self.setUpRunGraph() });
			});
		}
		
		function setSwitches(){
			JQ('#distanceUnit_'+distanceUnit).addClass('on');
			JQ('#dayOfWeek_'+dayOfWeek).addClass('on');
			JQ('#dateFormat_'+dateFormat).addClass('on');
			JQ('#weightUnit_'+weightUnit).addClass('on');
		}

	};

	self.setUpRunGraph = function(){
		var runID = {};
		if(JQ.getURLParam('runID')){
			runID = { 'runID' : JQ.getURLParam('runID') }
		}
		self.insertSWF({
			path:"/nikeplus/os/global/swf/profile/runprofile.swf",
			width:440,
			height:266
		},runID,JQ('#nikeplus_run_granularity'));
		JQ('#settings_sidebar #nikeplus').show();
		setTimeout('ss.setUpUpdateRunGranularity()',1000);
	}
	
	self.setUpUpdateRunGranularity = function(){
		nikeplus.page = {};
		nikeplus.page.sub = {};
		nikeplus.page.sub.updateRunGranularity = function(value){
			self.RUN_GRANULARITY = value;
		};
	}

	self.setSwitches = function(newUser){
		if(!newUser){
			JQ.blockUI();
			JQ('p.success, p.error').hide();
		}
		var params = {};
		//params[id] = self.DPSID;
		JQ('ul.switch li.on').each(function(){
			var arr = JQ(this).attr('id').split('_');
			params[arr[0]] = arr[1];
		});
		if(newUser){
			params['dpsID']=self.DPSID;
			ss.editOSUser(params,true);
		} else {
			ss.editOSUser(params);
		}
		if(window.nikeplus && !newUser){
			var plus_subset = {};
			for(var i in params){
				if(i == 'dateFormat'){
					var dateFormat = '';
					switch(params[i]){
						case 'm':
							dateFormat = 'MM/DD/YY';
						break;
						case 'd':
							dateFormat = 'DD/MM/YY';
						break;
						case 'y':
							dateFormat = 'YY/MM/DD';
						break;
					}
					plus_subset['dateFormat'] = dateFormat;
				} else if(i == 'dayOfWeek'){
					var dayOfWeek = '';
					switch(params[i]){
						case 's':
							startWeek = 'Su';
						break;
						case 'm':
							startWeek = 'Mo';
						break;
					}
					plus_subset['startWeek'] = startWeek;
				} else if(i == 'distanceUnit'){
					var distanceUnit = '';
					switch(params[i]){
						case 'k':
							distanceUnit = 'km';
						break;
						case 'm':
							distanceUnit = 'mi';
						break;
					}
					plus_subset['distanceUnit'] = distanceUnit;
				}
			}
			if(self.RUN_GRANULARITY != null){
				plus_subset['runDataGranularity'] = self.RUN_GRANULARITY;
			}
			self.setNikeplusDisplayOptions(plus_subset, function(data){
				nikeplus.user.reload(function(){
					nikeplus.userCookie.rebuild(function(){});
					if(typeof(window.tracking!="undefined")){
						tracking.click({pageName:track_site+'>profile>my_profile>my_settings>display>save'});
					}
					if(JQ.getURLParam('continue')){
						location.href = unescape(JQ.getURLParam('continue'));
					}
					/*
					var html = new Array();
					html.push('<div class="modal_confirm" id="update_settings_modal">');
					html.push('<div class="modal_container">');
					html.push('<p>'+_('updatesSaved')+'</p>');
					html.push('<div class="button_container" style="margin-bottom:10px;"><input type="button" value="'+_('closeWindow')+'" onclick="JQ.unblockUI()"/><span></span></div>');
					html.push('<div class="clear"></div>');
					html.push('</div>');
					html.push('</div>');
					JQ.unblockUI();
					self.confirmWindow(html.join(''));
					*/
					JQ.unblockUI();
					JQ('p.success').show();
				})
			});
		} else {
			if(!newUser){
				/*
				var html = new Array();
				html.push('<div class="modal_confirm" id="update_settings_modal">');
				html.push('<div class="modal_container">');
				html.push('<p>'+_('updatesSaved')+'</p>');
				html.push('<div class="button_container" style="margin-bottom:10px;"><input type="button" value="'+_('closeWindow')+'" onclick="JQ.unblockUI()"/><span></span></div>');
				html.push('<div class="clear"></div>');
				html.push('</div>');
				html.push('</div>');
				JQ.unblockUI();
				self.confirmWindow(html.join(''));
				*/
				JQ.unblockUI();
				JQ('p.success').show();
				if(typeof(window.tracking!="undefined")){
					tracking.trackClick({pageName:track_site+'>profile>my_profile>my_settings>display>save'});
				}
			}
		}
	};
	
	/**
	 * getNikeplusSettings
	 */
	self.getNikeplusSettings = function(callback){
		var params = {};
		params['url'] = self.nikeplus_GET_USER_DATA_URL;
		params['method'] = 'GET';
		self._f4aRequest(params, function(data){
			callback(data);
		});
	};

	self.setNikeplusDisplayOptions = function(data, callback){
		var xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
		xml += '<plusService><userOptions>';
		xml += '<screenName>' + NIKEOS.ME.getCookie().screenName + '</screenName>';
		for(i in data){
			xml += '<'+i+'>' + data[i] + '</'+i+'>';
		}
		xml += '</userOptions></plusService>';
		var params = {};
		params['url'] = self.nikeplus_SET_DISPLAY_OPTIONS_URL;
		params['method'] = 'POST';
		params['post_data'] = xml;
		params['contenttype'] = 'text/xml';
		self._f4aRequest(params, function(obj){
			callback(obj);
		});
	};

	self.setNikeplusNotificationOptions = function(data, callback){
		var xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
		xml += '<plusService><userOptions>';
		xml += '<screenName>' + NIKEOS.ME.getCookie().screenName + '</screenName>';
		for(i in data){
			xml += '<'+i+'>' + data[i] + '</'+i+'>';
		}
		xml += '</userOptions></plusService>';
		var params = {};
		params['url'] = self.nikeplus_SET_NOTIFICATION_OPTIONS_URL;
		params['method'] = 'POST';
		params['post_data'] = xml;
		params['contenttype'] = 'text/xml';
		self._f4aRequest(params, function(obj){
			callback(obj);
		});
	};

	self.setUpPrivacySettings = function(){
		if(NIKEOS.ME.getCookie().privacy_level){
			JQ('#sharing_' + NIKEOS.ME.getCookie().privacy_level.toLowerCase()).addClass('on');
		} else {
			self.getPrivacy(function(data){
				if(data){
					var data = self.xml2json(data);
					if(data.entry){
						for(var i=0; i<data.entry.length; i++){
							var section = data.entry[i]['com.sun.socialsite.pojos.SectionPrivacy'];
							if(section.sectionName == 'personal'){
								JQ('#sharing_' + section.visibility.toLowerCase()).addClass('on');
								NIKEOS.ME.addToCookie({'privacy_level':section.visibility});
							}
						}
					} else {
						//console.warn('error getting privacy');
					}
				} else {
					//console.warn('getPrivacy - no data');
				}
			});
		}
		
		JQ('.radio').click(function(){
			JQ('.radio').removeClass('on');
			JQ(this).addClass('on');
			try {
				supersleight.init();
			} catch (e) {}

		});
		
		JQ('#save_updates').click(function(){
			JQ.blockUI();
			JQ('p.success, p.error').hide();
			JQ('.radio').each(function(){
				if(JQ(this).hasClass('on')){
					var privacy_level = JQ(this).attr('id').split('_')[1];
					if(privacy_level == 'private' && (self.FB_CONNECTED == 'true' || self.TWITTER_CONNECTED == 'true')){
						self.confirmShutOffSharing();
					} else {
						self.updatePrivacy(privacy_level, function(){
							if(privacy_level == 'private'){
								self.shutOffSharing();
							}
							NIKEOS.ME.addToCookie({'privacy_level':privacy_level.toUpperCase()});
							JQ('#privacy_public').hide();
							JQ('#privacy_private').hide();
							JQ('#privacy_' + privacy_level).show();
							JQ.unblockUI();
							JQ('p.success').show();
							if(privacy_level == 'public'){
								if(JQ.getURLParam('broadcast')){
									self.broadcastDialog();
								}
							}
							if(typeof(window.nikeplus)!='undefined'){
								nikeplus.plus.syncProfileSettings(function(data){});
							}
							if(privacy_level != 'private'){ //do not track twice - already tracked in shutOffSharing()
								if(typeof(window.tracking!="undefined")){
									tracking.click({pageName:track_site+'>profile>my_profile>my_settings>privacy_settings>save'});
								}
							}
						});
					}
				}
			});
		});
	};

	self.confirmShutOffSharing = function(){
		var html = [];
		html.push('<div class="modal_confirm" id="broadcast_modal">');
		html.push('<div class="modal_container" id="broadcast_modal_inside">');
		html.push('<div class="close_x" onclick="JQ.unblockUI()"><img src="/nikeos/global/image/blank.gif" alt=""/></div>')
		html.push('<h3>'+_('shareActivity')+'</h3>');
		html.push('<p style="border-bottom:none;">'+_('thisWillStopSharing')+'</p>');
		html.push('<div class="button_container">');
		html.push('	<input type="button" value="'+_('ok')+'" onclick="javascript:ss.shutOffSharing();"/><span></span>');
		html.push('	<input type="button" value="'+_('cancel')+'" onclick="javascript:JQ.unblockUI();"/><span></span>');
		html.push('</div>');
		html.push('<div class="clear"></div>');
		html.push('</div>');
		html.push('</div>');
		self.confirmWindow(html.join(''));
		if(typeof(window.tracking!="undefined")){
			page_tracker_obj['prop19'] = "share_activity";
			s['prop19'] = "share_activity";
			s['g_prop19'] = "share_activity";
			tracking.click({pageName:track_site+'>profile>my_profile>my_settings>privacy_settings>disconnect_warning'});
		}
	}
	
	self.updatePrivacy = function(privacy_level, callback){
		self.postPrivacy(privacy_level.toUpperCase(),'socialsite.profile.displaysection.global','global',function(data){
			if(data == 'OK'){
				self.postPrivacy(privacy_level.toUpperCase(),'socialsite.profile.displaysection.personal','personal',function(data){
					if(data == 'OK'){
						callback();
					} else {
						JQ.unblockUI();
						JQ('p.error').show();
					}
				});
			} else {
				JQ.unblockUI();
				JQ('p.error').show();
				//alert('Error saving privacy');
			}
		});
	};

	self.getProfileInfo = function(id){
		if(typeof(NIKEOS.ME.getCookie().screenName)=='undefined' || typeof(NIKEOS.ME.getCookie().location)=='undefined'){
			self.getProfile(function(data){
				if(!data){
					NIKEOS.ME.clearSocialCookies();
					return false;
				}
				var data = self.xml2json(data);
				if(data.totalResults == "1"){
					var person = data.entry.person;
					var html = new Array();
					if(person.currentLocation){
						var location = '';
						var region = '';
						var cl = person.currentLocation;
						if(cl.country){ location += cl.country; }
						if(cl.locality){ region = cl.locality; }
						if(cl.region && region != ''){ region += ', ' + cl.region; }
						if(location == 'US'){ location = 'U.S.A.'; }
						JQ('#my_location').html(location);
						NIKEOS.ME.addToCookie({'location':location});
					} else {
						JQ('#my_location').hide();
						NIKEOS.ME.addToCookie({'location':''});
					}
					if(person.displayName){
						var screenName = person.displayName;
						JQ('#my_screenname, #my_profile_link span').html(screenName);
						JQ('#my_profile_link a').attr({'href':JQ('#my_profile_link a').attr('href') + self.DPSID});
						self.minifield('my_screenname', '#ffffff', 250, 36);
						NIKEOS.ME.addToCookie({'screenName':screenName});
					}
					JQ('#profile_info').show();
				} else {
					//console.warn('error getting profile info');
				}
				
			}, id);
		} else {
			if(NIKEOS.ME.getCookie().location == '' || !NIKEOS.ME.getCookie().location){
				JQ('#my_location').hide();
			} else {
				JQ('#my_location').html(NIKEOS.ME.getCookie().location);
			}
			JQ('#my_screenname, #my_profile_link span').html(NIKEOS.ME.getCookie().screenName);
			JQ('#my_profile_link a').attr({'href':JQ('#my_profile_link a').attr('href') + self.DPSID});
			self.minifield('my_screenname', '#ffffff', 250, 36);
			JQ('#profile_info').show();
		}
		if(typeof(NIKEOS.ME.getCookie().privacy_level)!='undefined'){
			JQ('#privacy_' + NIKEOS.ME.getCookie().privacy_level.toLowerCase()).show();
		} else {
			self.getPrivacy(function(data){
				if(data){
					var data = self.xml2json(data);
					if(data.entry){
						for(var i=0; i<data.entry.length; i++){
							var section = data.entry[i]['com.sun.socialsite.pojos.SectionPrivacy'];
							if(section.sectionName == 'global'){
								JQ('#privacy_' + section.visibility.toLowerCase()).show();
								NIKEOS.ME.addToCookie({'privacy_level':section.visibility});
							}
						}
					} else {
						//console.warn('error getting privacy');
					}
				} else {
					//console.warn('getPrivacy - no data');
				}
			});
		}
	};

	self.setUpPublicProfile = function(id){
		JQ('.li_friends a, .li_profile a').each(function(){
			JQ(this).attr({'href': (JQ(this).attr('href') + '&id='+id)});
		});
		var privacy = null;
		self.getPrivacy(function(data){
			if(self.TIMEOUT == false){
				if(data){
					var data = self.xml2json(data);
					if(data['org.apache.shindig.social.opensocial.service.ResponseItem']){
						self.IS_USER = false;
						ss.noUser();
					}
					if(data.entry){
						self.IS_USER = true;
						for(var i=0; i<data.entry.length; i++){
							var section = data.entry[i]['com.sun.socialsite.pojos.SectionPrivacy'];
							if(section.sectionName == 'global'){
								privacy = section.visibility.toLowerCase();
								switch(privacy){
									case null:
										//console.log('no privacy set');
										privateUser();
									break;
									case "public":
										publicUser();
									break;
									case "private":
										privateUser();
									break;
								}
							}
						}
					} else {
						//console.warn('error getting privacy');
					}
				} else {
					//console.warn('getPrivacy - no data');
				}
			}
		}, id);
		
		setTimeout("ss.noUser()", 4000);
						
		function publicUser(){
			self.getProfile(function(data){
				data = self.xml2json(data);
				if(data.totalResults == "1"){
					var person = data.entry.person;
					var html = new Array();
					
					if(person.imageUrl && person.imageUrl != ''){
						JQ('#default_image').css({'backgroundImage':'url('+person.imageUrl+')'});
					}
					
					if(person.currentLocation){
						var location = '';
						var region = '';
						var cl = person.currentLocation;
						if(cl.country){ location += cl.country; }
						if(cl.locality){ region = cl.locality; }
						if(cl.region && region != ''){ region += ', ' + cl.region; }
						if(location == 'US'){ location = 'U.S.A.'; }
						JQ('#my_location').html(location);
					} else {
						JQ('#my_location').hide();
					}
					
					if(person.displayName){
						var screenName = person.displayName;
						JQ('#my_screenname, #my_profile_link span').html(screenName);
						JQ('#my_profile_link a').attr({'href':JQ('#my_profile_link a').attr('href') + JQ.getURLParam("id")});
						self.minifield('my_screenname', '#ffffff', 250, 36);
					}
					if(self.DPSID != null){
						var isMe = (ss.DPSID == JQ.getURLParam('id'));
						var isFriend = (person.viewerRelationship['level'] >= person.viewerRelationship['friendshipLevel']);
						
						if(isMe){
							//TODO: HOW OTHERS SEE ME
						} else {
							if(isFriend){
								JQ('#remove_friend_button').show();
							} else {
								if (person.viewerRelationship['status'] == 'PENDING'){
									JQ('#pending_friend_button').show();
								} else {
									JQ('#add_friend_button').show();
								}
							}
						}
					}
					JQ('#default_image').show();
					JQ('#profile_info').show();
				} else {
					//console.warn('error getting profile info');
				}
			}, ownerId);

			self.getLocalizedActivities(id, self.displayLastActivity, null, 'feature', 0, 1);
			JQ('#header').removeClass('private').addClass('public');
			JQ('#gadgets_content, #friends_content').show();
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['prop19'] = "public";
				s['prop19'] = "public";
				s['g_prop19'] = "public";
				tracking.click({pageName: page_tracker_obj['pageName'], prop19: "public"});
			}
		}
		
		function privateUser(){
			self.getProfile(function(data){
				data = self.xml2json(data);
				if(data.totalResults == "1"){
					var person = data.entry.person;
					var html = new Array();
					
					JQ('#subnavigation').hide(); // hide the subnav
					
					if(person.imageUrl && person.imageUrl != ''){
						JQ('#default_image').css({'backgroundImage':'url('+person.imageUrl+')'});
					}
					
					if(person.currentLocation){
						var location = '';
						var region = '';
						var cl = person.currentLocation;
						if(cl.country){ location += cl.country; }
						if(cl.locality){ region = cl.locality; }
						if(cl.region && region != ''){ region += ', ' + cl.region; }
						if(location == 'US'){ location = 'U.S.A.'; }
						JQ('#my_location').html(location);
					} else {
						JQ('#my_location').hide();
					}
					
					if(person.displayName){
						var screenName = person.displayName;
						JQ('#my_screenname, #my_profile_link span').html(screenName);
						JQ('#my_profile_link a').attr({'href':JQ('#my_profile_link a').attr('href') + JQ.getURLParam("id")});
						self.minifield('my_screenname', '#ffffff', 250, 36);
					}
					JQ('#default_image').show();
					JQ('#profile_info').show();
				} else {
					//console.warn('error getting profile info');
				}
			}, ownerId);

			JQ('#last_activity_container').html('<div class="last_activity"><div class="icon"></div><div class="clear"></div><div class="body"><div class="text centered"><p>'+_('notSharingSorry')+'</p></div></div></div>');
			if(typeof(window.tracking!="undefined")){
				page_tracker_obj['pageName'] = track_site+'>profile>other_profile>private>view';
				page_tracker_obj['prop19'] = "private";
				s['prop19'] = "private";
				s['g_prop19'] = "private";
				tracking.click({pageName: page_tracker_obj['pageName']});
			}
		}
	};

	self.noUser = function(){
		self.TIMEOUT = true;
		if(self.IS_USER == false){
			JQ('#subnavigation').hide();
			var html = new Array();
			html.push('<div class="modal_confirm" id="broadcast_modal">');
			html.push('<div class="modal_container" id="broadcast_modal_inside">');
			html.push('<div class="close_x" onclick="JQ.unblockUI()"><img src="/nikeos/global/image/blank.gif" alt=""/></div>')
			html.push('<h3>'+_('incompleteProfile')+'</h3>');
			html.push('<p style="border-bottom:none;">'+_('noUser')+'</p>');
			html.push('<div class="button_container white" style="margin-left: 20px; margin-bottom: 10px; float: left;"><span></span><input type="button" class="padded" style="padding-bottom: 2px" value="'+_('goToNikePlus')+'" onclick="javascript:nikeplus.urls.goTo(\'dashboard\')"/></div><div class="button_container white" style="margin-bottom:10px; margin-right: 20px;"></div>');
			html.push('<div class="clear"></div>');
			html.push('</div>');
			html.push('</div>');
			self.confirmWindow(html.join(''));
			self.IS_USER = true;
		}
	}

	/**
	 * publicAddFriend
	 * adds as a friend the user whose public page we are on
	 */
	self.confirmPublicAddFriend = function(){
		var html = new Array();
		html.push('<div class="modal_friend modal_confirm">');
		html.push('<div class="modal_friend_container">');
		html.push('<p>'+_('addFriendAreYouSure')+'</p>');
		html.push('<div class="button_container white" style="margin-left: 20px; float: left;"><span></span><input type="button" class="padded" value="'+_('yes')+'" onclick="ss.publicAddFriend()"/></div><div class="button_container white" style="margin-bottom:10px; margin-right: 20px;"><span></span><input type="button" class="padded" value="'+_('no')+'" onclick="JQ.unblockUI();"/></div>');
		html.push('<div class="clear"></div>');
		html.push('</div>');
		html.push('</div>');
		self.confirmWindow(html.join(''));
	}

	self.publicAddFriend = function(){
		var personId = JQ.getURLParam("id");
		self.requestRelationship(ss.DPSID, personId, function(data){
			JQ('#add_friend_button').hide();
			JQ('#pending_friend_button').show();
			JQ.unblockUI();
			if(typeof(window.tracking!="undefined")){
				tracking.click({pageName:page_tracker_obj['pageName']+'>add_friend'});
			}
		});
	}

	/**
	 * publicRemoveFriend
	 * adds as a friend the user whose public page we are on
	 */
	self.confirmPublicRemoveFriend = function(){
		var html = new Array();
		html.push('<div class="modal_friend modal_confirm">');
		html.push('<div class="modal_friend_container">');
		html.push('<p>'+_('removeFriendAreYouSure')+'</p>');
		html.push('<div class="button_container white" style="margin-left: 20px; float: left;"><span></span><input type="button" class="padded" value="'+_('yes')+'" onclick="ss.publicRemoveFriend()"/></div><div class="button_container white" style="margin-bottom:10px; margin-right: 20px;"><span></span><input type="button" class="padded" value="'+_('no')+'" onclick="JQ.unblockUI();"/></div>');
		html.push('<div class="clear"></div>');
		html.push('</div>');
		html.push('</div>');
		self.confirmWindow(html.join(''));
	}

	self.publicRemoveFriend = function(){
		JQ.unblockUI();
		JQ.blockUI();
		var personId = JQ.getURLParam("id");
		self.deleteFriend(ss.DPSID, personId, function(data){
			JQ('#remove_friend_button').hide();
			JQ('#add_friend_button').show();
			if(typeof(window.tracking!="undefined")){
				tracking.click({pageName:page_tracker_obj['pageName']+'>remove_friend'});
			}
			JQ.unblockUI();
		});
	}

	self.confirmRemoveFriend = function(id,link){
		var html = new Array();
		html.push('<div class="modal_friend modal_confirm">');
		html.push('<div class="modal_friend_container">');
		html.push('<p>'+_('removeFriendAreYouSure')+'</p>');
		html.push('<div class="button_container white" style="margin-left: 20px; float: left;"><span></span><input type="button" class="padded" value="'+_('yes')+'" onclick="ss.removeFriend(\''+id+'\')"/></div><div class="button_container white" style="margin-bottom:10px; margin-right: 20px;"><span></span><input type="button" class="padded" value="'+_('no')+'" onclick="JQ.unblockUI();"/></div>');
		html.push('<div class="clear"></div>');
		html.push('</div>');
		html.push('</div>');
		self.confirmWindow(html.join(''));
	}

	self.removeFriend = function(id){
		JQ.unblockUI();
		JQ.blockUI();
		self.deleteFriend(ss.DPSID, id, function(data){
			//JQ('.friend#friend_' + id).addClass('removed');
			JQ('.friend#friend_' + id).slideUp();
			if(typeof(window.tracking!="undefined")){
				tracking.trackClick({pageName:track_site+'>profile>my_profile>my_friends>remove_friend'});
			}
			JQ.unblockUI();
		});
	}

	self.getEmailNotificationSettings = function(){
		self.getEmailSettings(function(data){
			data = self.xml2json(data);
			if(!data.entry[0]){
				data.entry = new Array(data.entry);
			}
			for(var i = 0;i<data.entry.length;i++){
				var $checkbox = JQ('#setting_'+data.entry[i].key);
				if(data.entry[i].value == 'false'){
					$checkbox.removeClass('on');
				} else {
					$checkbox.addClass('on');
				}
			}
		});
		if(window.nikeplus){
			self.getNikeplusSettings(function(data){
				data = self.xml2json(data);
				if(data.status == 'failure'){
					//console.warn('Not a nikeplus user');
				} else {
					var plus_notification_settings = ['emailGoalEnding','emailGoalComplete','emailWeeklyTraining','emailChallengeEnding','emailChallengeStarting','emailChallengeWinner'];
					for(var i in data.userOptions){
						var $checkbox = null;
						if(JQ.inArray(i,plus_notification_settings) != -1){
							if(data.userOptions[i] == 'true'){
								JQ('#setting_' + i).addClass('on');
							}
						}
					}
					JQ('#plus_settings').show();
				}
			});
		}
	};

	self.setEmailNotificationSettings = function(){
		var ss_settings_obj = {};
		var plus_settings_obj = {};
		var socialsite_notification_settings = ['notifications_emailrelationshiprequest','notifications_emailnewfriendship','notifications_emailgroupinvite','notifications_emailgroupdisbanded','notifications_emailgroupcreation','notifications_emailgrouprejected'];
		var plus_notification_settings = ['emailGoalEnding','emailGoalComplete','emailWeeklyTraining','emailChallengeEnding','emailChallengeStarting','emailChallengeWinner'];
		JQ('.setting').each(function(){
			var isOn = JQ(this).hasClass('on');
			var setting = JQ(this).attr('id').split('setting_')[1];
			if(JQ.inArray(setting,socialsite_notification_settings) != -1){
				if (isOn){
					ss_settings_obj[setting] = 'true';
				} else {
					ss_settings_obj[setting] = 'false';
				}
			}
			if(JQ.inArray(setting,plus_notification_settings) != -1){
				if (isOn){
					plus_settings_obj[setting] = 'true';
					if(setting == 'emailChallengeStarting'){
						plus_settings_obj['emailChallengeEnding'] = 'true';
					}
				} else {
					plus_settings_obj[setting] = 'false';
					if(setting == 'emailChallengeStarting'){
						plus_settings_obj['emailChallengeEnding'] = 'false';
					}
				}
			}
		});
		JQ('p.success, p.error').hide();
		JQ.blockUI();

		if(!self.isEmpty(ss_settings_obj)){
			self.postEmailSettings(ss_settings_obj,function(data){
				if(data != 'OK'){
					JQ('p.error').show();
					//console.warn('postEmailSettings error');
				} else {
					//JQform.find('p.error, .loading').hide();
					JQ.unblockUI();
					JQ('p.success').show();
					if(typeof(window.tracking!="undefined")){
						tracking.click({pageName:track_site+'>profile>my_profile>my_settings>notifications>save'});
					}
				}
			});
		}

		if(!self.isEmpty(plus_settings_obj)){
			self.setNikeplusNotificationOptions(plus_settings_obj,function(data){
				nikeplus.userCookie.rebuild(function(){});
			});
		}
	};

	self.getGoogleContacts = function(oauth_token,oauth_token_secret){
		self._getSecurityToken(function(){
			var html = new Array();
			html.push('<div class="modal_confirm" id="contact_import_container">');
			html.push('<div id="import_top">');
			html.push('<div id="import_bottom">');
			html.push('<div id="import_middle">');
			html.push('<div class="modal_container">');
			html.push('</div>');
			html.push('</div>');
			html.push('</div>');
			html.push('</div>');
			self.confirmWindow(html.join(''), { top: '87px' });			
			var $modal = JQ('#contact_import_container .modal_container');
			$modal.html('<h3>'+_('loading')+'</h3>');
			self.GOOGLE_WINDOW.close();
			var params = {};
			params['url'] = self.ss_GET_GOOGLE_CONTACTS_URL + '?oauth_token='+oauth_token+'&oauth_token_secret='+oauth_token_secret+'&st='+self.ST;
			params['method'] = 'GET';
			self._f4aRequest(params, function(data){
				var has_google_contacts = false;
				//TODO: error checking
				var json = eval('(' + data + ')');
				if(typeof(json) == 'undefined'){
					//console.warn('Invalid Response from Google...');
					var html = new Array();
					html.push('<div class="modal_confirm" id="invitation_confirmation">');
					html.push('<div class="modal_container">');
					html.push('<p>'+_('problemImportingContacts')+'</p>');
					html.push('<div class="button_container" style="margin-bottom:10px;"><input type="button" value="'+_('closeWindow')+'" onclick="JQ.unblockUI()"/><span></span></div>');
					html.push('<div class="clear"></div>');
					html.push('</div>');
					html.push('</div>');
					JQ.unblockUI();
					self.confirmWindow(html.join(''));
					return;
				}
				self.IMPORTED_CONTACTS = json;
				JQ('#contact_import_container').attr({'id':'imported_contacts_list'});
				var html = new Array();
				html.push('<div id="import_contacts_header">');
				html.push('	<h2>' + _('importContacts') + '</h2>');
				html.push('	<a class="close" onclick="JQ.unblockUI();"></a>');
				html.push('</div>');
				html.push('<div id="scrolling_contact_container">');
				if(!self.isEmpty(json.nikeUsers)){
					self.NIKE_USERS = json.nikeUsers;
					has_google_contacts = true;
					var list = new Array();
					var counter = 0;
					var stripe = "even";
					for(var i in json.nikeUsers){
						counter++;
						if(counter%2){ stripe = ""; } else { stripe = "even"; }
						list.push('<li class="' + stripe + '" id="nikeUser_' + json.nikeUsers[i].id + '" rel="' + json.nikeUsers[i].displayName + '">');
						var image = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image.gif';
						if(json.nikeUsers[i].imageUrl){
							var image = json.nikeUsers[i].imageUrl;
						}
						if(image.match('none_LRG.jpg')){
							image = '/nikeos/site/profile_v1.0b/global/images/profile_image/default_image.gif';
						}
						list.push('	<img class="contact_image" src="' + image + '"/>');
						list.push('	<div class="contact_info">');
						list.push('		<h4><a href="' + json.nikeUsers[i].profileUrl + '" target="_blank">' + json.nikeUsers[i].displayName + '</a></h4>');
						if(typeof(json.nikeUsers[i]['status']) != 'undefined'){
							var status = json.nikeUsers[i]['status'].replace(/\+/g,' ');
							status = unescape(status);
							status = self.unescapeHTML(status);
							list.push('		<p>' + status + '</p>');
						}
						list.push('	</div>');
						list.push('	<div class="clear"></div>');
						list.push('</li>');
					}
					html.push('<div id="contacts_nikes">');
					html.push('	<h3>' + counter + ' ' +_('gmailFriendsOnNike')+'</h3>');
					html.push('	<div class="checkbox">');
					html.push('		<ul>');
					html.push(			list.join(''));
					html.push('		</ul>');
					html.push('	</div>');
					html.push('</div>');
					html.push('<div class="clear"></div>');
				}
				if(!self.isEmpty(json.others)){
					has_google_contacts = true;
					var list = new Array();
					var counter = 0;
					var stripe = "even";
					for(var i in json.others){
						counter++;
						if(counter%2){ stripe = ""; } else { stripe = "even"; }
						list.push('<li class="' + stripe + '" rel="' + i + '">' + i + '</li>');
					}
					html.push('<div id="contacts_others">');
					html.push('	<h3>' + counter + ' ' +_('contactsAreNotNikeMembers')+ '</h3>');
					html.push('	<div class="checkbox">');
					html.push('		<ul>');
					html.push(			list.join(''));
					html.push('		</ul>');
					html.push('	</div>');
					html.push('</div>');
					html.push('<div class="clear"></div>');
				}
				if(!has_google_contacts){
					html.push('<p>'+_('noContacts')+'</p>');
				}
				html.push('</div>');
				html.push('<div id="import_contacts_footer">');
				html.push('	<div class="button_container">');
				html.push('		<input id="import_contacts_select_all" class="padded_button" type="button" onclick="ss.selectAllContacts()" value="'+_('selectAll')+'"><span>&nbsp;</span>');
				html.push('		<input id="import_contacts_deselect_all" class="padded_button" type="button" onclick="ss.deSelectAllContacts()" value="'+_('deselectAll')+'"><span>&nbsp;</span>');
				html.push('		<span class="right">&nbsp;</span><input id="import_contacts_add" class="padded_button right" type="button" onclick="ss.addSelectedContacts()" value="'+_('addSelected')+'">');
				html.push('	</div>');
				html.push('	<div class="clear"></div>');
				html.push('</div>');
				$modal.html(html.join(''));
				self.setUpCheckboxes();
			});
		});
	};

	self.selectAllContacts = function(){
		JQ('#scrolling_contact_container .checkbox li').addClass('on');
	};
	
	self.deSelectAllContacts = function(){
		JQ('#scrolling_contact_container .checkbox li').removeClass('on');
	};
	
	self.addSelectedContacts = function(){
		var $others = JQ('#contacts_others .checkbox li.on');
		var $nikes = JQ('#contacts_nikes .checkbox li.on');
		var email_array = new Array();
		if($others.length > 0){
			$others.each(function(){
				email_array.push(JQ(this).attr('rel'));
			});
		}
		if($nikes.length > 0){
			self.EMAIL_REFERENCE = {};
			$nikes.each(function(){
				email_array.push(JQ(this).attr('rel'));
				self.EMAIL_REFERENCE[JQ(this).attr('rel')] = JQ(this).attr('id').split('_')[1];
			});
		}
		if(JQ('#to').val() == _('typeEmailAddresses')){
			JQ('#to').val('');
		}
		var previous_emails = JQ('textarea#to').val();
		if(previous_emails.length > 0){
			previous_emails = previous_emails.rtrim();
			if(previous_emails.charAt(previous_emails.length-1) != ','){
				previous_emails += ', ';
			} else {
				previous_emails += ' ';
			}
		}
		var emails = previous_emails + email_array.join(', ');
		JQ('textarea#to').val(emails);
		JQ.unblockUI();
		if(typeof(window.tracking!="undefined")){
			tracking.click({pageName:track_site+'>profile>my_profile>my_friends>invite>import>success'});
		}
	};
		
	self.googleImport = function(){
		var url = self.ss_GOOGLE_IMPORT_JSP + '?hl=' + UPM.lang;
		self.GOOGLE_WINDOW = window.open(url, 'google_import',"width=600,height=400,scrollbars=1");
		if(typeof(window.tracking!="undefined")){
			tracking.click({pageName:track_site+'>profile>my_profile>my_friends>invite>import'});
		}
	};
	
	self.xml2json = function(string){
		string = string.replace(/&amp;/g,'&');
		string = string.replace(/&/g,'&amp;');
		return(JQ.xml2json(string));
	};

	self.unescapeHTML = function(s){
	if (s == null) return null;
	return s.replace(
		/&(amp|gt|#62|lt|#60|quot|#34|apos|#39);/g,
		function(key, val){
			var map = {
				"amp": "&",
				"#62": ">",
				"gt": ">",
				"lt": "<",
				"#60": "<",
				"quot": '"',
				"#34": '"',
				"apos": '\'',
				"#39": '\''
			};
			return map[val];
		});
	};

	self.isEmpty = function(object){
		if(typeof(object) == 'undefined'){
			return false;
		}
		for(var i in object){
			return false;
		} return true;
	};

	self.confirmWindow = function(html, optionalCss){
		var css = optionalCss || {};
		JQ.blockUI({ message: html, 'css': css });
	};

	// SIFR header replacement
	self.minifield = function(id,color,width,height,bold) {
		var font = 'Victory-Neue Light';
		if(bold){
			font = 'Victory-Neue Bold';
		}
		placeText(id, 'nada', width, height, font, height, color, null, 'left', 'center', null, null, true, null, '/nikeos/global/swf/fonts/fontlibrary.swf');
	};
	
	self.insertSWF = function(swf,hash,div){
		var swf= new SWFObject(swf.path, "feature", swf.width, swf.height, "9.0.28", "#ffffff");
		swf.addParam("scale", "noscale");
		swf.addParam("allowScriptAccess", "always");
		swf.addParam("allowFullScreen", "true");
		swf.addParam("wmode", "transparent");
		swf.addVariable('country',site_data.settings.country);
		swf.addVariable('region',site_data.settings.platypus_region);
		swf.addVariable('language',site_data.settings.platypus_lang_locale.split('_')[0]);
		if(window.nikeplus){
			swf.addVariable('cookieData',escape(nikeplus.xml.obj2json(nikeplus.userCookie.getCookie())));
		}
		for(var p in hash){
			if(!nikeplus.undef(hash[p]))
				swf.addVariable(p,hash[p]);
		}
		var write=swf.write(	div.attr("id")	);
	};

	/**
	 * date_utils
	 * @method getLocalizedTime
	 * @param {int/string} ms : milliseconds since unix's b-day
	 * Currently displays full time only ( 3/27/2009 12:12 PM )
	 */
	self.date_utils = {
		'getLocalizedTime' : function(ms){
			if (typeof(ms) == 'string'){
				ms = parseInt(ms,10);
			}
			var now = new Date();
			var then = new Date(ms);
			var month = then.getMonth() + 1;
			var day = then.getDate();
			var year = then.getFullYear() + '';
			year = year.substr(year.length-2);
			var hours = then.getHours();
			var minutes = then.getMinutes() + '';
			var suffix = 'AM';
			if(hours > 11){
				suffix = 'PM';
				if (hours > 12){
					hours = hours - 12;
				}
			}
			switch(self.DATE_FORMAT){
				case 'm':
					return padInt(month) + '/' + padInt(day) + '/' + year + ' | ' + hours + ':' + padInt(minutes) + ' ' + suffix;
				break;
				case 'd':
					return padInt(day) + '/' + padInt(month) + '/' + year + ' | ' + hours + ':' + padInt(minutes) + ' ' + suffix;
				break;
				case 'y':
					return year + '/' + padInt(month) + '/' + padInt(day) + ' | ' + hours + ':' + padInt(minutes) + ' ' + suffix;
				break;
				default:
					return padInt(month) + '/' + padInt(day) + '/' + year + ' | ' + hours + ':' + padInt(minutes) + ' ' + suffix;
				break;
			}
			function padInt(integer){
				if(integer < 10){
					return ("0" + integer);
				} return integer;
			}
		}
	};
	
	self.randomInt = function(){
		return parseInt(Math.floor(Math.random()*10000000));
	};
	
	self.showLoadingDiv = function(div){
		JQ('#'+div).html('<div class="loading_activities"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="32" HEIGHT="32" id="loader_swf"><param name="wmode" value="transparent"><PARAM NAME="movie" VALUE="/nikeos/global/image/nikeOS_loader.swf"><PARAM NAME="quality" VALUE="best"><embed width="32" height="32"  salign="tl" allowscriptaccess="always" wmode="transparent" menu="false" scale="noscale" quality="best" name="loader_swf" id="loader_swf" style="width: 32px; height: 32px;" src="/nikeos/global/image/nikeOS_loader.swf" type="application/x-shockwave-flash"/></object></div>');
	}
	
	self.URLEncodeString = function(str){
		return escape(str).replace(/\+/g, "%2B");
	}

};

if (typeof(window.JQ) == 'undefined') { var JQ = jQuery.noConflict(); }
if (typeof(window.Base64 == 'undefined')){ var Base64 = {_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(input){var output="";var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i=0;input=Base64._utf8_encode(input);while(i<input.length){chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;enc2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}output=output+this._keyStr.charAt(enc1)+this._keyStr.charAt(enc2)+this._keyStr.charAt(enc3)+this._keyStr.charAt(enc4);}return output;},decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i<input.length){enc1=this._keyStr.indexOf(input.charAt(i++));enc2=this._keyStr.indexOf(input.charAt(i++));enc3=this._keyStr.indexOf(input.charAt(i++));enc4=this._keyStr.indexOf(input.charAt(i++));chr1=(enc1<<2)|(enc2>>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);}if(enc4!=64){output=output+String.fromCharCode(chr3);}}output=Base64._utf8_decode(output);return output;},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c);}else if((c>127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128);}else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128);}}return utftext;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){string+=String.fromCharCode(c);i++;}else if((c>191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;}else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}}return string;}};}


function Gadget_Controller() {
	var self = this;
	this.init = function(){
	};
	this.toggle = function(link){
		var iframe_container = JQ(link).parents('.gadget_container_middle').find('.gadget_iframe_container');
		if (!JQ(iframe_container).css('display') || JQ(iframe_container).css('display') == 'none'){
			JQ(link).html('hide');
			JQ(iframe_container).slideDown();
		} else { 
			JQ(iframe_container).slideUp(); 
			JQ(link).html('show');
		}
		return false;
	};
	self.init();
}
var GC = new Gadget_Controller();

/*
 * Script from NETTUTS.com [by James Padolsey]
 * @requires jQuery($), jQuery UI & sortable/draggable UI modules
 */

var iNettuts = {
    
    jQuery : JQ,
    
    settings : {
        columns : '.column',
        widgetSelector: '.gadget_container_top',
        handleSelector: '.gadget_header',
        contentSelector: '.gadget_iframe_container',
        widgetDefault : {
            movable: true,
            removable: false,
            collapsible: false,
            editable: false,
            colorClasses : ['color-yellow', 'color-red', 'color-blue', 'color-white', 'color-orange', 'color-green']
        },
        widgetIndividual : {
            intro : {
                movable: false,
                removable: false,
                collapsible: false,
                editable: false
            }
        }
    },

    init : function () {
        //this.attachStylesheet('inettuts.js.css');
        this.addWidgetControls();
        this.makeSortable();
    },
    
    getWidgetSettings : function (id) {
        var $ = this.jQuery,
            settings = this.settings;
        return (id&&settings.widgetIndividual[id]) ? $.extend({},settings.widgetDefault,settings.widgetIndividual[id]) : settings.widgetDefault;
    },
    
    addWidgetControls : function () {
        var iNettuts = this,
            $ = this.jQuery,
            settings = this.settings;
            
        $(settings.widgetSelector, $(settings.columns)).each(function () {
            var thisWidgetSettings = iNettuts.getWidgetSettings(this.id);
            if (thisWidgetSettings.removable) {
                $('<a href="javascript:void(0);" class="remove">CLOSE</a>').mousedown(function (e) {
                    e.stopPropagation();    
                }).click(function () {
                    if(confirm('This widget will be removed, ok?')) {
                        $(this).parents(settings.widgetSelector).animate({
                            opacity: 0    
                        },function () {
                            $(this).wrap('<div/>').parent().slideUp(function () {
                                $(this).remove();
                            });
                        });
                    }
                    return false;
                }).appendTo($(settings.handleSelector, this));
            }
            
            if (thisWidgetSettings.editable) {
                $('<a href="javascript:void(0);" class="edit">EDIT</a>').mousedown(function (e) {
                    e.stopPropagation();    
                }).toggle(function () {
                    $(this).css({backgroundPosition: '-66px 0', width: '55px'})
                        .parents(settings.widgetSelector)
                            .find('.edit-box').show().find('input').focus();
                    return false;
                },function () {
                    $(this).css({backgroundPosition: '', width: ''})
                        .parents(settings.widgetSelector)
                            .find('.edit-box').hide();
                    return false;
                }).appendTo($(settings.handleSelector,this));
                $('<div class="edit-box" style="display:none;"/>')
                    .append('<ul><li class="item"><label>Change the title?</label><input value="' + $('h3',this).text() + '"/></li>')
                    .append((function(){
                        var colorList = '<li class="item"><label>Available colors:</label><ul class="colors">';
                        $(thisWidgetSettings.colorClasses).each(function () {
                            colorList += '<li class="' + this + '"/>';
                        });
                        return colorList + '</ul>';
                    })())
                    .append('</ul>')
                    .insertAfter($(settings.handleSelector,this));
            }
            
            if (thisWidgetSettings.collapsible) {
                $('<a href="javascript:void(0);" class="collapse">COLLAPSE</a>').mousedown(function (e) {
                    e.stopPropagation();    
                }).toggle(function () {
                    $(this).css({backgroundPosition: '-38px 0'})
                        .parents(settings.widgetSelector)
                            .find(settings.contentSelector).hide();
                    return false;
                },function () {
                    $(this).css({backgroundPosition: ''})
                        .parents(settings.widgetSelector)
                            .find(settings.contentSelector).show();
                    return false;
                }).prependTo($(settings.handleSelector,this));
            }
        });
        
        $('.edit-box').each(function () {
            $('input',this).keyup(function () {
                $(this).parents(settings.widgetSelector).find('h3').text( $(this).val().length>20 ? $(this).val().substr(0,20)+'...' : $(this).val() );
            });
            $('ul.colors li',this).click(function () {
                
                var colorStylePattern = /\bcolor-[\w]{1,}\b/,
                    thisWidgetColorClass = $(this).parents(settings.widgetSelector).attr('class').match(colorStylePattern);
                if (thisWidgetColorClass) {
                    $(this).parents(settings.widgetSelector)
                        .removeClass(thisWidgetColorClass[0])
                        .addClass($(this).attr('class').match(colorStylePattern)[0]);
                }
                return false;
                
            });
        });
        
    },
    
    attachStylesheet : function (href) {
        var $ = this.jQuery;
        return $('<link href="' + href + '" rel="stylesheet" type="text/css" />').appendTo('head');
    },
    
    makeSortable : function () {
        var iNettuts = this,
            $ = this.jQuery,
            settings = this.settings,
            $sortableItems = (function () {
                var notSortable = '';
                $(settings.widgetSelector,$(settings.columns)).each(function (i) {
                    if (!iNettuts.getWidgetSettings(this.id).movable) {
                        if(!this.id) {
                            this.id = 'widget-no-id-' + i;
                        }
                        notSortable += '#' + this.id + ',';
                    }
                });
                return $('> li:not(' + notSortable + ')', settings.columns);
            })();
        
        $sortableItems.find(settings.handleSelector).css({
            cursor: 'move'
        }).mousedown(function (e) {
            $sortableItems.css({width:''});
            $(this).parent().css({
                width: $(this).parent().width() + 'px'
            });
        }).mouseup(function () {
            if(!$(this).parent().hasClass('dragging')) {
                $(this).parent().css({width:''});
            } else {
                $(settings.columns).sortable('disable');
            }
        });

        $(settings.columns).sortable({
            items: $sortableItems,
            connectWith: $(settings.columns),
            handle: settings.handleSelector,
            placeholder: 'widget-placeholder',
            forcePlaceholderSize: true,
            revert: 300,
            delay: 100,
            opacity: 0.8,
            containment: '#guts',
            start: function (e,ui) {
                $(ui.helper).addClass('dragging');
            },
            stop: function (e,ui) {
                $(ui.item).css({width:''}).removeClass('dragging');
                $(settings.columns).sortable('enable');
            }
        });
    }
  
};

/* FIREBUG X */
/* Disable console calls when it isn't available */
if (!("console" in window) || !("firebug" in console)){
	var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
	window.console = {};
	for (var i = 0; i < names.length; ++i){
		window.console[names[i]] = function(){};
	}
}     
