Saber la URL de la página Google Sites donde estamos desde un Gadget tipo url

Si estáis desarrollando Gadgets para Google y en algún momento usáis uno de tipo url, externo, quizá hayáis necesitado acceder en algún momento a la URL del documento base (blogger, google sites....). Para ello Google proporciona una variable por GET llamada parent, pero por alguna razón esto no es válido en el caso de Google Sites. Además de proporcionarla vacía, Google bloquea cualquier acceso al location.href de su ventana, tanto por top como por parent o por cualquier método.

Observando con el inspector DOM del FireBug en FireFox he descubierto que el iframe que crea tiene varias variables definidas. En concreto, una llamada "f", que se define tras cargarse el documento y que contiene la URL del parent codificada.

Así pues, he escrito un pequeño código JavaScript que recoge

// Manejador de eventos
function _addEvent(obj,type,fn) {
obj = self.getElementById( obj );
if( !obj || typeof obj != 'object' || !type || typeof type != 'string' || !fn || typeof fn != 'function' || !obj ) return false;
if (typeof obj.addEventListener != 'undefined' ) return obj.addEventListener( type, fn, false );
else if ( typeof obj.attachEvent != 'undefined' ) return obj.attachEvent( "on"+type, fn );
else return false;
}

// Extrae parametros de la URL
function _urlParams( u, n ){
var regex = new RegExp( "[\\?&]"+n+"=([^&#]*)" );
var results = regex.exec( u );
if( results == null ) return "";
else return results[1];
}

var dir = _urlParams( location.href, "parent" );
if( dir == "" ) {
var dir = "DESCONOCIDO";
try { dir = parent.location.href; } catch (e){
_addEvent(window,"load",function() {
if( typeof f == 'string' && (f.substring(0, 9) == "http%3A//" || f.substring(0, 10) == "https%3A//") ) try {
var tmp = f.split('/');
if( tmp[2] == "sites.google.com" || tmp[2] == "www.sites.google.com" ) dir = unescape(f);
} catch (e){ }
} ); // _addEvent END.
}
}

El inconveniente es que la variable dir no estará disponible hasta que se haya cargado la ventana, lo que quiere decir que no podremos usarla para hacer decisiones durante la carga de la página.

Este código está extraído del que se usa en los TagBoards de la web.


Edit: tema del post....

    Editado por Daniel el 05/02/2009 a las 22:21:26h.