HD.WidgetCluster = function (model, view, config) {
	this.model = model;
	this.view = view;
	this.config = config;
	
	this.widgets = [];
};

HD.WidgetCluster.prototype = {	
	init : function(widgetsConfig, callback) {
		this.addWidgets(widgetsConfig);
		if(callback != null) {
			callback();
		}
	},
	
	loadDependencies : function(dependencies, callback) {
		var cb = this;
		var w = widgetsConfig;
		HD.insert({
			filter: "raw",
			require: dependencies,
			base: this.config.baseUrl + "/hd/",
			loadOptional: true,
		    skin: {
		    	base: "assets/skins/",
		    	defaultSkin: "hd"
		    },
			onSuccess: function(o) {
				cb.addWidgets.call(cb, w);
				if(callback != null) {
					callback();
				}
			}
		});
	},
	
	addWidgets : function(widgetsConfig) {
		for(var i = 0, len = widgetsConfig.length; i < len; i++) {
			this.addWidget(widgetsConfig[i]);
		}
	},
	
	addWidget : function(config) {
		var widgetClass = this.getClass(HD.classMap[config.type]);
		if(widgetClass != null) {
			var widget = new widgetClass(config);
			if(this.model != null) {
				this.model.addObserver(widget);
				widget.model = this.model;
			}
			if(this.view != null) {
				this.view.addObserver(widget);
				widget.view = this.view;
			}
			this.widgets.push(widget);
			return widget;
		}
	},
	
	removeWidget : function(widget) {
		this.model.removeObserver(widget);
		var tempWidgets = [];
		var widgets = this.widgets;
		for(var i = 0, len = widgets.length; i < len; i++) {
			var tempWidget = widgets[i];
			if(tempWidget != widget) {
				tempWidgets.push(tempWidget);
			}
		}
		this.widgets = tempWidgets;
	},
	
	getWidget : function(index) {
		return this.widgets[index];
	},
	
	getClass : function(className) {
		if(className == null) {
			return null;
		}
			
		var pieces = className.split(".");
		var classs = window;
		for(var i = 0, len = pieces.length; i < len; i++){
			classs = classs[pieces[i]];
		}
		return classs;
	}
};

HD.register('hd_widget_cluster', HD.WidgetCluster, {version: "1.0", build: "1"});