var __ModManager = DefineClass({

	init: function() {
	},

	SaveOrder: function(SourceTab, SourceTabID, id) {
		var SourceOrder = this.GetOrderForTab(SourceTab, SourceTabID);
		Profile.update('tab', 'update', { cName: SourceTab, TabID: SourceTabID }, { order: SourceOrder } );
		var destination = Modules[id].Object.Container.parentNode.id.split('.');
		var cName = destination[1];
		var TabID = destination[2];
		if (SourceTab != cName) {
			Modules[id].State.cName = cName;
			Modules[id].State.TabID = TabID;
			var DestinationOrder = this.GetOrderForTab(cName, TabID);
			Profile.update('tab', 'update', { cName: cName, TabID: TabID }, { order: DestinationOrder } );
			Profile.update('module', 'update', { id: id }, { container: cName, tab: TabID } );
		}
	},

	GetOrderForTab: function(cName, TabID) {
		var SourceTabContent = $('Content.'+cName+'.'+TabID).childNodes;
		var order = [];
		for (var i=0;i!=SourceTabContent.length;i++) {
			if (SourceTabContent[i].id != 'GhostItem') {
				var id = SourceTabContent[i].id.replace('Module.', '');
				if (id) order.push(parseInt(id));
			}
		}
		return(order);
	},

	Create: function(type, cName, TabID, ModuleID, color, ShowOptions, ShowContent) {
		if (!Desktop.State[cName]) return;
		if (!Desktop.State[cName].content) return;
		if (!Desktop.State[cName].content[TabID]) return;
		if (type == "EMail" && !Profile.ApplyProfileInProgress) {
			for (var i in Modules) {
				if (Modules[i].Object.type == type) {
					Desktop.SetActiveByID(Modules[i].State.cName, Modules[i].State.TabID);
					return;
				}
			}
		}
		if (!color) color = 'gray';

		if(Modules[ModuleID])
			window.alert(Locale['MsgTryingCreateModuleWExistId']);

		if(!ModuleID)
		{
			ModuleID = 1;
			if(sizeof(Modules)>0)
			{
				for(var max in Modules)
				{
					max = parseInt(max);
					if (max>ModuleID) ModuleID = max;
				}
				ModuleID++;
			}
		}
		if (!window['__'+type]) Loader.include('/js/modules/'+type+'.js');
		Modules[ModuleID] = { State: { cName: cName, TabID: TabID, color: color }, Object: null};
		Modules[ModuleID].State.position = Profile.ApplyProfileInProgress ? 'auto' : 'first';
		eval('Modules['+ModuleID+'].Object = new __'+type+'('+ModuleID+', \''+color+'\')');

		if (Modules[ModuleID].Object.onComplete) Modules[ModuleID].Object.onComplete();

		if (Modules[ModuleID].State.LoadingInProgress) {
				Modules[ModuleID].Object.Core.ShowLoadingIcon();
				delete Modules[ModuleID].State.LoadingInProgress;
		}

		Modules[ModuleID].Object.type = type;
		Profile.update('module', 'create', { cName: cName, TabID: TabID,  type: type, ModuleID: ModuleID});


		if (!Profile.ApplyProfileInProgress) {
			var order = ModManager.GetOrderForTab(cName, TabID);
			Profile.update('tab', 'update', { cName: cName, TabID: TabID }, { order: order } );
		}
		if (ShowOptions) Modules[ModuleID].Object.Core.ToggleOptions();
		if (typeof ShowContent != 'undefined' && !ShowContent) Modules[ModuleID].Object.Core.ToggleAll();
		return(ModuleID);
	},

	Delete: function(ModuleID)
	{
		if (Modules[ModuleID].Object.Core.onDelete) Modules[ModuleID].Object.Core.onDelete();
		Modules[ModuleID].Object.Container.parentNode.removeChild(Modules[ModuleID].Object.Container);
		var order = this.GetOrderForTab(Modules[ModuleID].State.cName, Modules[ModuleID].State.TabID);
		Profile.update('tab', 'update', { cName: Modules[ModuleID].State.cName, TabID: Modules[ModuleID].State.TabID }, { order: order } );
		delete Modules[ModuleID];
		delete Desktop.ModulesContainer.Items['Module.'+ModuleID];
		Profile.update('module', 'delete', { ModuleID: ModuleID });
	}

});


var Modules = {};
var ModManager = new __ModManager();
