﻿/* Version 1.0.0 of the NovelProjects Tool Tip
 * Author: Chris Keenan
 * Website: http://www.novelprojects.com/ */


(function($){   
  
  $.fn.npTooltip = function(params) {
    return this.each(function() {   
      $.npTooltip(params);
    });
  };  

  $.npTooltip = function(params)
  {
    var o = 
    {
      contentLoc: 'npToolTipLoc',
      handle: '.npTip',
      tooltipClass: 'tooltip2',      
      contentHtml: false,
      animate: false, // when set to true, animations will fire
      track: false,
      xOffset: 0,
			yOffset: 0,
      position:'mouse' // top, bottom, left, right, mouse
    };

    o = jQuery.extend(o, params);
    
    var instanceId = o.handle.replace('.','').replace('#','') + '_npToolTipC';
    
    if($('#'+instanceId).length==0)
    {        
      $('body').append("<div id='"+instanceId+"'>\n" +                           
                         "<div class='tooltipT'></div>\n" +
                             "<div class='tooltipM' id='"+instanceId+"_npTipContent'>\n" +
                                // Content Filled Here
                             "</div>\n" +
                         "<div class='tooltipB'></div>\n" +
                         "<div class='tooltipSpike'></div>\n" +
                       "</div>");
                             
      $('#'+instanceId).addClass(o.tooltipClass);                       
    }   
    
    //$('#'+instanceId).css({width:o.width.toString()+'px'});
    
    var overTip = false;
    var overImg = false;
    var tipVisible = false;
    var over = false;
    
    $(o.handle).hover(function(e)
    {
      overImg = true;

      if(o.contentHtml!=false)
        $('#'+instanceId+'_npTipContent').html(o.contentHtml); 
      else 
      { 
        var location = $(this).attr('loc');    
        if(location!=null && location.toString()!="") o.contentLoc = location;
        $('#'+instanceId+'_npTipContent').html($('#'+o.contentLoc).html());
      }
      
       setTimeout(function(){
        if((overTip || overImg) && !tipVisible)
        {
          postionTip($('#'+instanceId), e);
        
         // var obj = $('#'+instanceId).css({top:y-toolHeight, left:x});
          
          // Here we can do different effects by setting the object
          //obj.show(null,function(){over=true});
          if(o.animate && !$.browser.msie) { $('#'+instanceId).fadeIn('slow'); } else { $('#'+instanceId).show(); }
          
          tipVisible = true;
        }
       },200);
    }, 
    function(){
     overImg = false;                
     out();
    });

    function postionTip(obj, e)
    {
      var x = 0;
      var y = 0;
      var toolHeight = obj.height();
      var toolWidth = obj.width();
 
      if(o.position=='mouse') {
        x += parseInt(e.pageX,10);
        y += parseInt(e.pageY,10);
      }
      else {
        var handleOffsetX = $(o.handle).width() / 2;
        var tooltipX = $('#' + instanceId).width() / 2;
        
        x += $(o.handle).offset().left;
        y += $(o.handle).offset().top;
        
        if (o.position == 'top') {
          x += handleOffsetX - tooltipX;
          y -= toolHeight;
        }
        else if (o.position == 'right') {
          x += $(o.handle).width();
        }
        else if (o.position == 'bottom') {
          x += handleOffsetX - tooltipX;
          y += $(o.handle).height();
        }
        else if (o.position == 'left') {
          x -= toolWidth;
        }
      }
      
      //-- scroll adjustment --//
      if( typeof( window.pageYOffset ) == 'number' ) {
        // Netscape
        x -= window.pageXOffset;
        y -= window.pageYOffset;
      } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        // DOM
        x -= document.body.scrollLeft;
        y -= document.body.scrollTop;
      } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        // IE6 standards compliant mode
        x -= document.documentElement.scrollLeft;
        y -= document.documentElement.scrollTop;
      }
      
      //-- user adjustment --//
      x += parseInt(o.xOffset,10);
      y += parseInt(o.yOffset,10);
      
//      if (!o.track) {
//        x += $(o.handle).offset().left;
//        y += $(o.handle).offset().top;
//      }
//      else {
//        x += parseInt(e.pageX,10);
//        y += parseInt(e.pageY,10);
//      }

      //$('#'+instanceId+'_npTipContent').css({border:'1px solid red'});
      obj.css({top:y, left:x});
    }

    if(o.track) {
      $(o.handle).mousemove(function(e){
        postionTip($('#'+instanceId),e);
      });
    }

    // -- If we are hovered over the tooltip itself -- //
    $('#'+instanceId).hover(function(){
      overTip = (!o.track) ? true : false;
    },function(){
      overTip = false;
      $(o.handle).hover(function(){overImg=true;},function(){overImg=false;});
      out();
    });
    
    // -- Destroy the Tooltip if all conditions are met -- //
    function out()
    {
      setTimeout(function(){
        if(!overTip && !overImg && tipVisible)
        {
          if(o.animate && !$.browser.msie) { $('#'+instanceId).fadeOut(); } else { $('#'+instanceId).hide(); }
          tipVisible = false;
        }
      },300);
    }
  } // -- Closes the $.npTooltip -- //
})(jQuery);

