﻿(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);
    $(function() {
        $("ul.nav li").hoverIntent(function() {
            openDropDown(this);
        }, function() {
            closeDropDown(this);
        });
        $("ul.nav li ul li:has(ul)").find("a:first").addClass("hasChildren");
    });
    var closetimer;
    setCloseTimer = function(obj) {
        closetimer = window.setTimeout(function() {
            closeDropDown(obj)
        }, 750);
    }
    cancelCloseTimer = function(obj) {
        window.clearTimeout(closetimer);
    }
    openDropDown = function(obj) {
        $(obj).addClass('hover').css('z-index', 1000);
        $('ul:first', obj).animate({
            opacity: 'toggle'
        });
    }
    closeDropDown = function(obj) {
        $(obj).removeClass('hover');
        $('ul:first', obj).animate({
            opacity: 'toggle'
        });
    }
