{"version":3,"sources":["jquery.barrating.js"],"names":["$","BarRating","root","window","global","self","this","wrapElement","$elem","wrap","class","options","wrapperClass","unwrapElement","unwrap","findInitialOption","option","initialRating","saveDataOnElement","$opt","data","userOptions","currentRatingValue","val","currentRatingText","text","originalRatingValue","originalRatingText","deselectable","find","removeDataOnElement","removeData","buildWidget","$w","each","html","$a","$span","href","data-rating-value","data-rating-text","append","showSelectedRating","reverse","addClass","readonly","nextAllorPreviousAll","setSelectFieldValue","value","prop","change","parent","applyStyle","removeClass","attachClickHandler","$all","on","event","preventDefault","attr","hasClass","onSelect","call","attachMouseEnterHandler","mouseenter","attachMouseLeaveHandler","$widget","mouseleave","fastClicks","stopPropagation","click","disableClicks","show","insertAfter","hide","set","clear","onClear","destroy","off","remove","onDestroy","prototype","init","elem","extend","fn","barrating","defaults","method","plugin","is","error","hasOwnProperty","next","showValues","jQuery"],"mappings":"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","file":"jquery.barrating.min.js","sourcesContent":["/**\n * jQuery Bar Rating Plugin v1.1.0\n *\n * http://github.com/antennaio/jquery-bar-rating\n *\n * Copyright (c) 2012-2015 Kazik Pietruszewski\n *\n * Dual licensed under the MIT and GPL licenses:\n * http://www.opensource.org/licenses/mit-license.php\n * http://www.gnu.org/licenses/gpl.html\n */\n(function ($) {\n    var BarRating, root;\n\n    root = typeof window !== \"undefined\" && window !== null ? window : global;\n\n    root.BarRating = BarRating = (function() {\n\n        function BarRating() {\n            var self = this;\n\n            // wrap element in a wrapper div\n            var wrapElement = function() {\n                self.$elem.wrap($('<div />', {\n                    'class': self.options.wrapperClass\n                }));\n            };\n\n            // unwrap element\n            var unwrapElement = function() {\n                self.$elem.unwrap();\n            };\n\n            // return initial option\n            var findInitialOption = function() {\n                var option;\n\n                if (self.options.initialRating) {\n                    option = $('option[value=\"' + self.options.initialRating  + '\"]', self.$elem);\n                } else {\n                    option = $('option:selected', self.$elem);\n                }\n\n                return option;\n            };\n\n            // save data on element\n            var saveDataOnElement = function() {\n                var $opt = findInitialOption();\n\n                self.$elem.data('barrating', {\n\n                    userOptions: self.options,\n\n                    // initial rating based on the OPTION value\n                    currentRatingValue: $opt.val(),\n                    currentRatingText: ($opt.data('html')) ? $opt.data('html') : $opt.text(),\n\n                    // rating will be restored by calling clear method\n                    originalRatingValue: $opt.val(),\n                    originalRatingText: ($opt.data('html')) ? $opt.data('html') : $opt.text()\n\n                });\n\n                // first OPTION empty - allow deselecting of ratings\n                self.$elem.data('barrating').deselectable =\n                    (!self.$elem.find('option:first').val()) ? true : false;\n            };\n\n            // remove data on element\n            var removeDataOnElement = function() {\n                self.$elem.removeData('barrating');\n            };\n\n            // build widget and return jQuery element\n            var buildWidget = function() {\n                var $w = $('<div />', { 'class': 'br-widget' });\n\n                // create A elements that will replace OPTIONs\n                self.$elem.find('option').each(function() {\n                    var val, text, html, $a, $span;\n\n                    val = $(this).val();\n\n                    // create ratings - but only if val is defined\n                    if (val) {\n                        text = $(this).text();\n                        html = $(this).data('html');\n                        if (html) { text = html; }\n\n                        $a = $('<a />', { 'href': '#', 'data-rating-value': val, 'data-rating-text': text });\n                        $span = $('<span />', { 'html': (self.options.showValues) ? text : '' });\n\n                        $w.append($a.append($span));\n                    }\n\n                });\n\n                // append .br-current-rating div to the widget\n                if (self.options.showSelectedRating) {\n                    $w.append($('<div />', { 'text': '', 'class': 'br-current-rating' }));\n                }\n\n                // additional classes for the widget\n                if (self.options.reverse) {\n                    $w.addClass('br-reverse');\n                }\n\n                if (self.options.readonly) {\n                    $w.addClass('br-readonly');\n                }\n\n                return $w;\n            };\n\n            // return a jQuery function name depending on the 'reverse' setting\n            var nextAllorPreviousAll = function() {\n                if (self.options.reverse) {\n                    return 'nextAll';\n                } else {\n                    return 'prevAll';\n                }\n            };\n\n            // set the value of the select field\n            var setSelectFieldValue = function(value) {\n                // change selected OPTION in the select field (hidden)\n                self.$elem.find('option[value=\"' + value + '\"]').prop('selected', true);\n                self.$elem.change();\n            };\n\n            // display the currently selected rating\n            var showSelectedRating = function(text) {\n                // text undefined?\n                text = text ? text : self.$elem.data('barrating').currentRatingText;\n\n                // update .br-current-rating div\n                if (self.options.showSelectedRating) {\n                    self.$elem.parent().find('.br-current-rating').text(text);\n                }\n            };\n\n            // apply style by setting classes on elements\n            var applyStyle = function($w) {\n                // remove classes\n                $w.find('a').removeClass('br-selected br-current');\n\n                // add classes\n                $w.find('a[data-rating-value=\"' + self.$elem.data('barrating').currentRatingValue + '\"]')\n                    .addClass('br-selected br-current')[nextAllorPreviousAll()]()\n                    .addClass('br-selected');\n            };\n\n            // handle click events\n            var attachClickHandler = function($all) {\n                $all.on('click', function(event) {\n                    var $a = $(this),\n                        value,\n                        text;\n\n                    event.preventDefault();\n\n                    $all.removeClass('br-active br-selected');\n                    $a.addClass('br-selected')[nextAllorPreviousAll()]()\n                        .addClass('br-selected');\n\n                    value = $a.attr('data-rating-value');\n                    text = $a.attr('data-rating-text');\n\n                    // is current and deselectable?\n                    if ($a.hasClass('br-current') && self.$elem.data('barrating').deselectable) {\n                        $a.removeClass('br-selected br-current')[nextAllorPreviousAll()]()\n                            .removeClass('br-selected br-current');\n                        value = ''; text = '';\n                    } else {\n                        $all.removeClass('br-current');\n                        $a.addClass('br-current');\n                    }\n\n                    // remember selected rating\n                    self.$elem.data('barrating').currentRatingValue = value;\n                    self.$elem.data('barrating').currentRatingText = text;\n\n                    setSelectFieldValue(value);\n                    showSelectedRating(text);\n\n                    // onSelect callback\n                    self.options.onSelect.call(\n                        this,\n                        self.$elem.data('barrating').currentRatingValue,\n                        self.$elem.data('barrating').currentRatingText\n                    );\n\n                    return false;\n                });\n            };\n\n            // handle mouseenter events\n            var attachMouseEnterHandler = function($all) {\n                $all.on({\n                    mouseenter: function() {\n                        var $a = $(this);\n\n                        $all.removeClass('br-active br-selected');\n                        $a.addClass('br-active')[nextAllorPreviousAll()]()\n                            .addClass('br-active');\n\n                        showSelectedRating($a.attr('data-rating-text'));\n                    }\n                });\n            };\n\n            // handle mouseleave events\n            var attachMouseLeaveHandler = function($all, $widget) {\n                $widget.on({\n                    mouseleave: function() {\n                        $all.removeClass('br-active');\n                        showSelectedRating();\n                        applyStyle($widget);\n                    }\n                });\n            };\n\n            // somewhat primitive way to remove 300ms click delay on touch devices\n            // for a more advanced solution consider setting `fastClicks` option to false\n            // and using a library such as fastclick (https://github.com/ftlabs/fastclick)\n            var fastClicks = function($all) {\n                $all.on('touchstart', function(event) {\n                    event.preventDefault();\n                    event.stopPropagation();\n\n                    $(this).click();\n                });\n            };\n\n            // disable clicks\n            var disableClicks = function($all) {\n                $all.on('click', function(event) {\n                    event.preventDefault();\n                });\n            };\n\n            this.show = function() {\n                var $widget, $all;\n\n                // run only once\n                if (self.$elem.data('barrating')) return;\n\n                // wrap element\n                wrapElement();\n\n                // save data\n                saveDataOnElement();\n\n                // build & append widget to the DOM\n                $widget = buildWidget();\n                $widget.insertAfter(self.$elem);\n                applyStyle($widget);\n\n                showSelectedRating();\n\n                $all = $widget.find('a');\n\n                if (self.options.fastClicks) {\n                    fastClicks($all);\n                }\n\n                if (self.options.readonly) {\n\n                    // do not react to click events if rating is read-only\n                    disableClicks($all);\n\n                } else {\n\n                    // attach click event handler\n                    attachClickHandler($all);\n\n                    // attach mouseenter event handler\n                    attachMouseEnterHandler($all);\n\n                     // attach mouseleave event handler\n                    attachMouseLeaveHandler($all, $widget);\n\n                }\n\n                // hide the select field\n                self.$elem.hide();\n            };\n\n            this.set = function(value) {\n                if (!this.$elem.find('option[value=\"' + value + '\"]').val()) return;\n\n                // set data\n                this.$elem.data('barrating').currentRatingValue = value;\n                this.$elem.data('barrating').currentRatingText = this.$elem.find('option[value=\"' + value + '\"]').text();\n\n                setSelectFieldValue(this.$elem.data('barrating').currentRatingValue);\n                showSelectedRating(this.$elem.data('barrating').currentRatingText);\n\n                applyStyle(this.$widget);\n            };\n\n            this.clear = function() {\n                // restore original data\n                this.$elem.data('barrating').currentRatingValue = this.$elem.data('barrating').originalRatingValue;\n                this.$elem.data('barrating').currentRatingText = this.$elem.data('barrating').originalRatingText;\n\n                setSelectFieldValue(this.$elem.data('barrating').currentRatingValue);\n                showSelectedRating(this.$elem.data('barrating').currentRatingText);\n\n                applyStyle(this.$widget);\n\n                // onClear callback\n                this.$elem.data('barrating').userOptions.onClear.call(\n                    this,\n                    this.$elem.data('barrating').currentRatingValue,\n                    this.$elem.data('barrating').currentRatingText\n                );\n            };\n\n            this.destroy = function() {\n                var value = this.$elem.data('barrating').currentRatingValue;\n                var text = this.$elem.data('barrating').currentRatingText;\n                var options = this.$elem.data('barrating').userOptions;\n\n                this.$widget.off().remove();\n\n                // remove data\n                removeDataOnElement();\n\n                // unwrap the element\n                unwrapElement();\n\n                // show the element\n                this.$elem.show();\n\n                // onDestroy callback\n                options.onDestroy.call(\n                    this,\n                    value,\n                    text\n                );\n            };\n        }\n\n        BarRating.prototype.init = function (options, elem) {\n            this.$elem = $(elem);\n            this.options = $.extend({}, $.fn.barrating.defaults, options);\n\n            return this.options;\n        };\n\n        return BarRating;\n    })();\n\n    $.fn.barrating = function (method, options) {\n        return this.each(function () {\n            var plugin = new BarRating();\n\n            // plugin works with select fields\n            if (!$(this).is('select')) {\n                $.error('Sorry, this plugin only works with select fields.');\n            }\n\n            // method supplied\n            if (plugin.hasOwnProperty(method)) {\n                plugin.init(options, this);\n                if (method === 'show') {\n                    return plugin.show(options);\n                } else {\n                    // plugin exists?\n                    if (plugin.$elem.data('barrating')) {\n                        plugin.$widget = $(this).next('.br-widget');\n                        return plugin[method](options);\n                    }\n                }\n\n            // no method supplied or only options supplied\n            } else if (typeof method === 'object' || !method) {\n                options = method;\n                plugin.init(options, this);\n                return plugin.show();\n\n            } else {\n                $.error('Method ' + method + ' does not exist on jQuery.barrating');\n            }\n        });\n    };\n\n    $.fn.barrating.defaults = {\n        initialRating:null, // initial rating\n        showValues:false, // display rating values on the bars?\n        showSelectedRating:true, // append a div with a rating to the widget?\n        reverse:false, // reverse the rating?\n        readonly:false, // make the rating ready-only?\n        fastClicks:true, // remove 300ms click delay on touch devices?\n        wrapperClass:'br-wrapper', // class applied to wrapper div\n        onSelect:function (value, text) {\n        }, // callback fired when a rating is selected\n        onClear:function (value, text) {\n        }, // callback fired when a rating is cleared\n        onDestroy:function (value, text) {\n        } // callback fired when a widget is destroyed\n    };\n\n    return $.fn.barrating.defaults;\n\n})(jQuery);\n"],"sourceRoot":"/source/"}