@wkololo_4ever вне функций разницы не будет. Но не пользоваться областью видимости переменных, функциями, прототипированием и тд - плохой тон. Потом такой говнокод не разобрать :)
А в чем собственно сложность?
Первые три пункта делаются с использованием ajax (который будет стучаться к бекэнду), таймер легко реализуется с помощью js
@DjZooMhabrahabr.ru/post/151795 не плохая статейка, должна вам помочь.
Во время отдачи файла просто дополнительно используйте ф-ю rename() - перед тем как отдать (только перед этим не забудьте сохранить исходное имя файла) и соответственно после скачки.