- [% SET rating_avg = SEARCH_RESULT.ratings.get_avg_rating() %]
- [% rating_avg_int = BLOCK %][% rating_avg | format("%.0f") %][% END %]
- [% FOREACH i IN [ 1 2 3 4 5 ] %]
- [% IF rating_avg_int == i %]
-
- [% ELSE %]
-
- [% END %]
- [% END %]
+ [% SET rating_avg = SEARCH_RESULT.ratings.get_avg_rating() %]
+ [% rating_avg_int = BLOCK %][% rating_avg | format("%.0f") %][% END %]
+
[% IF SEARCH_RESULT.ratings.count > 0 %]
([% SEARCH_RESULT.ratings.count | html %] votes)
--- a/koha-tmpl/opac-tmpl/bootstrap/lib/jquery/plugins/jquery.rating.js
+++ a/koha-tmpl/opac-tmpl/bootstrap/lib/jquery/plugins/jquery.rating.js
@@ -1,392 +0,0 @@
-/*
- ### jQuery Star Rating Plugin v3.14 - 2012-01-26 ###
- * Home: http://www.fyneworks.com/jquery/star-rating/
- * Code: http://code.google.com/p/jquery-star-rating-plugin/
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- ###
-*/
-
-/*# AVOID COLLISIONS #*/
-;if(window.jQuery) (function($){
-/*# AVOID COLLISIONS #*/
-
- // IE6 Background Image Fix
- if ($.browser.msie) try { document.execCommand("BackgroundImageCache", false, true)} catch(e) { };
- // Thanks to http://www.visualjquery.com/rating/rating_redux.html
-
- // plugin initialization
- $.fn.rating = function(options){
- if(this.length==0) return this; // quick fail
-
- // Handle API methods
- if(typeof arguments[0]=='string'){
- // Perform API methods on individual elements
- if(this.length>1){
- var args = arguments;
- return this.each(function(){
- $.fn.rating.apply($(this), args);
- });
- };
- // Invoke API method handler
- $.fn.rating[arguments[0]].apply(this, $.makeArray(arguments).slice(1) || []);
- // Quick exit...
- return this;
- };
-
- // Initialize options for this call
- var options = $.extend(
- {}/* new object */,
- $.fn.rating.options/* default options */,
- options || {} /* just-in-time options */
- );
-
- // Allow multiple controls with the same name by making each call unique
- $.fn.rating.calls++;
-
- // loop through each matched element
- this
- .not('.star-rating-applied')
- .addClass('star-rating-applied')
- .each(function(){
-
- // Load control parameters / find context / etc
- var control, input = $(this);
- var eid = (this.name || 'unnamed-rating').replace(/\[|\]/g, '_').replace(/^\_+|\_+$/g,'');
- var context = $(this.form || document.body);
-
- // FIX: http://code.google.com/p/jquery-star-rating-plugin/issues/detail?id=23
- var raters = context.data('rating');
- if(!raters || raters.call!=$.fn.rating.calls) raters = { count:0, call:$.fn.rating.calls };
- var rater = raters[eid];
-
- // if rater is available, verify that the control still exists
- if(rater) control = rater.data('rating');
-
- if(rater && control)//{// save a byte!
- // add star to control if rater is available and the same control still exists
- control.count++;
-
- //}// save a byte!
- else{
- // create new control if first star or control element was removed/replaced
-
- // Initialize options for this rater
- control = $.extend(
- {}/* new object */,
- options || {} /* current call options */,
- ($.metadata? input.metadata(): ($.meta?input.data():null)) || {}, /* metadata options */
- { count:0, stars: [], inputs: [] }
- );
-
- // increment number of rating controls
- control.serial = raters.count++;
-
- // create rating element
- rater = $('
');
- input.before(rater);
-
- // Mark element for initialization (once all stars are ready)
- rater.addClass('rating-to-be-drawn');
-
- // Accept readOnly setting from 'disabled' property
- if(input.attr('disabled') || input.hasClass('disabled')) control.readOnly = true;
-
- // Accept required setting from class property (class='required')
- if(input.hasClass('required')) control.required = true;
-
- // Create 'cancel' button
- rater.append(
- control.cancel = $('
')
- .mouseover(function(){
- $(this).rating('drain');
- $(this).addClass('star-rating-hover');
- //$(this).rating('focus');
- })
- .mouseout(function(){
- $(this).rating('draw');
- $(this).removeClass('star-rating-hover');
- //$(this).rating('blur');
- })
- .click(function(){
- $(this).rating('select');
- })
- .data('rating', control)
- );
-
- }; // first element of group
-
- // insert rating star
- var star = $('
');
- rater.append(star);
-
- // inherit attributes from input element
- if(this.id) star.attr('id', this.id);
- if(this.className) star.addClass(this.className);
-
- // Half-stars?
- if(control.half) control.split = 2;
-
- // Prepare division control
- if(typeof control.split=='number' && control.split>0){
- var stw = ($.fn.width ? star.width() : 0) || control.starWidth;
- var spi = (control.count % control.split), spw = Math.floor(stw/control.split);
- star
- // restrict star's width and hide overflow (already in CSS)
- .width(spw)
- // move the star left by using a negative margin
- // this is work-around to IE's stupid box model (position:relative doesn't work)
- .find('a').css({ 'margin-left':'-'+ (spi*spw) +'px' })
- };
-
- // readOnly?
- if(control.readOnly)//{ //save a byte!
- // Mark star as readOnly so user can customize display
- star.addClass('star-rating-readonly');
- //} //save a byte!
- else//{ //save a byte!
- // Enable hover css effects
- star.addClass('star-rating-live')
- // Attach mouse events
- .mouseover(function(){
- $(this).rating('fill');
- $(this).rating('focus');
- })
- .mouseout(function(){
- $(this).rating('draw');
- $(this).rating('blur');
- })
- .click(function(){
- $(this).rating('select');
- })
- ;
- //}; //save a byte!
-
- // set current selection
- if(this.checked) control.current = star;
-
- // set current select for links
- if(this.nodeName=="A"){
- if($(this).hasClass('selected'))
- control.current = star;
- };
-
- // hide input element
- input.hide();
-
- // backward compatibility, form element to plugin
- input.change(function(){
- $(this).rating('select');
- });
-
- // attach reference to star to input element and vice-versa
- star.data('rating.input', input.data('rating.star', star));
-
- // store control information in form (or body when form not available)
- control.stars[control.stars.length] = star[0];
- control.inputs[control.inputs.length] = input[0];
- control.rater = raters[eid] = rater;
- control.context = context;
-
- input.data('rating', control);
- rater.data('rating', control);
- star.data('rating', control);
- context.data('rating', raters);
- }); // each element
-
- // Initialize ratings (first draw)
- $('.rating-to-be-drawn').rating('draw').removeClass('rating-to-be-drawn');
-
- return this; // don't break the chain...
- };
-
- /*--------------------------------------------------------*/
-
- /*
- ### Core functionality and API ###
- */
- $.extend($.fn.rating, {
- // Used to append a unique serial number to internal control ID
- // each time the plugin is invoked so same name controls can co-exist
- calls: 0,
-
- focus: function(){
- var control = this.data('rating'); if(!control) return this;
- if(!control.focus) return this; // quick fail if not required
- // find data for event
- var input = $(this).data('rating.input') || $( this.tagName=='INPUT' ? this : null );
- // focus handler, as requested by focusdigital.co.uk
- if(control.focus) control.focus.apply(input[0], [input.val(), $('a', input.data('rating.star'))[0]]);
- }, // $.fn.rating.focus
-
- blur: function(){
- var control = this.data('rating'); if(!control) return this;
- if(!control.blur) return this; // quick fail if not required
- // find data for event
- var input = $(this).data('rating.input') || $( this.tagName=='INPUT' ? this : null );
- // blur handler, as requested by focusdigital.co.uk
- if(control.blur) control.blur.apply(input[0], [input.val(), $('a', input.data('rating.star'))[0]]);
- }, // $.fn.rating.blur
-
- fill: function(){ // fill to the current mouse position.
- var control = this.data('rating'); if(!control) return this;
- // do not execute when control is in read-only mode
- if(control.readOnly) return;
- // Reset all stars and highlight them up to this element
- this.rating('drain');
- this.prevAll().andSelf().filter('.rater-'+ control.serial).addClass('star-rating-hover');
- },// $.fn.rating.fill
-
- drain: function() { // drain all the stars.
- var control = this.data('rating'); if(!control) return this;
- // do not execute when control is in read-only mode
- if(control.readOnly) return;
- // Reset all stars
- control.rater.children().filter('.rater-'+ control.serial).removeClass('star-rating-on').removeClass('star-rating-hover');
- },// $.fn.rating.drain
-
- draw: function(){ // set value and stars to reflect current selection
- var control = this.data('rating'); if(!control) return this;
- // Clear all stars
- this.rating('drain');
- // Set control value
- if(control.current){
- control.current.data('rating.input').attr('checked','checked');
- control.current.prevAll().andSelf().filter('.rater-'+ control.serial).addClass('star-rating-on');
- }
- else
- $(control.inputs).removeAttr('checked');
- // Show/hide 'cancel' button
- control.cancel[control.readOnly || control.required?'hide':'show']();
- // Add/remove read-only classes to remove hand pointer
- this.siblings()[control.readOnly?'addClass':'removeClass']('star-rating-readonly');
- },// $.fn.rating.draw
-
-
-
-
-
- select: function(value,wantCallBack){ // select a value
-
- // ***** MODIFICATION *****
- // Thanks to faivre.thomas - http://code.google.com/p/jquery-star-rating-plugin/issues/detail?id=27
- //
- // ***** LIST OF MODIFICATION *****
- // ***** added Parameter wantCallBack : false if you don't want a callback. true or undefined if you want postback to be performed at the end of this method'
- // ***** recursive calls to this method were like : ... .rating('select') it's now like .rating('select',undefined,wantCallBack); (parameters are set.)
- // ***** line which is calling callback
- // ***** /LIST OF MODIFICATION *****
-
- var control = this.data('rating'); if(!control) return this;
- // do not execute when control is in read-only mode
- if(control.readOnly) return;
- // clear selection
- control.current = null;
- // programmatically (based on user input)
- if(typeof value!='undefined'){
- // select by index (0 based)
- if(typeof value=='number')
- return $(control.stars[value]).rating('select',undefined,wantCallBack);
- // select by literal value (must be passed as a string
- if(typeof value=='string')
- //return
- $.each(control.stars, function(){
- if($(this).data('rating.input').val()==value) $(this).rating('select',undefined,wantCallBack);
- });
- }
- else
- control.current = this[0].tagName=='INPUT' ?
- this.data('rating.star') :
- (this.is('.rater-'+ control.serial) ? this : null);
-
- // Update rating control state
- this.data('rating', control);
- // Update display
- this.rating('draw');
- // find data for event
- var input = $( control.current ? control.current.data('rating.input') : null );
- // click callback, as requested here: http://plugins.jquery.com/node/1655
-
- // **** MODIFICATION *****
- // Thanks to faivre.thomas - http://code.google.com/p/jquery-star-rating-plugin/issues/detail?id=27
- //
- //old line doing the callback :
- //if(control.callback) control.callback.apply(input[0], [input.val(), $('a', control.current)[0]]);// callback event
- //
- //new line doing the callback (if i want :)
- if((wantCallBack ||wantCallBack == undefined) && control.callback) control.callback.apply(input[0], [input.val(), $('a', control.current)[0]]);// callback event
- //to ensure retro-compatibility, wantCallBack must be considered as true by default
- // **** /MODIFICATION *****
-
- },// $.fn.rating.select
-
-
-
-
-
- readOnly: function(toggle, disable){ // make the control read-only (still submits value)
- var control = this.data('rating'); if(!control) return this;
- // setread-only status
- control.readOnly = toggle || toggle==undefined ? true : false;
- // enable/disable control value submission
- if(disable) $(control.inputs).attr("disabled", "disabled");
- else $(control.inputs).removeAttr("disabled");
- // Update rating control state
- this.data('rating', control);
- // Update display
- this.rating('draw');
- },// $.fn.rating.readOnly
-
- disable: function(){ // make read-only and never submit value
- this.rating('readOnly', true, true);
- },// $.fn.rating.disable
-
- enable: function(){ // make read/write and submit value
- this.rating('readOnly', false, false);
- }// $.fn.rating.select
-
- });
-
- /*--------------------------------------------------------*/
-
- /*
- ### Default Settings ###
- eg.: You can override default control like this:
- $.fn.rating.options.cancel = 'Clear';
- */
- $.fn.rating.options = { //$.extend($.fn.rating, { options: {
- cancel: 'Cancel Rating', // advisory title for the 'cancel' link
- cancelValue: '', // value to submit when user click the 'cancel' link
- split: 0, // split the star into how many parts?
-
- // Width of star image in case the plugin can't work it out. This can happen if
- // the jQuery.dimensions plugin is not available OR the image is hidden at installation
- starWidth: 16//,
-
- //NB.: These don't need to be pre-defined (can be undefined/null) so let's save some code!
- //half: false, // just a shortcut to control.split = 2
- //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
- //focus: function(){}, // executed when stars are focused
- //blur: function(){}, // executed when stars are focused
- //callback: function(){}, // executed when a star is clicked
- }; //} });
-
- /*--------------------------------------------------------*/
-
- /*
- ### Default implementation ###
- The plugin will attach itself to file inputs
- with the class 'multi' when the page loads
- */
- $(function(){
- $('input[type=radio].star').rating();
- });
-
-
-
-/*# AVOID COLLISIONS #*/
-})(jQuery);
-/*# AVOID COLLISIONS #*/
--- a/koha-tmpl/opac-tmpl/lib/jquery/plugins/jquery.barrating.min.js
+++ a/koha-tmpl/opac-tmpl/lib/jquery/plugins/jquery.barrating.min.js
@@ -0,0 +1,2 @@
+!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=t(require("jquery")):t(jQuery)}(function(t){var e=function(){function e(){var e=this,n=function(){var n=["br-wrapper"];""!==e.options.theme&&n.push("br-theme-"+e.options.theme),e.$elem.wrap(t("
",{"class":n.join(" ")}))},i=function(){e.$elem.unwrap()},a=function(n){return t.isNumeric(n)&&(n=Math.floor(n)),t('option[value="'+n+'"]',e.$elem)},r=function(){var n=e.options.initialRating;return n?a(n):t("option:selected",e.$elem)},o=function(){var n=e.$elem.find('option[value="'+e.options.emptyValue+'"]');return!n.length&&e.options.allowEmpty?(n=t("
",{value:e.options.emptyValue}),n.prependTo(e.$elem)):n},l=function(t){var n=e.$elem.data("barrating");return"undefined"!=typeof t?n[t]:n},s=function(t,n){null!==n&&"object"==typeof n?e.$elem.data("barrating",n):e.$elem.data("barrating")[t]=n},u=function(){var t=r(),n=o(),i=t.val(),a=t.data("html")?t.data("html"):t.text(),l=null!==e.options.allowEmpty?e.options.allowEmpty:!!n.length,u=n.length?n.val():null,d=n.length?n.text():null;s(null,{userOptions:e.options,ratingValue:i,ratingText:a,originalRatingValue:i,originalRatingText:a,allowEmpty:l,emptyRatingValue:u,emptyRatingText:d,readOnly:e.options.readonly,ratingMade:!1})},d=function(){e.$elem.removeData("barrating")},c=function(){return l("ratingText")},f=function(){return l("ratingValue")},g=function(){var n=t("
",{"class":"br-widget"});return e.$elem.find("option").each(function(){var i,a,r,o;i=t(this).val(),i!==l("emptyRatingValue")&&(a=t(this).text(),r=t(this).data("html"),r&&(a=r),o=t("
",{href:"#","data-rating-value":i,"data-rating-text":a,html:e.options.showValues?a:""}),n.append(o))}),e.options.showSelectedRating&&n.append(t("
",{text:"","class":"br-current-rating"})),e.options.reverse&&n.addClass("br-reverse"),e.options.readonly&&n.addClass("br-readonly"),n},p=function(){return l("userOptions").reverse?"nextAll":"prevAll"},h=function(t){a(t).prop("selected",!0),e.$elem.change()},m=function(){t("option",e.$elem).prop("selected",function(){return this.defaultSelected}),e.$elem.change()},v=function(t){t=t?t:c(),t==l("emptyRatingText")&&(t=""),e.options.showSelectedRating&&e.$elem.parent().find(".br-current-rating").text(t)},y=function(t){return Math.round(Math.floor(10*t)/10%1*100)},b=function(){e.$widget.find("a").removeClass(function(t,e){return(e.match(/(^|\s)br-\S+/g)||[]).join(" ")})},w=function(){var n,i,a=e.$widget.find('a[data-rating-value="'+f()+'"]'),r=l("userOptions").initialRating,o=t.isNumeric(f())?f():0,s=y(r);if(b(),a.addClass("br-selected br-current")[p()]().addClass("br-selected"),!l("ratingMade")&&t.isNumeric(r)){if(o>=r||!s)return;n=e.$widget.find("a"),i=a.length?a[l("userOptions").reverse?"prev":"next"]():n[l("userOptions").reverse?"last":"first"](),i.addClass("br-fractional"),i.addClass("br-fractional-"+s)}},$=function(t){return l("allowEmpty")&&l("userOptions").deselectable?f()==t.attr("data-rating-value"):!1},x=function(n){n.on("click.barrating",function(n){var i,a,r=t(this),o=l("userOptions");return n.preventDefault(),i=r.attr("data-rating-value"),a=r.attr("data-rating-text"),$(r)&&(i=l("emptyRatingValue"),a=l("emptyRatingText")),s("ratingValue",i),s("ratingText",a),s("ratingMade",!0),h(i),v(a),w(),o.onSelect.call(e,f(),c(),n),!1})},R=function(e){e.on("mouseenter.barrating",function(){var e=t(this);b(),e.addClass("br-active")[p()]().addClass("br-active"),v(e.attr("data-rating-text"))})},V=function(t){e.$widget.on("mouseleave.barrating blur.barrating",function(){v(),w()})},O=function(e){e.on("touchstart.barrating",function(e){e.preventDefault(),e.stopPropagation(),t(this).click()})},C=function(t){t.on("click.barrating",function(t){t.preventDefault()})},S=function(t){x(t),e.options.hoverState&&(R(t),V(t))},T=function(t){t.off(".barrating")},j=function(t){var n=e.$widget.find("a");O&&O(n),t?(T(n),C(n)):S(n)};this.show=function(){l()||(n(),u(),e.$widget=g(),e.$widget.insertAfter(e.$elem),w(),v(),j(e.options.readonly),e.$elem.hide())},this.readonly=function(t){"boolean"==typeof t&&l("readOnly")!=t&&(j(t),s("readOnly",t),e.$widget.toggleClass("br-readonly"))},this.set=function(t){var n=l("userOptions");0!==e.$elem.find('option[value="'+t+'"]').length&&(s("ratingValue",t),s("ratingText",e.$elem.find('option[value="'+t+'"]').text()),s("ratingMade",!0),h(f()),v(c()),w(),n.silent||n.onSelect.call(this,f(),c()))},this.clear=function(){var t=l("userOptions");s("ratingValue",l("originalRatingValue")),s("ratingText",l("originalRatingText")),s("ratingMade",!1),m(),v(c()),w(),t.onClear.call(this,f(),c())},this.destroy=function(){var t=f(),n=c(),a=l("userOptions");T(e.$widget.find("a")),e.$widget.remove(),d(),i(),e.$elem.show(),a.onDestroy.call(this,t,n)}}return e.prototype.init=function(e,n){return this.$elem=t(n),this.options=t.extend({},t.fn.barrating.defaults,e),this.options},e}();t.fn.barrating=function(n,i){return this.each(function(){var a=new e;if(t(this).is("select")||t.error("Sorry, this plugin only works with select fields."),a.hasOwnProperty(n)){if(a.init(i,this),"show"===n)return a.show(i);if(a.$elem.data("barrating"))return a.$widget=t(this).next(".br-widget"),a[n](i)}else{if("object"==typeof n||!n)return i=n,a.init(i,this),a.show();t.error("Method "+n+" does not exist on jQuery.barrating")}})},t.fn.barrating.defaults={theme:"",initialRating:null,allowEmpty:null,emptyValue:"",showValues:!1,showSelectedRating:!0,deselectable:!0,reverse:!1,readonly:!1,fastClicks:!0,hoverState:!0,silent:!1,onSelect:function(t,e,n){},onClear:function(t,e){},onDestroy:function(t,e){}},t.fn.barrating.BarRating=e});
+//# sourceMappingURL=jquery.barrating.min.js.map
--