﻿var browser = navigator.appName;
var CommentCollapseThreshold = 5;
var CurrentEventStreamPage = 0;
var EventStreamTarget = null;
var ShowNetworkEventStreamItems = true;
var ShowGlobalEventStreamItems = true;

var EndGetPlayerEventStream = function(response)
{
    if (!HandleCommonResults(response))
    {
        if (IsSuccessResult(response))
        {
            BuildEventStream(response);
        }
        else if (response.Result == "InvalidPageNumber")
        {
            alert("InvalidPageNumber");
        }
        else
        {
            UnknownResult(response);
        }
    }
}

function ChangeEventStreamPage(amount)
{
    CurrentEventStreamPage += amount;

    if (CurrentEventStreamPage > 0)
    {
        CommunityServices.GetPlayerEventStream(EventStreamTarget, ShowGlobalEventStreamItems, ShowNetworkEventStreamItems, CurrentEventStreamPage, EndGetPlayerEventStream, null);
    }
}

function ShowMoreEventStream()
{
    ChangeEventStreamPage(1);
}

/*
var x = document.createElement("div");
x.style.width = "960";
x.style.height = "100";
x.style.backgroundColor = "Aqua";
eventContainer.appendChild(x);
*/

function BuildEventStream(response)
{
    if (response.Events.length > 0)
    {
        var events = response.Events;
        var comments = response.Comments;

        SeparateEventComments(events, comments);

        var eventContainer = document.getElementById("eventContainer");

        for (var i = 0; i < events.length; i++)
        {
            var event = events[i];

            var eventBody = BuildEventBody(event);

            eventContainer.appendChild(eventBody);
        }
    }
    else
    {
        CurrentEventStreamPage--;
        document.getElementById("showMoreButtonContainer").innerHTML = "No more events to show!";
    }
}

function BuildEventBody(event)
{
    var feedItem = document.createElement("div");
    SetClass(feedItem, "feedItem");

    if (event.EventSourceType == "Broadcast")
    {
        feedItem.title = "WeMade";
    }
    else if (event.EventSourceType == "Game" && event.EventSourceName == "Mir III")
    {
        feedItem.title = "Mir3";
    }

    var feedItemHead = document.createElement("div");
    SetClass(feedItemHead, "feedItemHead");

    var feedItemBody = document.createElement("div");
    SetClass(feedItemBody, "feedItemBody");

    var feedItemFoot = document.createElement("div");
    SetClass(feedItemFoot, "feedItemFoot");

    var eventBody = document.createElement("div");
    SetClass(eventBody, "eventBody");

    feedItem.appendChild(feedItemHead);
    feedItem.appendChild(feedItemBody);
    feedItem.appendChild(feedItemFoot);

    var eventTableOuter = document.createElement("table");
    SetClass(eventTableOuter, "eventTable");
    eventBody.appendChild(eventTableOuter);

    var eventTable = document.createElement("tbody");
    SetClass(eventTable, "eventTable");
    eventTableOuter.appendChild(eventTable);

    event.EventTable = eventTable;

    var row1 = document.createElement("tr");
    eventTable.appendChild(row1);

    var eventAvatarColumn = document.createElement("td");
    SetClass(eventAvatarColumn, "eventAvatarColumn");
    eventAvatarColumn.rowSpan = "2";
    row1.appendChild(eventAvatarColumn);

    var eventSourceImage = document.createElement("img");
    SetAvatarImage(eventSourceImage, event);
    SetClass(eventSourceImage, "eventSourceImage");
    eventAvatarColumn.appendChild(eventSourceImage);

    var eventTextColumn = document.createElement("td");
    SetClass(eventTextColumn, "eventTextColumn");
    row1.appendChild(eventTextColumn);

    /* hack to solve feed comment bug, worked for ie 7 & 8 (but not the fox =) */
    var shim = document.createElement("img");
    shim.src = "images/themes/default/shim.gif";
    shim.style.height = "1";
    shim.style.width = "390";
    eventTextColumn.appendChild(shim);
    eventTextColumn.appendChild(document.createElement("br"));
    /**/

    var eventSourceName = document.createElement("a");
    SetClass(eventSourceName, "eventSourceName");
    CreateEventSourceLink(event, eventSourceName);
    eventSourceName.target = "_top";
    eventTextColumn.appendChild(eventSourceName);

    ParseEventLinks(event.EventDescription, eventTextColumn);
    ParseEventBody(event, eventTextColumn);

    var row2 = document.createElement("tr");
    eventTable.appendChild(row2);

    var eventDateColumn = document.createElement("td");
    SetClass(eventDateColumn, "eventDateColumn");
    row2.appendChild(eventDateColumn);

    var eventDate = document.createElement("span");
    SetClass(eventDate, "eventDate");
    eventDate.innerHTML = PrintEventDate(event) + "  ";
    eventDateColumn.appendChild(eventDate);

    event.LastCommentIndex = -1;

    var commentLink = document.createElement("img");
    SetClass(commentLink, "commentLink");
    commentLink.src = "images/themes/" + getTheme() + "/commentv6.png";
    commentLink.title = "Leave a comment";
    commentLink.alt = "Leave a comment";
    commentLink.Event = event;
    commentLink.onclick = CommentLinkClick;
    commentLink.style.cursor = "pointer";
    eventDateColumn.appendChild(document.createElement("br"));

    BuildPostCommentRow(event, commentLink);
    BuildEventComments(event);

    feedItemBody.appendChild(eventBody);
    feedItemFoot.appendChild(commentLink);    
    return feedItem;
}

