/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.webui.form;
import java.io.Writer;
import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import org.exoplatform.commons.utils.HTMLEntityEncoder;
import org.exoplatform.web.application.JavascriptManager;
import org.exoplatform.webui.application.WebuiRequestContext;
/**
* Created by The eXo Platform SARL Author : Tran The Trong trongtt@gmail.com Jul 14, 2006
*
* A date picker element
*/
public class UIFormDateTimeInput extends UIFormInputBase<String> {
/**
* The DateFormat
*/
private DateFormat dateFormat_;
/**
* Whether to display the full time (with hours, minutes and seconds), not only the date
*/
private boolean isDisplayTime_;
/**
* The Date Pattern. Ex: dd/mm/yyyy
*/
private String datePattern_;
/**
* List of month's name
*/
private String[] months_;
public UIFormDateTimeInput(String name, String bindField, Date date, boolean isDisplayTime) {
super(name, bindField, String.class);
setDisplayTime(isDisplayTime);
WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
formatPattern(requestContext.getLocale());
setDate(date);
}
public UIFormDateTimeInput(String name, String bindField, Date date) {
this(name, bindField, date, true);
}
/**
* By default, creates a date of format Month/Day/Year If isDisplayTime is true, adds the time of format
* Hours:Minutes:Seconds TODO : Display time depending on the locale of the client.
*
* @param isDisplayTime
*/
public void setDisplayTime(boolean isDisplayTime) {
isDisplayTime_ = isDisplayTime;
}
public void setCalendar(Calendar calendar) {
WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
formatPattern(requestContext.getLocale());
Date date = null;
if (calendar != null) {
date = calendar.getTime();
}
setDate(date);
}
private void setDate(Date date) {
if (date != null) {
value_ = dateFormat_.format(date);
} else {
value_ = null;
}
}
public Calendar getCalendar() {
try {
Calendar calendar = new GregorianCalendar();
calendar.setTime(dateFormat_.parse(value_ + " 0:0:0"));
return calendar;
} catch (ParseException e) {
return null;
}
}
private void setDatePattern_(String datePattern_) {
this.datePattern_ = datePattern_;
}
public String getDatePattern_() {
return datePattern_;
}
private void formatPattern(Locale locale) {
if (isDisplayTime_) {
dateFormat_ = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
} else {
dateFormat_ = SimpleDateFormat.getDateInstance(DateFormat.SHORT, locale);
}
// convert to unique pattern
setDatePattern_(((SimpleDateFormat) dateFormat_).toPattern());
if (!getDatePattern_().contains("yy")) {
setDatePattern_(getDatePattern_().replaceAll("y", "yy"));
}
if (!getDatePattern_().contains("yyyy")) {
setDatePattern_(getDatePattern_().replaceAll("yy", "yyyy"));
}
if (!getDatePattern_().contains("dd")) {
setDatePattern_(getDatePattern_().replaceAll("d", "dd"));
}
if (!getDatePattern_().contains("MM")) {
setDatePattern_(getDatePattern_().replaceAll("M", "MM"));
}
setDatePattern_(getDatePattern_().replaceAll("h", "H"));
if (!getDatePattern_().contains("HH")) {
setDatePattern_(getDatePattern_().replaceAll("H", "HH"));
}
if (getDatePattern_().contains("a")) {
setDatePattern_(getDatePattern_().replaceAll("a", ""));
}
dateFormat_ = new SimpleDateFormat(getDatePattern_());
DateFormatSymbols symbols = new DateFormatSymbols(locale);
months_ = symbols.getMonths();
}
@SuppressWarnings("unused")
public void decode(Object input, WebuiRequestContext context) {
if (input != null) {
value_ = ((String) input).trim();
}
}
public void processRender(WebuiRequestContext context) throws Exception {
WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
formatPattern(requestContext.getLocale());
String monthNames_ = "";
for (String month : months_) {
// remove empty element
if (!month.equals("")) {
monthNames_ += month + ",";
}
}
String value = getValue();
if (value != null && value.length() > 0) {
value = HTMLEntityEncoder.getInstance().encodeHTMLAttribute(value);
} else {
value = "";
}
JavascriptManager jsManager = context.getJavascriptManager();
jsManager.require("SHARED/uiCalendar", "uiCalendar").addScripts(
"uiCalendar.setFirstDayOfWeek(" + Calendar.getInstance(context.getLocale()).getFirstDayOfWeek() + ");");
Writer w = context.getWriter();
w.write("<input type=\"text\" onfocus='eXo.webui.UICalendar.init(this,");
w.write(String.valueOf(isDisplayTime_));
w.write(",\"");
w.write(getDatePattern_());
w.write("\"");
w.write(",\"");
w.write(value);
w.write("\"");
w.write(",\"");
w.write(monthNames_);
w.write("\"");
w.write(");' onkeyup='eXo.webui.UICalendar.show();' name='");
w.write(getName());
w.write('\'');
w.write(" value=\"");
w.write(value);
w.write('\"');
w.write(" onclick='event.cancelBubble = true' onkeydown='eXo.webui.UICalendar.onTabOut(event)'");
if (isReadOnly()) {
w.write(" readonly ");
}
renderHTMLAttributes(w);
w.write("/>");
}
}