/** http://biznesguide.ru/coding/156.html*/ ;(function($){ $.rating = function(e, o){ this.options = $.extend({ fx: 'float', image: '/images/stars.png', width: 15, stars: 5, minimal: 0, titles: ['голос','голоса','голосов'], readOnly: false, url: '', type: 'post', loader: '/images/ajax-loader.gif', click: function(){} }, o || {}); this.el = $(e); this.left = 0; this.val = parseFloat($('.val',e).val()) || 0; if(this.val > this.options.stars) this.val = this.options.stars; if(this.val < 0) this.val = 0; this.old = this.val; this.votes = parseInt($('.votes',e).val()) || ''; this.voteID = $('.vote-id',e).val() || ''; this.vote_wrap = $('
'); this.vote_block = $('
'); this.vote_hover = $('
'); this.vote_stars = $('
'); this.vote_active = $('
'); this.vote_result = $('
'); this.vote_success = $('
'); this.loader = $('load...'); this.init(); }; var $r = $.rating; $r.fn = $r.prototype = { rating: '0.1' }; $r.fn.extend = $r.extend = $.extend; $r.fn.extend({ init: function(){ this.render(); if(this.options.readOnly) return; var self = this, left = 0, width = 0; this.vote_hover.bind('mousemove mouseover',function(e){ if(self.options.readOnly) return; var $this = $(this), score = 0; left = e.clientX>0 ? e.clientX: e.pageX; width = left - $this.offset().left - 2; var max = self.options.width*self.options.stars, min = self.options.minimal*self.options.width; if(width > max) width = max; if(width < min) width = min; score = Math.round( width/self.options.width * 10 ) / 10; //округляем до 1 знака после запятой if(self.options.fx == 'half'){ width = Math.ceil(width/self.options.width*2)*self.options.width/2; } else if(self.options.fx != 'float'){ width = Math.ceil(width/self.options.width) * self.options.width; } score = Math.round( width/self.options.width * 10 ) / 10; self.vote_active.css({ 'width':width, 'background-position':'0 15px' }); self.vote_success.html('Оценка: '+score + 'из 5'); }) .bind('mouseout',function(){ if(self.options.readOnly) return; self.reset(); self.vote_success.empty(); }). bind('click.rating',function(){ if(self.options.readOnly) return; var score = Math.round( width/self.options.width * 10 ) / 10; if(score > self.options.stars) score = self.options.stars; if(score < 0) score = 0; self.old = self.val; self.val = (self.val*self.votes +score)/(self.votes + 1); self.val.toFixed(1); self.vote_success.html('Ваша оценка: '+score); if(self.options.url != ''){ self.send(score); } self.options.readOnly = true; self.options.click.apply(this,[score]); }); }, set: function(){ this.vote_active.css({ 'width':this.val*this.options.width, 'background-position':'0 15px' }); }, reset: function(){ this.vote_active.css({ 'width':this.old*this.options.width, 'background-position':'0 15px' }); }, setvoters: function(){ this.vote_result.html(this.declOfNum(this.votes)); }, render: function(){ this.el.html(this.vote_wrap.append( this.vote_hover.css({ padding:'0 4px', height:this.options.width, width:this.options.width*this.options.stars }), this.vote_result.text(this.declOfNum(this.votes)), this.vote_success )); this.vote_block.append( this.vote_stars.css({ height:this.options.width, width:this.options.width*this.options.stars, background:"url('"+this.options.image+"') 0 0" }), this.vote_active.css({ height:this.options.width, width:this.val*this.options.width, background:"url('"+this.options.image+"') 0 15px" }) ).appendTo(this.vote_hover); }, send: function(score){ var self = this; this.vote_result.html(this.loader); $.ajax({ url: self.options.url, type: self.options.type, data:{id:this.voteID,score:score}, dataType: 'json', success: function(data){ if(data.status == 'OK') { self.votes++; self.set(); } else{ self.reset(); } self.setvoters(); if(data.msg)self.vote_success.html(data.msg); } }); }, declOfNum: function(number){ if(number <= 0) return ''; number = Math.abs(Math.floor(number)); cases = [2, 0, 1, 1, 1, 2]; return number+' '+ this.options.titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ]; } }); $.fn.rating = function(o){ if (typeof o == 'string') { var instance = $(this).data('rating'), args = Array.prototype.slice.call(arguments, 1); return instance[o].apply(instance, args); } else { return this.each(function() { var instance = $(this).data('rating'); if (instance) { if (o) { $.extend(instance.options, o); } instance.init(); } else { $(this).data('rating', new $r(this, o)); } }); } }; })(jQuery);