$.fn.safeHover = function(inFunction, outFunction, inDelay, outDelay, connection){

    var inReg = String(inFunction).replace(/\n/g, "").slice(13, -1);
    var outReg = String(outFunction).replace(/\n/g, "").slice(13, -1);
    var startOut;
    var hasRun = false;
    
    $(this).each(function(){
    
        var ref = $('*').index(this);
        
        $.changeState = function(){
            hasRun = true;
        }
        
        $(this).bind("mouseenter", function(){
            target = $(this);
            inReg = inReg.replace(/this/g, "target");
            inReg = inReg + '$.changeState();';
            
            if (connection == 'linked') {
                clearTimeout(startOut);
            }
            
            startIn = setTimeout(inReg, inDelay);
            

            
        });
		
		$(this).bind("mouseleave", function(){
	        outReg = outReg.replace(/this/g, "target");
	        clearTimeout(startIn);
	                
	        startOut = setTimeout(outReg, outDelay);
                
        });
        
    });
    
};

