public BXWeekScheduleHourSpanControl(BXWeekScheduleHourSpan source)
    {
        if (source == null) 
            throw new ArgumentNullException("source");

        _from = source.FromHourOfWeek;
        _till = source.TillHourOfWeek;
    }
    protected override void Render(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Id, ContainerClientID);
        writer.RenderBeginTag(HtmlTextWriterTag.Div);
        writer.AddAttribute(HtmlTextWriterAttribute.Id, DataElementClientID);
        writer.AddAttribute(HtmlTextWriterAttribute.Name, DataElementUniqueID);
        writer.AddAttribute(HtmlTextWriterAttribute.Type, "hidden");
        IList<BXWeekScheduleHourSpanControl> hourControls = HourSpans;
        if (hourControls.Count > 0)
        {
            BXWeekScheduleHourSpan[] hours = new BXWeekScheduleHourSpan[hourControls.Count];
            for (int i = 0; i < hourControls.Count; i++)
                hours[i] = hourControls[i].Item;

            BXWeekScheduleHourSpanJSONConverter hourConverter = new BXWeekScheduleHourSpanJSONConverter(CultureInfo.InvariantCulture.DateTimeFormat);
            System.Web.Script.Serialization.JavaScriptSerializer jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
            jsSerializer.RegisterConverters(new JavaScriptConverter[] { hourConverter });
            StringBuilder hoursJavascript = new StringBuilder();
            jsSerializer.Serialize(hours, hoursJavascript);

            writer.AddAttribute(HtmlTextWriterAttribute.Value, hoursJavascript.ToString(), true);
        }
        writer.RenderBeginTag(HtmlTextWriterTag.Input);
        writer.RenderEndTag();
        writer.RenderEndTag();
    }