Saturday, February 5, 2011

Форум Overclockers.ru


// ==UserScript==
// @name           Форум Overclockers.ru
// @namespace      http://coolcmd.webhosting-for-free.com/script/
// @description    Доработка форума Overclockers.ru
// @version        2011.02.05 CoolCmd
// @icon           http://www.overclockers.ru/favicon.ico
// @include        http://forums.overclockers.ru/*
// @include        http://cp.people.overclockers.ru/*
// @require        http://usocheckup.redirectme.net/95593.js?maxage=7&lang=ru
// ==/UserScript==

/*********************************************************************************
Изменения в форуме:
- Вставка ников и цитат не прокручивает страницу вниз.
- Вставка цитат не добавляет лишнюю строку (только у Firefox).
- Кнопка "стандартный ответ" открывает предпросмотр.
- Изменено странное название кнопки "стандартный ответ".
- Прокрутка на начало предпросмотра и перенос курсора в редактируемое сообщение.
- В темах увеличен размера ников авторов сообщений.
- В темах и подфорумах исправлено расположение списка модераторов.
- Увеличено количество смайликов слева от редактируемого сообщения.
- Добавлен один новый смайлик.
- В списке найденных тем (поиск, "Ваши сообщения", "Новые сообщения" и т.д.) удалена пустая колонка.
- Увеличено изображение для перехода к первому непрочитанному сообщению.
- Увеличено изображение для перехода к последнему сообщению.
- Уменьшена ширина первой колонки с никами под просматриваемым/редактируемым персональным сообщением.
- В списке персональных сообщений скрыта вторая колонка если в ней нет значков.
- Сделан более разборчивым текст "В сети" (под аватаркой автора сообщения).
- В форме редактирования сообщения изменены размеры элементов:
  * Уменьшена ширина панели со смайликами
  * Увеличена ширина поля для редактируемого текста
  * Увеличена высота поля для редактируемого текста (только в форме быстрого редактирования)
  * Количество строк с кнопками для вставки BBCode уменьшено с двух до одной
- Ссылки в сообщениях форума и в персональных сообщениях открываются в новой вкладке.
- Миниатюры тормозного Ради Кала заменены на статичное изображение.
- В шапку форума добавлена ссылка на список закладок.
- На персональных страницах увеличен размер поля для редактирования текста.
- Удалены все пустые строки после цитат.
- Уменьшены вертикальные промежутки перед текстом сообщений и в цитатах.
- В шапке форума увеличена ширина поля для поиска.
- Увеличен размер кнопок для листания страниц.
- Названия кнопок для листания страниц <> заменены словами.
- В нижнюю часть страницы добавлена копия строки с ссылками для поиска тем и сообщений.
- Нажатие в теме на кнопку "Следующая" прокручивает страницу к первому сообщению.
- Нажатие в теме на кнопку "Предыдущая" прокручивает страницу к последнему сообщению.
*********************************************************************************/

var g_fIsChrome = window.navigator.userAgent.indexOf('Chrome/') >= 0;

// Панель управления персональными страницами.
if (window.location.hostname == 'cp.people.overclockers.ru')
{
 TweakPersonalPages();
 return;
}

