var bdpag = undefined

// Retorna à lista que deu acesso a esta página, retornando-lhe os parâmetros que esta recebeu da outra.
// NOTA: Esta função só pode ser usada num "caminho" (ver 'registerInPath').
function goBack () {
	var ret = getRetURLs ()
	ret.pop ()
	// Extraír o código para retornar á página anterior.
	var code = ret.pop ()

	var wm = eval (code)
	var target = wm.getItem ("__returl__")
	wm.removeItem ("__returl__")

	wm.send (target.value)
}

// Retorna o estado corrente como um "array" de 'WebMsg's.
function getRetURLs () {	return wnd.__returl__ || (wnd.__returl__ = new Array)	}

// Retorna uma 'WebMsg' com a representação do estado desta página, após o seu carregamento.
function getPageState () {	return eval (getRetURLs () [0])	}

// Coloca 'wm' como a representação do estado desta página logo após o seu carregamento.
function setPageState (wm) {	getRetURLs () [0] = "new WebMsg()" + wmAsText (wm)	}

// Executa a página 'detalhes.asp', passando-lhe o comando 'cmd'.
// NOTA: 'optTarget' poderá ser:
//		- ""					: Envia o comando para "detalhes.asp";
//		- null					: Envia o comando para a página corrente;
//		- Qualquer outro valor	: vai para a página com esse nome.
function servCmd (cmd, optId, optFrm, optTarget, optFunc, optNoOnSubmit, optExtraParams) {
	if (cmd == "rem" && !confirmRemove ()) return
	if (optFrm && optFrm.substr) optFrm = elmn (optFrm)
	if (!optTarget && optTarget == "") optTarget = "detalhes.html"

	var wm = new WebMsg (optFrm)
	wm.frm._wmObj = wm
	// Acrescentar alguns campos à mensagem.
	if (optId != undefined) wm.setItem ("rid", optId)
	if (bdpag != undefined) wm.setItem ("bdpag", bdpag)
	// Colocar parâmetros extra.
	if (optExtraParams) {
		for (var i = 0; i < optExtraParams.length; i += 2)
			wm.newItem (optExtraParams [i], optExtraParams [i + 1])
	}
	// Permitir ao utilizador analisar a mensagem final.
	if (optFunc) optFunc (wm)
	// Preparar o envio do formulário.
	optTarget && (wm.frm.action = optTarget)
	if (runHook (top.formDispatchHook, wm.frm) == false) return false
	if (!optNoOnSubmit && optFrm && runHook (optFrm.onsubmit, null, wm.frm) == false) return false
	// Colocar aqui o código para retornar às páginas anteriores.
	var ret = getRetURLs ()
	if (ret) {
		var l = !optTarget ? 1 : 0	// A próxima página é igual a esta. Ao entrar nela ir-se-à registar outra vez.
		if (ret.length > l) {
			l = ret.length - l
			var s = "["
			for (var i = 0; i < l; ++i)
				s += "\"" + ret [i] + "\","
			s = s.substr (0, s.length - 1) + "]"
			wm.setItem ("__returl__", s)
		}
	}

	wm.setItem ("cmd", cmd).send ()
}

// Coloca 'code' no "caminho". Isso significa que a oexecutar 'code', ir-se-à para uma determinada página.
// NOTA: Esta função é usada exclusivamente por 'registerInPath'.
function registerLoc (code) {
	var ret = getRetURLs ()
	if (!code.push) code = [code]
	// Garantir que não haverão páginas duplicadas.
	if (ret.length > 0)
		for (var j = 0; j < code.length; ++j) {
			var s1 = code [j]
			for (var i = 0; i < ret.length; ++i) {
				var s2 = ret [i]
				var l = s1.length < s2.length ? s1.length : s2.length

				if (_getUrl (s2) == _getUrl (s1)) {
					code.splice (j, 1)
					break
				}
			}
		}
	// Guardar 'code'.
	window.__returl__ = ret.concat (code)
}

function _getUrl (code) {
var k = ".newItem('__returl__','"
var kl = k.length
	var i = code.lastIndexOf (k)
	if (i < 0) return ""
	var j = code.indexOf ("')", i + kl)
	if (j < 0) return
	
	var s = code.substring (i + kl, j)
	if ((i = code.lastIndexOf ("?")) >= 0) s = s.substr (0, i)
	
	return s
}

// Retorna a representação textual de 'wm'.
function wmAsText (wm) {
	var frm = wm.frm.elements, res = ""
	for (var i = 0; i < frm.length; ++i) {
		var it = frm [i]
		res += ".newItem ('" + it.name + "','" + it.value + "')"
	}
	return res
}
