/******************************************************
* Please include Helper.js file before using this script
******************************************************/


var wallItemTemplate = null;
var wallPostTemplate = null;
var wallSpecialTemplate = null;
var replyLinkText = null;
var replyTextBoxHeader = null;
var removeWallThreadFunction = null;
var removeWallItemFunction = null;
var submitRowTemplate = null;
var commentLinkTemplate = null;
var wallItemWidth = '293px';
var wallPostButtonText = null;

var plcPost = '[POST]';
var plcImage = '[IMAGE]';
var plcTime = '[TIME]';
var plcSID = '[SID]';
var plcUserName = '[USERNAME]';
var plcMessage = '[MESSAGE]';
var plcItemID = '[ITEMID]';
var WallOwner = 'false';

var specialMessages = ['*head*'];


//Yet to be used.
//If enter key is pressed, it triggers button click event
function PostOnEnter(buttonId, event) {
    var isEnter = IsEnterKey(event);

    if (true) {
        var button = $(JId(buttonId));

        if (button != null) {
            button.click();
            event.keyCode = 0;
        }
    }
}


function PostMessage(ownerId, posterId, posterName, wallId, textCtrl, parentCtrl, userImage, wallType, validatiorId, event) {
    //get text from text area
    var text = $(JId(textCtrl)).val();
    var eventArg = event || window.event;

    if (eventArg)
        var target = eventArg.target || eventArg.srcElement;

    if (text) {
        text = text.trim();
        text = EncodeText(text);
    }

    if (MatchSpecialMessages(text)) {
        //get appropriate template
        var template = GetSpecialPostTemplate(text);
        //construct full template
        var fullTemplate = wallItemTemplate.replace(plcPost, template);
        fullTemplate = ReplaceImage(fullTemplate, userImage);
        fullTemplate = fullTemplate.replace(plcUserName, posterName)
        $(JId(parentCtrl)).prepend(fullTemplate);
        RemoveInputText(textCtrl);
    }
    else {
        if (text && 0 != text.length) {
            var xmlInput = GetXmlInput(ownerId, posterId, wallId, text, wallType);

            $.ajax({
                type: "POST",
                url: "/Services/ContentServicePage.aspx",
                data: "method=PostMessage&xmlInput=" + xmlInput,
                error: function (XMLHttpRequest, textStatus, errorThrown) {

                    if (target) target.disabled = false;
                },
                success: function (xml) {

                    var threadPostId;
                    var itemID;
                    var sDateTime;
                    var isValid;
                    var validatior = document.all ? document.all[validatiorId] : document.getElementById(validatiorId);

                    //Get the thread Id from response
                    $(xml).find('output').each(function (i) {
                        threadPostId = $(this).find("threadId").text();
                    });

                    //Get the thread Id from response
                    $(xml).find('output').each(function (i) {
                        itemID = $(this).find("itemID").text();
                    });

                    //Get the thread Id from response
                    $(xml).find('output').each(function (i) {
                        itemText = $(this).find("itemText").text();
                    });

                    $(xml).find('output').each(function (i) {
                        sDateTime = $(this).find("datetime").text();
                    });

                    $(xml).find('output').each(function (i) {
                        isValid = $(this).find("isValid").text();
                    });
                    var valSummary = $("div[name='ValSummary']");
                    if (isValid && isValid == "True") {

                        //celebration wall
                        if (wallType == 1) {
                            HandleCommunityPost(parentCtrl, posterId, posterName, itemText, userImage, threadPostId, sDateTime);
                            RemoveInputText(textCtrl);
                        }
                        else {
                            AppendMessage(parentCtrl, posterId, posterName, itemText, userImage, threadPostId, sDateTime);
                            TruncateTable(parentCtrl, 5);
                            RemoveInputText(textCtrl);
                        }

                        validatior.isValid = true;
                        validatior.style.display = "none";
                        valSummary[0].style.display = "none";
                        valSummary[0].innerHTML = ""
                    }
                    else {
                        validatior.isValid = false;
                        validatior.style.display = "";
                        valSummary[0].style.display = "";
                        valSummary[0].innerHTML = validatior.errormessage;
                    }


                }, //end of success handler
                beforeSend: function (xml) {
                    if (target) target.disabled = true;
                }, //end of beforeSend handler
                complete: function (request, settings) {
                    if (target) target.disabled = false;
                } //end of complete handler
            });
        }
    }
}

function PostRichMessage(ownerId, posterId, posterName, wallId, textCtrl, parentCtrl, userImage, wallType, validatiorsIds, event) {
    var editor = $find(textCtrl);
    var text = editor.get_html();
    var eventArg = event || window.event;

    if (eventArg)
        var target = eventArg.target || eventArg.srcElement;

    if (text) {
        text = text.trim();
        text = EncodeText(text);
    }
    var maxLengthValidatior = document.all ? document.all[validatiorsIds[0]] : document.getElementById(validatiorsIds[0]);
    var emptyContentValidatior = document.all ? document.all[validatiorsIds[1]] : document.getElementById(validatiorsIds[1]);
    var xmlValidationValidatior = document.all ? document.all[validatiorsIds[2]] : document.getElementById(validatiorsIds[2]);
    ValidatorValidate(emptyContentValidatior);
    ValidatorValidate(maxLengthValidatior);
    ValidatorValidate(xmlValidationValidatior);
    var postIsValid = emptyContentValidatior.isvalid && maxLengthValidatior.isvalid && xmlValidationValidatior.isvalid;
    if (text && true == postIsValid) {
        var xmlInput = GetXmlInput(ownerId, posterId, wallId, text, wallType);

        $.ajax({
            type: "POST",
            url: "/Services/ContentServicePage.aspx",
            data: "method=PostRichMessage&xmlInput=" + xmlInput,
            error: function () {
                if (target) target.disabled = false;
            },
            success: function (xml) {
                var threadPostId;
                var itemID;
                var sDateTime;
                var validationError;

                //Get the thread Id from response
                $(xml).find('output').each(function () {
                    threadPostId = $(this).find("threadId").text();
                    itemID = $(this).find("itemID").text();
                    itemText = $(this).find("itemText").text();
                    sDateTime = $(this).find("datetime").text();
                    validationError = $(this).find("isValid").text();
                });
                if (validationError && 0 == validationError) {
                    AppendMessage(parentCtrl, posterId, posterName, itemText, userImage, threadPostId, sDateTime);
                    TruncateTable(parentCtrl, 5);
                    editor.set_html("");
                }
                else {
                    emptyContentValidatior.isvalid = !(validationError == 1);
                    maxLengthValidatior.isvalid = !(validationError == 2);
                    xmlValidationValidatior.isvalid = !(validationError == 3);
                    emptyContentValidatior.style.display = (false == emptyContentValidatior.isvalid) ? "" : "none";
                    maxLengthValidatior.style.display = (false == maxLengthValidatior.isvalid) ? "" : "none";
                    xmlValidationValidatior.style.display = (false == xmlValidationValidatior.isvalid) ? "" : "none";
                }
            }, //end of success handler
            beforeSend: function (xml) {
                if (target) target.disabled = true;
            }, //end of beforeSend handler
            complete: function (request, settings) {
                if (target) target.disabled = false;
            } //end of complete handler
        });
    }
}

