public class InputDateRenderer extends Renderer {

   public static final String RENDERER_TYPE = "to.wings.msn.jsf.custom.InputDateRenderer";

   public static final String YEAR_SUFFIX = ".year";

   public static final String MONTH_SUFFIX = ".month";

   public static final String DAY_SUFFIX = ".day";

   public void encodeEnd(FacesContext context, UIComponent uiComponent)
         throws IOException {
      if ( context == null || uiComponent == null ){
         throw new NullPointerException();
      }

      UIInputeDate inputDate = (UIInputeDate)uiComponent;
      Calendar calVal = (Calendar)inputDate.getValue();

      ResponseWriter writer = context.getResponseWriter();
      String clientId = inputDate.getClientId( context );
      Map submittedValue = (Map)((UIInput)uiComponent).getSubmittedValue();

      String year = "";
      String month = "";
      String day = "";
      if ( submittedValue != null ){
         year = (String)submittedValue.get( YEAR_SUFFIX );
         month = (String)submittedValue.get( MONTH_SUFFIX );
         day = (String)submittedValue.get( DAY_SUFFIX );
      }
      writeInputText( writer , clientId + YEAR_SUFFIX , 4 , 4 , year );
      writer.write( "年" );
      writeInputText( writer , clientId + MONTH_SUFFIX , 2 , 2 , month );
      writer.write( "月" );
      writeInputText( writer , clientId + DAY_SUFFIX , 2 , 2 , day );
      writer.write( "日" );
   }

   private void writeInputText(ResponseWriter writer , String name,int maxLength,int size,String value)
   throws IOException{
      writer.startElement( "input" , null );
      writer.writeAttribute( "type" , "text" , null );
      writer.writeAttribute( "name" , name , null );
      writer.writeAttribute( "size" , String.valueOf(size) , null );
      writer.writeAttribute( "maxlength" , String.valueOf(maxLength) , null );
      writer.writeAttribute( "value" , value , null );
      writer.endElement("input");
   }

   public void decode(FacesContext context, UIComponent uiComponent) {

      super.decode(context, uiComponent);
      UIInputeDate inputDate = (UIInputeDate)uiComponent;
      Map requestMap = context.getExternalContext().getRequestParameterMap();

      String clientId = uiComponent.getClientId( context );
      String year = (String)requestMap.get( clientId + YEAR_SUFFIX );
      String month = (String)requestMap.get( clientId + MONTH_SUFFIX );
      String day = (String)requestMap.get( clientId + DAY_SUFFIX );

      Map submitMap = new HashMap();
      submitMap.put( YEAR_SUFFIX , year );
      submitMap.put( MONTH_SUFFIX , month );
      submitMap.put( DAY_SUFFIX , day );
      ( (UIInput)uiComponent ).setSubmittedValue( submitMap );
   }
}