fairplaysk/datacamp

View on GitHub
app/assets/javascripts/jquery.tooltip.js

Summary

Maintainability
C
1 day
Test Coverage
(function($){

    $.fn.tooltip = function(instanceSettings){
        
        $.fn.tooltip.defaultsSettings = {
            attributeName:'title',
            borderColor:'#ccc',
            borderSize:'1',
            cancelClick:0,
            followMouse:1,
            height:'auto',
            hoverIntent:{sensitivity:7,interval:100,timeout:0},
            loader:0,
            loaderHeight:0,
            loaderImagePath:'',
            loaderWidth:0,
            positionTop: 12,
            positionLeft: 12,
            width:'auto',
            titleAttributeContent:'',
            tooltipBGColor:'#fff',
            tooltipBGImage:'none', // http path
            tooltipHTTPType:'get',
            tooltipPadding:10,
            tooltipSource:'attribute', //inline, ajax, iframe, attribute
            tooltipSourceID:'',
            tooltipSourceURL:'',
            tooltipID:'tooltip'
        };
        
        //s = settings
        var s = $.extend({}, $.fn.tooltip.defaultsSettings , instanceSettings || {});
        
        var positionTooltip = function(e){
            
            var posx = 0;
            var posy = 0;
            if (!e) var e = window.event;
            if (e.pageX || e.pageY)     {
                posx = e.pageX;
                posy = e.pageY;
            }
            else if (e.clientX || e.clientY)     {
                posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
                posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
            }
            
            var p = {
                x: posx + s.positionLeft, 
                y: posy + s.positionTop,
                w: $('#'+s.tooltipID).width(), 
                h: $('#'+s.tooltipID).height()
            }
            
            var v = {
                x: $(window).scrollLeft(),
                y: $(window).scrollTop(),
                w: $(window).width() - 20,
                h: $(window).height() - 20
            };
                
            //don't go off screen
            if(p.y + p.h > v.y + v.h && p.x + p.w > v.x + v.w){
                p.x = (p.x - p.w) - 45;
                p.y = (p.y - p.h) - 45;
            }else if(p.x + p.w > v.x + v.w){
                p.x = p.x - (((p.x+p.w)-(v.x+v.w)) + 20);
            }else if(p.y + p.h > v.y + v.h){
                p.y = p.y - (((p.y+p.h)-(v.y+v.h)) + 20);
            }
            
            $('#'+s.tooltipID).css({'left':p.x + 'px','top':p.y + 'px'});
        }
        
        var showTooltip = function(){
            $('#tooltipLoader').remove();
            $('#'+s.tooltipID+' #tooltipContent').show();
            
            if($.browser.version == '6.0'){//IE6 only
                $('#'+s.tooltipID).append('<iframe id="tooltipIE6FixIframe" style="width:'+($('#'+s.tooltipID).width()+parseFloat(s.borderSize)+parseFloat(s.borderSize)+20)+'px;height:'+($('#'+s.tooltipID).height()+parseFloat(s.borderSize)+parseFloat(s.borderSize)+20)+'px;position:absolute;top:-'+s.borderSize+'px;left:-'+s.borderSize+'px;filter:alpha(opacity=0);"src="blank.html"></iframe>');
            };
        }
        
        var hideTooltip = function(valueOfThis){
            $('#'+s.tooltipID).fadeOut('fast').trigger("unload").remove();
            if($(valueOfThis).filter('[title]')){
                $(valueOfThis).attr('title',s.titleAttributeContent);
            }
        }
        
        var urlQueryToObject = function(s){
              var query = {};
              s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) {
                if (typeof query[a] != 'undefined') {
                  query[a] += ',' + d;
                } else {
                  query[a] = d;
                }
              });
              return query;
        };
        
        return this.each(function(index){
            
            if(s.cancelClick){
                $(this).bind("click", function(){return false});
            }
            
            if($.fn.hoverIntent){
                $(this).hoverIntent({
                    sensitivity:s.hoverIntent.sensitivity,
                    interval:s.hoverIntent.interval,
                    over:on,
                    timeout:s.hoverIntent.timeout,
                    out:off
                });
            }else{
                $(this).hover(on,off);
            }
                      
            function on(e){    
        
                $('body').append('<div id="'+s.tooltipID+'" style="background-repeat:no-repeat;background-image:url('+s.tooltipBGImage+');padding:'+s.tooltipPadding+'px;display:none;height:'+s.height+';width:'+s.width+';background-color:'+s.tooltipBGColor+';border:'+s.borderSize+'px solid '+s.borderColor+'; position:absolute;z-index:100000000000;"><div id="tooltipContent" style="display:none;"></div></div>');
                
                var $tt = $('#'+s.tooltipID);
                var $ttContent = $('#'+s.tooltipID+' #tooltipContent');
                
                if(s.loader && s.loaderImagePath != ''){
                    $tt.append('<div id="tooltipLoader" style="width:'+s.loaderWidth+'px;height:'+s.loaderHeight+'px;"><img src="'+s.loaderImagePath+'" /></div>');    
                }
                
                if($(this).attr('title')){
                    s.titleAttributeContent = $(this).attr('title');
                    $(this).attr('title','');
                }
                
                if($(this).is('input')){
                    $(this).focus(function(){ hideTooltip(this); });
                }
                
                e.preventDefault();//stop
                positionTooltip(e);
                
                $tt.show();
                
                //get values from element clicked, or assume its passed as an option
                s.tooltipSourceID = $(this).attr('href') || s.tooltipSourceID;
                s.tooltipSourceURL = $(this).attr('href') || s.tooltipSourceURL;
                
                switch(s.tooltipSource){
                    case 'attribute':/*/////////////////////////////// attribute //////////////////////////////////////////*/
                        $ttContent.text(s.titleAttributeContent);
                        showTooltip();
                    break;
                    case 'inline':/*/////////////////////////////// inline //////////////////////////////////////////*/
                        $ttContent.html($(s.tooltipSourceID).children());
                        $tt.unload(function(){// move elements back when you're finished
                            $(s.tooltipSourceID).html($ttContent.children());                
                        });
                        showTooltip();
                    break;
                    case 'ajax':/*/////////////////////////////// ajax //////////////////////////////////////////*/    
                        if(s.tooltipHTTPType == 'post'){
                            var urlOnly, urlQueryObject;
                            if(s.tooltipSourceURL.indexOf("?") !== -1){//has a query string
                                urlOnly = s.windowSourceURL.substr(0, s.windowSourceURL.indexOf("?"));
                                urlQueryObject = urlQueryToObject(s.tooltipSourceURL);
                            }else{
                                urlOnly = s.tooltipSourceURL;
                                urlQueryObject = {};
                            }
                            $ttContent.load(urlOnly,urlQueryObject,function(){
                                showTooltip();
                            });
                        }else{
                            if(s.tooltipSourceURL.indexOf("?") == -1){ //no query string, so add one
                                s.tooltipSourceURL += '?';
                            }
                            $ttContent.load(
                                s.tooltipSourceURL + '&random=' + (new Date().getTime()),function(){
                                showTooltip();
                            });
                        }
                    break;
                };
                
                return false;
                
            };
            
            
            function off(e){
                hideTooltip(this);
                return false;
            };
            
            if(s.followMouse){
                $(this).bind("mousemove", function(e){
                    positionTooltip(e);
                    return false;
                });
            }
            
        });
    };
    
})(jQuery);