/**
* jQuery Ajax Rater Plugin
*
* This rater is based on the code Ritesh Agrawal did. Unfortunatly his CSS and the hover technique breaks in some browsers.
* So i thought, why not use the best CSS star-rater known to man kind and throw it in the mix.
* I have used the CSS and technique from Komodo Media since it is stable and tested on many, many browsers.
*
* This rater compared, has no cancel button. But i think we can live with that :)
* To avoid conflicts i have changed the function name.
* 
* Licensed under The MIT License
* 
* @version     1.0
* @since       03.01.2007
* @author      Kjell Bublitz <m3nt0r.de@gmail.com
* @link        http://www.m3nt0r.de/devel/raterDemo/ Demonstration and Documentation
* @link        http://php.scripts.psu.edu/rja171/widgets/rating.php Based on Ritesh Agrawal Star Rating System
* @link        http://komodomedia.com/blog/index.php/2007/01/20/css-star-rating-redux/ The Komodo Media CSS Rater Blogpost
* @license     http://www.opensource.org/licenses/mit-license.php MIT 
* @package     jQuery Plugins
* @subpackage  Rater
*/

/**
* Usage: $('#rating').rater('your_servlet', {style:'basic', maxvalue:5, curvalue:0});
*  
* @param url The address you want to post the result to. 
* @param options The style and value attributes
*
* Valid options:
* ---------------------------------------
*       style:       'basic', 'inline' OR 'small'
*       maxvalue:    the maximum value / number of stars
*       curvalue:    the initial value / selected stars
*/
jQuery.fn.rater = function(url, itemId, options) {
    if (url == null || itemId == null) return;
    var settings = {
        url: url,       // post changes to 
        maxvalue: 5,    // max number of stars
        curvalue: 5,    // number of selected stars
        readOnly: false,
        loginUrl: "",
        themeDir: ""
    };

    if (options) { jQuery.extend(settings, options); };
    jQuery.extend(settings, { cancel: (settings.maxvalue > 1) ? true : false });

    var container = jQuery(this);
    jQuery.extend(container, { averageRating: settings.curvalue, url: settings.url });

    if (!settings.style || settings.style == null || settings.style == 'basic') {
        var raterwidth = settings.maxvalue * 20;
        var ratingparent = '<ul class="star-rating" style="width:' + raterwidth + 'px">';
    }
    if (settings.style == 'small') {
        var raterwidth = settings.maxvalue * 10;
        var ratingparent = '<ul class="star-rating small-star" style="width:' + raterwidth + 'px">';
    }
    if (settings.style == 'inline') {
        var raterwidth = settings.maxvalue * 10;
        var ratingparent = '<span class="inline-rating"><ul class="star-rating small-star" style="width:' + raterwidth + 'px">';
    }

    container.append(ratingparent);

    // create rater
    var starWidth, starIndex, listitems = '';
    var curvalueWidth = Math.floor(100 / settings.maxvalue * settings.curvalue);
    for (var i = 0; i <= settings.maxvalue; i++) {
        if (i == 0) {
            listitems += '<li class="current-rating" style="width:' + curvalueWidth + '%;">' + settings.curvalue + '/' + settings.maxvalue + '</li>';
        } else {
            starWidth = Math.floor(100 / settings.maxvalue * i);
            starIndex = (settings.maxvalue - i) + 2;
            listitems += '<li class="star"><a href="#' + i + '" title="' + i + '/' + settings.maxvalue + '" style="width:' + starWidth + '%;z-index:' + starIndex + '">' + i + '</a></li>';
        }
    }

    container.find('.star-rating').append(listitems); // i am using find here, because the span wrapped in the small style would break children()
    //    if (settings.maxvalue > 1) // add a container for the ajax result
    //    {
    //        container.append('<span class="star-rating-result"></span>');
    //    }
    var stars = (container).find('.star-rating').children('.star');

    if (settings.loginUrl.length != 0) {
        stars.empty();
        jQuery('.star-rating').wrap('<a href="' + settings.loginUrl + '"></a>');
        return true;
    }
    else if (settings.readOnly == 'True') {
        //stars.empty();
    }

    stars.click(function() {
        if (settings.maxvalue == 1) // on / off
        {
            //settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
            //jQuery(container).find('.star-rating').children('.current-rating').css({ width: (settings.curvalue * 100) + '%' });
            //jQuery.post(container.url, { "rating": settings.curvalue, "itemId": itemId });
            return false;
        }
        else {
            settings.curvalue = stars.index(this) + 1;
            raterValue = jQuery(this).children('a')[0].href.split('#')[1];

            $('#btnClose').unbind('click');
            if (raterValue <= 2) {
                $('#btnClose').html('Cancel');
                $('#btnClose').click(function() {
                    if ($("#layer1").css("display") != "none")
                        $("#layer1").fadeOut("slow");
                });
            }
            else {
                $('#btnClose').html('Close');
                $('#btnClose').click(function() {
                    return submitReview(container.url, itemId, raterValue, null);
                });
            }
            $('#btnSubmit').unbind('click');
            $('#btnSubmit').click(function() {
                return submitReview(container.url, itemId, raterValue, $("#txtReview").val());
            });

            $("#uRateSmall").attr("src", settings.themeDir + "/images/rates/stars" + raterValue + ".gif");

            //display review window
            if ($("#layer1").css("display") == "none") {
                $("#layer1").css("left", $("#ctl00_MainContent_AddToCart_textqty").offset().left);
                $("#layer1").css("top", $("#ctl00_MainContent_AddToCart_textqty").offset().top - $("#layer1").height() + $("#ctl00_MainContent_AddToCart_textqty").height());
                $("#layer1").fadeIn("slow");
            }

            $("#txtReview").focus();

            return false;
        }
        return true;
    });

    return this; // strict warning: anonymous function does not always return a value. fix?
}

