diff --git a/README.txt b/README.txt index 3036d3d..537e4d3 100644 --- a/README.txt +++ b/README.txt @@ -17,4 +17,47 @@ browser window. It is completely customizable as well via CSS. This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: http://www.opensource.org/licenses/mit-license.php -http://www.gnu.org/licenses/gpl.html \ No newline at end of file +http://www.gnu.org/licenses/gpl.html + +------------------------------------------------------------------- + +This is modified version of TipTip + +What's New: + +* All callback functions when called, "this" refers to the element that is applied the TipTip and also receive an argument which is an object with the some useful values. + + { holder: tiptip_holder, content: tiptip_content, arrow: tiptip_arrow, options: opts } + +* The option "content" can also be a callback function that must return a string or HTML. This callback function will be called every time the tooltip is shown. Very useful for ajax generated tooltips. For example: + + $j('#my-element').tipTip({ + + maxWidth: 600, + defaultPosition: 'right', + content: function (e) { + $.ajax({ url: 'myJsonWebService.php', success: function (response) { + e.content.html(response); // the var e is the callback function data (see above) + }); + return 'Please wait...'; // We temporary show a Please wait text until the ajax success callback is called. + } + + }); + +* If "enter" and "exit" callback function return false, then the tooltip won't be shown or hidden respectively. + +* Added option "afterEnter" which is a callback function that is called after a tooltip is shown. + +* Added option "afterExit" which is a callback function that is called after a tooltip is hidden. + +* Fixed option "maxWidth" so that it is applied each time a tooltip is shown. It seems that using the cssClass option (see below) is a better way to do this. + +* Added option "cssClass" which is applied to the tiptip holder before shown. You can apply more than one css classes by seperating them with a space character (see also jQuery.addClass). + +* Added methods to "show", "hide" or "destroy" a TipTip. For example: + + $('#my-element').tipTip({ content: 'Hello world!' }); // We apply a tooltip with the text Hello world! on #my-element $('#my-element').tipTip('show'); // This will programmatically show the applied TipTip without the need to hover over the element. $('#my-element').tipTip('hide'); // we hide it $('#my-element').tipTip('destroy'); // and then we destroy it which means the element #my-element no won't have a TipTip applied. + +* The option "activation" can have the value "manual". In this case no events will be applied to the element and the developer will be responsible to show or not the tooltip. But you can always use the show and hide methods to show or hide the tooltip ;-) + +* Created an alternate look & feel for TipTip, you can use it by setting the option "cssClass" to "alternative". \ No newline at end of file diff --git a/jquery.tipTip.js b/jquery.tipTip.js index 7eacf35..fb75bab 100644 --- a/jquery.tipTip.js +++ b/jquery.tipTip.js @@ -1,191 +1,313 @@ - /* - * TipTip - * Copyright 2010 Drew Wilson - * www.drewwilson.com - * code.drewwilson.com/entry/tiptip-jquery-plugin - * - * Version 1.3 - Updated: Mar. 23, 2010 - * - * This Plug-In will create a custom tooltip to replace the default - * browser tooltip. It is extremely lightweight and very smart in - * that it detects the edges of the browser window and will make sure - * the tooltip stays within the current window size. As a result the - * tooltip will adjust itself to be displayed above, below, to the left - * or to the right depending on what is necessary to stay within the - * browser window. It is completely customizable as well via CSS. - * - * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -(function($){ - $.fn.tipTip = function(options) { - var defaults = { - activation: "hover", - keepAlive: false, - maxWidth: "200px", - edgeOffset: 3, - defaultPosition: "bottom", - delay: 400, - fadeIn: 200, - fadeOut: 200, - attribute: "title", - content: false, // HTML or String to fill TipTIp with - enter: function(){}, - exit: function(){} - }; - var opts = $.extend(defaults, options); - - // Setup tip tip elements and render them to the DOM - if($("#tiptip_holder").length <= 0){ - var tiptip_holder = $('
'); - var tiptip_content = $('
'); - var tiptip_arrow = $('
'); - $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('
'))); - } else { - var tiptip_holder = $("#tiptip_holder"); - var tiptip_content = $("#tiptip_content"); - var tiptip_arrow = $("#tiptip_arrow"); - } - - return this.each(function(){ - var org_elem = $(this); - if(opts.content){ - var org_title = opts.content; - } else { - var org_title = org_elem.attr(opts.attribute); - } - if(org_title != ""){ - if(!opts.content){ - org_elem.removeAttr(opts.attribute); //remove original Attribute - } - var timeout = false; - - if(opts.activation == "hover"){ - org_elem.hover(function(){ - active_tiptip(); - }, function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } else if(opts.activation == "focus"){ - org_elem.focus(function(){ - active_tiptip(); - }).blur(function(){ - deactive_tiptip(); - }); - } else if(opts.activation == "click"){ - org_elem.click(function(){ - active_tiptip(); - return false; - }).hover(function(){},function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } - - function active_tiptip(){ - opts.enter.call(this); - tiptip_content.html(org_title); - tiptip_holder.hide().removeAttr("class").css("margin","0"); - tiptip_arrow.removeAttr("style"); - - var top = parseInt(org_elem.offset()['top']); - var left = parseInt(org_elem.offset()['left']); - var org_width = parseInt(org_elem.outerWidth()); - var org_height = parseInt(org_elem.outerHeight()); - var tip_w = tiptip_holder.outerWidth(); - var tip_h = tiptip_holder.outerHeight(); - var w_compare = Math.round((org_width - tip_w) / 2); - var h_compare = Math.round((org_height - tip_h) / 2); - var marg_left = Math.round(left + w_compare); - var marg_top = Math.round(top + org_height + opts.edgeOffset); - var t_class = ""; - var arrow_top = ""; - var arrow_left = Math.round(tip_w - 12) / 2; - - if(opts.defaultPosition == "bottom"){ - t_class = "_bottom"; - } else if(opts.defaultPosition == "top"){ - t_class = "_top"; - } else if(opts.defaultPosition == "left"){ - t_class = "_left"; - } else if(opts.defaultPosition == "right"){ - t_class = "_right"; - } - - var right_compare = (w_compare + left) < parseInt($(window).scrollLeft()); - var left_compare = (tip_w + left) > parseInt($(window).width()); - - if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){ - t_class = "_right"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = -12; - marg_left = Math.round(left + org_width + opts.edgeOffset); - marg_top = Math.round(top + h_compare); - } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){ - t_class = "_left"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = Math.round(tip_w); - marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); - marg_top = Math.round(top + h_compare); - } - - var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop()); - var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0; - - if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_top"; - } else { - t_class = t_class+"_top"; - } - arrow_top = tip_h; - marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); - } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_bottom"; - } else { - t_class = t_class+"_bottom"; - } - arrow_top = -12; - marg_top = Math.round(top + org_height + opts.edgeOffset); - } - - if(t_class == "_right_top" || t_class == "_left_top"){ - marg_top = marg_top + 5; - } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){ - marg_top = marg_top - 5; - } - if(t_class == "_left_top" || t_class == "_left_bottom"){ - marg_left = marg_left + 5; - } - tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"}); - tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); - - if (timeout){ clearTimeout(timeout); } - timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); - } - - function deactive_tiptip(){ - opts.exit.call(this); - if (timeout){ clearTimeout(timeout); } - tiptip_holder.fadeOut(opts.fadeOut); - } - } - }); - } -})(jQuery); \ No newline at end of file +/* +* TipTip +* Copyright 2010 Drew Wilson +* www.drewwilson.com +* code.drewwilson.com/entry/tiptip-jquery-plugin +* +* Version 1.3 - Updated: Mar. 23, 2010 +* +* This Plug-In will create a custom tooltip to replace the default +* browser tooltip. It is extremely lightweight and very smart in +* that it detects the edges of the browser window and will make sure +* the tooltip stays within the current window size. As a result the +* tooltip will adjust itself to be displayed above, below, to the left +* or to the right depending on what is necessary to stay within the +* browser window. It is completely customizable as well via CSS. +* +* This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: +* http://www.opensource.org/licenses/mit-license.php +* http://www.gnu.org/licenses/gpl.html +*/ + +(function ($) { + $.fn.tipTip = function (options) { + var defaults = { + activation: 'hover', // How to show (and hide) the tooltip. Can be: hover, focus, click and manual. + keepAlive: false, // When true the tooltip won't disapper when the mouse moves away from the element. Instead it will be hidden when it leaves the tooltip. + maxWidth: '200px', // The max-width to set on the tooltip. You may also use the option cssClass to set this. + edgeOffset: 0, // The offset between the tooltip arrow edge and the element that has the tooltip. + defaultPosition: 'bottom', // The position of the tooltip. Can be: top, right, bottom and left. + delay: 400, // The delay in msec to show a tooltip. + fadeIn: 200, // The length in msec of the fade in. + fadeOut: 200, // The length in msec of the fade out. + attribute: 'title', // The attribute to fetch the tooltip text if the option content is false. + content: false, // HTML or String or Function (that returns HTML or String) to fill TipTIp with + enter: function () { }, // Callback function before a tooltip is shown. + afterEnter: function () { }, // Callback function after a tooltip is shown. + exit: function () { }, // Callback function before a tooltip is hidden. + afterExit: function () { }, // Callback function after a tooltip is hidden. + cssClass: '', // CSS class that will be applied on the tooltip before showing only for this instance of tooltip. + detectTextDir: true // When false auto-detection for right-to-left text will be disable (When true affects a bit the performance). + }; + + // Setup tip tip elements and render them to the DOM + if ($('#tiptip_holder').length <= 0) { + var tiptip_inner_arrow = $('
', { id: 'tiptip_arrow_inner' }), + tiptip_arrow = $('
', { id: 'tiptip_arrow' }).append(tiptip_inner_arrow), + tiptip_content = $('
', { id: 'tiptip_content' }), + tiptip_holder = $('
', { id: 'tiptip_holder' }).append(tiptip_arrow).append(tiptip_content); + $('body').append(tiptip_holder); + } else { + var tiptip_holder = $('#tiptip_holder'), + tiptip_content = $('#tiptip_content'), + tiptip_arrow = $('#tiptip_arrow'); + } + + return this.each(function () { + var org_elem = $(this), + data = org_elem.data('tipTip'), + opts = data && data.options || $.extend({}, defaults, options), + callback_data = { holder: tiptip_holder, content: tiptip_content, arrow: tiptip_arrow, options: opts }; + + if (data) { + switch (options) { + case 'show': + active_tiptip(); + break; + case 'hide': + deactive_tiptip(); + break; + case 'destroy': + org_elem.unbind('.tipTip').removeData('tipTip'); + break; + case 'position': + position_tiptip(); + } + } else { + var timeout = false; + + org_elem.data('tipTip', { options: opts }); + + if (opts.activation == 'hover') { + org_elem.bind('mouseenter.tipTip', function () { + active_tiptip(); + }).bind('mouseleave.tipTip', function () { + if (!opts.keepAlive) { + deactive_tiptip(); + } else { + tiptip_holder.one('mouseleave.tipTip', function () { + deactive_tiptip(); + }); + } + }); + } else if (opts.activation == 'focus') { + org_elem.bind('focus.tipTip', function () { + active_tiptip(); + }).bind('blur.tipTip', function () { + deactive_tiptip(); + }); + } else if (opts.activation == 'click') { + org_elem.bind('click.tipTip', function (e) { + e.preventDefault(); + active_tiptip(); + return false; + }).bind('mouseleave.tipTip', function () { + if (!opts.keepAlive) { + deactive_tiptip(); + } else { + tiptip_holder.one('mouseleave.tipTip', function () { + deactive_tiptip(); + }); + } + }); + } else if (opts.activation == 'manual') { + // Nothing to register actually. We decide when to show or hide. + } + } + + function active_tiptip() { + if (opts.enter.call(org_elem, callback_data) === false) { + return; + } + + // Get the text and append it in the tiptip_content. + var org_title; + if (opts.content) { + org_title = $.isFunction(opts.content) ? opts.content.call(org_elem, callback_data) : opts.content; + } else { + org_title = opts.content = org_elem.attr(opts.attribute); + org_elem.removeAttr(opts.attribute); //remove original Attribute + } + if (!org_title) { + return; // don't show tip when no content. + } + + tiptip_content.html(org_title); + tiptip_holder.hide().removeAttr('class').css({ 'max-width': opts.maxWidth }); + if (opts.cssClass) { + tiptip_holder.addClass(opts.cssClass); + } + + // Calculate the position of the tooltip. + position_tiptip(); + + // Show the tooltip. + if (timeout) { + clearTimeout(timeout); + } + + timeout = setTimeout(function () { + tiptip_holder.stop(true, true).fadeIn(opts.fadeIn); + }, opts.delay); + + $(window).bind('resize.tipTip scroll.tipTip', position_tiptip); + + org_elem.addClass('tiptip_visible'); // Add marker class to easily find the target element with visible tooltip. It will be remove later on deactive_tiptip(). + + opts.afterEnter.call(org_elem, callback_data); + } + + function deactive_tiptip() { + if (opts.exit.call(org_elem, callback_data) === false) { + return; + } + + if (timeout) { + clearTimeout(timeout); + } + + tiptip_holder.fadeOut(opts.fadeOut); + + $(window).unbind('resize.tipTip scroll.tipTip'); + + org_elem.removeClass('tiptip_visible'); + + opts.afterExit.call(org_elem, callback_data); + } + + function position_tiptip() { + var org_offset = org_elem.offset(), + org_top = org_offset.top, + org_left = org_offset.left, + org_width = org_elem.outerWidth(), + org_height = org_elem.outerHeight(), + tip_top, + tip_left, + tip_width = tiptip_holder.outerWidth(), + tip_height = tiptip_holder.outerHeight(), + tip_class, + tip_classes = { top: 'tip_top', bottom: 'tip_bottom', left: 'tip_left', right: 'tip_right' }, + arrow_top, + arrow_left, + arrow_width = 12, // tiptip_arrow.outerHeight() and tiptip_arrow.outerWidth() don't work because they need the element to be visible. + arrow_height = 12, + win = $(window), + win_top = win.scrollTop(), + win_left = win.scrollLeft(), + win_width = win.width(), + win_height = win.height(), + is_rtl = opts.detectTextDir && isRtlText(tiptip_content.text()); + + function moveTop() { + tip_class = tip_classes.top; + tip_top = org_top - tip_height - opts.edgeOffset - (arrow_height / 2); + tip_left = org_left + ((org_width - tip_width) / 2); + } + + function moveBottom() { + tip_class = tip_classes.bottom; + tip_top = org_top + org_height + opts.edgeOffset + (arrow_height / 2); + tip_left = org_left + ((org_width - tip_width) / 2); + } + + function moveLeft() { + tip_class = tip_classes.left; + tip_top = org_top + ((org_height - tip_height) / 2); + tip_left = org_left - tip_width - opts.edgeOffset - (arrow_width / 2); + } + + function moveRight() { + tip_class = tip_classes.right; + tip_top = org_top + ((org_height - tip_height) / 2); + tip_left = org_left + org_width + opts.edgeOffset + (arrow_width / 2); + } + + // Calculate the position of the tooltip. + if (opts.defaultPosition == 'bottom') { + moveBottom(); + } else if (opts.defaultPosition == 'top') { + moveTop(); + } else if (opts.defaultPosition == 'left' && !is_rtl) { + moveLeft(); + } else if (opts.defaultPosition == 'left' && is_rtl) { + moveRight(); + } else if (opts.defaultPosition == 'right' && !is_rtl) { + moveRight(); + } else if (opts.defaultPosition == 'right' && is_rtl) { + moveLeft(); + } else { + moveBottom(); + } + + // Flip the tooltip if off the window's viewport. (left <-> right and top <-> bottom). + if (tip_class == tip_classes.left && !is_rtl && tip_left < win_left) { + moveRight(); + } else if (tip_class == tip_classes.left && is_rtl && tip_left - tip_width < win_left) { + moveRight(); + } else if (tip_class == tip_classes.right && !is_rtl && tip_left > win_left + win_width) { + moveLeft(); + } else if (tip_class == tip_classes.right && is_rtl && tip_left + tip_width > win_left + win_width) { + moveLeft(); + } else if (tip_class == tip_classes.top && tip_top < win_top) { + moveBottom(); + } else if (tip_class == tip_classes.bottom && tip_top > win_top + win_height) { + moveTop(); + } + + // Fix the vertical position if the tooltip is off the top or bottom sides of the window's viewport. + if (tip_class == tip_classes.left || tip_class == tip_classes.right) { // If positioned left or right check if the tooltip is off the top or bottom window's viewport. + if (tip_top + tip_height > win_height + win_top) { // If the bottom edge of the tooltip is off the bottom side of the window's viewport. + tip_top = org_top + org_height > win_height + win_top ? org_top + org_height - tip_height : win_height + win_top - tip_height; // Make 'bottom edge of the tooltip' == 'bottom side of the window's viewport'. + } else if (tip_top < win_top) { // If the top edge of the tooltip if off the top side of the window's viewport. + tip_top = org_top < win_top ? org_top : win_top; // Make 'top edge of the tooltip' == 'top side of the window's viewport'. + } + } + + // Fix the horizontal position if the tooltip is off the right or left sides of the window's viewport. + if (tip_class == tip_classes.top || tip_class == tip_classes.bottom) { + if (tip_left + tip_width > win_width + win_left) { // If the right edge of the tooltip is off the right side of the window's viewport. + tip_left = org_left + org_width > win_width + win_left ? org_left + org_width - tip_width : win_width + win_left - tip_width; // Make 'right edge of the tooltip' == 'right side of the window's viewport'. + } else if (tip_left < win_left) { // If the left edge of the tooltip if off the left side of the window's viewport. + tip_left = org_left < win_left ? org_left : win_left; // Make 'left edge of the tooltip' == 'left side of the window's viewport'. + } + } + + // Apply the new position. + tiptip_holder + .css({ left: Math.round(tip_left), top: Math.round(tip_top) }) + .removeClass(tip_classes.top) + .removeClass(tip_classes.bottom) + .removeClass(tip_classes.left) + .removeClass(tip_classes.right) + .addClass(tip_class); + + // Position the arrow + if (tip_class == tip_classes.top) { + arrow_top = tip_height; // Position the arrow vertically on the top of the tooltip. + arrow_left = org_left - tip_left + ((org_width - arrow_width) / 2); // Center the arrow horizontally on the center of the target element. + } else if (tip_class == tip_classes.bottom) { + arrow_top = -arrow_height; // Position the arrow vertically on the bottom of the tooltip. + arrow_left = org_left - tip_left + ((org_width - arrow_width) / 2); // Center the arrow horizontally on the center of the target element. + } else if (tip_class == tip_classes.left) { + arrow_top = org_top - tip_top + ((org_height - arrow_height) / 2); // Center the arrow vertically on the center of the target element. + arrow_left = tip_width; // Position the arrow vertically on the left of the tooltip. + } else if (tip_class == tip_classes.right) { + arrow_top = org_top - tip_top + ((org_height - arrow_height) / 2); // Center the arrow vertically on the center of the target element. + arrow_left = -arrow_width; // Position the arrow vertically on the right of the tooltip. + } + + tiptip_arrow + .css({ left: Math.round(arrow_left), top: Math.round(arrow_top) }); + } + }); + } + + var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF', + rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC', + rtlDirCheckRe = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']'); + + function isRtlText(text) { + return rtlDirCheckRe.test(text); + }; + +})(jQuery); \ No newline at end of file diff --git a/jquery.tipTip.minified.js b/jquery.tipTip.minified.js index cdf3a89..e547525 100644 --- a/jquery.tipTip.minified.js +++ b/jquery.tipTip.minified.js @@ -1,21 +1 @@ - /* - * TipTip - * Copyright 2010 Drew Wilson - * www.drewwilson.com - * code.drewwilson.com/entry/tiptip-jquery-plugin - * - * Version 1.3 - Updated: Mar. 23, 2010 - * - * This Plug-In will create a custom tooltip to replace the default - * browser tooltip. It is extremely lightweight and very smart in - * that it detects the edges of the browser window and will make sure - * the tooltip stays within the current window size. As a result the - * tooltip will adjust itself to be displayed above, below, to the left - * or to the right depending on what is necessary to stay within the - * browser window. It is completely customizable as well via CSS. - * - * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ -(function($){$.fn.tipTip=function(options){var defaults={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:3,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},exit:function(){}};var opts=$.extend(defaults,options);if($("#tiptip_holder").length<=0){var tiptip_holder=$('
');var tiptip_content=$('
');var tiptip_arrow=$('
');$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('
')))}else{var tiptip_holder=$("#tiptip_holder");var tiptip_content=$("#tiptip_content");var tiptip_arrow=$("#tiptip_arrow")}return this.each(function(){var org_elem=$(this);if(opts.content){var org_title=opts.content}else{var org_title=org_elem.attr(opts.attribute)}if(org_title!=""){if(!opts.content){org_elem.removeAttr(opts.attribute)}var timeout=false;if(opts.activation=="hover"){org_elem.hover(function(){active_tiptip()},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}else if(opts.activation=="focus"){org_elem.focus(function(){active_tiptip()}).blur(function(){deactive_tiptip()})}else if(opts.activation=="click"){org_elem.click(function(){active_tiptip();return false}).hover(function(){},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}function active_tiptip(){opts.enter.call(this);tiptip_content.html(org_title);tiptip_holder.hide().removeAttr("class").css("margin","0");tiptip_arrow.removeAttr("style");var top=parseInt(org_elem.offset()['top']);var left=parseInt(org_elem.offset()['left']);var org_width=parseInt(org_elem.outerWidth());var org_height=parseInt(org_elem.outerHeight());var tip_w=tiptip_holder.outerWidth();var tip_h=tiptip_holder.outerHeight();var w_compare=Math.round((org_width-tip_w)/2);var h_compare=Math.round((org_height-tip_h)/2);var marg_left=Math.round(left+w_compare);var marg_top=Math.round(top+org_height+opts.edgeOffset);var t_class="";var arrow_top="";var arrow_left=Math.round(tip_w-12)/2;if(opts.defaultPosition=="bottom"){t_class="_bottom"}else if(opts.defaultPosition=="top"){t_class="_top"}else if(opts.defaultPosition=="left"){t_class="_left"}else if(opts.defaultPosition=="right"){t_class="_right"}var right_compare=(w_compare+left)parseInt($(window).width());if((right_compare&&w_compare<0)||(t_class=="_right"&&!left_compare)||(t_class=="_left"&&left<(tip_w+opts.edgeOffset+5))){t_class="_right";arrow_top=Math.round(tip_h-13)/2;arrow_left=-12;marg_left=Math.round(left+org_width+opts.edgeOffset);marg_top=Math.round(top+h_compare)}else if((left_compare&&w_compare<0)||(t_class=="_left"&&!right_compare)){t_class="_left";arrow_top=Math.round(tip_h-13)/2;arrow_left=Math.round(tip_w);marg_left=Math.round(left-(tip_w+opts.edgeOffset+5));marg_top=Math.round(top+h_compare)}var top_compare=(top+org_height+opts.edgeOffset+tip_h+8)>parseInt($(window).height()+$(window).scrollTop());var bottom_compare=((top+org_height)-(opts.edgeOffset+tip_h+8))<0;if(top_compare||(t_class=="_bottom"&&top_compare)||(t_class=="_top"&&!bottom_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_top"}else{t_class=t_class+"_top"}arrow_top=tip_h;marg_top=Math.round(top-(tip_h+5+opts.edgeOffset))}else if(bottom_compare|(t_class=="_top"&&bottom_compare)||(t_class=="_bottom"&&!top_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_bottom"}else{t_class=t_class+"_bottom"}arrow_top=-12;marg_top=Math.round(top+org_height+opts.edgeOffset)}if(t_class=="_right_top"||t_class=="_left_top"){marg_top=marg_top+5}else if(t_class=="_right_bottom"||t_class=="_left_bottom"){marg_top=marg_top-5}if(t_class=="_left_top"||t_class=="_left_bottom"){marg_left=marg_left+5}tiptip_arrow.css({"margin-left":arrow_left+"px","margin-top":arrow_top+"px"});tiptip_holder.css({"margin-left":marg_left+"px","margin-top":marg_top+"px"}).attr("class","tip"+t_class);if(timeout){clearTimeout(timeout)}timeout=setTimeout(function(){tiptip_holder.stop(true,true).fadeIn(opts.fadeIn)},opts.delay)}function deactive_tiptip(){opts.exit.call(this);if(timeout){clearTimeout(timeout)}tiptip_holder.fadeOut(opts.fadeOut)}}})}})(jQuery); \ No newline at end of file +(function(d){d.fn.tipTip=function(g){var k={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:0,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},afterEnter:function(){},exit:function(){},afterExit:function(){},cssClass:"",detectTextDir:true};if(d("#tiptip_holder").length<=0){var i=d("
",{id:"tiptip_arrow_inner"}),j=d("
",{id:"tiptip_arrow"}).append(i),h=d("
",{id:"tiptip_content"}),f=d("
",{id:"tiptip_holder"}).append(j).append(h);d("body").append(f)}else{var f=d("#tiptip_holder"),h=d("#tiptip_content"),j=d("#tiptip_arrow")}return this.each(function(){var q=d(this),p=q.data("tipTip"),n=p&&p.options||d.extend({},k,g),m={holder:f,content:h,arrow:j,options:n};if(p){switch(g){case"show":s();break;case"hide":r();break;case"destroy":q.unbind(".tipTip").removeData("tipTip");break;case"position":l()}}else{var o=false;q.data("tipTip",{options:n});if(n.activation=="hover"){q.bind("mouseenter.tipTip",function(){s()}).bind("mouseleave.tipTip",function(){if(!n.keepAlive){r()}else{f.one("mouseleave.tipTip",function(){r()})}})}else{if(n.activation=="focus"){q.bind("focus.tipTip",function(){s()}).bind("blur.tipTip",function(){r()})}else{if(n.activation=="click"){q.bind("click.tipTip",function(t){t.preventDefault();s();return false}).bind("mouseleave.tipTip",function(){if(!n.keepAlive){r()}else{f.one("mouseleave.tipTip",function(){r()})}})}else{if(n.activation=="manual"){}}}}}function s(){if(n.enter.call(q,m)===false){return}var t;if(n.content){t=d.isFunction(n.content)?n.content.call(q,m):n.content}else{t=n.content=q.attr(n.attribute);q.removeAttr(n.attribute)}if(!t){return}h.html(t);f.hide().removeAttr("class").css({"max-width":n.maxWidth});if(n.cssClass){f.addClass(n.cssClass)}l();if(o){clearTimeout(o)}o=setTimeout(function(){f.stop(true,true).fadeIn(n.fadeIn)},n.delay);d(window).bind("resize.tipTip scroll.tipTip",l);q.addClass("tiptip_visible");n.afterEnter.call(q,m)}function r(){if(n.exit.call(q,m)===false){return}if(o){clearTimeout(o)}f.fadeOut(n.fadeOut);d(window).unbind("resize.tipTip scroll.tipTip");q.removeClass("tiptip_visible");n.afterExit.call(q,m)}function l(){var N=q.offset(),u=N.top,G=N.left,Q=q.outerWidth(),v=q.outerHeight(),y,J,L=f.outerWidth(),D=f.outerHeight(),I,P={top:"tip_top",bottom:"tip_bottom",left:"tip_left",right:"tip_right"},F,K,x=12,R=12,B=d(window),C=B.scrollTop(),E=B.scrollLeft(),O=B.width(),H=B.height(),z=n.detectTextDir&&e(h.text());function M(){I=P.top;y=u-D-n.edgeOffset-(R/2);J=G+((Q-L)/2)}function w(){I=P.bottom;y=u+v+n.edgeOffset+(R/2);J=G+((Q-L)/2)}function t(){I=P.left;y=u+((v-D)/2);J=G-L-n.edgeOffset-(x/2)}function A(){I=P.right;y=u+((v-D)/2);J=G+Q+n.edgeOffset+(x/2)}if(n.defaultPosition=="bottom"){w()}else{if(n.defaultPosition=="top"){M()}else{if(n.defaultPosition=="left"&&!z){t()}else{if(n.defaultPosition=="left"&&z){A()}else{if(n.defaultPosition=="right"&&!z){A()}else{if(n.defaultPosition=="right"&&z){t()}else{w()}}}}}}if(I==P.left&&!z&&JE+O){t()}else{if(I==P.right&&z&&J+L>E+O){t()}else{if(I==P.top&&yC+H){M()}}}}}}if(I==P.left||I==P.right){if(y+D>H+C){y=u+v>H+C?u+v-D:H+C-D}else{if(yO+E){J=G+Q>O+E?G+Q-L:O+E-L}else{if(J