/*
  Author: Techocraft, Uroš Renko
  Dependencies: Prototype library 1.6+
  Module: Hints
  Description: Use for any kind of hint in html.
*/

var TcHint = Class.create(
{
  body: "undefined",
  overlay: "undefined",
  container: "undefined",
  box: "undefined",
  hint: "undefined",
  maxsize: 400,
  timer_enabled: false,
  timer_id: 0,
  sleep_id: 0,
  interval: 10, // 1000 miliseconds
  delay: 300,
  time: 0,
  sizeable: true,
  autosize: false,
  opacity: 1,
  fade_out: true,
  fade_delay: 300,
  fade_step: function ()
  {
    var k = (this.fade_delay / this.interval);
    if (k>0)
    {
      return (100 / k);
    } else
    {
      return 10;
    }
  },
  overlayColor: "#000000",
  debug: true,
  visible: false,
  initialize: function(selector)
  {    
    if (!document.getElementsByTagName)
    {
      // no elements in document
      return;
    }
    if (!selector)
    {
      // default css selector for calendar hints
      selector = "td.event";
    }
    var hints = $$(selector);
    if (!hints)
    {
      // no hints by css selector found in document
      return;
    }

    hints.each(
      function(hint)
      {
        hint.onmouseover =
          function (event)
          {
            objTcHint.stop_timer();
            objTcHint.show(this,event);
            return false;
          };
        hint.onmouseout =
          function (event)
          {
            objTcHint.hide(this);
            return false;
          }
      }
    )

    var objBody = $(document.getElementsByTagName("body").item(0));
    var objOverlay = $(document.createElement("div"));
    objOverlay.setAttribute('id','tc-hint-overlay');
    objOverlay.hide();
    objBody.appendChild(objOverlay);

    if (this.debug)
    {
      var objDebug = $(document.createElement("div"));
      objDebug.setAttribute('id','tc-hint-debug');
      objDebug.show();
      objOverlay.appendChild(objDebug);
    }

    var objContainer = $(document.createElement("div"));
    objContainer.setAttribute('id','tc-hint-container');
    objContainer.onmouseover =
      function ()
      { 
        objTcHint.stop_timer();
        return false;
      };
    objContainer.onmouseout =
      function ()
      { 
        objTcHint.hide();
        return false;
      };
    objContainer.hide(); 
    objBody.appendChild(objContainer);

    var objBox = $(document.createElement("div"));
    objBox.setAttribute('id','tc-hint-box');
    //objBox.setStyle('margin-left: auto; margin-right: auto;');
    objContainer.appendChild(objBox);

    var objHint = $(document.createElement("div"));
    objHint.setAttribute('id','tc-hint');
    //objHint.setStyle('border: 10px solid #FFFFFF;cursor:pointer;');

    objBox.appendChild(objHint);

    this.body = objBody;
    this.overlay = objOverlay;
    this.container = objContainer;
    this.box = objBox;
    this.hint = objHint;
    if (this.debug)
    {
      this.debug = objDebug;
    }
  },
  isIE: function()
  {
    return /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
  },
  getOpacityStyle: function()
  {
    return '-ms-filter: alpha(opacity=' + (this.opacity*100) + '); filter: alpha(opacity=' + (this.opacity*100) + '); -moz-opacity: ' + this.opacity + '; opacity: ' + this.opacity + ';';
  },
  show: function(objSrcHint,event)
  {
    if (!objSrcHint)
    {
      return;
    }
    objTcHint.delay_counter = objTcHint.delay;
    if (this.debug)
    {
    }
    this.hint.innerHTML = '';
    $(objSrcHint).childElements('hint').each(
      function (node)
      {
        objTcHint.hint.innerHTML += node.innerHTML;
      }
    );
    /*
    this.overlay.setStyle('position: absolute; left: 0px; top: 0px; width: 100%; height: ' + pHeight + 'px; background-color: ' + this.overlayColor + '; z-index: 190; -ms-filter: alpha(opacity=' + (this.opacity*100) + '); filter: alpha(opacity=' + (this.opacity*100) + '); -moz-opacity: ' + this.opacity + '; opacity: ' + this.opacity + ';');
    this.container.setStyle('position: absolute; left: 0px; top: 0px; width: 100%; height: ' + pHeight + 'px; z-index: 200;');
    this.box.setStyle('margin-top: ' + (scrollTop + (pageHeight - imgHeight)  / 2) + 'px; width: ' + imgWidth + 'px;');
    */
    var _top;
    var _left;
    /*
    if (this.isIE())
    {
      event = window.event;
      _left = event.screenX;
      _top = event.screenY + 10;
    } else
    {
      _left = event.pointerX();
      _top = event.pointerY() + 10;
    }
    */
    var pos = objSrcHint.cumulativeOffset();
    _left = pos[0] + objSrcHint.getWidth() - 2;
    _top = pos[1];
    var _pos = this.hint.cumulativeOffset();
    if (((_pos[0] + objSrcHint.getWidth() - 2)!=_left) || (_pos[1]!=_top))
    {
      this.container.setStyle('position: absolute; left: ' + _left + 'px; top: ' + _top + 'px; z-index: 200;');
    }
    this.container.show();
    //this.overlay.show();
  },
  hide: function()
  {
    this.start_timer();
  },
  timeout: function()
  {
    this.timer_id = setInterval("objTcHint.on_timer();",this.interval);
  },
  on_timer: function()
  {
    if (this.delay>this.time)
    {
      if (this.fade_out)
      {
        if ((this.delay-this.fade_delay)<this.time)
        {
          this.opacity = (this.opacity*100 - this.fade_step()) / 100;
          this.container.setStyle(this.getOpacityStyle());
        }
      }
      this.time = this.time + this.interval;
    } else
    {
      this.stop_timer();
      this.container.hide();
      this.overlay.hide();
    }
    //$$('.module-header-title')[5].innerHTML = this.time;
  },
  start_timer: function()
  {
    if (!this.timer_enabled)
    {
      this.time = this.interval;
      this.timer_enabled = true;
      this.timeout();
    }
  },
  stop_timer: function()
  {
    if (this.timer_enabled)
    {
      if (this.timer_id)
      {
        clearInterval(this.timer_id);
      }
      this.time = this.interval;
      this.timer_enabled = false;
    }
    this.opacity = 1;
    this.container.setStyle(this.getOpacityStyle());
  }
});

function TcHintInit()
{ 
  objTcHint = new TcHint();
}

Event.observe(window, 'load', TcHintInit, false);