//1. Creates a HTML post
//2. Gets all existing posts from page
//3. Builds a 2x3 (row x column) div tabular structure (without tables)
//4. Remove existing posts
//5. Append the new post structure to container div. This gives an illusion that latest post was appended to the top, when
//   in fact, the whole list is rebuilt.
function HandleCommunityPost(containerId, posterId, posterName, message, userImage, threadPostId, sDateTime) {
    //construct post --------
    //assign the post template
    wallItemTemplate = '<div class="celeb-wall-userinfo"><div class="celeb-wall-photo"><img style="border-width: 0px;" src="[IMAGE]" onmouseout="HideProfile();" onmouseover="DisplayProfile(event, this,[SID]);" class="small"></div><div class="celeb-wall-comment"><div class="wordWrap" style="width: 95px;"><a class="delete"  onclick="RemoveCelebrationWallMessage([ITEMID],this); return false;">x</a><br>[POST]</div></div></div>';
    //build the post message
    var latestPost = ConstructPost(posterId, posterName, message, userImage, threadPostId, sDateTime);
    //get existing posts from page
    var existingPosts = $("div.celeb-wall-userinfo");
    //construct a new row
    var newRow = '<div id="celebrate-wall-photocontainer">' + latestPost;

    var COMMUNITY_WALL_POSTS = 6;
    var COMMUNITY_WALL_COLUMNS = 3;
    var COMMUNITY_WALL_ROWS = GetCommunityWallRows(COMMUNITY_WALL_COLUMNS, COMMUNITY_WALL_POSTS);
    var rowCount = 0;
    var columnCount = 1;

    $.each(existingPosts, function (index, value) {
        if (rowCount < COMMUNITY_WALL_ROWS) {
            if (columnCount < COMMUNITY_WALL_COLUMNS) {
                newRow = newRow + '<div class=celeb-wall-userinfo>' + $(value).html() + '</div>';
                columnCount++;

            }
            else {
                //close present row
                columnCount = 1;
                newRow = newRow + '</div>';

                rowCount++;
                if (rowCount < COMMUNITY_WALL_ROWS) {
                    // start a new row
                    newRow = newRow + '<br clear="left" />' + '<div id="celebrate-wall-photocontainer">' + '<div class=celeb-wall-userinfo>' + $(value).html() + '</div>';
                }
                else {
                }
            }

        }
    }
    );

    //close the last row
    if (rowCount < COMMUNITY_WALL_ROWS) {
        newRow = newRow + '</div>';
    }

    //remove existing posts
    $(JId('celebrate-wall-container')).empty();
    //append new rows to container
    $(JId('celebrate-wall-container')).append(newRow);

}

function GetCommunityWallRows(numberColumns, numberPosts) {
    var numberOfRows = 0;

    if (numberPosts < numberColumns) {
        numberOfRows = 1;
    }
    else {
        numberOfRows = Math.ceil(numberPosts / numberColumns);
    }

    return numberOfRows;
}


function PostWallMessage(ownerId, posterId, posterName, threadId, replyItemId, textCtrl, containerId, userImage, wallType, event) {
    //get text from text area
    var text = $(JId(textCtrl)).val();
    var eventArg = event || window.event;

    if (eventArg)
        var target = eventArg.target || eventArg.srcElement;

    if (text) {
        text = text.trim();
        text = EncodeText(text);
    }


    if (text && 0 != text.length) {
        var xmlInput = GetXmlInput1(ownerId, posterId, threadId, replyItemId, text, wallType);

        $.ajax({
            type: "POST",
            url: "/Services/WallServicePage.aspx",
            data: "method=PostWallMessage&xmlInput=" + xmlInput,
            error: function (XMLHttpRequest, textStatus, errorThrown) {

                if (target) target.disabled = false;
            },
            success: function (xml) {

                var threadPostId
                var itemId;
                var sDateTime;
                var isValid;
                var validatior = document.all ? document.all[cvWallPostMaxLengthId] : document.getElementById(cvWallPostMaxLengthId);

                //Get the thread Id from response
                $(xml).find('output').each(function (i) {
                    threadPostId = $(this).find("threadId").text();
                });

                //Get the item Id from response
                $(xml).find('output').each(function (i) {
                    itemId = $(this).find("itemId").text();
                });

                //Get the item text from response
                $(xml).find('output').each(function (i) {
                    itemText = $(this).find("itemText").text();
                });

                $(xml).find('output').each(function (i) {
                    sDateTime = $(this).find("datetime").text();
                });

                $(xml).find('output').each(function (i) {
                    isValid = $(this).find("isValid").text();
                });

                var img = document.getElementsByName("imgUserImage");
                if (ownerId == posterId && img[0] != null) {
                    userImage = img[0].src;
                    WallOwner = 'true';
                }

                if (isValid && isValid == "True") {
                    validatior.isValid = true;
                    validatior.style.display = "none";
                    //A reply post will have thread id passed as parameter to method (not from reply result)	
                    //Handle reply post		
                    if (threadId.length != 0) {
                        var replyRow = CreateReplyRow(posterId, posterName, itemText, userImage, itemId, sDateTime);
                        AppendReplyRow(threadPostId, replyRow);
                        $(JId("commentOnPost" + threadId)).hide();
                    }
                    else {
                        //A thread post initially doesn't have thread id. Handle thread post
                        AppendThreadToWallPost(ownerId, posterId, posterName, threadPostId, itemText, userImage, itemId, sDateTime, wallType, containerId, cvWallPostMaxLengthId);
                    }
                    //clear text box
                    RemoveInputText(textCtrl);
                }
                else {
                    validatior.isValid = false;
                    validatior.style.display = "";
                }

            }, //end of success handler
            beforeSend: function (xml) {
                if (target) target.disabled = true;
            }, //end of beforeSend handler
            complete: function (request, settings) {
                if (target) target.disabled = false;
            } //end of complete handler
        });
    }
}

//Append Wall thread to wall post section
function AppendThreadToWallPost(ownerId, posterId, posterName, threadPostId, itemText, userImage, itemId, sDateTime, wallType, containerId, validatiorId) {
    var threadTable = CreateThreadRow(ownerId, posterId, posterName, threadPostId, itemText, userImage, itemId, sDateTime, wallType, containerId, validatiorId);
    AppendThreadRow(containerId, threadTable);
}

