var defaultPrefix = 'http://xpoint.ru';
var niceTitle;
var currentElement = null;
var timer = null;

var titles = {
  logoutLink:   [ 200,"Выйти из системы"],
  pagerLink:    [ 200,"Читать личные сообщения (пейджер)"],
  extendedSearchLink: [ 200,"Перейти в расширенный поиск"],
  boredLink:    [ 200,"Запомнить место (надоело читать на этом месте)"],
  threadLockLink: [1000,"Закрыть тему"],
  threadUnlockLink: [1000,"Открыть тему"],
  threadRipDelLink: [1000,"Приговорить тему к удалению"],
  threadRipArcLink: [1000,"Приговорить тему к архивированию"],
  threadRipResLink: [1000,"Снять приговор с темы"],
  threadArchiveLink:  [1000,"Поместить тему в архив"],
  threadEditLink: [1000,"Редактировать тему"],
  threadDeleteLink: [1000,"Удалить тему"],
  messageRestoreLink: [1000,"Восстановить сообщение"],
  messageEditLink:  [1000,"Редактировать сообщение"],
  messageDeleteLink:  [1000,"Удалить сообщение"],
  messageOriginalLink:  [1000,"Восстановить оригинальный текст сообщения"],
  userRefInsertLink:  [ 200,"Вставить обращение к пользователю в окно редактирования нового сообщения"],
  messageModeratedIcon: [ 200,"Сообщение промодерировано"],
  moderatorAnnounce:  [ 200,"Сообщение от модератора"],
  moderatorWarning: [ 200,"Предупреждение от модератора"],
  userForumRating:  [ 200,"Рейтинг пользователя в текущем форуме"],
  userTotalRating:  [ 200,"Общий рейтинг пользователя"],
  userInfoLink:   [ 200,"Посмотреть досье пользователя"],
  pagerLink:    [ 200,"Послать этому пользователю сообщение на пейджер"],
  newCount:   [ 200,"Количество новых тем"],
  updatedCount:   [ 200,"Количество обновленных тем"],
  forumDeleteFavoritesLink: [ 200,"Удалить форум из избранного"],
  drouksDisabledLink: [ 500,"Со времени последнего посещения форум не обновился"],
  forumUpdatedLink: [ 200,"Показать только обновленные или новые темы"],
  forumUnchangedLink: [ 500,"Со времени последнего посещения форум не обновился"],
  totalThreadsCount:  [ 200,"Всего тем"],
  threadDeletedLink:  [ 200,"Тема удалена, приносим извинения"],
  threadDeleteFavoritesLink: [ 200,"Удалить тему из избранного"],
  rippedDelIcon:  [ 200,"Приговорена к удалению"],
  rippedArcIcon:  [ 200,"Приговорена к архивированию"],
  hasAttachIcon:  [ 200,"Имеет иллюстрации"],
  writtenIcon:    [ 200,"Вы участвуете в обсуждении данной темы"],
  formattingRulesLink:  [ 200,"Посмотреть синтаксис форматирования (откроется в новом окне)"],
  unreadOnlyLink: [ 200,"Показать только непрочитанные сообщения"],
  messagesTotal:  [ 200,"Количество сообщений в теме"],
  readersTotal:   [ 200,"Количество посетителей, прочитавших эту тему"],
  ratedIcon:    [ 200,"Ответы в теме оценены"],
  notRatedIcon:   [ 200,"Ответы в теме требуют оценки"],
  faqAnchor:    [ 200,"Этот ярлык предназначен для копирования URL данного вопроса"],
  faqEditLink:    [1000,"Редактировать"],
  faqDeleteLink:  [1000,"Удалить"],
  faqAddLink:   [1000,"Добавить новый F.A.Q."],
  faqSeqLink:   [1000,"Изменить порядок следования статей F.A.Q."],
  bannerEditLink: [1000,"Редактировать"],
  bannerDeleteLink: [1000,"Удалить"],
  bannerAddLink:  [1000,"Добавить новый баннер"],
  moderatorRating:  [ 200,"Рейтинг модератора"],
  wikiCreateLink: [ 500,"Хотите создать этот документ?"],
  pagerMessageDeleteLink: [ 200,"Удалить сообщение"],
  rfcFormattedLink: [ 200,"Открыть форматированный текст RFC (с перекрестными ссылками)"],
  rfcOfficialLink:  [ 200,"Открыть официальный вариант в текстовом формате"],
  googleLink:   [ 200,"Искать эту строку в Google"],
  yandexLink:   [ 200,"Искать эту строку в Яндексе"],
  phpLink:    [ 200,"Посмотреть документацию PHP на эту тему"],
  perlLink:   [ 200,"Посмотреть документацию Perl на эту тему"],
  threadLink:   [ 200,"Перейти на эту тему форума"],
  externalLink:   [ 200,"Открыть внешнюю ссылку"],
  faqLink:    [ 200,"Перейти к статье F.A.Q."],
  mailtoLink:   [ 200,"Послать электронное письмо на указанный адрес"],
  wikiLink:   [ 200,"Перейти к этой статье базы знаний"],
  documentDiffLink: [200,"Показать diff изменений"]
};
var tagTitles = {
/*
  blockquote: "Вставка цитаты:\n[[[\nЦитата\n]]]",
  pre: "Вставка кода:\n<<<\n   Код\n>>>"
*/
};

