Вместо
$('a.marker').hover(function(e) {
использование
$('a.marker').mouseenter(function(e) {
hover
обрабатывает события, связанные как с указанием мыши, так и с отпусканием мыши. Если вы не передадите обработчик для mouseleave, он выполнит функцию для mouseenter, поэтому в вашем случае
$(this).next('.map-popup').toggleClass('open');
будет выполнен снова для mouseleave
, поэтому всплывающее окно будет скрыто. Подробнее здесь .