//constructs a new thread post html
function CreateThreadRow(ownerId, posterId, posterName, threadId, message, userImage, replyItemId, sDateTime, wallType, containerId, validatiorId) {
    var divTxtBoxCommentId = 'commentBox' + threadId;
    var textBoxCommentId = 'replyBox' + threadId;
    var rowTextBoxCommentId = threadId;

	var img = document.getElementsByName("imgUserImage");
    if (ownerId == posterId && img[0] != null) {
		userImage = img[0].src;
        WallOwner = 'true';
    }
	
    //build button post javascript		
    var onButtonClick = 'PostWallMessage(' + ownerId + ',' + posterId + ',\'' + posterName + '\',' + threadId + ',' + replyItemId + ',\'' + textBoxCommentId + '\',\'' + containerId + '\',\'' + userImage + '\',\'' + wallType + '\',\'' + validatiorId + '\', event);return false;';

    //build comment link "comment on this post"
    var commentLink = commentLinkTemplate.replace('[threadId]', threadId);
    commentLink = commentLink.replace('[divTxtBoxCommentId]', divTxtBoxCommentId);
    commentLink = commentLink.replace('[replyLinkText]', replyLinkText);

    //build text area events
    var events = 'onkeydown="if (IsEnterKey(event)) {' + onButtonClick + '} return true;"';
    //build text box row
    var submitRow = submitRowTemplate.replace('[rowTextBoxCommentId]', rowTextBoxCommentId);
    submitRow = submitRow.replace('[divTxtBoxCommentId]', divTxtBoxCommentId);
    submitRow = submitRow.replace('[replyTextBoxHeader]', replyTextBoxHeader);
    submitRow = submitRow.replace('[textBoxCommentId]', textBoxCommentId);
    submitRow = submitRow.replace('[onButtonClick]', onButtonClick);
    submitRow = submitRow.replace('[EVENTS]', events)
    submitRow = submitRow.replace('[wallPostButtonText]', wallPostButtonText)
    //overwrite wall template, which ConstructPost uses internally. Wall item template is assigned from server. Need to find a better way
    var deleteThread = '<a class="delete" onclick="' + removeWallThreadFunction.replace("[THREADID]", threadId) + '">x</a>';
    wallItemTemplate = '<tr><td><table width="100%" cellspacing="0" cellpadding="0" border="0" class="WallThreadPadding"><tbody><tr><td valign="top"><img id="imgAuthor" class="very-small" src="[IMAGE]" style="border-width: 0px;" onmouseout="HideProfile();" onmouseover="DisplayProfile(event, this,[SID]);" Owner="' + WallOwner + '"></td><td><div id="divPost">' + deleteThread + '<div class="wordWrap" style="width:[ItemWidth];">[POST]</div></div>' + commentLink + '</td></tr>' + submitRow + '</tbody></table></td></tr>';

    wallItemTemplate = wallItemTemplate.replace("[ItemWidth]", wallItemWidth);
    wallItemTemplate = wallItemTemplate.replace("[SID]", posterId);

    //build complete thread post html		
    var threadRow = ConstructPost(posterId, posterName, message, userImage, threadId, sDateTime);

    return threadRow;
}

//appends thread post html on top
function AppendThreadRow(containerId, threadTable) {
    var tb = $(JId(containerId));
    $(JId(containerId)).prepend(threadTable);

    //Apply max length script
    $("[maxlength][id!='']", threadTable).each(function () {
        $(JId(this.id)).maxLength($(this).attr("maxlength"))
    });
}

//constructs reply html
function CreateReplyRow(posterId, posterName, message, userImage, itemId, sDateTime) {

    var deleteItem = '<a class="delete" onclick="' + removeWallItemFunction.replace("[ITEMID]", itemId) + '">x</a>';
    //overwrite wall item template provided by resx
    wallItemTemplate = '<tr><td colspan="2"><div class="tab_wallcomments"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="top"><img id="imgAuthor" class="tiny" src="[IMAGE]" onmouseout="HideProfile();" onmouseover="DisplayProfile(event, this,[SID]);" style="border-width: 0px;" Owner="' + WallOwner + '"></td><td width="100%"><div id="divPost">' + deleteItem + '<div class="wordWrap" style="width: 293px;">[POST]</div></div></td></tr></tbody></table></div></td><tr>';
    wallItemTemplate = wallItemTemplate.replace("[SID]", posterId);
    //build complete reply post html
    var reply = ConstructPost(posterId, posterName, message, userImage, itemId, sDateTime);

    return reply;
}

//appends reply html before reply text box row
function AppendReplyRow(threadId, replyHtml) {

    $(replyHtml).insertBefore($(JId(threadId)));

}


function GetXmlInput1(ownerId, posterId, threadId, replyItemId, text, wallType) {
    var xmlInput = "<input><ownerId>" + ownerId + "</ownerId><posterId>" + posterId + "</posterId><threadId>" + threadId + "</threadId><replyItemId>" + replyItemId + "</replyItemId><message>" + text + "</message><wallType>" + wallType + "</wallType></input>";
    return xmlInput;
}



function RemoveInputText(ctrl) {
    $(JId(ctrl)).attr('value', '');
}

function GetXmlInput(ownerId, posterId, wallId, text, wallType) {
    var xmlInput = "<input><ownerId>" + ownerId + "</ownerId><posterId>" + posterId + "</posterId><wallId>" + wallId + "</wallId><message>" + text + "</message><wallType>" + wallType + "</wallType></input>";
    return xmlInput;
}

//TBD implement it like a hashtable
function GetSpecialPostTemplate(message) {
    return wallSpecialTemplate;
}

function MatchSpecialMessages(message) {
    var match = false;

    if (message != null) {
        message = message.toLowerCase();
    }

    if (specialMessages.indexOf(message) < 0) {
        match = false;
    }
    else {
        match = true;
    }
    return match;
}

//function to trim table containing messages
function TruncateTable(tableId, maxRows) {
    var rows = JId(tableId) + ' tbody tr[id=""]';
    var numberOfRows = $(rows).length;

    if (numberOfRows > maxRows) {
        $(JId(tableId) + ' tr:last[id=""]').next('tr[id="hRule"]').remove();
        $(JId(tableId) + ' tr:last[id=""]').remove();
    }
}

function AppendMessage(containerId, posterId, posterName, message, userImage, itemID, sDateTime) {
    var postHTML = ConstructPost(posterId, posterName, message, userImage, itemID, sDateTime);
    $(JId(containerId)).prepend(postHTML);
}

function JId(Id) {
    return "#" + Id;
}


function ConstructPost(posterId, posterName, message, userImage, itemID, sDateTime) {
    //construct full template
    var fullTemplate = wallItemTemplate.replace(plcPost, wallPostTemplate);
    //now replace placeholder with values
    fullTemplate = ReplaceImage(fullTemplate, userImage);
    fullTemplate = fullTemplate.replace(plcTime, sDateTime);
    //3 times because global regex replace is not working
    fullTemplate = fullTemplate.replace(plcSID, posterId);
    fullTemplate = fullTemplate.replace(plcSID, posterId);
    fullTemplate = fullTemplate.replace(plcSID, posterId);
    fullTemplate = fullTemplate.replace(plcUserName, posterName);
    fullTemplate = fullTemplate.replace(plcMessage, message);
    fullTemplate = fullTemplate.replace(plcItemID, itemID);
    return fullTemplate;
}

function ReplaceImage(template, userImage) {
    if (userImage.length == 0) {
        userImage = GetDefaultProfileImage();
    }
    template = template.replace(plcImage, userImage);
    return template;
}



function RegisterWallAttributes(itemTemplate, postTemplate, commentLinkText, commentTextBoxHeader, specialPostTemplate) {
    wallItemTemplate = itemTemplate;
    wallPostTemplate = postTemplate;
    replyLinkText = commentLinkText;
    replyTextBoxHeader = commentTextBoxHeader;
    wallSpecialTemplate = specialPostTemplate;
}

function RemoveWallMessage(threadId, ancRemoveObj) {
    var xmlInput = GetRemoveWallXmlInput(threadId);
    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=RemoveWallMessage&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) {

        },
        success: function (xml) {
            var trObj = ancRemoveObj.parentNode.parentNode.parentNode;
            HidePost(trObj);
        } //end of success handler
    });
}

function RemoveCelebrationWallMessage(threadId, ancRemoveObj) {
    var xmlInput = GetRemoveWallXmlInput(threadId);
    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=RemoveWallMessage&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) {

        },
        success: function (xml) {

            location.reload(true);
        } //end of success handler
    });
}

