Files
yii/framework/web/js/source/jquery.rating.js
2009-02-27 17:22:13 +00:00

209 lines
8.5 KiB
JavaScript

/*
### jQuery Star Rating Plugin v2.61 - 2009-01-23 ###
* 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
###
*//*
Based on 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 transforms 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)
Last modified by Qiang Xue on Feb. 26, 2009
added support to allow input names like post[rating] (previously this won't work).
*/
/*# 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
// default settings
$.rating = {
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 defined (can be undefined/null) so let's save some code!
//half: false, // just a shortcut to settings.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
// required properties:
groups: {},// allows multiple star ratings on one page
event: {// plugin event handlers
fill: function(n, el, settings, state){ // fill to the current mouse position.
//if(window.console) console.log(['fill', $(el), $(el).prevAll('.star_group_'+n.replace(/\[|\]/g, "_")), arguments]);
this.drain(n);
$(el).prevAll('.star_group_'+n.replace(/\[|\]/g, "_")).andSelf().addClass('star_'+(state || 'hover'));
// focus handler, as requested by focusdigital.co.uk
var lnk = $(el).children('a'); val = lnk.text();
if(settings.focus) settings.focus.apply($.rating.groups[n].valueElem[0], [val, lnk[0]]);
},
drain: function(n, el, settings) { // drain all the stars.
//if(window.console) console.log(['drain', $(el), $(el).prevAll('.star_group_'+n.replace(/\[|\]/g, "_")), arguments]);
$.rating.groups[n].valueElem.siblings('.star_group_'+n.replace(/\[|\]/g, "_")).removeClass('star_on').removeClass('star_hover');
},
reset: function(n, el, settings){ // Reset the stars to the default index.
if(!$($.rating.groups[n].current).is('.cancel'))
$($.rating.groups[n].current).prevAll('.star_group_'+n.replace(/\[|\]/g, "_")).andSelf().addClass('star_on');
// blur handler, as requested by focusdigital.co.uk
var lnk = $(el).children('a'); val = lnk.text();
if(settings.blur) settings.blur.apply($.rating.groups[n].valueElem[0], [val, lnk[0]]);
},
click: function(n, el, settings){ // Selected a star or cancelled
$.rating.groups[n].current = el;
var lnk = $(el).children('a'); val = lnk.text();
// Set value
$.rating.groups[n].valueElem.val(val);
// Update display
$.rating.event.drain(n, el, settings);
$.rating.event.reset(n, el, settings);
// click callback, as requested here: http://plugins.jquery.com/node/1655
if(settings.callback) settings.callback.apply($.rating.groups[n].valueElem[0], [val, lnk[0]]);
}
}// plugin events
};
$.fn.rating = function(instanceSettings){
if(this.length==0) return this; // quick fail
instanceSettings = $.extend(
{}/* new object */,
$.rating/* global settings */,
instanceSettings || {} /* just-in-time settings */
);
// loop through each matched element
this.each(function(i){
var settings = $.extend(
{}/* new object */,
instanceSettings || {} /* current call settings */,
($.metadata? $(this).metadata(): ($.meta?$(this).data():null)) || {} /* metadata settings */
);
////if(window.console) console.log([this.name, settings.half, settings.split], '#');
// Generate internal control ID
var n = (this.name || 'unnamed-rating');
// Grouping
if(!$.rating.groups[n]) $.rating.groups[n] = {count: 0};
i = $.rating.groups[n].count; $.rating.groups[n].count++;
// Accept readOnly setting from 'disabled' property
$.rating.groups[n].readOnly = $.rating.groups[n].readOnly || settings.readOnly || $(this).attr('disabled');
// Things to do with the first element...
if(i == 0){
// Create value element (disabled if readOnly)
$.rating.groups[n].valueElem = $('<input type="hidden" name="' + n + '" value=""' + (settings.readOnly ? ' disabled="disabled"' : '') + '/>');
// Insert value element into form
$(this).before($.rating.groups[n].valueElem);
if($.rating.groups[n].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(){ $.rating.event.drain(n, this, settings); $(this).addClass('star_on'); })
.mouseout(function(){ $.rating.event.reset(n, this, settings); $(this).removeClass('star_on'); })
.click(function(){ $.rating.event.click(n, this, settings); })
);
}
}; // 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) settings.split = 2;
// Prepare division settings
if(typeof settings.split=='number' && settings.split>0){
var stw = ($.fn.width ? $(eStar).width() : 0) || settings.starWidth;
var spi = (i % settings.split), spw = Math.floor(stw/settings.split);
$(eStar)
// 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' })
};
// Remember group name so controls within the same container don't get mixed up
$(eStar).addClass('star_group_'+n.replace(/\[|\]/g, "_"));
// readOnly?
if($.rating.groups[n].readOnly)//{ //save a byte!
// Mark star as readOnly so user can customize display
$(eStar).addClass('star_readonly');
//} //save a byte!
else//{ //save a byte!
$(eStar)
// Enable hover css effects
.addClass('star_live')
// Attach mouse events
.mouseover(function(){ $.rating.event.drain(n, this, settings); $.rating.event.fill(n, this, settings, 'hover'); })
.mouseout(function(){ $.rating.event.drain(n, this, settings); $.rating.event.reset(n, this, settings); })
.click(function(){ $.rating.event.click(n, this, settings); });
//}; //save a byte!
////if(window.console) console.log(['###', n, this.checked, $.rating.groups[n].initial]);
if(this.checked) $.rating.groups[n].current = eStar;
//remove this checkbox
$(this).remove();
// reset display if last element
if(i + 1 == this.length) $.rating.event.reset(n, this, settings);
}); // each element
// initialize groups...
for(n in $.rating.groups)//{ not needed, save a byte!
(function(c, v, n){ if(!c) return;
$.rating.event.fill(n, c, instanceSettings || {}, 'on');
$(v).val($(c).children('a').text());
})
($.rating.groups[n].current, $.rating.groups[n].valueElem, n);
//}; not needed, save a byte!
return this; // don't break the chain...
};
/*
### 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 #*/