// Dependências: (nenhuma).
//
// Funções de utilidade geral.

var KLangVar = "__lang__"	// *
var nullf = function(){}	// A função nula.
window.doc = document, window.wnd = window
var isIE = doc.all != null, uqnum

doc.write ("<script type=\"text/javascript\" src=\"/reutil/js/compat" + (isIE ? "-ie" : "-w3c") + ".js\"></script>")


if (!wnd.formDispatchHook) {
	uqnum = 0					// Destina-se a produzir sempre um nº único. Uso: ++uqnum.
	wnd.formDispatchHook = 0	// 'Hook' que deve correr antes de se despachar um formulário ('null' indica que este módulo não está definido).
}

// Faz a derivação da classe 'derived' a partir de 'base'. Isto deve acontecer antes de se definir 'Derived'. A partir da utilização
// desta função, a variável 'proto' fica a apontar para o protótipo da classe derivada. Adicionalmente, cada instância de 'derived' 
// terá definida a variável 'base' que apontará para a classe base.
var proto = null
function derive (derived, base) {	derived.prototype = proto = new base ()	}

// Método clone para os objectos 'Date'.
Date.prototype.clone = function () {	return new Date (this.getTime ())	}

// Espera 'msecs' mili-segundos.
// NOTA: Evitar o uso desta função em detrimento de 'setTimeout'.
function delay (msecs) {
	var d = new Date
	while (1) {
		var mill = new Date
		var diff = mill - d
		if (diff > msecs)
			break
	}
}

// Retorna 'html' com os caractéres HTML especiais representados como entidades.
function htmlEncode (html) {	return html.replace (/</g, "&lt;").replace (/>/g, "&gt;").replace (/\"/g, "&quot;").replace (/&/g, "&amp;")	}

// Limpa 'to' e retorna um novo agendamento.
function setTO (to, f, msecs) {
	clearTimeout (to)
	return wnd.setTimeout (f, msecs)
}

// Limpa o conteúdo da IFRAME 'ifr'.
function clearIfr (ifr) {
	ifr.substr && (ifr = elmn (ifr))
	ifr.src = ifr.location = "/reutil/nada.html"
}

// Retorna o documento em 'ifr'.
function getIfrDoc (ifr) {	return ifr.contentWindow.document	}

// Retorna 'true' se 'a' for um 'Array'.
function isArray (a) {	return a.constructor == Array || (a.item != null && !a.tagName) 	}

// Retorna 'item' de 'dic' ou 'optDef'.
function choose (dic, item, optDef) {
	var res = dic [item]
	return typeof res == "undefined" ? optDef : res
}

// Torna a página corrente protegida contra cópia.
var _lckEl
function lockPage () {
	doc.onselectstart = doc.ondragstart = doc.oncontextmenu = function () {
		if (!wnd.event) return false	// FF.
		return canW (event.srcElement)	// IE.
	}
	if (!isIE) {
		listen (wnd, "mousemove", function (ev) {
			if (canW (_lckEl)) return
			unselText ()
		})
		listen (wnd, "mousedown", function (ev) {
			var el = ev.target
			_lckEl = canW (el) ? el : null
		})
		listen (wnd, "keydown", function (ev) {	_lckEl = ev.target	})
	}

	// EL é editável?
	function canW (el) {
		var tn
		if (!el || !(tn = el.tagName)) return false
		tn = tn.toLowerCase ()
		return tn == "input" || tn == "textarea" || tn == "select"
	}
}

// Retorna a localização da página corrente dentro do servidor respectivo.
function getPageAddr (optDoc) {
	var l = optDoc ? optDoc.location : doc.location
	return l.pathname + l.search
}

// Retorna o elemento ELID.
function elm (elId) {	return doc.getElementById (elId)	}

// Retorna o elemento chamado ELNM.
function elmn (elnm) {
	var els = elmns (elnm)
	if (els && els.length > 0) return els [0]
}

// Semelhante a 'elm', mas ELIDORNAME tanto pode ser o id como o nome do elemento.
function elmx (elIdOrName) {	return doc.getElementById (elIdOrName) || (el = doc.getElementsByName (elIdOrName) [0])	}

// Semelhante a 'elm', mas ELNAMEORID tanto pode ser o nome como o id do elemento.
function elmnx (elNameOrId) {	return elmns (elNameOrId) [0] || doc.getElementById (elNameOrId)	}

// Retorna todos os elementos chamados 'nm'.
function elmns (nm)	{	return doc.getElementsByName (nm)	}

// Elimina 'el'.
function removeElm (el) {	return el.parentNode.removeChild (el.substr ? elmx (el) : el)	}

// Percorre os elementos de 'frm', aplicando 'f' a cada um deles.
function _enumFormElms (frm, f) {
	var els = frm.elements
	for (var i = 0; i < els.length; ++i)
		if (f (els [i]) == false) return false
	return true
}

// Avalia se (X, Y) está entre o rectângulo indicado.
function inRect (l, t, w, h, x, y) {	return x >= l && x < l + w && y >= t && y < t + h	}

// Aplica 'f' a 'a', quer este seja um "array" ou um único elemento.
// Retorna o resultado da última execução de 'f'. Se for 'false' não se processa mais elementos.
function apply (f, a) {
	var res, i
	if (isArray (a)) {
		for (i = 0; i < a.length; ++i)
			if ((res = f (a [i], i)) == false) break
	}
	else res = f (a, -1)
	return res
}

// Carrega o script 'url' em 'optDoc'.
function loadScript (url, optDoc) {
	var d = optDoc || doc, el = d.createElement ("script")
	el.type	= "text/javascript"
	el.src	= url
	d.getElementsByTagName ("HEAD") [0].appendChild (el)
}