function GetRemoveWallXmlInput(threadId) {
    var xmlInput = "<input><threadId>" + threadId + "</threadId></input>";
    return xmlInput;
}

function HidePost(trObj) {
    var tBody = trObj.parentNode;
    var trRule = trObj.nextSibling;
    if (trRule.id != "hRule")
        trRule = trRule.nextSibling;
    tBody.removeChild(trObj);
    tBody.removeChild(trRule);
}

function HideCelebrationWallPost(trObj) {
    var tBody = trObj.parentNode;
    tBody.removeChild(trObj);
}

/* 
****************************************************
****************************************************
****************************************************
Status Update Functions 
****************************************************
****************************************************
****************************************************
*/
function SetUserStatus(ownerSid, textStatusCtrl, updateFlag) {
    //get status from text area
    var msgStatus = $(JId(textStatusCtrl)).val();

    if (msgStatus.length == 0)
        return;
    else {
        msgStatus = EncodeText(msgStatus);
    }

    var xmlInput = GetStatusXmlInput(ownerSid, msgStatus);

    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=SetUserStatus&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + " " + errorThrown); },
        success: function (xml) {
            var time;
            $(xml).find('output').each(function (i) {
                msgStatus = $(this).find("status").text();
                time = $(this).find("time").text();
                wallThreadPostId = $(this).find("wallThreadId").text();
                wallItemId = $(this).find("wallItemId").text();
            });
            UpdateStatus(msgStatus, time, updateFlag, textStatusCtrl);

            //status update also creates a wall thread except when status string is empty spaces.
            if (wallThreadPostId != 0) {
                if (typeof (AppendStatusToWall) == "function") {
                    AppendStatusToWall(wallThreadPostId, wallItemId, msgStatus, time, cvWallPostMaxLengthId);
                }

                if (typeof (TruncateWallPosts) == "function") {
                    var maxRows = TruncateWallPosts();

                    var rows = $("#tblWallPosts > tbody > tr");
                    var numberOfRows = $(rows).length;

                    if (numberOfRows > maxRows) {
                        $("#tblWallPosts > tbody > tr:last-child").remove();
                    }
                }
            }
        } //end of success handler
    });
}

function GetStatusXmlInput(ownerSid, msgStatus) {
    var xmlInput = "<input><ownerSid>" + ownerSid + "</ownerSid><status>" + msgStatus + "</status></input>";
    return xmlInput;
}

function UpdateStatus(message, time, updateProfileStatus, txtStatusID) {
    //updating status literals
    var txtStatus = document.getElementById(txtStatusID);
    var lblUserStatus = document.getElementById("divUserStatus");
    var lblMyStatus = document.getElementById("divMyStatus");
    var divNoStatus = document.getElementById("divNoStatus");
    var widgetTime = document.getElementById("widgetTime");

    if (message != "") {
        if (divNoStatus) {
            divNoStatus.innerHTML = message;
            TruncateStatus("divNoStatus");
            widgetTime.innerHTML = time;
            widgetTime.style.display = "inline";
        }
        if (updateProfileStatus) {
            if (lblUserStatus) {
                lblUserStatus.innerHTML = message;
                widgetTime.style.display = "inline";
            }
        }
        if (lblMyStatus) {
            lblMyStatus.innerHTML = message;
            TruncateStatus("divMyStatus");
            widgetTime.innerHTML = time;
            widgetTime.style.display = "inline";
        }
        SetStatusClearButton(true);
    }
    txtStatus.value = "";
}

function TruncateStatus(ControlID) {
    var status = $(JId(ControlID)).html();
    var textToShow, textToHide;
    if (status != null) {
        if (status.length <= 50) {
            return;
        }
        else {
            textToShow = status.substring(0, 50);
            textToHide = status.substring(50, status.length);
            $(JId(ControlID)).html(StatusTemplate(textToShow, textToHide));
        }
    }
}

function StatusTemplate(textToShow, textToHide) {
    var template = textToShow + "<span id=\"moreStatus\" style=\"display:none;\">" + textToHide + "</span> <a id=\"moreStatusLink\" href=\"#\" onclick=\"ExpandCollapseStatus(); return false; \">more</a>";
    return template;
}

function ExpandCollapseStatus() {
    if ($("#moreStatus").length > 0 && $("#moreStatus")[0].style.display != 'none') {
        $("#moreStatus").hide();
        $("#moreStatusLink").text("more");
    }
    else {
        $("#moreStatus").show();
        $("#moreStatusLink").text("close");
    }
}

function AppendToWallPost(message, time) {
    if (wallPostTemplate)
        $("#tblWallPosts > tbody").prepend("<tr><td>asdasdasd</td></tr>");
}

/* 
****************************************************
****************************************************
****************************************************
Token Functions 
****************************************************
****************************************************
****************************************************
*/
function RemoveToken(socialIdentityTokenID, TablesName, ancRemoveObj) {

    var xmlInput = GetTokenXmlInput(socialIdentityTokenID);

    $.ajax({
        type: "POST",
        url: "/Services/UserServicePage.aspx",
        data: "method=RemoveToken&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + " " + errorThrown); },
        success: function (xml) {

            var trObj = ancRemoveObj.parentNode.parentNode.parentNode.parentNode.parentNode
            var tbByname = document.getElementsByName(TablesName);

            HideTokens(tbByname, trObj, socialIdentityTokenID);

        } //end of success handler
    });

}

function GetTokenXmlInput(socialIdentityTokenID) {
    var xmlInput = "<input><socialIdentityTokenID>" + socialIdentityTokenID + "</socialIdentityTokenID></input>";
    return xmlInput;
}

function MoveUpTokenRow(divTablesID, lnkRemoveID) {
    var divTables = document.getElementById(divTablesID);
    var tables = divTables.getElementsByTagName('table');
    var lnkRemoveElement = document.getElementById(lnkRemoveID);
    var tableTokens;
    var tableTokensMore;
    //workaround - since this widget can appear more than once on the page
    for (i = 0; i < tables.length; i++) {
        if (tables[i].id == "tableTokens") {
            tableTokens = tables[i];
        }
        else if (tables[i].id == "tableTokensMore") {
            tableTokensMore = tables[i];
        }
    }

    if (tableTokensMore.rows.length > 0) {
        var newRow = tableTokensMore.rows[0];
        var tBody = tableTokens.getElementsByTagName('tbody')[0];
        tBody.appendChild(newRow);
    }
    //hide this token
    lnkRemoveElement.parentNode.parentNode.parentNode.style.display = "none";

}
function HideTokens(tbByname, trObj, TokenID) {
    if (trObj.rowIndex == 0) {
        var tBody = tbByname;
        for (var i = 0; i < tBody.length; i++) {
            if (tbByname[i].getElementsByTagName('tbody')[0].innerHTML.indexOf(TokenID) > -1) {
                tBody[i].getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0].style.display = "none";
            }
            //remove see more since it is the last row
            $(JId('divTokenSeeAll')).remove();

        }
        $("#tokenSeparator").hide();
    }
    else {
        var tBody = trObj.parentNode;
        tBody.removeChild(trObj);
    }
}

