CCI.Pluck["Messages"] = {
	Persona: {
		EditPersona: "Change photo / Edit profile",
		AddCompany: "Add a company profile"
	},
	Contacts: {
		TechnicalContactEmail: "webmaster@crainsdetroit.com",
		TechnicalContactName: "Alan Baker"
	},
	
	Errors: {
		SOSE: {
			MessageFromPluckNotOK: "Sorry, there is a temporary problem displaying this content. Please check back later.",
			NeedToReload: "Sorry, there is a temporary problem displaying this page."
		}
	},
	Forms: {
		MembersOnlyFormInput: {
			"Anonymous": "Please <a href='"+CCI.Pluck.Urls.LoginUrl+"'>log in or register</a> to contribute.",
			"NonMember": "Please <a href='#' onclick='CCI.Pluck.Users.CommunityRequests({action:\"join\"});'>join this community</a> to participate.",
			"Pending": "You may contribute when your request to join this community is approved."
		}
	},
	HandleErrors: function() {
			
			var noResponseDivs = $(".slError-SOSE");
			for (i=0;i<noResponseDivs.length;i++) {
				if (noResponseDivs[i].innerHTML.length == 0) {
					noResponseDivs[i].innerHTML = "<p>"+CCI.Pluck.Messages.Errors.SOSE.MessageFromPluckNotOK+"</p>";
					noResponseDivs[i].style.display = "block";
					}
			}
			var soseTerm = $("pre");
//			console.dir(soseTerm);
			for (p=0;p<soseTerm.length;p++) {
				// if SOSE stops for any request, show a global error message on the page
				if (soseTerm[p].innerHTML.indexOf("Error on line") > -1) {
				var emailUsLink = document.createElement("a");
				emailUsLink.innerHTML = "send us an e-mail";
				emailUsLink.onclick = function() {
					email();
					}
				document.getElementById("main-content").innerHTML = "<h1>"+CCI.Pluck.Messages.Errors.SOSE.NeedToReload+"</h1><ul><li><a href='"+location.href+"&userReload=1'>Try refreshing this page</a> or coming back a little later.</li><li>If the problem persists, please make sure to <a href='#' onclick='CCI.Pluck.Messages.ContactEmail({to:CCI.Pluck.Messages.Contacts.TechnicalContactEmail})'>send us an e-mail</a>.</li><li>Thank you for your patience</li></ul>";
				break;
				}
			}
				
	},
	ContactEmail: function(bag) {
			bag = bag || {};
			  var to = bag.to || "webmaster@crainsdetroit.com";
			  var subject = bag.subject || "Crain's Detroit Business communities";
			  var body = bag.body || "";
			  var email = "mailto:" + to + "&subject=" + escape(subject) + "&body=" + escape(body); 
			  window.location = email;
			}			
};



CCI.Pluck["LoadScripts"] = function() {
		if (CCI.Pluck.Globals.Enabled) {
			var urls = CCI.Pluck.Urls;
			// for old widgets:
 			document.write("<scr" + "ipt type=\"text/javascript\" src=\"" + urls.SiteLifeProxyUrl + "\"></sc" + "ript>\n");
 			 			// for DAAPI:
 			document.write("<scr" + "ipt type=\"text/javascript\" src=\"" + urls.DirectProxyUrl + "\"></sc" + "ript>\n");
 			// for apps (pluck 4)
 			document.write("<scr" + "ipt type=\"text/javascript\" src=\"" + urls.PluckAppsUrl + "\"></sc" + "ript>\n");
 		}
 	};

CCI.Pluck.LoadScripts();

CCI.Pluck.College.MyCourses = [];
	
CCI.Pluck.College.getPosts = function(bag) {
		var blogKeyEl = bag.blogKeyEl || 0;
		if (blogKeyEl) {
			var html = "";
			var blogKey = blogKeyEl.id || 0;
			
			if (blogKey) {
//			console.log("blogKey: " + blogKey);
			var blogCb = function(r) {
				// console.dir(r);
				if (r.Responses[0].BlogPostPage) {
					var blog = r.Responses[0].BlogPostPage;
					if (blog.NumberOfBlogPosts > 0) {
						html += '<a href="/section/college01?plckBlogId=' + blog.BlogKey.Key + '&plckBlogPage=BlogViewPost&plckPostId='+blog.BlogPosts[0].BlogPostKey.Key+'">' + blog.BlogPosts[0].PostTitle + "</a><br /><small>(" + blog.BlogPosts[0].PostDate + ")</small>";
						}
					else {
						html += "No blog posts yet";
					}
			} else {
				html += "Problem finding blog";
				}
			blogKeyEl.innerHTML = html;
			}
			
			var rb = new RequestBatch();
			var blog = new BlogPostPage(new BlogKey(blogKey), 1, 1, "TimeStampDescending");
			rb.AddToRequest(blog);
			rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, blogCb);
			}
		}
	};

CCI.Pluck.College.getMyCourses = function(bag) {
    bag = bag || {};
    var callback = bag.callback || 0;
    var onPage = bag.onPage || 1;
    
    var getCourses = function(bag2) {
	    bag2 = bag2 || {};
	    onPage = bag2.onPage || 1;

    var userCallback = function(r) {
    var user = r.Responses[0].User || 0;
    if (user) {
	    CCI.Pluck.Users.CurrentUser = user;
        var rb = new RequestBatch();

        rb.AddToRequest(new CommunityGroupMembershipPage(new UserKey(user.UserKey.Key), 5, onPage));
        rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, groupsCallback);
    	}
	};
	
	var groupsCallback = function(r) {
  	//  console.dir(r);
    var page = r.Responses[0].CommunityGroupMembershipPage || 0;
    var getNext = 0;
    if (page) {
        for (i=0;i<page.CommunityGroupMemberships.length;i++) {
            var group  = page.CommunityGroupMemberships[i];
            if (group.CommunityGroup.Section == "collegeclassroom" && group.MembershipTier != "NonMember") {
                CCI.Pluck.College.MyCourses.push(page.CommunityGroupMemberships[i]);
            }
        }
        var total = page.NumberOfCommunityGroupMemberships;
        var onPage = Math.abs(page.OnPage);
        var numberPerPage = page.NumberPerPage;
        var numberOfPages = Math.ceil(total / numberPerPage);
        if (onPage < numberOfPages) {
            getNext = onPage + 1;
        }
    }
	//    console.log("Get Page: " + getNext);
    if (getNext) {
        getCourses({onPage:getNext});
    } else {
	    if (callback) {
		    callback();
	    }
    }
};

    var rb = new RequestBatch();
    rb.AddToRequest(new UserKey());
 	rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, userCallback);
	};
	getCourses();
	};
	
