public static void init(ItsNatHttpServlet itsNatServlet, String pathPrefix) {
    pathPrefix = pathPrefix + "mathml/pages/";

    // http://webkit.org/demos/mathml/MathMLDemo.xhtml
    ItsNatDocumentTemplate docTemplate;
    docTemplate =
        itsNatServlet.registerItsNatDocumentTemplate(
            "mathml", "text/html", pathPrefix + "mathml.html");
    docTemplate.setEventsEnabled(false);
  }
  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);

    boolean debugMode = true;
    boolean loadScriptInline = true;
    boolean fastLoadMode = true;
    int commMode =
        CommMode
            .XHR_ASYNC_HOLD; // XHR_SYNC  XHR_ASYNC XHR_ASYNC_HOLD SCRIPT SCRIPT_HOLD  (el modo
                             // SCRIPT es MUY asíncrono de verdad)
    boolean onLoadCachingNodesHTML = true;
    boolean onLoadCachingNodesSVG = true;
    boolean onLoadCachingNodesXUL = true;
    boolean onLoadCachingNodesXML = true;
    boolean nodeCache = true;
    int useGZip = UseGZip.SCRIPT; // NONE SCRIPT
    int clientErrorMode =
        ClientErrorMode
            .SHOW_SERVER_AND_CLIENT_ERRORS; // SHOW_SERVER_AND_CLIENT_ERRORS , NOT_CATCH_ERRORS ,
                                            // SHOW_SERVER_ERRORS
    boolean autoCleanEventListeners = true;
    boolean useXHRSyncOnUnloadEvent = true;
    int maxOpenClientsByDocument = 4; // incluye el owner
    boolean joystickMode = false;

    TestSerializationConfig.enable =
        false; // Al estar en shared funciona con RelProxy pues no se recarga

    ItsNatHttpServlet itsNatServlet = getItsNatHttpServlet();

    ItsNatServletConfig itsNatConfig = itsNatServlet.getItsNatServletConfig();

    itsNatConfig.setMaxOpenClientsByDocument(maxOpenClientsByDocument);
    itsNatConfig.setDebugMode(debugMode);
    itsNatConfig.setLoadScriptInline(loadScriptInline);
    itsNatConfig.setFastLoadMode(fastLoadMode);
    itsNatConfig.setCommMode(commMode);
    itsNatConfig.setEventTimeout(-1);
    itsNatConfig.setOnLoadCacheStaticNodes("text/html", onLoadCachingNodesHTML);
    itsNatConfig.setOnLoadCacheStaticNodes("application/xhtml+xml", onLoadCachingNodesHTML);
    itsNatConfig.setOnLoadCacheStaticNodes("image/svg+xml", onLoadCachingNodesSVG);
    itsNatConfig.setOnLoadCacheStaticNodes(
        "application/vnd.mozilla.xul+xml", onLoadCachingNodesXUL);
    itsNatConfig.setOnLoadCacheStaticNodes("text/xml", onLoadCachingNodesXML);
    itsNatConfig.setNodeCacheEnabled(nodeCache);
    itsNatConfig.setUseGZip(useGZip);
    itsNatConfig.setClientErrorMode(clientErrorMode);
    itsNatConfig.setUsePatternMarkupToRender(false);
    itsNatConfig.setAutoCleanEventListeners(autoCleanEventListeners);
    itsNatConfig.setUseXHRSyncOnUnloadEvent(useXHRSyncOnUnloadEvent);

    itsNatConfig.setDefaultDateFormat(DateFormat.getTimeInstance(DateFormat.LONG, Locale.US));
    itsNatConfig.setDefaultNumberFormat(NumberFormat.getNumberInstance(Locale.US));

    itsNatServlet.addItsNatServletRequestListener(new TestGlobalDocumentLoadListener());
    itsNatServlet.addEventListener(new TestGlobalEventListener(itsNatServlet));
    itsNatServlet.addItsNatAttachedClientEventListener(new TestGlobalRemoteControlListener());

    String pathPrefix = getServletContext().getRealPath("/") + "/WEB-INF/pages/web/test/";
    Properties pages = loadProperties(pathPrefix + "pages.properties");

    ItsNatDocumentTemplate docTemplate;

    docTemplate =
        registerDocument(
            "test_core", "text/html", pathPrefix, pages); // "application/xhtml+xml"  "text/html"
    TestCoreDocLoadListener listener = new TestCoreDocLoadListener();
    docTemplate.addItsNatServletRequestListener(listener);
    // docTemplate.removeItsNatServletRequestListener(listener);
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    docTemplate.addEventListener(new TestGlobalEventListener(docTemplate));
    // docTemplate.setReferrerEnabled(true);

    docTemplate =
        registerDocument(
            "test_core_attached_server_launcher",
            "text/html",
            pathPrefix,
            pages); // "application/xhtml+xml"  "text/html"
    // El motivo de este template es para poder generar una página con un template complejo
    // evitando hacer una copia como HTML estático, pero el template tiene <comment> e <include>
    // que no se resuelven en modo "attached server" porque el template "es la página cliente"
    // y en general renderización inicial que no será posible al hacer el attachment.
    docTemplate.addItsNatServletRequestListener(new TestCoreAttachServerLauncherDocLoadListener());
    docTemplate.setScriptingEnabled(false);
    docTemplate.setFastLoadMode(
        true); // FUNDAMENTAL para añadir los <script> de attachment a la página inicial

    docTemplate =
        itsNatServlet.registerItsNatDocumentTemplateAttachedServer(
            "test_core_attached_server", "text/html"); // "application/xhtml+xml"  "text/html"
    docTemplate.addItsNatServletRequestListener(new TestCoreDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    docTemplate.addEventListener(new TestGlobalEventListener(docTemplate));
    docTemplate.setCommMode(CommMode.SCRIPT_HOLD); // SCRIPT_HOLD será lo normal en attached server

    docTemplate =
        registerDocument(
            "test_core_iframe",
            "text/html",
            pathPrefix,
            pages); // "application/xhtml+xml"  "text/html"
    docTemplate.addItsNatServletRequestListener(new TestCoreIFrameDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    // docTemplate.setReferrerEnabled(true);

    docTemplate =
        registerDocument(
            "test_components",
            "text/html",
            pathPrefix,
            pages); // "application/xhtml+xml"  "text/html"
    docTemplate.addItsNatServletRequestListener(new TestComponentsDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    docTemplate.addCreateItsNatComponentListener(new TestCreateItsNatComponentListener());
    // docTemplate.setAutoBuildComponents(true);
    docTemplate.registerArtifact("tableComplexStructure", new TestComplexHTMLTableStructure());
    docTemplate.setJoystickMode(joystickMode);
    // docTemplate.setScriptingEnabled(false);
    // docTemplate.setEventsEnabled(false);

    docTemplate = registerDocument("test_client_mutation", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestClientMutationDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_client_mutation_svg", "image/svg+xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestClientMutationDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_remote_ctrl", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestRemoteCtrlLauncherDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_cache", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestCacheLoadDocListener());

    docTemplate = registerDocument("test_autosync_forms", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestAutoSyncFormsDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_xml", "text/xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestXMLDocLoadListener());
    docTemplate.setOnLoadCacheStaticNodes(false);

    docTemplate = registerDocument("test_xml_comp", "text/xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestXMLComponentsDocLoadListener());
    docTemplate.setOnLoadCacheStaticNodes(false);
    docTemplate.setAutoBuildComponents(true);

    docTemplate = registerDocument("test_svg", "image/svg+xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    docTemplate.setReferrerEnabled(true);

    docTemplate =
        registerDocument("test_svg_attached_server_launcher", "image/svg+xml", pathPrefix, pages);
    // Ver notas en test_core_attached_server_launcher
    docTemplate.addItsNatServletRequestListener(new TestSVGAttachServerLauncherDocLoadListener());
    docTemplate.setScriptingEnabled(false);
    docTemplate.setFastLoadMode(true);

    docTemplate =
        itsNatServlet.registerItsNatDocumentTemplateAttachedServer(
            "test_svg_attached_server", "image/svg+xml");
    docTemplate.addItsNatServletRequestListener(new TestSVGDocLoadListener());
    docTemplate.setCommMode(CommMode.SCRIPT_HOLD); // SCRIPT_HOLD será lo normal en attached server

    docTemplate = registerDocument("test_svg_batik", "text/html", pathPrefix, pages);
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    // docTemplate.setScriptingEnabled(false);

    docTemplate = registerDocument("test_svg_in_xhtml", "application/xhtml+xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGInXHTMLDocLoadListener());
    docTemplate.setAutoBuildComponents(
        true); // No sirve para nada, simplemente para que se pase por los elementos svg y detectar
               // que no de error por no ser HTML
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_in_html", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGInXHTMLDocLoadListener());
    docTemplate.setAutoBuildComponents(
        true); // No sirve para nada, simplemente para que se pase por los elementos svg y detectar
               // que no de error por no ser HTML
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_in_html_asv", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGInXHTMLAdobeSVGDocLoadListener());
    docTemplate.setAutoBuildComponents(
        true); // No sirve para nada, simplemente para que se pase por los elementos svg y detectar
               // que no de error por no ser HTML
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate =
        registerDocument(
            "test_svgweb", "text/html", pathPrefix, pages); // "text/html"  "application/xhtml+xml"
    docTemplate.addItsNatServletRequestListener(new TestSVGWebDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_asv_iframe_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(
        new TestIFrameObjEmbAppletSVGParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_asv_object_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(
        new TestIFrameObjEmbAppletSVGParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_asv_embed_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(
        new TestIFrameObjEmbAppletSVGParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_ssrc_object_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGSavareseParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_ssrc_embed_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGSavareseParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate =
        registerDocument("test_svg_batik_applet_autob_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(
        new TestIFrameObjEmbAppletSVGParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate =
        registerDocument("test_svg_batik_object_autob_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(
        new TestIFrameObjEmbAppletSVGParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate =
        registerDocument("test_svg_batik_embed_autob_parent", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(
        new TestIFrameObjEmbAppletSVGParentDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_no_ajax", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestNoAJAXDocLoadListener());
    docTemplate.setEventsEnabled(false);

    docTemplate = registerDocument("test_no_script", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestNoScriptDocLoadListener());
    docTemplate.setScriptingEnabled(false);

    docTemplate = registerDocument("test_referrer_pull", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestReferrerPullDocLoadListener());
    docTemplate.setReferrerEnabled(true);

    docTemplate = registerDocument("test_referrer_pull_next", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestReferrerPullNextDocLoadListener());
    docTemplate.setReferrerEnabled(true);

    docTemplate = registerDocument("test_referrer_push", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestReferrerPushDocLoadListener());
    docTemplate.setReferrerEnabled(true);
    docTemplate.setReferrerPushEnabled(true);

    docTemplate = registerDocument("test_referrer_push_next", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestReferrerPushNextDocLoadListener());
    docTemplate.setReferrerEnabled(true);
    docTemplate.setReferrerPushEnabled(true);

    docTemplate = registerDocument("test_pretty_url", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestPrettyURLDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    // docTemplate.setFrameworkScriptFilesBasePath("/itsnat_dev/js");

    docTemplate = registerDocument("test_mobile", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestMobileDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    // docTemplate.setReferrerEnabled(true);

    // docTemplate = registerDocument("test_anything","text/html",pathPrefix,pages);
    // docTemplate.addItsNatServletRequestListener(new TestAnythingDocLoadListener());

    docTemplate =
        registerDocument("test_xul", "application/vnd.mozilla.xul+xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestXULDocLoadListener());
    docTemplate.setReferrerEnabled(true);
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate =
        registerDocument(
            "test_xul_attached_server_launcher",
            "application/vnd.mozilla.xul+xml",
            pathPrefix,
            pages);
    // Ver notas en test_core_attached_server_launcher
    docTemplate.addItsNatServletRequestListener(new TestXULAttachServerLauncherDocLoadListener());
    docTemplate.setScriptingEnabled(false);
    docTemplate.setFastLoadMode(true);

    docTemplate =
        itsNatServlet.registerItsNatDocumentTemplateAttachedServer(
            "test_xul_attached_server", "application/vnd.mozilla.xul+xml");
    docTemplate.addItsNatServletRequestListener(new TestXULDocLoadListener());
    docTemplate.setCommMode(CommMode.SCRIPT_HOLD); // SCRIPT_HOLD será lo normal en attached server

    docTemplate = registerDocument("test_iframe", "text/html", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestIFrameHTMLDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate = registerDocument("test_svg_bound", "image/svg+xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGBoundDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    // docTemplate.setScriptingEnabled(false);

    docTemplate = registerDocument("test_svg_bound_savarese", "image/svg+xml", pathPrefix, pages);
    docTemplate.addItsNatServletRequestListener(new TestSVGBoundSavareseDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));

    docTemplate =
        itsNatServlet.registerItsNatDocumentTemplate(
            "test_remote_url", "text/html", "http://www.google.com");
    docTemplate.addItsNatServletRequestListener(new TestRemoteTemplateDocLoadListener());
    docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    docTemplate.setOnLoadCacheStaticNodes(false);

    docTemplate =
        itsNatServlet.registerItsNatDocumentTemplate(
            "test_remote_url_result", "text/html", new GoogleSearchResultSource());
    docTemplate.addItsNatServletRequestListener(new TestRemoteTemplateResultDocLoadListener());
    // docTemplate.addItsNatAttachedClientEventListener(new TestRemoteControlListener(false));
    docTemplate.setOnLoadCacheStaticNodes(false);
    docTemplate.setEventsEnabled(false); // No tiene estado esta página

    // Stateless main

    docTemplate =
        registerDocument(
            "test_stateless_core_initial",
            "text/html",
            pathPrefix,
            pages); // "application/xhtml+xml"  "text/html"
    docTemplate.addItsNatServletRequestListener(new TestStatelessCoreInitialDocLoadListener());
    docTemplate.setEventsEnabled(false);

    // Stateless to load fragment
    docTemplate =
        registerDocument(
            "test_stateless_core_event",
            "text/html",
            pathPrefix,
            pages); // "application/xhtml+xml"  "text/html"
    docTemplate.addItsNatServletRequestListener(new TestStatelessCoreEventDocLoadListener());
    docTemplate.addEventListener(new TestStatelessCoreTemplateLevelEventListener(docTemplate));
    docTemplate.setEventsEnabled(false);

    // FRAGMENTS

    ItsNatDocFragmentTemplate docFragDesc;

    docFragDesc = registerDocFragment("test_html_fragment", "text/html", pathPrefix, pages);

    docFragDesc =
        registerDocFragment("test_html_fragment_fragment", "text/html", pathPrefix, pages);

    docFragDesc =
        registerDocFragment("test_html_with_svg_fragment", "text/html", pathPrefix, pages);

    docFragDesc = registerDocFragment("test_xml_fragment", "text/xml", pathPrefix, pages);

    docFragDesc = registerDocFragment("test_svg_fragment", "image/svg+xml", pathPrefix, pages);

    docFragDesc = registerDocFragment("test_svg_fragment_2", "image/svg+xml", pathPrefix, pages);

    docFragDesc =
        registerDocFragment(
            "test_xul_fragment", "application/vnd.mozilla.xul+xml", pathPrefix, pages);

    docFragDesc =
        registerDocFragment(
            "test_xul_fragment_2", "application/vnd.mozilla.xul+xml", pathPrefix, pages);

    // ExtJSExampleLoadApp.init(itsNatServlet, pathPrefix + "/../");
  }