﻿// MISC FUNCTIONALITY
function webMethod(options) {
    var settings = $.extend({
        'svcPath': '',
        'methodName': '',
        'async': false,
        'cache': false,
        timeout: 10000,
        debug: false,
        'parameters': {},
        success: function (response) { },
        error: function (response) { }
    }, options); var parameterjson = "{}";
    var result = null;
    var getUrl = window.location;
    var baseUrl = getUrl.protocol + "//" + getUrl.host; // + "/" + getUrl.pathname.split('/')[1];
    if (settings.parameters != null) { parameterjson = JSON.stringify(settings.parameters); }
    $.ajax({
        type: "POST",
        url: baseUrl + "/" + settings.svcPath + "/" + settings.methodName,
        data: parameterjson,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: settings.async,
        cache: settings.cache,
        timeout: settings.timeout,
        success: function (value) {
            result = value.d;
            settings.success(result);
        },
        error: function (response) {
            settings.error(response);
            if (settings.debug) { alert("Error Calling Method \"" + settings.methodName + "\"\n\n+" + response.responseText); }
        }
    });
    return result;
}

function getCookie(name) {
    var re = new RegExp(name + "=([^;]+)");
    var value = re.exec(document.cookie);
    return (value != null) ? unescape(value[1]) : null;
}

// GLOBAL RETRY COUNTER
var retryCount = 0;

// VOTE FUNCTIONALITY
function voteReview(reviewId, voteUp) {
    retryCount++;
    showVoteSpinner(reviewId);

    window.setTimeout(function () {
        webMethod({
            'svcPath': 'Reviews.asmx', 'methodName': 'voteReview', 'async': true, 'parameters': {
                'reviewId': reviewId, 'voterGuid': getCookie("JACKS_VISITOR"), 'voteUp': voteUp
            },
            success: function (data) {
                retryCount = 0;
                getHelpfulRating(reviewId).text(data[0]);
                getUnhelpfulRating(reviewId).text(data[1]);

                hideVoteSpinner(reviewId);
            },
            error: function (response) {
                if (retryCount <= 3) {
                    retryCount = 0;
                    voteReview(reviewId, voteUp);
                }
                else {
                    alert(response);
                }
            }
        });
    }, 125);
}
function showVoteSpinner(reviewId) {
    getVoteSpinner(reviewId).show();
    getVoteSpan(reviewId).hide();
}
function hideVoteSpinner(reviewId) {
    getVoteSpinner(reviewId).hide();
    getVoteSpan(reviewId).show();
}

// REPORT FUNCTIONALITY
function confirmReport(reviewId) {
    retryCount++;

    var email = getReporterEmail(reviewId).val();
    var reason = getReportReason(reviewId).text();
    var isEmailValid = validateEmail(email);

    if (isEmailValid && reason !== '') {
        hideReportPanel(reviewId);
        getReportSpinner(reviewId).show();

        window.setTimeout(function () {
            webMethod({
                'svcPath': 'Reviews.asmx', 'methodName': 'reportReview', 'async': true, 'parameters': {
                    'reporterGuid': getCookie('JACKS_VISITOR'), 'reporterEmail': email, 'reportReason': reason, 'reviewId': reviewId
                },
                success: function (data) {
                    retryCount = 0;
                    if (data === '') {
                        getReportSpinner(reviewId).slideUp('fast');
                        disableReportButtonAfterReporting(reviewId);
                    } else {
                        alert('Error in Web Method reportReview:  ' + response);
                    }
                },
                error: function (response) {
                    if (retryCount <= 3) {
                        confirmReport(reviewId);
                    } else {
                        retryCount = 0;
                        alert('Error in method confirmReport:  ' + response);
                        getReportSpinner(reviewId).slideUp('fast');
                    }
                }
            });
        }, 500);
    } else {
        showReportErrorMessage(reviewId, isEmailValid, reason);
    }
}
function showReportReviewPanel(reviewId) {
    getReporterEmail(reviewId).val('');
    getReportReason(reviewId).text('');
    getReportErrorBadEmail(reviewId).hide();
    getReportErrorNoReason(reviewId).hide();
    getReportPanel(reviewId).slideToggle('fast');
}
function showReportErrorMessage(reviewId, isEmailValid, reason) {
    var badEmail = getReportErrorBadEmail(reviewId);
    var noReason = getReportErrorNoReason(reviewId);

    if (!isEmailValid) { badEmail.show(); }
    else { badEmail.hide(); }

    if (reason === '') { noReason.show(); }
    else { badEmail.hide(); }
}
function hideReportPanel(reviewId) {
    getReporterEmail(reviewId).text('');
    getReportReason(reviewId).text('');
    getReportErrorBadEmail(reviewId).hide();
    getReportErrorNoReason(reviewId).hide();
    getReportPanel(reviewId).slideUp('fast');
}
function disableReportButtonAfterReporting(reviewId) {
    var reportButton = $("input[reportButton='" + reviewId + "']");
    reportButton.prop('title', 'You have already reported this review.');
    reportButton.prop('disabled', true);
}
function validateEmail(email) {
    var emailValid = email !== '';
    if (emailValid) {
        var re = /[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}/igm;
        emailValid = re.test(email);
    }
    return emailValid;
}

