Thanks Paul, but could you please open a JIRA issue with the problem
and upload the patch there? Then this will be tested :-) We have to
keep the bugs under control...
Regards,
Bruno
2005/9/15, Paul Klaer <[EMAIL PROTECTED]>:
> Hi,
>
> this is definitly a bug. So, here I provide the solution. Can someone
> test and commit the files please?
>
> I saw the mail in the dev list from Zhong Li:
> ---------------
> "I found how it happened. I have onload on body tag, even with simplest
> one, something like, <body onload="alert('loading');">
> ...
> Then the inputCalendar doesn't work, can't popup. so weired. "
> ---------------
>
> Since he had the same problem I checked the JavaScript behaviour in
> Firefox and debugged a little bit...
>
> This problem occures because the old JavaScript is executed in Firefox
> before the body tag "onload" is set during the render phase.
> So this variable "var jscalendarOnloadBackup = window.onload;" is only
> set to "undefined" and never with the old onload script.
>
> To solve this problem I rewrote the load script as a function in the
> "popcalendar.js" and this function is then called just before
> "jscalendarSetImageDirectory" is called inside the enclosing "body"
> element. At this time the "onload" tag of the "body" element is set.
>
> You can test this if you change the "<body>" element to "<body
> onload="alert('test body onload');">" of the "simple/calendar.jsp" example..
>
> Regards,
>
> Paul
>
>
> Paul Klaer wrote:
> > Thank you for your tipps and sorry for my late answer. I had much to do
> > and wanted to check the code before I write something back.
> > In the meantime we got a new CSS file and the calendar popups are
> > working fine in IE after resetting some div...
> >
> > The examples out of the myfaces repository are working on both: Firefox
> > and IE. There I had no problem with the js script.
> >
> > I think we have to be careful using css...
> >
> > But, I have now a problem with Firefox popups to display them and this
> > is because we use the "onload" tag and some own javascript init
> > functions for the page.
> > Now I checked the "popcalendar.js" code and the function
> > jscalendarInit() is only called if there is no "window.onload" (onload
> > tag) in the browser specified if no IE is used. This is why the variable
> > "jscalendarBPageLoaded" still remains with the default value "false" and
> > Firefox never executes this:
> >
> > ---------
> > function jscalendarPopUpCalendar(ctl, ctl2, format){
> > if (jscalendarBPageLoaded){
> > ....
> > ---------
> >
> > Is this right that I can't use the onload tag using Firefox?
> >
> >
> > Martin Marinschek wrote:
> >
> >> this occurs with IE only, right?
> >>
> >> it's a known bug of the IE - you would need to go through the elements
> >> of the form and render them invisible while displaying the
> >> inputCalendar.
> >>
> >> If you prepare a patch for the javaScript of inputCalendar which works
> >> in IE and Firefox we would happily apply it!
> >>
> >> regards,
> >>
> >> Martin
> >>
> >> On 9/9/05, Paul Klaer <[EMAIL PROTECTED]> wrote:
> >>
> >>> Hi,
> >>>
> >>> I have a problem using the inputCalendar component. The popup window is
> >>> shown correctly and works fine but if there are some buttons on my form
> >>> the popup window is hidden by the buttons. The popup just appears in the
> >>> background.
> >>> How can I solve this problem? Using css and the z-index for the buttons
> >>> option doesn't solve the problem. How can I set the calendar popup
> >>> component to the foreground?
> >>> Is it a bug of the inputCalendar component?
> >>>
> >>> Paul
> >>>
> >>
> >>
> >>
> >
>
>
>
> /*
> * Copyright 2004 The Apache Software Foundation.
> *
> * Licensed 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.myfaces.custom.calendar;
>
> import org.apache.myfaces.component.html.ext.HtmlInputText;
> import org.apache.myfaces.component.html.util.AddResource;
> import org.apache.myfaces.renderkit.JSFAttr;
> import org.apache.myfaces.renderkit.RendererUtils;
> import org.apache.myfaces.renderkit.html.HTML;
> import org.apache.myfaces.renderkit.html.HtmlRenderer;
> import org.apache.myfaces.renderkit.html.HtmlRendererUtils;
> import org.apache.myfaces.renderkit.html.util.JavascriptUtils;
>
> import javax.faces.application.Application;
> import javax.faces.component.UIComponent;
> import javax.faces.component.UIInput;
> import javax.faces.component.UIParameter;
> import javax.faces.component.html.HtmlCommandLink;
> import javax.faces.component.html.HtmlOutputText;
> import javax.faces.context.FacesContext;
> import javax.faces.context.ResponseWriter;
> import javax.faces.convert.Converter;
> import javax.faces.convert.ConverterException;
> import java.io.IOException;
> 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.Locale;
> import java.util.List;
>
> /**
> * @author Martin Marinschek (latest modification by $Author: svieujot $)
> * @version $Revision: 239482 $ $Date: 2005-08-24 01:34:01 +0200 (Mi, 24 Aug
> 2005) $
> */
> public class HtmlCalendarRenderer
> extends HtmlRenderer
> {
> private static final String JAVASCRIPT_ENCODED =
> "org.apache.myfaces.calendar.JAVASCRIPT_ENCODED";
>
> //private static Log log = LogFactory.getLog(HtmlCalendarRenderer.class);
>
> public void encodeEnd(FacesContext facesContext, UIComponent component)
> throws IOException
> {
> RendererUtils.checkParamValidity(facesContext, component,
> HtmlInputCalendar.class);
>
> HtmlInputCalendar inputCalendar = (HtmlInputCalendar) component;
>
> Locale currentLocale = facesContext.getViewRoot().getLocale();
>
>
> Date value;
>
> try
> {
> // value = RendererUtils.getDateValue(inputCalendar);
> Converter converter = getConverter(inputCalendar);
> if (converter instanceof DateConverter)
> {
> value = ((DateConverter) converter).getAsDate(facesContext,
> component);
> }
> else
> {
> value = RendererUtils.getDateValue(inputCalendar);
> }
> }
> catch (IllegalArgumentException illegalArgumentException)
> {
> value = null;
> }
>
>
> Calendar timeKeeper = Calendar.getInstance(currentLocale);
> timeKeeper.setTime(value!=null?value:new Date());
>
> DateFormatSymbols symbols = new DateFormatSymbols(currentLocale);
>
> String[] weekdays = mapWeekdays(symbols);
> String[] months = mapMonths(symbols);
>
> if(inputCalendar.isRenderAsPopup())
> {
> if(inputCalendar.isAddResources())
> addScriptAndCSSResources(facesContext, component);
>
> String dateFormat =
> CalendarDateTimeConverter.createJSPopupFormat(facesContext,
> inputCalendar.getPopupDateFormat());
>
> Application application = facesContext.getApplication();
>
> HtmlInputText inputText = null;
>
> List li = inputCalendar.getChildren();
>
> for (int i = 0; i < li.size(); i++)
> {
> UIComponent uiComponent = (UIComponent) li.get(i);
>
> if(uiComponent instanceof HtmlInputText)
> {
> inputText = (HtmlInputText) uiComponent;
> break;
> }
> }
>
> if(inputText == null)
> {
> inputText = (HtmlInputText)
> application.createComponent(HtmlInputText.COMPONENT_TYPE);
> }
>
> RendererUtils.copyHtmlInputTextAttributes(inputCalendar,
> inputText);
>
> inputText.setConverter(null); // value for this transient
> component will already be converted
> inputText.setTransient(true);
>
> if (value == null && inputCalendar.getSubmittedValue() != null)
> {
> inputText.setValue(inputCalendar.getSubmittedValue());
> }
> else
> {
> inputText.setValue(getConverter(inputCalendar).getAsString(
> facesContext,inputCalendar,value));
> }
> inputText.setDisabled(inputCalendar.isDisabled());
> inputText.setReadonly(inputCalendar.isReadonly());
>
> inputText.setEnabledOnUserRole(inputCalendar.getEnabledOnUserRole());
>
> inputText.setVisibleOnUserRole(inputCalendar.getVisibleOnUserRole());
>
> //This is where two components with the same id are in the tree,
> //so make sure that during the rendering the id is unique.
>
> inputCalendar.setId(inputCalendar.getId()+"tempId");
>
> inputCalendar.getChildren().add(inputText);
>
> RendererUtils.renderChild(facesContext, inputText);
>
> inputCalendar.getChildren().remove(inputText);
>
> //Set back the correct id to the input calendar
> inputCalendar.setId(inputText.getId());
>
> if (!inputCalendar.isDisabled())
> {
> ResponseWriter writer = facesContext.getResponseWriter();
>
> writer.startElement(HTML.SCRIPT_ELEM, component);
>
> writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
> writer.write("<!--\n");
> writer.writeText(getLocalizedLanguageScript(symbols,
> months,
>
> timeKeeper.getFirstDayOfWeek(),inputCalendar),null);
> writeScriptBtn(facesContext, inputCalendar,
> dateFormat,inputCalendar.getPopupButtonString());
> writer.write("\n-->");
> writer.endElement(HTML.SCRIPT_ELEM);
>
> /* writer.startElement(HTML.INPUT_ELEM,null);
>
> writer.writeAttribute(HTML.TYPE_ATTR,HTML.INPUT_TYPE_BUTTON,null);
>
> writer.writeAttribute(HTML.ONCLICK_ATTR,"popUpCalendar(this,
> "+inputText.getClientId(facesContext)+
> ", \\\"dd.mm.yyyy\\\")",null);
> writer.endElement(HTML.INPUT_TYPE_BUTTON);*/
> }
> }
> else
> {
>
> int lastDayInMonth =
> timeKeeper.getActualMaximum(Calendar.DAY_OF_MONTH);
>
> int currentDay = timeKeeper.get(Calendar.DAY_OF_MONTH);
>
> if (currentDay > lastDayInMonth)
> currentDay = lastDayInMonth;
>
> timeKeeper.set(Calendar.DAY_OF_MONTH, 1);
>
> int weekDayOfFirstDayOfMonth =
> mapCalendarDayToCommonDay(timeKeeper.get(Calendar.DAY_OF_WEEK));
>
> int weekStartsAtDayIndex =
> mapCalendarDayToCommonDay(timeKeeper.getFirstDayOfWeek());
>
> ResponseWriter writer = facesContext.getResponseWriter();
>
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
>
> writer.startElement(HTML.TABLE_ELEM, component);
> HtmlRendererUtils.renderHTMLAttributes(writer, component,
> HTML.UNIVERSAL_ATTRIBUTES);
> HtmlRendererUtils.renderHTMLAttributes(writer, component,
> HTML.EVENT_HANDLER_ATTRIBUTES);
> writer.flush();
>
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
>
> writer.startElement(HTML.TR_ELEM, component);
>
> if(inputCalendar.getMonthYearRowClass() != null)
> writer.writeAttribute(HTML.CLASS_ATTR,
> inputCalendar.getMonthYearRowClass(), null);
>
> writeMonthYearHeader(facesContext, writer, inputCalendar,
> timeKeeper,
> currentDay, weekdays, months);
>
> writer.endElement(HTML.TR_ELEM);
>
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
>
> writer.startElement(HTML.TR_ELEM, component);
>
> if(inputCalendar.getWeekRowClass() != null)
> writer.writeAttribute(HTML.CLASS_ATTR,
> inputCalendar.getWeekRowClass(), null);
>
> writeWeekDayNameHeader(weekStartsAtDayIndex, weekdays,
> facesContext, writer, inputCalendar);
>
> writer.endElement(HTML.TR_ELEM);
>
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
>
> writeDays(facesContext, writer, inputCalendar, timeKeeper,
> currentDay, weekStartsAtDayIndex,
> weekDayOfFirstDayOfMonth,
> lastDayInMonth, weekdays);
>
> writer.endElement(HTML.TABLE_ELEM);
> }
> }
>
> /**
> * Used by the x:inputDate renderer : HTMLDateRenderer
> * @throws IOException
> */
> static public void addScriptAndCSSResources(FacesContext facesContext,
> UIComponent component) throws IOException{
> // check to see if javascript has already been written (which could
> happen if more than one calendar on the same page)
> if
> (facesContext.getExternalContext().getRequestMap().containsKey(JAVASCRIPT_ENCODED))
> {
> return;
> }
>
> // Add the javascript and CSS pages
> AddResource.addStyleSheet(HtmlCalendarRenderer.class, "WH/theme.css",
> facesContext);
> AddResource.addStyleSheet(HtmlCalendarRenderer.class, "DB/theme.css",
> facesContext);
> AddResource.addJavaScriptToHeader(HtmlCalendarRenderer.class,
> "popcalendar.js", facesContext);
>
> ResponseWriter writer = facesContext.getResponseWriter();
>
> writer.startElement(HTML.SCRIPT_ELEM, component);
> writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,
> HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
> writer.write(
> "loadPopupScript();jscalendarSetImageDirectory(\""
> +JavascriptUtils.encodeString(
>
> AddResource.getResourceMappedPath(HtmlCalendarRenderer.class, "DB/",
> facesContext)
> )
> +"\")");
> writer.endElement(HTML.SCRIPT_ELEM);
>
>
> facesContext.getExternalContext().getRequestMap().put(JAVASCRIPT_ENCODED,
> Boolean.TRUE);
> }
>
> public static String getLocalizedLanguageScript(DateFormatSymbols symbols,
> String[] months, int firstDayOfWeek, HtmlInputCalendar
> inputCalendar)
> {
> int realFirstDayOfWeek = firstDayOfWeek-1/*Java has different
> starting-point*/;
>
> String[] weekDays;
>
> if(realFirstDayOfWeek==0)
> {
> weekDays = mapWeekdaysStartingWithSunday(symbols);
> }
> else if(realFirstDayOfWeek==1)
> {
> weekDays = mapWeekdays(symbols);
> }
> else
> throw new IllegalStateException("Week may only start with sunday
> or monday.");
>
> StringBuffer script = new StringBuffer();
> defineStringArray(script, "jscalendarMonthName", months);
> defineStringArray(script, "jscalendarDayName", weekDays);
> setIntegerVariable(script, "jscalendarStartAt",realFirstDayOfWeek);
>
> if( inputCalendar != null ){ // To allow null parameter for inputDate
> tag.
> if(inputCalendar.getPopupGotoString()!=null)
> setStringVariable(script,
> "jscalendarGotoString",inputCalendar.getPopupGotoString());
> if(inputCalendar.getPopupTodayString()!=null)
> setStringVariable(script,
> "jscalendarTodayString",inputCalendar.getPopupTodayString());
> if(inputCalendar.getPopupWeekString()!=null)
> setStringVariable(script,
> "jscalendarWeekString",inputCalendar.getPopupWeekString());
> if(inputCalendar.getPopupScrollLeftMessage()!=null)
> setStringVariable(script,
> "jscalendarScrollLeftMessage",inputCalendar.getPopupScrollLeftMessage());
> if(inputCalendar.getPopupScrollRightMessage()!=null)
> setStringVariable(script,
> "jscalendarScrollRightMessage",inputCalendar.getPopupScrollRightMessage());
> if(inputCalendar.getPopupSelectMonthMessage()!=null)
> setStringVariable(script,
> "jscalendarSelectMonthMessage",inputCalendar.getPopupSelectMonthMessage());
> if(inputCalendar.getPopupSelectYearMessage()!=null)
> setStringVariable(script,
> "jscalendarSelectYearMessage",inputCalendar.getPopupSelectYearMessage());
> if(inputCalendar.getPopupSelectDateMessage()!=null)
> setStringVariable(script,
> "jscalendarSelectDateMessage",inputCalendar.getPopupSelectDateMessage());
> }
>
> return script.toString();
> }
>
> private static void setIntegerVariable(StringBuffer script, String name,
> int value)
> {
> script.append(name);
> script.append(" = ");
> script.append(value);
> script.append(";\n");
> }
>
> private static void setStringVariable(StringBuffer script, String name,
> String value)
> {
> script.append(name);
> script.append(" = \"");
> script.append(value);
> script.append("\";\n");
> }
>
> private static void defineStringArray(StringBuffer script, String
> arrayName, String[] array)
> {
> script.append(arrayName);
> script.append(" = new Array(");
>
> for(int i=0;i<array.length;i++)
> {
> if(i!=0)
> script.append(",");
>
> script.append("\"");
> script.append(array[i]);
> script.append("\"");
> }
>
> script.append(");");
> }
>
> private void writeScriptBtn(FacesContext facesContext, UIComponent
> uiComponent, String dateFormat, String popupButtonString)
> throws IOException
> {
> ResponseWriter writer = facesContext.getResponseWriter();
>
> HtmlInputCalendar calendar = (HtmlInputCalendar)uiComponent;
> boolean renderButtonAsImage = calendar.isRenderPopupButtonAsImage();
>
> writer.write("if (!document.layers) {\n");
> writer.write("document.write('");
>
> if (!renderButtonAsImage) {
> // render the button
> writer.startElement(HTML.INPUT_ELEM, uiComponent);
> writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_BUTTON,
> null);
>
>
> writeOnclickJsCalendarFunctionCall(facesContext,uiComponent,dateFormat);
>
> if(popupButtonString==null)
> popupButtonString="...";
> writer.writeAttribute(HTML.VALUE_ATTR, popupButtonString, null);
> /*
> if (renderButtonAsImage) {
> writer.writeAttribute(HTML.ID_ATTR, buttonId, null);
> writer.writeAttribute(HTML.NAME_ATTR, buttonId, null);
> writer.writeAttribute(HTML.STYLE_ATTR,
> "visibility:hidden;",null);
> } else {
> HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
> HTML.UNIVERSAL_ATTRIBUTES);
> }
> */
> writer.endElement(HTML.INPUT_ELEM);
> } else {
> // render the image
> writer.startElement(HTML.IMG_ELEM, uiComponent);
> writer.writeAttribute(HTML.SRC_ATTR,
> AddResource.getResourceMappedPath(HtmlCalendarRenderer.class,
> "images/calendar.gif", facesContext), null);
> writer.writeAttribute(HTML.STYLE_ATTR, "vertical-align:bottom;",
> null);
>
> //writer.writeAttribute(HTML.ONCLICK_ATTR,
> "document.getElementById(\\'"+buttonId+"\\').click()",null);
>
> writeOnclickJsCalendarFunctionCall(facesContext,uiComponent,dateFormat);
> //writer.writeAttribute(HTML.ONMOUSEOVER_ATTR,
> "this.style.cursor=\\'hand\\';", null);
> //writer.writeAttribute(HTML.ONMOUSEOUT_ATTR,
> "this.style.cursor=\\'default\\';", null);
>
> writer.endElement(HTML.IMG_ELEM);
> }
>
> writer.write("');");
> writer.write("\n}");
> }
>
> private void writeOnclickJsCalendarFunctionCall(FacesContext
> facesContext, UIComponent uiComponent, String dateFormat)
> throws IOException
> {
> String clientId = uiComponent.getClientId(facesContext);
>
> ResponseWriter writer = facesContext.getResponseWriter();
>
> String jsCalendarFunctionCall =
> "jscalendarPopUpCalendar(this,document.getElementById(\\'"+clientId+"\\'),\\'"+dateFormat+"\\')";
> writer.writeAttribute(HTML.ONCLICK_ATTR, jsCalendarFunctionCall,
> null);
> }
>
>
> private void writeMonthYearHeader(FacesContext facesContext,
> ResponseWriter writer, UIInput inputComponent, Calendar timeKeeper,
> int currentDay, String[] weekdays,
> String[] months)
> throws IOException
> {
> Calendar cal = shiftMonth(facesContext, timeKeeper, currentDay, -1);
>
> writeCell(facesContext, writer, inputComponent, "<", cal.getTime(),
> null);
>
> writer.startElement(HTML.TD_ELEM, inputComponent);
> writer.writeAttribute(HTML.COLSPAN_ATTR, new Integer(weekdays.length
> - 2), null);
> writer.writeText(months[timeKeeper.get(Calendar.MONTH)] + " " +
> timeKeeper.get(Calendar.YEAR), null);
> writer.endElement(HTML.TD_ELEM);
>
> cal = shiftMonth(facesContext, timeKeeper, currentDay, 1);
>
> writeCell(facesContext, writer, inputComponent, ">", cal.getTime(),
> null);
> }
>
> private Calendar shiftMonth(FacesContext facesContext,
> Calendar timeKeeper, int currentDay, int
> shift)
> {
> Calendar cal = copyCalendar(facesContext, timeKeeper);
>
> cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + shift);
>
> if(currentDay > cal.getActualMaximum(Calendar.DAY_OF_MONTH))
> currentDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
>
> cal.set(Calendar.DAY_OF_MONTH, currentDay);
> return cal;
> }
>
> private Calendar copyCalendar(FacesContext facesContext, Calendar
> timeKeeper)
> {
> Calendar cal =
> Calendar.getInstance(facesContext.getViewRoot().getLocale());
> cal.set(Calendar.YEAR, timeKeeper.get(Calendar.YEAR));
> cal.set(Calendar.MONTH, timeKeeper.get(Calendar.MONTH));
> cal.set(Calendar.HOUR_OF_DAY, timeKeeper.get(Calendar.HOUR_OF_DAY));
> cal.set(Calendar.MINUTE, timeKeeper.get(Calendar.MINUTE));
> cal.set(Calendar.SECOND, timeKeeper.get(Calendar.SECOND));
> cal.set(Calendar.MILLISECOND, timeKeeper.get(Calendar.MILLISECOND));
> return cal;
> }
>
> private void writeWeekDayNameHeader(int weekStartsAtDayIndex, String[]
> weekdays, FacesContext facesContext, ResponseWriter writer, UIInput
> inputComponent)
> throws IOException
> {
> for (int i = weekStartsAtDayIndex; i < weekdays.length; i++)
> writeCell(facesContext,
> writer, inputComponent, weekdays[i], null, null);
>
> for (int i = 0; i < weekStartsAtDayIndex; i++)
> writeCell(facesContext, writer,
> inputComponent, weekdays[i], null, null);
> }
>
> private void writeDays(FacesContext facesContext, ResponseWriter writer,
> HtmlInputCalendar inputComponent, Calendar
> timeKeeper, int currentDay, int weekStartsAtDayIndex,
> int weekDayOfFirstDayOfMonth, int lastDayInMonth,
> String[] weekdays)
> throws IOException
> {
> Calendar cal;
>
> int space = (weekStartsAtDayIndex < weekDayOfFirstDayOfMonth) ?
> (weekDayOfFirstDayOfMonth - weekStartsAtDayIndex)
> : (weekdays.length - weekStartsAtDayIndex +
> weekDayOfFirstDayOfMonth);
>
> if (space == weekdays.length)
> space = 0;
>
> int columnIndexCounter = 0;
>
> for (int i = 0; i < space; i++)
> {
> if (columnIndexCounter == 0)
> {
> writer.startElement(HTML.TR_ELEM, inputComponent);
> }
>
> writeCell(facesContext, writer, inputComponent, "",
> null, inputComponent.getDayCellClass());
> columnIndexCounter++;
> }
>
> for (int i = 0; i < lastDayInMonth; i++)
> {
> if (columnIndexCounter == 0)
> {
> writer.startElement(HTML.TR_ELEM, inputComponent);
> }
>
> cal = copyCalendar(facesContext, timeKeeper);
> cal.set(Calendar.DAY_OF_MONTH, i + 1);
>
> String cellStyle = inputComponent.getDayCellClass();
>
> if((currentDay - 1) == i)
> cellStyle = inputComponent.getCurrentDayCellClass();
>
> writeCell(facesContext, writer,
> inputComponent, String.valueOf(i + 1), cal.getTime(),
> cellStyle);
>
> columnIndexCounter++;
>
> if (columnIndexCounter == weekdays.length)
> {
> writer.endElement(HTML.TR_ELEM);
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
> columnIndexCounter = 0;
> }
> }
>
> if (columnIndexCounter != 0)
> {
> for (int i = columnIndexCounter; i < weekdays.length; i++)
> {
> writeCell(facesContext, writer,
> inputComponent, "", null,
> inputComponent.getDayCellClass());
> }
>
> writer.endElement(HTML.TR_ELEM);
> HtmlRendererUtils.writePrettyLineSeparator(facesContext);
> }
> }
>
> private void writeCell(FacesContext facesContext,
> ResponseWriter writer, UIInput component, String
> content,
> Date valueForLink, String styleClass)
> throws IOException
> {
> writer.startElement(HTML.TD_ELEM, component);
>
> if (styleClass != null)
> writer.writeAttribute(HTML.CLASS_ATTR, styleClass, null);
>
> if (valueForLink == null)
> writer.writeText(content, JSFAttr.VALUE_ATTR);
> else
> {
> writeLink(content, component, facesContext, valueForLink);
> }
>
> writer.endElement(HTML.TD_ELEM);
> }
>
> private void writeLink(String content,
> UIInput component,
> FacesContext facesContext,
> Date valueForLink)
> throws IOException
> {
> Converter converter = getConverter(component);
>
> Application application = facesContext.getApplication();
> HtmlCommandLink link
> =
> (HtmlCommandLink)application.createComponent(HtmlCommandLink.COMPONENT_TYPE);
> link.setId(component.getId() + "_" + valueForLink.getTime() +
> "_link");
> link.setTransient(true);
> link.setImmediate(component.isImmediate());
>
> HtmlOutputText text
> =
> (HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
> text.setValue(content);
> text.setId(component.getId() + "_" + valueForLink.getTime() +
> "_text");
> text.setTransient(true);
>
> UIParameter parameter
> =
> (UIParameter)application.createComponent(UIParameter.COMPONENT_TYPE);
> parameter.setId(component.getId() + "_" + valueForLink.getTime() +
> "_param");
> parameter.setTransient(true);
> parameter.setName(component.getClientId(facesContext));
> parameter.setValue(converter.getAsString(facesContext, component,
> valueForLink));
>
> HtmlInputCalendar calendar = (HtmlInputCalendar)component;
> if (calendar.isDisabled() || calendar.isReadonly())
> {
> component.getChildren().add(text);
>
> RendererUtils.renderChild(facesContext, text);
> }
> else
> {
> component.getChildren().add(link);
> link.getChildren().add(parameter);
> link.getChildren().add(text);
>
> RendererUtils.renderChild(facesContext, link);
> }
> }
>
> private Converter getConverter(UIInput component)
> {
> Converter converter = component.getConverter();
>
> if (converter == null)
> {
> converter = new CalendarDateTimeConverter();
> }
> return converter;
> }
>
> private int mapCalendarDayToCommonDay(int day)
> {
> switch (day)
> {
> case Calendar.TUESDAY:
> return 1;
> case Calendar.WEDNESDAY:
> return 2;
> case Calendar.THURSDAY:
> return 3;
> case Calendar.FRIDAY:
> return 4;
> case Calendar.SATURDAY:
> return 5;
> case Calendar.SUNDAY:
> return 6;
> default:
> return 0;
> }
> }
>
> private static String[] mapWeekdays(DateFormatSymbols symbols)
> {
> String[] weekdays = new String[7];
>
> String[] localeWeekdays = symbols.getShortWeekdays();
>
> weekdays[0] = localeWeekdays[Calendar.MONDAY];
> weekdays[1] = localeWeekdays[Calendar.TUESDAY];
> weekdays[2] = localeWeekdays[Calendar.WEDNESDAY];
> weekdays[3] = localeWeekdays[Calendar.THURSDAY];
> weekdays[4] = localeWeekdays[Calendar.FRIDAY];
> weekdays[5] = localeWeekdays[Calendar.SATURDAY];
> weekdays[6] = localeWeekdays[Calendar.SUNDAY];
>
> return weekdays;
> }
>
> private static String[] mapWeekdaysStartingWithSunday(DateFormatSymbols
> symbols)
> {
> String[] weekdays = new String[7];
>
> String[] localeWeekdays = symbols.getShortWeekdays();
>
> weekdays[0] = localeWeekdays[Calendar.SUNDAY];
> weekdays[1] = localeWeekdays[Calendar.MONDAY];
> weekdays[2] = localeWeekdays[Calendar.TUESDAY];
> weekdays[3] = localeWeekdays[Calendar.WEDNESDAY];
> weekdays[4] = localeWeekdays[Calendar.THURSDAY];
> weekdays[5] = localeWeekdays[Calendar.FRIDAY];
> weekdays[6] = localeWeekdays[Calendar.SATURDAY];
>
> return weekdays;
> }
>
> public static String[] mapMonths(DateFormatSymbols symbols)
> {
> String[] months = new String[12];
>
> String[] localeMonths = symbols.getMonths();
>
> months[0] = localeMonths[Calendar.JANUARY];
> months[1] = localeMonths[Calendar.FEBRUARY];
> months[2] = localeMonths[Calendar.MARCH];
> months[3] = localeMonths[Calendar.APRIL];
> months[4] = localeMonths[Calendar.MAY];
> months[5] = localeMonths[Calendar.JUNE];
> months[6] = localeMonths[Calendar.JULY];
> months[7] = localeMonths[Calendar.AUGUST];
> months[8] = localeMonths[Calendar.SEPTEMBER];
> months[9] = localeMonths[Calendar.OCTOBER];
> months[10] = localeMonths[Calendar.NOVEMBER];
> months[11] = localeMonths[Calendar.DECEMBER];
>
> return months;
> }
>
>
> public void decode(FacesContext facesContext, UIComponent component)
> {
> RendererUtils.checkParamValidity(facesContext, component,
> HtmlInputCalendar.class);
>
> HtmlRendererUtils.decodeUIInput(facesContext, component);
> }
>
> public Object getConvertedValue(FacesContext facesContext, UIComponent
> uiComponent, Object submittedValue) throws ConverterException
> {
> RendererUtils.checkParamValidity(facesContext, uiComponent,
> HtmlInputCalendar.class);
>
> UIInput uiInput = (UIInput) uiComponent;
>
> Converter converter = uiInput.getConverter();
>
> if(converter==null)
> converter = new CalendarDateTimeConverter();
>
> if (submittedValue != null && !(submittedValue instanceof String))
> {
> throw new IllegalArgumentException("Submitted value of type
> String expected");
> }
>
> return converter.getAsObject(facesContext, uiComponent, (String)
> submittedValue);
> }
>
> public interface DateConverter extends Converter
> {
> public Date getAsDate(FacesContext facesContext, UIComponent
> uiComponent);
> }
>
> public static class CalendarDateTimeConverter implements DateConverter
> {
>
> public Object getAsObject(FacesContext facesContext, UIComponent
> uiComponent, String s)
> {
> if(s==null || s.trim().length()==0)
> return null;
>
> DateFormat dateFormat = null;
>
> if(uiComponent instanceof HtmlInputCalendar &&
> ((HtmlInputCalendar) uiComponent).isRenderAsPopup())
> {
> String popupDateFormat = ((HtmlInputCalendar)
> uiComponent).getPopupDateFormat();
>
> dateFormat = new
> SimpleDateFormat(createJSPopupFormat(facesContext, popupDateFormat));
> }
> else
> {
> dateFormat = createStandardDateFormat(facesContext);
> }
>
> try
> {
> return dateFormat.parse(s);
> }
> catch (ParseException e)
> {
> throw new ConverterException(e);
> }
> }
>
> public Date getAsDate(FacesContext facesContext, UIComponent
> uiComponent)
> {
> return RendererUtils.getDateValue(uiComponent);
> }
>
> public static String createJSPopupFormat(FacesContext
> facesContext, String popupDateFormat)
> {
>
> if(popupDateFormat == null)
> {
> SimpleDateFormat defaultDateFormat =
> createStandardDateFormat(facesContext);
> popupDateFormat = defaultDateFormat.toPattern();
> }
>
> StringBuffer jsPopupDateFormat = new StringBuffer();
>
> for(int i=0;i<popupDateFormat.length();i++)
> {
> char c = popupDateFormat.charAt(i);
>
> if(c=='M' || c=='d' || c=='y' || c==' ' || c=='.' || c=='/'
> || c=='-')
> jsPopupDateFormat.append(c);
> }
> return jsPopupDateFormat.toString().trim();
> }
>
> public String getAsString(FacesContext facesContext, UIComponent
> uiComponent, Object o)
> {
> Date date = (Date) o;
>
> if(date==null)
> return null;
>
> DateFormat dateFormat = null;
>
> if(uiComponent instanceof HtmlInputCalendar &&
> ((HtmlInputCalendar) uiComponent).isRenderAsPopup())
> {
> String popupDateFormat = ((HtmlInputCalendar)
> uiComponent).getPopupDateFormat();
>
> dateFormat = new
> SimpleDateFormat(createJSPopupFormat(facesContext, popupDateFormat));
> }
> else
> {
> dateFormat = createStandardDateFormat(facesContext);
> }
>
> return dateFormat.format(date);
> }
>
> private static SimpleDateFormat createStandardDateFormat(FacesContext
> facesContext)
> {
> DateFormat dateFormat;
> dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT,
> DateFormat.SHORT,
> facesContext.getViewRoot().getLocale());
>
> if(dateFormat instanceof SimpleDateFormat)
> return (SimpleDateFormat) dateFormat;
> else
> return new SimpleDateFormat("dd.MM.yyyy");
> }
>
> }
> }
>
>
>
>