protected UIComponent getFor(FacesContext context, UISelect2Picker picker) {
   // Associated control
   String control = picker.getFor();
   if (StringUtil.isNotEmpty(control)) {
     UIComponent c = FacesUtil.getComponentFor(picker, control);
     return c;
   }
   return null;
 }
  @Override
  public void encodeBegin(FacesContext context, UIComponent component) throws IOException {

    ResponseWriter writer = context.getResponseWriter();

    UISelect2Picker picker = (UISelect2Picker) component;
    // IPickerData data = picker.getDataProvider();

    UIInputEx _for = (UIInputEx) getFor(context, picker);

    boolean readOnly = _for != null ? FacesUtil.isComponentReadOnly(context, _for) : false;

    // load select2 library and stylesheet
    ScriptResource js = new ScriptResource();
    js.setClientSide(true);
    js.setSrc("/.ibmxspres/.extlib/bootstrap/select2/select2.js");

    StyleSheetResource css = new StyleSheetResource();
    css.setHref("/.ibmxspres/.extlib/bootstrap/select2/select2.css");

    StyleSheetResource cssBootstrap = new StyleSheetResource();
    cssBootstrap.setHref("/.ibmxspres/.extlib/bootstrap/select2/select2-bootstrap.css");

    UIViewRootEx rootEx = (UIViewRootEx) context.getViewRoot();
    rootEx.addEncodeResource(js);
    rootEx.addEncodeResource(css);
    rootEx.addEncodeResource(cssBootstrap);

    if (readOnly) {

      // selected values, let's not wrap them in a frameset and table here :-)
      writer.writeText(Select2PickerRenderer.join(_for.getValueAsList(), ", "), null);

    } else {

      String id = picker.getId();

      // if we're using the search option, select2 needs to be attached to the hidden input
      if (!picker.isUseRemoteData()) {

        newLine(writer);
        writer.startElement("select", component);
        writer.writeAttribute("id", picker.getId(), null);
        writer.writeAttribute("class", "select2picker", null);

        if (StringUtil.isNotEmpty(_for.getMultipleSeparator())) {
          writer.writeAttribute("multiple", "multiple", null);
        }

        writer.endElement("select");
      }

      newLine(writer);
      writer.startElement("script", component); // $NON-NLS-1$

      // create the parameters to initialize a new select2 object
      HashMap<String, Object> params = new HashMap<String, Object>();

      params.put("id", id);
      params.put("forId", _for.getClientId(context));
      params.put("currentValue", _for.getValueAsString());
      params.put("allowMultiple", StringUtil.isNotEmpty(_for.getMultipleSeparator()));
      params.put("restUrl", picker.getUrl(context, null)); // rest service URL
      params.put("useRemoteData", picker.isUseRemoteData());
      params.put("placeHolder", picker.getPlaceHolder());
      params.put("allowClearing", picker.isAllowClearing());
      params.put("formatSelection", picker.getFormatSelection());
      params.put("formatResult", picker.getFormatResult());
      params.put("isNativeSelect", false);

      String lw = picker.getListWidth();
      if (StringUtil.isNotEmpty(lw)) {
        params.put("listWidth", lw); // $NON-NLS-1$
      }

      int maxRowCount = picker.getMaxRowCount();

      if (maxRowCount > 0) {
        params.put("maxRowCount", maxRowCount); // $NON-NLS-1$
      }

      try {
        // writer.writeText("dojo.addOnLoad( function() { initSelect2(" +
        // JsonGenerator.toJson(JsonJavaFactory.instanceEx, params) + "); } );", null);
        writer.writeText(
            "XSP.initSelect2Picker("
                + JsonGenerator.toJson(JsonJavaFactory.instanceEx, params)
                + ");",
            null);
      } catch (JsonException e) {
      }

      writer.endElement("script");
      newLine(writer);
    }
  }