public void encodeChildren(FacesContext facesContext, UIComponent uiComponent)
     throws IOException {
   validateParameters(facesContext, uiComponent, null);
   DOMContext domContext = DOMContext.attachDOMContext(facesContext, uiComponent);
   Element root = (Element) domContext.getRootNode();
   DOMContext.removeChildren(root);
   PanelSeries list = (PanelSeries) uiComponent;
   UISeries uiList = (UISeries) uiComponent;
   int rowIndex = uiList.getFirst();
   uiList.setRowIndex(rowIndex);
   int numberOfRowsToDisplay = uiList.getRows();
   int countOfRowsDisplayed = 0;
   while (uiList.isRowAvailable()) {
     if ((numberOfRowsToDisplay > 0) && (countOfRowsDisplayed >= numberOfRowsToDisplay)) {
       break;
     }
     Iterator childs;
     childs = list.getChildren().iterator();
     while (childs.hasNext()) {
       UIComponent nextChild = (UIComponent) childs.next();
       if (nextChild.isRendered()) {
         domContext.setCursorParent(root);
         domContext.streamWrite(facesContext, uiComponent, domContext.getRootNode(), root);
         encodeParentAndChildren(facesContext, nextChild);
       }
     }
     rowIndex++;
     countOfRowsDisplayed++;
     uiList.setRowIndex(rowIndex);
   }
   uiList.setRowIndex(-1);
 }
  public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {
    DOMContext domContext = DOMContext.attachDOMContext(facesContext, uiComponent);

    if (!domContext.isInitialized()) {
      Element rootSpan = domContext.createElement(HTML.DIV_ELEM);
      domContext.setRootNode(rootSpan);
      setRootElementId(facesContext, rootSpan, uiComponent);
    }
    Element root = (Element) domContext.getRootNode();
    String style = ((PanelSeries) uiComponent).getStyle();
    if (style != null && style.length() > 0) root.setAttribute(HTML.STYLE_ATTR, style);
    else root.removeAttribute(HTML.STYLE_ATTR);
    root.setAttribute(HTML.CLASS_ATTR, ((PanelSeries) uiComponent).getStyleClass());
    domContext.stepInto(uiComponent);
  }
  private void renderKindEditorJavascipt(FacesContext facesContext, UIComponent uiComponent) {
    KindEditor ke = (KindEditor) uiComponent;

    ke.loadJavaScript();

    //    String editorId=ke.getId();
    String clientId = uiComponent.getClientId(facesContext);

    String htmlContent = "";
    String htmlContentEscaped = "";
    if (ke.getValue() != null) {
      htmlContent = (String) ke.getValue();
      htmlContentEscaped = StringEscapeUtils.escapeHtml(htmlContent);
    }
    String contextPath = facesContext.getExternalContext().getRequestContextPath();
    log.debug("contextPath:" + contextPath);

    // 三种方式调用kindeditor脚本:直接调用、使用外部配置文件、使用组件属性配置
    // 如果不使用JQuery扩展,则直接调用kindeditor的脚本
    StringBuffer scriptCall = new StringBuffer();
    String scriptPath = ke.getBaseURI().getPath(); // 调用getBaseURI()方法会自动装载javascript相关的资源

    if (ke.getUsingJQueryExt() == false) {
      scriptCall.append(
          "try{\n"
              + "KE.remove('"
              + clientId
              + "');\n"
              + "}"
              + "catch(e){;}\n"
              + "KE.init({\n"
              + " id:'"
              + clientId
              + "',\n"
              + " imageUploadJson:'"
              + contextPath
              + "/uploadJson',\n"
              + " fileManagerJson:'"
              + contextPath
              + "/fileManagerJson',\n"
              + " allowFileManager:true,\n"
              + " allowUpload:true,\n"
              + " skinsPath:'"
              + scriptPath
              + "skins/',\n"
              + " pluginsPath:'"
              + scriptPath
              + "plugins/',\n"
              + " height:'"
              + ke.getHeight()
              + "',\n"
              + " width:'"
              + ke.getWidth()
              + "',\n"
              + " skinType:'"
              + ke.getSkin()
              + "',\n"
              + " items:"
              + ke.getItems()
              + "\n"
              + "});\n"
              + "KE.create('"
              + clientId
              + "');");
    }
    // 优先使用外部配置文件
    else if (ke.getExtConfigPath() != null && ke.getExtConfigPath().length() > 0) {
      JavascriptContext.includeLib(ke.getExtConfigPath(), facesContext);
      String configProfile = ke.getConfigProfile();
      JavascriptContext.addJavascriptCall(
          facesContext,
          configProfile
              + ".editorId='"
              + clientId
              + "';\n"
              + configProfile
              + ".baseURL='"
              + scriptPath
              + "';\n"
              + configProfile
              + ".contextPath='"
              + contextPath
              + "',\n"
              + "new KindEditorExt("
              + configProfile
              + ").setupWhenDocumentIsReady();");
    }
    // 使用页面中的组件属性值构造配置
    else {
      scriptCall.append(
          "new KindEditorExt(\n"
              + "new KindEditorConfig(\n"
              + "'"
              + clientId
              + "',\n"
              + "'"
              + ke.getBaseURI().getPath()
              + "',\n"
              + "'"
              + ke.getHeight()
              + "',\n"
              + "'"
              + ke.getWidth()
              + "',\n"
              + "'"
              + ke.getSkin()
              + "',\n"
              + "'"
              + contextPath
              + "',\n"
              + ke.getItems()
              + "\n"
              + ")\n"
              + ").setupWhenDocumentIsReady();");
    }
    if (scriptCall.length() > 0) {
      DOMContext domContext = DOMContext.attachDOMContext(facesContext, uiComponent);
      if (!domContext.isInitialized()) {
        Element script = domContext.createRootElement(HTML.SCRIPT_ELEM);
        script.setAttribute(HTML.TYPE_ATTR, "text/javascript");
        script.setAttribute(HTML.ID_ATTR, ClientIdPool.get(clientId + "script"));
        script.appendChild(domContext.createTextNode(scriptCall.toString()));
      }
    }
  }