3 * Copyright 2010 Drew Wilson
5 * code.drewwilson.com/entry/tiptip-jquery-plugin
7 * Version 1.3 - Updated: Mar. 23, 2010
9 * This Plug-In will create a custom tooltip to replace the default
10 * browser tooltip. It is extremely lightweight and very smart in
11 * that it detects the edges of the browser window and will make sure
12 * the tooltip stays within the current window size. As a result the
13 * tooltip will adjust itself to be displayed above, below, to the left
14 * or to the right depending on what is necessary to stay within the
15 * browser window. It is completely customizable as well via CSS.
17 * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
18 * http://www.opensource.org/licenses/mit-license.php
19 * http://www.gnu.org/licenses/gpl.html
23 $.fn.tipTip = function(options) {
29 defaultPosition: "bottom",
34 content: false, // HTML or String to fill TipTIp with
38 var opts = $.extend(defaults, options);
40 // Setup tip tip elements and render them to the DOM
41 if($("#tiptip_holder").length <= 0){
42 var tiptip_holder = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>');
43 var tiptip_content = $('<div id="tiptip_content"></div>');
44 var tiptip_arrow = $('<div id="tiptip_arrow"></div>');
45 $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')));
47 var tiptip_holder = $("#tiptip_holder");
48 var tiptip_content = $("#tiptip_content");
49 var tiptip_arrow = $("#tiptip_arrow");
52 return this.each(function(){
53 var org_elem = $(this);
55 var org_title = opts.content;
57 var org_title = org_elem.attr(opts.attribute);
61 org_elem.removeAttr(opts.attribute); //remove original Attribute
65 if(opts.activation == "hover"){
66 org_elem.hover(function(){
74 tiptip_holder.hover(function(){}, function(){
79 org_elem.click(function(){
83 } else if(opts.activation == "focus"){
84 org_elem.focus(function(){
89 } else if(opts.activation == "click"){
90 org_elem.click(function(){
93 }).hover(function(){},function(){
99 tiptip_holder.hover(function(){}, function(){
105 function active_tiptip(){
106 opts.enter.call(this);
107 tiptip_content.html(org_title);
108 tiptip_holder.hide().removeAttr("class").css("margin","0");
109 tiptip_arrow.removeAttr("style");
111 var top = parseInt(org_elem.offset()['top']);
112 var left = parseInt(org_elem.offset()['left']);
113 var org_width = parseInt(org_elem.outerWidth());
114 var org_height = parseInt(org_elem.outerHeight());
115 var tip_w = tiptip_holder.outerWidth();
116 var tip_h = tiptip_holder.outerHeight();
117 var w_compare = Math.round((org_width - tip_w) / 2);
118 var h_compare = Math.round((org_height - tip_h) / 2);
119 var marg_left = Math.round(left + w_compare);
120 var marg_top = Math.round(top + org_height + opts.edgeOffset);
123 var arrow_left = Math.round(tip_w - 12) / 2;
125 if(opts.defaultPosition == "bottom"){
127 } else if(opts.defaultPosition == "top"){
129 } else if(opts.defaultPosition == "left"){
131 } else if(opts.defaultPosition == "right"){
135 var right_compare = (w_compare + left) < parseInt($(window).scrollLeft());
136 var left_compare = (tip_w + left) > parseInt($(window).width());
138 if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){
142 marg_left = Math.round(left);
143 //marg_top = Math.round(top + h_compare);
144 } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){
147 arrow_left = Math.round(tip_w - 13);
148 marg_left = Math.round((left + (org_width/2)) - (tip_w) + 5);
151 var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop());
152 var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0;
154 if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare) || opts.defaultPosition == 'top'){
155 if(t_class == "_top" || t_class == "_bottom"){
158 t_class = t_class+"_top";
161 marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));
162 } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){
163 if(t_class == "_top" || t_class == "_bottom"){
166 t_class = t_class+"_bottom";
169 marg_top = Math.round(top + org_height + opts.edgeOffset);
172 if(t_class == "_right_top" || t_class == "_left_top"){
173 marg_top = marg_top + 5;
174 } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){
175 marg_top = marg_top - 5;
177 if(t_class == "_left_top" || t_class == "_left_bottom"){
178 //marg_left = marg_left + 5;
180 tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"});
181 tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class);
183 if (timeout){ clearTimeout(timeout); }
184 timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay);
187 function deactive_tiptip(){
188 opts.exit.call(this);
189 if (timeout){ clearTimeout(timeout); }
190 tiptip_holder.fadeOut(opts.fadeOut);