{
    var loader = require('folderlaunch-configLoad.js');
    var storage_1 = require('Storage');
    var FOLDER_ICON_1 = require("heatshrink").decompress(atob("mEwwMA///wAJCAoPAAongAonwAon4Aon8Aon+Aon/AooA/AH4A/AFgA="));
    var config_1 = loader.getConfig();
    var timeout_1;
    var resetTimeout_1 = function () {
        if (timeout_1) {
            clearTimeout(timeout_1);
        }
        if (config_1.timeout != 0) {
            timeout_1 = setTimeout(function () {
                Bangle.showClock();
            }, config_1.timeout);
        }
    };
    var folderPath_1 = [];
    var getFolder_1 = function (folderPath) {
        var result = config_1.rootFolder;
        for (var _i = 0, folderPath_2 = folderPath; _i < folderPath_2.length; _i++) {
            var folderName = folderPath_2[_i];
            result = result.folders[folderName];
        }
        nPages_1 = Math.ceil((result.apps.length + Object.keys(result.folders).length) / (config_1.display.rows * config_1.display.rows));
        return result;
    };
    var folder_1 = getFolder_1(folderPath_1);
    var getFontSize_1 = function (length, maxWidth, minSize, maxSize) {
        var size = Math.floor(maxWidth / length);
        size *= (20 / 12);
        if (size < minSize)
            return minSize;
        else if (size > maxSize)
            return maxSize;
        else
            return Math.floor(size);
    };
    var grid_1 = [];
    for (var x = 0; x < config_1.display.rows; x++) {
        grid_1.push([]);
        for (var y = 0; y < config_1.display.rows; y++) {
            grid_1[x].push({
                type: 'empty',
                id: ''
            });
        }
    }
    var render_1 = function () {
        var gridSize = config_1.display.rows * config_1.display.rows;
        var startIndex = page_1 * gridSize;
        for (var i = 0; i < gridSize; i++) {
            var y = Math.floor(i / config_1.display.rows);
            var x = i % config_1.display.rows;
            var folderIndex = startIndex + i;
            var appIndex = folderIndex - Object.keys(folder_1.folders).length;
            if (folderIndex < Object.keys(folder_1.folders).length) {
                grid_1[x][y].type = 'folder';
                grid_1[x][y].id = Object.keys(folder_1.folders)[folderIndex];
            }
            else if (appIndex < folder_1.apps.length) {
                grid_1[x][y].type = 'app';
                grid_1[x][y].id = folder_1.apps[appIndex];
            }
            else
                grid_1[x][y].type = 'empty';
        }
        var squareSize = (g.getHeight() - 24) / config_1.display.rows;
        if (!config_1.display.icon && !config_1.display.font)
            config_1.display.font = 12;
        g.clearRect(0, 24, g.getWidth(), g.getHeight())
            .reset()
            .setFontAlign(0, -1);
        var empty = true;
        for (var x = 0; x < config_1.display.rows; x++) {
            for (var y = 0; y < config_1.display.rows; y++) {
                var entry = grid_1[x][y];
                var icon = void 0;
                var text = void 0;
                var fontSize = void 0;
                switch (entry.type) {
                    case 'app':
                        var app_1 = storage_1.readJSON(entry.id + '.info', false);
                        icon = storage_1.read(app_1.icon);
                        text = app_1.name;
                        empty = false;
                        fontSize = config_1.display.font;
                        break;
                    case 'folder':
                        icon = FOLDER_ICON_1;
                        text = entry.id;
                        empty = false;
                        fontSize = config_1.display.font ? config_1.display.font : 12;
                        break;
                    default:
                        continue;
                }
                var iconSize = config_1.display.icon ? Math.max(0, squareSize - fontSize) : 0;
                var iconScale = iconSize / 48;
                var posX = 12 + (x * squareSize);
                var posY = 24 + (y * squareSize);
                if (config_1.display.icon && iconSize != 0)
                    try {
                        g.drawImage(icon, posX + (squareSize - iconSize) / 2, posY, { scale: iconScale });
                    }
                    catch (error) {
                        console.log("Failed to draw icon for ".concat(text, ": ").concat(error));
                        console.log(icon);
                    }
                if (fontSize)
                    g.setFont('Vector', getFontSize_1(text.length, squareSize, 6, squareSize - iconSize))
                        .drawString(text, posX + (squareSize / 2), posY + iconSize);
            }
        }
        if (empty)
            E.showMessage('Folder is empty. Swipe from left, back button, or BTN1 to go back.');
        if (nPages_1 > 1) {
            var barSize = (g.getHeight() - 24) / nPages_1;
            var barTop = 24 + (page_1 * barSize);
            g.fillRect(g.getWidth() - 8, barTop, g.getWidth() - 4, barTop + barSize);
        }
    };
    var onTouch = function (_button, xy) {
        var x = Math.floor((xy.x - 12) / ((g.getWidth() - 24) / config_1.display.rows));
        if (x < 0)
            x = 0;
        else if (x >= config_1.display.rows)
            x = config_1.display.rows - 1;
        var y = Math.floor((xy.y - 24) / ((g.getHeight() - 24) / config_1.display.rows));
        if (y < 0)
            y = 0;
        else if (y >= config_1.display.rows)
            y = config_1.display.rows - 1;
        var entry = grid_1[x][y];
        switch (entry.type) {
            case "app":
                buzz_1();
                var infoFile = storage_1.readJSON(entry.id + '.info', false);
                load(infoFile.src);
                break;
            case "folder":
                buzz_1();
                resetTimeout_1();
                page_1 = 0;
                folderPath_1.push(entry.id);
                folder_1 = getFolder_1(folderPath_1);
                render_1();
                break;
            default:
                resetTimeout_1();
                break;
        }
    };
    var page_1 = 0;
    var nPages_1;
    var onSwipe = function (lr, ud) {
        if (lr == 1 && ud == 0) {
            onBackButton_1();
            return;
        }
        else if (ud == 1) {
            resetTimeout_1();
            if (page_1 == 0) {
                buzz_1(200);
                return;
            }
            else
                page_1--;
        }
        else if (ud == -1) {
            resetTimeout_1();
            if (page_1 == nPages_1 - 1) {
                buzz_1(200);
                return;
            }
            else
                page_1++;
        }
        render_1();
    };
    var onBackButton_1 = function () {
        buzz_1();
        if (folderPath_1.length == 0)
            Bangle.showClock();
        else {
            folderPath_1.pop();
            folder_1 = getFolder_1(folderPath_1);
            resetTimeout_1();
            page_1 = 0;
            render_1();
        }
    };
    var buzz_1 = config_1.disableVibration ? function () { } : Bangle.buzz;
    Bangle.loadWidgets();
    Bangle.drawWidgets();
    Bangle.setUI({
        mode: 'custom',
        back: onBackButton_1,
        btn: onBackButton_1,
        swipe: onSwipe,
        touch: onTouch,
        remove: function () { if (timeout_1)
            clearTimeout(timeout_1); }
    });
    resetTimeout_1();
    render_1();
}
