﻿/// <reference path="../../Assets/Global/scripts/jquery-1.5.2.min.js" />
var MajesticReviews = function () {

    //private variables
    var voteServiceUrl = "/ajaxservices/reviews.asmx/addreviewvote";
    var reportReviewUrl = "/ajaxservices/reviews.asmx/reportreview";
    var addReviewCommentUrl = "/ajaxservices/reviews.asmx/addreviewcommentjson";
    var addCommentComplainUrl = "/ajaxservices/reviews.asmx/addcommentcomplaint";
    var addReviewTextUrl = "/ajaxservices/reviews.asmx/addreviewtext";
    var addReviewScoreUrl = "/ajaxservices/reviews.asmx/addreviewscore";

    //private functions
    function getErrorText(data) {
        var errorMessage = "There has been an error.";
        // check for service unavailable page
        try {
            if (data.statusText) {
                return errorMessage;
            }
            var emo = JSON.parse(data.responseText);
            return emo.Message || errorMessage;
        }
        catch (err) {
            return errorMessage;
        }
    }

    function showAjaxLoader() {
        $('#ajax-loader').show();
    }

    function hideAjaxLoader() {
        $('#ajax-loader').hide();
    }

    function defaultErrorDisplay(data) {
        hideAjaxLoader();
        data = data.d || data;
        alert(getErrorText(data));
    }




    // public functions and properties
    return {

        //true if we have clicked submit for a review
        reviewAdding: false,

        //true if we want to pre-fill the FB post box when creating a new review.
        fbPostNewReview: false,

        // true if we want to show the Twitter window
        twitterPostNewReview: false,

        //store for newly-addedd product review data
        addedReview: {},

        submitComment: function (button) {
            var friendlyReviewNumber = button.attr('data-reviewnumber');
            var commentText = button.parents('div.leavecomment').find('textarea.leavecomment-textarea').val();
            var options = {
                type: "POST",
                url: addReviewCommentUrl,
                data: "{'friendlyReviewNumber':'" + friendlyReviewNumber + "', 'commentText':'" + commentText + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    hideAjaxLoader();
                    data = data.d || data; // .NET adds everything under the d key
                    //clear text box
                    button.parents('div.leavecomment').find('textarea.leavecomment-textarea').val("");
                    //add in HTML fragment for new comment text
                    var commentHtml = ich.template_comment(data[0]); // use ICanHaz to render template HTML
                    commentHtml.find("li.dtreviewed").text(data[2]); // add in formatted date
                    $("#comment-review-number-" + friendlyReviewNumber).append(commentHtml); //.hide().fadeIn("slow");
                    //add event handler for the Report link
                    var newLink = $("a.show-report-comment[data-comment-id='" + data[0].Id + "']");
                    $("a.show-report-comment[data-comment-id='" + data[0].Id + "']").unbind().click(function () {
                        $('#report-comment-start').dialog({ minWidth: 610, resizable: false }).parent('.ui-dialog').attr('id', 'report-comment-start-wrapper');
                        $('input.report-comment-id').val($(this).attr('data-comment-id'));
                        $('input.report-comment-friendlyreviewnumber').val($(this).attr('data-friendlyreviewnumber'));
                        return false;
                    });
                    //increment comment count
                    $("a#comment-count-review-" + friendlyReviewNumber + " span.ui-button-text").text(data[1]);
                    var e_target = $('#comment-review-leavecomment-' + friendlyReviewNumber);
                    $('html, body').animate({ scrollTop: e_target.offset().top }, 0);
                },
                error: function (data) {
                    hideAjaxLoader();
                    data = data.d || data; // .NET adds everything under the d key
                    $('#customer .comments .leavecomment .errormessage').remove();
                    $('#customer .comments .leavecomment').append('<ul class="errormessage"><li>' + getErrorText(data) + '</li></ul>');
                }
            };
            showAjaxLoader();
            $.ajax(options);
        },

        vote: function (button, vote) {
            var friendlyReviewNumber = button.attr('data-reviewnumber');
            $("#votes-error-messages-" + friendlyReviewNumber).empty();
            $("#votes-error-messages-" + friendlyReviewNumber).hide();
            var options = {
                type: "POST",
                url: voteServiceUrl,
                data: "{'friendlyReviewNumber':'" + friendlyReviewNumber + "', 'vote':'" + vote + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    button.find('span').html((parseInt(button.text()) + 1));
                    button.parents('div.votes').find('a.button.down').attr('data-reviewnumber', '');
                    button.parents('div.votes').find('a.button.up').attr('data-reviewnumber', '');
                    clickedSpan.css(originalCss);
                },
                error: function (data) {
                    data = data.d || data; // .NET adds everything under the d key
                    $("#votes-error-messages-" + friendlyReviewNumber).append("<li class='warning'>" + getErrorText(data) + "</li>");
                    $("#votes-error-messages-" + friendlyReviewNumber).show();
                    clickedSpan.css(originalCss);
                }
            };
            // get span properties and store in object
            var clickedSpan = button.find('span.ui-button-text');
            // 
            var originalCss = {
                'background-color': clickedSpan.css('background-color'),
                'background-image': clickedSpan.css('background-image'),
                'background-repeat': clickedSpan.css('background-repeat'),
                'background-position': clickedSpan.css('background-position'),
                'background-attachment': clickedSpan.css('background-attachment'),
                'opacity': clickedSpan.css('opacity')
            };

            //create new properties for loader
            var loaderCss = {
                'background-color': originalCss['background-color'],
                'background-image': 'url("/assets/majestic/images/ajax-loader-taf.gif")',
                'background-repeat': originalCss['background-repeat'],
                'background-position': '8px 4px',
                'background-attachment': originalCss['background-attachment'],
                'opacity': originalCss['opacity']
            };
            //show loader
            clickedSpan.css(loaderCss);
            //send the vote
            $.ajax(options);
        },

        reportReview: function (friendlyReviewNumber, complaintText, complainantEmail) {
            var options = {
                type: "POST",
                url: reportReviewUrl,
                data: "{'friendlyReviewNumber':'" + friendlyReviewNumber + "', 'complainantEmail':'" + complainantEmail + "', 'complaintText':'" + complaintText + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    //hide the input template
                    $('#report-review #report-review-complaint-text').val("");
                    $('#report-review #report-review-complainant-email').val("");
                    $('#report-review input#report-review-review-number').val("");
                    $("#report-review").hide();
                    //show the success template.
                    var scrollY = document.body.scrollTop || document.documentElement.scrollTop; // get the vertical scroll position of browser document
                    var windowWidth = window.innerWidth || document.documentElement.clientWidth;
                    var windowHeight = window.innerHeight || document.documentElement.clientHeight;
                    overlayHeight = $('#confirm-report').height();
                    $("#confirm-report").css({
                        top: function () {
                            var verticalDistance = (windowHeight - overlayHeight) / 2 + scrollY;
                            return (verticalDistance > scrollY) ? verticalDistance : scrollY;
                        }
                    }).fadeIn(800).fadeTo(3000, 1);
                    //fade it out
                    $("#confirm-report").fadeIn(800).fadeTo(3000, 1).fadeOut(800);
                },
                error: function (data) {
                    $("#report-review").hide();
                    data = data.d || data;
                    defaultErrorDisplay(data);
                }
            };
            $.ajax(options);
        },

        addCommentComplaint: function (button) {
            var friendlyReviewNumber = $('input.report-comment-friendlyreviewnumber').val();
            var commentId = $('input.report-comment-id').val();
            var complainantEmail = $('.complainant-email').val();
            var complaintText = $('.complaint-text').val();
            var options = {
                type: "POST",
                url: addCommentComplainUrl,
                data: "{'friendlyReviewNumber':'" + parseInt(friendlyReviewNumber) + "', 'commentId':'" + commentId + "', 'complainantEmail':'" + complainantEmail + "', 'complaintText':'" + complaintText + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    hideAjaxLoader();
                },
                error: function (data) { defaultErrorDisplay(data) }
            };
            showAjaxLoader();
            $.ajax(options);
        },

        addReviewText: function (button) {
            var friendlyReviewNumber = parseInt($('.report-comment-id').val());
            var title = $('.review-title-text').val();
            var text = $('.review-body-text').val();
            var options = {
                type: "POST",
                url: addReviewTextUrl,
                data: "{'friendlyReviewNumber':'" + friendlyReviewNumber + "', 'title':'" + title + "', 'text':'" + text + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    hideAjaxLoader();
                    var reviewElement = $('div#' + data.d.ProductId).parents('li');
                    reviewElement.find('p.customer-review-title').html(data.d.ReviewTitle);
                    reviewElement.find('p.customer-review-body').html(data.d.ReviewText);
                    $('#add-review-text-wrapper').hide();
                    reviewElement.find('div.customer-review').show();

                },
                error: function (data) { defaultErrorDisplay(data) }
            };
            showAjaxLoader();
            $.ajax(options);
        },

        addReviewScore: function (ratingElement, productId, productReviewScore) {
            var options = {
                type: "POST",
                url: addReviewScoreUrl,
                data: "{'productId':'" + productId + "', 'productReviewScore':'" + productReviewScore + "'}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    hideAjaxLoader();
                    $(ratingElement.parents('li').find('.star-rating').children()[0]).attr('data-ratingexists', 'True');
                    $(ratingElement.parents('li').find('.write-a-review')).attr('data-reviewnumber', data.d);
                    ratingElement.parents('li').find('.write-a-review').show();
                    // show write a review bit
                },
                error: function (data) { defaultErrorDisplay(data) }
            };
            showAjaxLoader();
            $.ajax(options);
        },

        facebookShareReview: function () {
            //find the user's review
            var review = $("ul#customer-reviews>li[data-user-review='true']").first();
            var productName = $.trim($('div#single-product-detail h2').first().text());
            var summary = $.trim($('.summary', review).text());
            var starRating = $.trim($('.value', review).text());
            var message = $.trim($('p.description', review).text());
            $().sv_fb('feed_dialog', {
                message: "I wrote a review of " + productName + " on Majestic Wine's website.",
                caption: summary + " (" + starRating + " out of 5 stars)",
                description: message
            });
        },

        twitterShareReview: function () {
            var review = $("ul#customer-reviews>li[data-user-review='true']").first();
            var productName = $.trim($('div#single-product-detail h2').first().text());
            var summary = $.trim($('.summary', review).text());
            var starRating = $.trim($('.value', review).text());
            var message = $.trim($('p.description', review).text());

            var productUrl = document.location.href;
            var text = "I wrote a review of " + productName + " on Majestic Wine's website.";
            var follow = "majesticwine";

            var url = "http://twitter.com/intent/tweet?url=" + productUrl + "&text=" + text + "&via=" + follow;


            // need to tweet it
            // open a window
            var wfeatures = "location=1,status=1,scrollbars=1, width=615,height=440, toolbar=1";
            var win = window.open(url, "Twitter", wfeatures);
            if (win == null || typeof (win) == "undefined") {
                return false;
            }
            return true;

        },

        facebookShareReviewForAccountPages: function () {
            //find the user's review

            var productName = $.trim($(".productnameHidden").val());
            var reviewText = $.trim($(".reviewTextHidden").val());
            var starRating = $.trim($(".ratingHidden").val());
            var reviewTitle = $.trim($(".reviewTitleHidden").val());

            $().sv_fb('feed_dialog', {
                message: "I wrote a review of " + productName + " on Majestic Wine's website.",
                caption: reviewTitle + " (" + starRating + " out of 5 stars)",
                description: reviewText
            });
        },

        twitterShareReviewForAccountPages: function () {
            var productName = $.trim($(".productnameHidden").val());
            var reviewText = $.trim($(".reviewTextHidden").val());
            var starRating = $.trim($(".ratingHidden").val());
            var reviewTitle = $.trim($(".reviewTitleHidden").val());

            var productUrl = document.location.href;
            var text = "I wrote a review of " + productName + " on Majestic Wine's website.";
            var follow = "majesticwine";

            var url = "http://twitter.com/intent/tweet?url=" + productUrl + "&text=" + text + "&via=" + follow;


            // need to tweet it
            // open a window
            var wfeatures = "location=1,status=1,scrollbars=1, width=615,height=440, toolbar=1";
            var win = window.open(url, "Twitter", wfeatures);
            if (win == null || typeof (win) == "undefined") {
                return false;
            }
            return true;

        },

        validateEmail: function (strAddress, allowEmpty) {
            if (strAddress === "") {
                return allowEmpty;
            }
            var emailPattern = /([a-zA-Z0-9_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-\+]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})/;
            return emailPattern.test(strAddress);
        },

        validateRequired: function (strInput) {
            return strInput !== "";
        }

        //other functions here...
    };
} ();

