2013-08-29 12:30:04 +03:00
|
|
|
|
/**
|
|
|
|
|
* Голосование
|
2014-04-08 14:42:07 +03:00
|
|
|
|
*
|
2013-08-29 12:30:04 +03:00
|
|
|
|
* @module ls/vote
|
2014-04-08 14:42:07 +03:00
|
|
|
|
* @dependencies jquery, jquery.widget, tooltip, ls.utils, ls.ajax
|
|
|
|
|
*
|
2013-08-29 12:30:04 +03:00
|
|
|
|
* @license GNU General Public License, version 2
|
|
|
|
|
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
|
|
|
|
|
* @author Denis Shakhov <denis.shakhov@gmail.com>
|
|
|
|
|
*/
|
|
|
|
|
|
2014-04-08 14:42:07 +03:00
|
|
|
|
(function($) {
|
2013-07-09 11:40:06 +03:00
|
|
|
|
"use strict";
|
|
|
|
|
|
2014-04-08 14:42:07 +03:00
|
|
|
|
$.widget( "livestreet.vote", {
|
|
|
|
|
/**
|
|
|
|
|
* Дефолтные опции
|
|
|
|
|
*/
|
|
|
|
|
options: {
|
|
|
|
|
// Ссылки
|
|
|
|
|
urls: {
|
|
|
|
|
// Голосование
|
|
|
|
|
vote: null,
|
|
|
|
|
// Информация о голосовании
|
|
|
|
|
info: null
|
2011-05-03 13:10:28 +03:00
|
|
|
|
},
|
2014-04-08 14:42:07 +03:00
|
|
|
|
// Селекторы
|
|
|
|
|
selectors: {
|
|
|
|
|
// Кнопки голосования
|
|
|
|
|
item: '.js-vote-item',
|
|
|
|
|
// Рейтинг
|
|
|
|
|
rating: '.js-vote-rating',
|
2011-05-03 13:10:28 +03:00
|
|
|
|
},
|
2014-04-08 14:42:07 +03:00
|
|
|
|
// Классы
|
|
|
|
|
classes : {
|
|
|
|
|
// Пользователь проголосовал
|
|
|
|
|
voted: 'vote--voted',
|
|
|
|
|
// Не проголосовал
|
|
|
|
|
not_voted: 'vote--not-voted',
|
|
|
|
|
// Понравилось
|
|
|
|
|
voted_up: 'vote--voted-up',
|
|
|
|
|
// Не понравилось
|
|
|
|
|
voted_down: 'vote--voted-down',
|
|
|
|
|
// Воздержался
|
|
|
|
|
voted_zero: 'vote--voted-zero',
|
|
|
|
|
|
|
|
|
|
// Рейтинг больше нуля
|
|
|
|
|
count_positive: 'vote--count-positive',
|
|
|
|
|
// Меньше нуля
|
|
|
|
|
count_negative: 'vote--count-negative',
|
|
|
|
|
// Равен нулю
|
|
|
|
|
count_zero: 'vote--count-zero',
|
|
|
|
|
|
|
|
|
|
// Рейтинг скрыт
|
|
|
|
|
rating_hidden: 'vote--rating-hidden',
|
2011-05-03 13:10:28 +03:00
|
|
|
|
},
|
2014-04-08 14:42:07 +03:00
|
|
|
|
// Параметры отправляемые при каждом аякс запросе
|
|
|
|
|
params: {},
|
|
|
|
|
// Опции тултипа с информацией о голосовании
|
|
|
|
|
tooltip_options: {}
|
|
|
|
|
},
|
2013-07-09 11:40:06 +03:00
|
|
|
|
|
2014-04-08 14:42:07 +03:00
|
|
|
|
/**
|
|
|
|
|
* Конструктор
|
|
|
|
|
*
|
|
|
|
|
* @constructor
|
|
|
|
|
* @private
|
|
|
|
|
*/
|
|
|
|
|
_create: function () {
|
|
|
|
|
var _this = this;
|
|
|
|
|
|
|
|
|
|
this.options.params = $.extend({}, this.options.params, ls.utils.getDataOptions(this.element, 'param'));
|
|
|
|
|
|
|
|
|
|
this.elements = {};
|
|
|
|
|
this.elements.rating = this.element.find(this.options.selectors.rating);
|
|
|
|
|
this.elements.items = this.element.find(this.options.selectors.item);
|
|
|
|
|
|
|
|
|
|
// Обработка кликов по кнопкам голосования
|
|
|
|
|
if ( ! this.element.hasClass(this.options.classes.voted) ) {
|
|
|
|
|
this._on( this.elements.items, {
|
|
|
|
|
'click': function (e) {
|
|
|
|
|
_this.vote( $(e.currentTarget).data('vote-value') );
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
}
|
|
|
|
|
});
|
2011-09-06 13:43:14 +03:00
|
|
|
|
}
|
2011-05-03 13:10:28 +03:00
|
|
|
|
|
2014-04-08 14:42:07 +03:00
|
|
|
|
// Иниц-ия тултипа с информацией о голосовании
|
|
|
|
|
// Показываем инфо-ию только если рейтинг отображается
|
|
|
|
|
if ( ! this.element.hasClass(this.options.classes.rating_hidden) ) {
|
|
|
|
|
this.info();
|
2011-04-01 10:49:36 +03:00
|
|
|
|
}
|
2014-04-08 14:42:07 +03:00
|
|
|
|
},
|
2011-05-03 13:10:28 +03:00
|
|
|
|
|
2014-04-08 14:42:07 +03:00
|
|
|
|
/**
|
|
|
|
|
* Голосование
|
|
|
|
|
*
|
|
|
|
|
* @param {Number} iValue Значение
|
|
|
|
|
*/
|
|
|
|
|
vote: function(iValue) {
|
|
|
|
|
var oParams = $.extend({}, { value: iValue }, this.options.params);
|
|
|
|
|
|
|
|
|
|
ls.ajax.load(this.options.urls.vote, oParams, function (oResponse) {
|
|
|
|
|
if (oResponse.bStateError) {
|
|
|
|
|
ls.msg.error(null, oResponse.sMsg);
|
|
|
|
|
} else {
|
|
|
|
|
ls.msg.notice(null, oResponse.sMsg);
|
|
|
|
|
|
|
|
|
|
oResponse.iRating = parseFloat(oResponse.iRating);
|
|
|
|
|
|
|
|
|
|
this.element
|
|
|
|
|
.removeClass(this.options.classes.count_negative + ' ' + this.options.classes.count_positive + ' ' + this.options.classes.count_zero)
|
|
|
|
|
.removeClass(this.options.classes.rating_hidden + ' ' + this.options.classes.not_voted)
|
|
|
|
|
.addClass(this.options.classes.voted)
|
|
|
|
|
.addClass(this.options.classes[ iValue > 0 ? 'voted_up' : ( iValue < 0 ? 'voted_down' : 'voted_zero' ) ])
|
|
|
|
|
.addClass(this.options.classes[ oResponse.iRating > 0 ? 'count_positive' : ( oResponse.iRating < 0 ? 'count_negative' : 'count_zero' ) ]);
|
|
|
|
|
|
|
|
|
|
this.elements.rating.text(oResponse.iRating);
|
|
|
|
|
|
|
|
|
|
// Не обрабатываем клики после голосования
|
|
|
|
|
this._off(this.elements.items, 'click');
|
|
|
|
|
|
|
|
|
|
// Удаляем подсказки
|
|
|
|
|
this.elements.items.removeAttr('title');
|
|
|
|
|
|
|
|
|
|
// Иниц-ия тултипа
|
|
|
|
|
this.info().tooltip('show');
|
|
|
|
|
}
|
|
|
|
|
}.bind(this));
|
|
|
|
|
},
|
2013-07-09 11:40:06 +03:00
|
|
|
|
|
2014-04-08 14:42:07 +03:00
|
|
|
|
/**
|
|
|
|
|
* Иниц-ия тултипа с информацией о голосовании
|
|
|
|
|
*
|
|
|
|
|
* @return {jQuery}
|
|
|
|
|
*/
|
|
|
|
|
info: function () {
|
|
|
|
|
if ( ! this.options.urls.info ) return $();
|
|
|
|
|
|
2014-04-28 13:12:44 +03:00
|
|
|
|
return this.element.tooltip($.extend({}, {
|
2014-04-08 14:42:07 +03:00
|
|
|
|
ajax: {
|
|
|
|
|
url: this.options.urls.info,
|
|
|
|
|
params: this.options.params
|
|
|
|
|
}
|
2014-04-28 13:12:44 +03:00
|
|
|
|
}, this.options.tooltip_options));
|
2011-05-03 13:10:28 +03:00
|
|
|
|
}
|
2014-04-08 14:42:07 +03:00
|
|
|
|
});
|
|
|
|
|
})(jQuery);
|