	    var tooltipSequencer = {
	        state: 'hidden',
	        parentcontrol: null,
	        intervalid: null,
	        showdelay: 100,
	        showtime: 100,
	        hidedelay: 100,
	        hidetime: 100,
	        triggerX: 0,
	        triggerY: 0
	    };
	    var tooltipDelay = null;
	    function hideTooltip() {
	        if (tooltipSequencer.state == 'hidden' || tooltipSequencer.state == 'hiding' ) { return; }

	        var tt=$('#tooltipbox');
	        //when the tooltip is showing, get it to full brightness before starting it fading again
	        if (tooltipSequencer.state == 'showing') {
	            tt.stop(true, true);
	            tt.show();
	        }
	        //begin a fadeout, set state to hiding and then on animation completion, set state to hidden
	        tooltipSequencer.state = 'hiding';
	        /* IE can't display transparent images at anythig but 100% opacity, so don't fade out!
	        tt.fadeOut(tooltipSequencer.hidetime, function() {
    	        tooltipSequencer.state = 'hidden';
    	    });
    	   */
    	   tt.hide();
         tooltipSequencer.state = 'hidden';
	    }
	    function raiseTooltip(e) {
	        tooltipSequencer.intervalid = null;
	        var tt = $('#tooltipbox');
	        
	        //if the tooltip is not yet hidden, hide it before we start rasing it
	        if (tooltipSequencer.state != 'hidden') {
	            tt.stop(true, true);
	            tt.hide();
	        }
	        
	        var jitem = tooltipSequencer.parentcontrol;

	        //configure the tooltip and raise it, setting status to showing, on animation completion, status will be visible
	        tooltipSequencer.state = 'showing';
	        var pos = jitem.data('Position');
	        var left = 0, top = 0;
	        switch (pos) {
	            case 'bottom':
	                left = jitem.offset().left;
	                break;
	            default:
	                left = jitem.offset().left + jitem.width() + 4;
	                break;
	        }
	        switch (pos) {
	            case 'bottom':
	                top = jitem.offset().top + jitem.height() - 14;
	                break;
	            default:
	                top = jitem.offset().top;
	                break;
	        }
	        left = left + tt.width() > $(window).width() ? $(window).width() - tt.width() : left;
	        tt.css('left', left);
	        tt.css('top', top);

          //call the data provider (which will insert the text in the tooltip for us)
          eval(jitem.data('ToolTipFunc')+"(tt, jitem);")

	        /* IE can't display transparent images at anythig but 100% opacity, so don't fade in!
          tt.fadeIn(tooltipSequencer.showtime, function() {
	            tooltipSequencer.state = 'visible';
	        });  */
          tooltipSequencer.state = 'visible';
	        
	        tt.show();
	    }
	    function lowerTooltip() {
	        tooltipSequencer.intervalid = null;

	        var tt = $('#tooltipbox');

	        tooltipSequencer.state = 'hiding';
	        /* IE can't display transparent images at anythig but 100% opacity, so don't fade out!
	        $('#tooltipbox').fadeOut(tooltipSequencer.hidetime, function() {
	            tooltipSequencer.state = 'hidden';
	        });
	        */
	        $('#tooltipbox').hide();
          tooltipSequencer.state = 'hidden';
	    }
	    function configureTooltip(jitem) {
	        jitem.mouseover(function(e) {
	            tooltipSequencer.triggerX = e.pageX;
	            tooltipSequencer.triggerY = e.pageY;

	            //remove the timeout resource
	            if (tooltipSequencer.intervalid) { window.clearTimeout(tooltipSequencer.intervalid); }

	            //when the mouse runs over a label, begin the hide anim since we have a wait interval before the
	            //new tooltip arrives - hideTooltip will not act if the tooltip is already hiding (or hidden)
	            hideTooltip();

	            //record which element we're raising a tooltip against - once timer runs out raise the tooltip
	            tooltipSequencer.parentcontrol = jitem;
	            tooltipSequencer.intervalid = window.setTimeout(raiseTooltip, tooltipSequencer.showdelay);

	            //stop the browser raising a tooltip too
	            e.stopPropagation();
	        });
	        jitem.mouseout(function() {
	            if (tooltipSequencer.intervalid) {
	                window.clearTimeout(tooltipSequencer.intervalid);
	            }
	            if (tooltipSequencer.state == 'hiding' || tooltipSequencer.state == 'hidden') {
	                return;
	            }
	            tooltipSequencer.intervalid = window.setTimeout(lowerTooltip, tooltipSequencer.hidedelay);
	        });
	    }

$().ready(function(){
  var tt=$('<div id="tooltipbox"><div class="tooltipbox-content"></div></div>');
  $('body').append(tt);

  tt.mouseenter(function() {
      if (tooltipSequencer.intervalid) { window.clearTimeout(tooltipSequencer.intervalid); }
      tooltipSequencer.intervalid = null;
      tt.show();
      tooltipSequencer.state = 'visible';
  });
  tt.mouseleave(function() {
      lowerTooltip();
  });

  $('.product-box').each(function(){
    var box=$(this);
    var head=$('h3', box);
    
    head.data("ToolTipFunc", "getProductBoxTooltip");
    head.data("Position", "bottom");

    configureTooltip(head);

    var img=$('.product-thumb', box);

    img.data("ToolTipFunc", "getProductBoxTooltip");
    img.data("Position", "bottom");

    configureTooltip(img);
  });
  $('#top-products-wide li, #top-products li, #other-products-in-category-widget li').each(function(){
    var box=$(this);
    
    box.data("ToolTipFunc", "getTopProductBoxTooltip");
    box.data("Position", "bottom");

    configureTooltip(box);

    var img=$('.product-thumb', box);

    img.data("ToolTipFunc", "getProductBoxTooltip");
    img.data("Position", "bottom");

    configureTooltip(img);
  });
});

var _ttc_template = $('<div></div>');
function getProductBoxTooltip(tt, jitem) {
  $('.tooltipbox-content', tt).html($('.description-block', jitem.parents(".product-box")).html());
}
function getTopProductBoxTooltip(tt, jitem) {
  $('.tooltipbox-content', tt).html($('.description-block', jitem).html());
}