function submitReview(url, itemId, rateValue, review) {
    if (review != null) {
        if (rateValue <= 2 && review.length == 0) {
            alert("Please enter some text for your review.");
            return false;
        }
        if (review.length < 10) {
            alert("The review at least 10 characters.");
            return false;
        }
    }
    else {
        review = "";
    }

    jQuery.post(url, { "operation": "VOTE", "rating": rateValue, "itemId": itemId, "review": review }, function(data) {
        //after submit
        $("#layer1").fadeOut("slow");

        if (data != null) {
            if (data.Review.length == 0) {
                if ($("#" + data.MemberNumber).html() != null) {
                    $("#" + data.MemberNumber).remove();
                }
                if (jQuery.trim($("#divReviews").html()).length == 0) {
                    $("#lnkReadReview").css("display", "none");
                    $("#divCR").css("display", "none");
                }
            }
            else {
                var html = htmlTemp;
                html = html.replace("[MemberNumber]", data.MemberNumber);
                html = html.replace("[Rate]", data.Rate);
                html = html.replace("[VoteDate]", data.VoteDate);
                html = html.replace("[MemberName]", data.MemberName);
                //html = html.replace("[Country]", data.Country);
                html = html.replace("[Review]", data.Review);

                if (data.Approval == 0 && data.Review.length > 0) {
                    html = html.replace("[Approval]", "<b>(Waiting approval)</b>");
                }
                else {
                    html = html.replace("[Approval]", "");
                }

                if ($("#" + data.MemberNumber).html() == null) {
                    $("#divReviews").html(html + $("#divReviews").html());
                }
                else {
                    $("#" + data.MemberNumber).replaceWith(html);
                }

                $("#lnkReadReview").css("display", "block");
                $("#divCR").css("display", "block");
            }

            $('#divRS').html(data.AverageRate + '/5 (' + data.VoteCount + ' Ratings)');

            //show rating after click
            //stars.empty();
            $('.current-rating').attr('style', 'width:' + data.AverageRate * 20 + '%;');
            //alert($("#" + data.MemberNumber).html());
            if ($("#" + data.MemberNumber).html() != null && $("#" + data.MemberNumber + ">img") != null) {
                $("#" + data.MemberNumber + ">img").attr("title", data.Rate);

                var imgUrl = $("#" + data.MemberNumber + ">img").attr("src");
                for (var i = 0; i <= 5; i++) {
                    imgUrl = imgUrl.replace("stars" + i + ".gif", "stars" + data.Rate + ".gif");
                }

                $("#" + data.MemberNumber + ">img").attr("src", imgUrl);
            }
        }
    }, "json");
}