(function() {
    var timeout = 1000;

    waitForProtex();

    function waitForProtex() {
        if (typeof protex !== 'undefined' && protex) {
            protex.onInjectionDone('protex');
        // eslint-disable-next-line brace-style
        }
        /* if (typeof(protex) !== "undefined") {
            //initializeProtex();
        } */
        else {
            setTimeout(function() { waitForProtex(); }, timeout);
        }
    }

    // NOTE:
    // Protex uses three global functions:
    // protexSetTargetShape (exported from GWT)
    // exported protexCheckAnswer (exported from GWT)
    // It calls protexIsReady with a deferred command when it has finished
    // initialization and has drawn itself

    function updateProtexField() {
        var problem = $('#protex_container').parents('.problem');
        var input_field = problem.find('input[type=hidden]');
        var protex_answer = protexCheckAnswer();
        var value = {protex_answer: protex_answer};
        // console.log(JSON.stringify(value));
        input_field.val(JSON.stringify(value));
    }

    protexIsReady = function() {
        // Load target shape
        var target_shape = $('#target_shape').val();
        protexSetTargetShape(target_shape);

        // Get answer from protex and store it into the hidden input field
        // when Check button is clicked
        var $fold_button = $('#fold-button');
        $fold_button.on('click', function() {
            var problem = $('#protex_container').parents('.problem');
            var input_field = problem.find('input[type=hidden]');
            var protex_answer = protexCheckAnswer();
            var value = {protex_answer: protex_answer};
            // console.log(JSON.stringify(value));
            input_field.val(JSON.stringify(value));
        });
        updateProtexField();
    };

    /* function initializeProtex() {
        //Check to see if the two exported GWT functions protexSetTargetShape
        // and protexCheckAnswer have been appended to global scope -- this
        //happens at the end of onModuleLoad() in GWT
        if (typeof(protexSetTargetShape) === "function" &&
            typeof(protexCheckAnswer) === "function") {

            //Load target shape
            var target_shape = $('#target_shape').val();
            //protexSetTargetShape(target_shape);

            //Get answer from protex and store it into the hidden input field
            //when Check button is clicked
            var problem = $('#protex_container').parents('.problem');
            var check_button = problem.find('input.check');
            var input_field = problem.find('input[type=hidden]');
            check_button.on('click', function() {
                var protex_answer = protexCheckAnswer();
                var value = {protex_answer: protex_answer};
                input_field.val(JSON.stringify(value));
            });

            //TO DO: Fix this, it works but is utterly ugly and unreliable
            setTimeout(function() {
              protexSetTargetShape(target_shape);}, 2000);

        }
        else {
            setTimeout(function() {initializeProtex(); }, timeout);
        }
    } */
}).call(this);
