' ============================================================================
' reboot_with_countdown.vbs
' ----------------------------------------------------------------------------
' Назначение: запрашивает подтверждение и перезагружает Windows через 30 секунд
'             с окном обратного отсчёта и возможностью отмены.
'
' Логика:
'   1. MsgBox с вопросом (Да/Нет).
'   2. Если Да — создаётся временный .hta и запускается через mshta.exe.
'      Окно показывает счётчик, по истечении времени вызывает shutdown /r /t 0.
'      Кнопка "Отменить" закрывает окно без перезагрузки.
'   3. После закрытия HTA временный файл удаляется.
'
' Кодировки:
'   - .vbs сохранён в UTF-16 LE с BOM (WSH определяет Unicode по BOM).
'   - .hta пишется в UTF-8 с BOM через ADODB.Stream, в <meta> charset=utf-8.
'
' Внимание: скрипт внутри HTA написан на JavaScript (а не VBScript), потому
'          что в современном mshta.exe VBScript-обработчики могут не
'          выполняться в режиме документа IE11+.
' ============================================================================

Option Explicit

Dim objShell, objFSO
Dim strTempPath, strHtaPath, strHtaContent
Dim intAnswer, strRand

Set objShell = CreateObject("WScript.Shell")
Set objFSO   = CreateObject("Scripting.FileSystemObject")

' --- Шаг 1: подтверждение ---------------------------------------------------
intAnswer = MsgBox( _
    "Перезагрузить компьютер через 30 секунд?" & vbCrLf & vbCrLf & _
    "У вас будет возможность отменить перезагрузку.", _
    vbYesNo + vbQuestion + vbDefaultButton2 + vbSystemModal, _
    "Подтверждение перезагрузки")

If intAnswer <> vbYes Then
    WScript.Quit 0
End If

' --- Шаг 2: путь к временному HTA -------------------------------------------
Randomize
strRand = CStr(Int(Rnd * 1000000))
strTempPath = objShell.ExpandEnvironmentStrings("%TEMP%")
strHtaPath  = objFSO.BuildPath(strTempPath, "reboot_countdown_" & strRand & ".hta")

