/*
 * Copyright (C) 2012 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef WebDateTimeChooserParams_h
#define WebDateTimeChooserParams_h

#include "../platform/WebRect.h"
#include "../platform/WebString.h"
#include "../platform/WebVector.h"
#include "WebDateTimeInputType.h"
#include "WebDateTimeSuggestion.h"

namespace blink {

// This class conveys various information to make date/time chooser UI.
// See WebViewClient::openDateTimeChooser.
struct WebDateTimeChooserParams {
    // The type of chooser to show.
    WebDateTimeInputType type;
    // Bounding rectangle of the requester element.
    WebRect anchorRectInScreen;
    // The current value of the requester element.
    // FIXME: Remove. Deprecated in favor of doubleValue.
    WebString currentValue;
    // The current value of the requester element as a double.
    // NaN means empty value. Should not be infinity.
    double doubleValue;
    // <datalist> option suggestions associated to the requester element. The
    // vector size might be 0.
    WebVector<WebDateTimeSuggestion> suggestions;
    // HTMLInputElement::min attribute value parsed in the valusAsNumber rule,
    // that is to say, milliseconds from the epoch for non-month types and
    // months from the epoch for month type. If the min attribute is missing,
    // this field has the hard minimum limit.
    double minimum;
    // Similar to minimum.
    double maximum;
    // Step value represented in milliseconds for non-month types, and
    // represetnted in months for month type.
    double step;
    // Step-base value represeted in milliseconds, or months.
    double stepBase;
    // True if the requester element has required attribute.
    bool isRequired;
    // True if the requester element is rendered in rtl direction.
    bool isAnchorElementRTL;

    WebDateTimeChooserParams()
        : minimum(0)
        , maximum(0)
        , step(0)
        , stepBase(0)
        , isRequired(false)
        , isAnchorElementRTL(false)
    {
    }
};

} // namespace blink

#endif
