namespace("Rtx.Ajax");

Rtx.Ajax.NamingContainer = Class.inherit(BaseObject, {

	initialize:	function (controls) {
		this.base();
		this.attach(controls);
	},

	attach:	function (controls) {
		Object.extend(this, controls);
	},

	detach:	function () {
		for (key in this) {
			if (typeof this[key] == 'function') continue;
			else if(this.controls) this.controls[key] = null;
		}
	}

});

Object.extend(Rtx.Ajax.NamingContainer, {

	create:	function (parentID, ID, initializer) {
		var clientID = parentID ? parentID + '_' + ID : ID;
		Rtx.Ajax.BaseControl.ajaxControlInitializers[clientID] = initializer;
		var result = new Rtx.Ajax.NamingContainer(initializer());
		result.$ClientID = clientID;
		prevCtrl = Rtx.Ajax.BaseControl.ajaxControls[clientID];
		if (prevCtrl) {
			prevCtrl.detach();
		}
		Rtx.Ajax.BaseControl.ajaxControls[clientID] = result;
		return result;
	},

	recreate:	function (parentID, ID, initializer) {
		var result = this.create(parentID, ID, initializer);
		var parent = Rtx.Ajax.BaseControl.ajaxControls[parentID];
		if (parent) {
			initializer = Rtx.Ajax.BaseControl.ajaxControlInitializers[parentID];
			if (typeof initializer == 'function')
				parent.attach(initializer());
		}
		return result;
	},

	isInstance:	function (obj) {
		return obj.constructor == this;
	}

});

Rtx.Ajax.BaseControl = Class.inherit(WebControl, {

	getAjax:	function (prefixID) {
		eval("var result = " + this.ajaxPrefixes[prefixID] + ";");
		return result;
	},

	setupMainElement:	function(element) {
		var e = this.base(element);
		if (!e) e = $(this.clientID);
		return e;
	}

});

Object.extend(Rtx.Ajax.BaseControl, {

	ajaxControls:	{},
	ajaxControlInitializers:	{},

	create:	function (parentID, ID, theClass, initializer) {
		var clientID = parentID ? parentID + '_' + ID : ID;
		Rtx.Ajax.BaseControl.ajaxControlInitializers[clientID] = initializer;
		var result = new theClass(initializer());
		result.$ClientID = clientID;
		prevCtrl = Rtx.Ajax.BaseControl.ajaxControls[clientID];
		if (prevCtrl) {
			prevCtrl.detach();
		}
		Rtx.Ajax.BaseControl.ajaxControls[clientID] = result;
		return result;
	},

	recreate:	function (parentID, ID, theClass, initializer) {
		var result = this.create(parentID, ID, theClass, initializer);
		var parent = Rtx.Ajax.BaseControl.ajaxControls[parentID];
		if (parent) {
			initializer = Rtx.Ajax.BaseControl.ajaxControlInitializers[parentID];
			if (typeof initializer == 'function')
				parent.attach(initializer());
		}
		return result;
	},

	FindControl:	function (clientID) {
		return this.ajaxControls[clientID];
	},

	_tryAttachToAtlasEvents:	function () {
		if (typeof Sys != 'undefined')
			if (typeof Sys.WebForms != 'undefined')
				if (typeof Sys.WebForms.PageRequestManager != 'undefined') {
					Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(this._atlas_pageLoadedHandler.bind(this));
				}
	},

	_dump:	function (obj) {
		if (typeof obj == 'object') {
			var r = "";
			for (var i in obj) {
				r += i + ": " + obj[i] + ";";
			}
			return r;
		}
		else
			return obj;
	},

	_atlas_pageLoadedHandler:	function (sender, args) {
		//alert(this._dump(args.get_panelsUpdated().length));
		try {
			if (args.get_panelsUpdated().length !== 0) {
				for (var id in this.ajaxControls) {
					var ctrl = this.ajaxControls[id];
					if (!ctrl) continue;
					var initializer = this.ajaxControlInitializers[id];
					ctrl.attach(initializer());
				}
			}
		}
		catch (e) {
		}
	}

});

//Event.observe(window, 'load', Rtx.Ajax.BaseControl._tryAttachToAtlasEvents.bind(Rtx.Ajax.BaseControl));

var AjaxBaseControl = Rtx.Ajax.BaseControl;

// [AtlasScript]

if(typeof(Sys)!="undefined")
	Sys.Application.notifyScriptLoaded();

// [/AtlasScript]
			