View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.custom.inputHtml;
20  
21  import java.io.IOException;
22  import java.util.List;
23  import java.util.Map;
24  
25  import javax.faces.component.UIComponent;
26  import javax.faces.component.UIForm;
27  import javax.faces.component.UINamingContainer;
28  import javax.faces.context.FacesContext;
29  import javax.faces.context.ResponseWriter;
30  import javax.faces.convert.ConverterException;
31  import javax.faces.FacesException;
32  
33  import org.apache.commons.logging.Log;
34  import org.apache.commons.logging.LogFactory;
35  import org.apache.myfaces.component.UserRoleUtils;
36  import org.apache.myfaces.renderkit.html.util.AddResource;
37  import org.apache.myfaces.custom.tabbedpane.HtmlPanelTab;
38  import org.apache.myfaces.custom.tabbedpane.HtmlPanelTabbedPane;
39  import org.apache.myfaces.shared_tomahawk.renderkit.JSFAttr;
40  import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
41  import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
42  import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRenderer;
43  import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils;
44  import org.apache.myfaces.renderkit.html.util.AddResourceFactory;
45  import org.apache.myfaces.shared_tomahawk.renderkit.html.util.HTMLEncoder;
46  import org.apache.myfaces.shared_tomahawk.renderkit.html.util.JavascriptUtils;
47  import org.apache.myfaces.shared_tomahawk.renderkit.html.util.FormInfo;
48  
49  /**
50   * @JSFRenderer
51   *   renderKitId = "HTML_BASIC" 
52   *   family = "javax.faces.Input"
53   *   type = "org.apache.myfaces.InputHtml"
54   * 
55   * @author Sylvain Vieujot (latest modification by $Author: lu4242 $)
56   * @version $Revision: 928512 $ $Date: 2010-03-28 17:53:45 -0500 (Sun, 28 Mar 2010) $
57   */
58  public class InputHtmlRenderer extends HtmlRenderer {
59      // TODO : Enable multiple editors on one page
60      // TODO : Fix i18n (check the kupustart_form.js)
61      // TODO : Finish Disabled mode.
62      // TODO : Automatic Fallback for non kupu capable browsers (Safari, smartphones, non javascript, ...).
63      // TODO : Make Image & Link Library work.
64      // TODO : Allow disabeling of tag filtering
65      // TODO : Fix height while zoomed
66  
67      private static final Log log = LogFactory.getLog(HtmlRendererUtils.class);
68      
69      private static String ROWSPAN_ATTR = "rowspan";
70      
71      private static String I18N_TRANSLATE_ATTR = "i18n:translate";
72      private static String I18N_ATTRIBUTES_ATTR = "i18n:attributes";
73  
74      protected boolean isDisabled(FacesContext facesContext, UIComponent uiComponent) {
75          if( !UserRoleUtils.isEnabledOnUserRole(uiComponent) )
76              return false;
77  
78          return ((InputHtml)uiComponent).isDisabled();
79      }
80  
81      private static boolean useFallback(InputHtml editor){
82          // TODO : Handle fallback="auto"
83          return editor.getFallback().equals("true");
84      }
85  
86      public void encodeEnd(FacesContext context, UIComponent uiComponent) throws IOException {
87          RendererUtils.checkParamValidity(context, uiComponent, InputHtml.class);
88          InputHtml editor = (InputHtml) uiComponent;
89          if( HtmlRendererUtils.isDisplayValueOnly(editor) )
90              encodeDisplayValueOnly(context, editor);
91          else if( useFallback(editor) )
92              encodeEndFallBackMode(context, editor);
93          else{
94              // HACK
95              // As only one inputHtml is supported by page in this version,
96              // we need to make sure we don't encode hidden inputHtml
97              // TODO : Fix this by supporting multiple inputHtml per page.
98  
99              if( ! isVisible(editor) ){
100                 encodeHidden(context, editor);
101             }else if( ! hasThisPageAlreadyRenderedAnInputHtml( context ) ){
102                 encodeEndNormalMode(context, editor);
103                 setThisPageAlreadyRenderedAnInputHtml( context );
104             }else{
105                 log.warn("Only one inputHtml can be displayed at the same time. The component will be rendered isung a textarea." +
106                          "\nConpoment : "+RendererUtils.getPathToComponent( editor ));
107                 encodeEndFallBackMode(context, editor);
108             }
109         }
110     }
111 
112     static private boolean hasThisPageAlreadyRenderedAnInputHtml(FacesContext context){
113             return context.getExternalContext().getRequestMap().containsKey( InputHtmlRenderer.class.getName() );
114     }
115 
116     static private void setThisPageAlreadyRenderedAnInputHtml(FacesContext context){
117         context.getExternalContext().getRequestMap().put(InputHtmlRenderer.class.getName(), Boolean.TRUE);
118     }
119 
120     /**
121      * Try to figure out if this component is visible to avoid rendering the code if not necessary.
122      */
123     private boolean isVisible(InputHtml editor){
124             for(UIComponent parent = editor.getParent(); parent != null ; parent = parent.getParent()){
125                 if( parent instanceof HtmlPanelTab ){
126                     HtmlPanelTab panelTab = (HtmlPanelTab) parent;
127                     HtmlPanelTabbedPane panelTabbedPane = null;
128                     for(UIComponent panelAncestor=panelTab.getParent(); panelAncestor!=null ; panelAncestor=panelAncestor.getParent()){
129                         if( panelAncestor instanceof HtmlPanelTabbedPane ){
130                             panelTabbedPane = (HtmlPanelTabbedPane)panelAncestor;
131                             break;
132                         }
133                     }
134 
135                     if( panelTabbedPane != null ){
136                     if( panelTabbedPane.isClientSide() ){
137                         parent = panelTabbedPane;
138                         continue;
139                     }
140 
141                     // Not client side tabbed pane.
142                     // We need to check if the current panel tab is bisible;
143                     int selectedIndex = panelTabbedPane.getSelectedIndex();
144                     List children = panelTabbedPane.getChildren();
145                     int tabIdx = 0;
146                     for (int i = 0, len = children.size(); i < len && tabIdx <= selectedIndex ; i++){
147                         UIComponent child = htmlTabbedPaneRenderer_getUIComponent((UIComponent)children.get(i));
148                         if (child instanceof HtmlPanelTab){
149                                 if( child == panelTab ){
150                                     if( ! child.isRendered() || tabIdx != selectedIndex){
151                                     return false;
152                                 }else{
153                                         // It's visible. Check at upper level.
154                                         parent = panelTabbedPane;
155                                     continue;
156                                 }
157                                 }
158                             tabIdx++;
159                         }
160                         }
161                     }else{
162                         log.debug("pannelTabbedPane == null for component "+RendererUtils.getPathToComponent(panelTab));
163                     }
164                 }
165             }
166 
167             return true;
168     }
169 
170     /**
171      * This is a copy of HtmlTabbedPaneRenderer.getUIComponent
172      */
173     private UIComponent htmlTabbedPaneRenderer_getUIComponent(UIComponent uiComponent)
174     {
175         /* todo: forms other than UIForm, e.g. Trinidad's UIForm */
176         if (uiComponent instanceof UIForm || uiComponent instanceof UINamingContainer)
177         {
178             List children = uiComponent.getChildren();
179             for (int i = 0, len = children.size(); i < len; i++)
180             {
181                 uiComponent = htmlTabbedPaneRenderer_getUIComponent((UIComponent)children.get(i));
182             }
183         }
184         return uiComponent;
185     }
186 
187     private void encodeHidden(FacesContext context, InputHtml editor) throws IOException {
188         String clientId = editor.getClientId(context);
189         // Use a hidden textarea
190         ResponseWriter writer = context.getResponseWriter();
191         writer.startElement(HTML.TEXTAREA_ELEM, editor);
192 
193         writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
194         writer.writeAttribute(HTML.STYLE_ATTR, "display:none", null);
195 
196         String text = RendererUtils.getStringValue(context, editor);
197         writer.writeText(text, JSFAttr.VALUE_ATTR);
198 
199         writer.endElement(HTML.TEXTAREA_ELEM);
200     }
201 
202     private void encodeDisplayValueOnly(FacesContext context, InputHtml editor) throws IOException {
203         // Use only a textarea
204         ResponseWriter writer = context.getResponseWriter();
205         writer.startElement(HTML.SPAN_ELEM, editor);
206         HtmlRendererUtils.writeIdIfNecessary(writer, editor, context);
207 
208         HtmlRendererUtils.renderDisplayValueOnlyAttributes(editor, writer);
209 
210         String text = RendererUtils.getStringValue(context, editor);
211         writer.write( editor.getHtmlBody( text ) );
212 
213         writer.endElement(HTML.SPAN_ELEM);
214     }
215 
216     private void encodeEndFallBackMode(FacesContext context, InputHtml editor) throws IOException {
217         String clientId = editor.getClientId(context);
218         // Use only a textarea
219         ResponseWriter writer = context.getResponseWriter();
220         writer.startElement(HTML.TEXTAREA_ELEM, editor);
221 
222         writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
223         HtmlRendererUtils.writeIdIfNecessary(writer, editor, context);
224 
225         if( editor.getStyle()!=null )
226             writer.writeAttribute(HTML.STYLE_ATTR, editor.getStyle(), null);
227         if( editor.getStyleClass()!=null )
228             writer.writeAttribute(HTML.CLASS_ATTR, editor.getStyleClass(), null);
229 
230         if (isDisabled(context, editor))
231             writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
232 
233         String text = RendererUtils.getStringValue(context, editor);
234         writer.write( htmlToPlainText(text, editor) );
235 
236         writer.endElement(HTML.TEXTAREA_ELEM);
237     }
238 
239     private static String htmlToPlainText(String html, InputHtml editor){
240         return editor.getHtmlBody( html )
241                 .replaceAll("<br.*>","\n")
242                 .replaceAll("<.+?>", "");
243     }
244 
245     private void encodeEndNormalMode(FacesContext context, InputHtml editor) throws IOException {
246         String clientId = editor.getClientId(context);
247         FormInfo parentFormInfo = RendererUtils.findNestingForm(editor, context);
248         if(parentFormInfo == null)
249             throw new FacesException("InputHtml must be embedded in a form.");
250         String formId = parentFormInfo.getFormName();
251 
252         AddResource addResource = AddResourceFactory.getInstance(context);
253         addResource.addStyleSheet(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupustyles.css");
254         addResource.addStyleSheet(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupudrawerstyles.css");
255         addResource.addStyleSheet(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "myFaces.css");
256 
257         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "sarissa.js");
258         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "sarissa_ieemu_xpath.js");
259         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupuhelpers.js");
260         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupueditor.js");
261         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupubasetools.js");
262         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupuloggers.js");
263         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupunoi18n.js");
264         //addResource.addJavaScriptAtPosition(context, InputHtmlRenderer.class, "i18n/i18n.js");
265         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupucleanupexpressions.js");
266         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupucontentfilters.js");
267 
268         if (editor.isShowAnyToolBox())
269         {
270             addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kuputoolcollapser.js");
271         }
272         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupucontextmenu.js");
273 
274         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupuinit.js");
275         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupustart.js");
276 
277         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupusourceedit.js");
278         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupuspellchecker.js");
279         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupudrawers.js");
280         
281         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "kupuundo.js");
282         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "diff_match_patch.js");
283 
284         addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, InputHtmlRenderer.class, "myFacesUtils.js");
285 
286         ResponseWriter writer = context.getResponseWriter();
287 
288         writer.startElement(HTML.DIV_ELEM,editor);
289         writer.writeAttribute(HTML.STYLE_ATTR, "display: none;",null);
290 
291             writer.startElement("xml", editor);
292             writer.writeAttribute("id", "kupuconfig", null);
293             writer.writeAttribute(HTML.CLASS_ATTR, "kupuconfig", null);
294 
295                 writer.startElement("kupuconfig", editor);
296 
297                     writeTag(writer, "dst", "fulldoc.html", editor);
298                     writeTag(writer, "use_css", "1", editor);
299                     writeTag(writer, "reload_after_save", "0", editor);
300                     writeTag(writer, "strict_output", "1", editor);
301                     writeTag(writer, "content_type", "application/xhtml+xml", editor);
302                     writeTag(writer, "compatible_singletons", "1", editor);
303 
304                     writer.startElement("table_classes", editor);
305                         writeTag(writer, "class", "plain", editor);
306                         writeTag(writer, "class", "listing", editor);
307                         writeTag(writer, "class", "grid", editor);
308                         writeTag(writer, "class", "data", editor);
309                     writer.endElement("table_classes");
310 
311                     writer.startElement("cleanup_expressions",editor);
312                         writer.startElement("set",editor);
313                             writer.startElement("name",editor);
314                                 writer.write("Convert single quotes to curly ones");
315                             writer.endElement("name");
316                             writer.startElement("expression",editor);
317                                 writer.startElement("reg",editor);
318                                     writer.write("(\\W)'");
319                                 writer.endElement("reg");
320                                 writer.startElement("replacement",editor);
321                                     writer.write("\\1&#x8216;");
322                                 writer.endElement("replacement");
323                             writer.endElement("expression");
324                             writer.startElement("expression",editor);
325                                 writer.startElement("reg",editor);
326                                     writer.write("'");
327                                 writer.endElement("reg");
328                                 writer.startElement("replacement",editor);
329                                     writer.write("&#x8217;");
330                                 writer.endElement("replacement");
331                             writer.endElement("expression");
332                         writer.endElement("set");
333                         writer.startElement("set",editor);
334                         writer.startElement("name",editor);
335                             writer.write("Reduce whitespace");
336                         writer.endElement("name");
337                         writer.startElement("expression",editor);
338                             writer.startElement("reg",editor);
339                                 writer.write("[\\n\\r\\t]");
340                             writer.endElement("reg");
341                             writer.startElement("replacement",editor);
342                                 writer.write("\\x20");
343                             writer.endElement("replacement");
344                         writer.endElement("expression");
345                         writer.startElement("expression",editor);
346                             writer.startElement("reg",editor);
347                                 writer.write("[ ]{2}");
348                             writer.endElement("reg");
349                             writer.startElement("replacement",editor);
350                                 writer.write("\\x20");
351                             writer.endElement("replacement");
352                         writer.endElement("expression");
353                       writer.endElement("set");
354                     writer.endElement("cleanup_expressions");
355 
356                     writeTag(writer, "image_xsl_uri", addResource.getResourceUri(context, InputHtmlRenderer.class, "kupudrawers/drawer.xsl"), editor);
357                     writeTag(writer, "link_xsl_uri", addResource.getResourceUri(context, InputHtmlRenderer.class, "kupudrawers/drawer.xsl"), editor);
358 
359                     // TODO : Make this work (reference available images, ...).
360                     writeTag(writer, "image_libraries_uri", addResource.getResourceUri(context, InputHtmlRenderer.class, "kupudrawers/imagelibrary.xml"), editor);
361                     writeTag(writer, "link_libraries_uri", addResource.getResourceUri(context, InputHtmlRenderer.class, "kupudrawers/linklibrary.xml"), editor);
362                     writeTag(writer, "search_images_uri", "", editor);
363                     writeTag(writer, "search_links_uri", "", editor);
364 
365                 writer.endElement("kupuconfig");
366             writer.endElement("xml");
367         writer.endElement(HTML.DIV_ELEM);
368 
369 
370         writer.startElement(HTML.DIV_ELEM,editor);
371         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-fulleditor", null);
372         writer.writeAttribute("xmlns:i18n", "http://xml.zope.org/namespaces/i18n", null);
373         writer.writeAttribute("i18n:domain","kupu",null);
374         
375             //
376             // Toolbar
377             //
378             writer.startElement(HTML.DIV_ELEM,editor);
379             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb",null);
380             writer.writeAttribute(HTML.ID_ATTR, "toolbar",null);
381 
382                 writer.startElement(HTML.SPAN_ELEM,editor);
383                 writer.writeAttribute(HTML.ID_ATTR, "kupu-tb-buttons",null);
384                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttons",null);
385 
386                     writer.startElement(HTML.SPAN_ELEM,editor);
387                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup",null);
388                     writer.writeAttribute(HTML.STYLE_ATTR, "float: right", null);
389                     writer.writeAttribute(HTML.ID_ATTR, "kupu-logo",null);
390                     if( editor.isAddKupuLogo() ){
391                         writer.startElement(HTML.BUTTON_ELEM,editor);
392                         writer.writeAttribute(HTML.TYPE_ATTR, "button",null);
393                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-logo",null);
394                         writer.writeAttribute(HTML.TITLE_ATTR, "Kupu 1.4.16",null);
395                         writer.writeAttribute(I18N_ATTRIBUTES_ATTR,"title title_logo;",null);
396                         writer.writeAttribute(HTML.ACCESSKEY_ATTR, "k",null);
397                         writer.writeAttribute(HTML.ONCLICK_ATTR, "window.open('http://kupu.oscom.org');",null);
398                         writer.write("&#160;");
399                         writer.endElement(HTML.BUTTON_ELEM);
400                     }
401                     writer.endElement(HTML.SPAN_ELEM);
402                     
403                     writer.startElement(HTML.SPAN_ELEM,editor);
404                     writer.writeAttribute(HTML.CLASS_ATTR,"kupu-tb-buttongroup",null);
405                     writer.writeAttribute(HTML.STYLE_ATTR,"float: right",null);
406                     writer.writeAttribute(HTML.ID_ATTR,"kupu-zoom",null);
407                         writer.startElement(HTML.BUTTON_ELEM,null);
408                         writer.writeAttribute(HTML.TYPE_ATTR, "button",null);
409                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-zoom",null);
410                         writer.writeAttribute(HTML.ID_ATTR, "kupu-zoom-button",null);
411                         writer.writeAttribute(I18N_ATTRIBUTES_ATTR,"title title_zoom;",null);
412                         writer.writeAttribute(HTML.TITLE_ATTR,"Zoom: Access key (Alt or Ctrl) + X",null);
413                         writer.writeAttribute(HTML.ACCESSKEY_ATTR, "x",null);
414                         writer.write("&#160;");
415                         writer.endElement(HTML.BUTTON_ELEM);
416                     writer.endElement(HTML.SPAN_ELEM);
417 
418                     writer.startElement(HTML.SELECT_ELEM,editor);
419                     writer.writeAttribute(HTML.ID_ATTR, "kupu-tb-styles",null);
420                         writer.startElement(HTML.OPTION_ELEM,editor);
421                         writer.writeAttribute(HTML.VALUE_ATTR, "P",null);
422                         writer.writeAttribute(I18N_TRANSLATE_ATTR,"Normal",null);
423                         writer.write("Normal paragraph");
424                         writer.endElement(HTML.OPTION_ELEM);
425 
426                         writer.startElement(HTML.OPTION_ELEM,editor);
427                         writer.writeAttribute(HTML.VALUE_ATTR, "H1",null);
428                             writer.startElement(HTML.SPAN_ELEM,editor);
429                             
430                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"Heading 1",null);
431                             writer.write("Heading 1");
432                             writer.endElement(HTML.SPAN_ELEM);
433                         writer.endElement(HTML.OPTION_ELEM);
434 
435                         writer.startElement(HTML.OPTION_ELEM, editor);
436                         writer.writeAttribute(HTML.VALUE_ATTR, "H2",null);
437                             writer.startElement(HTML.SPAN_ELEM,editor);
438                             
439                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"Heading 2",null);
440                             writer.write("Heading 2");
441                             writer.endElement(HTML.SPAN_ELEM);
442                         writer.endElement(HTML.OPTION_ELEM);
443 
444                         writer.startElement(HTML.OPTION_ELEM,editor);
445                         writer.writeAttribute(HTML.VALUE_ATTR, "H3",null);
446                             writer.startElement(HTML.SPAN_ELEM,editor);
447                             
448                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"Heading 3",null);
449                             writer.write("Heading 3");
450                             writer.endElement(HTML.SPAN_ELEM);
451 
452                             writer.endElement(HTML.OPTION_ELEM);
453 
454                         writer.startElement(HTML.OPTION_ELEM,editor);
455                         writer.writeAttribute(HTML.VALUE_ATTR, "H4",null);
456                             writer.startElement(HTML.SPAN_ELEM,editor);
457                             
458                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"Heading 4",null);
459                             writer.write("Heading 4");
460                             writer.endElement(HTML.SPAN_ELEM);
461 
462                         writer.endElement(HTML.OPTION_ELEM);
463 
464                         writer.startElement(HTML.OPTION_ELEM,editor);
465                         writer.writeAttribute(HTML.VALUE_ATTR, "H5",null);
466                             writer.startElement(HTML.SPAN_ELEM,editor);
467                             
468                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"Heading 5",null);
469                             writer.write("Heading 5");
470                             writer.endElement(HTML.SPAN_ELEM);
471 
472                         writer.endElement(HTML.OPTION_ELEM);
473 
474                         writer.startElement(HTML.OPTION_ELEM,editor);
475                         writer.writeAttribute(HTML.VALUE_ATTR, "H6",null);
476 
477                             writer.startElement(HTML.SPAN_ELEM,editor);
478 
479                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"Heading 6",null);
480                             writer.write("Heading 6");
481                             writer.endElement(HTML.SPAN_ELEM);
482 
483                         writer.endElement(HTML.OPTION_ELEM);
484 
485                         writer.startElement(HTML.OPTION_ELEM,editor);
486                         
487                         writer.writeAttribute(HTML.VALUE_ATTR, "PRE",null);
488                         writer.writeAttribute(I18N_TRANSLATE_ATTR,"Formatted",null);
489                             writer.write("Formatted");
490                         writer.endElement(HTML.OPTION_ELEM);
491 
492                     writer.endElement(HTML.SELECT_ELEM);
493 
494                     writer.startElement(HTML.SPAN_ELEM,editor);
495                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
496                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
497                         writeButton(writer, "kupu-save", "save: alt-s", "s", editor, null);
498                     writer.endElement(HTML.SPAN_ELEM);
499 
500                     writer.startElement(HTML.SPAN_ELEM,editor);
501                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
502                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-basicmarkup", null);
503                         writeButton(writer, "kupu-bold", "Bold: Access key (Alt or Ctrl) + B", "b", editor,"title title_bold;");
504                         writeButton(writer, "kupu-italic", "Italic: Access key (Alt or Ctrl) + I", "i", editor,"title title_italic;");
505                         writeButton(writer, "kupu-underline", "Underline: Access key (Alt or Ctrl) + U", "u", editor,"title title_underline;");
506                     writer.endElement(HTML.SPAN_ELEM);
507 
508                     writer.startElement(HTML.SPAN_ELEM,editor);
509                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
510                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-subsuper", null);
511                         writeButton(writer, "kupu-subscript", "Subscript: Access key (Alt or Ctrl) + -", "-", editor,"title title_subscript;");
512                         writeButton(writer, "kupu-superscript", "Superscript: Access key (Alt or Ctrl) + +", "+", editor,"title title_superscript;");
513                     writer.endElement(HTML.SPAN_ELEM);
514 
515                     writer.startElement(HTML.SPAN_ELEM,editor);
516                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
517                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-color", null);
518                         writeButton(writer, "kupu-forecolor", "text color: alt-f", "f", editor,"title title_text_color;");
519                         writeButton(writer, "kupu-hilitecolor", "background color: alt-h", "h", editor,"title title_back_color;");
520                     writer.endElement(HTML.SPAN_ELEM);
521 
522                     writer.startElement(HTML.SPAN_ELEM,editor);
523                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
524                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-justify", null);
525                         writeButton(writer, "kupu-justifyleft", "Left justify: Access key (Alt or Ctrl) + L", "l", editor,"title title_ljust;");
526                         writeButton(writer, "kupu-justifycenter", "Center justify: Access key (Alt or Ctrl) + C", "c", editor,"title title_center;");
527                         writeButton(writer, "kupu-justifyright", "Right justify: Access key (Alt or Ctrl) + R", "r", editor,"title title_rjust;");
528                     writer.endElement(HTML.SPAN_ELEM);
529 
530                     writer.startElement(HTML.SPAN_ELEM,editor);
531                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
532                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-list", null);
533                         writeButton(writer, "kupu-insertorderedlist", "Numbered list: Access key (Alt or Ctrl) + #", "#", "kupu-list-ol-addbutton", editor,"title title_numlist;");
534                         writeButton(writer, "kupu-insertunorderedlist", "Unordered list: Access key (Alt or Ctrl) + *", "*", "kupu-list-ul-addbutton", editor,"title title_unorderedlist;");
535                     writer.endElement(HTML.SPAN_ELEM);
536 
537                     writer.startElement(HTML.SPAN_ELEM,editor);
538                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
539                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-definitionlist", null);
540                         writeButton(writer, "kupu-insertdefinitionlist", "Definition list: Access key (Alt or Ctrl) + =", "=", "kupu-list-dl-addbutton", editor,"title title_deflist;");
541                     writer.endElement(HTML.SPAN_ELEM);
542 
543                     writer.startElement(HTML.SPAN_ELEM,editor);
544                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
545                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-indent", null);
546                         writeButton(writer, "kupu-outdent", "Decrease quote level: Access key (Alt or Ctrl) + <", "<", editor,"title title_decrease_quote;");
547                         writeButton(writer, "kupu-indent", "Increase quote level: Access key (Alt or Ctrl) + >", ">", editor,"title title_increase_quote;");
548                     writer.endElement(HTML.SPAN_ELEM);
549 
550                     writer.startElement(HTML.SPAN_ELEM,editor);
551                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
552                     if( ! editor.isAllowExternalLinks() ){
553                         writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
554                     }
555                         writeButton(writer, "kupu-image", "Insert image", null, "kupu-imagelibdrawer-button", false, editor,"title title_insert_image;"); // TODO : Enable
556                         writeButton(writer, "kupu-inthyperlink", "Insert internal link", null, "kupu-linklibdrawer-button", false, editor,"title title_insert_internal_link;"); // TODO : Enable
557                         writeButton(writer, "kupu-exthyperlink", "Insert external link", null, "kupu-linkdrawer-button", editor,"title title_insert_external_link;");
558                         writeButton(writer, "kupu-anchors", "Insert anchors", null, "kupu-anchors", editor,"title title_insert_anchors;");
559                         writeButton(writer, "kupu-table", "Insert table", null, "kupu-tabledrawer-button", editor,"title title_insert_table;");
560                     writer.endElement(HTML.SPAN_ELEM);
561 
562                     writer.startElement(HTML.SPAN_ELEM,editor);
563                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
564                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-remove", null);
565                         writeButton(writer, "kupu-removeimage invisible", "Remove image", null, "kupu-removeimage-button", editor,"title title_removeimage;");
566                         writeButton(writer, "kupu-removelink invisible", "Remove link", null, "kupu-removelink-button", editor,"title title_removelink;");
567                     writer.endElement(HTML.SPAN_ELEM);
568 
569                        writer.startElement(HTML.SPAN_ELEM,editor);
570                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup", null);
571                     writer.writeAttribute(HTML.ID_ATTR, "kupu-bg-undo", null);
572                         writeButton(writer, "kupu-undo", "Undo: Access key (Alt or Ctrl) + Z", "z", editor,"title title_undo;");
573                         writeButton(writer, "kupu-redo", "Redo: Access key (Alt or Ctrl) + Y", "y", editor,"title title_redo;");
574                     writer.endElement(HTML.SPAN_ELEM);
575 
576                     writer.startElement(HTML.SPAN_ELEM,editor);
577                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup kupu-spellchecker-span", null);
578                     writer.writeAttribute(HTML.ID_ATTR, "kupu-spellchecker", null);
579                     //if( ! editor.isAllowEditSource() ){
580                         writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
581                     //}
582                         writeButton(writer, "kupu-spellchecker", "Check spelling", null, editor,"title title_check_spelling;");
583                      writer.endElement(HTML.SPAN_ELEM);
584 
585                     writer.startElement(HTML.SPAN_ELEM,editor);
586                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tb-buttongroup kupu-source-span", null);
587                     writer.writeAttribute(HTML.ID_ATTR, "kupu-source", null);
588                     if( ! editor.isAllowEditSource() ){
589                         writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
590                     }
591                         writeButton(writer, "kupu-source", "Switch between visual editor and HTML view", "h", editor,"title toggle_source_view;");
592                      writer.endElement(HTML.SPAN_ELEM);
593 
594                 writer.endElement(HTML.SPAN_ELEM); // kupu-tb-buttons
595 
596                  writer.startElement(HTML.SELECT_ELEM,editor);
597                  writer.writeAttribute(HTML.ID_ATTR, "kupu-ulstyles", null);
598                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-ulstyles", null);
599                      writeOption(writer, "disc", "list-disc", "&#x25CF;", editor);        // TODO : Check as last parameter has been removed.
600                      writeOption(writer, "square", "list-square", "&#x25A0;", editor);
601                      writeOption(writer, "circle", "list-circle", "&#x25CB;", editor);
602                      writeOption(writer, "none", "list-nobullet", "no bullet", editor);
603                  writer.endElement(HTML.SELECT_ELEM);
604 
605                  writer.startElement(HTML.SELECT_ELEM,editor);
606                  writer.writeAttribute(HTML.ID_ATTR, "kupu-olstyles", null);
607                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-olstyles", null);
608                      writeOption(writer, "decimal", "list-decimal", "1", editor);
609                      writeOption(writer, "upper-roman", "list-upperroman", "I", editor);
610                      writeOption(writer, "lower-roman", "list-lowerroman", "i", editor);
611                      writeOption(writer, "upper-alpha", "list-upperalpha", "A", editor);
612                      writeOption(writer, "lower-alpha", "list-loweralpha", "a", editor);
613                  writer.endElement(HTML.SELECT_ELEM);
614 
615                  writer.startElement(HTML.DIV_ELEM,editor);
616                  writer.writeAttribute(HTML.STYLE_ATTR, "display:block;", null);
617                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-librarydrawer-parent", null);
618 
619                      writer.startElement(HTML.IFRAME_ELEM,editor);
620                      writer.writeAttribute(HTML.STYLE_ATTR,"display:none",null);
621                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-anchorframe",null);
622                      writer.writeAttribute("src","javascript:''",null);
623                      writer.writeAttribute("scrolling","auto",null);
624                      writer.writeAttribute("frameborder","1",null);
625                      writer.endElement(HTML.IFRAME_ELEM);
626 
627                  writer.endElement(HTML.DIV_ELEM);
628 
629                 // External Link drawer
630                  writer.startElement(HTML.DIV_ELEM,editor);
631                  writer.writeAttribute(HTML.ID_ATTR, "kupu-linkdrawer", null);
632                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-drawer kupu-linkdrawer", null);
633                      writer.startElement(HTML.H1_ELEM,editor);
634                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-drawer-title",null);
635                      
636                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"title_external_link", null);
637                          writer.write("External Link");
638                      writer.endElement(HTML.H1_ELEM);
639                      writer.startElement(HTML.DIV_ELEM,editor);
640                      writer.writeAttribute(HTML.ID_ATTR, "kupu-linkdrawer-addlink", null);
641                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-panels kupu-linkdrawer-addlink", null);
642                     
643                         writer.startElement(HTML.UL_ELEM,editor);
644                         writer.writeAttribute(HTML.CLASS_ATTR,"kupu-tabs",null);
645     
646                             writer.startElement(HTML.LI_ELEM,editor);
647                             writer.writeAttribute(HTML.CLASS_ATTR,"kupu-linkdrawer-addlink selected",null);
648                                 writer.startElement(HTML.ANCHOR_ELEM,editor);
649                                 writer.writeAttribute("href","#",null);
650                                 
651                                 writer.writeAttribute(I18N_TRANSLATE_ATTR,"tab_link",null);
652                                 writer.writeAttribute("shape","rect",null);
653                                 writer.write("Link to url");
654                                 writer.endElement(HTML.ANCHOR_ELEM);
655                             writer.endElement(HTML.LI_ELEM);
656                             
657                             writer.startElement(HTML.LI_ELEM,editor);
658                             writer.writeAttribute(HTML.CLASS_ATTR,"kupu-linkdrawer-embed",null);
659 
660                                 writer.startElement(HTML.ANCHOR_ELEM,editor);
661                                 writer.writeAttribute("href","#",null);
662                                 
663                                 writer.writeAttribute(I18N_TRANSLATE_ATTR,"tab_embed",null);
664                                 writer.writeAttribute("shape","rect",null);
665                                 writer.write("Embed external object");
666                                 writer.endElement(HTML.ANCHOR_ELEM);
667                             writer.endElement(HTML.LI_ELEM);
668     
669                         writer.endElement(HTML.UL_ELEM); 
670                     
671                          writer.startElement(HTML.TABLE_ELEM,editor);
672                          writer.writeAttribute(HTML.CLASS_ATTR,"kupu-tabbed",null);
673                            writer.startElement(HTML.TBODY_ELEM,editor);
674                            writer.writeAttribute(HTML.CLASS_ATTR,"kupu-addlink",null);
675                                                                           
676                              writer.startElement(HTML.TR_ELEM,editor);
677                                  writer.startElement(HTML.TD_ELEM,editor);
678                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
679                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
680                                     writer.startElement(HTML.DIV_ELEM,editor);
681                                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
682                                         writer.startElement(HTML.SPAN_ELEM,editor);
683                                              
684                                              writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_link_text",null);
685                                              writer.write("Link the highlighted text to this URL:");
686                                          writer.endElement(HTML.SPAN_ELEM);
687                                     writer.endElement(HTML.DIV_ELEM);
688                                     
689                                     writer.startElement(HTML.INPUT_ELEM,editor);
690                                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-st kupu-linkdrawer-input", null);
691                                     writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
692                                     writer.writeAttribute(HTML.ONKEYPRESS_ATTR, "return HandleDrawerEnter(event, 'linkdrawer-preview');", null);
693                                     writer.endElement(HTML.INPUT_ELEM);
694                                 writer.endElement(HTML.TD_ELEM);
695                                 writer.startElement(HTML.TD_ELEM,null);
696                                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-preview-button", null);
697                                 writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
698                                 writer.writeAttribute(ROWSPAN_ATTR,"1",null);
699                                     writer.startElement(HTML.BUTTON_ELEM,editor);
700                                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
701                                     writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
702                                     writer.writeAttribute(HTML.ID_ATTR,"linkdrawer-preview",null);
703                                     writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.preview()", null);
704                                     
705                                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_preview",null);
706                                     writer.write("Preview");
707                                     writer.endElement(HTML.BUTTON_ELEM);
708                                 writer.endElement(HTML.TD_ELEM);
709                              writer.endElement(HTML.TR_ELEM);
710                             writer.startElement(HTML.TR_ELEM,editor);
711                             writer.writeAttribute(HTML.CLASS_ATTR,"kupu-linkdrawer-anchors",null);
712                             writer.writeAttribute(HTML.STYLE_ATTR,"display:none",null);
713 
714                                 writer.startElement(HTML.TD_ELEM,editor);
715                                 writer.writeAttribute(HTML.COLSPAN_ATTR, "2", null);
716                                 writer.writeAttribute(ROWSPAN_ATTR,"1",null);
717                                 
718                                     writer.startElement(HTML.LABEL_ATTR,editor);
719                                     
720                                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_anchor",null);
721                                     writer.writeAttribute("for","anchorselect",null);
722                                     writer.write("Anchor");
723                                     writer.endElement(HTML.LABEL_ATTR);
724                                     writer.startElement(HTML.SELECT_ELEM,editor);
725                                     writer.writeAttribute(HTML.ID_ATTR,"anchorselect",null);
726                                         writer.startElement(HTML.OPTION_ELEM,editor);
727                                         
728                                         writer.writeAttribute(I18N_TRANSLATE_ATTR,"opt_top_of_page",null);
729                                         writer.writeAttribute(HTML.VALUE_ATTR,"",null);
730                                         writer.write("top of page (default)");
731                                         writer.endElement(HTML.OPTION_ELEM);
732                                     writer.endElement(HTML.SELECT_ELEM);
733                             
734                                 writer.endElement(HTML.TD_ELEM);
735                         
736                             writer.endElement(HTML.TR_ELEM);
737 
738                              writer.startElement(HTML.TR_ELEM,editor);
739                                 writer.startElement(HTML.TD_ELEM,editor);
740                                 writer.writeAttribute(HTML.COLSPAN_ATTR,"2",null);
741                                 writer.writeAttribute(HTML.ALIGN_ATTR, "center", null);
742                                 writer.writeAttribute(ROWSPAN_ATTR,"1",null);
743                                     writer.startElement(HTML.DIV_ELEM,editor);
744                                     writer.writeAttribute(HTML.CLASS_ATTR,"watermark",null);
745                                         writer.startElement(HTML.SPAN_ELEM,editor);
746                                         
747                                         writer.writeAttribute(I18N_TRANSLATE_ATTR,"watermark_preview",null);
748                                         writer.write("Preview");
749                                         writer.endElement(HTML.SPAN_ELEM);
750                                     writer.endElement(HTML.DIV_ELEM);
751                                     writer.startElement(HTML.IFRAME_ELEM,editor);
752                                     writer.writeAttribute(HTML.FRAMEBORDER_ATTR, "1", null);
753                                     writer.writeAttribute(HTML.SCROLLING_ATTR, "auto", null);
754                                     writer.writeAttribute(HTML.WIDTH_ATTR, "440", null);
755                                     writer.writeAttribute(HTML.HEIGHT_ATTR, "198", null);
756                                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-linkdrawer-preview", null);
757                                     // addResource.getResourceUri(context, InputHtmlRenderer.class, "kupublank.html")
758                                     writer.writeAttribute(HTML.SRC_ATTR, "javascript:''", null);
759                                     writer.endElement(HTML.IFRAME_ELEM);
760                                 writer.endElement(HTML.TD_ELEM);
761                              writer.endElement(HTML.TR_ELEM);
762                            writer.endElement(HTML.TBODY_ELEM);
763                            
764                            writer.startElement(HTML.TBODY_ELEM,editor);
765                            writer.writeAttribute(HTML.CLASS_ATTR,"kupu-embed",null);
766                                writer.startElement(HTML.TR_ELEM,editor);
767                                    writer.startElement(HTML.TD_ELEM,editor);
768                                    writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
769                                    writer.writeAttribute(ROWSPAN_ATTR,"1",null);
770                                        writer.startElement(HTML.DIV_ELEM,editor);
771                                        writer.writeAttribute(HTML.CLASS_ATTR,"kupu-toolbox-label",null);
772                                            writer.startElement(HTML.SPAN_ELEM,editor);
773                                            
774                                            writer.writeAttribute(I18N_TRANSLATE_ATTR,"help_paste_here",null);
775                                            writer.write("Paste &lt;object&gt; or &lt;embed&gt; tag here:");
776                                            writer.endElement(HTML.SPAN_ELEM);
777                                        writer.endElement(HTML.DIV_ELEM);
778                                        writer.startElement(HTML.TEXTAREA_ELEM,editor);
779                                        writer.writeAttribute(HTML.CLASS_ATTR,"kupu-toolbox-st kupu-embed-input",null);
780                                        
781                                        writer.writeAttribute(I18N_TRANSLATE_ATTR,"placeholder_html_code",null);
782                                        writer.write("[insert arbitrary HTML code here]");
783                                        writer.endElement(HTML.TEXTAREA_ELEM);
784                                    writer.endElement(HTML.TD_ELEM);
785                                writer.endElement(HTML.TR_ELEM);
786                                writer.startElement(HTML.TR_ELEM,editor);
787                                    writer.startElement(HTML.TD_ELEM,editor);
788                                    
789                                    writer.writeAttribute(I18N_TRANSLATE_ATTR,"custom_html_help",null);
790                                    writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
791                                    writer.writeAttribute(ROWSPAN_ATTR,"1",null);
792                                    writer.write("You may use this box to insert custom snippets of");
793                                    writer.write("HTML code. There is no guarantee that any code");
794                                    writer.write("inserted in this way will be preserved when you save");
795                                    writer.write("your edits. To select an existing object from IE click on");
796                                    writer.write("the border, from Firefox double click it.");
797                                    writer.endElement(HTML.TD_ELEM);
798                                writer.endElement(HTML.TR_ELEM);
799                            writer.endElement(HTML.TBODY_ELEM);
800                          writer.endElement(HTML.TABLE_ELEM);
801 
802                          writer.startElement(HTML.DIV_ELEM,editor);
803                          writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialogbuttons", null);
804                              writer.startElement(HTML.BUTTON_ELEM,editor);
805 
806                              writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
807                              writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
808                              writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.save()", null);
809                              
810                              writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_ok",null);
811                                  writer.write("Ok");
812                              writer.endElement(HTML.BUTTON_ELEM);
813                              writer.startElement(HTML.BUTTON_ELEM,editor);
814 
815                              writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
816                              writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
817                              writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.closeDrawer()", null);
818                              
819                              writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_cancel",null);
820                                  writer.write("Cancel");
821                              writer.endElement(HTML.BUTTON_ELEM);
822                          writer.endElement(HTML.DIV_ELEM);
823                      writer.endElement(HTML.DIV_ELEM);
824                  writer.endElement(HTML.DIV_ELEM);
825 
826                 // Table drawer
827                  writer.startElement(HTML.DIV_ELEM,editor);
828                  writer.writeAttribute(HTML.ID_ATTR, "kupu-tabledrawer",null);
829                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-drawer kupu-tabledrawer",null);
830                      writer.startElement(HTML.H1_ELEM,editor);
831                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-drawer-title",null);
832                      
833                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_title",null);
834                          writer.write("Table");
835                     writer.endElement(HTML.H1_ELEM);
836                     writer.startElement(HTML.DIV_ELEM,editor);
837                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-panels", null);
838                          writer.startElement(HTML.TABLE_ELEM,editor);
839                         writer.writeAttribute(HTML.WIDTH_ATTR, "300",null);
840                             writer.startElement(HTML.TR_ELEM,editor);
841                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-panelsrow",null);
842                                 writer.startElement(HTML.TD_ELEM,editor);
843                                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-panel",null);
844                                 writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
845                                 writer.writeAttribute(ROWSPAN_ATTR,"1",null);
846 
847                                     writer.startElement(HTML.DIV_ELEM,editor);
848                                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-addtable", null);
849                                         writer.startElement(HTML.TABLE_ELEM,editor);
850                                              writer.startElement(HTML.TR_ELEM,editor);
851                                                  writer.startElement(HTML.TH_ELEM,editor);
852                                                  
853                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_class_label",null);
854                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
855                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
856                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
857                                                      writer.write("Table Class");
858                                                  writer.endElement(HTML.TH_ELEM);
859                                                  writer.startElement(HTML.TD_ELEM,editor);
860                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
861                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
862                                                      writer.startElement(HTML.SELECT_ELEM,editor);
863                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-addclasschooser", null);
864                                                          writeOption(writer, "plain", "Plain", "Plain", editor);
865                                                          writeOption(writer, "listing","Listing" , "Listing", editor);
866                                                          writeOption(writer, "grid", "Grid", "Grid", editor);
867                                                          writeOption(writer, "data", "Data", "Data", editor);
868                                                      writer.endElement(HTML.SELECT_ELEM);
869                                                  writer.endElement(HTML.TD_ELEM);
870                                              writer.endElement(HTML.TR_ELEM);
871 
872                                              writer.startElement(HTML.TR_ELEM, editor);
873                                                  writer.startElement(HTML.TH_ELEM,editor);
874                                                  
875                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_rows_label",null);
876                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
877                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
878                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);                                                 
879                                                      writer.write("Rows");
880                                                  writer.endElement(HTML.TH_ELEM);
881                                                  writer.startElement(HTML.TD_ELEM, editor);
882                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
883                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
884                                                      writer.startElement(HTML.INPUT_ELEM, editor);
885                                                      writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
886                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-newrows", null);
887                                                      writer.writeAttribute(HTML.VALUE_ATTR, "3", null); // MyFaces special
888                                                      writer.writeAttribute(HTML.ONKEYPRESS_ATTR, "return HandleDrawerEnter(event);", null);
889                                                      writer.endElement(HTML.INPUT_ELEM);
890                                                  writer.endElement(HTML.TD_ELEM);
891                                              writer.endElement(HTML.TR_ELEM);
892 
893                                              writer.startElement(HTML.TR_ELEM, editor);
894                                                  writer.startElement(HTML.TH_ELEM,editor);
895                                                  
896                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_columns_label",null);
897                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
898                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
899                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);                                                 
900                                                      writer.write("Columns");
901                                                  writer.endElement(HTML.TH_ELEM);
902                                                  writer.startElement(HTML.TD_ELEM, editor);
903                                                      writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
904                                                      writer.writeAttribute(ROWSPAN_ATTR,"1",null);
905                                                      writer.startElement(HTML.INPUT_ELEM, editor);
906                                                      writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
907                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-newcols", null);
908                                                      writer.writeAttribute(HTML.VALUE_ATTR, "3", null); // MyFaces special
909                                                      writer.writeAttribute(HTML.ONKEYPRESS_ATTR, "return HandleDrawerEnter(event);", null);
910                                                      writer.endElement(HTML.INPUT_ELEM);
911                                                  writer.endElement(HTML.TD_ELEM);
912                                              writer.endElement(HTML.TR_ELEM);
913 
914                                              writer.startElement(HTML.TR_ELEM, editor);
915                                                  writer.startElement(HTML.TH_ELEM,editor);
916                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
917                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
918                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
919                                                  writer.endElement(HTML.TH_ELEM);
920                                                  writer.startElement(HTML.TD_ELEM, editor);
921                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
922                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
923                                                      writer.startElement(HTML.INPUT_ELEM,editor);
924                                                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-tabledrawer-makeheader",null);
925                                                      writer.writeAttribute(HTML.TYPE_ATTR,"checkbox",null);
926                                                      writer.writeAttribute("checked","checked",null);
927                                                      writer.writeAttribute(HTML.ONKEYPRESS_ATTR,"return HandleDrawerEnter(event);",null);
928                                                      writer.writeAttribute(HTML.ID_ATTR,"tabledrawer_makeheader",null);
929                                                      writer.endElement(HTML.INPUT_ELEM);
930                                                      writer.startElement(HTML.LABEL_ATTR,editor);
931                                                      
932                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_headings_label",null);
933                                                      writer.writeAttribute("for","tabledrawer_makeheader",null);
934                                                          writer.write("Create Headings");
935                                                      writer.endElement(HTML.LABEL_ATTR);
936                                                  writer.endElement(HTML.TD_ELEM);
937                                              writer.endElement(HTML.TR_ELEM);
938 
939                                              writer.startElement(HTML.TR_ELEM, editor);
940                                                  writer.startElement(HTML.TH_ELEM,editor);
941                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
942                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
943                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
944                                                  writer.endElement(HTML.TH_ELEM);
945                                                  writer.startElement(HTML.TD_ELEM, editor);
946                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
947                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
948                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
949                                                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-dialog-button",null);
950                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
951                                                      
952                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_add_table_button",null);
953                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.createTable()", null);
954                                                          writer.write("Add Table");
955                                                      writer.endElement(HTML.BUTTON_ELEM);
956                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
957                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
958                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
959                                                      
960                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_fix_tables_button",null);
961                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.fixAllTables()", null);
962                                                         writer.write("Fix All Tables");
963                                                      writer.endElement(HTML.BUTTON_ELEM);
964                                                  writer.endElement(HTML.TD_ELEM);
965                                              writer.endElement(HTML.TR_ELEM);
966 
967                                          writer.endElement(HTML.TABLE_ELEM);
968                                      writer.endElement(HTML.DIV_ELEM);
969 
970                                      writer.startElement(HTML.DIV_ELEM,editor);
971                                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-edittable", null);
972                                         writer.startElement(HTML.TABLE_ELEM,editor);
973                                              writer.startElement(HTML.TR_ELEM,editor);
974                                                  writer.startElement(HTML.TH_ELEM,editor);
975                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
976                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_class_label",null);
977                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
978                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
979                                                      writer.write("Table Class");
980                                                  writer.endElement(HTML.TH_ELEM);
981                                                  writer.startElement(HTML.TD_ELEM,editor);
982                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
983                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
984                                                      writer.startElement(HTML.SELECT_ELEM,editor);
985                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-editclasschooser", null);
986                                                      writer.writeAttribute(HTML.ONCHANGE_ATTR, "drawertool.current_drawer.setTableClass(this.options[this.selectedIndex].value)", null);
987                                                          writeOption(writer, "plain", "Plain", "Plain", editor);
988                                                          writeOption(writer, "listing", "Listing", "Listing", editor);
989                                                          writeOption(writer, "grid", "Grid", "Grid", editor);
990                                                          writeOption(writer, "data", "Data", "Data", editor);
991                                                      writer.endElement(HTML.SELECT_ELEM);
992                                                  writer.endElement(HTML.TD_ELEM);
993                                              writer.endElement(HTML.TR_ELEM);
994 
995                                              writer.startElement(HTML.TR_ELEM,editor);
996                                                  writer.startElement(HTML.TH_ELEM,editor);
997                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
998                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_alignment_label",null);
999                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1000                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1001                                                      writer.write("Current column alignment");
1002                                                  writer.endElement(HTML.TH_ELEM);
1003                                                  writer.startElement(HTML.TD_ELEM,editor);
1004                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1005                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1006                                                      writer.startElement(HTML.SELECT_ELEM,editor);
1007                                                      writer.writeAttribute(HTML.ID_ATTR,"kupu-tabledrawer-alignchooser",null);
1008                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-tabledrawer-alignchooser", null);
1009                                                      writer.writeAttribute(HTML.ONCHANGE_ATTR, "drawertool.current_drawer.tool.setColumnAlign(this.options[this.selectedIndex].value)", null);
1010                                                      writeOption(writer, "left", "tabledrawer_left_option", "Left", editor);
1011                                                      writeOption(writer, "center", "tabledrawer_center_option", "Center", editor);
1012                                                      writeOption(writer, "right", "tabledrawer_right_option", "Right", editor);
1013                                                      writer.endElement(HTML.SELECT_ELEM);
1014                                                  writer.endElement(HTML.TD_ELEM);
1015                                              writer.endElement(HTML.TR_ELEM);
1016 
1017                                              writer.startElement(HTML.TR_ELEM,editor);
1018                                                  writer.startElement(HTML.TH_ELEM,editor);
1019                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1020                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_column_label",null);
1021                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1022                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1023                                                      writer.write("Column");
1024                                                  writer.endElement(HTML.TH_ELEM);
1025                                                  writer.startElement(HTML.TD_ELEM,editor);
1026                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1027                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1028                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
1029                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
1030                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1031                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_add_button",null);
1032                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.addTableColumn()", null);
1033                                                          writer.write("Add");
1034                                                      writer.endElement(HTML.BUTTON_ELEM);
1035                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
1036                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
1037                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1038                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_remove_button",null);
1039                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.delTableColumn()", null);
1040                                                          writer.write("Remove");
1041                                                      writer.endElement(HTML.BUTTON_ELEM);
1042                                                  writer.endElement(HTML.TD_ELEM);
1043                                              writer.endElement(HTML.TR_ELEM);
1044 
1045                                              writer.startElement(HTML.TR_ELEM,editor);
1046                                                  writer.startElement(HTML.TH_ELEM,editor);
1047                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1048                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_row_label",null);
1049                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1050                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1051                                                      writer.write("Row");
1052                                                  writer.endElement(HTML.TH_ELEM);
1053                                                  writer.startElement(HTML.TD_ELEM,editor);
1054                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1055                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1056                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
1057                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
1058                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1059                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_add_button",null);
1060                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.addTableRow()", null);
1061                                                          writer.write("Add");
1062                                                      writer.endElement(HTML.BUTTON_ELEM);
1063                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
1064                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
1065                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1066                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_remove_button",null);
1067                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.delTableRow()", null);
1068                                                          writer.write("Remove");
1069                                                      writer.endElement(HTML.BUTTON_ELEM);
1070                                                  writer.endElement(HTML.TD_ELEM);
1071                                              writer.endElement(HTML.TR_ELEM);
1072 
1073                                              writer.startElement(HTML.TR_ELEM,editor);
1074                                                  writer.startElement(HTML.TH_ELEM,editor);
1075                                                  writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1076                                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_table_label",null);
1077                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1078                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1079                                                      writer.write("Fix Table");
1080                                                  writer.endElement(HTML.TH_ELEM);
1081                                                  writer.startElement(HTML.TD_ELEM,editor);
1082                                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1083                                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1084                                                      writer.startElement(HTML.BUTTON_ELEM, editor);
1085                                                      writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
1086                                                      writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1087                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_fix_button",null);
1088                                                      writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.current_drawer.fixTable()", null);
1089                                                          writer.write("Fix");
1090                                                      writer.endElement(HTML.BUTTON_ELEM);
1091                                                      writer.startElement(HTML.BUTTON_ELEM,editor);
1092                                                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-dialog-button",null);
1093                                                      writer.writeAttribute(HTML.TYPE_ATTR,"button",null);
1094                                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_remove_button",null);
1095                                                      writer.writeAttribute(HTML.ONCLICK_ATTR,"drawertool.current_drawer.delTable()",null);
1096                                                      writer.write("Remove");
1097                                                      writer.endElement(HTML.BUTTON_ELEM);
1098                                                  writer.endElement(HTML.TD_ELEM);
1099                                              writer.endElement(HTML.TR_ELEM);
1100 
1101                                          writer.endElement(HTML.TABLE_ELEM);
1102                                      writer.endElement(HTML.DIV_ELEM); // kupu-tabledrawer-edittable
1103                                 writer.endElement(HTML.TD_ELEM);
1104                             writer.endElement(HTML.TR_ELEM);
1105                         writer.endElement(HTML.TABLE_ELEM);
1106 
1107                         writer.startElement(HTML.DIV_ELEM,editor);
1108                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialogbuttons", null);
1109                             writer.startElement(HTML.BUTTON_ELEM,editor);
1110                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-dialog-button", null);
1111                             writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1112                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"tabledrawer_close_button",null);
1113                             writer.writeAttribute(HTML.ONCLICK_ATTR, "drawertool.closeDrawer(this)", null);
1114                                 writer.write("Close");
1115                             writer.endElement(HTML.BUTTON_ELEM);
1116                         writer.endElement(HTML.DIV_ELEM);
1117                     writer.endElement(HTML.DIV_ELEM);
1118                  writer.endElement(HTML.DIV_ELEM); // kupu-tabledrawer
1119                  
1120                  writer.startElement(HTML.DIV_ELEM,editor); //kupu-anchordrawer
1121                  writer.writeAttribute(HTML.ID_ATTR,"kupu-anchordrawer",null);
1122                  writer.writeAttribute(HTML.CLASS_ATTR,"kupu-drawer kupu-anchordrawer",null);
1123 
1124                      writer.startElement(HTML.H1_ELEM,editor);
1125                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-drawer-title",null);
1126                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"anchordrawer_title",null);
1127                      writer.write("Anchors");
1128                      writer.endElement(HTML.H1_ELEM);
1129 
1130                      writer.startElement(HTML.DIV_ELEM,editor);
1131                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-panels kupu-ins-bm",null);
1132                      
1133                          writer.startElement(HTML.UL_ELEM,editor);
1134                          writer.writeAttribute(HTML.CLASS_ATTR,"kupu-tabs",null);
1135                          
1136                              writer.startElement(HTML.LI_ELEM,editor);
1137                              writer.writeAttribute(HTML.CLASS_ATTR,"kupu-ins-bm selected",null);
1138                                  writer.startElement(HTML.ANCHOR_ELEM,editor);
1139                                  writer.writeAttribute("href","#",null);
1140                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tab_link_anchor",null);
1141                                  writer.writeAttribute("shape","rect",null);
1142                                  writer.write("Link to anchor");
1143                                  writer.endElement(HTML.ANCHOR_ELEM);
1144                              writer.endElement(HTML.LI_ELEM);
1145                          
1146                              writer.startElement(HTML.LI_ELEM,editor);
1147                              writer.writeAttribute(HTML.CLASS_ATTR,"kupu-anchor",null);
1148                                  writer.startElement(HTML.ANCHOR_ELEM,editor);
1149                                  writer.writeAttribute("href","#",null);
1150                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tab_manage_anchors",null);
1151                                  writer.writeAttribute("shape","rect",null);
1152                                  writer.write("Manage Anchors");
1153                                  writer.endElement(HTML.ANCHOR_ELEM);
1154                              writer.endElement(HTML.LI_ELEM);
1155                          
1156                              writer.startElement(HTML.LI_ELEM,editor);
1157                              writer.writeAttribute(HTML.CLASS_ATTR,"kupu-toc",null);
1158                                  writer.startElement(HTML.ANCHOR_ELEM,editor);
1159                                  writer.writeAttribute("href","#",null);
1160                                  writer.writeAttribute(I18N_TRANSLATE_ATTR,"tab_toc",null);
1161                                  writer.writeAttribute("shape","rect",null);
1162                                  writer.write("Table of contents");
1163                                  writer.endElement(HTML.ANCHOR_ELEM);
1164                              writer.endElement(HTML.LI_ELEM);
1165                          
1166                          writer.endElement(HTML.UL_ELEM);
1167                      
1168                          writer.startElement(HTML.TABLE_ELEM,editor);
1169                          writer.writeAttribute(HTML.CLASS_ATTR,"kupu-tabbed",null);
1170                          writer.writeAttribute("cellspacing","0",null);
1171                          
1172                              writer.startElement(HTML.TR_ELEM,editor);
1173                              
1174                                  writer.startElement(HTML.TD_ELEM,editor);
1175                                  writer.writeAttribute(HTML.CLASS_ATTR,"kupu-bm-select",null);
1176                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1177                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1178                                  
1179                                      writer.startElement(HTML.SELECT_ELEM,editor);
1180                                      writer.writeAttribute(HTML.ID_ATTR,"kupu-bm-sel1",null);
1181                                      writer.writeAttribute("size","10",null);
1182                                      
1183                                      writer.endElement(HTML.SELECT_ELEM);
1184                                  
1185                                  writer.endElement(HTML.TD_ELEM);
1186                              
1187                                  writer.startElement(HTML.TD_ELEM,editor);
1188                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1189                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1190                                  
1191                                  writer.startElement(HTML.DIV_ELEM,editor);
1192                                  writer.writeAttribute(HTML.CLASS_ATTR,"kupu-bm-heading",null);
1193                                  
1194                                      writer.startElement(HTML.DIV_ELEM,editor);
1195                                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-bm-tablestyle invis-ins-bm invis-anchor",null);
1196                                      
1197                                          writer.startElement(HTML.LABEL_ATTR,editor);
1198                                          writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_table_style",null);
1199                                          writer.writeAttribute("for","kupu-bm-outcls",null);
1200                                          writer.write("Table style");
1201                                          
1202                                          writer.endElement(HTML.LABEL_ATTR);
1203                                          
1204                                          writer.startElement(HTML.SELECT_ELEM,editor);
1205                                          writer.writeAttribute(HTML.ID_ATTR,"kupu-bm-outcls",null);
1206                                          writer.writeAttribute("size","1",null);
1207                                          
1208                                          writer.startElement(HTML.OPTION_ELEM,editor);
1209                                          writer.writeAttribute(HTML.VALUE_ATTR,"",null);
1210                                          writer.writeAttribute(I18N_TRANSLATE_ATTR,"Normal",null);
1211                                          writer.write("Normal paragraph");
1212                                          writer.endElement(HTML.OPTION_ELEM);
1213                                          
1214                                          writer.endElement(HTML.SELECT_ELEM);
1215                                          
1216                                      writer.endElement(HTML.DIV_ELEM);
1217                                  
1218                                      writer.startElement(HTML.DIV_ELEM,editor);
1219                                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-bm-numbering invis-ins-bm invis-anchor",null);
1220                                      
1221                                          writer.startElement(HTML.LABEL_ATTR,editor);
1222                                          writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_numbering",null);
1223                                          writer.writeAttribute("for","kupu-bm-number",null);
1224                                          writer.write("Numbering");
1225                                          
1226                                          writer.endElement(HTML.LABEL_ATTR);
1227                                      
1228                                          writer.startElement(HTML.INPUT_ELEM,editor);
1229                                          writer.writeAttribute(HTML.TYPE_ATTR,"checkbox",null);
1230                                          writer.writeAttribute(HTML.CLASS_ATTR,"hide-ins-bm hide-anchor",null);
1231                                          writer.writeAttribute("checked","checked",null);
1232                                          writer.writeAttribute(HTML.ID_ATTR,"kupu-bm-number",null);
1233                                          writer.endElement(HTML.INPUT_ELEM);
1234                                      
1235                                      writer.endElement(HTML.DIV_ELEM);
1236                                  
1237                                      writer.startElement(HTML.DIV_ELEM,editor);
1238                                      writer.writeAttribute(HTML.CLASS_ATTR,"invis-ins-bm",null);
1239                                      
1240                                          writer.startElement(HTML.LABEL_ATTR,editor);
1241                                          writer.writeAttribute("for","kupu-bm-checkall",null);
1242                                          
1243                                          writer.startElement("em",editor);
1244                                          writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_toggle_all",null);
1245                                          writer.write("toggle all");
1246                                          writer.endElement("em");
1247                                          
1248                                          writer.endElement(HTML.LABEL_ATTR);
1249                                          
1250                                          writer.startElement(HTML.INPUT_ELEM,editor);
1251                                          writer.writeAttribute(HTML.TYPE_ATTR,"checkbox",null);
1252                                          writer.writeAttribute(HTML.CLASS_ATTR,"hide-ins-bm",null);
1253                                          writer.writeAttribute("checked","checked",null);
1254                                          writer.writeAttribute(HTML.ID_ATTR,"kupu-bm-checkall",null);
1255                                          writer.endElement(HTML.INPUT_ELEM);
1256                                      
1257                                      writer.endElement(HTML.DIV_ELEM);
1258                                      
1259                                  writer.endElement(HTML.DIV_ELEM);
1260                                  
1261                                  writer.startElement(HTML.DIV_ELEM,editor);
1262                                  writer.writeAttribute(HTML.CLASS_ATTR,"kupu-bm-paras",null);
1263                                  writer.write("&#160;");
1264                                  writer.endElement(HTML.DIV_ELEM);
1265                                  
1266                                  writer.endElement(HTML.TD_ELEM);
1267                                  
1268                              writer.endElement(HTML.TR_ELEM);
1269                              
1270                              writer.startElement(HTML.TR_ELEM,editor);
1271                              
1272                                  writer.startElement(HTML.TD_ELEM,editor);
1273                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1274                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1275                                  
1276                                      writer.startElement(HTML.SELECT_ELEM,editor);
1277                                      writer.writeAttribute(HTML.ID_ATTR,"kupu-bm-sel2",null);
1278                                      writer.writeAttribute("size","1",null);
1279                                      writer.writeAttribute(HTML.CLASS_ATTR,"hide-ins-bm hide-anchor",null);
1280                                      
1281                                          writer.startElement(HTML.OPTION_ELEM,editor);
1282                                          writer.writeAttribute(HTML.VALUE_ATTR,"",null);
1283                                          writer.writeAttribute(I18N_TRANSLATE_ATTR,"opt_2nd_style",null);
1284                                          writer.write("(optional 2nd style)");
1285                                          writer.endElement(HTML.OPTION_ELEM);
1286                                      
1287                                      writer.endElement(HTML.SELECT_ELEM);
1288                                  
1289                                  writer.endElement(HTML.TD_ELEM);
1290                              
1291                                  writer.startElement(HTML.TD_ELEM,editor);
1292                                  writer.writeAttribute(HTML.COLSPAN_ATTR,"1",null);
1293                                  writer.writeAttribute(ROWSPAN_ATTR,"1",null);
1294                                  
1295                                      writer.startElement(HTML.DIV_ELEM,editor);
1296                                      writer.writeAttribute(HTML.CLASS_ATTR,"kupu-bm-help",null);
1297                                      
1298                                      writer.startElement(HTML.SPAN_ELEM,editor);
1299                                      writer.writeAttribute(HTML.CLASS_ATTR,"hide-anchor hide-toc discreet",null);
1300                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"create_anchor_link_help",null);
1301                                      writer.write("Select a paragraph style then choose a paragraph and Ok to insert a link to that location.");
1302                                      
1303                                      writer.endElement(HTML.SPAN_ELEM);
1304                                      
1305                                      writer.startElement(HTML.SPAN_ELEM,editor);
1306                                      writer.writeAttribute(HTML.CLASS_ATTR,"hide-ins-bm hide-anchor discreet",null);
1307                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"create_toc_help",null);
1308                                      writer.write("Select one or two paragraph styles, then Ok to insert a table of contents.");
1309                                      
1310                                      writer.endElement(HTML.SPAN_ELEM);
1311                                      
1312                                      writer.startElement(HTML.SPAN_ELEM,editor);
1313                                      writer.writeAttribute(HTML.CLASS_ATTR,"hide-ins-bm hide-toc discreet",null);
1314                                      writer.writeAttribute(I18N_TRANSLATE_ATTR,"create_anchor_help",null);
1315                                      writer.write("Anchors are created for checked paragraphs and");
1316                                      writer.write("removed for unchecked paragraphs when you press Ok.");
1317                                      writer.write("Anchors in use on this page may not be deleted.");
1318                                      
1319                                      writer.endElement(HTML.SPAN_ELEM);
1320                                      
1321                                      writer.endElement(HTML.DIV_ELEM);
1322                                  
1323                                  writer.endElement(HTML.TD_ELEM);
1324                              
1325                              writer.endElement(HTML.TR_ELEM);
1326                              
1327                          writer.endElement(HTML.TABLE_ELEM);
1328                      
1329                          writer.startElement(HTML.DIV_ELEM,editor);
1330                          writer.writeAttribute(HTML.CLASS_ATTR,"kupu-dialogbuttons",null);
1331                          
1332                              writer.startElement(HTML.BUTTON_ELEM,editor);
1333                              writer.writeAttribute(HTML.CLASS_ATTR,"kupu-dialog-button",null);
1334                              writer.writeAttribute(HTML.TYPE_ATTR,"button",null);
1335                              writer.writeAttribute(HTML.ONCLICK_ATTR,"drawertool.current_drawer.save()",null);
1336                              writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_ok",null);
1337                              writer.write("Ok");
1338                              writer.endElement(HTML.BUTTON_ELEM);
1339                          
1340                              writer.startElement(HTML.BUTTON_ELEM,editor);
1341                              writer.writeAttribute(HTML.CLASS_ATTR,"kupu-dialog-button",null);
1342                              writer.writeAttribute(HTML.TYPE_ATTR,"button",null);
1343                              writer.writeAttribute(HTML.ONCLICK_ATTR,"drawertool.closeDrawer()",null);
1344                              writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_cancel",null);
1345                              writer.write("Cancel");
1346                              writer.endElement(HTML.BUTTON_ELEM);
1347                          
1348                          writer.endElement(HTML.DIV_ELEM);
1349                      writer.endElement(HTML.DIV_ELEM);
1350                  writer.endElement(HTML.DIV_ELEM);
1351             writer.endElement(HTML.DIV_ELEM); // toolbar
1352 
1353             //
1354             // Tool Boxes
1355             //
1356             writer.startElement(HTML.DIV_ELEM, editor);
1357             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolboxes", null);
1358             writer.writeAttribute(HTML.ID_ATTR, "kupu-toolboxes", null);
1359             if( ! editor.isShowAnyToolBox() ){
1360                 writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1361             }
1362 
1363                 // Properties tool box
1364                 writer.startElement(HTML.DIV_ELEM, editor);
1365                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox", null);
1366                 writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-properties", null);
1367                 if( ! editor.isShowPropertiesToolBox() ){
1368                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1369                 }
1370                     writer.startElement(HTML.H1_ELEM, editor);
1371                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-heading", null);
1372                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"title_properties",null);
1373                         writer.write("Properties");
1374                     writer.endElement(HTML.H1_ELEM);
1375 
1376                     writer.startElement(HTML.DIV_ELEM, editor);
1377                         writer.startElement(HTML.DIV_ELEM, editor);
1378                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1379                         writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_title",null);
1380                             writer.write("Title:");
1381                         writer.endElement(HTML.DIV_ELEM);
1382                         writer.startElement(HTML.INPUT_ELEM, editor);
1383                         writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1384                         writer.writeAttribute(HTML.ID_ATTR, "kupu-properties-title", null);
1385                         writer.writeAttribute(HTML.TYPE_ATTR,"text",null);
1386                         writer.endElement(HTML.INPUT_ELEM);
1387                         writer.startElement(HTML.DIV_ELEM, editor);
1388                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1389                         writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_description",null);
1390                             writer.write("Description:");
1391                         writer.endElement(HTML.DIV_ELEM);
1392                         writer.startElement(HTML.TEXTAREA_ELEM, editor);
1393                             writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1394                             writer.writeAttribute(HTML.ID_ATTR, "kupu-properties-description", null);
1395                         writer.endElement(HTML.TEXTAREA_ELEM);
1396                     writer.endElement(HTML.DIV_ELEM);
1397                 writer.endElement(HTML.DIV_ELEM);
1398 
1399                 // Links tool box
1400                 writer.startElement(HTML.DIV_ELEM, editor);
1401                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox", null);
1402                 writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-links", null);
1403                 if( ! editor.isShowLinksToolBox() ){
1404                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1405                 }
1406                     writer.startElement(HTML.H1_ELEM, editor);
1407                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-heading", null);
1408                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_links",null);
1409                         writer.write("Links");
1410                     writer.endElement(HTML.H1_ELEM);
1411 
1412                     writer.startElement(HTML.DIV_ELEM, editor);
1413                     writer.writeAttribute(HTML.ID_ATTR,"kupu-toolbox-addlink",null);
1414 
1415                         writer.startElement(HTML.DIV_ELEM, editor);
1416                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1417                             writer.startElement(HTML.SPAN_ELEM, editor);
1418                             
1419                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_link_text",null);
1420                                 writer.write("Link the highlighted text to this URL:");
1421                             writer.endElement(HTML.SPAN_ELEM);
1422                         writer.endElement(HTML.DIV_ELEM);
1423 
1424                         writer.startElement(HTML.INPUT_ELEM, editor);
1425                         writer.writeAttribute(HTML.ID_ATTR, "kupu-link-input", null);
1426                         writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1427                         writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
1428                         writer.endElement(HTML.INPUT_ELEM);
1429 
1430                         writer.startElement(HTML.DIV_ELEM, editor);
1431                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-buttons", null);
1432                             writer.startElement(HTML.BUTTON_ELEM, editor);
1433                             writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1434                             writer.writeAttribute(HTML.ID_ATTR, "kupu-link-button", null);
1435                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-action", null);
1436                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_makelink",null);
1437                                 writer.write("Make Link");
1438                             writer.endElement(HTML.BUTTON_ELEM);
1439                         writer.endElement(HTML.DIV_ELEM);
1440 
1441                     writer.endElement(HTML.DIV_ELEM);
1442                 writer.endElement(HTML.DIV_ELEM);
1443 
1444                 // Images tool box
1445                 writer.startElement(HTML.DIV_ELEM, editor);
1446                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox", null);
1447                 writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-images", null);
1448                 if( ! editor.isShowImagesToolBox() ){
1449                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1450                 }
1451                     writer.startElement(HTML.H1_ELEM, editor);
1452                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-heading", null);
1453                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"title_images",null);
1454                         writer.write("Images");
1455                     writer.endElement(HTML.H1_ELEM);
1456 
1457                     writer.startElement(HTML.DIV_ELEM, editor);
1458                         writer.startElement(HTML.DIV_ELEM, editor);
1459                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1460                             writer.startElement(HTML.SPAN_ELEM, editor);
1461                             
1462                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_image_class",null);
1463                                 writer.write("Image class:");
1464                             writer.endElement(HTML.SPAN_ELEM);
1465                         writer.endElement(HTML.DIV_ELEM);
1466 
1467                         writer.startElement(HTML.SELECT_ELEM, editor);
1468                         writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1469                         writer.writeAttribute(HTML.ID_ATTR, "kupu-image-float-select", null);
1470                             writeOption(writer, "image-inline", "opt_inline", "Inline", editor);
1471                             writeOption(writer, "image-left", "opt_left", "Left", editor);
1472                             writeOption(writer, "image-right", "opt_right", "Right", editor);
1473                         writer.endElement(HTML.SELECT_ELEM);
1474 
1475                         writer.startElement(HTML.DIV_ELEM, editor);
1476                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1477                             writer.startElement(HTML.SPAN_ELEM, editor);
1478                             
1479                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_insert_image_url",null);
1480                                 writer.write("Insert image at the following URL:");
1481                             writer.endElement(HTML.SPAN_ELEM);
1482                         writer.endElement(HTML.DIV_ELEM);
1483                         writer.startElement(HTML.INPUT_ELEM, editor);
1484                         writer.writeAttribute(HTML.ID_ATTR, "kupu-image-input", null);
1485                         writer.writeAttribute(HTML.VALUE_ATTR, "kupuimages/kupu_icon.gif", null);
1486                         writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1487                         writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
1488                         writer.endElement(HTML.INPUT_ELEM);
1489 
1490                         writer.startElement(HTML.DIV_ELEM, editor);
1491                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-buttons", null);
1492                             writer.startElement(HTML.BUTTON_ELEM, editor);
1493                             writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1494                             writer.writeAttribute(HTML.ID_ATTR, "kupu-image-addbutton", null);
1495                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-action", null);
1496                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"button_insert_image",null);
1497                                 writer.write("Insert Image");
1498                             writer.endElement(HTML.BUTTON_ELEM);
1499                         writer.endElement(HTML.DIV_ELEM);
1500 
1501                     writer.endElement(HTML.DIV_ELEM);
1502 
1503                 writer.endElement(HTML.DIV_ELEM);
1504 
1505                 // Tables tool box
1506                 writer.startElement(HTML.DIV_ELEM, editor);
1507                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox", null);
1508                 writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-tables", null);
1509                 if( ! editor.isShowTablesToolBox() ){
1510                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1511                 }
1512                     writer.startElement(HTML.H1_ELEM, editor);
1513                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-heading", null);
1514                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"title_tables",null);
1515                         writer.write("Tables");
1516                     writer.endElement(HTML.H1_ELEM);
1517 
1518                     writer.startElement(HTML.DIV_ELEM, editor);
1519 
1520                         writer.startElement(HTML.DIV_ELEM, editor);
1521                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1522                             writer.startElement(HTML.SPAN_ELEM, editor);
1523                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_table_class",null);
1524                                 writer.write("Table Class:");
1525                             writer.endElement(HTML.SPAN_ELEM);
1526                             writer.startElement(HTML.SELECT_ELEM, editor);
1527                             writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1528                             writer.writeAttribute(HTML.ID_ATTR, "kupu-table-classchooser", null);
1529                                 writer.write(' ');
1530                             writer.endElement(HTML.SELECT_ELEM);
1531                         writer.endElement(HTML.DIV_ELEM);
1532 
1533                         // Add table
1534                         writer.startElement(HTML.DIV_ELEM, editor);
1535                         writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-addtable", null);
1536                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-addtable", null);
1537                             writer.startElement(HTML.DIV_ELEM, editor);
1538                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1539                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_rows",null);
1540                                 writer.write("Rows:");
1541                             writer.endElement(HTML.DIV_ELEM);
1542                             writer.startElement(HTML.INPUT_ELEM, editor);
1543                             writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1544                             writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
1545                             writer.writeAttribute(HTML.ID_ATTR, "kupu-table-newrows", null);
1546                             writer.endElement(HTML.INPUT_ELEM);
1547 
1548                             writer.startElement(HTML.DIV_ELEM, editor);
1549                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1550                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_columns",null);
1551                                 writer.write("Columns:");
1552                             writer.endElement(HTML.DIV_ELEM);
1553                             
1554                             writer.startElement(HTML.INPUT_ELEM, editor);
1555                             writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1556                             writer.writeAttribute(HTML.TYPE_ATTR, "text", null);
1557                             writer.writeAttribute(HTML.ID_ATTR, "kupu-table-newcols", null);
1558                             writer.endElement(HTML.INPUT_ELEM);
1559 
1560                             writer.startElement(HTML.DIV_ELEM, editor);
1561                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1562                                 writer.startElement(HTML.SPAN_ELEM,editor);
1563                                 writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_headings",null);
1564                                     writer.write("Headings:");
1565                                 writer.endElement(HTML.SPAN_ELEM);
1566                                 writer.startElement(HTML.INPUT_ELEM, editor);
1567                                 writer.writeAttribute(HTML.NAME_ATTR, "kupu-table-makeheader", null);
1568                                 writer.writeAttribute(HTML.ID_ATTR, "kupu-table-makeheader", null);
1569                                 writer.writeAttribute(HTML.TYPE_ATTR, "checkbox", null);
1570                                 writer.endElement(HTML.INPUT_ELEM);
1571                                 writer.startElement(HTML.LABEL_ELEM, editor);
1572                                 writer.writeAttribute(HTML.FOR_ATTR, "kupu-table-makeheader", null);
1573                                 writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_create",null);
1574                                     writer.write("Create");
1575                                 writer.endElement(HTML.LABEL_ELEM);
1576                             writer.endElement(HTML.DIV_ELEM);
1577 
1578                             writer.startElement(HTML.DIV_ELEM, editor);
1579                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-buttons", null);
1580                                 writeButton(writer, "kupu-table-fixall-button", "Fix Table", editor,"button_fix_table");
1581                                 writeButton(writer, "kupu-table-addtable-button", "Add Table", editor,"button_add_table");
1582                             writer.endElement(HTML.DIV_ELEM);
1583                         writer.endElement(HTML.DIV_ELEM); // Add table
1584 
1585                         // Edit table
1586                         writer.startElement(HTML.DIV_ELEM, editor);
1587                         writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-edittable", null);
1588                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-edittable", null);
1589 
1590                             writer.startElement(HTML.DIV_ELEM, editor);
1591                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1592                                 writer.startElement(HTML.SPAN_ELEM,editor);
1593                                 writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_col_align",null);
1594                                     writer.write("Col Align:");
1595                                 writer.endElement(HTML.SPAN_ELEM);
1596 
1597                                 writer.startElement(HTML.SELECT_ELEM, editor);
1598                                 writer.writeAttribute(HTML.CLASS_ATTR, "wide", null);
1599                                 writer.writeAttribute(HTML.ID_ATTR, "kupu-table-alignchooser", null);
1600                                     writeOption(writer, "left","tabledrawer_left_option", "Left", editor);
1601                                     writeOption(writer, "center","tabledrawer_center_option", "Center", editor);
1602                                     writeOption(writer, "right","tabledrawer_right_option", "Right", editor);
1603                                 writer.endElement(HTML.SELECT_ELEM);
1604                             writer.endElement(HTML.DIV_ELEM);
1605 
1606                             writer.startElement(HTML.DIV_ELEM,editor);
1607                             writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-buttons", null);
1608                                 writer.startElement(HTML.BR_ELEM,editor);
1609                                 writer.writeAttribute("clear","none",null);
1610                                 writer.endElement(HTML.BR_ELEM);
1611 
1612                                 writeButton(writer, "kupu-table-addcolumn-button", "Add Column", editor,"button_add_column");
1613                                 writeButton(writer, "kupu-table-delcolumn-button", "Remove Column", editor,"button_remove_column");
1614 
1615                                 writer.startElement(HTML.BR_ELEM,editor);
1616                                 writer.writeAttribute("clear","none",null);
1617                                 writer.endElement(HTML.BR_ELEM);
1618 
1619                                 writeButton(writer, "kupu-table-addrow-button", "Add Row", editor,"button_add_row");
1620                                 writeButton(writer, "kupu-table-delrow-button", "Remove Row", editor,"button_remove_row");
1621                                 writeButton(writer, "kupu-table-fix-button", "Fix Table", editor,"button_fix_table");
1622                                 writeButton(writer, "kupu-table-del-button", "Remove Table", editor,"button_remove_table");
1623                             writer.endElement(HTML.DIV_ELEM);
1624 
1625                         writer.endElement(HTML.DIV_ELEM); // Edit table
1626 
1627                     writer.endElement(HTML.DIV_ELEM);
1628                 writer.endElement(HTML.DIV_ELEM);
1629 
1630                 // Cleanup expressions tool box
1631                 writer.startElement(HTML.DIV_ELEM, editor);
1632                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox", null);
1633                 writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-cleanupexpressions", null);
1634                 if( ! editor.isShowCleanupExpressionsToolBox() ){
1635                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1636                 }
1637                     writer.startElement(HTML.H1_ELEM, editor);
1638                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-heading", null);
1639                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"title_cleanup_expressions",null);
1640                         writer.write("Cleanup expressions");
1641                     writer.endElement(HTML.H1_ELEM);
1642 
1643                     writer.startElement(HTML.DIV_ELEM, editor);
1644                         writer.startElement(HTML.DIV_ELEM, editor);
1645                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1646                             writer.startElement(HTML.SPAN_ELEM,editor);
1647                             
1648                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"label_select_cleanup",null);
1649                                 writer.write("Select a cleanup action:");
1650                             writer.endElement(HTML.SPAN_ELEM);
1651                         writer.endElement(HTML.DIV_ELEM);
1652                         writer.startElement(HTML.SELECT_ELEM,editor);
1653                         writer.writeAttribute(HTML.ID_ATTR, "kupucleanupexpressionselect", null);
1654                         writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-st", null);
1655                         writer.endElement(HTML.SELECT_ELEM);
1656                         writer.startElement(HTML.DIV_ELEM,editor);
1657                         writer.writeAttribute(HTML.STYLE_ATTR,"text-align: center",null);
1658                             writer.startElement(HTML.BUTTON_ELEM,editor);
1659                             writer.writeAttribute(HTML.TYPE_ATTR,"button",null);
1660                             writer.writeAttribute(HTML.ID_ATTR,"kupucleanupexpressionbutton",null);
1661                             writer.writeAttribute(HTML.CLASS_ATTR,"kupu-toolbox-action",null);
1662                             writer.writeAttribute(I18N_TRANSLATE_ATTR,"perform_action",null);
1663                                 writer.write("Perform action");
1664                             writer.endElement(HTML.BUTTON_ELEM);
1665                         writer.endElement(HTML.DIV_ELEM);
1666                     writer.endElement(HTML.DIV_ELEM);
1667                 writer.endElement(HTML.DIV_ELEM);
1668 
1669                 // Debug tool box
1670                 writer.startElement(HTML.DIV_ELEM, editor);
1671                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox", null);
1672                 writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-debug", null);
1673                 if( ! editor.isShowDebugToolBox() ){
1674                     writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1675                 }
1676                     writer.startElement(HTML.H1_ELEM, editor);
1677                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-heading", null);
1678                     writer.writeAttribute(I18N_TRANSLATE_ATTR,"title_debug_log",null);
1679                         writer.write("Debug Log");
1680                     writer.endElement(HTML.H1_ELEM);
1681                     writer.startElement(HTML.DIV_ELEM, editor);
1682                     writer.writeAttribute(HTML.ID_ATTR, "kupu-toolbox-debuglog", null);
1683                     writer.writeAttribute(HTML.CLASS_ATTR, "kupu-toolbox-label", null);
1684                     writer.endElement(HTML.DIV_ELEM);
1685                 writer.endElement(HTML.DIV_ELEM);
1686 
1687             writer.endElement(HTML.DIV_ELEM); // kupu-toolboxes
1688 
1689             // Color Chooser
1690             writer.startElement(HTML.TABLE_ELEM, editor);
1691             writer.writeAttribute(HTML.ID_ATTR, "kupu-colorchooser", null);
1692             writer.writeAttribute(HTML.CLASS_ATTR,"kupu-colorchooser",null);
1693             writer.writeAttribute(HTML.CELLPADDING_ATTR, "0", null);
1694             writer.writeAttribute(HTML.CELLSPACING_ATTR, "0", null);
1695             writer.writeAttribute(HTML.STYLE_ATTR, "position: fixed; border-style: solid; border-color: black; border-width: 1px;", null);
1696             writer.endElement(HTML.TABLE_ELEM);
1697 
1698             // Edit space
1699             writer.startElement(HTML.DIV_ELEM, editor);
1700             if( !editor.isShowAnyToolBox() ){
1701                 writer.writeAttribute(HTML.STYLE_ATTR, "margin-right: 0.3em", null);
1702             }
1703             if( editor.getStyle()!=null ){
1704                 // Convert the style into an style declaration so that it doesn't preempt the Zoom works as it's relying on changing the class
1705                 addResource.addInlineStyleAtPosition(
1706                         context, AddResource.HEADER_BEGIN,
1707                         "#kupu-editor{height: inherit;}\n"+
1708                         "div.kupu-fulleditor{"+editor.getStyle()+"}");
1709             }
1710             writer.writeAttribute(HTML.CLASS_ATTR,
1711                                   "kupu-editorframe"+(editor.getStyleClass()==null ? "" : " "+editor.getStyleClass()), null);
1712             // Warning, this is special to MyFaces, to allow to have the component in a hidden tab.
1713                 writer.startElement(HTML.IFRAME_ELEM, editor);
1714                 writer.writeAttribute(HTML.ID_ATTR, getIFrameID(editor, context), null);
1715                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-editor-iframe", null);
1716                 writer.writeAttribute(HTML.FRAMEBORDER_ATTR, "0", null);
1717                 writer.writeAttribute(HTML.SCROLLING_ATTR, "auto", null);
1718                 writer.writeAttribute(HTML.ONMOUSEOVER_ATTR, "myFacesKupuReactivateDesignMode(this)", null);
1719                 writer.writeAttribute(HTML.ONFOCUS_ATTR, "myFacesKupuReactivateDesignMode(this)", null);
1720 
1721                 writer.endElement(HTML.IFRAME_ELEM);
1722 
1723                 writer.startElement(HTML.TEXTAREA_ELEM, editor);
1724                 writer.writeAttribute(HTML.CLASS_ATTR, "kupu-editor-textarea", null);
1725                 writer.writeAttribute(HTML.ID_ATTR, "kupu-editor-textarea", null);
1726                     writer.write(' ');
1727                 writer.endElement(HTML.TEXTAREA_ELEM);
1728             writer.endElement(HTML.DIV_ELEM);
1729 
1730         writer.endElement(HTML.DIV_ELEM); // kupu-fulleditor
1731 
1732         String text = editor.getValueAsHtmlDocument( context );
1733         String encodedText = text == null ? "" : JavascriptUtils.encodeString( text );
1734 
1735         String resourceBaseURL = addResource.getResourceUri(context, InputHtmlRenderer.class, null);
1736 
1737         writer.startElement(HTML.SCRIPT_ELEM, editor);
1738         writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
1739             writer.write("myFacesKupuSet(" +
1740                          "\""+encodedText+"\"," +
1741                          "\""+clientId+"\"," +
1742                          "\""+formId+"\"," +
1743                          "\""+resourceBaseURL+"\"" +
1744                          ");");
1745         writer.endElement(HTML.SCRIPT_ELEM);
1746     }
1747 
1748     static private String getIFrameID(InputHtml editor, FacesContext context){
1749         return editor.getClientId(context)+"_iframe";
1750     }
1751 
1752     static private void writeTag(ResponseWriter writer, String tagName, String tagBody, UIComponent component) throws IOException{
1753         writer.startElement(tagName, component);
1754         writer.writeText(tagBody, null);
1755         writer.endElement(tagName);
1756     }
1757 
1758     static private void writeButton(ResponseWriter writer, String classAttr, String title, String accessKey, UIComponent component, String i18nattributes) throws IOException{
1759         writeButton(writer, classAttr, title, accessKey, classAttr+"-button", component, i18nattributes);
1760     }
1761 
1762     static private void writeButton(ResponseWriter writer, String classAttr, String title, String accessKey, String id, UIComponent component, String i18nattributes) throws IOException{
1763         writeButton(writer, classAttr, title, accessKey, id, true, component,i18nattributes);
1764     }
1765 
1766     static private void writeButton(ResponseWriter writer, String classAttr, String title, String accessKey, String id, boolean display, UIComponent component, String i18nattributes) throws IOException{
1767         writer.startElement(HTML.BUTTON_ELEM, component);
1768         
1769         writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1770         writer.writeAttribute(HTML.CLASS_ATTR, classAttr, null);
1771         writer.writeAttribute(HTML.ID_ATTR, id, null);
1772         writer.writeAttribute(HTML.TITLE_ATTR, title, null);
1773         writer.writeAttribute(I18N_ATTRIBUTES_ATTR, i18nattributes==null?"title":i18nattributes, null);
1774         if( ! display )
1775             writer.writeAttribute(HTML.STYLE_ATTR, "display: none", null);
1776         if( accessKey != null ){
1777             writer.writeAttribute(HTML.ACCESSKEY_ATTR, accessKey, null);
1778         }
1779         writer.write("&#160;");
1780         writer.endElement(HTML.BUTTON_ELEM);
1781     }
1782 
1783     static private void writeButton(ResponseWriter writer, String id, String text, UIComponent component, String i18nattributes) throws IOException{
1784         writer.startElement(HTML.BUTTON_ELEM, component);
1785         writer.writeAttribute(HTML.TYPE_ATTR, "button", null);
1786         writer.writeAttribute(HTML.ID_ATTR, id, null);
1787         writer.writeAttribute(I18N_ATTRIBUTES_ATTR, i18nattributes, null);
1788             writer.write(text);
1789         writer.endElement(HTML.BUTTON_ELEM);
1790     }
1791 
1792     static private void writeOption(ResponseWriter writer, String value, String translate, String body, UIComponent component) throws IOException{
1793         writer.startElement(HTML.OPTION_ELEM,component);
1794         
1795         writer.writeAttribute(HTML.VALUE_ATTR, value, null);
1796         writer.writeAttribute(I18N_TRANSLATE_ATTR, translate, null);
1797             writer.write(body);
1798         writer.endElement(HTML.OPTION_ELEM);
1799     }
1800 
1801     public void decode(FacesContext facesContext, UIComponent uiComponent) {
1802         RendererUtils.checkParamValidity(facesContext, uiComponent, InputHtml.class);
1803         InputHtml editor = (InputHtml) uiComponent;
1804 
1805         Map paramMap = facesContext.getExternalContext().getRequestParameterMap();
1806         String clientId = uiComponent.getClientId(facesContext);
1807 
1808         if (paramMap.containsKey(clientId)) {
1809             //request parameter found, set submittedValue
1810             String submitedText = (String)paramMap.get(clientId);
1811             String htmlText = useFallback(editor) ? HTMLEncoder.encode(submitedText, true, true) : submitedText;
1812 
1813             editor.setSubmittedValue( htmlText );
1814         } else {
1815             log.warn(HtmlRendererUtils.NON_SUBMITTED_VALUE_WARNING + " Component : "+
1816                      RendererUtils.getPathToComponent( editor ));
1817         }
1818     }
1819 
1820     public Object getConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object submittedValue) throws ConverterException {
1821         RendererUtils.checkParamValidity(facesContext, uiComponent, InputHtml.class);
1822         InputHtml editor = (InputHtml) uiComponent;
1823         String submittedDocument = editor.getValueFromDocument((String)submittedValue);
1824         return RendererUtils.getConvertedUIOutputValue(facesContext, editor, submittedDocument);
1825     }
1826 }