function ready() {
    console.log("Ready");

    const electron = require('electron');
    const remote = electron.remote;
    window.$ = require('./vendor/jquery/jquery-2.1.4.min.js');

    $(".state").hide();

    var currentState = null;

    function updateState(state, args) {
        if (state == 'downloading') {
            function formatBytes(size) {
                return (size / 1000000).toFixed('2');
            }
            $('#download-progress').attr('value', args.percentage * 100);
            if (args.size !== null && args.size.transferred !== null && args.size.total !== null) {
                var progressString = formatBytes(args.size.transferred) + "MB / " + formatBytes(args.size.total) + "MB";
                $('#progress-bytes').html(progressString);
            } else {
                $('#progress-bytes').html("Retrieving resources...");
            }
        } else if (state == 'installing') {
        } else if (state == 'complete') {
            setTimeout(function() {
                remote.getCurrentWindow().close();
            }, 2000);
        } else if (state == 'error') {
            $('#error-message').html(args.message);
        }

        if (currentState != state) {
            if (currentState) {
                $('#state-' + currentState).hide();
            }
            $('#state-' + state).show();
            currentState = state;
        }
    }

    electron.ipcRenderer.on('update', function(event, message) {
        updateState(message.state, message.args);
    });

    // updateState('error', { message: "This is an error message", progress: 0.5 });
    // updateState('complete', { progress: 0 });
    // updateState('downloading', { percentage: 0.5, size: { total: 83040400, transferred: 500308} });

    updateState('downloading', { percentage: 0, size: null });
    electron.ipcRenderer.send('ready');
}