/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */
"use strict";

// Object initialisation
if (typeof akeebabackup === "undefined")
{
    var akeebabackup = {};
}

if (typeof akeebabackup.Transfer === "undefined")
{
    akeebabackup.Transfer = {
        lastUrl:      "",
        lastResult:   "",
        FtpTest:      {},
        SftpTest:     {},
        FtpModal:     null,
        URLs:         {},
        translations: {}
    }
}

/**
 * Check the URL field
 */
akeebabackup.Transfer.onUrlChange = function (force)
{
    if (force === undefined)
    {
        force = false;
    }

    var urlBox = document.getElementById("akeeba-transfer-url");
    var url    = urlBox.value;

    if (url == "")
    {
        document.getElementById("akeeba-transfer-lbl-url").style.display = "block";
    }

    if ((url.substring(0, 7) !== "http://") && (url.substring(0, 8) !== "https://"))
    {
        url = "http://" + url;
    }

    var lastUrl    = akeebabackup.Transfer.lastUrl ? akeebabackup.Transfer.lastUrl : Joomla.getOptions(
        "akeebabackup.Transfer.lastUrl", "");
    var lastResult = akeebabackup.Transfer.lastResult ? akeebabackup.Transfer.lastResult : Joomla.getOptions(
        "akeebabackup.Transfer.lastResult", "");

    if (!force && (url === lastUrl))
    {
        akeebabackup.Transfer.applyUrlCheck({
            "status": lastResult,
            "url":    lastUrl
        });

        return;
    }

    var divList = document.querySelectorAll("#akeeba-transfer-row-url > div");

    for (var i = 0; i < divList.length; i++)
    {
        divList[i].style.display = "none";
    }

    urlBox.setAttribute("disabled", "disabled");
    document.getElementById("akeeba-transfer-btn-url").setAttribute("disabled", "disabled");
    document.getElementById("akeeba-transfer-loading").style.display = "";

    akeebabackup.System.doAjax({
            "task": "checkUrl",
            "url":  url
        },
        akeebabackup.Transfer.applyUrlCheck,
        function (msg)
        {
            urlBox.removeAttribute("disabled");
            document.getElementById("akeeba-transfer-btn-url").removeAttribute("disabled");
            document.getElementById("akeeba-transfer-loading").style.display = "none";
        }, false, 10000
    );

    return false;
};

akeebabackup.Transfer.applyUrlCheck = function (response)
{
    var urlBox = document.getElementById("akeeba-transfer-url");

    urlBox.removeAttribute("disabled");
    document.getElementById("akeeba-transfer-btn-url").removeAttribute("disabled");
    document.getElementById("akeeba-transfer-loading").style.display       = "none";
    document.getElementById("akeeba-transfer-ftp-container").style.display = "none";

    urlBox.value = response.url;

    akeebabackup.Transfer.lastResult = response.status;
    akeebabackup.Transfer.lastUrl    = response.url;

    switch (response.status)
    {
        case "ok":
            akeebabackup.Transfer.showConnectionDetails();
            break;

        case "same":
            document.getElementById("akeeba-transfer-err-url-same").style.display = "";
            break;

        case "invalid":
            document.getElementById("akeeba-transfer-err-url-invalid").style.display = "";
            break;

        case "notexists":
            document.getElementById("akeeba-transfer-err-url-notexists").style.display = "";
            break;
    }
};

akeebabackup.Transfer.showConnectionDetails = function ()
{
    document.getElementById("akeeba-transfer-url").setAttribute("disabled", "disabled");
    document.getElementById("akeeba-transfer-btn-url").setAttribute("disabled", "disabled");

    document.getElementById("akeeba-transfer-err-url-notexists").style.display = "none";
    document.getElementById("akeeba-transfer-ftp-container").style.display     = "";
    akeebabackup.Transfer.onTransferMethodChange();

    return false;
};

