﻿function Entry(entryId, challengeId, isSample, openForVoting, placeholder, loggedIn, loginUrl, cookieDomain, autoNextCookieName, enableShortcut)
{

    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, $frame);
        }
        
        var $imgIcons = $frame.find(".imgIcon");
    	$frame.add($imgIcons).hover(
		    function() { $imgIcons.show(); },
		    function() { $imgIcons.hide(); });

    	if (openForVoting)
    	{

    		votingWidget = new VotingStars(
                $("div#votingWidgetContainer").get(0),
                challengeId,
                entryId,
                loggedIn,
                askForLogin,
                new EntryMessage(),
                updateNumberOfVotes,
                enableShortcut);

    		loadVotes();

    	}

		$autoNext.change(autoNextChanged);

    });
    
    
    function addZoomIcon($frame, imgSrc)
    {

    	$("<a/>").
            addClass("imgIcon").
            addClass("zoomIcon").
            attr("href", imgSrc).
            appendTo($frame);

    }    
    
    function addLightboxIcon(entryId, $frame)
    {
    
        $("<div/>").
            addClass("imgIcon").
            addClass("addToLightboxIcon").
            attr("title", "Add image to lightbox.").
            click(function() { lightbox.addEntryToLightbox(entryId, $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;
                }
            }

            if (vote == null)
            {
                // TODO: very unlikely to happen ...
                return; 
            }

            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
        {
            // TODO ...
        }
    }

    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.");
    }

}