=====================
Date and Time Widgets
=====================

The ``collective.z3cform.datetimewidget`` library provides a form framework
and widgets. This document ensures that we implement a widget for Date and
Datetime field defined in ``zope.schema``. Take a look at the different widget 
doctest files for more information about the widgets.

  >>> import zope.schema
  >>> from collective.z3cform.datetimewidget import widget

Let's setup all required adapters using zcml. This makes sure we test the real
configuration.

  >>> from zope.configuration import xmlconfig
  >>> import zope.component
  >>> import zope.app.component
  >>> import z3c.form
  >>> import collective.z3cform.datetimewidget
  >>> xmlconfig.XMLConfig('meta.zcml', zope.component)()
  >>> xmlconfig.XMLConfig('meta.zcml', zope.app.component)()
  >>> xmlconfig.XMLConfig('meta.zcml', z3c.form)()
  >>> xmlconfig.XMLConfig('configure.zcml', collective.z3cform.datetimewidget)()

also define a helper method for test the widgets:

  >>> from z3c.form import interfaces
  >>> from z3c.form.testing import TestRequest
  >>> from zope.i18n.locales import locales
  >>> def setupWidget(field):
  ...     request = TestRequest(HTTP_ACCEPT_LANGUAGE = 'en')
  ...     widget = zope.component.getMultiAdapter((field, request),
  ...         interfaces.IFieldWidget)
  ...     widget.id = 'foo'
  ...     widget.name = 'bar'
  ...     return widget

Date
----

  >>> import datetime
  >>> field = zope.schema.Date(default=datetime.date(2007, 4, 1))
  >>> widget = setupWidget(field)
  >>> widget.update()
  >>> print widget.render()
  <input type="text" id="foo-day" name="bar-day"
         class="date-widget required date-field" size="2"
         maxlength="2" value="1" /> /
  <select id="foo-month" name="bar-month"
          class="date-widget required date-field">
      <option value="1">January</option>
      <option value="2">February</option>
      <option value="3">March</option>
      <option value="4" selected="selected">April</option>
      <option value="5">May</option>
      <option value="6">June</option>
      <option value="7">July</option>
      <option value="8">August</option>
      <option value="9">September</option>
      <option value="10">October</option>
      <option value="11">November</option>
      <option value="12">December</option>
  </select> /
  <input type="text" id="foo-year" name="bar-year"
         class="date-widget required date-field" alt=""
         accesskey="" size="4" maxlength="4" value="2007" />
  <input name="bar-empty-marker" type="hidden" value="1" />

  >>> widget.mode = interfaces.DISPLAY_MODE
  >>> print widget.render()
  <span id="foo" class="date-widget required date-field">4/1/07</span>

  >>> widget.mode = interfaces.HIDDEN_MODE
  >>> print widget.render()
  <input type="hidden" id="foo" name="bar"
           class="hidden-widget" value="4/1/07" />


Datetime
--------

  >>> field = zope.schema.Datetime(default=datetime.datetime(2007, 4, 1, 12))
  >>> widget = setupWidget(field)
  >>> widget.update()
  >>> print widget.render()
  <input type="text" id="foo-day" name="bar-day"
           class="datetime-widget required datetime-field"
           size="2" maxlength="2" value="1" /> /
    <select id="foo-month" name="bar-month"
            class="datetime-widget required datetime-field">
        <option value="1">January</option>
        <option value="2">February</option>
        <option value="3">March</option>
        <option value="4" selected="selected">April</option>
        <option value="5">May</option>
        <option value="6">June</option>
        <option value="7">July</option>
        <option value="8">August</option>
        <option value="9">September</option>
        <option value="10">October</option>
        <option value="11">November</option>
        <option value="12">December</option>
    </select> /
    <input type="text" id="foo-year" name="bar-year"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="4" maxlength="4"
           value="2007" /> &nbsp;
    <input type="text" id="foo-hour" name="bar-hour"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="2" maxlength="2" value="12" /> :
    <input type="text" id="foo-min" name="bar-min"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="2" maxlength="2" value="00" />
    <input name="bar-empty-marker" type="hidden" value="1" />

  >>> widget.ampm = True
  >>> print widget.render()
  <input type="text" id="foo-day" name="bar-day"
           class="datetime-widget required datetime-field"
           size="2" maxlength="2" value="1" /> /
    <select id="foo-month" name="bar-month"
            class="datetime-widget required datetime-field">
        <option value="1">January</option>
        <option value="2">February</option>
        <option value="3">March</option>
        <option value="4" selected="selected">April</option>
        <option value="5">May</option>
        <option value="6">June</option>
        <option value="7">July</option>
        <option value="8">August</option>
        <option value="9">September</option>
        <option value="10">October</option>
        <option value="11">November</option>
        <option value="12">December</option>
    </select> /
    <input type="text" id="foo-year" name="bar-year"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="4" maxlength="4"
           value="2007" /> &nbsp;
    <input type="text" id="foo-hour" name="bar-hour"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="2" maxlength="2" value="12" /> :
    <input type="text" id="foo-min" name="bar-min"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="2" maxlength="2" value="00" />
    <select id="foo-month" name="bar-month"
            class="datetime-widget required datetime-field">
        <option value="AM">AM</option>
        <option value="PM" selected="selected">PM</option>
    </select>
    <input name="bar-empty-marker" type="hidden" value="1" />

  >>> widget.mode = interfaces.DISPLAY_MODE
  >>> print widget.render()
  <span id="foo"
        class="datetime-widget required datetime-field">4/1/07 12:00 PM</span>

  >>> widget.mode = interfaces.HIDDEN_MODE
  >>> print widget.render()
  <input type="hidden" id="foo" name="bar"
           class="hidden-widget" value="4/1/07 12:00 PM" />

  >>> field = zope.schema.Datetime(default=datetime.datetime(2007, 4, 1, 13))
  >>> widget = setupWidget(field)
  >>> widget.ampm = True
  >>> widget.update()
  >>> print widget.render()
  <input type="text" id="foo-day" name="bar-day"
           class="datetime-widget required datetime-field"
           size="2" maxlength="2" value="1" /> /
    <select id="foo-month" name="bar-month"
            class="datetime-widget required datetime-field">
        <option value="1">January</option>
        <option value="2">February</option>
        <option value="3">March</option>
        <option value="4" selected="selected">April</option>
        <option value="5">May</option>
        <option value="6">June</option>
        <option value="7">July</option>
        <option value="8">August</option>
        <option value="9">September</option>
        <option value="10">October</option>
        <option value="11">November</option>
        <option value="12">December</option>
    </select> /
    <input type="text" id="foo-year" name="bar-year"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="4" maxlength="4"
           value="2007" /> &nbsp;
    <input type="text" id="foo-hour" name="bar-hour"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="2" maxlength="2" value="01" /> :
    <input type="text" id="foo-min" name="bar-min"
           class="datetime-widget required datetime-field"
           alt="" accesskey="" size="2" maxlength="2" value="00" />
    <select id="foo-month" name="bar-month"
            class="datetime-widget required datetime-field">
        <option value="AM">AM</option>
        <option value="PM" selected="selected">PM</option>
    </select>
    <input name="bar-empty-marker" type="hidden" value="1" />

  >>> widget.mode = interfaces.DISPLAY_MODE
  >>> print widget.render()
  <span id="foo"
        class="datetime-widget required datetime-field">4/1/07 1:00 PM</span>

  >>> widget.mode = interfaces.HIDDEN_MODE
  >>> print widget.render()
  <input type="hidden" id="foo" name="bar"
           class="hidden-widget" value="4/1/07 1:00 PM" />