CCI.Pluck.College.formatCourses = function() {
		if (CCI.Pluck.College.MyCourses) {
			var userEl = document.getElementById("cci-college-user") || 0;
			var insertEl = document.getElementById("cci-college-groups") || 0;
			var imageEl = document.getElementById("cci-college-groups-image") || 0;
			var newsEl = document.getElementById("cci-college-main-newslist") || 0;
			var newslistUrl = "/section/college?template=litenewslist";
						
			var userHtml = "";
			var html = "";
			var imageHtml = "";
			var newsHtml = "";
			
			if (newsEl) {
				if (CCI.Pluck.College.MyCourses[0]) {
					var collegeCode = CCI.Pluck.College.MyCourses[0].CommunityGroup.CommunityGroupKey.Key.replace(/^([^_]+)_(.*)$/,"$1");
					}
					else {
						var collegeCode = "defaultProfile";
					}
					var newslistProfile = CCI.Pluck.College.NewslistProfiles[collegeCode] || CCI.Pluck.College.NewslistProfiles["defaultProfile"];
					if (newslistProfile) {
						newslistUrl += "&profile=" + newslistProfile;
					}
				
				$.get(newslistUrl, function(data){
  					$(newsEl).html(data);
				});
			};
			
			if (imageEl && CCI.Pluck.College.MyCourses[0]) {
				imageHtml += '<img src="' + CCI.Pluck.Urls.GlobalSiteUrl+ '/apps/pbcsi.dll/urlget?url=' + CCI.Pluck.College.MyCourses[0].CommunityGroup.AvatarImageUrl.replace(/\.Small\./,".Large.")+'&maxw=65" />';
				imageEl.innerHTML = imageHtml;
			};
			
			if (userEl) {
				if (CCI.Pluck.Users.CurrentUser.DisplayName != "anonymous") {
				userHtml += '<small> [ <a href="' + CCI.Pluck.Urls.ClickshareUrl + '/updateCommunityGroups.do">MANAGE</a> ]<br />';
				userHtml += '<small>Welcome, ' + CCI.Pluck.Users.CurrentUser.DisplayName + '! Not you? <a href="' + CCI.Pluck.Urls.LogoutUrl + '">Log out</a></small></small>';
				}
				if (CCI.Pluck.Users.CurrentUser.UserTier == "Editor") {
				userHtml += '<p><small><a href="http://sitelife.detroitmakeithere.com/ver1.0/CMW/CommunityGroups/GroupDetails.rails">Manage all groups</a></p>';
				}
				userEl.innerHTML = userHtml;
			};
			
			if (insertEl) {
				html += "<ul>";
				if (CCI.Pluck.Users.CurrentUser.DisplayName == "anonymous") {
					html += '<li><a href="' + CCI.Pluck.Urls.LoginUrl + '">Log in to view your current course list</a></li>';
				} else {
			for (i=0;i<CCI.Pluck.College.MyCourses.length;i++) {
				var group = CCI.Pluck.College.MyCourses[i];
				html += '<li><a href="/section/college01?plckBlogId=' + group.CommunityGroup.BlogKey.Key + '">' + group.CommunityGroup.Title.replace(/^(.+?):(.*)$/,"$2") + ': ' + group.CommunityGroup.Description + '</a>';
				if (group.MembershipTier == "Manager") {
					html += '<p class="cci-college-new-post"><a href="/section/college01?plckBlogId=' + group.CommunityGroup.BlogKey.Key + '&plckBlogPage=BlogPostCreate&plckRedirectUrl=' + CCI.Pluck.Urls.GlobalSiteUrl + '/section/college01?plckBlogId=' + group.CommunityGroup.BlogKey.Key + '">New Post</a></p>';
						}
				html += '<ul><li>Latest post: <span class="cci-college-latest-post" id="'+group.CommunityGroup.BlogKey.Key+'"></span></li></ul></li>';
					}
				}
				html += "</ul>";
				insertEl.innerHTML = html;
				}
			var courseBlogs = $(".cci-college-latest-post");
			for (blogIdx = 0;blogIdx<courseBlogs.length;blogIdx++) {
				CCI.Pluck.College.getPosts({blogKeyEl:courseBlogs[blogIdx]});
				}
			}
		};

