﻿function Messages_ActivityMessageList_Init(context, queryType, amTypes, activityMessageID) {
	var fragmentWrapper = $('#' + context.wrapperId);
	
	$('.filter-option > a', fragmentWrapper)
        .click(function(e) { Messages_ActivityMessageList_Filter(context, this); e.preventDefault(); });

	$('.filter-option > a:first', fragmentWrapper).parent().addClass('filter-option__selected selected');

	$(document).bind('telligent_messaging_activitymessageupdated', function(e, message) { Messages_ActivityMessageList_AddStatusMessage(context, message); });

	Messages_ActivityMessageList_DataBind(context, queryType, amTypes, activityMessageID);
}

function Messages_ActivityMessageList_Filter(context, filter) {
	var f = $(filter);
	$(".filter-option", $('#' + context.wrapperId)).removeClass("filter-option__selected selected");
	$(f.parent().get(0)).addClass('filter-option__selected selected');
	var ids = filter.id.split('_');

	Messages_ActivityMessageList_DataBind(context, ids[ids.length - 2], ids[ids.length - 1], "");
}

function Messages_ActivityMessageList_DataBind(context, queryType, amTypes, activityMessageID) {
	var fragmentWrapper = $('#' + context.wrapperId);
	var pager = $('#' + context.variableName + '_MessageListPager', fragmentWrapper);
	pager.hide();
	var loadingMsg = $('#' + context.variableName + '_MessageListLoading', fragmentWrapper);
	loadingMsg.show();

	var wrapperDiv = $('#' + context.variableName + '_MessageListWrapper', fragmentWrapper);
	wrapperDiv.html('');

	wrapperDiv.data("CachedMessages", null);
	wrapperDiv.data("ActivityMessageID", activityMessageID);
	wrapperDiv.data("QueryType", queryType);
	wrapperDiv.data("ActivityMessageTypes", amTypes);
	wrapperDiv.data("StartDate", "0");
	wrapperDiv.data("LastDay", "");
	wrapperDiv.data("FirstDay", "");
	wrapperDiv.data("retryCount", 0);

	Messages_ActivityMessageList_GetMessages(context, wrapperDiv, pager, loadingMsg, false);
}

function Messages_ActivityMessageList_More(context) {
	var fragmentWrapper = $('#' + context.wrapperId);
	var wrapperDiv = $('#' + context.variableName + '_MessageListWrapper', fragmentWrapper);
	var pager = $('#' + context.variableName + '_MessageListPager', fragmentWrapper);
	pager.hide();
	var loadingMsg = $('#' + context.variableName + '_MessageListLoading', fragmentWrapper);
	loadingMsg.show();

	wrapperDiv.data("retryCount", 0);
	var messages = wrapperDiv.data("CachedMessages");

	if (messages == null) {
		Messages_ActivityMessageList_GetMessages(context, wrapperDiv, pager, loadingMsg, true);
	}
	else {
	    Messages_ActivityMessageList_LoadMessages(context, wrapperDiv, pager, loadingMsg, true, messages);
	}

}

function Messages_ActivityMessageList_GetMessages(context, wrapper, pager, loadingMsg, appendResults) {
	var message = '{"jsQueryType":"' + wrapper.data("QueryType") + '",'
		+ '"jsActivityMessageTypes":"' + wrapper.data("ActivityMessageTypes") + '",'
		+ '"jsActivityMessageID":"' + wrapper.data("ActivityMessageID") + '",'
		+ '"jsGroupID":"' + context.parameter.groupID + '",'
		+ '"jsIncludeSubGroups":"' + context.parameter.includeSubGroups + '",'
		+ '"jsContextualUserID":"' + context.parameter.userID + '",'
		+ '"jsPageSize":"' + (context.parameter.pageSize * 3) + '",'
		+ '"jsStartDate":"' + wrapper.data("StartDate") + '"}';

	$.ajax({
	    type: "POST",
	    url: Messages_ActivityMessageList_AjaxEndpoint + "/GetMessages",
	    data: message,
	    contentType: "application/json; charset=utf-8",
	    dataType: "json",
	    timeout: 10000,
	    beforeSend: function(xhr) {
	       TelligentUtility.WriteAuthorizationHeader(xhr);
	    },
	    success: function(response) {
	        Messages_ActivityMessageList_LoadMessages(context, wrapper, pager, loadingMsg, appendResults, response.d);
	    },
	    error: function(xhr, desc, ex) {
	        var retryCount = wrapper.data('retryCount');
	        if (retryCount < 3) {
	            wrapper.data('retryCount', retryCount + 1)
	            setTimeout(function() { Messages_ActivityMessageList_GetMessages(context, wrapper, pager, loadingMsg, appendResults) }, 1500);
	        }
	        else {
	            // Give up, reset count, display error message
	            wrapper.data('retryCount', 0)
	            wrapper.html(context.parameter.notificationHtmlBlock
				.replace(/{MessageStyle}/g, "message error error__message")
				.replace(/{Message}/g, Messages_ActivityMessageList_Error));
	        }

	    }
	});
}



