var main = {};


(function() {
    main.permissions = <<PERMISSIONS>>;

    main.startup = function(thunk) {
        plt.permission.startupAllPermissions(main.permissions, thunk);
    };

    main.shutdown = function() {
       for(var i = 0; i < main.permissions.length; i++) {
           plt.permission.runShutdownCode(main.permissions[i]);
       }

       // Send a stimuli to shut everything down.
       plt.world.stimuli.onShutdown();
    };



    main.onload = function() {
	main.startup(function() {
	   	main.afterPreloadImages(main.runToplevel); });
    };


    main.onunload = function() {
	main.shutdown();
    };


    main.runAgain = function() { 
        main.shutdown();
        main.startup(function() { main.runToplevel(); });
    };




    // Waits until all images are loaded, after which we
    // evaluate the after thunk.
    main.afterPreloadImages = function(after) {
	var imagePaths = <<IMAGES>>;
	var images = [];
	function wait(predicate, after) {
	    if (predicate()) 
		after();
	    else
		setTimeout(function() { wait(predicate, after); },
			   100);
	}

	function isAllLoaded() {
	    var i;
	    for (i = 0; i < images.length; i++) {
		if (! (images[i].isLoaded)) {
		    return false;
		}
	    }
	    return true;
	}

	var i;
	for (i = 0; i < imagePaths.length; i++) {
	    images.push(plt.world.Kernel.openImageUrl
			(plt.types.String.makeInstance(imagePaths[i])));
	}
	wait(isAllLoaded, after);
    };


    main.runToplevel = function() {
	var showToplevelExpression = function(val) {
	    if (val != undefined && val != null) {
		document.body.appendChild(plt.Kernel.toDomNode(val));
		document.body.appendChild(document.createElement("br"));
	    }
        };
	plt.Kernel.printHook = function(str) {
		document.body.appendChild(document.createTextNode(str));
		document.body.appendChild(document.createElement("br"));
        };
        try {
   	    (<<PROGRAM-TOPLEVEL-EXPRESSIONS>>)(showToplevelExpression);
        } catch (e) {
	    alert(e);
	    if (plt.Kernel.lastLoc) {
	        alert("Error was raised around " + plt.Kernel.lastLoc);
            }
            throw e;
        }
    };

	<<PROGRAM-DEFINITIONS>>



})();