CCI.Pluck["Reactions"] = {
	getArticleReactions: function(bag) {
	bag = bag || {};
	var articleCommentsEl = bag.articleCommentsEl || 0;
	var articleCommentsClass = bag.articleCommentsClass || 0;
	var articleCommentsTag = bag.articleCommentsTag || 0;
	if (!articleCommentsEl || !articleCommentsClass || !articleCommentsTag) {
		return false;
	}
	
	var articleReactionsCallback = function(responseBatch) {
//	console.dir(responseBatch);
	// loop through the responses returned in the responseBatch
	for (i=0;i<responseBatch.Responses.length;i++) {
	
		// get the response object	
		var response = responseBatch.Responses[i];
			
		// if the response is an article, format the HTML to be inserted
		if (response.Article) {
			// console.dir(response.Article);
				
			// get the article comments from the response... all the available properties for the article object are documented
			var articleComments = response.Article.Comments.NumberOfComments;
					
			// format the html
			var articleCommentsHtml = "<a href="+response.Article.PageUrl+">";
				if(articleComments == "0"){
					articleCommentsHtml += "0 comments";
				}
				else if (articleComments == "1") {
					articleCommentsHtml += "1 comment";
					} 
				else {
					articleCommentsHtml += articleComments + " comments";
					}
					
			articleCommentsHtml += "</a>";
			
			// get the element that the HTML will be inserted into
			var articleElement = bag.articleCommentsEl + response.Article.ArticleKey.Key;
			
			// insert the HTML
			document.getElementById(articleElement).innerHTML = articleCommentsHtml;
			}
		}
	};	
	
	var articleClassName = bag.articleCommentsClass;	// name of the class that identifies an article we want reactions for
	var articleReactionsArray = []; 				// an empty array that will hold article IDs we want
	
	// put all <a> tags into an array
	var articleArray = document.getElementsByTagName(bag.articleCommentsTag);
		
	// loop through articleArray and dump tags matching our class name into articleReactionsArray
	for (i=0;i<articleArray.length;i++) {
		var thisArticle = articleArray[i];
		if (thisArticle.className.indexOf(articleClassName) > -1) {
			articleReactionsArray.push(thisArticle.id.replace(bag.articleCommentsEl,""));
			}
	}

	// SiteLife limits batches to 20 requests, 
	// so we have to check if there are more than 20 links on the page 
	// and if so divide them into separate batches...

	// how many articles will be requested?
	var numArticles = articleReactionsArray.length;
	
	// how many batches will we need?
	var numBatches = Math.ceil(numArticles / 20);
	
	// loop through and format request batches
	for (j=0;j<numBatches;j++) {
		
		// create the RequestBatch
		var requestBatch = new RequestBatch();
		
		// determine the starting point and limit point depending on where we are in the articleReactionsArray
		var start = 0;
		if (j>0) {
			start = j * 20;
			start = Math.ceil(start);
		}
		var limit = start + 20;
		
		// add the articleKey to the RequestBatch
		for (k=start;k<limit;k++) {
			if (articleReactionsArray[k]) {
				var articleKey = articleReactionsArray[k];
				requestBatch.AddToRequest(new ArticleKey(articleKey));
			}
		}
		
		// send the RequestBatch
		requestBatch.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, articleReactionsCallback);
		}
	
	}
	
};
 	
