// 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"
}

/// 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.

// 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)	}


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 f = mkHook (eval ("obj.on" + evName), function (ev, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
		if (ev = wnd.event) ev.el = ev.srcElement
		return func (ev, p1, p2, p3, p4, p5, p6, p7, p8, p9)
	})
	eval ("obj.on" + evName + "=f")
	return f
}

// 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
}

}
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) {
	var f = mkHook (eval ("obj.on" + evName), function (ev, p1, p2, p3, p4, p5, p6, p7, p8, p9) {
		ev && ((wnd.event = ev).el = ev.target)
		func (ev, p1, p2, p3, p4, p5, p6, p7, p8, p9)
	})
	eval ("obj.on" + evName + "=f")
	return f
}

// 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
}

}

/*
// 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)

*/

