var placeHolder;
var truncPlaceHolder;
var readAnchor;
var reviewHolder = "";
var reviewedFromLinkHolder = "";
var submittedFromLinkHolder = "";

function trim(str)
{
    str = str.replace(/^\s+/g, "");
    return str.replace(/\s+$/g, "");
}

function openreview(filmId)
{
    // if the user is previewing a review or already writing one, we don't need to open a review textarea
    var reviewaddlink = getElement('reviewaddlink-' + filmId);
    var reviewtextlink = getElement('reviewtextlink-' + filmId);

    if (reviewaddlink.style.display != 'none') review(filmId, reviewaddlink.id, false);
    else if (reviewtextlink.style.display != 'none') review(filmId, reviewtextlink.id, true);
}

function review(filmId, link, setReview)
{
    if (reviewedFromLinkHolder == "")
    {
        reviewedFromLinkHolder = link;
    }

    var reviewarea = getElement('reviewarea-' + filmId);
    var review = getElement('review-' + filmId);
    var reviewtext = getElement('reviewtext-' + filmId);

    if (reviewHolder == "")
    {
        reviewHolder = trim(reviewtext.innerHTML);
        if (setReview)
        {
            review.value = reviewHolder;
        }
    }
    reviewarea.style.display = "block";
    reviewtext.style.display = "none";

    var reviewlink = getElement(link);
    var reviewarealink = getElement('reviewarealink-' + filmId);
    reviewlink.style.display = "none";
    reviewarealink.style.display = "block";

    if (typeof _reviewCallback != "undefined") _reviewCallback(filmId);
}

function submitreview(filmId, userId, link)
{
    var rating = getElement('input-userRatingImg-' + filmId).value;
    var review = getElement('review-' + filmId);
    var summaryText = "";
    var reviewText = trim(review.value);
    submittedFromLinkHolder = link;

    if (rating == null || rating == 0)
    {
        alert(getReviewControlRateFilm());
        return;
    }

    document.body.style.cursor = "wait";

    send(handleSubmitReview,
         getParamAction(), getActionReview(),
         getParamFilmId(), filmId,
         getParamUserId(), userId,
         getParamSummary(), summaryText,
         getParamReview(), reviewText,
         getParamTemplate(), getTemplate());
}

function handleSubmitReview(response, args)
{
    window.status = getReviewControlReviewSubmitted();
    document.body.style.cursor = "auto";

    // this code to hide the review textarea needs to be run after the submit has completed as the callback may
    // be depending on some of the state set here
    var filmId = args[3];
    var reviewText = args[9];

    var reviewarea = getElement('reviewarea-' + filmId);
    var reviewtextdiv = getElement('reviewtext-' + filmId);
    var reviewlink = getElement(submittedFromLinkHolder);
    var reviewtextlink = getElement('reviewtextlink-' + filmId);
    var reviewaddlink = getElement('reviewaddlink-' + filmId);

    if (reviewText == '')
    {
        reviewtextdiv.innerHTML = getReviewControlNotReviewed()+".";
        reviewaddlink.style.display = "block";
    }
    else
    {
        reviewtextdiv.innerHTML = reviewText;
        reviewtextlink.style.display = "block";
    }

    reviewtextdiv.style.display = "block";
    reviewarea.style.display = "none";
    reviewlink.style.display = "none";

    reviewHolder = "";
    reviewedFromLinkHolder = "";
    submittedFromLinkHolder = "";

    if (typeof _submitReviewCallback != "undefined") _submitReviewCallback(filmId);
}

function cancelreview(filmId, link)
{
    var review = getElement('review-' + filmId);
    var reviewarea = getElement('reviewarea-' + filmId);
    var reviewtextdiv = getElement('reviewtext-' + filmId);
    var reviewlink = getElement(link);
    var reviewtextlink = getElement(reviewedFromLinkHolder);

    review.value = "";
    reviewarea.style.display = "none";
    reviewtextdiv.innerHTML = reviewHolder;
    reviewtextdiv.style.display = "block";
    reviewlink.style.display = "none";
    reviewtextlink.style.display = "block";

    reviewHolder = "";
    reviewedFromLinkHolder = "";

    if (typeof _cancelReviewCallback != "undefined") _cancelReviewCallback(filmId);
}