jQuery.fn.center = function() {
    this.css("position", "absolute");
    this.css("top", ($(window).height() - this.height()) / 2 + $(window).scrollTop() + "px");
    this.css("left", ($(window).width() - this.width()) / 2 + $(window).scrollLeft() + "px");
    return this;
};

jQuery(document).ready(function () {

    $('.add-review-btn').click(function () {
        MajesticReviews.addReviewText($(this));
        return false;
    });

    $('.write-a-review').click(function () {
        $('#write-review-form').show().center();
        $('.review-id-hidden-field').val($(this).attr('data-reviewnumber'));
        return false;
    });

    $('#cancelreview').click(function () {
        $('#write-review-form').hide();
        return false;
    });

    $(".write-a-review").each(function () {
        if (!$(this).attr('data-reviewnumber'))
            $(this).hide();
    });

    $('.submit-comment').unbind().click(function () {
        if ($(this).attr('data-reviewnumber')) {
            MajesticReviews.submitComment($(this));
        }
        return false;
    });

    $('a.button.up').unbind().click(function () {
        if ($(this).attr('data-reviewnumber')) {
            MajesticReviews.vote($(this), true);
        }
        return false;
    });

    $('a.button.down').unbind().click(function () {
        if ($(this).attr('data-reviewnumber')) {
            MajesticReviews.vote($(this), false);
        }
        return false;
    });

    //SHOW REPORT REVIEW
    $('a.report-review-link').unbind("click").click(function (e) {
        e.preventDefault();
        //set review number in hidden field
        var friendlyReviewNumber = $(this).attr('data-reviewnumber');
        $('input#report-review-review-number').val(friendlyReviewNumber);
        $('a.close').unbind("click").click(function (ee) {
            ee.preventDefault();
            $('#report-review #report-review-complaint-text').val("");
            $('#report-review #report-review-complainant-email').val("");
            $('#report-review input#report-review-review-number').val("");
            $("#report-review").hide();
        });
        //display the pop-up
        var scrollY = document.body.scrollTop || document.documentElement.scrollTop; // get the vertical scroll position of browser document
        var windowWidth = window.innerWidth || document.documentElement.clientWidth;
        var windowHeight = window.innerHeight || document.documentElement.clientHeight;
        overlayHeight = $('#report-review').height();
        $("#report-review").css({
            top: function () {
                var verticalDistance = (windowHeight - overlayHeight) / 2 + scrollY;
                return (verticalDistance > scrollY) ? verticalDistance : scrollY;
            }
        }).fadeIn(100).fadeTo(3000, 1);
    });

    //SUBMIT REPORT REVIEW FORM
    $('input#report-review-submit').unbind("click").click(function (e) {
        e.preventDefault();
        var hasErrors = false;
        var complaintText = $('#report-review-complaint-text').val();
        var complainantEmail = $('#report-review-complainant-email').val();
        if (!MajesticReviews.validateRequired(complaintText)) {
            hasErrors = true;
            $('#report-review-complaint-text').val('You must enter some text.');
        }
        if (!MajesticReviews.validateEmail(complainantEmail, true)) {
            hasErrors = true;
            $('#report-review-complainant-email').val('You must enter a valid email address.');
        }
        if (hasErrors === true) {
            return false;
        }
        else {
            var friendlyReviewNumber = $('#report-review-review-number').val();
            MajesticReviews.reportReview(friendlyReviewNumber, complaintText, complainantEmail);
        }
    });

    //show report comment
    $('.show-report-comment').click(function (e) {
        e.preventDefault();
        $('#report-comment-start').dialog({ minWidth: 610, resizable: false }).parent('.ui-dialog').attr('id', 'report-comment-start-wrapper');
        $('input.report-comment-id').val($(this).attr('data-comment-id'));
        $('input.report-comment-friendlyreviewnumber').val($(this).attr('data-friendlyreviewnumber'));
    });

    $('a#reportcommentbutton').unbind("click").click(function (e) {
        e.preventDefault();
        var complainantEmail = $('.complainant-email').val();
        var complaintText = $('.complaint-text').val();
        var hasErrors = false;
        //validate
        if (!MajesticReviews.validateRequired(complaintText)) {
            hasErrors = true;
            $('.complaint-text').val('You must enter some text.');
        }
        if (!MajesticReviews.validateEmail(complainantEmail, false)) {
            hasErrors = true;
            $('.complainant-email').val('You must enter a valid email address.');
        }
        if (hasErrors === true) {
            return false;
        }
        else {
            $('#report-comment-start-wrapper').hide();
            $('#report-comment-end').dialog({ minWidth: 610, resizable: false }).parent('.ui-dialog').attr('id', 'report-comment-end-wrapper');
        }
        if ($('input.report-comment-id').val()) {
            MajesticReviews.addCommentComplaint($(this));
        }
    });

    $('a#login-to-add-favourite , a#leave-comment , a#writereview-login , #reviews a.write-review , #single-product-detail .review-summary .no-reviews a.write-review').click(function (e) {
        e.preventDefault();
        $('#login-overlay').dialog({ minWidth: 610, resizable: false }).parent('.ui-dialog').attr('id', 'login-overlay-wrapper');
        return false;
    });

    $('a.favourites-add-review').click(function () {
        $('#write-review-form').show().center();
        $('.product-id-hidden-field').val($(this).attr('data-productid'));

        $('.star-rating .interactive').each(function () {
            new StarRating(this, jQuery(this).siblings('select').get(0), $(this).find('.rating'), null);
        });

        return false;
    });

    $('div.formrow input.add-review-submit-button').click(function () {
        MajesticReviews.reviewAdding = true;
        MajesticReviews.fbPostNewReview = $("div.fb>input:checkbox").is(":checked");
        MajesticReviews.twitterPostNewReview = $("div.twitter>input:checkbox").is(":checked");
        if ($('div#add-product-review-buttons>span#add-product-review-buttons-wait').length <= 0) {
            $('div#add-product-review-buttons').append('<span id="add-product-review-buttons-wait">Please wait while your review is processed. <img src="/Assets/Majestic/Images/ajax-loader-reviews.gif" alt="Loading..." title="Loading..." /></span>');
        }

        return true;
    });



});