/* 
****************************************************
****************************************************
****************************************************
Start a new group thread popup
****************************************************
****************************************************
****************************************************
*/
function JoinLeave(sId, action, type, url, elementId, caption, showLeavelink, numberOfParticipantsElement, containerElementId, hideContainerOnLeaving, pendingRequestCaption) {

    var xmlInput = GetJoinLeaveXmlInput(sId, action, type);

    var link = document.getElementById(elementId);

    var numberOfParticipantsLabel = document.getElementById(numberOfParticipantsElement);

    if (link) { link.href = "javascript:;"; }

    $.ajax({
        type: "POST",
        url: "/Services/GroupServicePage.aspx",
        data: "method=JoinLeave&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + " " + errorThrown); },
        success: function (xml) {

            var connectionStatus;

            $(xml).find('output').each(function (i) {
                connectionStatus = $(this).find("connectionStatus").text();

            });

            if (connectionStatus == "Confirmed" && url != "") {
                window.location = url;
            }
            else {
                if (connectionStatus == "Confirmed") {
                    if (showLeavelink && showLeavelink == true) {
                        if (action == "Join" || action == "Invited") {
                            link.href = "javascript:JoinLeave('" + sId + "','Leave','" + type + "','','" + elementId + "','" + link.innerHTML + "', " + showLeavelink + ",'" + numberOfParticipantsElement + ",'" + containerElementId + "'," + hideContainerOnLeaving + ")";
                            link.innerHTML = caption;
                        }
                    }
                    else {
                        link.style.display = "none";
                        var div = document.createElement('div');
                        div.innerHTML = caption;
                        link.parentNode.insertBefore(div, link);
                    }
                    if (action == "Join" && numberOfParticipantsLabel != null) {
                        numberOfParticipantsLabel.innerHTML = parseInt(numberOfParticipantsLabel.innerHTML) + 1;
                    }
                }
                else if (connectionStatus == "All") {
                    if (action == "Leave") {

                        if (hideContainerOnLeaving) {
                            $(JId(containerElementId)).hide();
                        }
                        else {
                            link.href = "javascript:JoinLeave('" + sId + "','Join','" + type + "','','" + elementId + "','" + link.innerHTML + "', " + showLeavelink + ",'" + numberOfParticipantsElement + ",'" + containerElementId + "'," + hideContainerOnLeaving + ")";
                            link.innerHTML = caption;

                            if (numberOfParticipantsLabel != null) {
                                numberOfParticipantsLabel.innerHTML = parseInt(numberOfParticipantsLabel.innerHTML) - 1;
                            }
                        }
                    }

                }
                else {
                    var div = document.getElementById("popup");
                    if (div) {
                        div.innerHTML = document.getElementById("hdnRequestedMessage").value;
                        var memberMsg = document.getElementById("hdnRequestedMessage").value;
                        document.getElementById("hdnVisMessage").value = memberMsg;
                    }
                    if (link) {
                        link.style.display = "none";
                        var div = document.createElement('div');
                        div.innerHTML = pendingRequestCaption;
                        link.parentNode.insertBefore(div, link);
                        // link.innerHTML = ContentService_LocResources["ltlRequested"];
                        //Commented during merge. Please check.
                    }
                    UpdateJoinLinks();
                }
            }
        }

    });

}


function GetJoinLeaveXmlInput(sId, action, type) {
    var xmlInput = "<input><sId>" + sId + "</sId><action>" + action + "</action><type>" + type + "</type></input>";
    return xmlInput;
}

/* 
****************************************************
****************************************************
****************************************************
Challenge Check-In Question Update Functions 
****************************************************
****************************************************
****************************************************
*/
function SetCheckInQuestion(challengeId, textQuestionCtrl, questionLabel) {
    //get status from text area
    var msgQuestion = $(JId(textQuestionCtrl)).val();

    if (msgQuestion.length == 0)
        return;
    else {
        msgQuestion = EncodeText(msgQuestion);
    }

    var xmlInput = GetCheckInQuestionXmlInput(challengeId, msgQuestion);

    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=SetCheckInQuestion&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textQuestion, errorThrown) { alert(textQuestion + " " + errorThrown); },
        success: function (xml) {
            $(xml).find('output').each(function (i) {
                msgQuestion = $(this).find("question").text();
            });
            UpdateCheckInQuestion(msgQuestion, textQuestionCtrl);

        } //end of success handler
    });
}

function GetCheckInQuestionXmlInput(challengeId, msgQuestion) {
    var xmlInput = "<input><challengeId>" + challengeId + "</challengeId><question>" + msgQuestion + "</question></input>";
    return xmlInput;
}

/* 
****************************************************
****************************************************
****************************************************
Clear Status Functions 
****************************************************
****************************************************
****************************************************
*/
function ClearUserStatus(ownerSid, updateFlag, txtStatusId, lnkBtnEditSaveID, editText) {

    HideStatusTextBox(txtStatusId, lnkBtnEditSaveID, editText);
    var noStatusMsg = document.getElementById("hdnStatusMsg").value;
    var oldStatus = GetCurrentUserStatus(noStatusMsg);
    if (oldStatus == "") { return; }

    var msgStatus = "";

    var xmlInput = GetStatusXmlInput(ownerSid, msgStatus);

    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=SetUserStatus&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, txtStatusId, errorThrown) { alert(txtStatusId + " " + errorThrown); },
        success: function (xml) {
            ClearStatus(updateFlag, noStatusMsg);

        } //end of success handler
    });
}

function GetStatusXmlInput(ownerSid, msgStatus) {
    var xmlInput = "<input><ownerSid>" + ownerSid + "</ownerSid><status>" + msgStatus + "</status></input>";
    return xmlInput;
}

function ClearStatus(updateProfileStatus, noStatusMsg) {
    var lblUserStatus = document.getElementById("divUserStatus");
    var lblMyStatus = document.getElementById("divMyStatus");
    var divNoStatus = document.getElementById("divNoStatus");

    if (divNoStatus) { divNoStatus.innerHTML = noStatusMsg; }
    if (updateProfileStatus == true) {
        if (lblUserStatus) { lblUserStatus.innerHTML = ""; }
    }
    if (lblMyStatus) { lblMyStatus.innerHTML = noStatusMsg; }
    HideTimeSpans(updateProfileStatus);

    //hide clear buttons
    SetStatusClearButton(false);

}

//Sets the visibility of status clear buttons
function SetStatusClearButton(visibile) {
    if (visibile) {
        $("*[name='divBtnStatusClear']").show();
    }
    else {
        $("*[name='divBtnStatusClear']").hide();
    }
}


function GetCurrentUserStatus(noStatusMsg) {
    var status = "";
    var lblMyStatus = document.getElementById("divMyStatus");
    var divNoStatus = document.getElementById("divNoStatus");
    if (divNoStatus) {
        status = divNoStatus.innerHTML;
        if (divNoStatus.innerHTML.trim() == noStatusMsg) { status = ""; }
    }
    else {
        if (lblMyStatus) { status = lblMyStatus.innerHTML; }
    }
    return status;
}

function HideStatusTextBox(txtStatus, lnkBtnEditSaveID, editText) {
    var txtStatus = document.getElementById(txtStatus);
    var lnkBtnEditSave = document.getElementById(lnkBtnEditSaveID);
    if (txtStatus) {
        txtStatus.style.display = 'none';
        txtStatus.value = "";
    }
    if (lnkBtnEditSave.innerHTML != editText) { lnkBtnEditSave.innerHTML = editText; }
}

