// por lo que en ellos quedar� definido el clientDoc en las dos fases del request
// Modificamos temporalmente el ServletResponse con un wrapper para el que el Writer y el OutputStream
// recojan la salida como una cadena, pues dicha cadena la tenemos que meter
// en un document.write en c�digo JavaScript.
ClientDocumentAttachedServerImpl clientDocAS = getClientDocumentAttachedServer();
ItsNatStfulDocumentTemplateAttachedServerImpl template = clientDocAS.getItsNatStfulDocumentTemplateAttachedServer();
ItsNatServletResponseImpl itsNatResponse = getItsNatServletResponse();
ItsNatServletRequestImpl itsNatRequest = itsNatResponse.getItsNatServletRequestImpl();
ServletResponse responseOriginal = itsNatResponse.getServletResponse();
ServletResponseAttachedServer servResWrapper = itsNatResponse.createServletResponseAttachedServer();
itsNatResponse.setServletResponse(servResWrapper);
RequestNormalLoadDocAttachedServerImpl delegRequest = new RequestNormalLoadDocAttachedServerImpl(template,getRequestAttachedServerLoadDoc(),itsNatRequest);
itsNatRequest.setRequest(delegRequest); // Para que al procesar el request el ItsNatServletRequestImpl est� correctamente conectado a request de carga normal no al attached y el c�digo del usuario obtenga el ClientDocument normal por ejemplo
delegRequest.process(null);
ClientDocumentStfulImpl clientDocNormal = delegRequest.getClientDocumentStful();
Browser browser = clientDocNormal.getBrowser();
itsNatResponse.setServletResponse(responseOriginal); // restauramos
// Los objetos ItsNatServletRequestImpl y ItsNatServletResponseImpl quedan vinculados
// a los objetos RequestImpl y ResponseImpl de la carga normal y est� bien as�
String resultMarkup = servResWrapper.getString(delegRequest.getResponse().getEncoding());
StringBuilder code = new StringBuilder();
code.append("itsnat.clean();\n");
code.append("try{ delete window.itsnat; }catch(ex){}\n"); // Ya ha cumplido su funci�n
boolean useOnLoad = clientDocAS.isOnLoadHanderUsed();
// Sabemos que el markup son dos <script> con el c�digo inline
if (template.isMIME_HTML() && !useOnLoad)
{
String resultMarkupStringLiteral = JSRenderImpl.toTransportableStringLiteral(resultMarkup, true, browser);
code.append( "document.write(" + resultMarkupStringLiteral + ");\n" );
}
else // Caso de useOnLoad o no HTML MIME
{
// Es un poco absurdo volver al DOM pero es lo mejor
// document.write no vale.
ItsNatStfulDocumentImpl itsNatDoc = clientDocNormal.getItsNatStfulDocument();
DocumentFragment docFrag = itsNatDoc.toDOM(resultMarkup);
if (template.isMIME_XHTML() || (template.isMIME_HTML() && useOnLoad))
{
code.append("var root = document.body;\n");
code.append("if (!root) root = document.getElementsByTagName(\"body\")[0];\n"); // Caso de MIME XHTML y WebKit
}
else // SVG y XUL
{
code.append("var root = document.documentElement;\n");
}
Element script = (Element)docFrag.getFirstChild();
while(script != null)
{
CharacterData text = (CharacterData)script.getFirstChild();
String scriptCode = text.getData(); // Si es un nodo Text puede tener el CDATA como parte del texto
String prefix = "<![CDATA[";
String suffix = "]]>";
if (scriptCode.startsWith(prefix))
scriptCode = MarkupTemplateVersionImpl.removePrefixSuffix(scriptCode,prefix,suffix);
String scriptCodeLiteral = JSRenderImpl.toTransportableStringLiteral(scriptCode, true, browser);
if (template.isMIME_HTML() && useOnLoad)
{
code.append("var script = document.createElement(\"script\");\n");
code.append("script.setAttribute(\"id\",\"" + script.getAttribute("id") + "\");\n");
if (clientDocAS.getBrowser() instanceof BrowserMSIEOld)
{
// Esto es porque haciendo script.text = ... da error al insertar (se cae el MSIE)
// yo creo que la culpa la tiene la eliminaci�n del <script> desde c�digo
// de dentro del <script> insertado via appendChild (no ocurre si es cargado via markup o via document.write())
// El evento onload de la p�gina no es ejecutado.