function BuildPostCommentRow(event, commentLink)
{
    var eventTable = event.EventTable;

    var commentAddRow = document.createElement("tr");
    SetClass(commentAddRow, "commentAddRow");
    var commentAddColumn = document.createElement("td");
    //commentAddColumn.colSpan = "2";
    commentAddColumn.appendChild(document.createElement("br"));

    var commentTextbox = document.createElement("input");
    SetClass(commentTextbox, "commentTextbox");
    commentTextbox.type = "text";
    commentTextbox.maxLength = 512;
    commentTextbox.onkeydown = function(e)
    {
            if (e == null)
            {
                e = window.event;
            }

            var keyCode = e.keyCode;

            if (keyCode == null)
            {
                keyCode = e.which;
            }

            if (keyCode == 13)//enter key
            {
                PostComment(event, commentAddRow, commentTextbox);
            }
    };

    var wrapper = document.createElement("div");
    SetClass(wrapper, "commentTextBoxWrapper");
    wrapper.appendChild(commentTextbox);
    commentAddColumn.appendChild(wrapper);

    var shimCol = document.createElement("td");
    //shimCol.style.backgroundColor = "#fff";
    commentAddRow.appendChild(shimCol);
    commentAddRow.appendChild(commentAddColumn);

    var commentCancelButton = document.createElement("img");
    SetClass(commentCancelButton, "commentButton");
    commentCancelButton.src = "images/themes/" + getTheme() + "/button-cancel.png";
    commentCancelButton.alt = "Cancel";
    commentCancelButton.title = "Cancel";
    commentCancelButton.onclick = CancelComment;
    commentCancelButton.Event = event;
    commentCancelButton.CommentRow = commentAddRow;
    commentCancelButton.CommentText = commentTextbox;
    commentAddColumn.appendChild(commentCancelButton);

    var commentPostButton = document.createElement("img");
    SetClass(commentPostButton, "commentButton");
    commentPostButton.src = "images/themes/" + getTheme() + "/button-comment.png";
    commentPostButton.alt = "Comment";
    commentPostButton.title = "Comment";
    commentPostButton.onclick = function()
    {
        PostComment(event, commentAddRow, commentTextbox);
    };
    commentPostButton.Event = event;
    commentPostButton.CommentRow = commentAddRow;
    commentPostButton.CommentText = commentTextbox;
    commentAddColumn.appendChild(commentPostButton);

    eventTable.appendChild(commentAddRow);
    commentLink.CommentRow = commentAddRow;
    commentLink.CommentText = commentTextbox;
}

