Инструментарий для создания оглавления на литературных форумах
Добавляет новую кнопку в форме ответа, которая позволяет выделить фрагмент поста, дать ему название (или оставить безымянным) и занести в оглавление, отображающееся на странице топика.

http://s0.uploads.ru/t/sF3Xe.png

Автор: Ezingrin
Платформа: MyBB

Подробное описание:
У всех пользователей, в темах созданных (либо еще только создаваемых) ими, отображается новая кнопка (у модераторов и прочей администрации она присутствует всегда). Кнопка позволяет выделить фрагмент поста, дать ему название (или оставить безымянным) и занести в оглавление.

http://s8.uploads.ru/lkp6d.png

Оглавление создается автоматически при выделении первого фрагмента.
Когда оглавление создано, оно выводится в блоке над сообщениями темы. В оглавлении выводятся названия фрагментов (если они есть, иначе ссылка будет названа, как "Фрагмент") и дата их добавления по московскому времени. Так же, новые, для каждого конкретного пользователя, фрагменты подсвечиваются значком (new).

http://s0.uploads.ru/sF3Xe.png

Под каждым сообщением с включенным в оглавление фрагментом, либо блоком сообщений (неименованные фрагменты идущие друг за другом), находится панель навигации, которая, как я надеюсь, интуитивно понятна.

http://s5.uploads.ru/F73JU.png

CSS:

Код:
    #button-fragment{background:url(http://sa.uploads.ru/kl9Aw.png) no-repeat;}
     
    .chapters-box
    {
    	height: 15em;
    	overflow: auto;
    }
     
    #chapters
    {
    	width: 40em;
    	margin: auto;
    	padding-bottom: 1em;
    }
     
    .chapt .fragment-name
    {
    	display: block;
        padding-top: 0.7em;
        font-size: 1.3em;
        font-weight: bold;	
        font-style: normal;
    	text-align: center;
        margin: 0;	
    }
     
    #chpt td
    {
    	border: none !important;
        padding: 0.5em 0 0 0;
    }
    .mrk
    {
    	width:1em;
    	text-align: center;
    }
    .newc
    {
    	width:5em;
    }
     
    .new_chp
    {
    	background-color: #ca050f;
    	border-radius: 10px;
    	font-weight: bold;
    	color: #ffe78a;
    }
     
    .chp_name
    {
        font-size: 1.1em;
        font-weight: 600;
        font-style: normal;
    }
     
    .fragment
    {
    	border: 1px solid;
    	border-color: #fff #ccc #ccc #fff;
    	margin: 0.4em 1.8em 1.4em 1.8em;
    	padding: 1em;
    	background-color: #fff9e7;
    }
     
    .fragment h4
    {
    	display: block;
        padding-bottom: 0.7em;
        font-size: 1.3em;
        font-weight: bold;
        font-style: normal;
    	text-align: center;
        margin: 0;
    }
     
    .fragment-navigation 
    {
    	border-top: 1px solid #ccc;
    }
     
    .fragment-navigation ul
    {
    	margin: 0;
        padding: 4px;
    	text-align: center;
    }
     
    .fragment-navigation ul li
    {
    	display: inline;
        margin-right: 5px; 
        padding: 3px;
    }

JS (В html-низ)

Код:
    <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 = /&quot;/g,
    	  a = /&apos;/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">&nbsp;new&nbsp;</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">&nbsp;new&nbsp;</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("&amp;")[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("&amp;")[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>