function HideTimeSpans(updateProfileStatus) {
    var profileTime = document.getElementById("profileTime");
    var widgetTime = document.getElementById("widgetTime");
    if (profileTime) {
        if (updateProfileStatus == "true") { profileTime.style.display = "none"; }
    }
    if (widgetTime) { widgetTime.style.display = "none"; }
}

/* 
****************************************************
****************************************************
****************************************************
Weights Update Functions 
****************************************************
****************************************************
****************************************************
*/
function UpdateUserWeights(sid, txtStartWeightCtrl, txtCurrentWeightCtrl, txtGoalWeightCtrl, lnkEditWeightID, saveText) {

    var lnkEditWeight = document.getElementById(lnkEditWeightID);
    var startWeight = $(JId(txtStartWeightCtrl)).val();
    var currentWeight = $(JId(txtCurrentWeightCtrl)).val();
    var goalWeight = $(JId(txtGoalWeightCtrl)).val();

    if (lnkEditWeight.innerHTML != saveText) { return; }
    if (typeof (Page_ClientValidate) == 'function') { Page_ClientValidate(); }
    if (!Page_IsValid) { return }

    var xmlInput = GetWightXmlInput(sid, startWeight, currentWeight, goalWeight);

    $.ajax({
        type: "POST",
        url: "/Services/UserServicePage.aspx",
        data: "method=UpdateUserWeights&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, sid, errorThrown) { alert(sid + " " + errorThrown); },
        success: function (xml) {
            UpdateWeightLable(startWeight, currentWeight, goalWeight, lnkEditWeightID);

        } //end of success handler
    });
}

function GetWightXmlInput(sid, startWeight, currentWeight, goalWeight) {
    var xmlInput = "<input><sid>" + sid + "</sid><startWeight>" + startWeight + "</startWeight><currentWeight>" + currentWeight + "</currentWeight><goalWeight>" + goalWeight + "</goalWeight></input>";
    return xmlInput;
}

function UpdateWeightLable(startWeight, currentWeight, goalWeight, lnkEditWeightID) {
    $("#editWeightDiv").hide();
    if (startWeight == 0 && currentWeight == 0 && goalWeight == 0) {
        $("#weightsDiv").hide();
        $("#lnkEditWeightDivOuter").hide();
        $(JId(lnkEditWeightID)).hide();
    }
    else {
        document.getElementById("weightsDiv").innerHTML = startWeight + " / " + currentWeight + " / " + goalWeight;
    }
}

function UpdateProfileImage(dialogId, newImageSrc, newImageId) {
    var dialogElement = $(JId(dialogId));
    $.ajax({
        type: "POST",
        url: "/Services/UserServicePage.aspx",
        data: "method=UpdateProfileImage&xmlInput=<input><imageId>" + newImageId + "</imageId></input>",
        success: function (xml) {
            if (dialogElement && dialogElement.dialog('isOpen') == true)
                dialogElement.dialog('close');
            $("img[name='imgUserImage']").each(function () { $(this).attr('src', newImageSrc) });
        } //end of success handler
    });
}


/* 
****************************************************
****************************************************
****************************************************
Album Photos Functions 
****************************************************
****************************************************
****************************************************
*/
function GetAlbumPhotos(sid, imagesCount, lnkPrevious, lnkNext, template, ownerId, isClosed) {
    if ($("#" + GetImagesContainerID() + " td:visible:last")[0] != $("#" + GetImagesContainerID() + " td:last")[0]) {
        GetNextImages(imagesCount, lnkPrevious, lnkNext);
        return;
    }

    var images = new Array();
    var startIndex = $("#" + GetImagesContainerID() + " td").length + 1;
    var count = startIndex + imagesCount;
    var xmlInput = GetPhotoAlbumXmlInput(sid, startIndex, count);

    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=GetPhotoGallery&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + " " + errorThrown); },
        success: function (xml) {
            $(xml).find('output').find('Image').each(function (i) {
                var threadId = $(this).find("ThreadId").text();
                var caption = $(this).find("ImageCaption").text();
                var canRemove = $(this).find("CanRemove").text();
                var autehrName = $(this).find("AutherName").text();
                var canReport = $(this).find("CanReport").text();
                var originalImageUrl = '';
                var mediumImageUrl = '';

                if (isClosed == "true")
                    canRemove = "false";

                $(this).find("Thumbnail").each(function (j) {
                    var size = $(this).find("SizeTypeId").text();
                    if (size == 1)
                        originalImageUrl = $(this).find("DownloadUrl").text();
                    else if (size == 3)
                        mediumImageUrl = $(this).find("DownloadUrl").text();
                });

                image = new ImageObject(threadId, originalImageUrl, mediumImageUrl, caption, canRemove, autehrName, canReport);
                images.push(image);

            });

            $("#" + GetImagesContainerID() + " td").hide();
            var endIndex = images[imagesCount] == null ? images.length : images.length - 1;
            var imageTemplate = "";
            for (var i = 1; i <= endIndex; i++) {
                imageTemplate = imageTemplate + GetImageTemplate(images[(i - 1)], template);
                if (i % 5 == 1) {
                    imageTemplate = '<tr>' + imageTemplate;
                }
                if (i % 5 == 0 || i == endIndex) {
                    imageTemplate = imageTemplate + '</tr>';
                    $("#" + GetImagesContainerID()).append(imageTemplate);
                    imageTemplate = "";
                }
            }

            if (images[imagesCount] == null) {
                $("#" + GetImagesContainerID() + " td:last").attr("last", "true");
                $(JId(lnkNext)).hide();
                $.photoGallery.GetNextImages(false, imagesCount, lnkNext, lnkPrevious, isClosed);
            }

            $(JId(lnkPrevious)).show();
            $.photoGallery.updateImages($(".gallery a[rel^='photoGallery']"));
            $.photoGallery.GetPreviousImages(true);

        } //end of success handler
    });
}

function GetPhotoAlbumXmlInput(sid, index, count) {
    var xmlInput = "<input><GalleryOwnerId>" + sid + "</GalleryOwnerId><StartIndex>" + index + "</StartIndex><EndIndex>" + count + "</EndIndex></input>";
    return xmlInput;
}

function ImageObject(threadId, originalImageUrl, mediumImageUrl, caption, canRemove, autherName, canReport) {
    this.ThreadId = threadId;
    this.OriginalImageUrl = originalImageUrl;
    this.MediumImageUrl = mediumImageUrl;
    this.Caption = caption;
    this.CanRemove = canRemove;
    this.AutherName = autherName;
    this.CanReport = canReport;
}

function GetImageTemplate(image, template) {
    var itemTemplate = template;

    itemTemplate = itemTemplate.replace("[ThreadId]", image.ThreadId);
    itemTemplate = itemTemplate.replace("[OriginalImageUrl]", image.OriginalImageUrl);
    itemTemplate = itemTemplate.replace("[MediumImageUrl]", image.MediumImageUrl);
    itemTemplate = itemTemplate.replace("[Caption]", image.Caption);
    itemTemplate = itemTemplate.replace("[Caption]", image.Caption);
    itemTemplate = itemTemplate.replace("[CanRemove]", image.CanRemove);
    itemTemplate = itemTemplate.replace("[AutherName]", image.AutherName);
    itemTemplate = itemTemplate.replace("[CanReport]", image.CanReport);
    itemTemplate = itemTemplate.replace("[Title]", image.Caption);
    itemTemplate = itemTemplate.replace("[Alt]", image.Caption);

    return itemTemplate;
}