function PostComment(event, commentAddRow, commentTextbox)
{
    var commentText = commentTextbox.value;

    if (IsNullOrEmpty(commentText))
    {
        alert("Please enter a comment to share");
        commentTextbox.focus();

        return;
    }

    commentAddRow.style.display = "none";
    commentTextbox.value = "";

    CommunityServices.AddEventComment(event.EventId, commentText, EndAddEventComment, event);
};

//function PostComment(e)
//{
//    if (e == null)
//    {
//        e = window.event;
//    }

//    var commentPostButton = GetEventSource(e);
//    var event = commentPostButton.Event;
//    var commentAddRow = commentPostButton.CommentRow;
//    var commentTextbox = commentPostButton.CommentText;

//    var commentText = commentTextbox.value;

//    if (commentText == null || commentText.length < 1)
//    {
//        alert("Comment can not be blank.");
//        return;
//    }

//    commentAddRow.style.display = "none";
//    commentTextbox.value = "";

//    CommunityServices.AddEventComment(event.EventId, commentText, EndAddEventComment, event);
//}

function EndAddEventComment(response, event)
{
    if (!HandleCommonResults(response))
    {
        if (IsSuccessResult(response))
        {
            BuildEventComment(response.Comment, event, event.LastCommentIndex + 1);
        }
        else
        {
            UnknownResult(response);
        }
    }
}

function CancelComment(e)
{
    if (e == null)
    {
        e = window.event;
    }

    var commentCancelButton = GetEventSource(e);
    var event = commentCancelButton.Event;
    var commentAddRow = commentCancelButton.CommentRow;
    var commentTextbox = commentCancelButton.CommentText;

    commentAddRow.style.display = "none";
    commentTextbox.value = "";
}

function CommentLinkClick(e)
{
    if (e == null)
    {
        e = window.event;
    }

    var commentLink = GetEventSource(e);
    var event = commentLink.Event;
    var commentAddRow = commentLink.CommentRow;
    var commentTextbox = commentLink.CommentText;

    //commentAddRow.style.display = "block";
    //commentAddRow.style.display = "table-row"; /* hack to solve feed comment bug worked the fox (but broke both ie's) */

    if (browser == "Microsoft Internet Explorer") /* hack to solve feed comment bug, final component of solution */
    {
        commentAddRow.style.display = "block";
    } else
    {
        commentAddRow.style.display = "table-row"; // if firefox, use this display method, ftw
    }
    commentTextbox.focus();
}

function SetAvatarImage(img, event)
{
    if (event.SourceAvatarImagePath != null)
    {
        img.src = event.SourceAvatarImagePath;
        img.alt = event.EventSourceName;
    }
    else
    {
        img.src = NoImagePath;
        img.alt = "No Image";
    }
}

function CreateEventSourceLink(event, linkElement)
{
    if (event.EventSourceType == "Player" || event.EventSourceType == "Broadcast")
    {
        CreatePlayerLink(event.EventSourceName, linkElement);
    }
    else if (event.EventSourceType == "Character")
    {
        CreateCharacterLink(event.GameName, event.EventSourceName, event.EventSourceId, linkElement);
    }
    else if (event.EventSourceType == "Game")
    {
        CreateGameLink(event.GameName, event.EventSourceName, linkElement);
    }
    else if (event.EventSourceType == "Group")
    {
    }
}

function CreatePlayerLink(playerName, linkElement)
{
    linkElement.innerHTML = playerName;
    linkElement.href = "playerProfile.htm?name=" + playerName;
}

function CreateCharacterLink(gameName, characterName, characterId, linkElement)
{
    if (gameName == "Mir3")
    {
        linkElement.innerHTML = characterName;
        linkElement.href = "gameProfiles/mir3/characterProfile.htm?name=" + characterName;
    }
    else if (gameName == "Community")
    {
        linkElement.innerHTML = characterName;
        linkElement.href = "playerProfile.htm?name=" + characterName;
    }
}