/*();*/

    if (window.addEventListener) 
    {
    	window.addEventListener('load', initNiceTitles, false);
    } 
    else if (window.attachEvent) 
    {
    	window.attachEvent('onload', initNiceTitles);
    }


function initNiceTitles()
{
  
  if (!document.createElement)
    return;
	
  niceTitle = document.createElement("div");
  niceTitle.style.position = "absolute";
  niceTitle.style["float"] = "left";
  
  pushHandler(document, "mouseover", showNiceTitle);
  pushHandler(document, "focus", showNiceTitle);
	
  pushHandler(window, "blur", hideNiceTitle);
}

function findPosition(node)
{
  if(node.offsetParent)
  {
    for(var posX = 0, posY = 0; node.offsetParent; node = node.offsetParent)
    {
      posX += node.offsetLeft;
      posY += node.offsetTop;
    }
    return [posX, posY];
  }
  else
    return [node.x, node.y];
}

function createParagraph(text, className)
{
  var p = document.createElement("p");
  p.className = className;
  text = text.split("\n");
        if (typeof(text.length) == 'number')
  {
      for (var i=0; i<text.length; i++)
    {
      p.appendChild(document.createTextNode(text[i]));
      if (i < text.length-1)
        p.appendChild(document.createElement("br"));
    }
  }
  return p;
}

function showNiceTitle(e)
{
	
  e = e || window.event;
  if (!e || typeof(window.currentElement) == 'undefined')
    return;

  var element = e.target || e.srcElement;
  while (element)
  {
    if (element.nodeType == 1)
    {
      if (element.getAttribute("nicetitle"))
        break;
      else if (element.getAttribute("title"))
      {
        element.setAttribute("nicetitle", element.getAttribute("title"));
        element.setAttribute("title", "");
        element.setAttribute("nicedelay", 0);
        break;
      }
      else if (typeof(titles[element.id]) != "undefined")
      {
        element.setAttribute("nicetitle", titles[element.id][1]);
        element.setAttribute("nicedelay", titles[element.id][0]);
        break;
      }
      else if (typeof(titles[element.className]) != "undefined")
      {
        element.setAttribute("nicetitle", titles[element.className][1]);
        element.setAttribute("nicedelay", titles[element.className][0]);
        break;
      }
      else if (element.getAttribute("accesskey"))
      {
        element.setAttribute("nicetitle", "Горячая клавиша: " + element.getAttribute("accesskey"));
        element.setAttribute("nicedelay", 200);
        break;
      }
      else if (typeof(tagTitles[element.tagName.toLowerCase()]) != "undefined")
      {
        element.setAttribute("nicetitle", tagTitles[element.tagName.toLowerCase()]);
        element.setAttribute("nicedelay", 5000);
        break;
      }
    }
    element = element.parentNode;
  }

  if (!element || element == currentElement)
    return;

  if (timer)
  {
    clearTimeout(timer);
    timer = null;
  }

  currentElement = element;
  pushHandler(element, "mouseout", hideNiceTitle);
  pushHandler(element, "blur", hideNiceTitle);

  var pos = findPosition(element);
  niceTitle.className = "nicetitle " + element.tagName.toLowerCase() + "NT";
  
  while (niceTitle.firstChild)
    niceTitle.removeChild(niceTitle.firstChild);

  niceTitle.appendChild(createParagraph(element.getAttribute("nicetitle")), "titletext");
  var delay = element.getAttribute("nicedelay");

  element = e.target || e.srcElement;

  while (element && (element.nodeType != 1 || !element.getAttribute("href")))
    element = element.parentNode;

  if (element)
  {
    niceTitle.className += " aNT";

    var link = element.href;
    if (link.substring(0, defaultPrefix.length) != defaultPrefix || element.className == "externalLink")
      niceTitle.appendChild(createParagraph(link, "destination"));
  }

  if (delay)
    timer = setTimeout("doShowNiceTitle(["+pos[0]+","+pos[1]+"])",delay);
  else
    doShowNiceTitle(pos);
	
	
}

function doShowNiceTitle(pos)
{
  timer = null;
 
  niceTitle.style.left = "0px";
  niceTitle.style.top = "0px";
  niceTitle.style.visibility = "hidden";
  setTimeout("makeNiceTitleVisible(["+pos[0]+","+pos[1]+"])", 0);
  document.body.appendChild(niceTitle);
}

function makeNiceTitleVisible(pos)
{
  pos[0] += 15;
  pos[1] += 35;

  var innerWidth = null;
  if (window.innerWidth)
    innerWidth = window.innerWidth;
  else if (document.body && document.body.clientWidth)
    innerWidth = document.body.clientWidth;

  if (innerWidth && niceTitle.offsetWidth && niceTitle.offsetWidth + pos[0] + 30 > innerWidth)
    pos[0] = Math.max(innerWidth - niceTitle.offsetWidth - 30, 30);

  niceTitle.style.left = pos[0] + 'px';
  niceTitle.style.top = pos[1] + 'px';
  niceTitle.style.visibility = "visible";
}

function hideNiceTitle(e)
{
  if (timer)
  {
    clearTimeout(timer);
    timer = null;
  }
  if (typeof(window.currentElement) == 'undefined')
    return;

  if (currentElement && niceTitle.parentNode)
  {
    niceTitle.parentNode.removeChild(niceTitle);
    removeHandler(currentElement, "mouseout", hideNiceTitle);
    removeHandler(currentElement, "blur", hideNiceTitle);
    currentElement = null;
  }
}