function Messages_ActivityMessageList_LoadMessages(context, wrapper, pager, loadingMsg, appendResults, messages) {
	if (messages.Messages.length > 0) {
		var listHtml = '';
		var lastMessage;
		var currentDay = '';
		var lastDay = wrapper.data("LastDay");

		if (!appendResults) {
			wrapper.html('');
		}

		if (appendResults && lastDay != '') {
			currentDay = lastDay;
		}

		// Save date of last Activity Message retrieved
		wrapper.data("StartDate", messages.LastDateTicks);

		// Do not show pager if on last page of client results, and no more server results exist
		var showPager = true;
		if ((messages.MoreData == false) && (messages.Messages.length <= context.parameter.pageSize))
			showPager = false;
		
		var pageSize = Math.min(messages.Messages.length, context.parameter.pageSize);
		var filteredMessages = new Array();
		var parentItemCount = 0;
		for (i = 0; i < messages.Messages.length; i++) {
			if (!messages.Messages[i].R) {
				parentItemCount++;
			}
			if (parentItemCount <= pageSize) {
				filteredMessages[i] = messages.Messages[i];
			}
		}
		if (messages.Messages.length > filteredMessages.length) {
			messages.Messages = messages.Messages.slice(filteredMessages.length);
			wrapper.data("CachedMessages", messages);
		}
		else {
			wrapper.data("CachedMessages", null);
		}
		messages = null;

		var itemHtml = "";
		$.each(filteredMessages, function() {
			var avatarHtml = "";
			if (context.parameter.displayUserAvatars)
				avatarHtml = context.parameter.userAvatarHtmlBlock.replace(/{AvatarHtml}/g, this.A);

			if (this.R) {
				itemHtml = context.parameter.replyMessageHtmlBlock
							.replace(/{MessageId}/g, this.I)
							.replace(/{Message}/g, this.M)
							.replace(/{DateCreated}/g, this.D)
							.replace(/{AvatarHtml}/g, avatarHtml)
							.replace(/{Type}/g, this.T)
							.replace(/{ParentMessageId}/g, this.P);

				if (this.Z) {
					var deleteHtml = context.parameter.replyMessageDeleteLinkBlock
								.replace(/{MessageId}/g, this.I)
								.replace(/{ParentMessageId}/g, this.P);
					itemHtml = itemHtml.replace(/{MessageActionLinks}/g, deleteHtml);
				}
				else
					itemHtml = itemHtml.replace(/{MessageActionLinks}/g, '');
			}
			else {

				if (wrapper.data("FirstDay") == "") {
					wrapper.data("FirstDay", this.C);
				}

				// Add reply form for the previous ActivityMessage below any replies for that item
				if (lastMessage != null && lastMessage.Y) {
					listHtml += Messages_ActivityMessageList_GetReplyForm(context, lastMessage);
				}

				// Check if a new Date List header needs to be rendered
				if (this.C != currentDay) {
					// Skip if this is the first list
					if (currentDay != '') {
						if (appendResults && (lastDay == currentDay)) {
							// Messages already exists on the page. Merge items into the last date list already on the page
							var lastDateList = $('ul.content-list:last', wrapper);
							lastDateList.append(listHtml);
						}
						else {
							// Close the previous date list and flush it to the page
							listHtml += context.parameter.dateFooterHtmlBlock;
							wrapper.append(listHtml);
						}
						listHtml = '';
					}

					var dateHeaderHtml = context.parameter.dateHeaderHtmlBlock
								.replace(/{Date}/g, this.N)
								.replace(/{DayCode}/g, this.C);
					currentDay = this.C;
					listHtml += dateHeaderHtml;
				}

				itemHtml = context.parameter.activityMessageHtmlBlock
							.replace(/{MessageId}/g, this.I)
							.replace(/{Message}/g, this.M)
							.replace(/{DateCreated}/g, this.D)
							.replace(/{AvatarHtml}/g, avatarHtml)
							.replace(/{Type}/g, this.T)
							.replace(/{DataGroupingCount}/g, this.G);
				if (this.Z || (this.Y && !this.H)) {
					var actionLinksHtml = '<ul class="navigation-list">';
					if (this.Y && !this.H) {
						actionLinksHtml = actionLinksHtml + context.parameter.activityMessageReplyLinkBlock.replace(/{MessageId}/g, this.I);
					}
					if (this.Z) {
						actionLinksHtml = actionLinksHtml + context.parameter.activityMessageDeleteLinkBlock.replace(/{MessageId}/g, this.I);
					}
					actionLinksHtml = actionLinksHtml + "</ul>";
					itemHtml = itemHtml.replace(/{MessageActionLinks}/g, actionLinksHtml);
				}
				else
					itemHtml = itemHtml.replace(/{MessageActionLinks}/g, '');

				lastMessage = this;
			}

			listHtml += itemHtml;
		});

		// Add reply form for the very last ActivityMessage
		if (lastMessage.Y) {
			listHtml += Messages_ActivityMessageList_GetReplyForm(context, lastMessage);
		}

		if (appendResults && lastDay == currentDay) {
			// Merge items into the last date list already on the page
			var lastDateList = $('ul.content-list:last', wrapper);
			lastDateList.append(listHtml);
		}
		else {
			// Close the previous date list and flush it to the page
			listHtml += context.parameter.dateFooterHtmlBlock;
			wrapper.append(listHtml);
		}
		listHtml = '';

		// Save last Date list used
		wrapper.data("LastDay", currentDay);

		if (showPager && wrapper.data("ActivityMessageID") == "") {
			pager.show();
		}
	
	}
	else {
		wrapper.data("CachedMessages", null);
		if (!appendResults) {
			wrapper.html(context.parameter.notificationHtmlBlock
						.replace(/{MessageStyle}/g, "message norecords message__norecords")
						.replace(/{Message}/g, Messages_ActivityMessageList_NoResults));
		}
		pager.hide();
	}
	loadingMsg.hide();
}


