// ==UserScript==
// @name GA feed & notifies
// @namespace glav.su
// @description Быстрый доступ к ленте и уведомлениям без перехода на отдельную страницу.
// @include http://glav.su/*
// @include https://glav.su/*
// @version 2.2
// @grant none
// ==/UserScript==
//var bcapts = {feed: 'лента', notifies: 'уведомления', pm: 'сообщения'},
var bcapts = {feed: '', notifies: ''},
// lUserPanel = '#lUserPanel',
lUserPanel = '.l-up-f',
$btn = {}, box_width = '1100px', box_height = '500px';
//HTML box
$(".lUserPanelFloat").css({'z-index': "90"});
var $nfm_box = $('<div id="nfm_box">')
.css({ 'border': "1px solid #aaa", 'border-radius': "5px", 'width': box_width, 'height': box_height,
'background-color': "#ccc", 'position': "absolute", 'box-shadow': "3px 3px 10px #444",
'overflow': "hidden", 'resize': "both", 'display': "none", })
.append($('<div id="nfm_header">')
.css({ 'text-align': "right", 'padding': "2px", 'height': "22px",
'background-color': "#0055e5", 'margin': "3px", 'border-radius': "3px 3px 0 0", })
.append($('<a href="javascript:void(0);" id="nfm_close" title="Закрыть">×</a>')
.css({ 'width': "22px", 'height': "20px", 'border-radius': "3px", 'background-color': "transparent",
'text-align': "center", 'font-size': "24px", 'font-weight': "bold", 'text-decoration': "none",
'color': "#fff", 'display': "block", 'float': "right", 'padding-top': "2px", })
.hover(function(){
$(this).css({'background-color': "#e00"});
}, function(){
$(this).css({'background-color': "transparent"});
})
.click(function(){
box_close();
})
)
.append($('<span id="nfm_title">')
.css({ 'display': "block", 'width': "100%", 'text-align': "center", })
)
)
.append($nfm_scroller = $('<div id="nfm_scroller">')
.css({ 'overflow-y': "scroll", 'position': "absolute", 'bottom': "16px", 'top': "32px", 'right': "3px",
'left': "3px", 'background-color': "#fff", 'border': "1px solid #bbb", })
.scroll(function(){
//$(lUserPanel+" div[id$=ViewContainer]:visible").hide();
})
.append($nfm_content = $('<div id="nfm_content">')
.css({ 'color': "#000", 'height': "auto", 'padding': "10px", 'display': "block", })
)
)
.appendTo( $(lUserPanel) );
var $sandbox = ((s=$("#sandbox")).length == 1)?
s : $('<div id="sandbox" style="display: none;">').appendTo( $(document.body) );//песочница
// Обновление кнопок "лента", "уведомление", "сообщение"
function updateButton(bt, count){
//var bc = ['redButton', 'blueButton'], sw = +(count > 0);
var bc = ['c-b-r', 'c-b-b'], sw = +(count > 0);
$btn[bt].removeClass(bc[sw]).addClass(bc[+(!sw)]).html( bcapts[bt] + (sw? '<span>' + count + '</span>' : '') );
}
function box_close(){
//$(lUserPanel+" div[id$=ViewContainer]").remove();
$nfm_box.hide();
}
// Ф-ии ajax-обновления
var update = {
// Лента
feed: function(){
$.getJSON(APP_URL + '/user/ajax/feedgrid/?isUnread=1&offset=0&limit=100&sortField=0&sortDir=0',
function(result){
$nfm_content.empty().html(result.body);
$nfm_content.find("#gridTop").next("div")
.empty()
.css({'margin-bottom': "10px"})
.append(
$('<span class="cBlueButton">отметить все как прочитанное</span>')
.click(function(){
$.getJSON(APP_URL + '/user/ajax/feedmarkasread/',
function(res){
update.feed();
});
})
);
$nfm_content.find("#gridBottom").prev("div").empty();
$("#nfm_content table.blueHeader.flex").css({'background-color': "#fff"});
$("#nfm_content table.blueHeader.flex td")
.css({ 'color': "#128", 'font-weight': "bold", 'padding': "0 10px", });
$("#nfm_content table.blueHeader.flex a")
.css({ 'color': "#128", 'text-decoration': "underline", 'font-weight': "bold", });
if(result.total > 0){
$("#nfm_content .frameBlock").hide();
}
$("#nfm_content .forumMessagesListMessageBody").hide();
$("#nfm_content .fItem.forumMessagesListMessageVoteSwitch").closest("table").hide();
$("#nfm_content .forumMessagesListMessage").each(function(mx, msg){
var m_id = $(msg).attr("id").replace(/forumMessagesListMessage(\d+)/, "$1");
if( window.myFollows ){
window.myFollows.add_button(msg);
}
var $sh_button = $('<span class="cBlueButton" style="width: 60px; text-align: center;" m_id="'+m_id+'">Показать</span>')
.click(function(){
$(msg).closest("table").prev("div").toggle();
var isVisible = $(msg).find(".forumMessagesListMessageBody").toggle().is(":visible");
$(msg).find(".fItem.forumMessagesListMessageVoteSwitch").closest("table").toggle();
$(this).html( ['Показать', 'Скрыть'][+isVisible] );
});
$(msg).find(".forumMessagesListMessageButtons table.cButtonsPanel").before($sh_button);
});
updateButton("feed", result.total);
init_func();
}
);
},
// Уведомления
notifies: function(){
$.getJSON(APP_URL + '/user/ajax/notifiesinboxgrid/?offset=0&limit=100&sortField=1&sortDir=0',
function(result){
$nfm_content.empty().html(result.body);
$("#nfm_content td.vaTop.taRight").parent().each(function(trx, tr){
$(tr).after(
$('<tr>').append( $mtd = $('<td class="vaTop" colspan="3">') )
);
$(tr).find("div[id$=ViewContainer]").detach().appendTo($mtd);
$(tr).find(".userNotifiesInboxGridNotifyViewButton").closest("table")
.detach()
.appendTo( $(tr).find("td.vaTop.taRight") );
});
$("#nfm_content .userNotifiesInboxGridNotifyViewButton")
.css({ width: "60px" })
.html("Показать")
.click(function(){
var n_id = $(this).attr("id").replace(/userNotifiesInboxGridNotify(\d*?)ViewButton/, "$1"),
$m_box = $("#userNotifiesInboxGridNotify" + n_id + "ViewContainer");
if( $m_box.is(":visible") == true ){
$m_box.hide();
$(this).html("Показать");
return;
}
$m_box.slideDown(200);
$(this).html("Скрыть");
}
);
$("#nfm_content .userNotifiesInboxGridNotifyMarkAsReadButton").hide().click(function(){
var n_id = $(this).attr("id").replace(/userNotifiesInboxGridNotify(\d*?)MarkAsReadButton/, "$1");
$.getJSON(APP_URL + '/user/ajax/markasreadnotify/?notifyId=' + n_id,
function(res){
update.notifies();
});
});
$("#nfm_content .userNotifiesInboxGridNotifyDeleteButton").click(function(){
var n_id = $(this).attr("id").replace(/userNotifiesInboxGridNotify(\d*?)DeleteButton/, "$1");
$.getJSON(APP_URL + '/user/ajax/deletenotify/?notifyId=' + n_id,
function(res){
update.notifies();
});
});
updateButton("notifies", result.total);
init_func();
}
);
},
// Cообщения
pm: function(){
//
},
};
// Главный цикл - модификация кнопок в панели.
$(document).ready(function(){
console.log('GA feed & notifies. Started.');
$.each(bcapts, function(bname, bcaption){
$btn[bname] = $(lUserPanel+' a[href*="glav.su/user/'+bname+'/"]')
.attr("bhref", APP_URL+'/user/'+bname+'/')
.attr("btag", bname)
.attr("bcapt", bcaption)
.attr("href", 'javascript: void(0);')
.click(function(){
var btag = $(this).attr("btag");
if($nfm_box.is(":visible") == true){
box_close();
if( $nfm_box.bname == btag ){
return;
}
}
$("#nfm_title").empty().append(
$('<a href="'+APP_URL+'/user/'+bname+'/" style="color: #fff;" target="blank">'+bname+'</a>')
.mouseup(function(){
box_close();
})
);
$nfm_box.bname = btag;
$nfm_content.empty();
update[btag]();
$nfm_box.css({left: 400}).slideDown(200);
});
});
});
// Недостающие функции работы с сообщениями на главной странице (спойлер, карма)
var init_func = function(){return}; // пустышка для остальных страниц.
if( location.href === APP_URL+'/forum/' ){
// HTML форма для показа результатов голосования по карме
var $vote_box = $('<div id="vote_box">')
.css({ 'border': "1px solid #aaa", 'border-radius': "5px", 'width': '450px',
'height': '250px', 'background-color': "#fff", 'position': "absolute",
'box-shadow': "3px 3px 10px #555", 'overflow': "hidden", 'display': "none", })
.append($('<div id="vote_header">')
.css({ 'text-align': "right", 'padding': "2px", 'height': "20px", 'background-color': "#aaa",
'margin': "3px", 'border-radius': "3px 3px 0 0", })
.append($vote_close = $('<a href="javascript:void(0);" id="vote_close" title="Закрыть">×</a>')
.css({ 'width': "20px", 'height': "20px", 'border-radius': "3px",
'background-color': "transparent", 'text-align': "center",
'font-size': "20px", 'font-weight': "bold", 'text-decoration': "none",
'color': "#fff", 'display': "block", 'float': "right", })
)
.append($('<span id="vote_title">Экспертное голосование</span>')
.css({ 'display': "block", 'width': "100%", 'text-align': "left", 'font-weight': "bold", })
)
)
.append($('<div id="vote_scroller">')
.css({ 'overflow-y': "auto", 'position': "absolute", 'bottom': "5px", 'top': "30px",
'right': "3px", 'left': "3px", 'background-color': "#fff", })
.append($vote_content = $('<div id="vote_content">')
.css({ 'color': "#000", 'height': "auto", 'padding': "5px", 'display': "block", })
)
)
.appendTo( $(lUserPanel) );
// Прибитие к кнопкам недостающих функций
init_func = function(){
// спойлер
$(".cBlockSpoilerHeaderOff").click(function(){
var bc = ['cBlockSpoilerHeaderOn', 'cBlockSpoilerHeaderOff'],
isVisible = +( $(this).next("div").toggle().is(":visible") );
$(this).removeClass(bc[isVisible]).addClass(bc[+(!isVisible)]);
});
// карма
$("span[class^=forumMessagesListMessageVote]").click(function(){
var match = $(this).attr("id").match(/forumMessagesListMessage(\d+)Vote(.+?)Button/),
m_id = match[1], _this = this;
if( match[2] === 'Info' ){
$.get(APP_URL + '/forum/ajax/loadmessagevotehistory/', {
messageId: m_id,
}, function (res) {
$vote_box.hide().detach();
$vote_content.empty().html( (res.status)? res.info : 'Произошла ошибка при загрузке данных!' );
$vote_box.appendTo($tb=$(_this).closest("table"))
.css({ top: $tb.offset().top - window.scrollY + $nfm_scroller.scrollTop() - 317 })
.show();
}, 'json');
}else{
var sign = ({Positive: '+', Negative: '-'})[match[2]];
$.post(APP_URL + '/forum/ajax/votemessage/', {
messageId: m_id,
sign: sign,
csrftoken: CSRF_TOKEN,
}, function (res) {
if (res.status) {
$('#forumMessagesListMessage'+m_id+'VoteNegativeButton').hide();
$('#forumMessagesListMessage'+m_id+'VotePositiveButton').hide();
$('#forumMessagesListMessage'+m_id+'VoteInfoButton').html(res.rating + ' / ' + res.votes);
}
}, 'json');
}
});
$vote_close
.hover(
function(){ $(this).css({'background-color': "#e00"}); },
function(){ $(this).css({'background-color': "transparent"}); }
)
.click(function(){
$vote_box.hide();
})
};
}