﻿function Entry(entryId, challengeId, isSample, openForVoting, placeholder, loggedIn, loginUrl, cookieDomain, autoNextCookieName, enableShortcut, smallImgSrc)
{

    var votingWidget;
    var lightbox = !isSample ? new Lightbox(challengeId) : null;

    $(document).ready(function () {

        var $frame = $("div.entryImgPreview");
        var $lnk = $frame.find("a");
        var $autoNext = $("#chkAutoNext");

        addZoomIcon($frame, $lnk.attr("href"));

        if (!isSample && !placeholder) {
            addLightboxIcon(entryId, smallImgSrc, $frame);
        }

        var $imgIcons = $frame.find(".imgIcon");
        $frame.add($imgIcons).hover(
		    function () { $imgIcons.show(); },
		    function () { $imgIcons.hide(); });

        if (openForVoting) {

            votingWidget = new VotingStars(
                $("div#votingContainer").get(0),
                challengeId,
                entryId,
                loggedIn,
                askForLogin,
                new EntryMessage(),
                updateNumberOfVotes,
                enableShortcut);

            loadVotes();

        }

        $("#showVotesButton").click(function () {
            $("#votesTable").toggle();
        });

        $autoNext.change(autoNextChanged);

    });
    
    
    function addZoomIcon($frame, imgSrc)
    {

    	$("<a/>").
            addClass("imgIcon").
            addClass("zoomIcon").
            attr("href", imgSrc).
            appendTo($frame);

    }    
    
    function addLightboxIcon(entryId, smallImgSrc, $frame)
    {
    
        $("<div/>").
            addClass("imgIcon").
            addClass("addToLightboxIcon").
            attr("title", "Add image to lightbox.").
            click(function() { lightbox.addEntryToLightbox(entryId, smallImgSrc, $frame.find("img").get(0)) }).
            appendTo($frame);

    }    
    
    function autoNextChanged()
    {

	    var cookieOptions = {
	        expires: 365,
	        path: "/",
	        domain: cookieDomain }
	
		$.cookie(
		    autoNextCookieName,
		    $("#chkAutoNext").attr("checked") ? "yes" : "no",
		    cookieOptions);
    
    }
    


    function loadVotes()
    {

        $.getJSON("EndPoints/VotesByUserAndChallenge.ashx?ChallengeID=" + challengeId, function(data)
        {

            if (data.result != "success")
            {
                // TODO ...
                return;
            }

            var vote = null;
            for (var i = 0; i < data.votes.length; i++)
            {
                var thisVote = data.votes[i];
                if (thisVote.entryId == entryId)
                {
                    vote = thisVote;
                    break;
                }
            }

            votingWidget.setMagnitude(
                vote ? true : false,
                vote ? vote.magnitude : 0.0);

        });

    }

    function askForLogin()
    {
        new FullScreenMessage(
	        "<div class=\"messageTitle\">You'll need to login or register to vote.</div>" +
	        "<div class=\"messageText\">" +
	        "You are not logged in at the moment. Voting requires a dpreview.com account. " +
	        "Please <a href=\"" + loginUrl + "\" rel=\"nofollow\">login</a> or create a " +
	        "<a href=\"http://www.dpreview.com/forums/register.asp\">new account</a>." +
	        "</div>");
    }
    
    function updateNumberOfVotes(votesCount, votesCountFormatted)
    {
        $("#challengeSummaryVotesCount").text(votesCountFormatted);
    }

}

function EntryMessage()
{

    var $message = null;

    // public
    this.hideCurrent = function()
    {
        if ($message)
        {
            $message.fadeOut("normal", remove);
        } 
    }

    // public
    this.displayMessage = function(message)
    {

        if ($message)
        {
            $message.stop().remove();
        }

        $("#votingMessage").empty();

        $message = $("<div/>").
            text(message).
	        appendTo($("#votingMessage"));

        $message.queue(sleep);

    }

    // private
    function sleep()
    {
        var $thisMessage = $(this);
        window.setTimeout(function() { $thisMessage.dequeue(); }, 500);
    }

    // private
    function remove()
    {
        $(this).parent().append("&nbsp;");
        $(this).remove();
    }

}