// Новые изображения из темы Tango.
var g_strFirstUnreadImage = "data:image/png;base64,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";
var g_strLastPostImage    = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAWCAYAAAA4oUfxAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNUmK/OAAAAR2SURBVEhL1ZZ9TNR1HMd/qJWhds0l1Soxxlxr2Hpaa671bw9rc6s/WmJb6apl5gU4hwZJGI8yJ1ZoBuXKVdRs0yKpgNsMD/HYDUIe7B6AO373/HwH5y3l3efz/f2OODjaUX/F9tq5qb/X5/3+fb5fTpL+Lz+19VWVBDKl5lAl5sPPyCxvYZtOeunMc8l/zNL/+lNb/wEyk2/9AVJpMC5t+6mI/0NSbrVaMTExgfHxcfFps9kEdrsdk5OTKvznVHjwJcl/tQCrqzFNA5yorlOSj42NCRmLk9jUIew2Ow3BA4wvYMny8xPA9yPAfR/jat7r3yAa/1Mk5pSzA9iU9MnksjwJWbYvIL288EeXxBXP5+X2eKcV2PI1cLIfeOqLa8gv7sLF302z9SpSRqlblmXIDgecjNOaQno5SXVjSKGDpFx5uxl47FPg8WagQQ9sOw1o3ujAzwazEIm0c8QOkjocTjhdLrjmsaj8nAl48nOFJz4DNrcAj54AHvoEKGgCNn4E3NsIFLUDu88BN++8hJMdw2oDMglZymlJ7GSxG263Bx4P4fXA5/OJfVm4cJT8zCjw4PG/2XQMuF+VbiDpXYeB2w4Ba2qA51uB/Z00gHYI5V8ZSSqTkMVqWjeL3ULs9XqF2O/zq/KqeUeN5N8OAeuPKA9fXqlAW44cEt7RAKyjz1trgZW08FLFdTFoWRcNsM+F7U29cLF4jtRDUkXM+OH3/4P8yEV6qNZCmBXesUIqkSHt9UDaF4Z04Bqy3odAKk/gAWpGpCf5s3UXKKkrJW0ysY+k/kAAQUKpPU3y6t9YPke8x8kXDKSyeKqYUj99CijtUGrfccxAm+2Ch96vl2pWklLNLPUHEFDFoVAwQzknLg1QwqtYRvVnU/0aqnxtPbCzLblwvaj6rl+cb67c66Ga54gDAb8iDgYRCoUQCocWynNzc2/g883JmRqCj9TRXuB4H9BiJGkdkP+h8veFdNSyX+tC63kTRkdHYTaZxC3HW85L5U9KAyxVxOFwmIikla+Stp71LHLJJJpJnncUONxDR7DlOnLe/AVftulhMBgwMDCAkZERWCwW2OmC4bo5bUCIk9IwIpEIItFoWvktlD6HuIfIJwqIR4jNPBCnr79AW9+AxLpXWtHe3Q+dTge9Xg+j0YjLl4dgovQ2umL5XAe5YlEzSxVxNBJFNBZbupxfg7Q/mpBeONW5Y1cJ+vr6hLynp0fIh4aHYTZTcrrpeMP53XLNEao5EiVxLIpYNIap2FT62inlWuJOYgOxkdhEPCxehdaSkLY0N3ETRcVaDA4Ooru7WwzBtV/544r4RcPvPBRkMUk5LYljLKbEU1PE9HRa+Qp68Gp1gNvV+vN4COnF05ekZxp3qcMU7C3dI94vLxjf63yD8TbH43HMzMxk9D1jwTmnh2cRNxJr1CF4B7iJu9Vh1vNncYm2sfzAu3ivogwVleU4WFWB6tqDGX+tYvHbu996ddFvMiRZzsePWEmsInghGW4nm7iJWKHRaJbRQ7L+BbPuvwBRoCb1E13NmgAAAABJRU5ErkJggg==";

//
// Текст скрипта на двух языках.
//
if (document.getElementsByTagName('meta')[1].content == "en-gb")
{
 var g_Text =
 {
  previewbutton: 'Preview',
  emptyquote:    'Select text before cite them.',
  fontsize:      'Size: ',
  showimage:     'Show image',
  bookmarks:     'Bookmarks',
  nextpage:      'Next',
  prevpage:      'Previous'
 };
}
else
{
 var g_Text =
 {
  previewbutton: 'Предпросмотр',
  emptyquote:    'Для вставки цитаты сначала выделите цитируемый текст.',
  fontsize:      'Размер: ',
  showimage:     'Просмотр изображения',
  bookmarks:     'Закладки',
  nextpage:      'Следующая',
  prevpage:      'Предыдущая'
 };
}

// Изменения для всего форума.
TweakCommon();

// Главная страница форума.
if (window.location.pathname == '/'
||  window.location.pathname.indexOf('/index.php') == 0)
{
 TweakViewForum();
 return;
}

// Подфорум.
if (window.location.pathname.indexOf('/viewforum.php') == 0)
{
 TweakViewSubforum();
 return;
}

// Список найденных тем.
if (window.location.pathname.indexOf('/search.php') == 0
&& (window.location.search.indexOf('?search_id=') == 0
||  window.location.search.indexOf('&sr=topics') > 0))
{
 TweakViewFoundTopics();
 return;
}

// Просмотр темы.
if (window.location.pathname.indexOf('/viewtopic.php') == 0)
{
 TweakViewTopic();
 return;
}

// Редактирование сообщения в теме.
if (window.location.pathname.indexOf('/posting.php') == 0)
{
 TweakEditPost();
 return;
}