akeebabackup.Transfer.onTransferMethodChange = function (e)
{
    var elFtpMethod = document.getElementById("akeeba-transfer-ftp-method");
    var method      = elFtpMethod.options[elFtpMethod.selectedIndex].value;

    document.getElementById("akeeba-transfer-ftp-host").parentNode.parentNode.style.display       = "none";
    document.getElementById("akeeba-transfer-ftp-port").parentNode.parentNode.style.display       = "none";
    document.getElementById("akeeba-transfer-ftp-username").parentNode.parentNode.style.display   = "none";
    document.getElementById("akeeba-transfer-ftp-password").parentNode.parentNode.style.display   = "none";
    document.getElementById("akeeba-transfer-ftp-pubkey").parentNode.parentNode.style.display     = "none";
    document.getElementById("akeeba-transfer-ftp-privatekey").parentNode.parentNode.style.display = "none";
    document.getElementById("akeeba-transfer-ftp-directory").parentNode.parentNode.style.display  = "none";
    document.getElementById("akeeba-transfer-ftp-passive-container").style.display                = "none";
    document.getElementById("akeeba-transfer-ftp-passive-fix-container").style.display            = "none";
    document.getElementById("akeeba-transfer-chunkmode").parentNode.parentNode.style.display      = "none";
    document.getElementById("akeeba-transfer-chunksize").parentNode.parentNode.style.display      = "none";
    document.getElementById("akeeba-transfer-apply-loading").style.display                        = "none";

    if (method !== "manual")
    {
        document.getElementById("akeeba-transfer-ftp-host").parentNode.parentNode.style.display      =
            "";
        document.getElementById("akeeba-transfer-ftp-port").parentNode.parentNode.style.display      =
            "";
        document.getElementById("akeeba-transfer-ftp-username").parentNode.parentNode.style.display  =
            "";
        document.getElementById("akeeba-transfer-ftp-password").parentNode.parentNode.style.display  =
            "";
        document.getElementById("akeeba-transfer-ftp-directory").parentNode.parentNode.style.display =
            "";
        document.getElementById("akeeba-transfer-chunkmode").parentNode.parentNode.style.display     = "";
        document.getElementById("akeeba-transfer-chunksize").parentNode.parentNode.style.display     = "";
        document.getElementById("akeeba-transfer-btn-apply").parentNode.parentNode.style.display     = "";
        document.getElementById("akeeba-transfer-manualtransfer").style.display                      = "none";
    }

    if (method === "manual")
    {
        document.getElementById("akeeba-transfer-btn-apply").parentNode.parentNode.style.display = "none";
        document.getElementById("akeeba-transfer-manualtransfer").style.display                  = "";

        return;
    }

    if ((method === "ftp") || (method === "ftps") || (method === "ftpcurl") || (method === "ftpscurl"))
    {
        document.getElementById("akeeba-transfer-ftp-passive-container").style.display = "";
    }

    if ((method === "ftpcurl") || (method === "ftpscurl"))
    {
        document.getElementById("akeeba-transfer-ftp-passive-fix-container").style.display = "";
    }

    if ((method === "sftp") || (method === "sftpcurl"))
    {
        document.getElementById("akeeba-transfer-ftp-pubkey").parentNode.parentNode.style.display     = "";
        document.getElementById("akeeba-transfer-ftp-privatekey").parentNode.parentNode.style.display = "";
    }

};

