(function($){
$.fn.hoverIntent=function(f,g){
var cfg={
sensitivity: 7,
interval: 100,
timeout: 0}
cfg=$.extend(cfg,g ?{over: f,out: g}: f)
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).unbind("mousemove",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 p=(e.type=="mouseover" ? e.fromElement : e.toElement)|| e.relatedTarget
while(p&&p !=this){try{p=p.parentNode;}catch(e){p=this;}}
if(p==this){return false;}
var ev=jQuery.extend({},e)
var ob=this
if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);}
if(e.type=="mouseover"){
pX=ev.pageX;pY=ev.pageY
$(ob).bind("mousemove",track)
if(ob.hoverIntent_s !=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob);},cfg.interval);}
}else{
$(ob).unbind("mousemove",track)
if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob);},cfg.timeout);}}}
return this.mouseover(handleHover).mouseout(handleHover)}
})(jQuery)

