public ScheduleController(Action<td, DateTime> ApplyStyle, DateTime date)
        {
            this.date = date;
            this.ApplyStyle = ApplyStyle;

            TotalPersentageStates = new[]
                {
                    new ToggleButtonState {  Percentage = 2 },
                    new ToggleButtonState {  Percentage = 2.5 },
                    new ToggleButtonState {  Percentage = 3 },
                    new ToggleButtonState {  Percentage = 3.5 },
                    new ToggleButtonState {  Percentage = 4 },
                    new ToggleButtonState {  Percentage = 0 },
                    new ToggleButtonState {  Percentage = 1 },
                    new ToggleButtonState {  Percentage = 1.5 },
                };

            WorkerStates = new[]
                {
                    new ToggleButtonState { Text = "ยท", Hours = 11.5, Percentage = 1 },
                    new ToggleButtonState { Text = "P", Hours = 0, Percentage = 0 },
                    new ToggleButtonState { Text = "17", Hours = 17 - 9.5, Percentage = 0.5 },
                    new ToggleButtonState { Text = "13", Hours = 21 - 13, Percentage = 0.5 },
                };

            days = date.DaysInMonth();

            this.ScheduleTable.style.border = "1px solid gray";
            this.ScheduleTable.border = 0;
            this.ScheduleTable.cellSpacing = 0;
            this.ScheduleTable.cellPadding = 0;

            this.Body = this.ScheduleTable.AddBody();







            this.RowOfDateNumbers = this.Body.AddRow();
            this.RowOfDayNames = this.Body.AddRow();

            //Console.WriteLine(DateTime.Now + " step 2");

            BuildTop();

            //Console.WriteLine(DateTime.Now + " step 3");

            BuildBottom();

            //Console.WriteLine(DateTime.Now + " step 4");


            Control.style.padding = "2em";

            Header = new IHTMLElement(IHTMLElement.HTMLElementEnum.h2);
            Header.innerText = "work schedule".Localize();

            var h4 = new IHTMLElement(IHTMLElement.HTMLElementEnum.h4);
            h4.style.Float = IStyle.FloatEnum.right;
            h4.innerText = date.Year + " / " + date.Month;

            var br = new IHTMLBreak();
            br.style.clear = "both";

            var close = new IHTMLAnchor("close!".Localize());
            close.className = "noprint";

            close.onclick +=
                ev =>
                {
                    ev.PreventDefault();

                    this.Control.Dispose();
                };

            close.style.Float = IStyle.FloatEnum.right;

            var c = new IHTMLElement(IHTMLElement.HTMLElementEnum.center, close, Header, h4, br, this.ScheduleTable);

            c.AttachTo(this.Control);


        }
        public void Initialize(IHTMLElement Menu, Func<IHTMLImage, string, Type, Action<Type>, IHTMLElement> ConvertImageToControl)
        {
            var List = new IHTMLElement(IHTMLElement.HTMLElementEnum.ol).AttachTo(Menu);

            var ApplicationsWithLoadingImagesQuery =
                from t in Applications
                let assembly = t.Assembly.GetName().Name
                let preview = "assets/" + assembly + "/Preview.png"
                let image = new IHTMLImage(preview)
                orderby t.Name
                select new { t, assembly, preview, image };

            var ApplicationsWithLoadingImages = ApplicationsWithLoadingImagesQuery.ToArray();

            var LoadingMessage = new IHTMLDiv().AttachTo(Menu);

            var DoneLoading = 500.Until(
                t =>
                {
                    var count = ApplicationsWithLoadingImages.Count(i => !i.image.complete);

                    LoadingMessage.innerText = count + " images are still loading...";

                    return (count == 0 || t.Counter == 6);
                }
            );

            Func<Point> GetCenter =
                () => new Point(Native.Window.Width / 2, Native.Window.Height / 2);

            Action<Type> TypeClicked = t => { };

            DoneLoading +=
                delegate
                {
                    var query = from i in ApplicationsWithLoadingImages
                                let hasimage = i.image.complete && i.image.width > 0
                                select new { i.image, i.t, i.assembly, hasimage, i.preview }; ;

                    var WithImages =
                        from i in query
                        where i.hasimage
                        select i;


                    var WithoutImages =
                        from i in query
                        where !i.hasimage
                        select i;

                    #region WithImages
                    DoneLoading = WithImages.ForEachAtInterval(50,
                        v =>
                        {
                            LoadingMessage.innerText = v.t.Name;

                            var href = v.t.Name + ".htm";

                            var r = ConvertImageToControl(v.image, href, v.t, TypeClicked);

                            r.AttachTo(Menu);

                        }
                    );
                    #endregion

                    DoneLoading +=
                        delegate
                        {
                            LoadingMessage.Dispose();

                            var clr = new IHTMLBreak();

                            clr.style.clear = "both";
                            clr.AttachTo(Menu);

                            foreach (var v in WithoutImages)
                            {
                                new IHTMLDiv("image not found: " + v.preview).AttachTo(Menu);
                            }


                            "script".DisposeElementsByTagName();
                            "noscript".DisposeElementsByTagName();

                            
                        };

                };

            TypeClicked +=
                t =>
                {
                    Menu.Dispose();

                    try
                    {
                        Activator.CreateInstance(t);
                    }
                    catch (Exception exc)
                    {
                        Native.Window.alert("Error: " + exc.Message);

                        Menu.AttachToDocument();
                    }
                };

        }