﻿// public class Application extends WebObject
function Application()
{
    extend(this, WebObject);
};

Application.prototype = new WebObject;

// public void start(Window window, Object ... args);
Application.prototype.start = WebObject.ABSTRACT_METHOD;

// public void getAppInfo(String name, void callback(AppInfo));
Application.getAppInfo = function(name, callback)
{
    var appInfo = null;
    for(var i = 0; i < Application.applications.length; i++)
    {
        if(Application.applications[i].name == name)
        {
            appInfo = Application.applications[i];
            break;
        }
    }

    if(appInfo)
    {
        callback(appInfo);
    } else
    {
        include("apps/" + name + "/" + name + ".js", function(success) {
			var appInfo = null;
			
			if(success)
			{
				appInfo = Application.declare(name, window[name]);
			}
			
			callback(appInfo);
        });
    }
};

// public static void declare(String name, Class<Application> application);
Application.declare = function(name, application)
{
    var appInfo = {name: name, type: application};
    
    Application.applications.push(appInfo);
    Application.onApplicationDeclared.fireEvent(appInfo);
    
    return appInfo;
};

// public static void start(String name);
Application.start = function(name)
{
    var args = subArray(arguments, 1);
    Application.getAppInfo(name, function(appInfo) {
        var app = new appInfo.type;
        appInfo.type.prototype.start.apply(app, args);
    });
};

// public event void onApplicationDeclared({name:String, type:Class<Application>} appInfo);
Application.onApplicationDeclared = new EventDelegate();

// private static Application[] applications;
Application.applications = [];
