/* Основа этого кода была заимствована с портала http://www.xpoint.ru */

var niceTitle;
var currentElement = null;

initNiceTitles();

function pushHandler(object, event, handler)
{
  if (typeof object.addEventListener != 'undefined')
    object.addEventListener(event, handler, false);
  else if (typeof object.attachEvent != 'undefined')
    object.attachEvent('on' + event, handler);
  else
  {
    var handlersProp = '_handlerStack_' + event;
    var eventProp = 'on' + event;
    if (typeof object[handlersProp] == 'undefined')
    {
      object[handlersProp] = [];
      if (typeof object[eventProp] != 'undefined')
        object[handlersProp].push(object[eventProp]);
      object[eventProp] = function(e)
      {
        var ret = true;
        for (var i = 0; ret != false && i < object[handlersProp].length; i++)
          ret = object[handlersProp][i](e);
        return ret;
      }
    }
    object[handlersProp].push(handler);
  }
}

function removeHandler(object, event, handler)
{
  if (typeof object.removeEventListener != 'undefined')
    object.removeEventListener(event, handler, false);
  else if (typeof object.detachEvent != 'undefined')
    object.detachEvent('on' + event, handler);
  else
  {
    var handlersProp = '_handlerStack_' + event;
    if (typeof object[handlersProp] != 'undefined')
    {
      for (var i = 0; i < object[handlersProp].length; i++)
      {
        if (object[handlersProp][i] == handler)
        {
          object[handlersProp].splice(i, 1);
          return;
        }
      }
    }
  }
}

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", "");
        break;
      }
    }
    element = element.parentNode;
  }

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

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

  var pos = findPosition(element);
  pos[0] += currentElement.offsetWidth/3;
  pos[1] += currentElement.offsetHeight;
  niceTitle.className = "nicetitle " + element.tagName.toLowerCase() + "NT";
  
  while (niceTitle.firstChild)
    niceTitle.removeChild(niceTitle.firstChild);

  niceTitle.appendChild(createParagraph(element.getAttribute("nicetitle")), "titletext");
  doShowNiceTitle(pos);
}

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

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

  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 (typeof(window.currentElement) == 'undefined')
    return;

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