function CreateGameLink(gameName, eventSourceName, linkElement)
{
    if (gameName == "Mir3")
    {
        linkElement.innerHTML = eventSourceName;
        linkElement.href = "gameProfiles/mir3";
    }
    else if (gameName == "Community")
    {
        linkElement.innerHTML = eventSourceName;
        linkElement.href = "playerHome.htm";
    }
}

function PrintEventDate(event)
{
    return GetRelativeDate(event.EventDate);
}

function ParseEventLinks(text, labelContainer)
{
    var transformedText = "";

    var linkEnd = 0;
    var linkStart = text.indexOf("{", linkEnd) + 1;

    if (linkStart > 0)
    {
        transformedText = text.substr(linkEnd, linkStart - linkEnd - 1);
    }
    else
    {
        transformedText = text.substr(linkEnd, text.length - linkEnd);
    }

    var labelChunk = document.createElement("span");
    SetInnerText(labelChunk, transformedText);
    labelContainer.appendChild(labelChunk);

    while (linkStart > 0)
    {
        linkEnd = text.indexOf("}", linkStart);
        var linkText = text.substr(linkStart, linkEnd - linkStart);

        var linkType = linkText.split(":")[0];
        var linkContent = linkText.split(":")[1];

        if (linkType == "Player")
        {
        	var strings = linkContent.split(",");

        	var playerName = strings[0];
        	var playerId = strings[1];

        	var link = document.createElement("a");
        	link.target = "_top";
        	CreateCharacterLink("Community", playerName, playerId, link);
        	labelContainer.appendChild(link);
        }
        else if (linkType == "Character")
        {
        	var strings = linkContent.split(",");

        	var gameName = strings[0];
        	var characterName = strings[1];
        	var characterId = strings[2];

        	var link = document.createElement("a");
        	link.target = "_top";
        	CreateCharacterLink(gameName, characterName, characterId, link);
        	labelContainer.appendChild(link);
        }
        else if (linkType == "Game")
        {
        	var strings = linkContent.split(",");

        	var gameName = strings[0];
        	var fullName = strings[1];

        	var link = document.createElement("a");
        	link.target = "_top";
        	CreateGameLink(gameName, fullName, link);
        	labelContainer.appendChild(link);
        }
        else if (linkType == "Url")
        {
        	var strings = linkContent.split(",");

        	var url = unescape(strings[0]);
        	var linkText = linkContent.substring(url.length + 1);

        	var link = document.createElement("a");
        	link.target = "_top";
        	link.href = url;
        	SetInnerText(link, linkText);
        	labelContainer.appendChild(link);
        }

        linkStart = text.indexOf("{", linkEnd) + 1;

        if (linkStart > 0)
        {
            transformedText = text.substr(linkEnd + 1, linkStart - linkEnd - 2);
        }
        else
        {
            transformedText = text.substr(linkEnd + 1, text.length - linkEnd);
        }

        labelChunk = document.createElement("span");
        SetInnerText(labelChunk, transformedText);
        labelContainer.appendChild(labelChunk);
    }
}

function SeparateEventComments(events, comments)
{
    var eventLookup = new Array();

    for (var i = 0; i < events.length; i++)
    {
        var event = events[i];

        eventLookup[event.EventId] = event;
    }

    for (var i = 0; i < comments.length; i++)
    {
        var comment = comments[i];
        var event = eventLookup[comment.EventId];

        if (event.Comments == null)
        {
            event.Comments = new Array();
        }

        event.Comments.push(comment);
    }
}

function BuildEventComments(event)
{
    if (event.Comments == null)
    {
        return;
    }

    var comments = event.Comments;
    var visibleIndex = 0;
    var collapseComments = comments.length > CommentCollapseThreshold;
	
    for (var i = 0; i < comments.length; i++)
    {
    	var comment = comments[i];

    	var isHidden = true;

    	if (!collapseComments || (i < 2 || i >= comments.length - 2))
    	{
    		isHidden = false;
    	}

    	if (collapseComments && i == 3)
    	{
    		//build a "show all comments" row
    	    BuildAllCommentsRow(event.EventTable, comments.length - CommentCollapseThreshold + 1);
    	}

    	BuildEventComment(comment, event, i, isHidden);
    }
}

