function Rating(){ this.ratingContainer = "js-rating-plugin"; // Rating block container class name this.localization = 'Рейтинг'; // Word that means rating in your local this.userVoteInfo = {}; //Information about user votes for each element on page var _this = this; // For namespace vision inside function passed as argument this.initialize = function(){ var ratingViews = document.getElementsByClassName(this.ratingContainer); //Detect all rating blocks on page if(ratingViews) { userVotes(sortTargets(ratingViews)); for (var i = 0; i < ratingViews.length; i++) { this.showRating(ratingViews[i]); } } }; // Shows rating for passed element this.showRating = function(ratingContainer){ var target = ratingContainer.getAttribute('data-target'); var targetId = Number(ratingContainer.getAttribute('data-target-id')); ratingContainer.setAttribute('id', target+targetId); if(target in _this.userVoteInfo == false){ _this.userVoteInfo[target] = {}; } if(targetId in _this.userVoteInfo[target] == false){ _this.userVoteInfo[target][targetId] = {'userVoted': false, rating: 0}; } var rating = 'rating' in _this.userVoteInfo[target][targetId] ? _this.userVoteInfo[target][targetId]['rating'] : 0; var rateSpan = document.createElement('span'); rateSpan.className = 'total-rating'; rateSpan.innerHTML = rating>0 ? '+' + rating : rating; rateSpan.title = this.localization; var rateItem = document.createElement('span'); rateItem.className = 'rate-word'; rateItem.innerHTML = 'Проголосовать '; if (this.userCanVote(target, targetId)){ //Checking it just to prevent unnecessary events below var rateDown = document.createElement('span'); rateDown.className = 'minus rate-down'; var rateUp = document.createElement('span'); rateUp.className = 'plus rate-up'; if(target == 'posts'){ ratingContainer.appendChild(rateItem); //Если предметом голосования явяется пост, то выводим текст "проголосовать" } ratingContainer.appendChild(rateDown); ratingContainer.appendChild(rateSpan); ratingContainer.appendChild(rateUp); } else{ if(target == 'posts'){ rateItem.innerHTML = 'Рейтинг'; ratingContainer.appendChild(rateItem); } ratingContainer.appendChild(rateSpan); } }; //Returns information about items if they are already rated by user either not var userVotes = function(targets) { $.ajax({ async: false, type: "POST", data: {rating_plugin_targets: targets}, url: "/index.php?getElementsRating", success: function (jsoned) { if(jsoned != '') { try { _this.userVoteInfo = JSON && JSON.parse(jsoned) || $.parseJSON(jsoned); } catch(e){ _this.userVoteInfo = {}; } } }, error:function(){ console.log('some troubles with rating plugin'); } }); }; // Returns bool if user can vote to target this.userCanVote = function(target, targetId){ if(target in this.userVoteInfo === false || targetId in this.userVoteInfo[target] === false){ return true; } return !this.userVoteInfo[target][targetId]['userVoted']; }; //Votes for target this.vote = function(target, targetId, rate){ rate = parseInt(rate, 10); if(rate>=-1 && rate<=1){ $.ajax({ async: false, type: "POST", data: {"rating_plugin_target":target, "rating_plugin_target_id" : targetId, "rating_plugin_rating" : rate}, url: "/index.php?voteForElement", success: function(result){ if(result == null){ return false; } if(target in _this.userVoteInfo == false){ _this.userVoteInfo[target] = {}; } if(targetId in _this.userVoteInfo[target] == false){ _this.userVoteInfo[target][targetId] = {'userVoted': false, rating: 0}; } _this.userVoteInfo[target][targetId] = {'userVoted':true, 'rating':rate}; var nowRating = parseInt($('#'+target+targetId+" > .total-rating").html(), 10) + rate; var rating = nowRating>0 ? '+' + nowRating : nowRating; $('#'+target+targetId+" > .total-rating").html(rating); $('#'+target+targetId+" > .rate-up").remove(); $('#'+target+targetId+" > .rate-down").remove(); $('#'+target+targetId+" > .rate-word").html('Рейтинг'); popUpWindow('Ваш голос учтен', 'success'); return true; }, error:function(){ popUpWindow('Не удалось проголсовать', 'error'); } }); } }; //Sort elements by targets var sortTargets = function(targets){ var targetsSorted = {}; if(targets instanceof Object){ for(var i=0; i