// GET ELEMENTS
function getVoteSpinner(reviewId) {
    return $("img[votespinner='" + reviewId + "']");
}
function getVoteSpan(reviewId) {
    return $("span[voteSpan='" + reviewId + "']");
}
function getHelpfulRating(reviewId) {
    return $("span[helpfulRating='" + reviewId + "']");
}
function getUnhelpfulRating(reviewId) {
    return $("span[unhelpfulRating='" + reviewId + "']");
}
function getReportPanel(reviewId) {
    return $("div[reportPanel='" + reviewId + "']");
}
function getReporterEmail(reviewId) {
    return $("input[reporterEmail='" + reviewId + "']");
}
function getReportReason(reviewId) {
    return $("textarea[reportReason='" + reviewId + "']");
}
function getReportErrorBadEmail(reviewId) {
    return $("span[reportErrorBadEmail='" + reviewId + "']");
}
function getReportErrorNoReason(reviewId) {
    return $("span[reportErrorNoReason='" + reviewId + "']");
}
function getReportSpinner(reviewId) {
    return $("image[reportSpinner='" + reviewId + "']");
}

// LOAD USER CONTROL AS STRING FUNCTIONALITY
function loadReviewPage(itemId, pageNumber, sortMethod, rating) {
    webMethod({
        'svcPath': 'Reviews.asmx', 'methodName': 'loadReviewPage', 'async': true, 'parameters': {
            'itemId': itemId, 'pageNumber': pageNumber, 'sortMethod': sortMethod, 'rating': rating
        },
        success: function (data) {
            return data;
        },
        error: function (response) {
            alert("Error in method loadReviewPage:  " + response);
        }
    });
}
function loadNumberOfReviewsOntoPage(itemId, revsPerPage, pageNumber, sortMethod, rating) {
    retryCount++;
    webMethod({
        'svcPath': 'Reviews.asmx', 'methodName': 'loadNumberOfReviewsOntoPage', 'async': true, 'parameters': {
            'itemId': itemId, 'pageNumber': pageNumber, 'sortMethod': sortMethod, 'rating': rating, 'numReviews': revsPerPage
        },
        success: function (data) {
            retryCount = 0;
            setSpan((data !== "\r\n") ? data : "<h3>No Reviews Found</h3>");
        },
        error: function (response) {
            if (retryCount <= 3) {
                loadNumberOfReviewsOntoPage(itemId, revsPerPage, pageNumber, sortMethod, rating);
            } else {
                retryCount = 0;
                setSpan("No Reviews Could Be Loaded At This Time.");
            }
        }
    });
}