function BuildEventComment(comment, event, visibleIndex, isHidden)
{
	var rowColorAlternator = "commentTableOdd";
	if (visibleIndex % 2 == 0)
	{
		rowColorAlternator = "commentTableEven";
	}
	var eventTable = event.EventTable;

	event.LastCommentIndex = visibleIndex;

	var eventRow = document.createElement("tr");
	eventRow.IsEventRow = true;
	
	if (isHidden)
	{
		eventRow.style.display = "none";
	}

	var eventAvatarColumn = document.createElement("td");
	var eventCommentColumn = document.createElement("td");
	eventRow.appendChild(eventAvatarColumn);
	eventRow.appendChild(eventCommentColumn);
	eventTable.appendChild(eventRow);

	var commentTable = document.createElement("table");
	SetClass(commentTable, rowColorAlternator);
	var commentTableBody = document.createElement("tbody");
	commentTable.appendChild(commentTableBody);
	eventCommentColumn.appendChild(commentTable);

	var commentRow = document.createElement("tr");
	SetClass(commentRow, "commentRow");
	commentTableBody.appendChild(commentRow);

	var avatarColumn = document.createElement("td");
	SetClass(avatarColumn, "commentAvatarColumn");
	avatarColumn.rowSpan = "2";
	commentRow.appendChild(avatarColumn);

	var avatarImage = document.createElement("img");
	SetClass(avatarImage, "commentAvatarImage");
	avatarImage.alt = comment.SenderName;

	if (comment.SenderImagePath != null)
	{
		avatarImage.src = comment.SenderImagePath;
	}
	else
	{
		avatarImage.src = NoImagePath;
	}

	avatarImage.width = 24;
	avatarImage.height = 24;
	avatarColumn.appendChild(avatarImage);

	var commentColumn = document.createElement("td");
	SetClass(commentColumn, "commentTextColumn");
	commentRow.appendChild(commentColumn);

	var commentSenderLabel = document.createElement("a");
	SetClass(commentSenderLabel, "commentSenderLabel");
	commentSenderLabel.target = "_top";
	CreateCharacterLink("Community", comment.SenderName, comment.SenderId, commentSenderLabel);
	commentColumn.appendChild(commentSenderLabel);

	var commentLabel = document.createElement("span");
	SetClass(commentLabel, "commentLabel");
	SetInnerText(commentLabel, comment.CommentText);
	commentColumn.appendChild(commentLabel);

	var dateRow = document.createElement("tr");
	SetClass(dateRow, "commentRow");
	commentTableBody.appendChild(dateRow);

	var dateColumn = document.createElement("td");
	SetClass(dateColumn, "commentDateColumn");
	dateRow.appendChild(dateColumn);

	var dateLabel = document.createElement("div");
	SetClass(dateLabel, "commentDateLabel");
	dateLabel.innerHTML = GetRelativeDate(comment.PostDate);
	dateColumn.appendChild(dateLabel);
}

function BuildAllCommentsRow(eventTable, numHiddenComments)
{
	var eventRow = document.createElement("tr");
	SetClass(eventRow, "showAllCommentsRow");
	
	var paddingColumn = document.createElement("td");
	eventRow.appendChild(paddingColumn);
	
	var showAllColumn = document.createElement("td");
	SetClass(showAllColumn, "showAllCommentsColumn");
	eventRow.appendChild(showAllColumn);

	var arrow = document.createElement("img");
	arrow.src = "images/themes/" + getTheme() + "/button-arrow-down.png";
	arrow.style.height = "25";
	arrow.style.width = "25";
	arrow.style.verticalAlign = "middle";
	arrow.setAttribute("title", "");
	
	var showAllCommentsLink = document.createElement("a");
	SetClass(showAllCommentsLink, "grayNavLink");
	showAllCommentsLink.onclick = ShowAllComments;
	showAllCommentsLink.innerHTML += "show " + numHiddenComments + " more comments...";
	showAllCommentsLink.setAttribute("title", 'show ' + numHiddenComments + ' more comments...');
	showAllColumn.appendChild(arrow);
	showAllColumn.appendChild(showAllCommentsLink);
	
	eventTable.appendChild(eventRow);
}