CCI.Pluck["Users"] = {
		currentUserWidget: function(bag) {
		bag = bag || {};
	//	console.dir(bag);
		var pluckResponseDiv = bag.pluckResponseDiv || 0;
		var clickshareResponseDiv = bag.clickshareResponseDiv || 0;
		var clickshareIsDefault = bag.clickshareIsDefault || 0;
		var guestResponseDiv = bag.guestResponseDiv || 0;
		var elDisplayStyle = bag.elDisplayStyle || "block";
		var html = "";
		
		var cb = function(r) {
		//	if (console) { console.dir(r); }
			if (!pluckResponseDiv || r.Responses[0].User.DisplayName == "anonymous" || r.Responses[0].User.DisplayName == r.Responses[0].User.UserKey) {
				if (clickshareIsDefault && clickshareResponseDiv) {
					
					var csdemos = new CCI.util.getCSCookie();
				//	if (console) { console.dir(csdemos); }
					if (csdemos.Cookie != null) {
					//	console.log("clickshare output");
						html += 'Welcome ' + csDemos.Cookie.nameFirst + '! <a href="'+CCI.Pluck.Urls.LoginUrl+'"><strong>JOIN THE NEW COMMUNITY!</strong></a> | <a href="'+CCI.Pluck.Urls.LogoutUrl+'"><strong>LOG OUT</strong></a>';
						document.getElementById(clickshareResponseDiv).innerHTML = html;
						document.getElementById(clickshareResponseDiv).style.display = elDisplayStyle;
					}
					else {
						// console.log("guest output");
						html += '<span style="color:#cc3300;">Not logged in to community.</span> <a href="'+CCI.Pluck.Urls.LoginUrl+'"><strong>LOG IN</strong></a> or <a href="'+CCI.Pluck.Urls.LoginUrl+'"><strong>REGISTER</strong></a>';
						document.getElementById(guestResponseDiv).innerHTML = html;
						document.getElementById(guestResponseDiv).style.display = elDisplayStyle;
						}
				} else {
				//	console.log("guest output");
				html += '<span style="color:#cc3300;">Not logged in to community.</span> <a href="'+CCI.Pluck.Urls.LoginUrl+'"><strong>LOG IN</strong></a> or <a href="'+CCI.Pluck.Urls.LoginUrl+'"><strong>REGISTER</strong></a>';
						document.getElementById(guestResponseDiv).innerHTML = html;
						document.getElementById(guestResponseDiv).style.display = elDisplayStyle;
						}
				}
			else {
				// console.log("pluck output");
				var user = r.Responses[0].User;
				var personaUrl = "/section/sitelife_profile?uid=" + user.UserKey.Key;
				html += 'Welcome ' + user.DisplayName + '! <a href="'+user.PersonaUrl+'"><strong>PROFILE</strong></a> | <a href="'+CCI.Pluck.Urls.EditAccountUrl+'"><strong>ACCOUNT</strong></a> | <a href="'+CCI.Pluck.Urls.LogoutUrl+'"><strong>LOG OUT</strong></a>';
				document.getElementById(pluckResponseDiv).innerHTML = html;
				document.getElementById(pluckResponseDiv).style.display = elDisplayStyle;
				}
		};
		
		var response = function() {
			if (pluckResponseDiv) {
				var rb = new RequestBatch();
				rb.AddToRequest(new UserKey());
				rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, cb);
			}
		};
		
		response();
	},
		FriendRequest: function(bag) {
//					console.dir(bag);
					bag = bag || {};
					var defaultCallback = function(re) {
							bag = bag || {};
							var updateEl = bag.updateEl || 0;
							if (updateEl) {
								updateEl.innerHTML = re.Messages[0].Message;
							}
							else {
							var friendMessageContainer = document.getElementById("pluck-persona-friend-message");
							friendMessageContainer.innerHTML = "Friendship " + re.Messages[0].Message;
								}
						};
							
					
			
					var cb = function(r) {
						var cu = r.Responses[0].User.UserKey.Key;
						var su = r.Responses[1].User.UserKey.Key;
						bag = bag || {};
						var callback = bag.cb || defaultCallback;
						var friendRequestAction = bag.friendRequestAction || "add";
						var friendKey = bag.friendKey || su;
//						console.log(friendKey);
//						console.dir(r);
						var friendAction = new RequestBatch();
						switch(friendRequestAction) {
							case "add":
								friendAction.AddToRequest(new AddFriendAction(new UserKey(friendKey)));
								break;
							case "remove":
								friendAction.AddToRequest(new RemoveFriendAction(new UserKey(friendKey)));
								break;
							case "approve":
								friendAction.AddToRequest(new ApproveFriendAction(new UserKey(friendKey), true));
								break;
							case "reject":
								friendAction.AddToRequest(new ApproveFriendAction(new UserKey(friendKey), false));
								break;
							}
//						console.dir(friendAction);
						friendAction.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, callback);
						};
					
					var users = new RequestBatch();
					users.AddToRequest(new UserKey());
					users.AddToRequest(new UserKey(gSiteLife.GetParameter("uid")));
					users.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, cb);
		},
		CommunityRequests: function(bag) {
					bag = bag || {};
					var action = bag.action || 0;
					
					
					if (!action) {
					CCI.Pluck.Users.MenuMessage({communityGroupKey:CCI.Pluck.Communities.CurrentCommunity.Key})
					}
					
					var request = function(r) {
					
					var groupKey = bag.groupKey || CCI.Pluck.Communities.CurrentCommunity.Key;
					var userKey = bag.userKey || r.Responses[0].User.UserKey.Key;
					if (groupKey && userKey && action) {
						var rb = new RequestBatch();
						switch(action) {
							case "join":
								rb.AddToRequest(new RequestCommunityGroupMembershipAction(new CommunityGroupKey(groupKey), new UserKey(userKey)));
								break;
							case "leave":
								userMenuMsg.innerHTML = "Leaving...";
								rb.AddToRequest(new UpdateCommunityGroupMembershipAction(new CommunityGroupKey(groupKey), new UserKey(userKey), new MembershipTier("NonMember"), false));
								break;
						}
						rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl,groupMembershipDaapiCb);
					}
				};
				
				var groupMembershipDaapiCb = function(r) {
					// console.dir(r);
					if (r.Messages[0].Message == "ok") {
						CCI.Pluck.Users.MenuMessage({communityGroupKey:CCI.Pluck.Communities.CurrentCommunity.Key});
					}
				}
				
				var user = new RequestBatch();
				user.AddToRequest(new UserKey());
				user.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, request);
				
		},
		GroupProtect: function() {
				var doTierActions = function(tier, key) {
					var tier = tier || "NonMember";
					if (key == "Anonymous") {
						tier = "Anonymous";
					}
					// console.dir(tier);
					// get elements
					var membersOnlyForms = $(".members-only-form");
					var membersOnlyFormsSolicit = $(".members-only-form-solicit");
					var membersOnlyFormsMessage = CCI.Pluck.Messages.Forms.MembersOnlyFormInput[tier]
					
					if (tier == "Anonymous" || tier == "NonMember" || tier == "Pending" || tier == "Banned") {
							$(membersOnlyFormsSolicit).each(function() {
								this.innerHTML = membersOnlyFormsMessage;
								$(this).show();
							});
							
							$(membersOnlyForms).each(function() {
								this.disabled = true;
							});
						} else {
							$(membersOnlyForms).each(function() {
								$(this).show();
							});
							}
					};
				
			
				var userRb = function() {
					var rb = new RequestBatch();
					rb.AddToRequest(new UserKey());
					rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, userCb);
				}
				
				var userCb = function(r) {
					var userKey = r.Responses[0].User.UserKey.Key;
					var checkGroup = new RequestBatch();
					checkGroup.AddToRequest(new CommunityGroupMembership(new CommunityGroupKey(CCI.Pluck.Communities.CurrentCommunity.Key), new UserKey(userKey)));
					checkGroup.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, checkGroupCb);
				}
				
				var checkGroupCb = function(r) {
//					console.dir(r);
					var memberTier = r.Responses[0].CommunityGroupMembership.MembershipTier;
					var userKey = r.Responses[0].CommunityGroupMembership.User.UserKey.Key;
					doTierActions(memberTier, userKey)
					}
				
				if (CCI.Pluck.Communities.CurrentCommunity.Key != "c") {
				userRb();
				}
				
				
		},
		FriendPage: function(bag) {
				bag = bag || {};
				var friendPageCb = bag.cb || 0;
				
				if (friendPageCb) {
						var userCb = function(r) {
							var currentUser = r.Responses[0].User;
							var subjectUser = r.Responses[1].User;
						
							if (currentUser.UserKey.Key === subjectUser.UserKey.Key) {
								var numberPerPage = bag.numberPerPage || 5;
								var onPage = bag.onPage || 1;
								var isPendingList = bag.isPendingList || false;
								var filterKey = bag.filterKey || "";
								var filterValue = bag.filterValue || "";
								var rb = new RequestBatch();
								rb.AddToRequest(new UserKey());
								rb.AddToRequest(new FriendPage(new UserKey(currentUser.UserKey.Key), numberPerPage, onPage, isPendingList, filterKey, filterValue));
								rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, friendPageCb);
								}
							};
					
					var userRequest = new RequestBatch();
					userRequest.AddToRequest(new UserKey());
					userRequest.AddToRequest(new UserKey(gSiteLife.GetParameter("uid")));
					userRequest.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, userCb);
			}
		},
		StatusUpdates: {
			get: function(bag) {

				bag = bag || {};
				var updateEl = bag.updateEl || 0;
				var dateEl = bag.dateEl || 0;
				
				var getStatusUpdateCb = function(r) {
//						console.dir(r);
						customItem = r.Responses[0].CustomCollectionPage.Items[0].CustomItem;
						container = document.getElementById(updateEl);
						container.innerHTML = customItem.Content;
						if (dateEl) {
						dateContainer = document.getElementById(dateEl);
						dateContainer.innerHTML = customItem.LastUpdated;
						}
						
				}
				
				var user = bag.user || 0;
				if (user && getStatusUpdateCb) {
				var st = new CustomCollectionKey("profile_userStatus_" + user.UserKey.Key);
				var getStatusUpdateRb = new RequestBatch();
				getStatusUpdateRb.AddToRequest(new CustomCollectionPage(st, 1, 1, "PositionDescending"));
				
				getStatusUpdateRb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, getStatusUpdateCb);
				}
			},
			
			deleteStatusUpdate: function(bag) {
				// console.log("deleteStatusUpdate")
				bag = bag || {};
				var itemToDelete = bag.itemToDelete || 0;
				if (!itemToDelete) { return false; }
				
				var userCb = function(UserResponse) {
				//	console.log("deleteStatusUpdate - userCb")
				//	console.dir(UserResponse)
					
					var cuKey = UserResponse.Responses[0].User.UserKey.Key;
					var cuTier = UserResponse.Responses[0].User.UserTier;
					var itemAuthorKey = UserResponse.Responses[1].CustomItem.Author.UserKey.Key;
					if (cuKey === itemAuthorKey || cuTier == "Editor") {
						var confirmDelete = confirm('Are you sure you want to delete the status update, "' + UserResponse.Responses[1].CustomItem.Content + '" ?');
						if (confirmDelete) {			
						var groupsCb = function(GroupsResponse) {
						//	console.log("GroupsResponse");
						//	console.dir(GroupsResponse);
						if (GroupsResponse.Responses[0]) {
							if (GroupsResponse.Responses[0].CommunityGroupMembershipPage) {
						var userGroupsToUpdate = [];
						var userGroups = GroupsResponse.Responses[0].CommunityGroupMembershipPage.CommunityGroupMemberships;
							for (i=0;i<userGroups.length;i++) {
							groupKey = userGroups[i].CommunityGroup.CommunityGroupKey.Key;
							CCI.Pluck.Collections.RemoveFromCollection({
								collectionKey:"profile_userStatus_comm_"+groupKey,
								itemKey:itemToDelete
									});
								}
							}
						}
						CCI.Pluck.Collections.RemoveFromCollection({
								collectionKey:"profile_userStatus_ALL",
								itemKey:itemToDelete
							});
						CCI.Pluck.Collections.RemoveFromCollection({
								collectionKey:"profile_userStatus_"+itemAuthorKey,
								itemKey:itemToDelete
							});
						CCI.Pluck.Collections.WipeCustomItem({
								itemKey:itemToDelete
							});
						
						};
					
				
					var rb = new RequestBatch();
					rb.AddToRequest(new CommunityGroupMembershipPage(new UserKey(itemAuthorKey), 10, 1));
					rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, groupsCb);
						}
					}
				};
				
				var rb = new RequestBatch();
				rb.AddToRequest(new UserKey());
				rb.AddToRequest(new CustomItemKey(itemToDelete));
				rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, userCb);
				
			},
			
			update: function(bag) {
				bag = bag || {};
				var updateCb = bag.cb || (function() {});
				var userRequest = new RequestBatch();
				userRequest.AddToRequest(new UserKey());
							
				function doUpdate(r) {
				var user = r.Responses[0].User.UserKey.Key;
				var statusInput = bag.statusInput || 0;
				var statusInputEl = bag.statusInputEl || 0;
				var groupsToUpdate = bag.groupsToUpdate || [];
				//console.log("in update function -- groupsToUpdate")
				//console.dir(groupsToUpdate);
				if (!statusInput) {
					if (statusInputEl) {
						var statusInput = document.getElementById(statusInputEl).value;
					}
				}
				var clearStatus = bag.clearStatus || 0;
				
				if (clearStatus) {
					// todo: clear status
				}
				
				if (statusInput) {
					var timestamp = new Date();
					timestamp = timestamp.getTime();
					var rb = new RequestBatch();
					
					var userCollectionKey = "profile_userStatus_" + user;
					var userCollection = new CustomCollectionKey(userCollectionKey);			
					var itemKey = userCollectionKey + "_" + timestamp;
					var item = new CustomItemKey(itemKey);
					rb.AddToRequest(new UpdateCustomItemAction(item, itemKey, "userStatus_class", "Status Update", statusInput));
					rb.AddToRequest(new AddCustomCollectionAction(userCollection, userCollectionKey));
					rb.AddToRequest(new InsertIntoCollectionAction(userCollection, item, 0));
					
					var siteActivityCollectionKey = "profile_userStatus_ALL";
					var siteActivityCollection = new CustomCollectionKey(siteActivityCollectionKey);
					//var siteActivityItemKey = siteActivityCollectionKey + "_" + user + "_" + timestamp;
					//var siteActivityItem = new CustomItemKey(siteActivityItemKey);
					rb.AddToRequest(new UpdateCustomItemAction(item, itemKey, "userStatus_ALL_class", "", statusInput, false));
					rb.AddToRequest(new AddCustomCollectionAction(siteActivityCollection, siteActivityCollectionKey));
					rb.AddToRequest(new InsertIntoCollectionAction(siteActivityCollection, item, 0));
					
					for (i=0;i<groupsToUpdate.length;i++) {
						var groupActivityCollectionKey = "profile_userStatus_comm_"+groupsToUpdate[i];
						var groupActivityCollection = new CustomCollectionKey(groupActivityCollectionKey);
						//var groupActivityItemKey = groupActivityCollectionKey + "_" + user + "_" + timestamp;
						// var groupActivityItem = new CustomItemKey(groupActivityItemKey);
						rb.AddToRequest(new UpdateCustomItemAction(item, itemKey, "userStatus_"+groupsToUpdate[i]+"_class", "", statusInput, false));
						rb.AddToRequest(new AddCustomCollectionAction(groupActivityCollection, groupActivityCollectionKey));
						rb.AddToRequest(new InsertIntoCollectionAction(groupActivityCollection, item, 0));
					}
					rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, updateCb);
					}
				};
				userRequest.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl,doUpdate);
				
			},
			
			ProfilePage: function() {
									
					var friendMessage = function(r) {
//						console.dir(r);
						var friendStatus = r.Messages[0].Message;
						var openMessages = r.Responses[0].User.MessagesOpenToEveryone;
						var publicMessageContainer = document.getElementById("wall-public-messages-form-container") || 0;
						var friendMessageContainer = document.getElementById("pluck-persona-friend-message");
						friendMessageHtml = "";
						switch(friendStatus) {
							case "NotFriend":
								friendMessageHtml += '<a href="#" onclick="CCI.Pluck.Users.FriendRequest({friendRequestAction:\'add\'});">Request Friendship</a>';
								if (openMessages == "False" && publicMessageContainer) {
									publicMessageContainer.innerHTML = "<p>This user only allows friends to post wall messages.</p>";
									$(publicMessageContainer).show();
								}
								if (openMessages == "True" && publicMessageContainer) {
									$(publicMessageContainer).show();
								}
								break;
							case "Friend":
								friendMessageHtml += '<a href="#" onclick="CCI.Pluck.Users.FriendRequest({friendRequestAction:\'remove\'});">Remove Friendship</a>';
								break;
							case "Pending":
								friendMessageHtml += 'Friendship Pending';
								if (openMessages == "False" && publicMessageContainer) {
									publicMessageContainer.innerHTML = "<p>This user only allows friends to post wall messages.</p>";
									$(publicMessageContainer).show();
								}
								if (openMessages == "True" && publicMessageContainer) {
									$(publicMessageContainer).show();
								}
								break;
							default:
								$(publicMessageContainer).show();
								break;
						}
						friendMessageContainer.innerHTML = friendMessageHtml;
					}
				
					var cb = function(r) {
//						console.dir(r);
						cu = r.Responses[0].User;
						su = r.Responses[1].User;

						if (cu.UserTier != "Anonymous") {
						var isFriendRequest = new RequestBatch();
						isFriendRequest.AddToRequest(new IsFriend(new UserKey(su.UserKey.Key), new UserKey(cu.UserKey.Key)));
						isFriendRequest.AddToRequest(new UserKey(su.UserKey.Key));
						isFriendRequest.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, friendMessage);
						}

						var rb = new RequestBatch();
						rb.AddToRequest(new CommunityGroupMembershipPage(new UserKey(cu.UserKey.Key), 10, 1));
						if (cu.UserKey.Key === su.UserKey.Key) {
							
							if (document.getElementById("pluck-persona-edit")) {
								var editProfileLinkContainer = document.getElementById("pluck-persona-edit");
								var editProfileHtml = "";
								editProfileHtml += '<a href="'+CCI.Pluck.Globals.WidgetPath+'?template=profile&uid='+cu.UserKey.Key+'&plckPersonaPage=PersonaProfileEdit">'+CCI.Pluck.Messages.Persona.EditPersona+'</a>';
								editProfileLinkContainer.innerHTML = editProfileHtml;
								}
							
							rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, statusUpdateCb);
						}
					}
					
					var statusUpdateCb = function(r) {
								var statusContainer = document.getElementById("pluck-user-status");
																							
								var userGroupsToUpdate = [];
								var userGroups = r.Responses[0].CommunityGroupMembershipPage.CommunityGroupMemberships;
													
								for (i=0;i<userGroups.length;i++) {
									userGroupsToUpdate.push(userGroups[i].CommunityGroup.CommunityGroupKey.Key);
								}
							
								var statusUpdateLinkContainer = document.getElementById("pluck-user-status-update");
								statusUpdateLink = document.getElementById("pluck-user-status-update-link");

								
								var statusFormContainer = document.getElementById("pluck-user-status-update-form-container");
								var statusForm = document.getElementById("pluck-user-status-form");
								var statusInput = statusForm.elements["pluck-user-status-form-input"];
								var statusSubmit = statusForm.elements["pluck-user-status-form-submit"];
								var statusCancel = document.getElementById("pluck-user-status-form-cancel");
								var statusTime = document.getElementById("pluck-user-status-time");
								
								statusUpdateLinkContainer.style.display = "inline";
								
								
								var refreshStatus = function() {
										statusContainer.style.display = "inline";
										statusFormContainer.style.display = "none";
										statusUpdateLinkContainer.style.display = "inline";
										statusTime.style.display = "inline";
										
				
										CCI.Pluck.Users.StatusUpdates.get({
											user:su,
											updateEl:"pluck-user-status",
											dateEl:"pluck-user-status-time"
										});
										return false;

								};
										
								var submitStatus = function() {
										CCI.Pluck.Users.StatusUpdates.update({
										statusInput:statusInput.value,
										groupsToUpdate:userGroupsToUpdate,
										cb:refreshStatus
										});
									}
								
								statusForm.onsubmit = function() {
									submitStatus();
									return false;
								}
										
								statusInput.onclick = function() {
									this.value = "";
								}
								
								statusCancel.onclick = function() {
									refreshStatus();
								}
								
								statusUpdateLink.onclick = function() {
									statusContainer.style.display = "none";
									statusFormContainer.style.display = "inline";
									statusInput.value = statusContainer.innerHTML;
									statusUpdateLinkContainer.style.display = "none";
									statusTime.style.display = "none";
								};
								
								statusSubmit.onclick = function() {
									submitStatus();
								}
					};
					var rb = new RequestBatch();
					rb.AddToRequest(new UserKey());
					rb.AddToRequest(new UserKey(gSiteLife.GetParameter("uid")));
					rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, cb);
				},
				
			Feed: {
				doFeed: function(bag) {
							bag = bag || {};
							var miniFeed = $(".wall-container");
							
							var cb = function(r) {
										// console.dir(r);
										var thisMiniFeedCustomItemKey = r.Responses[0].CommentPage.ArticleKey.Key;
//										console.log(thisMiniFeedCustomItemKey);
										var statusAuthor = r.Responses[1].CustomItem.Author.UserKey.Key;
										var currUser = r.Responses[2].User.UserKey.Key;
										var numberOfComments = r.Responses[0].CommentPage.NumberOfComments;

										var commentInputEl = document.getElementById("wall-comments-input-"+thisMiniFeedCustomItemKey);
										var commentInputForm = document.getElementById("wall-comments-form-"+thisMiniFeedCustomItemKey);
										var commentInputFormButton = document.getElementById("wall-comments-form-add-"+thisMiniFeedCustomItemKey);
										
										if (currUser == "anonymous") {
											commentInputEl.value = "Log in or register to comment";
											commentInputEl.disabled = true;
											commentInputFormButton.style.display = "none";
										}
										
										if (numberOfComments > 0) {
										var moreComments = numberOfComments - 1;
										var firstComment = r.Responses[0].CommentPage.Comments[0];
										var inputDiv = document.getElementById("wall-item-comment-"+thisMiniFeedCustomItemKey);
										var photoUrl = "/apps/pbcsi.dll/urlget?url=" + firstComment.Author.AvatarPhotoUrl;
										var authorUrl = document.getElementById("wall-item-author-url-"+thisMiniFeedCustomItemKey).href;
										var inputEl = inputDiv.getElementsByTagName("p")[0];
										var commentHtml = "";
										commentHtml += "<img src='"+photoUrl+"' width=30 />" +  firstComment.CommentBody + "<br /><a href='"+firstComment.Author.PersonaUrl+"'>" + firstComment.Author.DisplayName + "</a> | " + firstComment.PostedAtTime;
										if (moreComments > 0) {
											commentHtml += "<br /><a href='"+firstComment.Author.PersonaUrl+"&plckPersonaPage=PersonaStatusUpdates&statusUpdateId="+thisMiniFeedCustomItemKey+"'>" + moreComments + " more comment";
											if (moreComments > 1) {
												commentHtml += "s";
											}
											commentHtml += "</a>"; 
										}
										inputEl.innerHTML = commentHtml;										
										inputDiv.style.display = "block";
										}
										
							};
									
							var attachCommentSubmit = function(miniFeedCustomItemKey) {
									
									var postCommentCb = function(r) {
//										console.dir(r);
										comments();
									};
									
								
									var attachEvent = function(r) {
										//console.dir(r);
										var currUserKey = r.Responses[0].User.UserKey.Key;
										var commentInputEl = document.getElementById("wall-comments-input-"+miniFeedCustomItemKey) || 0;
										var personaCustomItem = miniFeedCustomItemKey.replace(/comm_(.+?)_userStatus/g,"userStatus");
										var inputForm = document.getElementById("wall-comments-form-"+personaCustomItem);
																				
										if (currUserKey != "anonymous") {
											
											inputForm.onsubmit = function() {
													var commentInputEl = document.getElementById("wall-comments-input-"+miniFeedCustomItemKey) || 0;
													if (commentInputEl.value == "Write a comment..." || commentInputEl.value == "") {
														alert("Please enter a comment");
														return false;
													}
													var authorName = document.getElementById("wall-item-author-"+miniFeedCustomItemKey);
													var authorUrl = document.getElementById("wall-item-author-url-"+miniFeedCustomItemKey);
													if (commentInputEl.value.length > 0) {
													var currUser = new UserKey();
													//var key = new ArticleKey(miniFeedCustomItemKey);
													
													var key = new ArticleKey(personaCustomItem);
													var onPageUrl = authorUrl.href + "&plckPersonaPage=PersonaStatusUpdates&statusUpdateId=" + personaCustomItem;
													var onPageTitle = authorName.innerHTML + "'s status update: \""+authorUrl.innerHTML+"\"";
													var commentBody = commentInputEl.value;
													commentInputEl.value = "";
													var rb = new RequestBatch();
													rb.AddToRequest(new CommentAction(key, onPageUrl, onPageTitle, commentBody));
													rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, postCommentCb);
													}
													return false;
													};
													
											
											//var submitCommentEl = document.getElementById("wall-comments-form-add-"+miniFeedCustomItemKey);
											//$(submitCommentEl).show();
											}
											else {
												commentInputEl.value = "Log in to comment";
												inputForm.disabled = true;
											}
												
								};
								
								var currUser = new RequestBatch();
								currUser.AddToRequest(new UserKey());
								currUser.AddToRequest(new CustomItemKey(miniFeedCustomItemKey));
								currUser.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, attachEvent);
							};
											
							var comments = function() {

								for (i=0;i<miniFeed.length;i++) {
									var miniFeedContainer = miniFeed[i];
									var miniFeedItems = $(miniFeedContainer).children(".wall-item");
//									console.dir(miniFeedItems);

									for (m=0;m<miniFeedItems.length;m++) {
										if (miniFeedItems[m].id.indexOf("profile_userStatus") == 0) {
										var miniFeedCustomItemKey = miniFeedItems[m].id;
//										console.log("miniFeedCustomItemKey: " + miniFeedCustomItemKey);
										var personaCustomItem = miniFeedCustomItemKey.replace(/comm_(.+?)_userStatus/g,"userStatus");
										// console.log("PersonaCustomItem: " + personaCustomItem);
										//comm_5370d993-0cb2-4542-8b4d-3a98f509f7f3_
										// attachCommentSubmit(miniFeedCustomItemKey);
										attachCommentSubmit(personaCustomItem);
																								
										var rb = new RequestBatch();
										// var key = new ArticleKey(miniFeedCustomItemKey);
										var key = new ArticleKey(personaCustomItem);
									//	console.dir(key);
										// console.log(personaCustomItem);
										rb.AddToRequest(new CommentPage(key, 1, 1, "TimeStampDescending"));
										//rb.AddToRequest(new CustomItemKey(miniFeedCustomItemKey));
										rb.AddToRequest(new CustomItemKey(miniFeedCustomItemKey));
										rb.AddToRequest(new UserKey());
									//	console.dir(rb);
										rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, cb);
										}
									}
								}
							};
							
							comments();
					}
				}
			},
			
			MenuMessage: function(bag) {
				var userOptions = document.getElementById("menu-user-options");
				var userMenuMsg = "";
				communityGroupKey = bag.communityGroupKey || 0;
				
				var groupMembershipActions = function() {
					if (communityGroupKey) {
						var user = new UserKey();
						var group = new CommunityGroupKey(communityGroupKey);
						rb = new RequestBatch();
						rb.AddToRequest(user);
						rb.AddToRequest(group);
						rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, groupMembershipActionsCb);
						}
				};
					
				var groupMembershipActionsCb = function(r) {
//					console.dir(r);
					var user = r.Responses[0].User;
					var group = r.Responses[1].CommunityGroup;
					var userIsPending = group.HasPendingMembership;
					var reqTier = group.RequestingUsersMembershipTier;
					if (userIsPending == "True") {
						reqTier = "Request Pending";
					}
					var userMenuMsg = "";
					var longReqTier = (function() {
						switch(reqTier) {
							case "NonMember":
								return "Visitor";
								break;
							case "Banned":
								return "Visitor";
								break;
							case "GroupAdmin":
								return "Administrator";
								break;
							default:
								return reqTier;
								break;
							}
						})();
					//console.log(reqTier);
					if (reqTier == "NonMember" || userIsPending == "True") {
						if (user.DisplayName == "anonymous") {
							userMenuMsg += "<a href='"+CCI.Pluck.Urls.LoginUrl+"'>Log in / Register</a>";
						}
						else {
							userMenuMsg += '<a href="'+user.PersonaUrl+'">'+user.DisplayName+'</a><br class="clear-floats" /><ul><li>';
							if (userIsPending == "True") {
								userMenuMsg += '<a href="#">Join request pending</a>';
							} else {
								userMenuMsg += '<a href="#" id="user-menu-options-join-community">Join</a>';
							}
							userMenuMsg += '</li><li><a href="'+user.PersonaUrl+'">My profile</a></li></ul>';
						}
					}
					else {
						userMenuMsg = '<a href="'+user.PersonaUrl+'">' + user.DisplayName + '</a><br class="clear-floats" />\
							<ul>\
							<li><a href="'+user.PersonaUrl+'">Community Member</li>\
							<li><a href="'+user.PersonaUrl+'">My profile</a></li>\
							<li><a href="'+CCI.Pluck.Urls.LogoutUrl+'">Log out</a></li></ul>';
					}
					userOptions.innerHTML = userMenuMsg;
					$("#user-menu-options-join-community").click(function() {
								CCI.Pluck.Users.CommunityRequests({action:"join",groupKey:group.CommunityGroupKey.Key,userKey:user.UserKey.Key});
							});
					
					
				};
				
				var userMembershipList = function() {
					var fillList = function(r) {
						
//						console.dir(r);
						var groups = r.Responses[0].CommunityGroupMembershipPage.CommunityGroupMemberships;
						var list = document.getElementById("community-main-menu-user-communities");
						listHtml = "";
						for (g=0;g<groups.length;g++) {
							groupSection = groups[g].CommunityGroup.Section;
							if (groupSection.indexOf("cdb-comm-") == 0) {
//								console.log(groupSection);
								groupSection = groupSection.replace(/cdb-comm-/g,"");
//								console.log(groupSection);
								listHtml += '<li><a href="/section/'+groupSection+'?template=community">' + groups[g].CommunityGroup.Description + '</a></li>';
							}
						}
						if (listHtml.length > 0) {
							list.innerHTML = listHtml;
						} else {
							list.innerHTML = "<p>You have no community memberships</p>";
						}
					};
					
					var userCb = function(r) {
						cu = r.Responses[0].User.UserKey.Key
						var userOptionsHtml = "";
						if (cu != "anonymous") {
							var currTemplate = gSiteLife.GetParameter("template");
							userOptionsHtml += '<a href="'+r.Responses[0].User.PersonaUrl+'"';
							if (currTemplate == "profile") {
								userOptionsHtml += ' class="active"';
							}
							userOptionsHtml += '>'+r.Responses[0].User.DisplayName+'</a><br class="clear-floats" /><ul>\
							<li><a href="'+r.Responses[0].User.PersonaUrl+'">My profile</a></li>\
							<li><a href="'+CCI.Pluck.Urls.LogoutUrl+'">Log out</a></li>\
							</ul>';
							userOptions.innerHTML = userOptionsHtml;
						}
						var rb = new RequestBatch();
						rb.AddToRequest(new CommunityGroupMembershipPage(new UserKey(cu), 10, 1));
						rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, fillList);
						};
					
					var user = new RequestBatch();
					user.AddToRequest(new UserKey());
					user.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, userCb);
				};
				
					switch(CCI.Pluck.Communities.CurrentCommunity.Key) {
						case "c":
							userMembershipList();
							break;
						default:
							groupMembershipActions();
							break;
					}
			},
			
			AddPersonaMessage: function() {
							
						document.getElementById("persona-message-form-submit").onclick = function() {
							var msgBody = 0;
							var msgInputEl = "wall-public-messages-form-input";
							if (msgInputEl) {
								var msgBody = document.getElementById(msgInputEl).value || 0;
							}
							var toUserKey = gSiteLife.GetParameter("uid") || 0;
							
							var cb = function(r) {  
								// console.dir(r);
								var msgResponse = r.Messages[0].Message;
								if (msgResponse == "ok") {
									location.href = location.href.replace(/#$/,"");
								}
								else if (msgResponse.indexOf("must be friends")) {
									alert("You must be a friend of this user to post a message.");
								}
							};
						
							if (toUserKey && msgBody) {
								var rb = new RequestBatch();
								rb.AddToRequest(new AddPersonaMessageAction(new UserKey(toUserKey), msgBody));
								rb.BeginRequest(CCI.Pluck.Urls.DaapiProcessUrl, cb);
								}
						};
			}
};