﻿(function($){
$.fn.hoverIntent=function(handlerIn,handlerOut,selector){
var cfg={
interval: 100,
sensitivity: 7,
timeout: 0
};
if(typeof handlerIn==="object"){
cfg=$.extend(cfg, handlerIn);
}else if($.isFunction(handlerOut)){
cfg=$.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector });
}else{
cfg=$.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut });
}
var cX, cY, pX, pY;
var track=function(ev){
cX=ev.pageX;
cY=ev.pageY;
};
var compare=function(ev,ob){
ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);
if(( Math.abs(pX-cX) + Math.abs(pY-cY)) < cfg.sensitivity){
$(ob).off("mousemove.hoverIntent",track);
ob.hoverIntent_s=1;
return cfg.over.apply(ob,[ev]);
}else{
pX=cX; pY=cY;
ob.hoverIntent_t=setTimeout(function(){compare(ev, ob);} , cfg.interval);
}};
var delay=function(ev,ob){
ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);
ob.hoverIntent_s=0;
return cfg.out.apply(ob,[ev]);
};
var handleHover=function(e){
var ev=jQuery.extend({},e);
var ob=this;
if(ob.hoverIntent_t){ ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t); }
if(e.type=="mouseenter"){
pX=ev.pageX; pY=ev.pageY;
$(ob).on("mousemove.hoverIntent",track);
if(ob.hoverIntent_s!=1){ ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);} , cfg.interval);}}else{
$(ob).off("mousemove.hoverIntent",track);
if(ob.hoverIntent_s==1){ ob.hoverIntent_t=setTimeout(function(){delay(ev,ob);} , cfg.timeout);}}
};
return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);
};})(jQuery);