function BottomDialogsManager()
{

    var dialogs = [];
    var visibleDialog = null;

    this.registerDialog = function(dialog)
    {
        dialogs.push(dialog);
    }

    this.toggle = function(dialog)
    {
        for (var i = 0; i < dialogs.length; i++)
        {
            if (dialogs[i] == dialog)
            {
                if (visibleDialog == dialog)
                {
                    dialogs[i].hide();
                    visibleDialog = null;
                }
                else
                {
                    dialogs[i].show();
                    visibleDialog = dialog;
                }
            }
            else
            {
                dialogs[i].hide();
            }
        }
    }

    this.hide = function()
    {
        for (var i = 0; i < dialogs.length; i++)
        {
            dialogs[i].hide();
        }
        visibleDialog = null;
    }

}

var bottomDialogsManager = new BottomDialogsManager();

function BottomDialog(
    dialogElement,
    mainButtonElement,
    formElement,
    cancelButtonElement,
    submitFunction)
{

    var self = this;
    bottomDialogsManager.registerDialog(self);

    $(mainButtonElement).click(function()
    {
        bottomDialogsManager.toggle(self);
    });

    $(cancelButtonElement).click(function()
    {
        bottomDialogsManager.hide();
    });

    $(formElement).submit(function()
    {
        $(mainButtonElement).attr("disabled", "disabled");
        $(cancelButtonElement).attr("disabled", "disabled");
        return submitFunction();
    });

    this.show = function()
    {
        $(dialogElement).fadeIn(); // show();
    }

    this.hide = function()
    {
        $(dialogElement).hide();
    }
    
    this.disableButtons

}

function EntryDisqualify(entryId, backToUrl)
{

    var dialog;
    var $form;
    var $progressIndicator;
    var $submitButton;
    var $cancelButton;

    $(document).ready(function()
    {

        var $dialog = $("#disqualifyDialog");
        $form = $dialog.find("form[name='disqualifyForm']");
        $progressIndicator = $dialog.find("div.progressIndicator")
        $submitButton = $form.find("input:submit");
        $cancelButton = $form.find("input:button[name='cancel']");
        
        dialog = new BottomDialog(
            $dialog.get(0),
            $("#disqualifyButton").get(0),
            $form.get(0),
            $cancelButton.get(0),
            disqualify);

    });

    function disqualify()
    {
    
        showProgressIndicator();

        var comment = $form.find("textarea[name='comment']").val();

        var requestData = {
            RequestType: "AJAX",
            Action: "Disqualify",
            EntryID: entryId,
            Comment: comment
        };

        var request = {
            url: "EndPoints/DisqualifyEntry.ashx",
            type: "POST",
            data: requestData,
            dataType: "json",
            error: errorResponse,
            success: successResponse
        };
        
        $.ajax(request);

        return false;

    }
    
    function showProgressIndicator()
    {
        $submitButton.attr("disabled", "disabled");
        $cancelButton.attr("disabled", "disabled");
        $progressIndicator.show();
    }

    function hideProgressIndicator()
    {
        $submitButton.removeAttr("disabled");
        $cancelButton.removeAttr("disabled");
        $progressIndicator.hide();
    }

    function successResponse(json)
    {
        if (json.result == "success")
        {
            location.href = backToUrl;
        }
        else
        {
            // TODO ... ?
        }
    }

    function errorResponse()
    {
        hideProgressIndicator();
        alert("Internal error. We are sorry for the inconvenience.");
    }

}

