/**
* Hace que la url dada por urlBase se mantenga fija en la
* barra del navegador. Adicionalmente, ejecuta la función
* callback si es que se necesita que un script se ejecute
* en segundo plano sin recargarse mientras se navega por
* el sitio.
*
* Copyright 2011, Rodrigo González
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* or GPL Version 3 (http://www.opensource.org/licenses/GPL-3.0) licenses.
*
* http://desarrolladorweb.cl/blog/2011/mantener-la-misma-url-con-javascript/
*
* @param string urlBase la url base del sitio. Por ejemplo "http://desarrolladorweb.cl/blog/"
* por omisión toma el valor del protocolo más el dominio. Debe terminar en '/'
* @param function callbackInicio una función javascript a ser ejecutada
* al inicio de la navegación, es decir, en la primera vez que el usuario
* ingresa al sitio.
* @param function callbackCambioPagina una función javascript a ser ejecutada
* cada vez que el usuario cambia de página.
*/
function mantenerUrlFija(urlBase, callbackInicio, callbackCambioPagina) {
// Variable necesaria para referenciar objetos entre páginas.
top.window.mantenerUrlFija_Data = top.window.mantenerUrlFija_Data || {};
// Determinar la url base en el caso de que no
// se haya pasado como parámetro.
urlBase = urlBase || top.location.protocol +'//'+ top.location.host + '/';
// En el caso de que la url actual sea distinta a la que se
// debería mostrar, se hace la redirección.
if(top.location.href != urlBase) {
top.location.href = urlBase;
return;
}
// El id del iframe.
var ID_IFRAME = '__mantenerUrlFija__';
// En el caso de que sea la primera vez que se abre la ventana,
// entonces hay que construir un nuevo documento html y poner dentro
// el iframe dentro del cual se incrusta el contenido de la página.
if(!top.document.getElementById(ID_IFRAME)) {
// Los nodos que actualmente están.
var headViejo = document.getElementsByTagName('head')[0];
var bodyViejo = document.getElementsByTagName('body')[0];
// Crea el nuevo nodo del head.
var headNuevo = document.createElement('head');
// Adjunta el titulo de la pagina.
var tituloPagina = document.createElement('title');
var textoTituloPagina = headViejo.getElementsByTagName('title')[0].firstChild.nodeValue;
tituloPagina.appendChild(document.createTextNode(textoTituloPagina));
headNuevo.appendChild(tituloPagina);
// Adjunta las reglas css de estilo de la pagina.
var style = document.createElement('style');
style.type = 'text/css';
var css = 'html{overflow:hidden}';
css += 'html,body,iframe {width: 100%;height: 100%;border:0;margin:0;padding:0}';
css = document.createTextNode(css);
if(style.styleSheet) // IE
style.styleSheet.cssText = css.nodeValue;
else // Navegadores decentes
style.appendChild(css);*
headNuevo.appendChild(style);
// Crea el nuevo nodo del body.
var bodyNuevo = document.createElement('body');
// El nodo html actual.
var html = document.getElementsByTagName('html')[0];
var htmlPivote = html.cloneNode(true);
// Adjunta el iframe.
var iframe = document.createElement('iframe');
iframe.id = ID_IFRAME;
bodyNuevo.appendChild(iframe);
// Elimina el nodo head viejo y agrega el nuevo.
html.removeChild(headViejo);
html.appendChild(headNuevo);
// Elimina el nodo Body viejo y agrega el nuevo.
html.removeChild(bodyViejo);
html.appendChild(bodyNuevo);
// Finalmente, escribir
iframe = document.getElementById(ID_IFRAME);
var documentoIframe = iframe.contentWindow || iframe.contentDocument;
if(documentoIframe.document) documentoIframe = documentoIframe.document;
// curiosamente, htmlPivote.firstChild.nodeValue no funciona...
documentoIframe.write(htmlPivote.innerHTML);
documentoIframe.close();
}
// Cuando se carga el iframe.
top.document.getElementById(ID_IFRAME).onload = function(){
var documentoIframe = this.contentWindow || this.contentDocument;
if(documentoIframe.document) documentoIframe = documentoIframe.document;
// Se establecen los target de los enlaces para que operen
// dentro del iframe.
var enlaces = documentoIframe.getElementsByTagName('a');
// Crea una expresión regular para el dominio, la primera línea es genérica
// para escapar carácteres propios de una expresión regular.
var expDominio = urlBase.replace(/[-[\]{}()*+?.,\\^$|#\s\/]/g, "\\$&");
expDominio = new RegExp('^' + expDominio);
// Para cada enlace, establecer el target _self o _top según corresponda.
for(var i in enlaces)
enlaces[i].target = expDominio.test(enlaces[i].href) ? '_self' : '_top';
// Ejecuta la función sólo cuando se ingresa a la primera página de la navegación.
if(callbackInicio && !top.window.mantenerUrlFija_Data_OK) {
top.window.mantenerUrlFija_Data_OK = true;
var c = callbackInicio;
c(documentoIframe, top.window.mantenerUrlFija_Data);
}
// Ejecuta la función cada vez que se accede a otra página.
if(callbackCambioPagina) {
var _c = callbackCambioPagina;
_c(documentoIframe, top.window.mantenerUrlFija_Data);
}
} // iframe.onload
}