function previewreview(filmId, link)
{
    var review = getElement('review-' + filmId);
    var reviewarea = getElement('reviewarea-' + filmId);
    var reviewtextdiv = getElement('reviewtext-' + filmId);
    var reviewlink = getElement(link);
    var reviewpreviewlink = getElement('reviewpreviewlink-' + filmId);

    if (reviewHolder == "")
    {
        reviewHolder = reviewtextdiv.innerHTML;
    }

    reviewarea.style.display = "none";
    reviewtextdiv.innerHTML = review.value;
    reviewtextdiv.style.display = "block";
    reviewlink.style.display = "none";
    reviewpreviewlink.style.display = "block";

    if (typeof _previewReviewCallback != "undefined") _previewReviewCallback(filmId);
}

function showhidereview(container, img)
{
    var containerDiv = getElement(container);
    var imgDiv = getElement(img);

    if (imgDiv.alt == getReviewControlHide())
    {
        containerDiv.style.display = "none";
        imgDiv.src = getImageDir() + "arrow-dn.gif";
        imgDiv.alt = getReviewControlShow();
    }
    else
    {
        containerDiv.style.display = "block";
        imgDiv.src = getImageDir() + "arrow-up.gif";
        imgDiv.alt = getReviewControlHide();
    }
}

function showToBeRatedReview(filmId)
{
    var button = document.getElementById('reviewButton-' + filmId);
    var buttonInactive  = document.getElementById('reviewButtonInactive-' + filmId);
    button.style.display = 'none';
    buttonInactive.style.display = 'block';
    buttonInactive.innerHTML = getReviewControlTypeBelow();

    document.getElementById('reviewcontainer-' + filmId).style.display = 'block';

    // determine whether to edit or add a review
    if (button.innerHTML == getReviewControlEditThisReview()) review(filmId, 'reviewtextlink-' + filmId, true);
    else review(filmId, 'reviewaddlink-' + filmId, false);

    return false;
}

function hideToBeRatedReview(filmId)
{
    var button = document.getElementById('reviewButton-' + filmId);
    var buttonInactive  = document.getElementById('reviewButtonInactive-' + filmId);
    button.style.display = 'block';
    buttonInactive.style.display = 'none';
    // in case the film gets unrated
    buttonInactive.innerHTML = '&lt;- '+getToBeRatedRateFilm();

    var reviewcontainer = document.getElementById('reviewcontainer-' + filmId);
    if (button.innerHTML != getReviewControlEditThisReview()) reviewcontainer.style.display = 'none';
    // we might have come from preview which appends the reviewcontainer-preview class
    reviewcontainer.className = 'reviewcontainer';

    document.getElementById('reviewtextlink-' + filmId).style.display = 'none';

    return false;
}

function tbrReviewCallback(filmId) { document.getElementById('reviewcontainer-' + filmId).className = 'reviewcontainer'; return false; }
function tbrPreviewReviewCallback(filmId) { document.getElementById('reviewcontainer-' + filmId).className += ' reviewcontainer-preview'; return false; }
function tbrCancelReviewCallback(filmId) { return hideToBeRatedReview(filmId); }
function tbrSubmitReviewCallback(filmId)
{
    // if we get in the following block, it's because the review submitted was empty
    var reviewaddlink = document.getElementById('reviewaddlink-' + filmId);
    if (reviewaddlink.style.display == 'block')
    {
        var button = document.getElementById('reviewButton-' + filmId);
        button.innerHTML = getToBeRatedReviewFilm();
        return hideToBeRatedReview(filmId);
    }

    var button = document.getElementById('reviewButton-' + filmId);
    var buttonInactive  = document.getElementById('reviewButtonInactive-' + filmId);
    button.style.display = 'block';
    buttonInactive.style.display = 'none';
    button.innerHTML = getReviewControlEditThisReview();

    document.getElementById('reviewcontainer-' + filmId).className = 'reviewcontainer';
    document.getElementById('reviewtextlink-' + filmId).style.display = 'none';

    return false;
}