233 lines
6.7 KiB
JavaScript
233 lines
6.7 KiB
JavaScript
/************************************************************************
|
|
*************************************************************************
|
|
@Name : jRating - jQuery Plugin
|
|
@Revison : 3.0
|
|
@Date : 28/01/2013
|
|
@Author: ALPIXEL - (www.myjqueryplugins.com - www.alpixel.fr)
|
|
@License : Open Source - MIT License : http://www.opensource.org/licenses/mit-license.php
|
|
|
|
**************************************************************************
|
|
*************************************************************************/
|
|
(function($) {
|
|
$.fn.jRating = function(op) {
|
|
var defaults = {
|
|
/** String vars **/
|
|
bigStarsPath : '/images/seems_rateable/stars.png', // path of the icon stars.png
|
|
smallStarsPath : '/images/seems_rateable/small.png', // path of the icon small.png
|
|
path : '/rateable/ratings',
|
|
type : 'big', // can be set to 'small' or 'big'
|
|
|
|
/** Boolean vars **/
|
|
step: true, // if true, mouseover binded star by star,
|
|
isDisabled:false,
|
|
showRateInfo: false,
|
|
canRateAgain : false,
|
|
|
|
/** Integer vars **/
|
|
length:5, // number of star to display
|
|
decimalLength : 0, // number of decimals.. Max 3, but you can complete the function 'getNote'
|
|
rateMax : 20, // maximal rate - integer from 0 to 9999 (or more)
|
|
rateInfosX : -45, // relative position in X axis of the info box when mouseover
|
|
rateInfosY : 5, // relative position in Y axis of the info box when mouseover
|
|
nbRates : 1,
|
|
|
|
/** Functions **/
|
|
onSuccess : null,
|
|
onError : null
|
|
};
|
|
|
|
if(this.length>0)
|
|
return this.each(function() {
|
|
/*vars*/
|
|
var opts = $.extend(defaults, op),
|
|
newWidth = 0,
|
|
starWidth = 0,
|
|
starHeight = 0,
|
|
bgPath = '',
|
|
hasRated = false,
|
|
globalWidth = 0,
|
|
nbOfRates = opts.nbRates;
|
|
|
|
if($(this).hasClass('jDisabled') || opts.isDisabled)
|
|
var jDisabled = true;
|
|
else
|
|
var jDisabled = false;
|
|
|
|
getStarWidth();
|
|
$(this).height(starHeight);
|
|
|
|
|
|
|
|
var average = parseFloat($(this).attr('data-average')), // get the average of all rates
|
|
idBox = parseInt($(this).attr('data-id')), // get the id of the box
|
|
kls = $(this).attr('data-kls'),
|
|
dimension = $(this).attr('data-dimension'),
|
|
widthRatingContainer = starWidth*opts.length, // Width of the Container
|
|
widthColor = average/opts.rateMax*widthRatingContainer, // Width of the color Container
|
|
quotient =
|
|
$('<div>',
|
|
{
|
|
'class' : 'jRatingColor',
|
|
css:{
|
|
width:widthColor
|
|
}
|
|
}).appendTo($(this)),
|
|
|
|
average =
|
|
$('<div>',
|
|
{
|
|
'class' : 'jRatingAverage',
|
|
css:{
|
|
width:0,
|
|
top:- starHeight
|
|
}
|
|
}).appendTo($(this)),
|
|
|
|
jstar =
|
|
$('<div>',
|
|
{
|
|
'class' : 'jStar',
|
|
css:{
|
|
width:widthRatingContainer,
|
|
height:starHeight,
|
|
top:- (starHeight*2),
|
|
background: 'url('+bgPath+') repeat-x'
|
|
}
|
|
}).appendTo($(this));
|
|
|
|
$(this).css({width: widthRatingContainer,overflow:'hidden',zIndex:1,position:'relative'});
|
|
|
|
if(!jDisabled)
|
|
$(this).unbind().bind({
|
|
mouseenter : function(e){
|
|
var realOffsetLeft = findRealLeft(this);
|
|
var relativeX = e.pageX - realOffsetLeft;
|
|
if (opts.showRateInfo)
|
|
var tooltip =
|
|
$('<p>',{
|
|
'class' : 'jRatingInfos',
|
|
html : getNote(relativeX)+' <span class="maxRate">/ '+opts.rateMax+'</span>',
|
|
css : {
|
|
top: (e.pageY + opts.rateInfosY),
|
|
left: (e.pageX + opts.rateInfosX)
|
|
}
|
|
}).appendTo('body').show();
|
|
},
|
|
mouseover : function(e){
|
|
$(this).css('cursor','pointer');
|
|
},
|
|
mouseout : function(){
|
|
$(this).css('cursor','default');
|
|
if(hasRated) average.width(globalWidth);
|
|
else average.width(0);
|
|
},
|
|
mousemove : function(e){
|
|
var realOffsetLeft = findRealLeft(this);
|
|
var relativeX = e.pageX - realOffsetLeft;
|
|
if(opts.step) newWidth = Math.floor(relativeX/starWidth)*starWidth + starWidth;
|
|
else newWidth = relativeX;
|
|
average.width(newWidth);
|
|
if (opts.showRateInfo)
|
|
$("p.jRatingInfos")
|
|
.css({
|
|
left: (e.pageX + opts.rateInfosX)
|
|
})
|
|
.html(getNote(newWidth) +' <span class="maxRate">/ '+opts.rateMax+'</span>');
|
|
},
|
|
mouseleave : function(){
|
|
$("p.jRatingInfos").remove();
|
|
},
|
|
click : function(e){
|
|
var flag = confirm("确定评分?");
|
|
if(!flag)
|
|
{
|
|
e.cancel();
|
|
}
|
|
|
|
|
|
var element = this;
|
|
|
|
/*set vars*/
|
|
hasRated = true;
|
|
globalWidth = newWidth;
|
|
nbOfRates--;
|
|
|
|
if(!opts.canRateAgain || parseInt(nbOfRates) <= 0) $(this).unbind().css('cursor','default').addClass('jDisabled');
|
|
|
|
if (opts.showRateInfo) $("p.jRatingInfos").fadeOut('fast',function(){$(this).remove();});
|
|
e.preventDefault();
|
|
var rate = getNote(newWidth);
|
|
average.width(newWidth);
|
|
|
|
|
|
$.post(defaults.path,
|
|
{
|
|
idBox : idBox,
|
|
rate : rate,
|
|
kls : kls,
|
|
dimension : dimension
|
|
/** action : 'rating' **/
|
|
},
|
|
function(data) {
|
|
if(!data.error)
|
|
{
|
|
/** Here you can display an alert box,
|
|
or use the jNotify Plugin :) http://www.myqjqueryplugins.com/jNotify
|
|
exemple : */
|
|
if(opts.onSuccess) opts.onSuccess( element, rate );
|
|
}
|
|
else
|
|
{
|
|
|
|
/** Here you can display an alert box,
|
|
or use the jNotify Plugin :) http://www.myqjqueryplugins.com/jNotify
|
|
exemple : */
|
|
if(opts.onError) opts.onError( element, rate );
|
|
}
|
|
},
|
|
'json'
|
|
);
|
|
}
|
|
});
|
|
|
|
function getNote(relativeX) {
|
|
var noteBrut = parseFloat((relativeX*100/widthRatingContainer)*opts.rateMax/100);
|
|
switch(opts.decimalLength) {
|
|
case 1 :
|
|
var note = Math.round(noteBrut*10)/10;
|
|
break;
|
|
case 2 :
|
|
var note = Math.round(noteBrut*100)/100;
|
|
break;
|
|
case 3 :
|
|
var note = Math.round(noteBrut*1000)/1000;
|
|
break;
|
|
default :
|
|
var note = Math.round(noteBrut*1)/1;
|
|
}
|
|
return note;
|
|
};
|
|
|
|
function getStarWidth(){
|
|
switch(opts.type) {
|
|
case 'small' :
|
|
starWidth = 12; // width of the picture small.png
|
|
starHeight = 10; // height of the picture small.png
|
|
bgPath = opts.smallStarsPath;
|
|
break;
|
|
default :
|
|
starWidth = 23; // width of the picture stars.png
|
|
starHeight = 20; // height of the picture stars.png
|
|
bgPath = opts.bigStarsPath;
|
|
}
|
|
};
|
|
|
|
function findRealLeft(obj) {
|
|
if( !obj ) return 0;
|
|
return obj.offsetLeft + findRealLeft( obj.offsetParent );
|
|
};
|
|
});
|
|
|
|
}
|
|
})(jQuery);
|