/* 
 * jQuery.simpleTip.js
 * © 2011 kumagaiyusuke
*/

(function ($) {

  $.simpleTip = function (options) {
    
    
    // !定数
    
    var FPS = 30;
    
    var HIDE_POSITION_X = -9999;
    var HIDE_POSITION_Y = -9999;
    
    
    // !変数
    
    var $document = $(document);
    
    var $simpleTip = $("<div>");
    
    var position = {
      x: 0,
      y: 0
    };
    
    var resistance = 1;
    
    var chaseX = 0;
    var chaseY = 0;
    
    var currentX = HIDE_POSITION_X;
    var currentY = HIDE_POSITION_Y;
    
    var isShowTip = false;
    
    var interval = Math.floor(1000 / FPS);
    
    var timer;
    
    
    // !初期化
    
    if (typeof options !== "undefined") {
      
      if (typeof options.position !== "undefined") {
        
        if (typeof options.position.x === "number") {
          position.x = options.position.x;
        }
        if (typeof options.position.y === "number") {
          position.y = options.position.y;
        }
        
      }
      
      if (typeof options.resistance === "number") {
        resistance = options.resistance;
      }
      
    }
    
    $simpleTip.css({
      position: "absolute",
      top: HIDE_POSITION_Y,
      left: HIDE_POSITION_X
    });
    
    
    // !イベントハンドラ
    
    function onMouseMove(e) {
      
      chaseX = e.pageX + position.x;
      chaseY = e.pageY + position.y;
      
      if (currentX < 0 || currentY < 0) {
        currentX = chaseX;
        currentY = chaseY;
      }
    }
    
    function chaseCursor() {
      
      currentX += (chaseX - currentX) / resistance;
      currentY += (chaseY - currentY) / resistance;
      
      $simpleTip.css({
        top: currentY,
        left: currentX
      });

      timer = setTimeout(chaseCursor, interval);
    }
    
    
    // !パブリック
    
    $simpleTip.show = function () {
      
      if (isShowTip) {
        return;
      }
      
      isShowTip = true;
      
      $document.bind("mousemove", onMouseMove);
      
      $simpleTip.css({
        top: HIDE_POSITION_Y,
        left: HIDE_POSITION_X
      });
      
      timer = setTimeout(chaseCursor, interval);
    };
    
    $simpleTip.hide = function () {
      
      if (!isShowTip) {
        return;
      }
      
      isShowTip = false;
      
      $document.unbind("mousemove", onMouseMove);

      currentX = HIDE_POSITION_X;
      currentY = HIDE_POSITION_Y;
      
      $simpleTip.css({
        top: HIDE_POSITION_Y,
        left: HIDE_POSITION_X
      });
      
      clearTimeout(timer);
    };
    
    
    return $simpleTip;
  };

})(jQuery);