// Личные сообщения.
if (window.location.pathname.indexOf('/ucp.php') == 0
&&  window.location.search.indexOf('?i=pm') == 0)
{
 // Содержимое папки.
 if (window.location.search.indexOf('&folder=') > 0
 ||  window.location.search.indexOf('&mode=view&action=view_folder') > 0)
 {
  TweakViewFolder();
  return;
 }

 // Просмотр личного сообщения.
 if (window.location.search.indexOf('&mode=view') > 0)
 {
  TweakViewPM();
  return;
 }

 // Редактирование личного сообщения.
 if (window.location.search.indexOf('&mode=compose') > 0)
 {
  TweakEditPM();
  return;
 }
}

/////////////////////////////////////////////////////////////////

function TweakPersonalPages()
{
 // Увеличить размер поля для редактирования текста.
 GM_addStyle('textarea[name="record_text"] {width: 100% !important; height: 40em !important}');
}

function TweakCommon()
{
 // Стили общие для всего форума
 GM_addStyle('\
  /* Увеличить ширину поля для поиска */\
  #keywords {\
   width: 80% !important\
  }\
  /* Исправить расположение списка модераторов */\
  h2 + .moderators {\
   margin-top: 0.8em !important;\
   margin-bottom: -0.8em !important\
  }\
  br + .moderators {\
   margin-top: -0.3em !important;\
   margin-bottom: 0.3em !important\
  }\
  /* Увеличить размер ников авторов сообщений */\
  .postauthor {\
   font-size: small !important\
  }\
  /* Сделать более разборчивым текст "В сети" */\
  .online {\
   font-weight: bold !important;\
   font-size: 1.1em !important;\
   color: green !important\
  }\
  /* Уменьшить промежуток перед сообщением */\
  .postbody {\
   margin-top: -0.4em !important\
  }\
  /* Уменьшить высоту заголовка цитаты */\
  .quotetitle {\
   padding-top: 0 !important;\
   padding-bottom: 2px !important\
  }\
  /* Уменьшить промежуток после цитаты */\
  .quotecontent {\
   margin-bottom: 5px !important\
  }\
  /* Увеличить кнопки перехода на предыдущую страницу темы */\
  .gotoprevpage {\
   font-size: 1.3em !important;\
   margin: 0 -0.4em 0 0 !important;\
   padding: 0 0.2em !important;\
   border: 1px solid rgb(191,191,191) !important\
  }\
  /* Увеличить кнопки перехода на следующую страницу */\
  .pagination + a {\
   font-size: 1.3em !important;\
   margin: 0 0 0 -0.4em !important;\
   padding: 0 0.2em !important;\
   border: 1px solid rgb(191,191,191) !important\
  }\
  /* Увеличить кнопки перехода на указанную страницу */\
  .pagination > * {\
   font-size: 1.3em !important;\
   margin: 0 !important;\
   padding: 0 0.2em !important;\
   border: 1px solid rgb(191,191,191) !important;\
   display: inline-block !important;\
   min-width: 1.7em !important;\
   text-align: center !important\
  }\
  /* Нижняя строка с ссылками для поиска тем и сообщений */\
  #searchbarbottom {\
   margin-top: 0.2em !important;\
   margin-bottom: 0.8em !important\
  }\
 ');

 //
 // Добавление в шапку форума ссылки на список закладок.
 //
 var emSpan = document.evaluate('id("wrapcentre")/p/span[2]',
  document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
 // Выполнен вход на форум?
 if (emSpan != null)
 {
  var emA = document.createElement('a');
  emA.href = 'http://forums.overclockers.ru/ucp.php?i=main&mode=bookmarks';
  emA.appendChild(document.createTextNode(g_Text['bookmarks']));
  
  var emTemp = emSpan.firstElementChild;
  emSpan.insertBefore(emA, emTemp);
  emSpan.insertBefore(document.createTextNode(' | '), emTemp);
 }
}

function TweakViewForum()
{
 // Не изменять изображения в списке "Новые темы и сообщения".
 ReplaceLastPostImage('id("wrapcentre")/table[3]/descendant::');
}

function TweakViewSubforum()
{
 ReplaceLastPostImage('//');
 ReplaceFirstUnreadImage('//');
 ChangePaginationLinks(true);
}

function TweakViewFoundTopics()
{
 var emTable = document.evaluate('id("wrapcentre")/form/table[2]/tbody',
  document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;

 // Уменьшить ширину первой колонки заголовка (будет как в подфорумах).
 emTable.firstElementChild.children[0].removeAttribute('width');

 // colspan для второй колонки заголовка больше не нужен.
 emTable.firstElementChild.children[1].removeAttribute('colspan');

 // Перебор всех строк (тем) таблицы.
 for (var nRow = 1; nRow < emTable.children.length - 1; ++nRow)
 {
  var emTR = emTable.children[nRow];

  // Ячейка с названием темы.
  var emTemp = emTR.children[2];
  // Есть ссылка на непрочитанные сообщения?
  if (emTemp.children[1].tagName == 'A')
  {
   //
   // Увеличить изображение для перехода к первому непрочитанному сообщению.
   //
   emTemp = emTemp.firstElementChild.firstElementChild;
   emTemp.src = g_strFirstUnreadImage;
   emTemp.width = 31;
   emTemp.height = 22;
   emTemp.style.cssFloat = 'left';
   emTemp.style.marginTop = '0.3em';
   emTemp.style.marginRight = '0.5em';
  }

  // Ячейка с информацией о последнем сообщении.
  emTemp = emTR.lastElementChild;

  // Убрать центровку по горизонтали, что бы изображения во всем форуме выглядели одинаково.
  emTemp.removeAttribute('align');

  // Перемеcтить изображения влево.
  emTemp = emTemp.insertBefore(emTemp.children[1].lastElementChild, emTemp.firstElementChild).firstElementChild;

  //
  // Увеличить изображение для перехода к последнему сообщению.
  //
  emTemp.src = g_strLastPostImage;
  emTemp.width = 31;
  emTemp.height = 22;
  emTemp.style.cssFloat = 'left';
  emTemp.style.marginTop = '0.3em';
  emTemp.style.marginRight = '0.5em';

  // Удалить пустую колонку.
  emTR.removeChild(emTR.children[1]);
 }

 // Последняя строка таблицы.
 emTable.lastElementChild.firstElementChild.setAttribute('colspan', 6);
}

function TweakViewTopic()
{
 ReplaceRadikalPreviews();
 RemoveUselessEmptyLines();
 ChangePaginationLinks(false);

 var emForm = document.getElementById('postform');
 // В теме есть форма для редактирования сообщения?
 if (emForm != null)
 {
  var emMainTR = GetEditFormMainTRElement(emForm);
  ResizeEditFormElements(emMainTR, false);
  ChangeEditFormSmiles(emMainTR);

  with (document.getElementsByName('full_editor')[0])
  {
   // Заменить кнопку редактирования на предпросмотр.
   name = 'preview';
   
   // Дать кнопке нормальное название.
   value = g_Text['previewbutton'];
  }

  // Нет смысла делать поле для редактирования сообщения ниже цветной фигни справа.
  emForm.getElementsByTagName('textarea')[0].setAttribute('rows', 14);

  //
  // Вставка ника или цитаты не будет прокручивать страницу вниз.
  // Заменить у ссылок обработчик щелчка мыши.
  // Хрому это исправление не требуется.
  //
  if (!g_fIsChrome)
  {
   var colSnapshot = document.evaluate('//a[@href="#postform"]',
    document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
   for (var i = 0; i < colSnapshot.snapshotLength; ++i)
   {
    var emItem = colSnapshot.snapshotItem(i);
    emItem.addEventListener('click',
     (emItem.getAttribute('onclick').length < 100) ? OnInsertNick : OnInsertQuote, false);
    emItem.setAttribute('onclick', 'return false');
   }
  }
 }
 
 //
 // Добавить из шапки форума в нижнюю часть страницы копию строки с ссылками.
 //
 var emSearchBar = document.getElementsByClassName('searchbar')[0].cloneNode(true);
 // Идентификатор используется в CSS и для прокрутки к последнему сообщению.
 emSearchBar.id = 'searchbarbottom';
 // Вставить строку выше рекламы.
 var emInsertPoint = document.evaluate('id("pagecontent")/table[@class="tablebg"][last()]/following-sibling::table',
  document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
 // emInsertPoint может не иметь sibling.
 emInsertPoint.parentNode.insertBefore(emSearchBar, emInsertPoint.nextSibling);
 
 ChangePostLinksTarget();
 
 //
 // Код для прокрутки должен выполняться в скрипте последним.
 //
 if (window.location.hash == '#pagecontentbottom')
 {
  // Показать последнее сообщение и кнопки для листания страниц.
  document.getElementById('searchbarbottom').scrollIntoView(false);
 }
}

function TweakEditPost()
{
 // Форма для редактирования сообщения.
 // forms['postform'] не работает в XPCNativeWrapper.
 var emForm = document.getElementsByName('postform')[0];
 var emMainTR = GetEditFormMainTRElement(emForm);
 ResizeEditFormElements(emMainTR, false);
 ChangeEditFormSmiles(emMainTR);
 RepositionEditForm(emForm);
 RemoveUselessEmptyLines();
 ChangePostLinksTarget();
}

function TweakViewFolder()
{
 //
 // Скрыть вторую колонку в списке персональных сообщений если в ней нет значков.
 //
 GM_addStyle('\
  form[name="viewfolder"] > table > tbody > tr > td:nth-of-type(2)\
  {\
   width: 0 !important;\
   padding: 0 !important;\
  }\
 ');
}

function TweakViewPM()
{
 ResizePMTopicElements();
 RemoveUselessEmptyLines();
 ChangePostLinksTarget();
}

function TweakEditPM()
{
 // Форма для редактирования сообщения.
 // forms['postform'] не работает в XPCNativeWrapper.
 var emForm = document.getElementsByName('postform')[0];
 var emMainTR = GetEditFormMainTRElement(emForm);
 ResizeEditFormElements(emMainTR, true);
 ChangeEditFormSmiles(emMainTR);
 RepositionEditForm(emForm);
 ResizePMTopicElements();
 RemoveUselessEmptyLines();
 ChangePostLinksTarget();
}

/////////////////////////////////////////////////////////////////

function ChangePaginationLinks(fSubforum)
// Модифицирует блок с кнопками для листания страниц.
// fSubforum: true - кнопки в подфоруме, false - кнопки в теме.
{
 var colSpans = document.getElementsByClassName('pagination');
 for (var i = 0; i < colSpans.length; ++i)
 {
  //
  // Кнопка <
  //
  var emA = colSpans[i].previousElementSibling;
  if (emA != null && emA.textContent == '<')
  {
   emA.className += ' gotoprevpage';
   // Изменить название кнопки.
   emA.textContent = g_Text['prevpage'];
   // После загрузки страницы прокрутить к последнему сообщению.
   emA.href += fSubforum ? '#pagecontent' : '#pagecontentbottom';
  }
  //
  // Кнопка >
  //
  emA = colSpans[i].nextElementSibling;
  if (emA != null)
  {
   // Изменить название кнопки.
   emA.textContent = g_Text['nextpage'];
   // После загрузки страницы прокрутить к первому сообщению.
   emA.href += '#pagecontent';
  }
 }
}

function RemoveUselessEmptyLines()
// Удаляет пустые строки после цитат. С помощью CSS это сделать невозможно.
{
 var colQuotes = document.getElementsByClassName('quotecontent');
 for (var i = 0; i < colQuotes.length; ++i)
 {
  for (var emQuote = colQuotes[i];;)
  {
   var emSibling = emQuote.nextSibling;
   if (emSibling == null || emSibling.nodeName != 'BR')
   {
    break;
   }
   emSibling.parentNode.removeChild(emSibling);
  }
 }
}

function GetEditFormMainTRElement(emForm)
// Возвращает строку TR со смайликами и редактируемым сообщением.
{
 return document.evaluate('.//td[@width="22%" and @valign="top" and @class="row1"]/..',
  emForm, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
}

function ChangeEditFormSmiles(emMainTR)
// Настройка смайликов в форме редактирования сообщения.
{
 // Элемент, в который будут добавляться смайлики.
 var emSmilesParent = emMainTR.getElementsByTagName('a')[0].parentNode;

 //
 // Добавление старых смайликов.
 //
 AppendSmile(emSmilesParent, ':shock:',    'icon_eek.gif',      15, 15, 'Шокирован');
 AppendSmile(emSmilesParent, '8-)',        'icon_cool.gif',     15, 15, 'Круто');
 AppendSmile(emSmilesParent, ':bandhead:', 'icon_banghead.gif', 25, 20, 'Бац-бац');
 AppendSmile(emSmilesParent, ':roll:',     'icon_rolleyes.gif', 15, 15, 'Сомнение');
 AppendSmile(emSmilesParent, ':hitrost:',  'icon_hitrost.gif',  15, 15, 'Хитрость');
 AppendSmile(emSmilesParent, ':grob:',     'icon_grob.gif',     44, 19, 'Я тебя живьем закопаю!');
 AppendSmile(emSmilesParent, ':mad2:',     'icon_mad2.gif',     31, 20, 'Злой');
 AppendSmile(emSmilesParent, ':up:',       'icon_up.gif',       15, 15, 'Нравится');
 AppendSmile(emSmilesParent, ':rip:',      'icon_rip.gif',      15, 15, 'Покойся с миром');
 AppendSmile(emSmilesParent, ':applause:', 'icon_applause.gif', 19, 16, 'Аплодисменты');

 //
 // Добавление новых смайликов.
 //
 AppendSmile(emSmilesParent, null, 'http://s.rimg.info/d08b99bdc8ab296cd0123ace7156f04e.gif', 15, 15, 'Не нравится');
}

function AppendSmile(emSmilesParent, strBBCode, strFileName, nWidth, nHeight, strTitle)
// Добавляет смайлик слева от редактируемого сообщения.
{
 var emA = document.createElement('a');
 emA.href = '#';
 emA.style.lineHeight = '20px';

 var emIMG = document.createElement('img');
 emIMG.width = nWidth;
 emIMG.height = nHeight;
 emIMG.title = strTitle;
 emIMG.hspace = 2;
 emIMG.vspace = 2;

 if (strBBCode)
 {
  emA.setAttribute("onclick", "insert_text('" + strBBCode + "', true); return false");
  emIMG.src = './images/smilies/' + strFileName;
  emIMG.alt = strBBCode;
 }
 else
 {
  emA.setAttribute("onclick", "insert_text('[img]" + strFileName + "[/img]', true); return false");
  emIMG.src = strFileName;
 }
 
 emA.appendChild(emIMG);
 emSmilesParent.appendChild(emA);
 emSmilesParent.appendChild(document.createTextNode(' '));
}

function ResizeEditFormElements(emMainTR, fIsPM)
// Уменьшает ширину панели со смайликами.
// Увеличивает ширину поля для редактирования сообщения.
// Уменьшает высоту панели с кнопками с двух строк до одной.
{
 //
 // Уменьшить ширину панели со смайликами. Размер редактируемого текста увеличится до размера
 // просматриваемого текста (примерно). Так же все кнопки уместятся в одной строке. В случае нехватки
 // места для кнопок строка автоматически разделится на две.
 //
 emMainTR.children[0].setAttribute('width', '130px');
 emMainTR.children[1].removeAttribute('width');
 if (fIsPM)
 {
  emMainTR.previousElementSibling.children[0].removeAttribute('width');
  emMainTR.previousElementSibling.children[1].removeAttribute('width');
 }

 // Верхняя строка с кнопками.
 var emTopTD = emMainTR.children[1].children[1].firstElementChild.firstElementChild.firstElementChild;
 // Нижняя строка с кнопками.
 var emBottomTD = emTopTD.parentNode.nextElementSibling.firstElementChild;

 // Сократить текст 'Размер шрифта' до 'Размер' что бы кнопки влезли в одну строку.
 emTopTD.getElementsByTagName('span')[0].firstChild.nodeValue = g_Text['fontsize'];

 // Переместить кнопки из нижней строки в верхнюю.
 while (emBottomTD.firstChild)
 {
  emTopTD.appendChild(emBottomTD.firstChild);
 }

 // Удалить нижнюю строку.
 emBottomTD.parentNode.parentNode.removeChild(emBottomTD.parentNode);
}

function RepositionEditForm(emForm)
{
 // Перенести курсор в поле для редактирования текста.
 emForm.getElementsByTagName('textarea')[0].focus();

 // Прокрутить страницу в начало предпросматриваемого сообщения на случай
 // если оно не уместилось на экране после focus().
 emForm.scrollIntoView(true);
}

function ReplaceLastPostImage(strParent)
// Увеличивает изображение для перехода к последнему сообщению.
{
 var colSnapshot = document.evaluate(strParent + 'img[@src="./styles/ocss2/imageset/icon_topic_latest.gif"]',
  document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 for (var i = 0; i < colSnapshot.snapshotLength; ++i)
 {
  var emItem = colSnapshot.snapshotItem(i);
  emItem.src = g_strLastPostImage;
  emItem.width = 31;
  emItem.height = 22;
  emItem.parentNode.style.cssFloat = 'left';
 }
}

function ReplaceFirstUnreadImage(strParent)
// Увеличивает изображение для перехода к первому непрочитанному сообщению.
{
 var colSnapshot = document.evaluate(strParent + 'img[@src="./styles/ocss2/imageset/icon_topic_newest.gif"]',
  document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 for (var i = 0; i < colSnapshot.snapshotLength; ++i)
 {
  var emItem = colSnapshot.snapshotItem(i);
  emItem.src = g_strFirstUnreadImage;
  emItem.width = 31;
  emItem.height = 22;
  emItem.style.verticalAlign = 'middle';
 }
}

function ReplaceRadikalPreviews()
// Заменяет миниатюры тормозного Ради Кала на статичное изображение.
{
 var emIMG = document.createElement('img');
 emIMG.src = "data:image/png;base64,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";
 emIMG.className = 'postImg';
 emIMG.title = g_Text['showimage'];

 var colSnapshot = document.evaluate(//'//var[@class="postImg"]',
  '//a[@class="postlink" and @href!="http://www.radikal.ru" and @href!="http://www.radikal.ua"]/var[contains(@title, ".radikal.")]',
  document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 for (var i = 0; i < colSnapshot.snapshotLength; ++i)
 {
  var emItem = colSnapshot.snapshotItem(i);
  emItem.parentNode.replaceChild(emIMG.cloneNode(true), emItem);
 }
}

function ChangePostLinksTarget()
// Ссылки в сообщениях открываются в новом окне.
{
 var colSnapshot = document.evaluate('//div[@class="postbody"]/descendant::a',
  document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
 for (var i = 0; i < colSnapshot.snapshotLength; ++i)
 {
  colSnapshot.snapshotItem(i).target = '_blank';
 }
}

function ResizePMTopicElements()
{
 //
 // Уменьшение ширины первой колонки с никами под просматриваемым/редактируемым персональным сообщением.
 //
 document.evaluate('//div[contains(@style, "overflow")]/table/tbody/tr/th',
  document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue
  .removeAttribute('width');
}

//
// Обработка событий.
//

function OnInsertNick(objEvent)
{
 insert_text_keepfocus('[b]' + objEvent.target.firstChild.nodeValue + '[/b]');
}

function OnInsertQuote(objEvent)
{
 if (window.getSelection().toString() == '')
 {
  alert(g_Text['emptyquote']);
 }
 else
 {
  addquote_keepfocus(null, objEvent.target.parentNode.parentNode.previousElementSibling
   .firstElementChild.lastElementChild.firstElementChild.firstChild.nodeValue);
 }
}

//
// Варианты функций editor.js, из которых удалены вызовы focus().
// Так же был выкинут на хуй ослячий код и добавлена поддержка XPCNativeWrapper.
// К названиям функций добавлено _keepfocus.
//

function mozWrap_keepfocus(txtarea, open, close)
{
 // textLength - это плюшка HTML5
 var selLength = (typeof(txtarea.textLength) == 'undefined') ? txtarea.value.length : txtarea.textLength;
 var selStart = txtarea.selectionStart;
 var selEnd = txtarea.selectionEnd;
 var scrollTop = txtarea.scrollTop;

 if (selEnd == 1 || selEnd == 2) 
 {
  selEnd = selLength;
 }

 var s1 = (txtarea.value).substring(0, selStart);
 var s2 = (txtarea.value).substring(selStart, selEnd);
 var s3 = (txtarea.value).substring(selEnd, selLength);

 txtarea.value = s1 + open + s2 + close + s3;
 txtarea.selectionStart = selStart + open.length;
 txtarea.selectionEnd = selEnd + open.length;
 txtarea.scrollTop = scrollTop;
}

function insert_text_keepfocus(text, spaces, popup)
{
 var textarea;
 
 if (!popup) 
 {
  textarea = document.forms.namedItem(unsafeWindow.form_name).elements.namedItem(unsafeWindow.text_name);
 } 
 else 
 {
  textarea = opener.document.forms.namedItem(unsafeWindow.form_name).elements.namedItem(unsafeWindow.text_name);
 }

 if (spaces)
 {
  text = ' ' + text + ' ';
 }
 
 mozWrap_keepfocus(textarea, text, '');
}

function addquote_keepfocus(post_id, username)
{
 insert_text_keepfocus('[quote="' + username + '"]' + window.getSelection().toString() + '[/quote]');
}

0 comments:

Post a Comment