var CtPage = {

	_elements: {},
	_delegates: new Object(),
	_elementDelegates: new Object(),
	_scripts: new Object(),
	_requestManager: null,


	registerScript: function(name) {
		this._scripts[name] = name;
		this._executeRegisteredDelegates(name);
	},


	scriptIsReady: function(name, func) {
		if (this._scripts[name] == undefined) {
			if (this._delegates[name] == undefined) {
				this._delegates[name] = new Array(func);
			} else {
				this._delegates[name].push(func);
			}
		} else {
			func();
		}
	},


	componentIsReady: function(ident, func) {
		if (this._elements[ident] == undefined) {
			if (this._elementDelegates[ident] == undefined) {
				this._elementDelegates[ident] = new Array(func);
			} else {
				this._elementDelegates[ident].push(func);
			}
		} else {
			func();
		}
	},


	addComponent: function(component) {
		if (!component.type || component.type !== 'CtComponent') {
			throw 'Type mismatch. Only CtComponents can be registered';
		}
		this._elements[component.id] = component;
		this._executeRegisteredElementDelegates(component.id);
	},


	getComponent: function(ident) {

		if (this._elements[ident]) {
			return this._elements[ident];
		} else if (ident == 'error') {
			return CtComponent_Error;
		} else {
			return null;
		}

	},


	sendRequest: function(ident) {
		if (!this._requestManager) {
			this._requestManager = new CtRequest_Manager();
		}

		if (!this._elements[ident]) {
			throw 'Component ' + ident + ' is not registered';
		}

		return this._requestManager.send(ident);
	},



	getRequest: function(ident, requestType) {
		if (!this._requestManager) {
			this._requestManager = new CtRequest_Manager();
		}

		if (!this._elements[ident]) {
			throw 'Component ' + ident + ' is not registered';
		}

		return this._requestManager.get(ident, requestType);
	},



	_executeRegisteredDelegates: function(name) {
		var delegates = this._delegates[name];
		if (delegates != undefined) {
			for (var i = 0; i < delegates.length; i++) {
				delegates[i]();
			}
		}
	},


	_executeRegisteredElementDelegates: function(ident) {
		var delegates = this._elementDelegates[ident];
		if (delegates != undefined) {
			for (var i = 0; i < delegates.length; i++) {
				delegates[i]();
			}
		}
	}

};