function EntryComplain(entryId, loggedIn, loginUrl, backToUrl)
{

    var dialog;
    var $form;
    var $progressIndicator;
    var $submitButton;
    var $cancelButton;

    $(document).ready(function()
    {

        var $dialog = $("#complainDialog");
        $form = $dialog.find("form[name='complainForm']");
        $progressIndicator = $dialog.find("div.progressIndicator");
        $submitButton = $form.find("input:submit");
        $cancelButton = $form.find("input:button[name='cancel']");
        
        if (!loggedIn)
        {
            $("#complainButton").click(askForLogin);
            return;
        }
       
        dialog = new BottomDialog(
            $dialog.get(0),
            $("#complainButton").get(0),
            $form.get(0),
            $form.find("input:button[name='cancel']").get(0),
            complain);

    });

    function askForLogin()
    {
        new FullScreenMessage(
            "<div class=\"messageTitle\">You'll need to login or register to complain.</div>" +
            "<div class=\"messageText\">You are not logged in at the moment. Lodging a complaint " +
            "requires a dpreview.com account. Please <a href=\"" + loginUrl + "\">login</a> or " +
            "create a <a href=\"http://www.dpreview.com/forums/register.asp\">new account</a>.</div>");
    }

    function complain()
    {
    
        var comment = $form.find("textarea[name='comment']").val();

        var reasons = $.map(
            $form.find("input:checkbox[name='banReason']"),
            function(inpt) { return $(inpt).val(); }).join(",");

        var requestData = {
            RequestType: "AJAX",
            EntryID: entryId,
            Comment: comment,
            Reasons: reasons
        };

        var request = {
            url: "EndPoints/LodgeComplaint.ashx",
            type: "POST",
            data: requestData,
            dataType: "json",
            error: errorResponse,
            success: successResponse
        };

        showProgressIndicator();
        $.ajax(request);

        return false;

    }

    function showProgressIndicator()
    {
        $submitButton.attr("disabled", "disabled");
        $cancelButton.attr("disabled", "disabled");
        $progressIndicator.show();
    }

    function hideProgressIndicator()
    {
        $submitButton.removeAttr("disabled");
        $cancelButton.removeAttr("disabled");
        $progressIndicator.hide();
    }

    function successResponse(json)
    {
        if (json.result == "success")
        {
            location.href = backToUrl;
        }
        else
        {
            if (json.message == "comment-too-long")
            {
                alert("Disqualification message too long. Maximum 500 characters. Please try again.");
            }
        }
    }

    function errorResponse()
    {
        hideProgressIndicator();
        alert("Internal error. We are sorry for the inconvenience.");
    }

}

function EntryWithdraw(entryId, backToUrl)
{

    var dialog;
    var $form;
    var $progressIndicator;
    var $submitButton;
    var $cancelButton;

    $(document).ready(function()
    {
    
        var $dialog = $("#withdrawDialog");
        $progressIndicator = $dialog.find("div.progressIndicator");
        $form = $dialog.find("form[name='withdrawForm']");
        $submitButton = $form.find("input:submit");
        $cancelButton = $form.find("input:button[name='cancel']");
        
        dialog = new BottomDialog(
            $dialog.get(0),
            $("#withdrawButton").get(0),
            $form.get(0),
            $cancelButton.get(0),
            withdraw);

    });

    function withdraw()
    {

        var requestData = {
            RequestType: "AJAX",
            Action: "Withdraw",
            EntryID: entryId
        };

        var request = {
            url: "EndPoints/WithdrawEntry.ashx",
            type: "POST",
            data: requestData,
            dataType: "json",
            error: errorResponse,
            success: successResponse
        };

        showProgressIndicator();
        $.ajax(request);

        return false;

    }

    function showProgressIndicator()
    {
        $submitButton.attr("disabled", "disabled");
        $cancelButton.attr("disabled", "disabled");
        $progressIndicator.show();
    }

    function hideProgressIndicator()
    {
        $submitButton.removeAttr("disabled");
        $cancelButton.removeAttr("disabled");
        $progressIndicator.hide();
    }

    function successResponse(json)
    {
        if (json.result == "success")
        {
            location.href = backToUrl;
        }
        else
        {
            // TODO ...
        }
    }

    function errorResponse()
    {
        hideProgressIndicator();
        alert("Internal error. We are sorry for the inconvenience.");
    }

}