akeebabackup.Transfer.applyConnection = function ()
{
    document.getElementById("akeeba-transfer-ftp-error").style.display     = "none";
    document.getElementById("akeeba-transfer-apply-loading").style.display = "";

    var button = document.getElementById("akeeba-transfer-btn-apply");
    button.setAttribute("disabled", "disabled");

    document.getElementById("akeeba-transfer-ftp-method").setAttribute("disabled", "disabled");
    document.getElementById("akeeba-transfer-ftp-host").parentNode.parentNode.style.display       = "none";
    document.getElementById("akeeba-transfer-ftp-port").parentNode.parentNode.style.display       = "none";
    document.getElementById("akeeba-transfer-ftp-username").parentNode.parentNode.style.display   = "none";
    document.getElementById("akeeba-transfer-ftp-password").parentNode.parentNode.style.display   = "none";
    document.getElementById("akeeba-transfer-ftp-pubkey").parentNode.parentNode.style.display     = "none";
    document.getElementById("akeeba-transfer-ftp-privatekey").parentNode.parentNode.style.display = "none";
    document.getElementById("akeeba-transfer-ftp-directory").parentNode.parentNode.style.display  = "none";
    document.getElementById("akeeba-transfer-ftp-passive-container").style.display                = "none";
    document.getElementById("akeeba-transfer-ftp-passive-fix-container").style.display            = "none";
    document.getElementById("akeeba-transfer-chunkmode").parentNode.parentNode.style.display      = "none";
    document.getElementById("akeeba-transfer-chunksize").parentNode.parentNode.style.display      = "none";

    var elFtpMethod = document.getElementById("akeeba-transfer-ftp-method");
    var method      = elFtpMethod.options[elFtpMethod.selectedIndex].value;

    if (method === "manual")
    {
        document.getElementById("akeeba-transfer-btn-apply").parentNode.parentNode.style.display = "none";
        document.getElementById("akeeba-transfer-manualtransfer").style.display                  = "";

        return;
    }

    var data = {
        "task":        "applyConnection",
        "method":      method,
        "host":        document.getElementById("akeeba-transfer-ftp-host").value,
        "port":        document.getElementById("akeeba-transfer-ftp-port").value,
        "username":    document.getElementById("akeeba-transfer-ftp-username").value,
        "password":    document.getElementById("akeeba-transfer-ftp-password").value,
        "directory":   document.getElementById("akeeba-transfer-ftp-directory").value,
        "passive":     document.getElementById("akeeba-transfer-ftp-passive1").checked ? 1 : 0,
        "passive_fix": document.getElementById("akeeba-transfer-ftp-passive-fix1").checked ? 1 : 0,
        "privateKey":  document.getElementById("akeeba-transfer-ftp-privatekey").value,
        "publicKey":   document.getElementById("akeeba-transfer-ftp-pubkey").value,
        "chunkMode":   document.getElementById("akeeba-transfer-chunkmode").value,
        "chunkSize":   document.getElementById("akeeba-transfer-chunksize").value
    };

    // Construct the query
    akeebabackup.System.doAjax(
        data,
        function (res)
        {
            document.getElementById("akeeba-transfer-apply-loading").style.display = "none";

            if (!res.status)
            {
                document.getElementById("akeeba-transfer-btn-apply").removeAttribute("disabled");
                document.getElementById("akeeba-transfer-ftp-method").removeAttribute("disabled");

                var akeebaTransferFTPError     = document.getElementById("akeeba-transfer-ftp-error");
                var akeebaTransferFTPErrorBody = document.getElementById("akeeba-transfer-ftp-error-body");
                var akeebaForceButton          = document.getElementById("akeeba-transfer-ftp-error-force");

                if (akeebaForceButton)
                {
                    akeebaForceButton.style.display = "none";

                    if (res.ignorable)
                    {
                        akeebaForceButton.style.display = "";
                    }
                }

                akeebaTransferFTPErrorBody.innerHTML = res.message;
                akeebaTransferFTPError.style.display = "";
                akeebabackup.System.triggerEvent(akeebaTransferFTPError, "focus");

                akeebabackup.Transfer.onTransferMethodChange();

                return;
            }

            // Successful connection; perform preliminary checks and upload Kickstart
            akeebabackup.Transfer.uploadKickstart();

        },
        function (res)
        {
            document.getElementById("akeeba-transfer-apply-loading").style.display = "none";

            document.getElementById("akeeba-transfer-btn-apply").removeAttribute("disabled");
            document.getElementById("akeeba-transfer-ftp-method").removeAttribute("disabled");

            var elFtpError             = document.getElementById("akeeba-transfer-ftp-error");
            var elFtpErrorBody         = document.getElementById("akeeba-transfer-ftp-error-body");
            elFtpErrorBody.textContent = Joomla.Text._("COM_AKEEBABACKUP_CONFIG_DIRECTFTP_TEST_FAIL");
            elFtpError.style.display   = "";
            akeebabackup.System.triggerEvent(elFtpError, "focus");

            akeebabackup.Transfer.onTransferMethodChange();
        }
        , false, 15000
    );
};

akeebabackup.Transfer.uploadKickstart = function ()
{
    var stepKickstart   = document.getElementById("akeeba-transfer-upload-lbl-kickstart");
    var stepArchive     = document.getElementById("akeeba-transfer-upload-lbl-archive");
    var uploadErrorBox  = document.getElementById("akeeba-transfer-upload-error");
    var uploadErrorBody = document.getElementById("akeeba-transfer-upload-error-body");
    var uploadForce     = document.getElementById("akeeba-transfer-upload-error-force");

    uploadErrorBox.style.display = "none";
    uploadForce.style.display    = "none";
    uploadErrorBody.innerHTML    = "";

    stepKickstart.classList.remove('bg-light');
    stepKickstart.classList.add('bg-warning');

    stepArchive.classList.remove('bg-warning');
    stepArchive.classList.add('bg-light');

    document.getElementById("akeeba-transfer-upload-area-kickstart").style.display = "none";
    document.getElementById("akeeba-transfer-upload-area-upload").style.display    = "";
    document.getElementById("akeeba-transfer-upload").style.display                = "";

    var data = {
        "task": "initialiseUpload"
    };

    // Construct the query
    akeebabackup.System.doAjax(data, function (res)
    {
        if (!res.status)
        {
            if (uploadForce)
            {
                uploadForce.style.display = "none";

                if (res.ignorable)
                {
                    uploadForce.style.display = "";
                }
            }

            stepKickstart.classList.remove('bg-warning');
            stepKickstart.classList.add('bg-danger', 'text-white');

            uploadErrorBody.innerHTML    = res.message;
            uploadErrorBox.style.display = "";

            return;
        }

        // Success. Now let's upload the backup archive.
        akeebabackup.Transfer.uploadArchive(1);
    }, null, false, 150000);
};

