Почему мгновенно срабатывает fadeOut?
Ну вам нужно дождаться завершения анимации а потом уже прятать/показывать, а так у вас все сразу отрабатывает:$('header').fadeOut(400, function() {
  //fadeOut complete
   $(this).show(0, function() {
..... и так далее
})
})
Эм... ну так вы же вызываете show сразу после fadeOut, не дожидаясь пока закончится оный... да и зачем вам тогда fadeOut если вы можете сделать это прямо в show установив там задержку. Либо тогда уберите вызов show и перенесите ваше замыкание в fadeOut