﻿/*
### jQuery Star Rating Plugin v2.0 - 2008-03-12 ###
By Diego A, http://www.fyneworks.com, diego@fyneworks.com
- v2 by Keith Wood, http://keith-wood.name/, kbwood@virginbroadband.com.au
 
Project: http://plugins.jquery.com/project/MultipleFriendlyStarRating
Website: http://www.fyneworks.com/jquery/star-rating/
	
This is a modified version of the star rating plugin from:
http://www.phpletter.com/Demo/Jquery-Star-Rating-Plugin/
*/
// ORIGINAL COMMENTS:
/*************************************************
This is hacked version of star rating created by <a href="http://php.scripts.psu.edu/rja171/widgets/rating.php">Ritesh Agrawal</a>
It thansform a set of radio type input elements to star rating type and remain the radio element name and value,
so could be integrated with your form. It acts as a normal radio button.
modified by : Logan Cai (cailongqun[at]yahoo.com.cn)
website:www.phpletter.com
************************************************/


/*# AVOID COLLISIONS #*/
; if (jQuery) (function ($) {
    /*# AVOID COLLISIONS #*/

    $.fn.rating = function (settings) {
        settings = $.extend({
            cancel: 'Cancel Rating', // advisory title for the 'cancel' link
            cancelValue: '',         // value to submit when user click the 'cancel' link
            half: false,             // enable half-star rating
            required: false,         // disables the 'cancel' button so user can only select one of the specified values
            readOnly: false          // disable rating plugin interaction/ values cannot be changed
        }, settings || {});

        // multiple star ratings on one page
        var groups = {};

        // plugin events
        var event = {
            fill: function (n, el, style) { // fill to the current mouse position.
                this.drain(n);
                $(el).prevAll('.star').andSelf().addClass(style || 'star_hover');
            },
            drain: function (n) { // drain all the stars.
                $(groups[n].valueElem).siblings('.star').removeClass('star_on').removeClass('star_hover');
            },
            reset: function (n) { // Reset the stars to the default index.
                if (!$(groups[n].currentElem).is('.cancel')) {
                    $(groups[n].currentElem).prevAll('.star').andSelf().addClass('star_on');
                }
            },
            click: function (n, el) { // Selected a star or cancelled
                groups[n].currentElem = el;
                var curValue = $(el).children('a').text();
                // Set value
                $(groups[n].valueElem).val(curValue);
                // Update display
                event.drain(n);
                event.reset(n);
                // callback function, as requested here: http://plugins.jquery.com/node/1655
                if (settings.callback) settings.callback.apply(groups[n].valueElem, [curValue, el]);
            }
        };

        // loop through each matched element
        this.each(function (i) {
            // grouping:
            var n = this.name;
            if (!groups[n]) groups[n] = { count: 0 };
            i = groups[n].count;
            groups[n].count++;

            // Things to do with the first element...
            if (i == 0) {
                // Accept readOnly setting from 'disabled' property
                settings.readOnly = $(this).attr('disabled') || settings.readOnly;
                // Create value element (disabled if readOnly)
                groups[n].valueElem = $('<input type="hidden" name="' + n + '" value=""' + (settings.readOnly ? ' disabled="disabled"' : '') + '>');
                // Insert value element into form
                $(this).before(groups[n].valueElem);

                if (settings.readOnly || settings.required) {
                    // DO NOT display 'cancel' button
                }
                else {
                    // Display 'cancel' button
                    $(this).before(
     $('<div class="cancel"><a title="' + settings.cancel + '">' + settings.cancelValue + '</a></div>')
					.mouseover(function () { event.drain(n); $(this).addClass('star_on'); })
					.mouseout(function () { event.reset(n); $(this).removeClass('star_on'); })
					.click(function () { event.click(n, this); })
    );
                }
            }; // if (i == 0) (first element)

            // insert rating option right after preview element
            eStar = $('<div class="star"><a title="' + (this.title || this.value) + '">' + this.value + '</a></div>');
            $(this).after(eStar);

            // Half-stars
            if (settings.half) $(eStar).addClass('star_' + (i % 2 > 0 ? 'even' : 'odd') + '');

            if (settings.readOnly) {
                // Mark star as readOnly so user can customize display
                $(eStar).addClass('star_readonly');
            }
            else {
                // Attach mouse events
                $(eStar)
			.mouseover(function () { event.drain(n); event.fill(n, this); })
			.mouseout(function () { event.drain(n); event.reset(n); })
			.click(function () { event.click(n, this); });
            };

            //if(console) console.log(['###', n, this.checked, groups[n].initial]);
            if (this.checked) groups[n].currentElem = eStar;

            //remove this checkbox
            $(this).remove();

            // reset display if last element
            if (i + 1 == this.length) event.reset(n);

        }); // each element

        // initialize groups...
        for (n in groups)//{ not needed, save a byte!
            if (groups[n].currentElem) {
                event.fill(n, groups[n].currentElem, 'star_on');
                $(groups[n].valueElem).val($(groups[n].currentElem).children('a').text());
            }
        //}; not needed, save a byte!

        return this; // don't break the chain...
    };



    /*# AVOID COLLISIONS #*/
})(jQuery);
/*# AVOID COLLISIONS #*/

