public Worker AddWorker()
        {
            var TSettings = new ScheduleController.ToggleButtonSettings
                                {
                                    States = this.WorkerStates,


                                };

            var row = new tr();

            this.Body.insertBefore(row, this.ActualPercentageRow);

            var NameColumn = row.AddColumn();

            NameColumn.style.padding = "2px";

            var w = new ScheduleController.Worker
                {
                    Row = row,
                    NameInput = new input(HTMLInputTypeEnum.text).AttachTo(NameColumn),
                    SettingsForDays = TSettings
                }.AddTo(this.Workers);

            // disable planning on a nameless worker
            TSettings.IsEnabled = () => !w.Name.IsNullOrEmpty();

            w.Disposing += () => this.Workers.Remove(w);


            w.Days = this.days.AsRange().Select(
                i =>
                {
                    var c5 = row.AddColumn();

                    this.ApplyStyle(c5, this.date.GetDayWithinMonth(i + 1));

                    return new ScheduleController.ToggleButton
                    {
                        Settings = TSettings,
                        Control = c5,
                        Changed = () => this.UpdateActualPercentage(i)
                    }.Attach();
                }
            ).ToArray();

            w.CountColumn = row.AddColumn();

            w.CountColumn.style.padding = "2px";

            TSettings.Changed = delegate
            {
                if (w.Name.IsNullOrEmpty())
                {
                    w.CountColumn.innerText = "";

                    return;
                }

                var total = w.Days.Sum(i => i.Value.Hours);//.GetFractString();

                // compiler bug: cannot chain this call?
                var total_str = total.GetFractString();

                w.CountColumn.innerText = total_str;
            };

            TSettings.Changed();

            w.NameInput.onchange +=
                delegate
                {
                    if (WorkersChanged != null)
                        WorkersChanged();
                };

            w.NameInput.WhenNoLongerEmpty(
                delegate
                {
                    AddWorker();
                    this.UpdateActualPercentages();
                    w.SettingsForDays.Changed();
                });

            // compiler bug: cannot take implicit delegate from a type with Script(HasNoPrototype=true)
            // compiler bug: will loose parameters if statement is complex - workaround: use locals

            Func<ScheduleController.Worker, bool> IsNamelessWorker = i => i.NameInput.value.IsNullOrEmpty();

            w.NameInput.WhenNoLongerNeeded(() => this.Workers.Count(IsNamelessWorker) > 1,
                delegate
                {
                    w.Dispose();
                    this.UpdateActualPercentages();
                });

            return w;
        }
        private void BuildBottom()
        {

            #region bottom

            this.ActualPercentageRow = this.Body.AddRow();
            this.ActualPercentageRow.AddColumn();

            this.ActualPercentageColumns = this.days.AsRange().Select(
                    i =>
                    {
                        var c5 = this.ActualPercentageRow.AddColumn();

                        c5.innerHTML = "&nbsp;";

                        this.ApplyStyle(c5, this.date.GetDayWithinMonth(i + 1));

                        return c5;
                    }
            ).ToArray();



            this.TotalPercentageRow = this.Body.AddRow();
            this.TotalPercentageRow.AddColumn();

            this.TotalPercentageButtons = this.days.AsRange().Select(
                    i =>
                    {
                        var c5 = this.TotalPercentageRow.AddColumn();

                        var x = this.date.GetDayWithinMonth(i + 1);

                        this.ApplyStyle(c5, x);

                        var settings = new ScheduleController.ToggleButtonSettings
                        {
                            States = this.TotalPersentageStates,

                        };


                        var btn = new ScheduleController.ToggleButton
                        {
                            Settings = settings,
                            Control = c5,
                            Changed = () => this.UpdateActualPercentage(i),

                        }.Attach();

                        if (x.IsWeekend())
                            btn.SetValueSilently(this.TotalPersentageStates[1]);

                        return btn;
                    }
                ).ToArray();
            #endregion
        }