akeebabackup.Transfer.uploadArchive = function (start)
{
    if (start === undefined)
    {
        start = 0;
    }

    var stepKickstart   = document.getElementById("akeeba-transfer-upload-lbl-kickstart");
    var stepArchive     = document.getElementById("akeeba-transfer-upload-lbl-archive");
    var uploadErrorBox  = document.getElementById("akeeba-transfer-upload-error");
    var uploadErrorBody = document.getElementById("akeeba-transfer-upload-error-body");

    uploadErrorBody.innerHTML    = "";
    uploadErrorBox.style.display = "none";

    stepKickstart.classList.remove('bg-light', 'bg-warning');
    stepKickstart.classList.add('bg-success', 'text-white');

    stepArchive.classList.remove('bg-light');
    stepArchive.classList.add('bg-warning');

    var data = {
        "task": "upload", "start": start
    };

    // Construct the query
    akeebabackup.System.doAjax(data, function (res)
    {
        if (!res.result)
        {
            stepArchive.classList.remove('bg-warning');
            stepArchive.classList.add('bg-danger', 'text-white');

            uploadErrorBody.innerHTML    = res.message;
            uploadErrorBox.style.display = "";

            return;
        }

        // Success. Let's update the displayed information and step through the upload.
        if (res.done)
        {
            document.getElementById("akeeba-transfer-upload-percent").textContent = "100 %";
            document.getElementById("akeeba-transfer-upload-size").innerHTML      = "";

            document.getElementById("akeeba-transfer-upload-area-kickstart").style.display = "";
            document.getElementById("akeeba-transfer-upload-area-upload").style.display    = "none";

            var urlBox = document.getElementById("akeeba-transfer-url");
            var url    = urlBox.value.replace(/\/$/, "") + "/kickstart.php";

            document.getElementById("akeeba-transfer-upload-btn-kickstart").setAttribute("href", url);

            return;
        }

        var donePercent = 0;
        var totalSize   = res.totalSize * 1.0;
        var doneSize    = res.doneSize * 1.0;

        if ((totalSize > 0) && (doneSize > 0))
        {
            donePercent = 100 * (doneSize / totalSize);
        }

        document.getElementById("akeeba-transfer-upload-percent").textContent = donePercent.toFixed(2) + "%";
        document.getElementById("akeeba-transfer-upload-size").textContent    = doneSize.toFixed(
            0) + " / " + totalSize.toFixed(0) + " bytes";

        // Using setTimeout prevents recursive call issues.
        window.setTimeout(function ()
        {
            akeebabackup.Transfer.uploadArchive(0);
        }, 50);
    }, null, false, 150000);
};

akeebabackup.Transfer.testFtpSftpConnection = function ()
{
    var elFtpMethod = document.getElementById("akeeba-transfer-ftp-method");
    var driver      = elFtpMethod.options[elFtpMethod.selectedIndex].value;

    if ((driver === "ftp") || (driver === "ftps") || (driver === "ftpcurl") || (driver === "ftpscurl"))
    {
        akeebabackup.Transfer.FtpTest.testConnection("akeeba-transfer-btn-testftp");
    }
    else if ((driver === "sftp") || (driver === "sftpcurl"))
    {
        akeebabackup.Transfer.SftpTest.testConnection("akeeba-transfer-btn-testftp");
    }

    return false;
};

//=============================================================================
// 							I N I T I A L I Z A T I O N
//=============================================================================
akeebabackup.System.documentReady(function ()
{
    document.getElementById("akeeba-transfer-ftp-method")
            .addEventListener("change", akeebabackup.Transfer.onTransferMethodChange);

    document.getElementById("akeeba-transfer-btn-url").addEventListener("click", function (e)
    {
        e.preventDefault();

        akeebabackup.Transfer.onUrlChange(true);

        return false;
    });

    // Auto-process URL change event
    if (document.getElementById("akeeba-transfer-url").value)
    {
        akeebabackup.Transfer.onUrlChange();
    }

    // Remote connection hooks
    document.getElementById("akeeba-transfer-ftp-method")
            .addEventListener("change", akeebabackup.Transfer.onTransferMethodChange);

    document.getElementById("akeeba-transfer-btn-apply")
            .addEventListener("click", akeebabackup.Transfer.applyConnection);

    document.getElementById("akeeba-transfer-err-url-notexists-btn-ignore")
            .addEventListener("click", akeebabackup.Transfer.showConnectionDetails);
});