public object GetWidgetData(Widget widget, WidgetParameter[] parameters, ISession session, Logger logger)
		{
			var wChannel = parameters.First(p => p.Name == PARAM_CHANNEL).ValueInt;
			return new
			{
				channel = wChannel
			};
		}
		public object GetWidgetData(Widget widget, WidgetParameter[] parameters, ISession session, Logger logger)
		{
			var sensorId = parameters.First(p => p.Name == PARAM_SENSOR_ID).ValueGuid;
			var sensor = session.Get<TemperatureSensor>(sensorId);

			return new
			{
				id = sensorId, 
				timestamp = sensor.Timestamp,
				t = sensor.CurrentTemperature,
				h = sensor.CurrentHumidity,
				showHumidity = sensor.ShowHumidity
			};
		}
 public object GetWidgetData(Widget widget, WidgetParameter[] parameters, ISession session, Logger logger)
 {
     return null;
 }
        private object GetWidgetModel(IWidgetDefinition def, Widget widget, WidgetParameter[] parameters, ISession session)
        {
            try
            {
                var data = def.GetWidgetData(widget, parameters, session, Logger);

                var model = new
                {
                    id = widget.Id,
                    type = widget.TypeAlias,
                    displayName = widget.DisplayName,
                    sortOrder = widget.SortOrder,
                    data
                };

                return model;
            }
            catch (Exception ex)
            {
                var message = string.Format(
                    "UI widget error (id: {0}, type:{1})", widget.Id, widget.TypeAlias);
                Logger.ErrorException(message, ex);

                return null;
            }
        }
        private object[] GetWidgetListModel(Widget[] allWidgets, WidgetParameter[] allParameters, ISession session)
        {
            var list = new List<object>();

            foreach (var widget in allWidgets)
            {
                var def = defs.GetValueOrDefault(widget.TypeAlias);

                if (def != null)
                {
                    var parameters = allParameters.Where(p => p.Widget.Id == widget.Id).ToArray();

                    var model = GetWidgetModel(def, widget, parameters, session);

                    if (model != null)
                    {
                        list.Add(model);
                    }
                }
            }
            return list.ToArray();
        }
		private object[] GetPanelListModel(Panel[] allPanels, Widget[] allWidgets, WidgetParameter[] allParameters, ISession session)
		{
			var list = new List<object>();

			foreach (var panel in allPanels)
			{
				var panelWidgets = allWidgets.Where(w => w.Panel.Id == panel.Id).ToArray();
				var widgetListModel = GetWidgetListModel(panelWidgets, allParameters, session);

				var model = new {
					id = panel.Id,
					title = panel.Title,
					widgets = widgetListModel,
					sortOrder = panel.SortOrder
				};

				list.Add(model);
			}

			return list.ToArray();
		}
		private void FillEditorModel(Tuple<EditorModel, EditorParameterModel[]> model, Widget widget, WidgetParameter[] parameters)
		{
			model.Item1.id = widget.Id;
			model.Item1.displayName = widget.DisplayName;

			foreach (var parameter in parameters)
			{
				var pmodel = model.Item2.FirstOrDefault(p => p.name == parameter.Name);

				if (pmodel != null)
				{
					switch (pmodel.type)
					{
						case "guid":
							pmodel.value = parameter.ValueGuid;
							break;
						case "int32":
							pmodel.value = parameter.ValueInt;
							break;
						case "string":
							pmodel.value = parameter.ValueString;
							break;
					}
				}
			}
		}
		private static void CreateParameter(ISession session, Widget widget, WidgetParameterMetaData field, string value)
		{
			var p = new WidgetParameter
			{
				Id = Guid.NewGuid(),
				Widget = widget,
				Name = field.Name
			};

			switch (field.Type)
			{
				case WidgetParameterType.String:
					p.ValueString = value;
					break;
				case WidgetParameterType.Guid:
					p.ValueGuid = value.ParseGuid();
					break;
				case WidgetParameterType.Int32:
					p.ValueInt = value.ParseInt();
					break;
			}

			session.Save(p);
		}
		private void SaveWidgetFields(Widget widget, HttpRequestParams request, ISession session)
		{
			var def = defs.GetValueOrDefault(widget.TypeAlias);

			if (def != null)
			{
				session.Query<WidgetParameter>()
					.Where(p => p.Widget.Id == widget.Id)
					.ForEach(session.Delete);

				session.Flush();

				var fields = def.GetWidgetMetaData(session, Logger) 
					?? new WidgetParameterMetaData[0];

				var json = request.GetRequiredString("json");
				var values = Extensions.FromJson<Dictionary<string, string>>(json);

				foreach (var field in fields)
				{
					var value = values.GetValueOrDefault(field.Name);

					CreateParameter(session, widget, field, value);
				}

				session.Flush();
			}
		}
		private Widget CreateWidget(HttpRequestParams request, ISession session)
		{
			var type = request.GetRequiredString("type");
			var panelId = request.GetRequiredGuid("panelId");

			var panel = session.Query<Panel>().Single(x => x.Id == panelId);

			var created = new Widget
			{
				Id = Guid.NewGuid(),
				Panel = panel,
				TypeAlias = type,
				SortOrder = int.MaxValue
			};

			return created;
		}
		private object GetWidgetModel(Widget widget) 
		{
			var typeDisplayName = defs.ContainsKey(widget.TypeAlias)
				? defs[widget.TypeAlias].DisplayName
				: string.Format("[{0}]", widget.TypeAlias);

			var displayName = string.IsNullOrEmpty(widget.DisplayName) ? "[no name]" : widget.DisplayName;

			var widgetModel = new
			{
				id = widget.Id,
				type = widget.TypeAlias,
				sortOrder = widget.SortOrder,
				displayName,
                typeDisplayName
			};

			return widgetModel;
		}
        private Widget CreateWidget(HttpRequestParams request, ISession session)
        {
            var type = request.GetRequiredString("type");
            var dashboardId = request.GetRequiredGuid("dashboardId");

            var dashboard = session.Query<Dashboard>().Single(x => x.Id == dashboardId);

            var created = new Widget
            {
                Id = Guid.NewGuid(),
                Dashboard = dashboard,
                TypeAlias = type,
                SortOrder = int.MaxValue
            };

            return created;
        }