function Messages_ActivityMessageList_GetReplyForm(context, message) {
	var replyFormHtml = context.parameter.replyFormHtmlBlock
		.replace(/{MessageId}/g, message.I)
		.replace(/{AvatarHtml}/g, context.parameter.currentUserAvatarHtml);
	if (message.H)
		replyFormHtml = replyFormHtml.replace(/{Style}/g, '');
	else
		replyFormHtml = replyFormHtml.replace(/{Style}/g, 'style="display: none;"');

	return replyFormHtml;
}

function Messages_ActivityMessageList_ShowReply(context, messageId) {
	var val = context.parameter.inlineReplyHtmlBlock.replace(/{MessageId}/g, messageId);
	var li = $("#Message_" + messageId, $("#" + context.wrapperId));
	$("ul.navigation-list", li).hide();
	var inlineReplyDiv = $("#InlineReply_" + messageId, li);
	inlineReplyDiv.html(val);
	inlineReplyDiv.show();

	// Bug in IE7 with focus() method. Must call it twice to work
	if ($.browser.msie) {
		$("#Input_" + messageId, li).focus().focus();
	}
	else {
		$("#Input_" + messageId, li).focus();
	}
}

function Messages_ActivityMessageList_GenerateReplyMessage(context, message) {
	var replyHtml = context.parameter.replyMessageHtmlBlock
		.replace(/{MessageId}/g, message.I)
		.replace(/{Message}/g, message.M)
		.replace(/{DateCreated}/g, message.D)
		.replace(/{Type}/g, message.T)
		.replace(/{ParentMessageId}/g, message.P);

	if (context.parameter.displayUserAvatars) {
		avatarHtml = context.parameter.userAvatarHtmlBlock.replace(/{AvatarHtml}/g, message.A);
		replyHtml = replyHtml.replace(/{AvatarHtml}/g, avatarHtml);
	}
	else {
		replyHtml = replyHtml.replace(/{AvatarHtml}/g, '');
	}

	if (message.Z) {
		var deleteHtml = context.parameter.replyMessageDeleteLinkBlock
			.replace(/{MessageId}/g, message.I)
			.replace(/{ParentMessageId}/g, message.P);
		replyHtml = replyHtml.replace(/{MessageActionLinks}/g, deleteHtml);
	}
	else {
		replyHtml = replyHtml.replace(/{MessageActionLinks}/g, '');
	}

	return replyHtml;
}

