jquery.cluetip.js
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:23k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * jQuery clueTip plugin
  3.  * Version 0.9.6  (02/02/2008)
  4.  * @requires jQuery v1.1.1+
  5.  * @requires Dimensions plugin 
  6.  *
  7.  * Dual licensed under the MIT and GPL licenses:
  8.  * http://www.opensource.org/licenses/mit-license.php
  9.  * http://www.gnu.org/licenses/gpl.html
  10.  *
  11.  */
  12. (function($) { 
  13. /*
  14.  * @name clueTip
  15.  * @type jQuery
  16.  * @cat Plugins/tooltip
  17.  * @return jQuery
  18.  * @author Karl Swedberg
  19.  *
  20.  * @credit Inspired by Cody Lindley's jTip (http://www.codylindley.com)
  21.  * @credit Thanks to the following people for their many and varied contributions:
  22.       Shelane Enos, Glen Lipka, Hector Santos, Torben Schreiter, Dan G. Switzer, Jörn Zaefferer 
  23.  * @credit Thanks to Jonathan Chaffer, as always, for help with the hard parts. :-)
  24.  */
  25.  /**
  26.  * 
  27.  * Displays a highly customizable tooltip when the user hovers (default) or clicks (optional) the matched element. 
  28.  * By default, the clueTip plugin loads a page indicated by the "rel" attribute via ajax and displays its contents.
  29.  * If a "title" attribute is specified, its value is used as the clueTip's heading.
  30.  * The attribute to be used for both the body and the heading of the clueTip is user-configurable. 
  31.  * Optionally, the clueTip's body can display content from an element on the same page.
  32.  * * Just indicate the element's id (e.g. "#some-id") in the rel attribute.
  33.  * Optionally, the clueTip's body can display content from the title attribute, when a delimiter is indicated. 
  34.  * * The string before the first instance of the delimiter is set as the clueTip's heading.
  35.  * * All subsequent strings are wrapped in separate DIVs and placed in the clueTip's body.
  36.  * The clueTip plugin allows for many, many more options. Pleasee see the examples and the option descriptions below...
  37.  * 
  38.  * 
  39.  * @example $('#tip).cluetip();
  40.  * @desc This is the most basic clueTip. It displays a 275px-wide clueTip on mouseover of the element with an ID of "tip." On mouseout of the element, the clueTip is hidden.
  41.  *
  42.  *
  43.  * @example $('a.clue').cluetip({
  44.  *  hoverClass: 'highlight',
  45.  *  sticky: true,
  46.  *  closePosition: 'bottom',
  47.  *  closeText: '<img src="cross.png" alt="close" />',
  48.  *  truncate: 60,
  49.  *  ajaxSettings: {
  50.  *    type: 'POST'
  51.  *  }
  52.  * });
  53.  * @desc Displays a clueTip on mouseover of all <a> elements with class="clue". The hovered element gets a class of "highlight" added to it (so that it can be styled appropriately. This is esp. useful for non-anchor elements.). The clueTip is "sticky," which means that it will not be hidden until the user either clicks on its "close" text/graphic or displays another clueTip. The "close" text/graphic is set to diplay at the bottom of the clueTip (default is top) and display an image rather than the default "Close" text. Moreover, the body of the clueTip is truncated to the first 60 characters, which are followed by an ellipsis (...). Finally, the clueTip retrieves the content using POST rather than the $.ajax method's default "GET."
  54.  * 
  55.  * More examples can be found at http://plugins.learningjquery.com/cluetip/demo/
  56.  * 
  57.  * Full list of options/settings can be found at the bottom of this file and at http://plugins.learningjquery.com/cluetip/
  58.  */
  59.   var $cluetip, $cluetipInner, $cluetipOuter, $cluetipTitle, $cluetipArrows, $dropShadow, imgCount;
  60.   $.fn.cluetip = function(options) {
  61.     var opts = $.extend({},$.fn.cluetip.defaults, options);
  62.     if (options && options.ajaxSettings) {
  63.       $.extend(opts.ajaxSettings, options.ajaxSettings);
  64.       delete options.ajaxSettings;
  65.     }
  66.     
  67.     if (options && options.hoverIntent) {
  68.       $.extend(opts.hoverIntent, options.hoverIntent);
  69.       delete options.hoverIntent;
  70.     }    
  71.     if (options && options.fx) {
  72.       $.extend(opts.fx, options.fx);
  73.       delete options.fx;
  74.     }
  75.     
  76.     return this.each(function(index) {
  77.       // start out with no contents (for ajax activation)
  78.       var cluetipContents = false;
  79.       var cluezIndex = parseInt(opts.cluezIndex, 10)-1;
  80.       var isActive = false, closeOnDelay = 0;
  81.       // create the cluetip divs
  82.       if (!$cluetip) {
  83.         $cluetipInner = $('<div id="cluetip-inner"></div>');
  84.         $cluetipTitle = $('<h3 id="cluetip-title"></h3>');        
  85.         $cluetipOuter = $('<div id="cluetip-outer"></div>').append($cluetipInner).prepend($cluetipTitle);
  86.         $cluetip = $('<div id="cluetip"></div>').css({zIndex: opts.cluezIndex})
  87.         .append($cluetipOuter).append('<div id="cluetip-extra"></div>')[insertionType](insertionElement).hide();
  88.         $('<div id="cluetip-waitimage"></div>').css({position: 'absolute', zIndex: cluezIndex-1})
  89.         .insertBefore('#cluetip').hide();
  90.         $cluetip.css({position: 'absolute', zIndex: cluezIndex});
  91.         $cluetipOuter.css({position: 'relative', zIndex: cluezIndex+1});
  92.         $cluetipArrows = $('<div id="cluetip-arrows" class="cluetip-arrows"></div>').css({zIndex: cluezIndex+1}).appendTo('#cluetip');
  93.       }
  94.       var dropShadowSteps = (opts.dropShadow) ? +opts.dropShadowSteps : 0;
  95.       if (!$dropShadow) {
  96.         $dropShadow = $([]);
  97.         for (var i=0; i < dropShadowSteps; i++) {
  98.           $dropShadow = $dropShadow.add($('<div></div>').css({zIndex: cluezIndex-i-1, opacity:.1, top: 1+i, left: 1+i}));
  99.         };
  100.         $dropShadow.css({position: 'absolute', backgroundColor: '#000'})
  101.         .prependTo($cluetip);
  102.       }
  103.       var $this = $(this);
  104.       var tipAttribute = $this.attr(opts.attribute), ctClass = opts.cluetipClass;
  105.       if (!tipAttribute && !opts.splitTitle) return true;
  106.       // if hideLocal is set to true, on DOM ready hide the local content that will be displayed in the clueTip
  107.       if (opts.local && opts.hideLocal) { $(tipAttribute + ':first').hide(); }
  108.       var tOffset = parseInt(opts.topOffset, 10), lOffset = parseInt(opts.leftOffset, 10);
  109.       // vertical measurement variables
  110.       var tipHeight, wHeight;
  111.       var defHeight = isNaN(parseInt(opts.height, 10)) ? 'auto' : (/D/g).test(opts.height) ? opts.height : opts.height + 'px';
  112.       var sTop, linkTop, posY, tipY, mouseY, baseline;
  113.       // horizontal measurement variables
  114.       var tipInnerWidth = isNaN(parseInt(opts.width, 10)) ? 275 : parseInt(opts.width, 10);
  115.       var tipWidth = tipInnerWidth + (parseInt($cluetip.css('paddingLeft'))||0) + (parseInt($cluetip.css('paddingRight'))||0) + dropShadowSteps;
  116.       var linkWidth = this.offsetWidth;
  117.       var linkLeft, posX, tipX, mouseX, winWidth;
  118.             
  119.       // parse the title
  120.       var tipParts;
  121.       var tipTitle = (opts.attribute != 'title') ? $this.attr(opts.titleAttribute) : '';
  122.       if (opts.splitTitle) {
  123.         if(tipTitle == undefined) {tipTitle = '';}
  124.         tipParts = tipTitle.split(opts.splitTitle);
  125.         tipTitle = tipParts.shift();
  126.       }
  127.       var localContent;
  128.       
  129. /***************************************      
  130. * ACTIVATION
  131. ****************************************/
  132.     
  133. //activate clueTip
  134.     var activate = function(event) {
  135.       if (!opts.onActivate($this)) {
  136.         return false;
  137.       }
  138.       isActive = true;
  139.       $cluetip.removeClass().css({width: tipInnerWidth});
  140.       if (tipAttribute == $this.attr('href')) {
  141.         $this.css('cursor', opts.cursor);
  142.       }
  143.       $this.attr('title','');
  144.       if (opts.hoverClass) {
  145.         $this.addClass(opts.hoverClass);
  146.       }
  147.       linkTop = posY = $this.offset().top;
  148.       linkLeft = $this.offset().left;
  149.       mouseX = event.pageX;
  150.       mouseY = event.pageY;
  151.       if ($this[0].tagName.toLowerCase() != 'area') {
  152.         sTop = $(document).scrollTop();
  153.         winWidth = $(window).width();
  154.       }
  155. // position clueTip horizontally
  156.       linkWidth = $this[0].offsetWidth; //BBFIX
  157.       if (opts.positionBy == 'fixed') {
  158.         posX = linkWidth + linkLeft + lOffset;
  159.         $cluetip.css({left: posX});
  160.       } else {
  161.         posX = (linkWidth > linkLeft && linkLeft > tipWidth)
  162.           || linkLeft + linkWidth + tipWidth + lOffset > winWidth 
  163.           ? linkLeft - tipWidth - lOffset 
  164.           : linkWidth + linkLeft + lOffset;
  165.         if ($this[0].tagName.toLowerCase() == 'area' || opts.positionBy == 'mouse' || linkWidth + tipWidth > winWidth) { // position by mouse
  166.           if (mouseX + 20 + tipWidth > winWidth) {  
  167.             $cluetip.addClass(' cluetip-' + ctClass);
  168.             posX = (mouseX - tipWidth - lOffset) >= 0 ? mouseX - tipWidth - lOffset - parseInt($cluetip.css('marginLeft'),10) + parseInt($cluetipInner.css('marginRight'),10) :  mouseX - (tipWidth/2);
  169.           } else {
  170.             posX = mouseX + lOffset;
  171.           }
  172.         }
  173.         var pY = posX < 0 ? event.pageY + tOffset : event.pageY;
  174.         $cluetip.css({left: (posX > 0 && opts.positionBy != 'bottomTop') ? posX : (mouseX + (tipWidth/2) > winWidth) ? winWidth/2 - tipWidth/2 : Math.max(mouseX - (tipWidth/2),0)});
  175.       }
  176.         wHeight = $(window).height();
  177. /***************************************
  178. * load the title attribute only (or user-selected attribute). 
  179. * clueTip title is the string before the first delimiter
  180. * subsequent delimiters place clueTip body text on separate lines
  181. ***************************************/
  182.       if (tipParts) {
  183.         var tpl = tipParts.length;
  184.         for (var i=0; i < tpl; i++){
  185.           if (i == 0) {
  186.             $cluetipInner.html(tipParts[i]);
  187.           } else { 
  188.             $cluetipInner.append('<div class="split-body">' + tipParts[i] + '</div>');
  189.           }            
  190.         };
  191.         cluetipShow(pY);
  192.       }
  193. /***************************************
  194. * load external file via ajax          
  195. ***************************************/
  196.       else if (!opts.local && tipAttribute.indexOf('#') != 0) {
  197.         if (cluetipContents && opts.ajaxCache) {
  198.           $cluetipInner.html(cluetipContents);
  199.           cluetipShow(pY);
  200.         }
  201.         else {
  202.           var ajaxSettings = opts.ajaxSettings;
  203.           ajaxSettings.url = tipAttribute;
  204.           ajaxSettings.beforeSend = function() {
  205.             $cluetipOuter.children().empty();
  206.             if (opts.waitImage) {
  207.               $('#cluetip-waitimage')
  208.               .css({top: mouseY+20, left: mouseX+20})
  209.               .show();
  210.             }
  211.           };
  212.          ajaxSettings.error = function() {
  213.             if (isActive) {
  214.               $cluetipInner.html('<i>sorry, the contents could not be loaded</i>');
  215.             }
  216.           };
  217.           ajaxSettings.success = function(data) {
  218.             cluetipContents = opts.ajaxProcess(data);
  219.             if (isActive) {
  220.               $cluetipInner.html(cluetipContents);
  221.             }
  222.           };
  223.           ajaxSettings.complete = function() {
  224.            imgCount = $('#cluetip-inner img').length;
  225.          if (imgCount) {
  226.            $('#cluetip-inner img').load( function(){
  227.            imgCount--;
  228.            if (imgCount<1) {
  229.            $('#cluetip-waitimage').hide();
  230.              if (isActive) cluetipShow(pY);
  231.            }
  232.            }); 
  233.          } else {
  234.        $('#cluetip-waitimage').hide();
  235.            if (isActive) cluetipShow(pY);    
  236.          } 
  237.           };
  238.           $.ajax(ajaxSettings);
  239.         }
  240. /***************************************
  241. * load an element from the same page
  242. ***************************************/
  243.       } else if (opts.local){
  244.         var $localContent = $(tipAttribute + ':first');
  245.         var localCluetip = $.fn.wrapInner ? $localContent.wrapInner('<div></div>').children().clone(true) : $localContent.html();
  246.         $.fn.wrapInner ? $cluetipInner.empty().append(localCluetip) : $cluetipInner.html(localCluetip);
  247.         cluetipShow(pY);
  248.       }
  249.     };
  250. // get dimensions and options for cluetip and prepare it to be shown
  251.     var cluetipShow = function(bpY) {
  252.       $cluetip.addClass('cluetip-' + ctClass);
  253.       
  254.       if (opts.truncate) { 
  255.         var $truncloaded = $cluetipInner.text().slice(0,opts.truncate) + '...';
  256.         $cluetipInner.html($truncloaded);
  257.       }
  258.       function doNothing() {}; //empty function
  259.       tipTitle ? $cluetipTitle.show().html(tipTitle) : (opts.showTitle) ? $cluetipTitle.show().html('&nbsp;') : $cluetipTitle.hide();
  260.       if (opts.sticky) {
  261.         var $closeLink = $('<div id="cluetip-close"><a href="#">' + opts.closeText + '</a></div>');
  262.         (opts.closePosition == 'bottom') ? $closeLink.appendTo($cluetipInner) : (opts.closePosition == 'title') ? $closeLink.prependTo($cluetipTitle) : $closeLink.prependTo($cluetipInner);
  263.         $closeLink.click(function() {
  264.           cluetipClose();
  265.           return false;
  266.         });
  267.         if (opts.mouseOutClose) {
  268.           if ($.fn.hoverIntent && opts.hoverIntent) { 
  269.             $cluetip.hoverIntent({
  270.               over: doNothing, 
  271.               timeout: opts.hoverIntent.timeout,  
  272.               out: function() { $closeLink.trigger('click'); }
  273.             });
  274.           } else {
  275.             $cluetip.hover(doNothing, 
  276.             function() {$closeLink.trigger('click'); });
  277.           }
  278.         } else {
  279.           $cluetip.unbind('mouseout');
  280.         }
  281.       }
  282. // now that content is loaded, finish the positioning 
  283.       var direction = '';
  284.       $cluetipOuter.css({overflow: defHeight == 'auto' ? 'visible' : 'auto', height: defHeight});
  285.       tipHeight = defHeight == 'auto' ? $cluetip.outerHeight() : parseInt(defHeight,10);   
  286.       tipY = posY;
  287.       baseline = sTop + wHeight;
  288.       if (opts.positionBy == 'fixed') {
  289.         tipY = posY - opts.dropShadowSteps + tOffset;
  290.       } else if ( (posX < mouseX && Math.max(posX, 0) + tipWidth > mouseX) || opts.positionBy == 'bottomTop') {
  291.         if (posY + tipHeight + tOffset > baseline && mouseY - sTop > tipHeight + tOffset) { 
  292.           tipY = mouseY - tipHeight - tOffset;
  293.           direction = 'top';
  294.         } else { 
  295.           tipY = mouseY + tOffset;
  296.           direction = 'bottom';
  297.         }
  298.       } else if ( posY + tipHeight + tOffset > baseline ) {
  299.         tipY = (tipHeight >= wHeight) ? sTop : baseline - tipHeight - tOffset;
  300.       } else if ($this.css('display') == 'block' || $this[0].tagName.toLowerCase() == 'area' || opts.positionBy == "mouse") {
  301.         tipY = bpY - tOffset;
  302.       } else {
  303.         tipY = posY - opts.dropShadowSteps;
  304.       }
  305.       if (direction == '') {
  306.         posX < linkLeft ? direction = 'left' : direction = 'right';
  307.       }
  308.       $cluetip.css({top: tipY + 'px'}).removeClass().addClass('clue-' + direction + '-' + ctClass).addClass(' cluetip-' + ctClass);
  309.       if (opts.arrows) { // set up arrow positioning to align with element
  310.         var bgY = (posY - tipY - opts.dropShadowSteps);
  311.         $cluetipArrows.css({top: (/(left|right)/.test(direction) && posX >=0 && bgY > 0) ? bgY + 'px' : /(left|right)/.test(direction) ? 0 : ''}).show();
  312.       } else {
  313.         $cluetipArrows.hide();
  314.       }
  315. // (first hide, then) ***SHOW THE CLUETIP***
  316.       $dropShadow.hide();
  317.       $cluetip.hide()[opts.fx.open](opts.fx.open != 'show' && opts.fx.openSpeed);
  318.       if (opts.dropShadow) $dropShadow.css({height: tipHeight, width: tipInnerWidth}).show();
  319.       if ($.fn.bgiframe) { $cluetip.bgiframe(); }
  320.       // trigger the optional onShow function
  321.       if (opts.delayedClose > 0) {
  322.         closeOnDelay = setTimeout(cluetipClose, opts.delayedClose);
  323.       }
  324.       opts.onShow($cluetip, $cluetipInner);
  325.       
  326.     };
  327. /***************************************
  328.    =INACTIVATION
  329. -------------------------------------- */
  330.     var inactivate = function() {
  331.       isActive = false;
  332.       $('#cluetip-waitimage').hide();
  333.       if (!opts.sticky || (/click|toggle/).test(opts.activation) ) {
  334.         cluetipClose();
  335. clearTimeout(closeOnDelay);        
  336.       };
  337.       if (opts.hoverClass) {
  338.         $this.removeClass(opts.hoverClass);
  339.       }
  340.       $('.cluetip-clicked').removeClass('cluetip-clicked');
  341.     };
  342. // close cluetip and reset some things
  343.     var cluetipClose = function() {
  344.       $cluetipOuter 
  345.       .parent().hide().removeClass().end()
  346.       .children().empty();
  347.       if (tipTitle) {
  348.         $this.attr('title', tipTitle);
  349.       }
  350.       $this.css('cursor','');
  351.       if (opts.arrows) $cluetipArrows.css({top: ''});
  352.     };
  353. /***************************************
  354.    =BIND EVENTS
  355. -------------------------------------- */
  356.   // activate by click
  357.       if ( (/click|toggle/).test(opts.activation) ) {
  358.         $this.click(function(event) {
  359.           if ($cluetip.is(':hidden') || !$this.is('.cluetip-clicked')) {
  360.             activate(event);
  361.             $('.cluetip-clicked').removeClass('cluetip-clicked');
  362.             $this.addClass('cluetip-clicked');
  363.           } else {
  364.             inactivate(event);
  365.           }
  366.           this.blur();
  367.           return false;
  368.         });
  369.   // activate by focus; inactivate by blur    
  370.       } else if (opts.activation == 'focus') {
  371.         $this.focus(function(event) {
  372.           activate(event);
  373.         });
  374.         $this.blur(function(event) {
  375.           inactivate(event);
  376.         });
  377.   // activate by hover
  378.     // clicking is returned false if cluetip url is same as href url
  379.       } else {
  380.         $this.click(function() {
  381.           if ($this.attr('href') && $this.attr('href') == tipAttribute && !opts.clickThrough) {
  382.             return false;
  383.           }
  384.         });
  385.         //set up mouse tracking
  386.         var mouseTracks = function(evt) {
  387.           if (opts.tracking == true) {
  388.             var trackX = posX - evt.pageX;
  389.             var trackY = tipY ? tipY - evt.pageY : posY - evt.pageY;
  390.             $this.mousemove(function(evt) {
  391.               $cluetip.css({left: evt.pageX + trackX, top: evt.pageY + trackY });
  392.             });
  393.           }
  394.         };
  395.         if ($.fn.hoverIntent && opts.hoverIntent) {
  396.           $this.mouseover(function() {$this.attr('title',''); })
  397.           .hoverIntent({
  398.             sensitivity: opts.hoverIntent.sensitivity,
  399.             interval: opts.hoverIntent.interval,  
  400.             over: function(event) {
  401.               activate(event);
  402.               mouseTracks(event);
  403.             }, 
  404.             timeout: opts.hoverIntent.timeout,  
  405.             out: function(event) {inactivate(event); $this.unbind('mousemove');}
  406.           });           
  407.         } else {
  408.           $this.hover(function(event) {
  409.             activate(event);
  410.             mouseTracks(event);
  411.           }, function(event) {
  412.             inactivate(event);
  413.             $this.unbind('mousemove');
  414.           });
  415.         }
  416.       }
  417.     });
  418.   };
  419.   
  420. /*
  421.  * options for clueTip
  422.  *
  423.  * each one can be explicitly overridden by changing its value. 
  424.  * for example: $.fn.cluetip.defaults.width = 200; 
  425.  * would change the default width for all clueTips to 200. 
  426.  *
  427.  * each one can also be overridden by passing an options map to the cluetip method.
  428.  * for example: $('a.example').cluetip({width: 200}); 
  429.  * would change the default width to 200 for clueTips invoked by a link with class of "example"
  430.  *
  431.  */
  432.   
  433.   $.fn.cluetip.defaults = {  // set up default options
  434.     width:            275,      // The width of the clueTip
  435.     height:           'auto',   // The height of the clueTip
  436.     cluezIndex:       97,       // Sets the z-index style property of the clueTip
  437.     positionBy:       'auto',   // Sets the type of positioning: 'auto', 'mouse','bottomTop', 'fixed'
  438.     topOffset:        15,       // Number of px to offset clueTip from top of invoking element
  439.     leftOffset:       15,       // Number of px to offset clueTip from left of invoking element
  440.     local:            false,    // Whether to use content from the same page for the clueTip's body
  441.     hideLocal:        true,     // If local option is set to true, this determines whether local content
  442.                                 // to be shown in clueTip should be hidden at its original location
  443.     attribute:        'rel',    // the attribute to be used for fetching the clueTip's body content
  444.     titleAttribute:   'title',  // the attribute to be used for fetching the clueTip's title
  445.     splitTitle:       '',       // A character used to split the title attribute into the clueTip title and divs
  446.                                 // within the clueTip body. more info below [6]
  447.     showTitle:        true,     // show title bar of the clueTip, even if title attribute not set
  448.     cluetipClass:     'default',// class added to outermost clueTip div in the form of 'cluetip-' + clueTipClass.
  449.     hoverClass:       '',       // class applied to the invoking element onmouseover and removed onmouseout
  450.     waitImage:        true,     // whether to show a "loading" img, which is set in jquery.cluetip.css
  451.     cursor:           'help',
  452.     arrows:           false,    // if true, displays arrow on appropriate side of clueTip
  453.     dropShadow:       true,     // set to false if you don't want the drop-shadow effect on the clueTip
  454.     dropShadowSteps:  6,        // adjusts the size of the drop shadow
  455.     sticky:           false,    // keep visible until manually closed
  456.     mouseOutClose:    false,    // close when clueTip is moused out
  457.     activation:       'hover',  // set to 'click' to force user to click to show clueTip
  458.                                 // set to 'focus' to show on focus of a form element and hide on blur
  459.     clickThrough:     false,    // if true, and activation is not 'click', then clicking on link will take user to the link's href,
  460.                                 // even if href and tipAttribute are equal
  461.     tracking:         false,    // if true, clueTip will track mouse movement (experimental)
  462.     delayedClose:     0,        // close clueTip on a timed delay (experimental)
  463.     closePosition:    'top',    // location of close text for sticky cluetips; can be 'top' or 'bottom' or 'title'
  464.     closeText:        'Close',  // text (or HTML) to to be clicked to close sticky clueTips
  465.     truncate:         0,        // number of characters to truncate clueTip's contents. if 0, no truncation occurs
  466.     // effect and speed for opening clueTips
  467.     fx: {             
  468.                       open:       'show', // can be 'show' or 'slideDown' or 'fadeIn'
  469.                       openSpeed:  ''
  470.     },     
  471.     // settings for when hoverIntent plugin is used             
  472.     hoverIntent: {    
  473.                       sensitivity:  3,
  474.                  interval:     50,
  475.                  timeout:      0
  476.     },
  477.     // function to run just before clueTip is shown.           
  478.     onActivate:       function(e) {return true;},
  479.     // function to run just after clueTip is shown.
  480.     onShow:           function(ct, c){},
  481.     
  482.     // whether to cache results of ajax request to avoid unnecessary hits to server    
  483.     ajaxCache:        true,  
  484.     // process data retrieved via xhr before it's displayed
  485.     ajaxProcess:      function(data) {
  486.                         data = data.replace(/<s(cript|tyle)(.|s)*?/s(cript|tyle)>/g, '').replace(/<(link|title)(.|s)*?/(link|title)>/g,'');
  487.                         return data;
  488.     },                
  489.     // can pass in standard $.ajax() parameters, not including error, complete, success, and url
  490.     ajaxSettings: {   
  491.                       dataType: 'html'
  492.     }
  493.   };
  494. /*
  495.  * Global defaults for clueTips. Apply to all calls to the clueTip plugin.
  496.  *
  497.  * @example $.cluetip.setup({
  498.  *   insertionType: 'prependTo',
  499.  *   insertionElement: '#container'
  500.  * });
  501.  * 
  502.  * @property
  503.  * @name $.cluetip.setup
  504.  * @type Map
  505.  * @cat Plugins/tooltip
  506.  * @option String insertionType: Default is 'appendTo'. Determines the method to be used for inserting the clueTip into the DOM. Permitted values are 'appendTo', 'prependTo', 'insertBefore', and 'insertAfter'
  507.  * @option String insertionElement: Default is 'body'. Determines which element in the DOM the plugin will reference when inserting the clueTip.
  508.  *
  509.  */
  510.    
  511.   var insertionType = 'appendTo', insertionElement = 'body';
  512.   $.cluetip = {};
  513.   $.cluetip.setup = function(options) {
  514.     if (options && options.insertionType && (options.insertionType).match(/appendTo|prependTo|insertBefore|insertAfter/)) {
  515.       insertionType = options.insertionType;
  516.     }
  517.     if (options && options.insertionElement) {
  518.       insertionElement = options.insertionElement;
  519.     }
  520.   };
  521.   
  522. })(jQuery);