public object LoadEditor(HttpRequestParams request)
        {
            var id = request.GetGuid("id");

            using (var session = Context.OpenSession())
            {
                var scriptList = session
                    .Query<UserScript>()
                    .Select(s => new { id = s.Id, name = s.Name })
                    .ToArray();

                if (id.HasValue)
                {
                    var alarm = session.Get<AlarmTime>(id.Value);

                    return BuildEditorModel(
                        scriptList,
                        alarm.Id,
                        alarm.Name,
                        alarm.Hours,
                        alarm.Minutes,
                        alarm.Enabled,
                        alarm.UserScript.GetPropertyOrDefault(obj => (Guid?)obj.Id)
                    );
                }

                return BuildEditorModel(scriptList);
            }
        }
		public object SaveScript(HttpRequestParams request)
		{
			Guid? id = request.GetGuid("id");
			string name = request.GetRequiredString("name");
			string body = request.GetString("body");

			using (var session = Context.OpenSession())
			{

				var script = id.HasValue
					? session.Get<UserScript>(id.Value)
					: new UserScript { Id = Guid.NewGuid() };

				script.Name = name;
				script.Body = body;
				session.SaveOrUpdate(script);
				session.Flush();
			}

			return null;
		}
		public object GetDashboardDetails(HttpRequestParams request)
		{
			Guid? id = request.GetGuid("id");

			using (var session = Context.OpenSession())
			{
				var allDashboards = session.Query<Dashboard>().ToArray();

				if (allDashboards.Any())
				{
					var selected = id.HasValue
						? allDashboards.Single(d => d.Id == id.Value)
						: allDashboards.First();

					var dashboardList = GetDashboardListModel(allDashboards, selected.Id);

					var allPanels = session.Query<Panel>()
						.Where(w => w.Dashboard.Id == selected.Id)
						.ToArray();

					var allWidgets = session.Query<Widget>()
						.Where(w => w.Panel.Dashboard.Id == selected.Id)
						.ToArray();

					var allParameters = session.Query<WidgetParameter>()
						.Where(w => w.Widget.Panel.Dashboard.Id == selected.Id)
						.ToArray();

					var panelList = GetPanelListModel(allPanels, allWidgets, allParameters, session);

					return new
					{
						dashboards = dashboardList,
						panels = panelList
					};
				}

				return null;
			}
		}
		public object SaveAlarm(HttpRequestParams request)
		{
			var id = request.GetGuid("id");
			var name = request.GetString("name");
			var hours = request.GetRequiredInt32("hours");
			var minutes = request.GetRequiredInt32("minutes");
			var scriptId = request.GetGuid("scriptId");

			using (var session = Context.OpenSession())
			{
				var alarmTime = id.HasValue
					? session.Get<AlarmTime>(id.Value)
					: new AlarmTime { Id = Guid.NewGuid() };

				var script = scriptId.HasValue
					? session.Load<UserScript>(scriptId.Value)
					: null;

				alarmTime.Name = name;
				alarmTime.Hours = hours;
				alarmTime.Minutes = minutes;
				alarmTime.UserScript = script;
				alarmTime.Enabled = true;

				session.Save(alarmTime);
				session.Flush();
			}

			Context.GetPlugin<AlarmClockPlugin>().ReloadTimes();
			return null;
		}
		private Widget SaveWidget(HttpRequestParams request, ISession session)
		{
			var id = request.GetGuid("id");

			var widget = id.HasValue
				? session.Query<Widget>().Single(x => x.Id == id)
				: CreateWidget(request, session);

			widget.DisplayName = request.GetString("displayName") ?? "noname";

			session.Save(widget);
			session.Flush();

			return widget;
		}