fade_delay = 250;
fade_speed = 200;

function clearQueue(element)
{
    var cleared = false;
    var queueLength = element.queue().length;

    if(queueLength == 2) {
	element.clearQueue();
	cleared = true;
    }

    return cleared;
}

$(function() {
    $('.dropdown').each(function() {
        var dropdown = $(this);

        dropdown.hide();

        var nav_link = $($('a', dropdown[0].parentNode)[0]);
        nav_link.mouseover(function() {
	    if(!clearQueue(dropdown)) {
		setTimeout(function() {
		    dropdown.fadeTo(1, 0.93); }, fade_delay);
	    } else {
		dropdown.delay(fade_delay).fadeTo(fade_speed, 0.93);
	    }
        });

        nav_link.mouseout(function() {
            dropdown.clearQueue();
            dropdown.delay(fade_delay).fadeOut(fade_speed);
        });

        dropdown.mouseover(function() {
            $(this).clearQueue();
            $(this).fadeTo(1, 0.93);
        });

        dropdown.mouseout(function() {
            // there's a bug here, for some reason the dropdown
            // appears to sometimes fade out immediately rather than
            // delaying.
	    var dropdown = $(this);

	    if(clearQueue(dropdown)) {
		setTimeout(function() {
		    dropdown.fadeTo(fade_delay, 0.0); }, fade_delay * 2);
	    } else {
		dropdown.clearQueue();
		dropdown.delay(fade_delay).fadeOut(fade_speed);
	    }
        });
    });
});