{"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/"}