function EntryRemove(entryId, backToUrl)
{

    var dialog;
    var $form;
    var $progressIndicator;
    var $submitButton;
    var $cancelButton;

    $(document).ready(function()
    {
    
        var $dialog = $("#removeDialog");
        $progressIndicator = $dialog.find("div.progressIndicator");
        $form = $dialog.find("form[name='removeForm']");
        $submitButton = $form.find("input:submit");
        $cancelButton = $form.find("input:button[name='cancel']");    

        dialog = new BottomDialog(
            $dialog.get(0),
            $("#removeButton").get(0),
            $form.get(0),
            $cancelButton.get(0),
            remove);

    });

    function remove()
    {

        var requestData = {
            RequestType: "AJAX",
            Action: "Remove",
            EntryID: entryId
        };

        var request = {
            url: "EndPoints/RemoveEntry.ashx",
            type: "GET",
            data: requestData,
            dataType: "json",
            error: errorResponse,
            success: successResponse
        };

        showProgressIndicator();
        $.ajax(request);

        return false;

    }

    function showProgressIndicator()
    {
        $submitButton.attr("disabled", "disabled");
        $cancelButton.attr("disabled", "disabled");
        $progressIndicator.show();
    }

    function hideProgressIndicator()
    {
        $submitButton.removeAttr("disabled");
        $cancelButton.removeAttr("disabled");
        $progressIndicator.hide();
    }

    function successResponse(json)
    {
        if (json.result == "success")
        {
            location.href = backToUrl;
        }
        else
        {
            // TODO ...
        }
    }

    function errorResponse()
    {
        hideProgressIndicator();
        alert("Internal error. We are sorry for the inconvenience.");
    }

}

function StatusChangeConfirmation(entryId, actionUrl, buttonElement, dialogElement, formElement, cancelButton)
{

    var visible = false;

    $(buttonElement).click(function()
    {
        if (visible)
        {
            hide();
        }
        else
        {
            show();
        }
    });

    $(cancelButton).click(function()
    {
        hide();
    });

    $(formElement).submit(function()
    {
        $(formElement).find("input").attr("disabled", "disabled");
        location.href = actionUrl;
        return false;
    });

    function show()
    {
        $(dialogElement).fadeIn();
        visible = true;
    }

    function hide()
    {
        $(dialogElement).hide();
        visible = false;
    }

}

function CancelRemoval(entryId, actionUrl)
{
    $(document).ready(function()
    {

        $form = $("form[name='cancelRemovalForm']");

        StatusChangeConfirmation(
            entryId,
            actionUrl,
            $("#buttonCancelRemoval").get(0),
            $("#dialogCancelRemoval").get(0),
            $form.get(0),
            $form.find("input:button[name='cancel']").get(0));

    });
}

function CancelDisqualification(entryId, actionUrl)
{
    $(document).ready(function()
    {

        $form = $("form[name='cancelDisqualificatioForm']");

        StatusChangeConfirmation(
            entryId,
            actionUrl,
            $("#buttonCancelDisqualification").get(0),
            $("#dialogCancelDisqualification").get(0),
            $form.get(0),
            $form.find("input:button[name='cancel']").get(0));

    });
}

function CancelWithdrawal(entryId, actionUrl)
{
    $(document).ready(function()
    {

        $form = $("form[name='cancelWithdrawalForm']");

        StatusChangeConfirmation(
            entryId,
            actionUrl,
            $("#buttonCancelWithdrawal").get(0),
            $("#dialogCancelWithdrawal").get(0),
            $form.get(0),
            $form.find("input:button[name='cancel']").get(0));

    });
}

