Here's my solution (not the simplest, but answers questions 1 and 3).
If you know a simpler solution, feel free to share :)
$(document).click(function (event) {
var overid = ('#' + event.target.id + 'overlay');
var jt = ('#' + $('.overlay.open').attr('id'));
if (($(event.target).parent('.nav li').length === 1) && ($(event.target).closest('#regular-link').length === 0)) {
if ($(overid).hasClass('open')) {
$(overid).removeClass('open');
$(overid).delay(500).fadeOut();
$("body").css('overflow', 'visible');
$(".overlay").css('top', $(window).scrollTop());
event.preventDefault();
} else {
if ($(overid).not('open') && (jt === '#undefined')) {
$(overid).delay(500).fadeIn();
$(overid).addClass('open');
$("body").css('overflow', 'hidden');
$(".overlay").css('top', $(window).scrollTop());
event.preventDefault();
} else {
$(jt).removeClass('open');
$(jt).fadeOut();
$("body").css('overflow', 'visible');
$(overid).delay(500).fadeIn();
$(overid).addClass('open');
$("body").css('overflow', 'hidden');
$(".overlay").css('top', $(window).scrollTop());
event.preventDefault();
}
}
} else {
if (($(event.target).closest('.nav, .no-close').length === 0) && $(jt).hasClass('open')) {
$(jt).removeClass('open');
$(jt).fadeOut();
$("body").css('overflow', 'visible');
$('.overlay').css('top', '0');
}
}
});
I also created a JSFiddle here as well.
This script takes care of the overflow (scrollbar) of the page, and regular links in the nav menu too.