15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/DateTimeFieldElements.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/DateTimeFieldsState.h"
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/DateComponents.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/PlatformLocale.h"
33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/CurrentTime.h"
34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/DateMath.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using blink::WebLocalizedString;
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static String queryString(WebLocalizedString::Name name)
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return Locale::defaultLocale().queryString(name);
431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
458abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeAMPMFieldElement::DateTimeAMPMFieldElement(Document& document, FieldOwner& fieldOwner, const Vector<String>& ampmLabels)
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeSymbolicFieldElement(document, fieldOwner, ampmLabels, 0, 1)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeAMPMFieldElement> DateTimeAMPMFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& ampmLabels)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, ampmPsuedoId, ("-webkit-datetime-edit-ampm-field", AtomicString::ConstructFromLiteral));
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<DateTimeAMPMFieldElement> field = adoptRef(new DateTimeAMPMFieldElement(document, fieldOwner, ampmLabels));
541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(ampmPsuedoId, queryString(WebLocalizedString::AXAMPMFieldText));
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeAMPMFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasValue())
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dateTimeFieldsState.setAMPM(valueAsInteger() ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dateTimeFieldsState.setAMPM(DateTimeFieldsState::AMPMValueEmpty);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeAMPMFieldElement::setValueAsDate(const DateComponents& date)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.hour() >= 12 ? 1 : 0);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeAMPMFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (dateTimeFieldsState.hasAMPM())
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValueAsInteger(dateTimeFieldsState.ampm());
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeDayFieldElement::DateTimeDayFieldElement(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, Range(1, 31), placeholder)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeDayFieldElement> DateTimeDayFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, dayPsuedoId, ("-webkit-datetime-edit-day-field", AtomicString::ConstructFromLiteral));
893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    RefPtr<DateTimeDayFieldElement> field = adoptRef(new DateTimeDayFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range));
901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(dayPsuedoId, queryString(WebLocalizedString::AXDayOfMonthFieldText));
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeDayFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setDayOfMonth(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeDayFieldElement::setValueAsDate(const DateComponents& date)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.monthDay());
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeDayFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasDayOfMonth()) {
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.dayOfMonth();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range().isInRange(static_cast<int>(value))) {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValueAsInteger(value);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setEmptyValue();
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHourFieldElementBase::DateTimeHourFieldElementBase(Document& document, FieldOwner& fieldOwner, const Range& range, const Range& hardLimits, const Step& step)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, hardLimits, "--", step)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHourFieldElementBase::initialize()
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, hourPsuedoId, ("-webkit-datetime-edit-hour-field", AtomicString::ConstructFromLiteral));
1301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    DateTimeNumericFieldElement::initialize(hourPsuedoId, queryString(WebLocalizedString::AXHourFieldText));
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHourFieldElementBase::setValueAsDate(const DateComponents& date)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setValueAsInteger(date.hour());
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHourFieldElementBase::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!dateTimeFieldsState.hasHour()) {
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const int hour12 = dateTimeFieldsState.hour();
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hour12 < 1 || hour12 > 12) {
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
151e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    const int hour11 = hour12 == 12 ? 0 : hour12;
152e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    const int hour23 = dateTimeFieldsState.ampm() == DateTimeFieldsState::AMPMValuePM ? hour11 + 12 : hour11;
153e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    setValueAsInteger(hour23);
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ----------------------------
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour11FieldElement::DateTimeHour11FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(0, 11), step)
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour11FieldElement> DateTimeHour11FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step)
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum >= 0);
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.maximum <= 23);
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum <= hour23Range.maximum);
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Range range(0, 11);
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hour23Range.maximum < 12)
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range = hour23Range;
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (hour23Range.minimum >= 12) {
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.minimum = hour23Range.minimum - 12;
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.maximum = hour23Range.maximum - 12;
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeHour11FieldElement> field = adoptRef(new DateTimeHour11FieldElement(document, fieldOwner, range, step));
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    field->initialize();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour11FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasValue()) {
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dateTimeFieldsState.setHour(DateTimeFieldsState::emptyValue);
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const int value = valueAsInteger();
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dateTimeFieldsState.setHour(value ? value : 12);
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour11FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior)
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    value = Range(0, 23).clampValue(value) % 12;
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateTimeNumericFieldElement::setValueAsInteger(value, eventBehavior);
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ----------------------------
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour12FieldElement::DateTimeHour12FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(1, 12), step)
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour12FieldElement> DateTimeHour12FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step)
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum >= 0);
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.maximum <= 23);
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum <= hour23Range.maximum);
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Range range(1, 12);
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hour23Range.maximum < 12)
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range = hour23Range;
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (hour23Range.minimum >= 12) {
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.minimum = hour23Range.minimum - 12;
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.maximum = hour23Range.maximum - 12;
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!range.minimum)
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.minimum = 12;
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!range.maximum)
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.maximum = 12;
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (range.minimum > range.maximum) {
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.minimum = 1;
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.maximum = 12;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeHour12FieldElement> field = adoptRef(new DateTimeHour12FieldElement(document, fieldOwner, range, step));
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    field->initialize();
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return field.release();
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour12FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dateTimeFieldsState.setHour(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour12FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    value = Range(0, 24).clampValue(value) % 12;
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateTimeNumericFieldElement::setValueAsInteger(value ? value : 12, eventBehavior);
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ----------------------------
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour23FieldElement::DateTimeHour23FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(0, 23), step)
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour23FieldElement> DateTimeHour23FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step)
247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum >= 0);
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.maximum <= 23);
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum <= hour23Range.maximum);
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeHour23FieldElement> field = adoptRef(new DateTimeHour23FieldElement(document, fieldOwner, hour23Range, step));
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    field->initialize();
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return field.release();
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour23FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!hasValue()) {
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dateTimeFieldsState.setHour(DateTimeFieldsState::emptyValue);
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const int value = valueAsInteger();
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
265e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    dateTimeFieldsState.setHour(value % 12 ? value % 12 : 12);
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dateTimeFieldsState.setAMPM(value >= 12 ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM);
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour23FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior)
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    value = Range(0, 23).clampValue(value);
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateTimeNumericFieldElement::setValueAsInteger(value, eventBehavior);
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// ----------------------------
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeHour24FieldElement::DateTimeHour24FieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeHourFieldElementBase(document, fieldOwner, range, Range(1, 24), step)
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeHour24FieldElement> DateTimeHour24FieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& hour23Range, const Step& step)
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum >= 0);
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.maximum <= 23);
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(hour23Range.minimum <= hour23Range.maximum);
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Range range(hour23Range.minimum ? hour23Range.minimum : 24, hour23Range.maximum ? hour23Range.maximum : 24);
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (range.minimum > range.maximum) {
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.minimum = 1;
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        range.maximum = 24;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeHour24FieldElement> field = adoptRef(new DateTimeHour24FieldElement(document, fieldOwner, range, step));
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    field->initialize();
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return field.release();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour24FieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!hasValue()) {
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dateTimeFieldsState.setHour(DateTimeFieldsState::emptyValue);
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const int value = valueAsInteger();
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (value == 24) {
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dateTimeFieldsState.setHour(12);
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dateTimeFieldsState.setAMPM(DateTimeFieldsState::AMPMValueAM);
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else {
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dateTimeFieldsState.setHour(value == 12 ? 12 : value % 12);
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dateTimeFieldsState.setAMPM(value >= 12 ? DateTimeFieldsState::AMPMValuePM : DateTimeFieldsState::AMPMValueAM);
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeHour24FieldElement::setValueAsInteger(int value, EventBehavior eventBehavior)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    value = Range(0, 24).clampValue(value);
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DateTimeNumericFieldElement::setValueAsInteger(value ? value : 24, eventBehavior);
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeMillisecondFieldElement::DateTimeMillisecondFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, Range(0, 999), "---", step)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeMillisecondFieldElement> DateTimeMillisecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, millisecondPsuedoId, ("-webkit-datetime-edit-millisecond-field", AtomicString::ConstructFromLiteral));
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeMillisecondFieldElement> field = adoptRef(new DateTimeMillisecondFieldElement(document, fieldOwner, range, step));
3331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(millisecondPsuedoId, queryString(WebLocalizedString::AXMillisecondFieldText));
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMillisecondFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setMillisecond(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMillisecondFieldElement::setValueAsDate(const DateComponents& date)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.millisecond());
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeMillisecondFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasMillisecond()) {
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.millisecond();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value > static_cast<unsigned>(maximum())) {
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(value);
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeMinuteFieldElement::DateTimeMinuteFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, Range(0, 59), "--", step)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeMinuteFieldElement> DateTimeMinuteFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, minutePsuedoId, ("-webkit-datetime-edit-minute-field", AtomicString::ConstructFromLiteral));
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeMinuteFieldElement> field = adoptRef(new DateTimeMinuteFieldElement(document, fieldOwner, range, step));
3741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(minutePsuedoId, queryString(WebLocalizedString::AXMinuteFieldText));
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMinuteFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setMinute(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMinuteFieldElement::setValueAsDate(const DateComponents& date)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.minute());
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeMinuteFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasMinute()) {
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.minute();
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value > static_cast<unsigned>(maximum())) {
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(value);
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range)
407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, Range(1, 12), placeholder)
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeMonthFieldElement> DateTimeMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const String& placeholder, const Range& range)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field", AtomicString::ConstructFromLiteral));
4143c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    RefPtr<DateTimeMonthFieldElement> field = adoptRef(new DateTimeMonthFieldElement(document, fieldOwner, placeholder.isEmpty() ? "--" : placeholder, range));
4151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(monthPsuedoId, queryString(WebLocalizedString::AXMonthFieldText));
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMonthFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setMonth(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeMonthFieldElement::setValueAsDate(const DateComponents& date)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.month() + 1);
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeMonthFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasMonth()) {
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.month();
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range().isInRange(static_cast<int>(value))) {
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValueAsInteger(value);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setEmptyValue();
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, Range(0, 59), "--", step)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeSecondFieldElement> DateTimeSecondFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range, const Step& step)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, secondPsuedoId, ("-webkit-datetime-edit-second-field", AtomicString::ConstructFromLiteral));
455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeSecondFieldElement> field = adoptRef(new DateTimeSecondFieldElement(document, fieldOwner, range, step));
4561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(secondPsuedoId, queryString(WebLocalizedString::AXSecondFieldText));
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSecondFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setSecond(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSecondFieldElement::setValueAsDate(const DateComponents& date)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.second());
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeSecondFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasSecond()) {
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.second();
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value > static_cast<unsigned>(maximum())) {
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(value);
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeSymbolicMonthFieldElement::DateTimeSymbolicMonthFieldElement(Document& document, FieldOwner& fieldOwner, const Vector<String>& labels, int minimum, int maximum)
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeSymbolicFieldElement(document, fieldOwner, labels, minimum, maximum)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeSymbolicMonthFieldElement> DateTimeSymbolicMonthFieldElement::create(Document& document, FieldOwner& fieldOwner, const Vector<String>& labels, int minimum, int maximum)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field", AtomicString::ConstructFromLiteral));
496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeSymbolicMonthFieldElement> field = adoptRef(new DateTimeSymbolicMonthFieldElement(document, fieldOwner, labels, minimum, maximum));
4971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(monthPsuedoId, queryString(WebLocalizedString::AXMonthFieldText));
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSymbolicMonthFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hasValue())
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dateTimeFieldsState.setMonth(DateTimeFieldsState::emptyValue);
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(valueAsInteger() < static_cast<int>(symbolsSize()));
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setMonth(valueAsInteger() + 1);
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeSymbolicMonthFieldElement::setValueAsDate(const DateComponents& date)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.month());
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
514926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeSymbolicMonthFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasMonth()) {
517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.month() - 1;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (value >= symbolsSize()) {
523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(value);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document& document, FieldOwner& fieldOwner, const Range& range)
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : DateTimeNumericFieldElement(document, fieldOwner, range, Range(DateComponents::minimumWeekNumber, DateComponents::maximumWeekNumber), "--")
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeWeekFieldElement> DateTimeWeekFieldElement::create(Document& document, FieldOwner& fieldOwner, const Range& range)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, weekPsuedoId, ("-webkit-datetime-edit-week-field", AtomicString::ConstructFromLiteral));
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<DateTimeWeekFieldElement> field = adoptRef(new DateTimeWeekFieldElement(document, fieldOwner, range));
5411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(weekPsuedoId, queryString(WebLocalizedString::AXWeekOfYearFieldText));
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeWeekFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setWeekOfYear(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeWeekFieldElement::setValueAsDate(const DateComponents& date)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.week());
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeWeekFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasWeekOfYear()) {
558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.weekOfYear();
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range().isInRange(static_cast<int>(value))) {
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValueAsInteger(value);
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setEmptyValue();
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ----------------------------
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)DateTimeYearFieldElement::DateTimeYearFieldElement(Document& document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters)
5743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    : DateTimeNumericFieldElement(document, fieldOwner, Range(parameters.minimumYear, parameters.maximumYear), Range(DateComponents::minimumYear(), DateComponents::maximumYear()), parameters.placeholder.isEmpty() ? "----" : parameters.placeholder)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_minIsSpecified(parameters.minIsSpecified)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxIsSpecified(parameters.maxIsSpecified)
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(parameters.minimumYear >= DateComponents::minimumYear());
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(parameters.maximumYear <= DateComponents::maximumYear());
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)PassRefPtr<DateTimeYearFieldElement> DateTimeYearFieldElement::create(Document& document, FieldOwner& fieldOwner, const DateTimeYearFieldElement::Parameters& parameters)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, yearPsuedoId, ("-webkit-datetime-edit-year-field", AtomicString::ConstructFromLiteral));
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<DateTimeYearFieldElement> field = adoptRef(new DateTimeYearFieldElement(document, fieldOwner, parameters));
5861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    field->initialize(yearPsuedoId, queryString(WebLocalizedString::AXYearFieldText));
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return field.release();
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int currentFullYear()
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double current = currentTimeMS();
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double utcOffset = calculateUTCOffset();
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double dstOffset = calculateDSTOffset(current, utcOffset);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute);
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    current += offset * msPerMinute;
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DateComponents date;
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    date.setMillisecondsSinceEpochForMonth(current);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return date.fullYear();
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int DateTimeYearFieldElement::defaultValueForStepDown() const
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_maxIsSpecified ? DateTimeNumericFieldElement::defaultValueForStepDown() : currentFullYear();
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int DateTimeYearFieldElement::defaultValueForStepUp() const
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_minIsSpecified ? DateTimeNumericFieldElement::defaultValueForStepUp() : currentFullYear();
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeYearFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dateTimeFieldsState.setYear(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void DateTimeYearFieldElement::setValueAsDate(const DateComponents& date)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValueAsInteger(date.fullYear());
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void DateTimeYearFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dateTimeFieldsState.hasYear()) {
626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setEmptyValue();
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned value = dateTimeFieldsState.year();
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (range().isInRange(static_cast<int>(value))) {
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValueAsInteger(value);
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setEmptyValue();
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
642