You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2017/10/17 20:44:28 UTC

[14/20] wicket git commit: WICKET-6105 Decommission wicket-datetime

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.java
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.java b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.java
deleted file mode 100644
index 6b09e7a..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.java
+++ /dev/null
@@ -1,890 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.extensions.yui.calendar;
-
-import java.text.DateFormatSymbols;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.Component;
-import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.ajax.AjaxEventBehavior;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.datetime.markup.html.form.DateTextField;
-import org.apache.wicket.extensions.yui.YuiLib;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
-import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider;
-import org.apache.wicket.request.Response;
-import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
-import org.apache.wicket.request.resource.JavaScriptResourceReference;
-import org.apache.wicket.request.resource.PackageResourceReference;
-import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.convert.converter.DateConverter;
-import org.apache.wicket.util.lang.Objects;
-import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.template.PackageTextTemplate;
-import org.apache.wicket.util.template.TextTemplate;
-import org.joda.time.DateTime;
-
-/**
- * Pops up a YUI calendar component so that the user can select a date. On selection, the date is
- * set in the component it is coupled to, after which the popup is closed again. This behavior can
- * only be used with components that either implement {@link ITextFormatProvider} or that use
- * {@link DateConverter} configured with an instance of {@link SimpleDateFormat} (like Wicket's
- * default configuration has).<br/>
- * 
- * To use, simply add a new instance to your component, which would typically a TextField, like
- * {@link DateTextField}.<br/>
- * 
- * The CalendarNavigator can be configured by overriding {@link #configure(java.util.Map, org.apache.wicket.markup.head.IHeaderResponse, java.util.Map)} and setting the
- * property or by returning <code>true</code> for {@link #enableMonthYearSelection()}.
- * 
- * @see <a
- *      href="http://developer.yahoo.com/yui/calendar/">http://developer.yahoo.com/yui/calendar/</a>
- * 
- * @author eelcohillenius
- */
-public class DatePicker extends Behavior
-{
-
-	/**
-	 * Exception thrown when the bound component does not produce a format this date picker can work
-	 * with.
-	 */
-	private static final class UnableToDetermineFormatException extends WicketRuntimeException
-	{
-		private static final long serialVersionUID = 1L;
-
-		public UnableToDetermineFormatException()
-		{
-			super("This behavior can only be added to components that either implement " +
-				ITextFormatProvider.class.getName() +
-				" AND produce a non-null format, or that use" +
-				" converters that this DatePicker can use to determine" +
-				" the pattern being used. Alternatively, you can extend " +
-				" the DatePicker and override getDatePattern to provide your own.");
-		}
-	}
-
-	/**
-	 * Format to be used when configuring YUI calendar. Can be used when using the
-	 * &quot;selected&quot; property.
-	 */
-	// See wicket-1988: SimpleDateFormat is not thread safe. Do not use static final
-	// See wicket-2525: SimpleDateFormat consumes a lot of memory
-	public static String FORMAT_DATE = "MM/dd/yyyy";
-
-	/**
-	 * For specifying which page (month/year) to show in the calendar, use this format for the date.
-	 * This is to be used together with the property &quot;pagedate&quot;
-	 */
-	// See wicket-1988: SimpleDateFormat is not thread safe. Do not use static final
-	// See wicket-2525: SimpleDateFormat consumes a lot of memory
-	public static String FORMAT_PAGEDATE = "MM/yyyy";
-
-	private static final ResourceReference YUI = new JavaScriptResourceReference(YuiLib.class, "");
-
-	private static final ResourceReference WICKET_DATE = new JavaScriptResourceReference(
-		DatePicker.class, "wicket-date.js");
-
-	private static final long serialVersionUID = 1L;
-
-	/** The target component. */
-	private Component component;
-
-	private boolean showOnFieldClick = false;
-
-	/**
-	 * A setting that decides whether to close the date picker when the user clicks somewhere else
-	 * on the document.
-	 */
-	private boolean autoHide = false;
-
-	/**
-	 *  The string to use for the close button label.
-	 */
-	private String closeLabel = "";
-
-	/**
-	 * Construct.
-	 */
-	public DatePicker()
-	{
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void bind(final Component component)
-	{
-		this.component = component;
-		checkComponentProvidesDateFormat(component);
-		component.setOutputMarkupId(true);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void afterRender(final Component component)
-	{
-		super.afterRender(component);
-
-		// Append the span and img icon right after the rendering of the
-		// component. Not as pretty as working with a panel etc, but works
-		// for behaviors and is more efficient
-		Response response = component.getResponse();
-		response.write("\n<span class=\"yui-skin-sam\">&nbsp;<span style=\"");
-
-		if (renderOnLoad())
-		{
-			response.write("display:block;");
-		}
-		else
-		{
-			response.write("display:none;");
-			response.write("position:absolute;");
-		}
-
-		response.write("z-index: 99999;\" id=\"");
-		response.write(getEscapedComponentMarkupId());
-		response.write("Dp\"></span><img style=\"");
-		response.write(getIconStyle());
-		response.write("\" id=\"");
-		response.write(getIconId());
-		response.write("\" src=\"");
-		CharSequence iconUrl = getIconUrl();
-		response.write(Strings.escapeMarkup(iconUrl != null ? iconUrl.toString() : ""));
-		response.write("\" alt=\"");
-		CharSequence alt = getIconAltText();
-		response.write(Strings.escapeMarkup((alt != null) ? alt.toString() : ""));
-		response.write("\" title=\"");
-		CharSequence title = getIconTitle();
-		response.write(Strings.escapeMarkup((title != null) ? title.toString() : ""));
-		response.write("\"/>");
-
-		if (renderOnLoad())
-		{
-			response.write("<br style=\"clear:left;\"/>");
-		}
-		response.write("</span>");
-	}
-
-	/**
-	 * Controls whether or not datepicker will contribute YUI libraries to the page as part of its
-	 * rendering lifecycle.
-	 * 
-	 * There may be cases when the user wants to use their own version of YUI contribution code, in
-	 * those cases this method should be overridden to return <code>false</code>.
-	 * 
-	 * @return a flag whether to contribute YUI libraries to the page. {@code true} by default.
-	 */
-	protected boolean includeYUILibraries()
-	{
-		return true;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void renderHead(Component component, IHeaderResponse response)
-	{
-		super.renderHead(component, response);
-
-		if (includeYUILibraries())
-		{
-			YuiLib.load(response);
-		}
-
-		renderHeadInit(response);
-
-		// variables for the initialization script
-		Map<String, Object> variables = new HashMap<>();
-		String widgetId = getEscapedComponentMarkupId();
-		variables.put("componentId", getComponentMarkupId());
-		variables.put("widgetId", widgetId);
-		variables.put("datePattern", getDatePattern());
-		variables.put("fireChangeEvent", notifyComponentOnDateSelected());
-		variables.put("alignWithIcon", alignWithIcon());
-		variables.put("hideOnSelect", hideOnSelect());
-		variables.put("showOnFieldClick", showOnFieldClick());
-		variables.put("autoHide", autoHide());
-		variables.put("closeLabel", closeLabel());
-
-		String script = getAdditionalJavaScript();
-		if (script != null)
-		{
-			variables.put("additionalJavascript",
-				Strings.replaceAll(script, "${calendar}", "YAHOO.wicket." + widgetId + "DpJs"));
-		}
-
-		// print out the initialization properties
-		Map<String, Object> p = new LinkedHashMap<>();
-		configure(p, response, variables);
-		if (!p.containsKey("navigator") && enableMonthYearSelection())
-		{
-			p.put("navigator", Boolean.TRUE);
-		}
-
-		if (enableMonthYearSelection() && p.containsKey("pages") &&
-			Objects.longValue(p.get("pages")) > 1)
-		{
-			throw new IllegalStateException(
-				"You cannot use a CalendarGroup with month/year selection!");
-		}
-
-		// ${calendarInit}
-		StringBuilder calendarInit = new StringBuilder();
-		appendMapping(p, calendarInit);
-		variables.put("calendarInit", calendarInit.toString());
-
-		// render initialization script with the variables interpolated
-		TextTemplate datePickerJs = new PackageTextTemplate(DatePicker.class, "DatePicker.js");
-		datePickerJs.interpolate(variables);
-		response.render(OnDomReadyHeaderItem.forScript(datePickerJs.asString()));
-
-		// remove previously generated markup (see onRendered) via javascript in
-		// ajax requests to not render the yui calendar multiple times
-		component.getRequestCycle().find(IPartialPageRequestHandler.class).ifPresent(target -> {
-			String escapedComponentMarkupId = getEscapedComponentMarkupId();
-			String javascript = "var e = Wicket.$('" + escapedComponentMarkupId + "Dp" +
-				"'); if (e != null && typeof(e.parentNode) != 'undefined' && " +
-				"typeof(e.parentNode.parentNode != 'undefined')) {" +
-				"e.parentNode.parentNode.removeChild(e.parentNode);" + "YAHOO.wicket." +
-				escapedComponentMarkupId + "DpJs.destroy(); delete YAHOO.wicket." +
-				escapedComponentMarkupId + "DpJs;}";
-
-			target.prependJavaScript(javascript);
-		});
-	}
-
-	/**
-	 * Renders yui & wicket calendar js module loading. It is done only once per page.
-	 * 
-	 * @param response
-	 *            header response
-	 */
-	protected void renderHeadInit(IHeaderResponse response)
-	{
-		String key = "DatePickerInit.js";
-		if (response.wasRendered(key))
-		{
-			return;
-		}
-
-		// variables for YUILoader
-		Map<String, Object> variables = new HashMap<>();
-		variables.put("basePath",
-			Strings.stripJSessionId(RequestCycle.get().urlFor(YUI, null).toString()) + "/");
-		variables.put("Wicket.DateTimeInit.DatePath", RequestCycle.get().urlFor(WICKET_DATE, null));
-
-		if (Application.get().usesDevelopmentConfig())
-		{
-			variables.put("filter", "filter: \"RAW\",");
-			variables.put("allowRollup", false);
-		}
-		else
-		{
-			variables.put("filter", "");
-			variables.put("allowRollup", true);
-		}
-
-		TextTemplate template = new PackageTextTemplate(DatePicker.class, key);
-		response.render(OnDomReadyHeaderItem.forScript(template.asString(variables)));
-
-		response.markRendered(key);
-	}
-
-	/**
-	 * Check that this behavior can get a date format out of the component it is coupled to. It
-	 * checks whether {@link #getDatePattern()} produces a non-null value. If that method returns
-	 * null, and exception will be thrown
-	 * 
-	 * @param component
-	 *            the component this behavior is being coupled to
-	 * @throws UnableToDetermineFormatException
-	 *             if this date picker is unable to determine a format.
-	 */
-	private void checkComponentProvidesDateFormat(final Component component)
-	{
-		if (getDatePattern() == null)
-		{
-			throw new UnableToDetermineFormatException();
-		}
-	}
-
-	/**
-	 * Set widget property if the array is null and has a length greater than 0.
-	 * 
-	 * @param widgetProperties
-	 * @param key
-	 * @param array
-	 */
-	private void setWidgetProperty(final Map<String, Object> widgetProperties, final String key,
-		final String[] array)
-	{
-		if (array != null && array.length > 0)
-		{
-			widgetProperties.put(key, array);
-		}
-	}
-
-	/**
-	 * Whether to position the date picker relative to the trigger icon.
-	 * 
-	 * @return If true, the date picker is aligned with the left position of the icon, and with the
-	 *         top right under. If false, the date picker will skip positioning and will let you do
-	 *         the positioning yourself. Returns true by default.
-	 */
-	protected boolean alignWithIcon()
-	{
-		return true;
-	}
-
-	/**
-	 * Gives overriding classes the option of adding (or even changing/ removing) configuration
-	 * properties for the javascript widget. See <a
-	 * href="http://developer.yahoo.com/yui/calendar/">the widget's documentation</a> for the
-	 * available options. If you want to override/ remove properties, you should call
-	 * super.configure(properties) first. If you don't call that, be aware that you will have to
-	 * call {@link #localize(java.util.Map, org.apache.wicket.markup.head.IHeaderResponse, java.util.Map)} manually if you like localized strings to be added.
-	 * 
-	 * @param widgetProperties
-	 *            the current widget properties
-	 * @param response
-	 *            the header response
-	 * @param initVariables
-	 *            variables passed to the Wicket.DateTime.init() js method
-	 */
-	protected void configure(final Map<String, Object> widgetProperties,
-		final IHeaderResponse response, final Map<String, Object> initVariables)
-	{
-		widgetProperties.put("close", true);
-
-		// localize date fields
-		localize(widgetProperties, response, initVariables);
-
-		Object modelObject = component.getDefaultModelObject();
-		// null and cast check
-		if (modelObject instanceof Date)
-		{
-			Date date = (Date)modelObject;
-			widgetProperties.put("selected", new SimpleDateFormat(FORMAT_DATE).format(date));
-			widgetProperties.put("pagedate", new SimpleDateFormat(FORMAT_PAGEDATE).format(date));
-		}
-	}
-
-	/**
-	 * Filter all empty elements (workaround for {@link DateFormatSymbols} returning arrays with
-	 * empty elements).
-	 * 
-	 * @param stringArray
-	 *            array to filter
-	 * @return filtered array (without null or empty string elements)
-	 */
-	protected final String[] filterEmpty(String[] stringArray)
-	{
-		if (stringArray == null)
-		{
-			return null;
-		}
-
-		List<String> list = new ArrayList<>(stringArray.length);
-		for (String string : stringArray)
-		{
-			if (!Strings.isEmpty(string))
-			{
-				list.add(string);
-			}
-		}
-		return list.toArray(new String[list.size()]);
-	}
-
-	/**
-	 * Gets the id of the component that the calendar widget will get attached to.
-	 * 
-	 * @return The DOM id of the component
-	 */
-	protected final String getComponentMarkupId()
-	{
-		return component.getMarkupId();
-	}
-
-	/**
-	 * Gets the date pattern to use for putting selected values in the coupled component.
-	 * 
-	 * @return The date pattern
-	 */
-	protected String getDatePattern()
-	{
-		String format = null;
-		if (component instanceof ITextFormatProvider)
-		{
-			format = ((ITextFormatProvider)component).getTextFormat();
-			// it is possible that components implement ITextFormatProvider but
-			// don't provide a format
-		}
-
-		if (format == null)
-		{
-			IConverter<?> converter = component.getConverter(DateTime.class);
-			if (!(converter instanceof DateConverter))
-			{
-				converter = component.getConverter(Date.class);
-			}
-			format = ((SimpleDateFormat)((DateConverter)converter).getDateFormat(component.getLocale())).toPattern();
-		}
-
-		return format;
-	}
-
-	/**
-	 * Gets the escaped DOM id that the calendar widget will get attached to. All non word
-	 * characters (\W) will be removed from the string.
-	 * 
-	 * @return The DOM id of the calendar widget - same as the component's markup id + 'Dp'}
-	 */
-	protected final String getEscapedComponentMarkupId()
-	{
-		return component.getMarkupId().replaceAll("\\W", "");
-	}
-
-	/**
-	 * Gets the id of the icon that triggers the popup.
-	 * 
-	 * @return The id of the icon
-	 */
-	protected final String getIconId()
-	{
-		return getEscapedComponentMarkupId() + "Icon";
-	}
-
-	/**
-	 * Gets the style of the icon that triggers the popup.
-	 * 
-	 * @return The style of the icon, e.g. 'cursor: point' etc.
-	 */
-	protected String getIconStyle()
-	{
-		return "cursor: pointer; border: none;";
-	}
-
-	/**
-	 * Gets the title attribute of the datepicker icon
-	 * 
-	 * @return text
-	 */
-	protected CharSequence getIconTitle()
-	{
-		return "";
-	}
-
-	/**
-	 * Gets the icon alt text for the datepicker icon
-	 * 
-	 * @return text
-	 */
-	protected CharSequence getIconAltText()
-	{
-		return "";
-	}
-
-	/**
-	 * Gets the url for the popup button. Users can override to provide their own icon URL.
-	 * 
-	 * @return the url to use for the popup button/ icon
-	 */
-	protected CharSequence getIconUrl()
-	{
-		return RequestCycle.get().urlFor(
-			new ResourceReferenceRequestHandler(new PackageResourceReference(DatePicker.class,
-				"icon1.gif")));
-	}
-
-	/**
-	 * Gets the locale that should be used to configure this widget.
-	 * 
-	 * @return By default the locale of the bound component.
-	 */
-	protected Locale getLocale()
-	{
-		return component.getLocale();
-	}
-
-	/**
-	 * Configure the localized strings for the datepicker widget. This implementation uses
-	 * {@link DateFormatSymbols} and some slight string manipulation to get the strings for months
-	 * and week days. Also, the first week day is set according to the {@link Locale} returned by
-	 * {@link #getLocale()}. It should work well for most locales.
-	 * <p>
-	 * This method is called from {@link #configure(java.util.Map, org.apache.wicket.markup.head.IHeaderResponse, java.util.Map)} and can be overridden if
-	 * you want to customize setting up the localized strings but are happy with the rest of
-	 * {@link #configure(java.util.Map, org.apache.wicket.markup.head.IHeaderResponse, java.util.Map)}'s behavior. Note that you can call (overridable)
-	 * method {@link #getLocale()} to get the locale that should be used for setting up the widget.
-	 * </p>
-	 * <p>
-	 * See YUI Calendar's <a href="http://developer.yahoo.com/yui/examples/calendar/germany/1.html">
-	 * German</a> and <a
-	 * href="http://developer.yahoo.com/yui/examples/calendar/japan/1.html">Japanese</a> examples
-	 * for more info.
-	 * </p>
-	 * 
-	 * @param widgetProperties
-	 *            the current widget properties
-	 * @param response
-	 *            the header response
-	 * @param initVariables
-	 *            variables passed to the Wicket.DateTime.init() js method
-	 */
-	protected void localize(Map<String, Object> widgetProperties, IHeaderResponse response,
-		Map<String, Object> initVariables)
-	{
-		Locale locale = getLocale();
-		String key = "Wicket.DateTimeInit.CalendarI18n[\"" + locale.toString() + "\"]";
-		initVariables.put("i18n", key);
-
-		if (response.wasRendered(key))
-		{
-			return;
-		}
-
-		DateFormatSymbols dfSymbols = DateFormatSymbols.getInstance(locale);
-		if (dfSymbols == null)
-		{
-			dfSymbols = new DateFormatSymbols(locale);
-		}
-
-		Map<String, Object> i18nVariables = new LinkedHashMap<>();
-		setWidgetProperty(i18nVariables, "MONTHS_SHORT", filterEmpty(dfSymbols.getShortMonths()));
-		setWidgetProperty(i18nVariables, "MONTHS_LONG", filterEmpty(dfSymbols.getMonths()));
-		setWidgetProperty(i18nVariables, "WEEKDAYS_MEDIUM",
-			filterEmpty(dfSymbols.getShortWeekdays()));
-		setWidgetProperty(i18nVariables, "WEEKDAYS_LONG", filterEmpty(dfSymbols.getWeekdays()));
-
-		i18nVariables.put("START_WEEKDAY", getFirstDayOfWeek(locale));
-
-		if (Locale.SIMPLIFIED_CHINESE.equals(locale) || Locale.TRADITIONAL_CHINESE.equals(locale))
-		{
-			setWidgetProperty(i18nVariables, "WEEKDAYS_1CHAR",
-				filterEmpty(substring(dfSymbols.getShortWeekdays(), 2, 1)));
-			i18nVariables.put("WEEKDAYS_SHORT",
-				filterEmpty(substring(dfSymbols.getShortWeekdays(), 2, 1)));
-		}
-		else
-		{
-			setWidgetProperty(i18nVariables, "WEEKDAYS_1CHAR",
-				filterEmpty(substring(dfSymbols.getShortWeekdays(), 0, 1)));
-			setWidgetProperty(i18nVariables, "WEEKDAYS_SHORT",
-				filterEmpty(substring(dfSymbols.getShortWeekdays(), 0, 2)));
-		}
-
-		StringBuilder i18n = new StringBuilder(key);
-		i18n.append('=');
-		appendMapping(i18nVariables, i18n);
-		i18n.append(';');
-
-		response.render(OnDomReadyHeaderItem.forScript(i18n.toString()));
-
-		response.wasRendered(key);
-	}
-
-	/**
-	  * Gets the first day of week of a given locale.
-	  *
-	  * @return By default the first day of week accordingly to Calendar class.
-	  */
-	protected int getFirstDayOfWeek(Locale locale)
-	{
-		return Calendar.getInstance(locale).getFirstDayOfWeek() - 1;
-	}
-
-	/**
-	 * Whether to notify the associated component when a date is selected. Notifying is done by
-	 * calling the associated component's onchange JavaScript event handler. You can for instance
-	 * attach an {@link AjaxEventBehavior} to that component to get a call back to the server. The
-	 * default is true.
-	 * 
-	 * @return if true, notifies the associated component when a date is selected
-	 */
-	protected boolean notifyComponentOnDateSelected()
-	{
-		return true;
-	}
-
-	/**
-	 * Makes a copy of the provided array and for each element copy the substring 0..len to the new
-	 * array
-	 * 
-	 * @param array
-	 *            array to copy from
-	 * @param len
-	 *            size of substring for each element to copy
-	 * @return copy of the array filled with substrings.
-	 */
-	protected final String[] substring(final String[] array, final int len)
-	{
-		return substring(array, 0, len);
-	}
-
-	/**
-	 * Makes a copy of the provided array and for each element copy the substring 0..len to the new
-	 * array
-	 * 
-	 * @param array
-	 *            array to copy from
-	 * @param start
-	 *            start position of the substring
-	 * @param len
-	 *            size of substring for each element to copy
-	 * @return copy of the array filled with substrings.
-	 */
-	protected final String[] substring(final String[] array, final int start, final int len)
-	{
-		if (array != null)
-		{
-			String[] copy = new String[array.length];
-			for (int i = 0; i < array.length; i++)
-			{
-				String el = array[i];
-				if (el != null)
-				{
-					if (el.length() > (start + len))
-					{
-						copy[i] = el.substring(start, start + len);
-					}
-					else
-					{
-						copy[i] = el;
-					}
-				}
-			}
-			return copy;
-		}
-		return null;
-	}
-
-	/**
-	 * Indicates whether plain text is rendered or two select boxes are used to allow direct
-	 * selection of month and year.
-	 * 
-	 * @return <code>true</code> if select boxes should be rendered to allow month and year
-	 *         selection.<br/>
-	 *         <code>false</code> to render just plain text.
-	 */
-	protected boolean enableMonthYearSelection()
-	{
-		return false;
-	}
-
-	/**
-	 * Indicates whether the calendar should be hidden after a date was selected.
-	 * 
-	 * @return <code>true</code> (default) if the calendar should be hidden after the date selection <br/>
-	 *         <code>false</code> if the calendar should remain visible after the date selection.
-	 */
-	protected boolean hideOnSelect()
-	{
-		return true;
-	}
-
-	/**
-	 * Indicates whether the calendar should be shown when corresponding text input is clicked.
-	 * 
-	 * @return <code>true</code> <br/>
-	 *         <code>false</code> (default)
-	 */
-	protected boolean showOnFieldClick()
-	{
-		return showOnFieldClick;
-	}
-
-	/**
-	 * @param show
-	 *            a flag indicating whether to show the picker on click event
-	 * @return {@code this} instance to be able to chain calls
-	 * @see {@link #showOnFieldClick()}
-	 */
-	public DatePicker setShowOnFieldClick(boolean show)
-	{
-		showOnFieldClick = show;
-		return this;
-	}
-
-
-	/**
-	 * Indicates whether the calendar should be hidden when the user clicks on an area of the
-	 * document outside of the dialog.
-	 * 
-	 * @return <code>true</code> <br/>
-	 *         <code>false</code> (default)
-	 */
-	protected boolean autoHide()
-	{
-		return autoHide;
-	}
-
-	/**
-	 * @param autoHide
-	 *            a flag indicating whether to hide the picker on click event
-	 * @return {@code this} instance to be able to chain calls
-	 * @see {@link #autoHide()}
-	 */
-	public DatePicker setAutoHide(boolean autoHide)
-	{
-		this.autoHide = autoHide;
-		return this;
-	}
-
-	/**
-	 * The string to use for the close button label.
-	 *
-	 * @return label
-	 */
-	protected String closeLabel()
-	{
-		return closeLabel;
-	}
-
-	/**
-	 * @param closeLabel
-	 *            The string to use for the close button label.
-	 */
-	public void setCloseLabel(String closeLabel)
-	{
-		this.closeLabel = closeLabel;
-	}
-
-	/**
-	 * Indicates whether the calendar should be rendered after it has been loaded.
-	 * 
-	 * @return <code>true</code> if the calendar should be rendered after it has been loaded.<br/>
-	 *         <code>false</code> (default) if it's initially hidden.
-	 */
-	protected boolean renderOnLoad()
-	{
-		return false;
-	}
-
-	/**
-	 * Override this method to further customize the YUI Calendar with additional JavaScript code.
-	 * The code returned by this method is executed right after the Calendar has been constructed
-	 * and initialized. To refer to the actual Calendar DOM object, use <code>${calendar}</code> in
-	 * your code.<br/>
-	 * See <a href="http://developer.yahoo.com/yui/calendar/">the widget's documentation</a> for
-	 * more information about the YUI Calendar.<br/>
-	 * Example:
-	 * 
-	 * <pre>
-	 * protected String getAdditionalJavaScript()
-	 * {
-	 * 	return &quot;${calendar}.addRenderer(\&quot;10/3\&quot;, ${calendar}.renderCellStyleHighlight1);&quot;;
-	 * }
-	 * </pre>
-	 * 
-	 * @return a String containing additional JavaScript code
-	 */
-	protected String getAdditionalJavaScript()
-	{
-		return "";
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public boolean isEnabled(final Component component)
-	{
-		return component.isEnabledInHierarchy();
-	}
-
-	/**
-	 * 
-	 * @param map
-	 *            the key-value pairs to be serialized
-	 * @param json
-	 *            the buffer holding the constructed json
-	 */
-	private void appendMapping(final Map<String, Object> map, final StringBuilder json)
-	{
-		json.append('{');
-		for (Iterator<Entry<String, Object>> i = map.entrySet().iterator(); i.hasNext();)
-		{
-			Entry<String, Object> entry = i.next();
-			json.append(entry.getKey());
-			Object value = entry.getValue();
-			if (value instanceof CharSequence)
-			{
-				json.append(":\"");
-				json.append(Strings.toEscapedUnicode(value.toString()));
-				json.append('"');
-			}
-			else if (value instanceof CharSequence[])
-			{
-				json.append(":[");
-				CharSequence[] valueArray = (CharSequence[])value;
-				for (int j = 0; j < valueArray.length; j++)
-				{
-					CharSequence tmpValue = valueArray[j];
-					if (j > 0)
-					{
-						json.append(',');
-					}
-					if (tmpValue != null)
-					{
-						json.append('"');
-						json.append(Strings.toEscapedUnicode(tmpValue.toString()));
-						json.append('"');
-					}
-				}
-				json.append(']');
-			}
-			else if (value instanceof Map)
-			{
-				json.append(':');
-				@SuppressWarnings("unchecked")
-				Map<String, Object> nmap = (Map<String, Object>)value;
-				appendMapping(nmap, json);
-			}
-			else
-			{
-				json.append(':');
-				json.append(Strings.toEscapedUnicode(String.valueOf(value)));
-			}
-			if (i.hasNext())
-			{
-				json.append(',');
-			}
-		}
-		json.append('}');
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.js
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.js b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.js
deleted file mode 100644
index e40e0c2..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePicker.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-Wicket.DateTimeInit.CalendarAdd(function() {
-	Wicket.DateTime.init2("${widgetId}", "${componentId}", ${calendarInit}, "${datePattern}",
-			${alignWithIcon}, ${fireChangeEvent}, ${hideOnSelect}, ${showOnFieldClick}, ${i18n}, ${autoHide}, "${closeLabel}");
-	${additionalJavascript}
-});

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePickerInit.js
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePickerInit.js b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePickerInit.js
deleted file mode 100644
index 61b4056..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DatePickerInit.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-if (typeof(Wicket) === 'undefined') {
-	window.Wicket = {};
-}
-if (typeof(Wicket.DateTimeInit) === 'undefined') {
-	Wicket.DateTimeInit = {};
-}
-
-Wicket.DateTimeInit.CalendarInits = [];
-Wicket.DateTimeInit.CalendarInitFinished = false;
-Wicket.DateTimeInit.CalendarI18n = {};
-Wicket.DateTimeInit.CalendarAdd = function(initFn) {
-	if (Wicket.DateTimeInit.CalendarInitFinished) {
-		// when a DatePicker is added via ajax, the loader is already finished, so
-		// we call the init function directly.
-		initFn();
-	} else {
-		// when page is rendered, all calendar components will be initialized after
-		// the required js libraries have been loaded.
-		Wicket.DateTimeInit.CalendarInits.push(initFn);
-	}
-};
-
-Wicket.DateTimeInit.YuiLoader = new YAHOO.util.YUILoader({
-	base: "${basePath}",
-	${filter}
-	allowRollup: ${allowRollup},
-	require: ["wicket-date"],
-	onSuccess: function() {
-		Wicket.DateTimeInit.CalendarInitFinished = true;
-		while (Wicket.DateTimeInit.CalendarInits.length > 0) {
-			Wicket.DateTimeInit.CalendarInits.pop()();
-		}
-	}
-});
-Wicket.DateTimeInit.YuiLoader.addModule({
-	name: "wicket-date",
-	type: "js",
-	requires: ["calendar"],
-	fullpath: "${Wicket.DateTimeInit.DatePath}"
-});
-Wicket.DateTimeInit.YuiLoader.insert();

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html
deleted file mode 100644
index c714db3..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-   Licensed to the Apache Software Foundation (ASF) under one or more
-   contributor license agreements.  See the NOTICE file distributed with
-   this work for additional information regarding copyright ownership.
-   The ASF licenses this file to You under the Apache License, Version 2.0
-   (the "License"); you may not use this file except in compliance with
-   the License.  You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
--->
-<wicket:panel xmlns:wicket="http://wicket.apache.org">
-  <span style="white-space: nowrap;">
-    <input type="text" wicket:id="date" size="12" />
-  	<input type="text" wicket:id="hours" size="2" maxlength="2" />
-   	<span wicket:id="hoursSeparator">&#160;:</span>
-    <input type="text" wicket:id="minutes" size="2" maxlength="2" />
-    <select wicket:id="amOrPmChoice"></select>
-  </span>
-</wicket:panel>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java
deleted file mode 100644
index ecab7b6..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.extensions.yui.calendar;
-
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-import org.apache.wicket.Session;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.core.request.ClientInfo;
-import org.apache.wicket.datetime.markup.html.form.DateTextField;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.FormComponentPanel;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.protocol.http.request.WebClientInfo;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.convert.converter.IntegerConverter;
-import org.apache.wicket.validation.validator.RangeValidator;
-import org.joda.time.DateTimeFieldType;
-import org.joda.time.DateTimeZone;
-import org.joda.time.MutableDateTime;
-import org.joda.time.format.DateTimeFormat;
-
-/**
- * Works on a {@link java.util.Date} object. Displays a date field and a {@link DatePicker}, a field
- * for hours and a field for minutes, and an AM/PM field. The format (12h/24h) of the hours field
- * depends on the time format of this {@link DateTimeField}'s {@link Locale}, as does the visibility
- * of the AM/PM field (see {@link DateTimeField#use12HourFormat}).
- * <p>
- * <strong>Ajaxifying the DateTimeField</strong>: If you want to update a DateTimeField with an
- * {@link AjaxFormComponentUpdatingBehavior}, you have to attach it to the contained
- * {@link DateTextField} by overriding {@link #newDateTextField(String, PropertyModel)} and calling
- * {@link #processInput()}:
- * 
- * <pre>{@code
- *  DateTimeField dateTimeField = new DateTimeField(...) {
- *    protected DateTextField newDateTextField(String id, PropertyModel<Date> dateFieldModel)
- *    {
- *      DateTextField dateField = super.newDateTextField(id, dateFieldModel);     
- *      dateField.add(new AjaxFormComponentUpdatingBehavior("change") {
- *        protected void onUpdate(AjaxRequestTarget target) {
- *          processInput(); // let DateTimeField process input too
- *
- *          ...
- *        }
- *      });
- *      return recorder;
- *    }
- *  }
- * }</pre>
- * 
- * @author eelcohillenius
- * @see DateField for a variant with just the date field and date picker
- */
-public class DateTimeField extends FormComponentPanel<Date>
-{
-	/**
-	 * Enumerated type for different ways of handling the render part of requests.
-	 */
-	public static enum AM_PM {
-		/** */
-		AM("AM"),
-
-		/** */
-		PM("PM");
-
-		/** */
-		private String value;
-
-		AM_PM(final String name)
-		{
-			value = name;
-		}
-
-		/**
-		 * @see java.lang.Enum#toString()
-		 */
-		@Override
-		public String toString()
-		{
-			return value;
-		}
-	}
-
-	private static final long serialVersionUID = 1L;
-
-	// Component-IDs
-	protected static final String DATE = "date";
-	protected static final String HOURS = "hours";
-	protected static final String MINUTES = "minutes";
-	protected static final String AM_OR_PM_CHOICE = "amOrPmChoice";
-
-	// PropertyModel string to access getAmOrPm
-	private static final String AM_OR_PM = "amOrPm";
-
-	private static final IConverter<Integer> MINUTES_CONVERTER = new IntegerConverter() {
-		protected NumberFormat newNumberFormat(Locale locale) {
-			return new DecimalFormat("00");
-		}
-	};
-
-	// The dropdown list for AM/PM and it's associated model object
-	private DropDownChoice<AM_PM> amOrPmChoice;
-	private AM_PM amOrPm = AM_PM.AM;
-
-	// The date TextField and it's associated model object
-	// Note that any time information in date will be ignored
-	private DateTextField dateField;
-	private Date date;
-
-	// The TextField for "hours" and it's associated model object
-	private TextField<Integer> hoursField;
-	private Integer hours;
-
-	// The TextField for "minutes" and it's associated model object
-	private TextField<Integer> minutesField;
-	private Integer minutes;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param id
-	 */
-	public DateTimeField(final String id)
-	{
-		this(id, null);
-	}
-
-	/**
-	 * Construct.
-	 * 
-	 * @param id
-	 * @param model
-	 */
-	public DateTimeField(final String id, final IModel<Date> model)
-	{
-		super(id, model);
-
-		// Sets the type that will be used when updating the model for this component.
-		setType(Date.class);
-
-		// Create and add the date TextField
-		PropertyModel<Date> dateFieldModel = new PropertyModel<>(this, DATE);
-		add(dateField = newDateTextField(DATE, dateFieldModel));
-
-		// Add a date picker to the date TextField
-		dateField.add(newDatePicker());
-
-		// Create and add the "hours" TextField
-		add(hoursField = newHoursTextField(HOURS, new PropertyModel<Integer>(this, HOURS),
-			Integer.class));
-
-		// Create and add the "minutes" TextField
-		add(minutesField = newMinutesTextField(MINUTES, new PropertyModel<Integer>(this, MINUTES),
-			Integer.class));
-
-		// Create and add the "AM/PM" Listbox
-		add(amOrPmChoice = new DropDownChoice<AM_PM>(AM_OR_PM_CHOICE, new PropertyModel<AM_PM>(
-			this, AM_OR_PM), Arrays.asList(AM_PM.values())));
-
-		add(new WebMarkupContainer("hoursSeparator")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isVisible()
-			{
-				return minutesField.determineVisibility();
-			}
-		});
-	}
-
-	/**
-	 * create a new {@link TextField} instance for hours to be added to this panel.
-	 * 
-	 * @param id
-	 *            the component id
-	 * @param model
-	 *            model that should be used by the {@link TextField}
-	 * @param type
-	 *            the type of the text field
-	 * @return a new text field instance
-	 */
-	protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) {
-		TextField<Integer> hoursTextField = new TextField<>(id, model, type);
-		hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator
-			.range(1, 12));
-		hoursTextField.setLabel(new Model<>(HOURS));
-		return hoursTextField;
-	}
-
-	/**
-	 * create a new {@link TextField} instance for minutes to be added to this panel.
-	 *
-	 * @param id
-	 *            the component id
-	 * @param model
-	 *            model that should be used by the {@link TextField}
-	 * @param type
-	 *            the type of the text field
-	 * @return a new text field instance
-	 */
-	protected TextField<Integer> newMinutesTextField(final String id, IModel<Integer> model,
-		Class<Integer> type)
-	{
-		TextField<Integer> minutesField = new TextField<Integer>(id, model, type)
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected IConverter<?> createConverter(Class<?> type)
-			{
-				if (Integer.class.isAssignableFrom(type))
-				{
-					return MINUTES_CONVERTER;
-				}
-				return null;
-			}
-		};
-		minutesField.add(new RangeValidator<>(0, 59));
-		minutesField.setLabel(new Model<>(MINUTES));
-		return minutesField;
-	}
-
-	/**
-	 * 
-	 * @return The date TextField
-	 */
-	protected final DateTextField getDateTextField()
-	{
-		return dateField;
-	}
-
-	/**
-	 * Gets the amOrPm model object of the drop down choice.
-	 * 
-	 * @return amOrPm
-	 * 
-	 * @deprecated valid during rendering only
-	 */
-	public final AM_PM getAmOrPm()
-	{
-		return amOrPm;
-	}
-
-	/**
-	 * Gets the date model object for the date TextField. Any associated time information will be
-	 * ignored.
-	 * 
-	 * @return date
-	 * 
-	 * @deprecated valid during rendering only
-	 */
-	public final Date getDate()
-	{
-		return date;
-	}
-
-	/**
-	 * Gets the hours model object for the TextField
-	 * 
-	 * @return hours
-	 * 
-	 * @deprecated valid during rendering only
-	 */
-	public final Integer getHours()
-	{
-		return hours;
-	}
-
-	/**
-	 * Gets the minutes model object for the TextField
-	 * 
-	 * @return minutes
-	 * 
-	 * @deprecated valid during rendering only
-	 */
-	public final Integer getMinutes()
-	{
-		return minutes;
-	}
-
-	/**
-	 * Gives overriding classes the option of adding (or even changing/ removing) configuration
-	 * properties for the javascript widget. See <a
-	 * href="http://developer.yahoo.com/yui/calendar/">the widget's documentation</a> for the
-	 * available options. If you want to override/ remove properties, you should call
-	 * super.configure(properties) first. If you don't call that, be aware that you will have to
-	 * call {@link #configure(java.util.Map)} manually if you like localized strings to be added.
-	 * 
-	 * @param widgetProperties
-	 *            the current widget properties
-	 */
-	protected void configure(Map<String, Object> widgetProperties)
-	{
-	}
-
-	@Override
-	public String getInput()
-	{
-		// since we override convertInput, we can let this method return a value
-		// that is just suitable for error reporting
-		return dateField.getInput() + ", " + hoursField.getInput() + ":" + minutesField.getInput();
-	}
-
-	/**
-	 * Sets the amOrPm model object associated with the drop down choice.
-	 * 
-	 * @param amOrPm
-	 *            amOrPm
-	 */
-	public final void setAmOrPm(final AM_PM amOrPm)
-	{
-		this.amOrPm = amOrPm;
-	}
-
-	/**
-	 * Sets the date model object associated with the date TextField. It does not affect hours or
-	 * minutes.
-	 * 
-	 * @param date
-	 *            date
-	 */
-	public final void setDate(final Date date)
-	{
-		this.date = date;
-	}
-
-	/**
-	 * Sets hours.
-	 * 
-	 * @param hours
-	 *            hours
-	 */
-	public final void setHours(final Integer hours)
-	{
-		this.hours = hours;
-	}
-
-	/**
-	 * Sets minutes.
-	 * 
-	 * @param minutes
-	 *            minutes
-	 */
-	public final void setMinutes(final Integer minutes)
-	{
-		this.minutes = minutes;
-	}
-
-	/**
-	 * Gets the client's time zone.
-	 * 
-	 * @return The client's time zone or null
-	 */
-	protected TimeZone getClientTimeZone()
-	{
-		ClientInfo info = Session.get().getClientInfo();
-		if (info instanceof WebClientInfo)
-		{
-			return ((WebClientInfo)info).getProperties().getTimeZone();
-		}
-		return null;
-	}
-
-	/**
-	 * Sets the converted input, which is an instance of {@link Date}, possibly null. It combines
-	 * the inputs of the nested date, hours, minutes and am/pm fields and constructs a date from it.
-	 * <p>
-	 * Note that overriding this method is a better option than overriding {@link #updateModel()}
-	 * like the first versions of this class did. The reason for that is that this method can be
-	 * used by form validators without having to depend on the actual model being updated, and this
-	 * method is called by the default implementation of {@link #updateModel()} anyway (so we don't
-	 * have to override that anymore).
-	 */
-	@Override
-	public void convertInput()
-	{
-		try
-		{
-			// Get the converted input values
-			Date dateFieldInput = dateField.getConvertedInput();
-			Integer hoursInput = hoursField.getConvertedInput();
-			Integer minutesInput = minutesField.getConvertedInput();
-			AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();
-
-			if (dateFieldInput == null)
-			{
-				return;
-			}
-
-			// Get year, month and day ignoring any timezone of the Date object
-			Calendar cal = Calendar.getInstance();
-			cal.setTime(dateFieldInput);
-			int year = cal.get(Calendar.YEAR);
-			int month = cal.get(Calendar.MONTH) + 1;
-			int day = cal.get(Calendar.DAY_OF_MONTH);
-			int hours = (hoursInput == null ? 0 : hoursInput % 24);
-			int minutes = (minutesInput == null ? 0 : minutesInput);
-
-			// Use the input to create a date object with proper timezone
-			MutableDateTime date = new MutableDateTime(year, month, day, hours, minutes, 0, 0,
-				DateTimeZone.forTimeZone(getClientTimeZone()));
-
-			// Adjust for halfday if needed
-			if (use12HourFormat())
-			{
-				int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
-				date.set(DateTimeFieldType.halfdayOfDay(), halfday);
-				date.set(DateTimeFieldType.hourOfHalfday(), hours % 12);
-			}
-
-			// The date will be in the server's timezone
-			setConvertedInput(newDateInstance(date.getMillis()));
-		}
-		catch (RuntimeException e)
-		{
-			DateTimeField.this.error(e.getMessage());
-			invalid();
-		}
-	}
-
-	/**
-	 * A factory method for the DateTextField's model object.
-	 * 
-	 * @return any specialization of java.util.Date
-	 */
-	protected Date newDateInstance()
-	{
-		return new Date();
-	}
-
-	/**
-	 * A factory method for the DateTextField's model object.
-	 * 
-	 * @param time
-	 *            the time in milliseconds
-	 * @return any specialization of java.util.Date
-	 */
-	protected Date newDateInstance(long time)
-	{
-		return new Date(time);
-	}
-
-	/**
-	 * create a new {@link DateTextField} instance to be added to this panel.
-	 * 
-	 * @param id
-	 *            the component id
-	 * @param dateFieldModel
-	 *            model that should be used by the {@link DateTextField}
-	 * @return a new date text field instance
-	 */
-	protected DateTextField newDateTextField(String id, PropertyModel<Date> dateFieldModel)
-	{
-		return DateTextField.forShortStyle(id, dateFieldModel, false);
-	}
-
-	/**
-	 * @see org.apache.wicket.Component#onBeforeRender()
-	 */
-	@Override
-	protected void onBeforeRender()
-	{
-		dateField.setRequired(isRequired());
-		hoursField.setRequired(isRequired());
-		minutesField.setRequired(isRequired());
-
-		boolean use12HourFormat = use12HourFormat();
-		amOrPmChoice.setVisible(use12HourFormat);
-
-		Date modelObject = (Date)getDefaultModelObject();
-		if (modelObject == null)
-		{
-			date = null;
-			hours = null;
-			minutes = null;
-		}
-		else
-		{
-			MutableDateTime mDate = new MutableDateTime(modelObject);
-			// convert date to the client's time zone if we have that info
-			TimeZone zone = getClientTimeZone();
-			if (zone != null)
-			{
-				mDate.setZone(DateTimeZone.forTimeZone(zone));
-			}
-
-			date = mDate.toDateTime().toLocalDate().toDate();
-
-			if (use12HourFormat)
-			{
-				int hourOfHalfDay = mDate.get(DateTimeFieldType.hourOfHalfday());
-				hours = hourOfHalfDay == 0 ? 12 : hourOfHalfDay;
-			}
-			else
-			{
-				hours = mDate.get(DateTimeFieldType.hourOfDay());
-			}
-
-			amOrPm = (mDate.get(DateTimeFieldType.halfdayOfDay()) == 0) ? AM_PM.AM : AM_PM.PM;
-			minutes = mDate.getMinuteOfHour();
-		}
-
-		super.onBeforeRender();
-	}
-
-	/**
-	 * Change a date in another timezone
-	 * 
-	 * @param date
-	 *            The input date.
-	 * @param zone
-	 *            The target timezone.
-	 * @return A new converted date.
-	 */
-	public static Date changeTimeZone(Date date, TimeZone zone)
-	{
-		Calendar first = Calendar.getInstance(zone);
-		first.setTimeInMillis(date.getTime());
-
-		Calendar output = Calendar.getInstance();
-		output.set(Calendar.YEAR, first.get(Calendar.YEAR));
-		output.set(Calendar.MONTH, first.get(Calendar.MONTH));
-		output.set(Calendar.DAY_OF_MONTH, first.get(Calendar.DAY_OF_MONTH));
-		output.set(Calendar.HOUR_OF_DAY, first.get(Calendar.HOUR_OF_DAY));
-		output.set(Calendar.MINUTE, first.get(Calendar.MINUTE));
-		output.set(Calendar.SECOND, first.get(Calendar.SECOND));
-		output.set(Calendar.MILLISECOND, first.get(Calendar.MILLISECOND));
-
-		return output.getTime();
-	}
-
-	/**
-	 * Checks whether the current {@link Locale} uses the 12h or 24h time format. This method can be
-	 * overridden to e.g. always use 24h format.
-	 * 
-	 * @return true, if the current {@link Locale} uses the 12h format.<br/>
-	 *         false, otherwise
-	 */
-	protected boolean use12HourFormat()
-	{
-		String pattern = DateTimeFormat.patternForStyle("-S", getLocale());
-		return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1
-			|| pattern.indexOf('K') != -1;
-	}
-
-	/**
-	 * @return either 12 or 24, depending on the hour format of the current {@link Locale}
-	 */
-	private int getMaximumHours()
-	{
-		return getMaximumHours(use12HourFormat());
-	}
-
-	/**
-	 * Convenience method (mainly for optimization purposes), in case {@link #use12HourFormat()} has
-	 * already been stored in a local variable and thus doesn't need to be computed again.
-	 * 
-	 * @param use12HourFormat
-	 *            the hour format to use
-	 * @return either 12 or 24, depending on the parameter <code>use12HourFormat</code>
-	 */
-	private int getMaximumHours(boolean use12HourFormat)
-	{
-		return use12HourFormat ? 12 : 24;
-	}
-
-	/**
-	 * The DatePicker that gets added to the DateTimeField component. Users may override this method
-	 * with a DatePicker of their choice.
-	 * 
-	 * @return a new {@link DatePicker} instance
-	 */
-	protected DatePicker newDatePicker()
-	{
-		return new DatePicker()
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void configure(final Map<String, Object> widgetProperties,
-				final IHeaderResponse response, final Map<String, Object> initVariables)
-			{
-				super.configure(widgetProperties, response, initVariables);
-
-				DateTimeField.this.configure(widgetProperties);
-			}
-		};
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java
deleted file mode 100644
index 3d98b31..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.extensions.yui.calendar;
-
-import java.util.Date;
-import java.util.Locale;
-
-import org.apache.wicket.model.IModel;
-
-/**
- * Works on a {@link java.util.Date} object. Displays a field for hours and a field for minutes, and
- * an AM/PM field. The format (12h/24h) of the hours field depends on the time format of this
- * {@link TimeField}'s {@link Locale}, as does the visibility of the AM/PM field (see
- * {@link TimeField#use12HourFormat}).
- * 
- * @author eelcohillenius
- * @see DateField for a variant with just the date field and date picker
- */
-public class TimeField extends DateTimeField
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param id
-	 *      the component id
-	 */
-	public TimeField(String id)
-	{
-		this(id, null);
-	}
-
-	/**
-	 * Construct.
-	 * 
-	 * @param id
-	 *      the component id
-	 * @param model
-	 *      the component's model
-	 */
-	public TimeField(String id, IModel<Date> model)
-	{
-		super(id, model);
-
-		getDateTextField().setVisibilityAllowed(false);
-	}
-
-	@Override
-	public void convertInput()
-	{
-		Date modelObject = (Date)getDefaultModelObject();
-		getDateTextField().setConvertedInput(modelObject != null ? modelObject : newDateInstance());
-		super.convertInput();
-	}
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/2bb684c1/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/assets/skins/sam/calendar.css
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/assets/skins/sam/calendar.css b/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/assets/skins/sam/calendar.css
deleted file mode 100644
index 3e932f4..0000000
--- a/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/assets/skins/sam/calendar.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
-Copyright (c) 2011, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.com/yui/license.html
-version: 2.9.0
-*/
-.yui-calcontainer{position:relative;float:left;_overflow:hidden}.yui-calcontainer iframe{position:absolute;border:0;margin:0;padding:0;z-index:0;width:100%;height:100%;left:0;top:0}.yui-calcontainer iframe.fixedsize{width:50em;height:50em;top:-1px;left:-1px}.yui-calcontainer.multi .groupcal{z-index:1;float:left;position:relative}.yui-calcontainer .title{position:relative;z-index:1}.yui-calcontainer .close-icon{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden}.yui-calendar{position:relative}.yui-calendar .calnavleft{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden}.yui-calendar .calnavright{position:absolute;z-index:1;text-indent:-10000em;overflow:hidden}.yui-calendar .calheader{position:relative;width:100%;text-align:center}.yui-calcontainer .yui-cal-nav-mask{position:absolute;z-index:2;margin:0;padding:0;width:100%;height:100%;_width:0;_height:0;left:0;top:0;display:none}.yui-calcontainer .yui-cal-nav{position:absolute;z-index:3;top:0;display:none}.y
 ui-calcontainer .yui-cal-nav .yui-cal-nav-btn{display:-moz-inline-box;display:inline-block}.yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{display:block;*display:inline-block;*overflow:visible;border:0;background-color:transparent;cursor:pointer}.yui-calendar .calbody a:hover{background:inherit}p#clear{clear:left;padding-top:10px}.yui-skin-sam .yui-calcontainer{background-color:#f2f2f2;border:1px solid #808080;padding:10px}.yui-skin-sam .yui-calcontainer.multi{padding:0 5px 0 5px}.yui-skin-sam .yui-calcontainer.multi .groupcal{background-color:transparent;border:0;padding:10px 5px 10px 5px;margin:0}.yui-skin-sam .yui-calcontainer .title{background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;border-bottom:1px solid #ccc;font:100% sans-serif;color:#000;font-weight:bold;height:auto;padding:.4em;margin:0 -10px 10px -10px;top:0;left:0;text-align:left}.yui-skin-sam .yui-calcontainer.multi .title{margin:0 -5px 0 -5px}.yui-skin-sam .yui-calcontainer.withtitle{padding-to
 p:0}.yui-skin-sam .yui-calcontainer .calclose{background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -300px;width:25px;height:15px;top:.4em;right:.4em;cursor:pointer}.yui-skin-sam .yui-calendar{border-spacing:0;border-collapse:collapse;font:100% sans-serif;text-align:center;margin:0}.yui-skin-sam .yui-calendar .calhead{background:transparent;border:0;vertical-align:middle;padding:0}.yui-skin-sam .yui-calendar .calheader{background:transparent;font-weight:bold;padding:0 0 .6em 0;text-align:center}.yui-skin-sam .yui-calendar .calheader img{border:0}.yui-skin-sam .yui-calendar .calnavleft{background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -450px;width:25px;height:15px;top:0;bottom:0;left:-10px;margin-left:.4em;cursor:pointer}.yui-skin-sam .yui-calendar .calnavright{background:url(../../../../assets/skins/sam/sprite.png) no-repeat 0 -500px;width:25px;height:15px;top:0;bottom:0;right:-10px;margin-right:.4em;cursor:pointer}.yui-skin-sam .yui-calendar .calweek
 dayrow{height:2em}.yui-skin-sam .yui-calendar .calweekdayrow th{padding:0;border:0}.yui-skin-sam .yui-calendar .calweekdaycell{color:#000;font-weight:bold;text-align:center;width:2em}.yui-skin-sam .yui-calendar .calfoot{background-color:#f2f2f2}.yui-skin-sam .yui-calendar .calrowhead,.yui-skin-sam .yui-calendar .calrowfoot{color:#a6a6a6;font-size:85%;font-style:normal;font-weight:normal;border:0}.yui-skin-sam .yui-calendar .calrowhead{text-align:right;padding:0 2px 0 0}.yui-skin-sam .yui-calendar .calrowfoot{text-align:left;padding:0 0 0 2px}.yui-skin-sam .yui-calendar td.calcell{border:1px solid #ccc;background:#fff;padding:1px;height:1.6em;line-height:1.6em;text-align:center;white-space:nowrap}.yui-skin-sam .yui-calendar td.calcell a{color:#06c;display:block;height:100%;text-decoration:none}.yui-skin-sam .yui-calendar td.calcell.today{background-color:#000}.yui-skin-sam .yui-calendar td.calcell.today a{background-color:#fff}.yui-skin-sam .yui-calendar td.calcell.oom{background-col
 or:#ccc;color:#a6a6a6;cursor:default}.yui-skin-sam .yui-calendar td.calcell.oom a{color:#a6a6a6}.yui-skin-sam .yui-calendar td.calcell.selected{background-color:#fff;color:#000}.yui-skin-sam .yui-calendar td.calcell.selected a{background-color:#b3d4ff;color:#000}.yui-skin-sam .yui-calendar td.calcell.calcellhover{background-color:#426fd9;color:#fff;cursor:pointer}.yui-skin-sam .yui-calendar td.calcell.calcellhover a{background-color:#426fd9;color:#fff}.yui-skin-sam .yui-calendar td.calcell.previous{color:#e0e0e0}.yui-skin-sam .yui-calendar td.calcell.restricted{text-decoration:line-through}.yui-skin-sam .yui-calendar td.calcell.highlight1{background-color:#cf9}.yui-skin-sam .yui-calendar td.calcell.highlight2{background-color:#9cf}.yui-skin-sam .yui-calendar td.calcell.highlight3{background-color:#fcc}.yui-skin-sam .yui-calendar td.calcell.highlight4{background-color:#cf9}.yui-skin-sam .yui-calendar a.calnav{border:1px solid #f2f2f2;padding:0 4px;text-decoration:none;color:#000;zoom
 :1}.yui-skin-sam .yui-calendar a.calnav:hover{background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;border-color:#a0a0a0;cursor:pointer}.yui-skin-sam .yui-calcontainer .yui-cal-nav-mask{background-color:#000;opacity:.25;filter:alpha(opacity=25)}.yui-skin-sam .yui-calcontainer .yui-cal-nav{font-family:arial,helvetica,clean,sans-serif;font-size:93%;border:1px solid #808080;left:50%;margin-left:-7em;width:14em;padding:0;top:2.5em;background-color:#f2f2f2}.yui-skin-sam .yui-calcontainer.withtitle .yui-cal-nav{top:4.5em}.yui-skin-sam .yui-calcontainer.multi .yui-cal-nav{width:16em;margin-left:-8em}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y,.yui-skin-sam .yui-calcontainer .yui-cal-nav-m,.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{padding:5px 10px 5px 10px}.yui-skin-sam .yui-calcontainer .yui-cal-nav-b{text-align:center}.yui-skin-sam .yui-calcontainer .yui-cal-nav-e{margin-top:5px;padding:5px;background-color:#edf5ff;border-top:1px solid black;display:none}.yui-skin-s
 am .yui-calcontainer .yui-cal-nav label{display:block;font-weight:bold}
-.yui-skin-sam .yui-calcontainer .yui-cal-nav-mc{width:100%;_width:auto}.yui-skin-sam .yui-calcontainer .yui-cal-nav-y input.yui-invalid{background-color:#ffee69;border:1px solid #000}.yui-skin-sam .yui-calcontainer .yui-cal-nav-yc{width:4em}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn{border:1px solid #808080;background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 0;background-color:#ccc;margin:auto .15em}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn button{padding:0 8px;font-size:93%;line-height:2;*line-height:1.7;min-height:2em;*min-height:auto;color:#000}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default{border:1px solid #304369;background-color:#426fd9;background:url(../../../../assets/skins/sam/sprite.png) repeat-x 0 -1400px}.yui-skin-sam .yui-calcontainer .yui-cal-nav .yui-cal-nav-btn.yui-default button{color:#fff}