function Messages_ActivityMessageList_PostInlineReply(context, messageId) {
	var li = $("#Message_" + messageId, $("#" + context.wrapperId));
	var replyText = $('#Input_' + messageId, li).val();
	if ($.trim(replyText) == '')
		return;

	var message = '{"parentMessageId":"' + messageId + '",' +
        '"newMessageBody":"' + encodeURIComponent(replyText) + '"}';

	$('span.field-item-input', li).addClass('processing field-item-input__processing');
	
	$.ajax({
		type: "POST",
		url: Messages_ActivityMessageList_AjaxEndpoint + "/PostReply",
		data: message,
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		timeout: 7000,
		beforeSend: function(xhr) {
		   TelligentUtility.WriteAuthorizationHeader(xhr);
		},
		success: function(response) {
			var returned = response.d;
			if (returned.Error) {
				eval(returned.ErrorScript);
			}
			else {
				var itemHtml = Messages_ActivityMessageList_GenerateReplyMessage(context, returned.Message);
				$(itemHtml).insertAfter('#Message_' + returned.Message.P);
				$('#InlineReplyLink_' + returned.Message.P, li).hide();
				$("ul.navigation-list", li).show();
				$('#InlineReply_' + returned.Message.P, li).hide();
				$('#NewReply_' + returned.Message.P).show("fast");
            }

            $('span.field-item-input', li).removeClass('processing field-item-input__processing');
		}
	});
}

function Messages_ActivityMessageList_PostReply(context, messageId) {
    var wrapper = $("#" + context.wrapperId);
    var li = $("#NewReply_" + messageId, $("#" + context.wrapperId));
	var replyText = $('#ReplyInput_' + messageId, wrapper).val();
	if ($.trim(replyText) == '')
		return;

	var message = '{"parentMessageId":"' + messageId + '",' +
        '"newMessageBody":"' + encodeURIComponent(replyText) + '"}';

	$('span.field-item-input', li).addClass('processing field-item-input__processing');
	
	$.ajax({
		type: "POST",
		url: Messages_ActivityMessageList_AjaxEndpoint + "/PostReply",
		data: message,
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		timeout: 7000,
		beforeSend: function(xhr) {
		   TelligentUtility.WriteAuthorizationHeader(xhr);
		},
		success: function(response) {
			var returned = response.d;
			if (returned.Error) {
				eval(returned.ErrorScript);
			}
			else {
				var itemHtml = Messages_ActivityMessageList_GenerateReplyMessage(context, returned.Message);
				$(itemHtml).insertBefore('#NewReply_' + returned.Message.P);
				$('#ReplyInput_' + returned.Message.P, wrapper).attr('value', '');
			}

			$('span.field-item-input', li).removeClass('processing field-item-input__processing');
		}
	});
}

function Messages_ActivityMessageList_DeleteMessage(context, messageId) {
	if (window.confirm(Messages_ActivityMessageList_ConfirmDeleteMessage)) {
		var message = '{"messageId":"' + messageId + '"}';
		$.ajax({
			type: "POST",
			url: Messages_ActivityMessageList_AjaxEndpoint + "/DeleteActivityMessage",
			data: message,
			contentType: "application/json; charset=utf-8",
			dataType: "json",
			beforeSend: function(xhr) {
			   TelligentUtility.WriteAuthorizationHeader(xhr);
			},
			success: function(response) {
				var wrapper = $("#" + context.wrapperId);
				// Remove reply form
				$('#NewReply_' + messageId, wrapper).hide().empty();
				// Remove replies
				$("li.reply_to_" + messageId, wrapper).hide().empty();
				// Remove actual message
				$('#Message_' + messageId, wrapper).hide("fast").empty();
			}
		});
	}
}

function Messages_ActivityMessageList_DeleteReply(context, messageId, parentMessageId) {
	if (window.confirm(Messages_ActivityMessageList_ConfirmDeleteMessage)) {
		var message = '{"messageId":"' + messageId + '",' + '"parentMessageId":"' + parentMessageId + '"}';
		$.ajax({
			type: "POST",
			url: Messages_ActivityMessageList_AjaxEndpoint + "/DeleteReplyMessage",
			data: message,
			contentType: "application/json; charset=utf-8",
			dataType: "json",
			beforeSend: function(xhr) {
			   TelligentUtility.WriteAuthorizationHeader(xhr);
			},
			success: function(response) {
				var wrapper = $("#" + context.wrapperId);
				$('#Reply_' + messageId, wrapper).hide("fast").empty();
			}
		});
	}
}