function ChangeComplaintsStatusManager(entryId, processedComplaints, backToUrl)
{

    var $form;

    $(document).ready(function()
    {

        $form = processedComplaints ?
            $("form[name='processedComplaints']") :
            $("form[name='unprocessedComplaints']");

        $form.find("input:button[name='markSelected']").click(function()
        {
            changeStatus(false);
            return false;
        });

        $form.find("input:button[name='markAll']").click(function()
        {
            changeStatus(true);
            return false;
        });

    });

    function changeStatus(all)
    {

        var $checkboxes = all ?
            $form.find("input:checkbox[name='complaintId']") :
            $form.find("input:checkbox[name='complaintId'][checked]");

        if ($checkboxes.length == 0)
        {
            return;
        }

        var complaintIds = $.map($checkboxes,
            function(inpt) { return $(inpt).val(); }).join(",");

        var requestData = {
            RequestType: "AJAX",
            Action: processedComplaints ? "SetActive" : "Ignore",
            EntryID: entryId,
            ComplaintID: complaintIds
        };

        var request = {
            url: "EndPoints/ChangeComplaintStatus.ashx",
            type: "GET",
            data: requestData,
            dataType: "json",
            error: errorResponse,
            success: successResponse
        };

        $.ajax(request);

    }

    function successResponse(json)
    {
        if (json.result == "success")
        {
            location.href = backToUrl;
        }
        else
        {
            // TODO ...
        }
    }

    function errorResponse()
    {
        alert("Internal error. We are sorry for the inconvenience.");
    }

}

var errorShown = false;
var responseCache = {};
function showVotes(dateTime, element) {
    var cacheKey=dateTime.getTime();
    var result = responseCache[cacheKey];

    if (result == null) {
        responseCache[cacheKey]="LOADING";
        $.ajax({
            url: "EndPoints/UserVotes.ashx",
            type: "POST",
            data: {
                voteTime: dateTime.getTime()
            },
            dataType: "json",
            error: function () {
                if (!errorShown) alert("An error ocurred whilst retrieving the votes.");
                errorShown = true;
            },
            success: function (response) {
                responseCache[cacheKey] = response;
                drawResponse(response);
            }
        });
    } else if (result!="LOADING") {
        drawResponse(result);
    }

    function drawResponse(response) {
            hideVotes();

            var totalVoteCount = response.voteCount05 +
                response.voteCount10 +
                response.voteCount15 +
                response.voteCount20 +
                response.voteCount25 +
                response.voteCount30 +
                response.voteCount35 +
                response.voteCount40 +
                response.voteCount45 +
                response.voteCount50;

            var table = $("<div/>").
                addClass("userVotesContainer").
                css("position", "absolute").
                css("top", "-20px").
                css("left", "-230px").
                css("padding", "5px").
                css("border", "1px solid #CCCCCC").
                css("background", "#444").
                css("width", "210px").
                append("The number of times each score was given by this user in this challenge").
                append($("<table/>").
                    css("margin", "0").
                    css("width", "200px").
                    addClass("userVotes").
                    append($("<tr/>").
                        append($("<th/>").css("background", "transparent").text("Vote")).
                        append($("<th/>").css("background", "transparent").css("width", "100px").text("")).
                        append($("<th/>").css("background", "transparent").text("Times voted"))
                    ).
                    append(buildRow("0.5", response.voteCount05, totalVoteCount)).
                    append(buildRow("1.0", response.voteCount10, totalVoteCount)).
                    append(buildRow("1.5", response.voteCount15, totalVoteCount)).
                    append(buildRow("2.0", response.voteCount20, totalVoteCount)).
                    append(buildRow("2.5", response.voteCount25, totalVoteCount)).
                    append(buildRow("3.0", response.voteCount30, totalVoteCount)).
                    append(buildRow("3.5", response.voteCount35, totalVoteCount)).
                    append(buildRow("4.0", response.voteCount40, totalVoteCount)).
                    append(buildRow("4.5", response.voteCount45, totalVoteCount)).
                    append(buildRow("5.0", response.voteCount50, totalVoteCount))
                ).
                append("");
            $(element).append($("<div/>").
                css("position", "relative").
                append(table)
            );
            $(element).one("mouseout", function () { hideVotes() });
        }

    function hideVotes() {
        $(".userVotesContainer").remove();
    }

    function buildRow(magnitude, count, totalVoteCount) {
        return $("<tr/>").
            append($("<td/>").
                text(magnitude)
            ).
            append($("<td/>").
                append($("<div/>").
                    addClass("frame").
                    append($("<div/>").
                        addClass("gauge").
                        css("width",100*(count/totalVoteCount)+"%")
                    )
                )
            ).
            append($("<td/>").
                text(count)
            );
        
    }
}