function GetPreviousImages(imagesCount, lnkPrevious, lnkNext) {
    var startIndex = $.inArray($("#" + GetImagesContainerID() + " td:visible")[0], $("#" + GetImagesContainerID() + " td"));
    var endIndex = startIndex - imagesCount;

    if (!startIndex <= 0) {
        $("#" + GetImagesContainerID() + " td").hide();

        for (var i = startIndex; i > endIndex; i--) {
            $($("#" + GetImagesContainerID() + " td")[i - 1]).show();
        }

        if (endIndex == 0) {
            $(JId(lnkPrevious)).hide();
            $.photoGallery.GetPreviousImages(false);
        }
    }

    $(JId(lnkNext)).show();
    $.photoGallery.GetNextImages(true, imagesCount, lnkNext, lnkPrevious);
}

function GetNextImages(imagesCount, lnkPrevious, lnkNext) {
    var startIndex = $.inArray($("#" + GetImagesContainerID() + " td:visible")[imagesCount - 1], $("#" + GetImagesContainerID() + " td")) + 1;
    var endIndex = startIndex + imagesCount;

    $("#" + GetImagesContainerID() + " td").hide();

    if ($("#" + GetImagesContainerID() + " td")[endIndex] == null) {

        endIndex = $("#" + GetImagesContainerID() + " td").length;

        for (var i = startIndex; i < endIndex; i++) {
            $($("#" + GetImagesContainerID() + " td")[i]).show();
        }

        if ($("#" + GetImagesContainerID() + " td:last").attr("last") == "true") {
            $(JId(lnkNext)).hide();
            $.photoGallery.GetNextImages(false, imagesCount, lnkNext, lnkPrevious);
        }
    }
    else {
        for (var i = startIndex; i < endIndex; i++) {
            $($("#" + GetImagesContainerID() + " td")[i]).show();
        }
    }

    $.photoGallery.GetPreviousImages(true);
    $(JId(lnkPrevious)).show();
}

/* 
****************************************************
****************************************************
****************************************************
UpdateHelpfulVotes Functions 
****************************************************
****************************************************
****************************************************
*/
function UpdateHelpfulVotes(threadId, spanHelpfulVotesId, divHelpfulLinkId, divVotesCountId) {
    var xmlInput = GetUpdateHelpfulVotesXmlInput(threadId);
    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=UpdateHelpfulVotes&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + " " + errorThrown); },
        success: function (xml) {
            UpdateHelpfulNumber(spanHelpfulVotesId, divHelpfulLinkId, divVotesCountId);
        } //end of success handler
    });
}

function GetUpdateHelpfulVotesXmlInput(threadId) {
    var xmlInput = "<input><threadId>" + threadId + "</threadId></input>";
    return xmlInput;
}

function UpdateHelpfulNumber(spanHelpfulVotesId, divHelpfulLinkId, divVotesCountId) {
    var spanHelpfulVotes = document.getElementById(spanHelpfulVotesId);
    var divHelpfulLink = document.getElementById(divHelpfulLinkId);
    var intCount = 0;
    if (spanHelpfulVotes.innerHTML != "") {
        intCount = parseInt(spanHelpfulVotes.innerHTML);
    }
    spanHelpfulVotes.innerHTML = intCount + 1;
    $("#" + divVotesCountId).attr('style', 'display:block');
    divHelpfulLink.innerHTML = "You found this review helpful.";
}

/* 
****************************************************
****************************************************
****************************************************
GetThreadsByAuthorId Functions 
****************************************************
****************************************************
****************************************************
*/
function GetThreadsByAuthorId(sId, sortOptions, offSet, pageSize) {
    var xmlInput = GetThreadsByAuthorIdXmlInput(sId, sortOptions, offSet, pageSize);
    var ratings = new Array();
    var AuthorName = "";
    var TotalCount = "0";
    $.ajax({
        type: "POST",
        url: "/Services/ContentServicePage.aspx",
        data: "method=GetAuthorRecipeReviews&xmlInput=" + xmlInput,
        error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + " " + errorThrown); },
        success: function (xml) {
            $(xml).find('output').find('Threads').find('Thread').each(function (i) {
                var ID = $(this).find("ID").text();
                var AuthorSID = $(this).find("AuthorSID").text();
                var ReviewText = $(this).find("ReviewText").text();
                var RatingValue = $(this).find("RatingValue").text();
                var HelpfulVotes = $(this).find("HelpfulVotes").text();
                var IsVoted = $(this).find("IsVoted").text();
                var ContentName = $(this).find("ContentName").text();
                var ContentImageUrl = $(this).find("ContentImageUrl").text();
                var ContentId = $(this).find("ContentId").text();
                var RatingAverage = $(this).find("RatingAverage").text();
                var RatingCount = $(this).find("RatingCount").text();
                var CreationDate = $(this).find("CreationDate").text();
                AuthorName = $(this).find("AuthorName").text();
                var IsPostedBeforePV2 = $(this).find("IsPostedBeforePV2").text();

                rating = new RatingObject(ID, AuthorSID, ReviewText, RatingValue, HelpfulVotes, IsVoted, ContentName, ContentImageUrl, ContentId, RatingAverage, RatingCount, CreationDate, AuthorName, IsPostedBeforePV2);
                ratings.push(rating);
            });

            $(xml).find('output').each(function (i) {
                TotalCount = $(this).find("TotalCount").text();
            });

            var pageCount = GetPageCount(TotalCount, pageSize);

            if (ratings.length > 0) {
                $("#ratingsContainer").show();
                $("#divPaging").show();

                //append paging
                var ratingTemplate = "";
                var pagingTemplate = "";

                $("#ratingsContainer").empty();
                for (var i = 1; i <= ratings.length; i++) {
                    ratingTemplate = ratingTemplate + GetRatingTemplate(ratings[(i - 1)]);
                    $("#ratingsContainer").append(ratingTemplate);
                    ratingTemplate = "";
                }
                //Get Page Number
                pageNumber = "" != $('#' + GethdnPageIndexID()).val() ? parseInt($('#' + GethdnPageIndexID()).val()) : 1;

                //Update is last record value
                if (ratings.length == 1) {
                    $('#' + GethdnIsLastRecordID()).val('true');
                }
                else {
                    $('#' + GethdnIsLastRecordID()).val('false');
                }

                var iUpto;
                var iStart = ((parseInt(pageNumber) - 1) * parseInt(pageSize)) + 1;
                if (pageNumber == pageCount) {
                    iUpto = TotalCount;
                }
                else {
                    iUpto = parseInt(iStart) + parseInt(pageSize) - 1;
                }

                $("#divPaging").empty();
                $("#divPaging").append("<span>Showing " + iStart + "-" + iUpto + " of " + TotalCount + " Reviews</span><br>&nbsp;&nbsp;");
                //Add First
                if (parseInt(pageNumber) != 1) {
                    $("#divPaging").append(GetPagingTemplate(sId, sortOptions, GetOffset(1, pageSize), pageSize, AuthorName, 1, "First"));
                }
                //Add Previous
                if (parseInt(pageNumber) > 1) {
                    $("#divPaging").append(GetPagingTemplate(sId, sortOptions, GetOffset((parseInt(pageNumber) - 1), pageSize), pageSize, AuthorName, (parseInt(pageNumber) - 1), "Previous"));
                }
                for (var i = 1; i <= pageCount; i++) {
                    if (i >= (pageNumber - (2)) && i <= (pageNumber + (2))) {
                        pagingTemplate = GetPagingTemplate(sId, sortOptions, GetOffset(i, pageSize), pageSize, AuthorName, i, i);
                        $("#divPaging").append(pagingTemplate);
                        pagingTemplate = "";
                    }
                }
                //Add Next
                if (parseInt(pageNumber) < parseInt(pageCount)) {
                    $("#divPaging").append(GetPagingTemplate(sId, sortOptions, GetOffset((parseInt(pageNumber) + 1), pageSize), pageSize, AuthorName, (parseInt(pageNumber) + 1), "Next"));
                }
                //Add Last
                if (pageNumber != pageCount) {
                    $("#divPaging").append(GetPagingTemplate(sId, sortOptions, GetOffset(pageCount, pageSize), pageSize, AuthorName, pageCount, "Last"));
                }
                //End Paging

                //Return To Top
                window.scrollTo(0, 0);
            }
            else {
                if (TotalCount > 0) {
                    SetPageIndex(pageCount, GethdnPageIndexID());
                    GetThreadsByAuthorId(sId, sortOptions, GetOffset(pageCount, pageSize), pageSize);
                }
                else {
                    $("#ratingsContainer").hide();
                    $("#divPaging").hide();
                }
            }
        } //end of success handler
    });
}

