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;
        }