' --- Содержимое HTA. JS внутри — не VBScript. -------------------------------
strHtaContent = _
"<html>" & vbCrLf & _
"<head>" & vbCrLf & _
"<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"">" & vbCrLf & _
"<title>Перезагрузка компьютера</title>" & vbCrLf & _
"<HTA:APPLICATION" & vbCrLf & _
"  ID=""rebootApp""" & vbCrLf & _
"  APPLICATIONNAME=""RebootCountdown""" & vbCrLf & _
"  BORDER=""dialog""" & vbCrLf & _
"  CAPTION=""yes""" & vbCrLf & _
"  SHOWINTASKBAR=""yes""" & vbCrLf & _
"  SINGLEINSTANCE=""yes""" & vbCrLf & _
"  SYSMENU=""no""" & vbCrLf & _
"  MAXIMIZEBUTTON=""no""" & vbCrLf & _
"  MINIMIZEBUTTON=""no""" & vbCrLf & _
"  SCROLL=""no""" & vbCrLf & _
"  CONTEXTMENU=""no""" & vbCrLf & _
"  SELECTION=""no""" & vbCrLf & _
"/>" & vbCrLf & _
"<style type=""text/css"">" & vbCrLf & _
"  html, body { height: 100%; }" & vbCrLf & _
"  body {" & vbCrLf & _
"    font-family: ""Segoe UI"", Tahoma, sans-serif;" & vbCrLf & _
"    background: #1e1e1e;" & vbCrLf & _
"    color: #f0f0f0;" & vbCrLf & _
"    margin: 0;" & vbCrLf & _
"    padding: 24px;" & vbCrLf & _
"    text-align: center;" & vbCrLf & _
"  }" & vbCrLf & _
"  h1 { font-size: 18px; font-weight: 600; margin: 0 0 12px 0; }" & vbCrLf & _
"  .counter {" & vbCrLf & _
"    font-size: 72px;" & vbCrLf & _
"    font-weight: 300;" & vbCrLf & _
"    color: #ff6b6b;" & vbCrLf & _
"    margin: 16px 0;" & vbCrLf & _
"  }" & vbCrLf & _
"  .hint { font-size: 13px; color: #b0b0b0; margin-bottom: 20px; }" & vbCrLf & _
"  button {" & vbCrLf & _
"    font-size: 14px;" & vbCrLf & _
"    padding: 8px 28px;" & vbCrLf & _
"    background: #0e639c;" & vbCrLf & _
"    color: #fff;" & vbCrLf & _
"    border: 1px solid #1177bb;" & vbCrLf & _
"    cursor: pointer;" & vbCrLf & _
"    font-family: inherit;" & vbCrLf & _
"  }" & vbCrLf & _
"  button:hover { background: #1177bb; }" & vbCrLf & _
"  button:active { background: #0c5a8a; }" & vbCrLf & _
"</style>" & vbCrLf & _
"<script type=""text/javascript"">" & vbCrLf & _
"var gSecondsLeft = 30;" & vbCrLf & _
"var gTimerId = null;" & vbCrLf & _
"var gCancelled = false;" & vbCrLf & _
"" & vbCrLf & _
"function init() {" & vbCrLf & _
"    try {" & vbCrLf & _
"        window.resizeTo(440, 340);" & vbCrLf & _
"        window.moveTo((screen.availWidth - 440) / 2, (screen.availHeight - 340) / 2);" & vbCrLf & _
"    } catch (e) {}" & vbCrLf & _
"    updateUI();" & vbCrLf & _
"    gTimerId = window.setInterval(tick, 1000);" & vbCrLf & _
"}" & vbCrLf & _
"" & vbCrLf & _
"function tick() {" & vbCrLf & _
"    if (gCancelled) return;" & vbCrLf & _
"    gSecondsLeft = gSecondsLeft - 1;" & vbCrLf & _
"    if (gSecondsLeft <= 0) {" & vbCrLf & _
"        window.clearInterval(gTimerId);" & vbCrLf & _
"        doReboot();" & vbCrLf & _
"    } else {" & vbCrLf & _
"        updateUI();" & vbCrLf & _
"    }" & vbCrLf & _
"}" & vbCrLf & _
"" & vbCrLf & _
"function updateUI() {" & vbCrLf & _
"    var el = document.getElementById('counter');" & vbCrLf & _
"    if (el) el.innerHTML = gSecondsLeft + ' с';" & vbCrLf & _
"}" & vbCrLf & _
"" & vbCrLf & _
"function cancelReboot() {" & vbCrLf & _
"    gCancelled = true;" & vbCrLf & _
"    if (gTimerId !== null) window.clearInterval(gTimerId);" & vbCrLf & _
"    alert('Перезагрузка отменена.');" & vbCrLf & _
"    window.close();" & vbCrLf & _
"}" & vbCrLf & _
"" & vbCrLf & _
"function doReboot() {" & vbCrLf & _
"    try {" & vbCrLf & _
"        var sh = new ActiveXObject('WScript.Shell');" & vbCrLf & _
"        sh.Run('shutdown /r /t 0', 0, false);" & vbCrLf & _
"    } catch (e) {" & vbCrLf & _
"        alert('Не удалось выполнить перезагрузку: ' + e.message);" & vbCrLf & _
"    }" & vbCrLf & _
"    window.close();" & vbCrLf & _
"}" & vbCrLf & _
"</script>" & vbCrLf & _
"</head>" & vbCrLf & _
"<body onload=""init()"">" & vbCrLf & _
"  <h1>Компьютер будет перезагружен</h1>" & vbCrLf & _
"  <div class=""counter"" id=""counter"">30 с</div>" & vbCrLf & _
"  <div class=""hint"">Нажмите ""Отменить"", чтобы прервать перезагрузку.</div>" & vbCrLf & _
"  <button type=""button"" onclick=""cancelReboot()"">Отменить</button>" & vbCrLf & _
"</body>" & vbCrLf & _
"</html>"

' --- Запись HTA в UTF-8 с BOM -----------------------------------------------
Dim objStream
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2                 ' adTypeText
objStream.Charset = "utf-8"
objStream.Open
objStream.WriteText strHtaContent
objStream.SaveToFile strHtaPath, 2 ' adSaveCreateOverWrite
objStream.Close
Set objStream = Nothing

' --- Запуск HTA -------------------------------------------------------------
On Error Resume Next
objShell.Run "mshta.exe """ & strHtaPath & """", 1, True
On Error Goto 0

' --- Уборка -----------------------------------------------------------------
On Error Resume Next
If objFSO.FileExists(strHtaPath) Then
    objFSO.DeleteFile strHtaPath, True
End If
On Error Goto 0

WScript.Quit 0
