1/*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1.  Redistributions of source code must retain the above copyright
8 *     notice, this list of conditions and the following disclaimer.
9 * 2.  Redistributions in binary form must reproduce the above copyright
10 *     notice, this list of conditions and the following disclaimer in the
11 *     documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#include "config.h"
27#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
28#include "core/html/forms/DateTimeFieldsState.h"
29
30#include "core/html/forms/FormController.h"
31
32namespace blink {
33
34const unsigned DateTimeFieldsState::emptyValue = static_cast<unsigned>(-1);
35
36static unsigned getNumberFromFormControlState(const FormControlState& state, size_t index)
37{
38    if (index >= state.valueSize())
39        return DateTimeFieldsState::emptyValue;
40    bool parsed;
41    unsigned const value = state[index].toUInt(&parsed);
42    return parsed ? value : DateTimeFieldsState::emptyValue;
43}
44
45static DateTimeFieldsState::AMPMValue getAMPMFromFormControlState(const FormControlState& state, size_t index)
46{
47    if (index >= state.valueSize())
48        return DateTimeFieldsState::AMPMValueEmpty;
49    const String value = state[index];
50    if (value == "A")
51        return DateTimeFieldsState::AMPMValueAM;
52    if (value == "P")
53        return DateTimeFieldsState::AMPMValuePM;
54    return DateTimeFieldsState::AMPMValueEmpty;
55}
56
57DateTimeFieldsState::DateTimeFieldsState()
58    : m_year(emptyValue)
59    , m_month(emptyValue)
60    , m_dayOfMonth(emptyValue)
61    , m_hour(emptyValue)
62    , m_minute(emptyValue)
63    , m_second(emptyValue)
64    , m_millisecond(emptyValue)
65    , m_weekOfYear(emptyValue)
66    , m_ampm(AMPMValueEmpty)
67{
68}
69
70unsigned DateTimeFieldsState::hour23() const
71{
72    if (!hasHour() || !hasAMPM())
73        return emptyValue;
74    return (m_hour % 12) + (m_ampm == AMPMValuePM ? 12 : 0);
75}
76
77DateTimeFieldsState DateTimeFieldsState::restoreFormControlState(const FormControlState& state)
78{
79    DateTimeFieldsState dateTimeFieldsState;
80    dateTimeFieldsState.setYear(getNumberFromFormControlState(state, 0));
81    dateTimeFieldsState.setMonth(getNumberFromFormControlState(state, 1));
82    dateTimeFieldsState.setDayOfMonth(getNumberFromFormControlState(state, 2));
83    dateTimeFieldsState.setHour(getNumberFromFormControlState(state, 3));
84    dateTimeFieldsState.setMinute(getNumberFromFormControlState(state, 4));
85    dateTimeFieldsState.setSecond(getNumberFromFormControlState(state, 5));
86    dateTimeFieldsState.setMillisecond(getNumberFromFormControlState(state, 6));
87    dateTimeFieldsState.setWeekOfYear(getNumberFromFormControlState(state, 7));
88    dateTimeFieldsState.setAMPM(getAMPMFromFormControlState(state, 8));
89    return dateTimeFieldsState;
90}
91
92FormControlState DateTimeFieldsState::saveFormControlState() const
93{
94    FormControlState state;
95    state.append(hasYear() ? String::number(m_year) : emptyString());
96    state.append(hasMonth() ? String::number(m_month) : emptyString());
97    state.append(hasDayOfMonth() ? String::number(m_dayOfMonth) : emptyString());
98    state.append(hasHour() ? String::number(m_hour) : emptyString());
99    state.append(hasMinute() ? String::number(m_minute) : emptyString());
100    state.append(hasSecond() ? String::number(m_second) : emptyString());
101    state.append(hasMillisecond() ? String::number(m_millisecond) : emptyString());
102    state.append(hasWeekOfYear() ? String::number(m_weekOfYear) : emptyString());
103    if (hasAMPM())
104        state.append(m_ampm == AMPMValueAM ? "A" : "P");
105    else
106        state.append(emptyString());
107    return state;
108}
109
110} // namespace blink
111
112#endif
113