function GetThreadsByAuthorIdXmlInput(sId, sortOption, offSet, count) {
    var xmlInput = "<input><sId>" + sId + "</sId><sortOption>" + sortOption + "</sortOption><offset>" + offSet + "</offset><count>" + count + "</count></input>";
    return xmlInput;
}

function RatingObject(ID, AuthorSID, ReviewText, RatingValue, HelpfulVotes, IsVoted, ContentName, ContentImageUrl, ContentId, RatingAverage, RatingCount, CreationDate, AuthorName, IsPostedBeforePV2) {
    this.ID = ID;
    this.AuthorSID = AuthorSID;
    this.ReviewText = ReviewText;
    this.RatingValue = RatingValue;
    this.HelpfulVotes = HelpfulVotes;
    this.IsVoted = IsVoted;
    this.ContentName = ContentName;
    this.ContentImageUrl = ContentImageUrl;
    this.ContentId = ContentId;
    this.RatingAverage = RatingAverage;
    this.RatingCount = RatingCount;
    this.CreationDate = CreationDate;
    this.AuthorName = AuthorName;
    this.IsPostedBeforePV2 = IsPostedBeforePV2;
}

function GetRatingTemplate(rating) {
    var isVoted = rating.IsVoted;
    var helpfulDiv = "";
    var ReportLink = "";
    var ImageRecipe = "";
    var divVotesDisplay = "display:none;";
    var divPv2NoteTemplate = GetTemplatePV2Note();

    if (HelpfulVoteIsAllowed() == "True") {
        if (rating.AuthorSID == GetCurrentUserSid()) {
            ReportLink = GetRemoveLinkTemplate();
        }
        else {
            ReportLink = GetReportLinkTemplate();
            if (isVoted != "True") {
                var helpfulDiv = GetNotVotedTemplate();
            }
            else {
                var helpfulDiv = GetVotedTemplate();
            }
        }
    }

    if (rating.ContentImageUrl != "") {
        ImageRecipe = GetImageRecipeTemplate();
    }

    if (rating.HelpfulVotes > 0) {
        divVotesDisplay = "display:block;";
    }

    //PV2 Note
    if (rating.IsPostedBeforePV2 == "True") {
        divPv2NoteTemplate = ReplaceKey(divPv2NoteTemplate, "[pv2notedisplay]", "display:block;");
    }
    else {
        divPv2NoteTemplate = ReplaceKey(divPv2NoteTemplate, "[pv2notedisplay]", "display:none;");
    }
    var itemTemplate = GetTemplate();
    //First replace links templates
    itemTemplate = ReplaceKey(itemTemplate, "[helpfulDiv]", helpfulDiv);
    itemTemplate = ReplaceKey(itemTemplate, "[ReportLink]", ReportLink);
    itemTemplate = ReplaceKey(itemTemplate, "[ImageRecipe]", ImageRecipe);
    itemTemplate = ReplaceKey(itemTemplate, "[divVotesDisplay]", divVotesDisplay);
    //replace the values
    itemTemplate = ReplaceKey(itemTemplate, "[PV2NoteText]", divPv2NoteTemplate);
    itemTemplate = ReplaceKey(itemTemplate, "[ContentId]", rating.ContentId);
    itemTemplate = ReplaceKey(itemTemplate, "[ContentImageUrl]", rating.ContentImageUrl);
    itemTemplate = ReplaceKey(itemTemplate, "[ContentName]", rating.ContentName);
    itemTemplate = ReplaceKey(itemTemplate, "[AuthorSID]", rating.AuthorSID);
    itemTemplate = ReplaceKey(itemTemplate, "[AuthorName]", rating.AuthorName);
    itemTemplate = ReplaceKey(itemTemplate, "[RatingValue]", rating.RatingValue);
    itemTemplate = ReplaceKey(itemTemplate, "[ReviewText]", rating.ReviewText);
    itemTemplate = ReplaceKey(itemTemplate, "[ID]", rating.ID);
    itemTemplate = ReplaceKey(itemTemplate, "[HelpfulVotes]", rating.HelpfulVotes);
    itemTemplate = ReplaceKey(itemTemplate, "[RatingAverage]", rating.RatingAverage);
    itemTemplate = ReplaceKey(itemTemplate, "[RatingCount]", rating.RatingCount);
    itemTemplate = ReplaceKey(itemTemplate, "[CreationDate]", rating.CreationDate);

    return itemTemplate;
}

function ReplaceKey(text, pattern, newKey) {
    pa = new RegExp("\\" + pattern, "g");
    return text.replace(pa, newKey);
}

function GetPagingTemplate(sId, sortOptions, offSet, pageSize, AuthorName, index, text) {
    var currentPage = $('#' + GethdnPageIndexID()).val();
    if (currentPage == index) {
        var itemTemplate = '<a disabled="disabled">' + text + '</a>&nbsp;&nbsp;';
    }
    else {
        var itemTemplate = '<a onclick="SetPageIndex(\'' + index + '\', \'' + GethdnPageIndexID() + '\')" href="javascript:GetThreadsByAuthorId(\'' + sId + '\', \'' + sortOptions + '\', \'' + offSet + '\', \'' + pageSize + '\')">' + text + '</a>&nbsp;&nbsp;';
    }
    return itemTemplate;
}

function SetPageIndex(pageNumber, hdnPageIndexID) {
    $('#' + hdnPageIndexID).val(pageNumber);
}

function GetOffset(pageNumber, pageSize) {
    return ((parseInt(pageNumber) * parseInt(pageSize)) - parseInt(pageSize)) + 1;
}

function GetPageCount(totalCount, PAGE_SIZE) {
    var dblPageCount = Math.ceil(parseInt(totalCount) / parseInt(PAGE_SIZE));
    return parseInt(dblPageCount);
}
