/*!
* jQuery UI Stars v3.0.1
* http://plugins.jquery.com/project/Star_Rating_widget
*
* Copyright (c) 2010 Marek "Orkan" Zajac (orkans@gmail.com)
* Dual licensed under the MIT and GPL licenses.
* http://docs.jquery.com/License
*
* $Rev: 164 $
* $Date:: 2010-05-01 #$
* $Build: 35 (2010-05-01)
*
* Depends:
*	jquery.ui.core.js
*	jquery.ui.widget.js
*
*/
(function ($) {

    $.widget('ui.stars', {
        options: {
            inputType: 'radio', // [radio|select]
            split: 0, // decrease number of stars by splitting each star into pieces [2|3|4|...]
            disabled: false, // set to [true] to make the stars initially disabled
            cancelTitle: 'Cancel Rating',
            cancelValue: 0, // default value of Cancel btn.
            cancelShow: true,
            disableValue: true, // set to [false] to not disable the hidden input when Cancel btn is clicked, so the value will present in POST data.
            oneVoteOnly: false,
            showTitles: false,
            captionEl: null, // jQuery object - target for text captions 
            callback: null, // function(ui, type, value, event)

            /*
            * CSS classes
            */
            starWidth: 16, // width of the star image
            cancelClass: 'ui-stars-cancel',
            starClass: 'ui-stars-star',
            starOnClass: 'ui-stars-star-on',
            starHoverClass: 'ui-stars-star-hover',
            starDisabledClass: 'ui-stars-star-disabled',
            cancelHoverClass: 'ui-stars-cancel-hover',
            cancelDisabledClass: 'ui-stars-cancel-disabled'
        },

        _create: function () {
            var self = this, o = this.options, starId = 0;
            this.element.data('former.stars', this.element.html());

            o.isSelect = o.inputType == 'select';
            this.$form = $(this.element).closest('form');
            this.$selec = o.isSelect ? $('select', this.element) : null;
            this.$rboxs = o.isSelect ? $('option', this.$selec) : $(':radio', this.element);

            /*
            * Map all inputs from $rboxs array to Stars elements
            */
            this.$stars = this.$rboxs.map(function (i) {
                var el = {
                    value: this.value,
                    title: (o.isSelect ? this.text : this.title) || this.value,
                    isDefault: (o.isSelect && this.defaultSelected) || this.defaultChecked
                };

                if (i == 0) {
                    o.split = typeof o.split != 'number' ? 0 : o.split;
                    o.val2id = [];
                    o.id2val = [];
                    o.id2title = [];
                    o.name = o.isSelect ? self.$selec.get(0).name : this.name;
                    o.disabled = o.disabled || (o.isSelect ? $(self.$selec).attr('disabled') : $(this).attr('disabled'));
                }

                /*
                * Consider it as a Cancel button?
                */
                if (el.value == o.cancelValue) {
                    o.cancelTitle = el.title;
                    return null;
                }

                o.val2id[el.value] = starId;
                o.id2val[starId] = el.value;
                o.id2title[starId] = el.title;

                if (el.isDefault) {
                    o.checked = starId;
                    o.value = o.defaultValue = el.value;
                    o.title = el.title;
                }

                var $s = $('<div/>').addClass(o.starClass);
                var $a = $('<a/>').attr('title', o.showTitles ? el.title : '').text(el.value);

                /*
                * Prepare division settings
                */
                if (o.split) {
                    var oddeven = (starId % o.split);
                    var stwidth = Math.floor(o.starWidth / o.split);
                    $s.width(stwidth);
                    $a.css('margin-left', '-' + (oddeven * stwidth) + 'px');
                }

                starId++;
                return $s.append($a).get(0);
            });

            /*
            * How many Stars?
            */
            o.items = starId;

            /*
            * Remove old content
            */
            o.isSelect ? this.$selec.remove() : this.$rboxs.remove();

            /*
            * Append Stars interface
            */
            this.$cancel = $('<div/>').addClass(o.cancelClass).append($('<a/>').attr('title', o.showTitles ? o.cancelTitle : '').text(o.cancelValue));
            o.cancelShow &= !o.disabled && !o.oneVoteOnly;
            o.cancelShow && this.element.append(this.$cancel);
            this.element.append(this.$stars);

            /*
            * Initial selection
            */
            if (o.checked === undefined) {
                o.checked = -1;
                o.value = o.defaultValue = o.cancelValue;
                o.title = '';
            }

            /*
            * The only FORM element, that has been linked to the stars control. The value field is updated on each Star click event
            */
            this.$value = $("<input type='hidden' name='" + o.name + "' value='" + o.value + "' />");
            this.element.append(this.$value);


            /*
            * Attach stars event handler
            */
            this.$stars.bind('click.stars', function (e) {
                if (!o.forceSelect && o.disabled) return false;

                var i = self.$stars.index(this);
                o.checked = i;
                o.value = o.id2val[i];
                o.title = o.id2title[i];
                self.$value.attr({ disabled: o.disabled ? 'disabled' : '', value: o.value });

                fillTo(i, false);
                self._disableCancel();

                !o.forceSelect && self.callback(e, 'star');
            })
		.bind('mouseover.stars', function () {
		    if (o.disabled) return false;
		    var i = self.$stars.index(this);
		    fillTo(i, true);
		})
		.bind('mouseout.stars', function () {
		    if (o.disabled) return false;
		    fillTo(self.options.checked, false);
		});


            /*
            * Attach cancel event handler
            */
            this.$cancel.bind('click.stars', function (e) {
                if (!o.forceSelect && (o.disabled || o.value == o.cancelValue)) return false;

                o.checked = -1;
                o.value = o.cancelValue;
                o.title = '';

                self.$value.val(o.value);
                o.disableValue && self.$value.attr({ disabled: 'disabled' });

                fillNone();
                self._disableCancel();

                !o.forceSelect && self.callback(e, 'cancel');
            })
		.bind('mouseover.stars', function () {
		    if (self._disableCancel()) return false;
		    self.$cancel.addClass(o.cancelHoverClass);
		    fillNone();
		    self._showCap(o.cancelTitle);
		})
		.bind('mouseout.stars', function () {
		    if (self._disableCancel()) return false;
		    self.$cancel.removeClass(o.cancelHoverClass);
		    self.$stars.triggerHandler('mouseout.stars');
		});


            /*
            * Attach onReset event handler to the parent FORM
            */
            this.$form.bind('reset.stars', function () {
                !o.disabled && self.select(o.defaultValue);
            });


            /*
            * Clean up to avoid memory leaks in certain versions of IE 6
            */
            $(window).unload(function () {
                self.$cancel.unbind('.stars');
                self.$stars.unbind('.stars');
                self.$form.unbind('.stars');
                self.$selec = self.$rboxs = self.$stars = self.$value = self.$cancel = self.$form = null;
            });


            /*
            * Star selection helpers
            */
            function fillTo(index, hover) {
                if (index != -1) {
                    var addClass = hover ? o.starHoverClass : o.starOnClass;
                    var remClass = hover ? o.starOnClass : o.starHoverClass;
                    self.$stars.eq(index).prevAll('.' + o.starClass).andSelf().removeClass(remClass).addClass(addClass);
                    self.$stars.eq(index).nextAll('.' + o.starClass).removeClass(o.starHoverClass + ' ' + o.starOnClass);
                    self._showCap(o.id2title[index]);
                }
                else fillNone();
            };
            function fillNone() {
                self.$stars.removeClass(o.starOnClass + ' ' + o.starHoverClass);
                self._showCap('');
            };


            /*
            * Finally, set up the Stars
            */
            this.select(o.value);
            o.disabled && this.disable();

        },

        /*
        * Private functions
        */
        _disableCancel: function () {
            var o = this.options, disabled = o.disabled || o.oneVoteOnly || (o.value == o.cancelValue);
            if (disabled) this.$cancel.removeClass(o.cancelHoverClass).addClass(o.cancelDisabledClass);
            else this.$cancel.removeClass(o.cancelDisabledClass);
            this.$cancel.css('opacity', disabled ? 0.5 : 1);
            return disabled;
        },
        _disableAll: function () {
            var o = this.options;
            this._disableCancel();
            if (o.disabled) this.$stars.filter('div').addClass(o.starDisabledClass);
            else this.$stars.filter('div').removeClass(o.starDisabledClass);
        },
        _showCap: function (s) {
            var o = this.options;
            if (o.captionEl) o.captionEl.text(s);
        },

        /*
        * Public functions
        */
        value: function () {
            return this.options.value;
        },
        select: function (val) {
            var o = this.options, e = (val == o.cancelValue) ? this.$cancel : this.$stars.eq(o.val2id[val]);
            o.forceSelect = true;
            e.triggerHandler('click.stars');
            o.forceSelect = false;
        },
        selectID: function (id) {
            var o = this.options, e = (id == -1) ? this.$cancel : this.$stars.eq(id);
            o.forceSelect = true;
            e.triggerHandler('click.stars');
            o.forceSelect = false;
        },
        enable: function () {
            this.options.disabled = false;
            this._disableAll();
        },
        disable: function () {
            this.options.disabled = true;
            this._disableAll();
        },
        destroy: function () {
            this.$form.unbind('.stars');
            this.$cancel.unbind('.stars').remove();
            this.$stars.unbind('.stars').remove();
            this.$value.remove();
            this.element.unbind('.stars').html(this.element.data('former.stars')).removeData('stars');
            return this;
        },
        callback: function (e, type) {
            var o = this.options;
            o.callback && o.callback(this, type, o.value, e);
            o.oneVoteOnly && !o.disabled && this.disable();
        }
    });

    $.extend($.ui.stars, {
        version: '3.0.1'
    });

})(jQuery);

