<script type="text/javascript">
//извлеч гостевой ForumAPITicket и вставить вручную
//Посмотреть его можно выйдя из учетной записи и открыв Sources (в хроме)(правой кнопкой мыши->посмотреть код->вкладка Sources->в списке слева выбрать текущую страницу->найти ForumAPITicket)
GuestAPITicket='3f29aad94e883b9c00f7227d6a2fa700bd934768';
function NameTit()
{
var fname=prompt('Введите название главы!\n(Оставить пустым, если фрагмент не имеет названия)');
return (fname ? '[fragment=\"'+fname+'\"]':'[fragment]');
}
//Отправка оглавления через фрейм
$.postFrame = function(lnk,data) {
var rnd = Math.random().toString().substr(6);
$('<iframe src="about:blank" name="MyFrame_'+rnd+'" id="MyFrame_'+rnd+'"></iframe>').appendTo("head");
var form = $('<form action="'+lnk+'" target="MyFrame_'+rnd+'" method="post"></form>');
var kk, vk;
if(data) for(var inf in data){
vk=data[inf];
kk='<input name="'+inf+'" id="'+inf+'" value=\''+vk+'\' type="hidden" />';
form.append(kk);
}
setTimeout(function(){ //Отправляем
form.submit();
},50);
$('#MyFrame_'+rnd).on('load',function() {
if($.trim($(this).contents().html()).length>0)$(this).remove()
});
};
//Формат даты
$.chTime = function(time)
{
var ctime = new Date();
ctime.setTime(parseInt(time)*1000);
return (ctime.getDate()<10 ? "0" : "")+ctime.getDate()+"."+(ctime.getMonth()<9 ? "0" : "")+(ctime.getMonth()+1)+"."+ctime.getFullYear()+" "+ctime.toTimeString().replace(/ .+$/img, "");
}
//Проверка и замена тега оглавления
var s='</p>',
e='<p>',
//c=$(this).html(),
x,
m,
end='<span class="fragment-inner">$1</span></div>';
x=s+'<div class="fragment"><h4 class="fragment-name">$1</h4><span class="fragment-inner">$2</span></div>'+e;
m=s+'<div class="fragment">'+end+e;
$('.post').find('.post-content:contains("[fragment=")').map(function() {
var c=$(this).html();
c=c.replace(/\n/mgi,'');
try
{
c=c.replace(/\[fragment=\"(.*?)\"\](.*?)\[\/fragment\]/mgi,x);
} catch(e){}
c=c.replace(/<p><\/p>/mgi,'');
$(this).html(c);
});
$('.post').find('.post-content:contains("[fragment]")').map(function() {
var c=$(this).html();
c=c.replace(/\n/mgi,'');
try
{
c=c.replace(/\[fragment\](.*?)\[\/fragment\]/mgi,m);
} catch(e){}
c=c.replace(/<p><\/p>/mgi,'');
$(this).html(c);
});
var punv = $('#pun-viewtopic').length,
punp = $('#pun-post').length,
pune = $('#pun-edit').length;
//Если в просмотре, отправке или редактировании сообщений
if(punv || punp || pune)(function() {
var tl0='Фрагмент';
var t0 = '<td id="button-fragment" style="cursor: pointer !important;"><img src="i/blank.gif" title="'+tl0+'" onclick="bbcode(NameTit(),\'[/fragment]\');"></td>';
var tid;
var this_author=false;
var last_rev, tmplr;
var this_chapter;
//Если в просмотре темы, то вставить оглавление
if(punv || pune)
{
tid=(punv ? document.URL.split("id=")[1].split("#")[0].split("&p=")[0] : $("#pun-crumbs1").find("a:last").attr("href").split("id=")[1]);
//запрос оглавления
this_chapter = JSON.parse($.ajax({
url: 'http://www.en.'+location.hostname.replace(/^www\./,'')+"/api.php?method=storage.get&key=chapters-"+tid,
async: false,
cache: false
}).responseText);
//Если оглавление существует
try
{
var q = /"/g,
a = /'/g;
//заменить юникодные кавычки и апострофы
this_chapter=(this_chapter.response.storage.data['chapters-'+tid]).replace(q, "\"").replace(a, "\'");
this_chapter=JSON.parse(this_chapter);
//иначе пустой массив
} catch(e) {this_chapter=[];}
last_rev = JSON.parse($.ajax({
url: "/api.php?method=storage.get&key=newchp",
async: false,
cache: false
}).responseText);
try
{
last_rev=JSON.parse(last_rev.response.storage.data.newchp);
if(last_rev=='') last_rev={};
} catch(e){last_rev={};}
if(!(last_rev[tid]))
{
last_rev[tid]=0;
}
tmplr=last_rev[tid];
var hchp = '<div class="section"><div class="container chapt"><h4 class="fragment-name">Оглавление</h4><div class="formal chapters-box"><div id="chapters"><table id="chpt">';
//И внести изменения при наличии соответствующего куки
if($getCookie('postChap'))
{
$deleteCookie('postChap');
var cc=$('.endpost:last .fragment-name')
var PstId=$('.endpost:last').find('.permalink').attr('href').replace(/^.+?#p(\d+)$/gim,'$1');
var PstD=$('.endpost:last').attr('data-posted');
//Если в предыдущем посте нет элемента оглавления
if($('.endpost:last').prev().find('.fragment').length==0 || cc.length)
{
//создать новый
this_chapter.push([PstId, PstId, PstD, (cc.length ? cc.text():"")]);
}else
{
//иначе
//изменить номер последнего поста
this_chapter[this_chapter.length-1][1] = PstId;
}
var titstr='[';
this_chapter.forEach(function(item, i)
{
//Собираем строку для записи в репозиторий
titstr+='[\"'+item[0]+'\",\"'+item[1]+'\",\"'+item[2]+'\",\"'+item[3]+'\"],';
//Собираем оглавление
hchp+='<tr class="'+(item[3] ? 'yname':'nname')+'"><td class="mrk">'+(item[3] ? '• </td><td class="namech">':'</td><td class="namech">⚬ ')
+'<a href="'+($('#p'+item[0]).length ? '#p'+item[0] :'http://'+location.hostname+'/viewtopic.php?pid='+item[0]+'#p'+item[0])+'"'
+'data-posted="'+item[2]+'">'+(item[3] ? '<span class="chp_name">'+item[3]+'</span>' : 'Фрагмент')+'</a></td><td class="datach" width="60%">'+' от '+$.chTime(item[2])
+' по МСК '+(last_rev[tid]<item[2] ? '<span class="new_chp"> new </span>':'')+'</td></tr>';
if(tmplr<item[2]) tmplr=item[2];
//вставляем панели навигации
var this_fragment=$('#p'+this_chapter[i][1]);
if(this_fragment.length)
{
try
{
var nav = '<div class="fragment-navigation"><ul>'+
(i!=0 ? '<li class="prev_fragment"><a href="'+($('#p'+this_chapter[i-1][0]).length?'#p'+this_chapter[i-1][0] : 'http://'+location.hostname+'/viewtopic.php?pid='+this_chapter[i-1][0]+'#p'+this_chapter[i-1][0])+'">\<\<Предыдущий фрагмент</a></li>' : '')+
'<li class="back_chapter"><a href="#pun-main">К оглавлению</a></li>'+
(i!=this_chapter.length-1 ? '<li class="next_fragment"><a href="'+($('#p'+this_chapter[i+1][0]).length?'#p'+this_chapter[i+1][0] : 'http://'+location.hostname+'/viewtopic.php?pid='+this_chapter[i+1][0]+'#p'+this_chapter[i+1][0])+'">Следующий фрагмент\>\></a></li>' : '')+
'</ul></div>';
this_fragment.find('.post-box').after(nav);
} catch(e)
{
var nav = '<div class="fragment-navigation"><ul>'+
'<li class="back_chapter"><a href="#pun-main">К оглавлению</a></li>'+
'</ul></div>';
this_fragment.find('.post-box').after(nav);
}
}
});
titstr=titstr.substring(0,titstr.length-1)+']';
//запись в репозиторий
$.postFrame(
'http://www.en.'+location.hostname.replace(/^www\./,'')+'/api.php',
{
method: 'storage.set',
user_id: 1,
token: GuestAPITicket,
key: 'chapters-'+tid,
value: titstr
});
} else
{
//Если куки нет
//то собрать оглавление и создать панели навигации
this_chapter.forEach(function(item, i)
{
hchp+='<tr class="'+(item[3] ? 'yname':'nname')+'"><td class="mrk">'+(item[3] ? '• </td><td class="namech">':'</td><td class="namech">⚬ ')
+'<a href="'+($('#p'+item[0]).length ? '#p'+item[0] :'http://'+location.hostname+'/viewtopic.php?pid='+item[0]+'#p'+item[0])+'"'
+'data-posted="'+item[2]+'">'+(item[3] ? '<span class="chp_name">'+item[3]+'</span>' : 'Фрагмент')+'</a></td><td class="datach" width="60%">'+' от '+$.chTime(item[2])
+' по МСК '+(last_rev[tid]<item[2] ? '<span class="new_chp"> new </span>':'')+'</td></tr>';
if(tmplr<item[2]) tmplr=item[2];
var this_fragment=$('#p'+this_chapter[i][1]);
if(this_fragment.length)
{
try
{
var nav = '<div class="fragment-navigation"><ul>'+
(i!=0 ? '<li class="prev_fragment"><a href="'+($('#p'+this_chapter[i-1][0]).length?'#p'+this_chapter[i-1][0] : 'http://'+location.hostname+'/viewtopic.php?pid='+this_chapter[i-1][0]+'#p'+this_chapter[i-1][0])+'">\<\<Предыдущий фрагмент</a></li>' : '')+
'<li class="back_chapter"><a href="#pun-main">К оглавлению</a></li>'+
(i!=this_chapter.length-1 ? '<li class="next_fragment"><a href="'+($('#p'+this_chapter[i+1][0]).length?'#p'+this_chapter[i+1][0] : 'http://'+location.hostname+'/viewtopic.php?pid='+this_chapter[i+1][0]+'#p'+this_chapter[i+1][0])+'">Следующий фрагмент\>\></a></li>' : '')+
'</ul></div>';
this_fragment.find('.post-box').after(nav);
} catch(e)
{
var nav = '<div class="fragment-navigation"><ul>'+
'<li class="back_chapter"><a href="#pun-main">К оглавлению</a></li>'+
'</ul></div>';
this_fragment.find('.post-box').after(nav);
}
}
});
}
//если в просмотре
if(this_chapter.length && punv)
{
if(last_rev[tid]!=tmplr && UserID!=1)
{
last_rev[tid]=tmplr;
$.post("/api.php", {
method: "storage.set",
token: ForumAPITicket,
key: "newchp",
value: JSON.stringify(last_rev)
}, "json");
}
//нарисовать оглавление
hchp+='</table></div></div></div></div>';
$('.topic').find('h2:first').before(hchp);
}
}else
{
//на странице отправки поста просто записать id темы
tid=$("#pun-crumbs1").find("a:last").attr("href").split("id=")[1];
}
//проверка на авторство
var sel=".topicpost .pl-email:first>a";
var id;
if(document.URL.indexOf('fid')>-1) {this_author = true;} else
if( $(".topicpost").length){ id = $(sel).attr("href").split("id=")[1]
} else
{
$.ajax({ url:"/viewtopic.php?id="+tid,async:false,cache:true,success:function(data){
id = $(data).find(sel).attr("href").split("id=")[1];
}});
}
if( id && +id == UserID) this_author = true;
//если автор или модератор
if(GroupID<=2 || !!this_author)
{
$('#button-right').after(t0);
// Обрабатываем форму, вызываем функцию...
var xx=$('[name="submit"]');
var nn=xx.length;
xx.click(function() {
//var tmp_chapter;
var cc = $('#main-reply:first').val();
var nameCook;
// если редактирование
if(pune)
{
//аякс запрос следующего и предыдущего сообщений
//и сопутствующей информации
var pid = document.URL.split("id=")[1].split("&")[0];
var nextc, prevc, thc;
var dataPost;
var idn, idp;
$.ajax({ url:"/viewtopic.php?pid="+pid+"#p"+pid,async:false,cache:true,success:function(data){
thc = $(data).find('#p'+pid).text();
nextc = $(data).find('#p'+pid).next().text();
try
{
idn = $(data).find('#p'+pid).next().attr('id').replace(/p/gim,'');
} catch(e){}
prevc = $(data).find('#p'+pid).prev().text();
try
{
idp = $(data).find('#p'+pid).prev().attr('id').replace(/p/gim,'');
} catch(e){}
dataPost = $(data).find('#p'+pid).attr('data-posted');
}});
//если раньше был частью оглавлений и сейчас часть оглавления
if(cc.indexOf('[/fragment]')!=-1 && thc.indexOf('[/fragment]')!=-1)
{
//Сейчас именован
if(cc.indexOf('[fragment=')!=-1)
{
//Раньше именован
if(thc.indexOf('[fragment=')!=-1)
{
//Изменить имя в соответствующем элементе
this_chapter.forEach(function(item, i){if(item[0]==pid)item[3]=cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'));});
} else
{
//Реньше не был именован
//Если предыдущее и следующее сообщения - части оглавления
if(nextc.indexOf('[/fragment]')!=-1 && prevc.indexOf('[/fragment]')!=-1)
{
//Если следующее сообщение именовано
if(nextc.indexOf('[fragment=')!=-1)
{
//Изменить у предыдущего элемента номер завершающего сообщения...
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[1]==pid)
{
idarr=i;
item[1]=idp;
}
});
//И вставить новый элемент оглавления
this_chapter.splice(idarr+1,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
} else
{
//Если не именовано
//Найти и изменить предыдущий
var idarr;
var tmp;
this_chapter.forEach(function(item, i)
{
if(item[0]<pid && pid<item[1])
{
idarr=i;
tmp=item[1];
item[1]=idp;
}
});
//и вставить новый
//А дальше мне лень писать коментарии.
this_chapter.splice(idarr+1,0,[pid, tmp, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
}
} else if(nextc.indexOf('[/fragment]')!=-1)
{
this_chapter.forEach(function(item)
{
if(item[0]==pid)
{
item[3]=cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'));
}
});
} else if(prevc.indexOf('[/fragment]')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[1]==pid)
{
idarr=i;
item[1]=idp;
}
});
this_chapter.splice(idarr+1,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
} else
{
//var idarr=0;
this_chapter.forEach(function(item, i)
{
if(item[0]==pid)
{
item[3]=cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'));
}
});
//this_chapter.splice(idarr+1,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
}
}
} else
{
if(thc.indexOf('[fragment=')!=-1)
{
if(prevc.indexOf('[/fragment]')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[0]==pid)
{
this_chapter[i-1][1]=item[1];
idarr=i;
}
});
this_chapter.splice(idarr,1);
} else
{
this_chapter.forEach(function(item, i)
{
if(item[0]==pid)
{
item[3]="";
}
});
}
}
}
} else if(cc.indexOf('[/fragment]')!=-1)
{
if(cc.indexOf('[fragment=')!=-1)
{
if(nextc.indexOf('[/fragment]')!=-1 && prevc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[fragment=')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[1]==idp)
{
idarr=i;
}
});
this_chapter.splice(idarr+1,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
} else
{
this_chapter.forEach(function(item, i)
{
if(item[0]==idn)
{
item[0]=pid;
item[3]=cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'));
}
});
}
} else if(nextc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[fragment=')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[0]==idn)
{
idarr=i;
}
});
this_chapter.splice(idarr,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
} else
{
this_chapter.forEach(function(item, i)
{
if(item[0]==idn)
{
item[0]=pid;
item[3]=cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'));
}
});
}
} else if(prevc.indexOf('[/fragment]')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[1]==idp)
{
idarr=i;
}
});
this_chapter.splice(idarr+1,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
} else
{
var idarr=0;
this_chapter.forEach(function(item, i)
{
if(item[0]<pid)
{
idarr=i;
}
});
this_chapter.splice(idarr+1,0,[pid, pid, dataPost, cc.substring(cc.indexOf('[fragment="')+11,cc.indexOf('"]'))]);
}
} else
{
if(nextc.indexOf('[/fragment]')!=-1 && prevc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[fragment=')!=-1)
{
this_chapter.forEach(function(item, i)
{
if(item[1]==idp)
{
item[1]=pid;
}
});
} else
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[1]==idp)
{
idarr=i;
item[1]=this_chapter[i+1][1];
}
});
this_chapter.splice(idarr+1,1);
}
} else if(nextc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[fragment=')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[0]==idn)
{
idarr=i;
}
});
this_chapter.splice(idarr,0,[pid, pid, dataPost, ""]);
} else
{
this_chapter.forEach(function(item, i)
{
if(item[0]==idn)
{
item[0]=pid;
}
});
}
} else if(prevc.indexOf('[/fragment]')!=-1)
{
this_chapter.forEach(function(item, i)
{
if(item[1]==idp)
{
item[1]=pid;
}
});
} else
{
var idarr=0;
this_chapter.forEach(function(item, i)
{
if(item[0]<pid)
{
idarr=i;
}
});
this_chapter.splice(idarr+1,0,[pid, pid, dataPost, ""]);
}
}
} else if(thc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[/fragment]')!=-1 && prevc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[fragment=')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[1]==pid)
{
idarr=i;
item[1]=idp;
}
});
if(thc.indexOf('[fragment=')!=-1)
this_chapter.splice(idarr,1);
} else
{
if(thc.indexOf('[fragment=')!=-1)
{
this_chapter.forEach(function(item, i)
{
if(item[0]==pid)
{
item[0]=idn;
item[3]="";
}
});
}else
{
var idarr;
var tmp;
this_chapter.forEach(function(item, i)
{
if(item[0]<pid && pid<item[1])
{
idarr=i;
tmp=item[1];
item[1]=idp;
}
});
this_chapter.splice(idarr+1,0,[idn, tmp, dataPost, ""]);
}
}
} else if(nextc.indexOf('[/fragment]')!=-1)
{
if(nextc.indexOf('[fragment=')!=-1)
{
var idarr;
this_chapter.forEach(function(item, i)
{
if(item[0]==pid)
{
idarr=i;
}
});
this_chapter.splice(idarr,1);
} else
{
this_chapter.forEach(function(item, i)
{
if(item[0]==pid)
{
item[0]=idn;
item[3]="";
}
});
}
} else if(prevc.indexOf('[/fragment]')!=-1)
{
if(thc.indexOf('[fragment=')!=-1)
{
var idarr=0;
this_chapter.forEach(function(item, i)
{
if(item[1]==pid)
{
idarr=i;
}
});
this_chapter.splice(idarr,1);
} else
{
this_chapter.forEach(function(item, i)
{
if(item[1]==pid)
{
item[1]==idp;
}
});
}
} else
{
var idarr=0;
this_chapter.forEach(function(item, i)
{
if(item[1]==pid)
{
idarr=i;
}
});
this_chapter.splice(idarr,1);
}
}
//собрать строку для записи в репозиторий
var titstr='[';
this_chapter.forEach(function(item, i)
{
titstr+='[\"'+item[0]+'\",\"'+item[1]+'\",\"'+item[2]+'\",\"'+item[3]+'\"],';
});
titstr=titstr.substring(0,titstr.length-1)+']';
//Запись если в строке есть оглавление
if(titstr.length>1)
{
$.postFrame(
'http://www.en.'+location.hostname.replace(/^www\./,'')+'/api.php',
{
method: 'storage.set',
user_id: 1,
token: GuestAPITicket,
key: 'chapters-'+tid,
value: titstr
});
} else //иначе удалить
{
$.post('http://www.en.'+location.hostname.replace(/^www\./,'')+'/api.php', {
method: "storage.delete",
token: GuestAPITicket,
key: 'chapters-'+tid
}, "json");
}
//Если создание нового поста
//И в форме есть элемент
} else if(cc.indexOf('[/fragment]')!=-1)
{
//создать куки
nameCook='postChap';
$setCookie(nameCook, true, 120*1000);
}
});
//Если удаление сообщения
$('[name="delete"]').click(function() {
var pid = document.URL.split("id=")[1].split("&")[0];
if($('post-content:contains("[/fragment]")').length)
{
var titstr='[';
this_chapter.forEach(function(item){if(item[0]!=pid || item[1]!=pid)
{
if(item[1]==pid) item[1]=$(this).prev().attr("href").split("id=")[1];
if(item[0]==pid) item[0]=$(this).next().attr("href").split("id=")[1];
titstr+='[\"'+item[0]+'\",\"'+item[1]+'\",\"'+item[2]+'\",\"'+item[3]+'\"],';
}});
titstr=titstr.substring(0,titstr.length-1)+']';
if(titstr.length>1)
{
$.postFrame(
'http://www.en.'+location.hostname.replace(/^www\./,'')+'/api.php',
{
method: 'storage.set',
user_id: 1,
token: GuestAPITicket,
key: 'chapters-'+tid,
value: titstr
});
} else
{
$.post('http://www.en.'+location.hostname.replace(/^www\./,'')+'/api.php', {
method: "storage.delete",
token: GuestAPITicket,
key: 'chapters-'+tid
}, "json");
}
}
});
}
else
{
$('.formsubmit .button').click(function() {
var txt = $('#main-reply:first').val();
if(txt.indexOf('[/fragment]')!=-1)
{
alert('Вам запрещено использовать теги оглавления вне своих произведений!');
$('.button[disabled]').removeAttr('disabled');return false;
}
});
}
}());
</script>