function ShowAllComments(e)
{
	if(e == null)
	{
		e = window.event;
	}
	
	var link = GetEventSource(e);
	//the comments table
	var container = link.parentNode.parentNode.parentNode;
	
	//iterate through the table rows
	for(var i = 3; i < container.childNodes.length; i++)
	{
		if(container.childNodes[i].IsEventRow)
		{
			container.childNodes[i].style.display = 'inline';
		}
	}
	
	//hide the 'show all' row
	link.parentNode.parentNode.style.display = 'none';
}

function ParseEventBody(event, container)
{
	if(event.EventType == "Community.Welcome")
	{
		var welcomeMessage = "Welcome to the beta test of the WeMade Community.  Get ready to do some community stuff and have lots of fun.  Just a reminder: this is an early beta, so you should expect the occasional deviation from perfection.  And please give us your <a href=\"feedback.htm\">feedback</a>!";
		container.innerHTML = welcomeMessage;
	}
	else if(event.EventType == "Poll.Created" || event.EventType == "Poll.Opened")
	{
		var poll = eval("(" + event.EventBody + ")");
		
		var questionLink = document.createElement("a");
		SetClass(questionLink, "eventStreamPollQuestion");
		questionLink.innerHTML = "<br/><br/>" + poll.PollQuestion;
		questionLink.href = "playerPoll.htm#" + poll.PollId;
		

		container.appendChild(questionLink);
		
		container.innerHTML += "<br/><br/>Be sure to click the link above and cast your vote to have a say in the future of your games!<br/><br/>Remember, you can always see all of the community polls by clicking the polls icon in the notification area of your player home page.";
	}		
	else if(event.EventType == "Poll.Closed")
	{
		var poll = eval("(" + event.EventBody + ")");
		
		var questionLink = document.createElement("a");
		SetClass(questionLink, "eventStreamPollQuestion");
		questionLink.innerHTML = "<br/><br/>" + poll.PollQuestion;
		questionLink.href = "pollDetails.htm?id=" + poll.PollId;

		container.appendChild(questionLink);
		
		container.innerHTML += "<br/><br/>Click above to see the results!<br/><br/>Remember, you can always see all of the community polls by clicking the polls icon in the notification area of your player home page.";
	}
	else if(event.EventType == "Achievement.Unlocked")
	{
		var achievement = eval("(" + event.EventBody + ")");

		container.innerHTML += "<br/><br/>";
		
		var achievementImage = document.createElement("img");
		SetClass(achievementImage, "eventAchievementImage");
		achievementImage.src = "images/achievements/" + achievement.GameName + "/" + GetAchievementImageName(achievement, "large");
		achievementImage.title = achievement.AchievementName;
		achievementImage.alt = achievement.AchievementName;
		container.appendChild(achievementImage);
		
		var achievementNameLabel = document.createElement("span");
		SetClass(achievementNameLabel, "eventAchievementNameLabel");
		achievementNameLabel.innerHTML = achievement.AchievementName + " ";
		container.appendChild(achievementNameLabel);

		var achievementPointsLabel = document.createElement("span");
		SetClass(achievementPointsLabel, "eventAchievementPointsLabel");
		achievementPointsLabel.innerHTML = " (+"+achievement.PointValue + " points)<br />";
		container.appendChild(achievementPointsLabel);		
		
		var achievementDescriptionLabel = document.createElement("span");
		SetClass(achievementDescriptionLabel, "eventAchievementDescriptionLabel");
		achievementDescriptionLabel.innerHTML = achievement.AchievementDescription;
		container.appendChild(achievementDescriptionLabel);
		
		
	}
}