// Dependências: util.js.
//
// Funções que executam tarefas que têm de ser desempenhadas de formas diferentes em "browsers" diferentes.

// Retorna o elemento chamado 'elId'.
// NOTA: Para aceder a um elemento, no IE basta escrever '<elId>' mas o "standard" exige 'doc.getElementById (<elId>)'.
function elm (elId) {	return doc.getElementById (elId)	}

// Retorna o elemento chamado 'elnm'.
function elmn (elnm) {
	var els = doc.getElementsByName (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) {
	var el = doc.getElementsByName (elNameOrId)
	return el.length > 0 ? el [0] : doc.getElementById (elNameOrId)
}

// Elimina 'el'.
function removeNode (el) {	return el.parentNode.removeChild (el.substr ? elmx (el) : el)	}

// Inverte a visibilidade de 'el'.
function swh (el) {
	el.substr && (el = elmx (el))
	el.style.display = el.style.display ? "" : "none"
}

// Dispara o evento 'evName', em 'obj'. Todos os outros parâmetros serão passados ao evento.
function triggerEvent (obj, evName, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) {	return runHook (eval ("obj.on" + evName), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10)	}

// Faz com que 'f' deixe de receber o evento 'evName' de 'obj'.
function unlisten (obj, evName, f) {
	var h = rmFromHook (eval ("obj.on" + evName), f)
	eval ("obj.on" + evName + "=h")
}

/// DOCUMENTAÇÃO PARA FUNÇÕES CROSS-BROWSER.

// ---> getCurStyle (el)
// Retorna o estilo corrente de 'el'. Este não é o mesmo que 'el.style', pois inclui os estilos associados de todas as formas e não só
// através da propriedade "style" da "tag".
// ---> getHeight (el)
// Retorna a altura de 'el'.
// ---> listen (obj, evName, func)
// Intercepta o evento 'evName' de 'obj' e chama 'func'. O nome do evento não inclui o "on"; por exemplo deve ser "click" em vez de 
// "onclick".
// A função retorna 'false' se não tiver conseguido registar o evento.
// ---> unlisten (obj, evName, func)
// Inverte a acção de 'listen'.
// ---> insertHTMLBefore (el, html)
// Insere 'html' antes de 'el'.
// ---> getPos (el)
// Retorna o posicionamento de 'el'.
// ---> stopEvent ([ev])
// Cancela o evento 'ev'. No IE, esse parâmetro é opcional.
// ---> mkHooverFX (el)
// Implementa em IE (e apenas em IE) o efeito de "hoovering".
// ---> getXY ()
// Retorna a posição do rato, segundo o evento actual, no format [X, Y].


if (isIE) {
/// IMPLEMENTAÇÃO PARA IE.

getCurStyle = function (el) {	return el.currentStyle	}

getHeight = function (el) {	return el.offsetHeight	}

listen = function (obj, evName, func) {
	if (obj.substr)
		obj = elmx (obj)
	else if (obj == window)	//! IE parece considerar que 'wnd'(obj) == 'window' só para algumas coisas!
		obj = window

	var h = mkHook (eval ("obj.on" + evName), func)
	h._rhf = _runEvent
	h._obj = obj
	eval ("obj.on" + evName + "=h")
}

// listen = function (obj, evName, func) {	return obj.attachEvent ("on" + evName, func)	}

// unlisten = function (obj, evName, func) {	return obj.detachEvent ("on" + evName, func)	}

insertHTMLBefore = function (el, html) {	el.insertAdjacentHTML( "beforeBegin", html)	}

getPos = function (el) {
	var r = el.getBoundingClientRect ()

	return { x : r.left, y : r.top, w : r.right - r.left, h : r.bottom - r.top	}
}

stopEvent = function (ev) {
	(ev || event).cancelBubble = true
	return false
}

mkHooverFX = function (el) {
	el.substr && (el = elmx (el))
	listen (el, "mouseover", function (ev) {
		if (el._hoover) return
		el.className += "-hover"
		el._hoover = true
	})
	listen (el, "mouseout", function (ev) {
		if (!el._hoover) return
		var s = el.className
		el.className = s.substr (0, s.length - 6)
		el._hoover = false
	})
}

getXY =	function () {	return [event.clientX + doc.body.scrollLeft, event.clientY + doc.body.scrollTop]	}

_runEvent = function (ev, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
	if (ev = wnd.event) {
		ev.el = ev.srcElement
		ev.oel = this._obj
	}
	return _runHook (this, ev, p1, p2, p3, p4, p5, p6, p7, p8, p9)
}

}
else {
/// IMPLEMENTAÇÃO PARA O STANDARD.

getCurStyle = function (el) {	return window.getComputedStyle (el, "")	}

getHeight = function (el) {	return window.getComputedStyle (el, "").height	}

listen = function (obj, evName, func) {
	obj.substr && (obj = elmx (obj))

	var h = mkHook (eval ("obj.on" + evName), func)
	h._rhf = _runEvent
	h._obj = obj
	eval ("obj.on" + evName + "=h")
}

// listen = function (obj, evName, func) {	return obj.addEventListener (evName, func, false)	}

// unlisten = function (obj, evName, func) {	return obj.removeEventListener (evName, func, false)	}

insertHTMLBefore = function (el, html) {
	var r = doc.createRange()
	r.setStartBefore (el)
	var frag = r.createContextualFragment (html)
	el.parentNode.insertBefore (frag, el)
}

getPos = function (el) {
	document.getBoxObjectFor (el)
	r.w = r.width
	r.h = r.height

	return r
}

stopEvent = function (ev) {
	ev.preventDefault ()
	ev.stopPropagation ()
	return false
}

mkHooverFX = nullf

getXY = function () {	return [event.pageX, event.pageY]	}


_runEvent = function (ev, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
	if (ev) {
		wnd.event = ev
		ev.el = ev.target
		ev.oel = this._obj
	}
	return _runHook (this, ev, p1, p2, p3, p4, p5, p6, p7, p8, p9)
}

}

/*
// Como gerar um evento, segundo o W3C:
var ev = doc.createEvent ("MouseEvents");
ev.initEvent ("click", false, false)
btn.dispatchEvent (ev)

var ev = doc.createEvent ("KeyEvents");
ev.initKeyEvent("keypress",true,true,null,false,false,false,false,0,ev.DOM_VK_ENTER);
a.dispatchEvent (ev)

*/


