191 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*!
 | |
|  * 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 = $('<div id="tiptip_holder" style="max-width:'+ opts.maxWidth +';"></div>');
 | |
| 			var tiptip_content = $('<div id="tiptip_content"></div>');
 | |
| 			var tiptip_arrow = $('<div id="tiptip_arrow"></div>');
 | |
| 			$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')));
 | |
| 		} 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 && 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); |