/**
 * Xchar Tooltip.
 *
 * Author: Pierre Minnieur <pierre.minnieur@xchar.de>
 * Version: SVN: $Id: javascript.php 11098 2009-12-26 19:28:31Z kdeubert $
 */
if (typeof Xchar_Tooltip == "undefined") {
  var Xchar_Tooltip = new function() {
    var cursorX, cursorY;
    var CURSOR_VSPACE = 15, CURSOR_HSPACE = 15;

    var currentItem, currentTalent, currentStats;
    var TYPE_ITEM = 1, TYPE_TALENT = 2, TYPE_STATS = 3;

    var lookUps = {
      1: [[], 'item'],
      2: [[], 'talent'],
      3: [[], 'stats']
    };

    var tooltip;

    var language = {
      loading: "Loading tooltip ...",
      noResponse: "No response from server :("    }

    var charId = "347980";

    this.initialize = function() {
      // items in general
      jQuery('a').each(function(idx, el) {
        if (jQuery(el).attr('rel') == 'tooltip') {
          jQuery(el).bind('mouseover', onItemMouseOver);
        }
      });

      // talent tree talents
      jQuery('.cp_talenttree .talentborder').bind('mouseover', onTalentMouseOver);

      // character sheet stats
      if (typeof charId != "undefined") {
        jQuery('.cp_stats_values > p').bind('mouseover', onStatsMouseOver);
      }
    }

    onItemMouseOver = function(event) {
      if (!this.onmousemove) {
        jQuery(this).bind('mousemove', onMouseMove);
        jQuery(this).bind('mouseout',  onMouseOut);
      }

      updateCursorPosition(event);
      renderItemTooltip(this.id);
    }

    onTalentMouseOver = function(event) {
      if (!this.onmousemove) {
        jQuery(this).bind('mousemove', onMouseMove);
        jQuery(this).bind('mouseout',  onMouseOut);
      }

      var invoker = jQuery(this).clone();
      var classes = invoker.removeClass('talentborder').attr('class').split(' ');

      var params = new Object(), splitted;
      for (i = 0; i < classes.length; i++)
      {
        splitted = classes[i].split('-');
        params[splitted[0]] = splitted[1];
      }

      updateCursorPosition(event);
      renderTalentTooltip(params.className, params.treeNr, params.slot, params.points, params.maximum);
    }

    onStatsMouseOver = function(event) {
      if (!this.onmousemove) {
        jQuery(this).bind('mousemove', onMouseMove);
        jQuery(this).bind('mouseout',  onMouseOut);
      }

      // spit classes to retrieve panel and stats to show
      var splitted = jQuery(this).attr('class').split(' ');

      updateCursorPosition(event);
      renderStatsTooltip(splitted[0], splitted[1]);
    }

    onMouseMove = function(event) {
      updateCursorPosition(event);
      moveTooltip();
    }

    onMouseOut = function(event) {
      hideTooltip();
    }

    moveTooltip = function() {
      if (!tooltip || cursorX == null) {
        return;
      }

      var windowDimensions = getWindowDimensions();
      var windowWidth      = windowDimensions.width;
      var windowHeight     = windowDimensions.height;

      var scroll     = getScrolling();
      var scrollLeft = scroll.x;
      var scrollTop  = scroll.y;

      var tooltipWidth  = tooltip.width();
      var tooltipHeight = tooltip.height();

      var left = cursorX + CURSOR_HSPACE;
      var top  = cursorY - tooltipHeight - CURSOR_VSPACE;

      if (left + CURSOR_HSPACE + tooltipWidth + 4 >= scrollLeft + windowWidth) {
        var tmpLeft = cursorX - tooltipWidth - CURSOR_HSPACE;
        if (tmpLeft >= 0) {
          left = tmpLeft;
        } else {
          left = scrollLeft + windowWidth - tooltipWidth - CURSOR_HSPACE - 4;
        }
      }

      if (top < scrollTop) {
        top = cursorY + CURSOR_VSPACE;
        if (top  + tooltipHeight > scrollTop + windowHeight) {
          top = scrollTop + windowHeight - tooltipHeight;
        }
      }

      tooltip.css('left', left+'px');
      tooltip.css('top', top+'px');
    }

    hideTooltip = function() {
      if (!tooltip) {
        return;
      }

      // show <embed> elements
      // jQuery('embed').show();

      tooltip.empty();
      tooltip.hide();
    }

    getWindowDimensions = function()
    {
      return {
        width: jQuery(window).width(),
        height: jQuery(window).height()
      };
    }

    getScrolling = function() {
      return {
        x: jQuery(window).scrollLeft(),
        y: jQuery(window).scrollTop()
      };
    }

    getCursorPosition = function(event) {
      var x = 0, y = 0;

      if (typeof jQuery(window).height() == "number") {
        x = event.pageX;
        y = event.pageY;
      } else {
        var scroll = getScrolling();

        x = event.clientX + scroll.x;
        y = event.clientY + scroll.y;
      }

      return {
        x: x,
        y: y
      };
    }

    updateCursorPosition = function(event) {
      var position = getCursorPosition(event);

      cursorX = position.x;
      cursorY = position.y;
    }

    renderItemTooltip = function(itemId) { // display
      currentItem = itemId;

      var array = lookUps[TYPE_ITEM][0];
      if (typeof array[itemId] == "object") {
        showTooltip(array[itemId].tooltip);
      } else {
        if (!array[itemId]) {
          loadItemTooltip(itemId);
        } else {
          showTooltip(language.loading);
        }
      }
    }

    renderTalentTooltip = function(className, treeNb, slot, points, maximum)
    {
      var talentId  = className+'-'+treeNb+'-'+slot+'-'+points+'-'+maximum;
      currentTalent = talentId;

      var array = lookUps[TYPE_TALENT][0];
      if (typeof array[talentId] == "object") {
        showTooltip(array[talentId].tooltip);
      } else {
        if (!array[talentId]) {
          loadTalentTooltip(talentId, className, treeNb, slot, points, maximum);
        } else {
          showTooltip(language.loading);
        }
      }
    }

    renderStatsTooltip = function(panel, stats) {
      var statsId  = panel+'-'+stats+'-'+charId;
      currentStats = statsId;

      var array = lookUps[TYPE_STATS][0];
      if (typeof array[statsId] == "object") {
        showTooltip(array[statsId].tooltip);
      } else {
        if (!array[statsId]) {
          loadStatsTooltip(statsId, panel, stats);
        } else {
          showTooltip(language.loading);
        }
      }
    }

    showTooltip = function(html) {
      if (!tooltip) {
        initTooltip();
      }

      // hide <embed> elements
      // jQuery('embed').hide();

      tooltip.html(html);
      moveTooltip();
      tooltip.show();
    }

    initTooltip = function()
    {
      if (!tooltip) {
        var div = document.createElement('div');
        jQuery(document.body).append(div);

        tooltip = jQuery(div);
        tooltip.attr({
          id: 'xchar-tooltip'
        });

        hideTooltip();
      }
    }

    loadItemTooltip = function(itemId) {
      var array     = lookUps[TYPE_ITEM][0];
      array[itemId] = setTimeout(function() {
        showItemLoading.apply(this, [itemId]);
      }, 100);

      var url = '/tooltip/item/'+itemId;
      if (typeof charId != "undefined") {
        url += '/'+charId;
      }
      jQuery('head').append('<script language="javascript" type="text/javascript" src="'+url+'"></script>');
    }

    loadTalentTooltip = function(talentId, className, treeNb, slot, points, maximum) {
      var array       = lookUps[TYPE_TALENT][0];
      array[talentId] = setTimeout(function() {
        showTalentLoading.apply(this, [talentId]);
      }, 100);

      var url = '/tooltip/talent/'+className+'/'+treeNb+'/'+slot+'/'+points+'/'+maximum;
      jQuery('head').append('<script language="javascript" type="text/javascript" src="'+url+'"></script>');
    }

    loadStatsTooltip = function(statsId, panel, stats) {
      var array = lookUps[TYPE_STATS][0];
      array[statsId] = setTimeout(function() {
        showStatsLoading.apply(this, [statsId]);
      }, 100);

      var url = '/tooltip/stats/'+charId+'/'+panel+'/'+stats;
      jQuery('head').append('<script language="javascript" type="text/javascript" src="'+url+'"></script>');
    }

    showItemLoading = function(itemId) {
      if (currentItem == itemId) {
        showTooltip(language.loading);

        var array          = lookUps[TYPE_ITEM][0];
        array[currentItem] = setTimeout(function() {
          notFoundItem.apply(this, [itemId]);
        }, 6500);
      }
    }

    showTalentLoading = function(talentId) {
      if (currentTalent == talentId) {
        showTooltip(language.loading);

        var array            = lookUps[TYPE_TALENT][0];
        array[currentTalent] = setTimeout(function() {
          notFoundTalent.apply(this, [talentId]);
        }, 2500);
      }
    }

    showStatsLoading = function(statsId) {
      if (currentStats == statsId) {
        showTooltip(language.loading);

        var array            = lookUps[TYPE_STATS][0];
        array[currentStats] = setTimeout(function() {
          notFoundTalent.apply(this, [statsId]);
        }, 1000);
      }
    }

    notFoundItem = function(itemId) {
        var array     = lookUps[TYPE_ITEM][0];
        array[itemId] = undefined;

        if (currentItem == itemId) {
          showTooltip(language.noResponse);
        }
    }

    notFoundTalent = function(talentId) {
        var array       = lookUps[TYPE_TALENT][0];
        array[talentId] = undefined;

        if (currentTalent == talentId) {
          showTooltip(language.noResponse);
        }
    }

    notFoundStats = function(statsId) {
        var array      = lookUps[TYPE_STATS][0];
        array[statsId] = undefined;

        if (currentStats == statsId) {
          showTooltip(language.noResponse);
        }
    }

    this.addItem = function(itemId, tooltip) {
      var array = lookUps[TYPE_ITEM][0];
      clearTimeout(array[itemId]);

      array[itemId] = {
        tooltip: tooltip
      };

      if (currentItem == itemId) {
        showTooltip(array[itemId].tooltip);
      }
    }

    this.addTalent = function(className, treeNb, slot, points, maximum, tooltip) {
      var talentId = className+'-'+treeNb+'-'+slot+'-'+points+'-'+maximum;
      var array    = lookUps[TYPE_TALENT][0];
      clearTimeout(array[talentId]);

      array[talentId] = {
        tooltip: tooltip
      };

      if (currentTalent == talentId) {
        showTooltip(array[talentId].tooltip);
      }
    }

    this.addStats = function(panel, stats, charId, tooltip) {
      var statsId = panel+'-'+stats+'-'+charId;
      var array   = lookUps[TYPE_STATS][0];
      clearTimeout(array[statsId]);

      array[statsId] = {
        tooltip: tooltip
      };

      if (currentStats == statsId) {
        showTooltip(array[statsId].tooltip);
      }
    }
  };
}

jQuery(document).ready(function() {
  Xchar_Tooltip.initialize();
});