function Messages_ActivityMessageList_UpdateStatusMessage(context) {
	var wrapper = $("#" + context.wrapperId);
	var textbox = $('#' + context.variableName + "_StatusTextBox", wrapper);
	if ($.trim(textbox.val()) == '')
		return;
	if ($.trim(textbox.val()) == Messages_ActivityMessageList_DefaultStatusMessage)
		return;
	
	var wrapperDiv = $('#' + context.variableName + '_MessageListWrapper', wrapper);
	var message = '{"newMessageBody":"' + encodeURIComponent(textbox.val()) + '",' + '"groupID":"' + context.parameter.groupID + '"}'

	$.ajax({
		type: "POST",
		url: Messages_ActivityMessageList_AjaxEndpoint + "/UpdateStatusMessage",
		data: message,
		contentType: "application/json; charset=utf-8",
		dataType: "json",
		beforeSend: function(xhr) {
		   TelligentUtility.WriteAuthorizationHeader(xhr);
		},
		success: function(response) {
			var message = response.d;

            Messages_ActivityMessageList_AddStatusMessage(context, message);
		}
	});
}

function Messages_ActivityMessageList_AddStatusMessage(context, message) {
   	var wrapper = $("#" + context.wrapperId);
	var textbox = $('#' + context.variableName + "_StatusTextBox", wrapper);
	var wrapperDiv = $('#' + context.variableName + '_MessageListWrapper', wrapper);

    // Update current status display
	var statusBody = $('#' + context.variableName + "_CurrentStatusMessageBody", wrapper);
	var statusDate = $('#' + context.variableName + "_CurrentStatusMessageDate", wrapper);
	statusBody.html(message.B);
	statusDate.html(message.D);
	if (context.parameter.groupID != 0) {
		var statusUser = $('#' + context.variableName + "_CurrentStatusMessageUser", wrapper);
		statusUser.html(message.A);
	}
	textbox.val(Messages_ActivityMessageList_DefaultStatusMessage);

	var itemHtml = context.parameter.activityMessageHtmlBlock
					.replace(/{MessageId}/g, message.I)
					.replace(/{Message}/g, message.M)
					.replace(/{Type}/g, message.T)
					.replace(/{DateCreated}/g, message.D)
					.replace(/{DataGroupingCount}/g, message.G);

	if (context.parameter.displayUserAvatars) {
		avatarHtml = context.parameter.userAvatarHtmlBlock.replace(/{AvatarHtml}/g, message.A);
		itemHtml = itemHtml.replace(/{AvatarHtml}/g, avatarHtml);
	}
	else {
		itemHtml = itemHtml.replace(/{AvatarHtml}/g, '');
	}

	if (message.Z || (message.Y && !message.H)) {
		var actionLinksHtml = '<ul class="navigation-list">';
		if (message.Y && !message.H) {
			actionLinksHtml = actionLinksHtml + context.parameter.activityMessageReplyLinkBlock.replace(/{MessageId}/g, message.I);
		}
		if (message.Z) {
			actionLinksHtml = actionLinksHtml + context.parameter.activityMessageDeleteLinkBlock.replace(/{MessageId}/g, message.I);
		}
		actionLinksHtml = actionLinksHtml + "</ul>";
		itemHtml = itemHtml.replace(/{MessageActionLinks}/g, actionLinksHtml);
	}
	else {
		itemHtml = itemHtml.replace(/{MessageActionLinks}/g, '');
	}

	// Add reply form for the new status message
	itemHtml += Messages_ActivityMessageList_GetReplyForm(context, message);

	// Check if there is already a Date list for the date of this status message
	if (message.C == wrapperDiv.data("FirstDay")) {
		var DateList = $('#' + context.variableName + '_messagelist_' + message.C, wrapperDiv);
		DateList.prepend(itemHtml);
	}
	else {
		// The desired date list does not exist, so create one
		var dateListHtml = context.parameter.dateHeaderHtmlBlock
			.replace(/{Date}/g, message.N)
			.replace(/{DayCode}/g, message.C);
		dateListHtml += itemHtml;
		dateListHtml += context.parameter.dateFooterHtmlBlock;
		if ($("div.message", wrapperDiv).size() > 0) {
			wrapperDiv.html(dateListHtml);
		}
		else {
			wrapperDiv.prepend(dateListHtml);
		}
		wrapperDiv.data("FirstDay", message.C);
	}
}


function Messages_ActivityMessageList_StatusTBOnFocus(control) {
	if (control.value == Messages_ActivityMessageList_DefaultStatusMessage)
		control.value = "";
}
function Messages_ActivityMessageList_StatusTBOnBlur(control) {
	if (control.value == "")
		control.value = Messages_ActivityMessageList_DefaultStatusMessage;
}

