// Dependências: valid.js (para 'reqSel').
//
// Rotinas para manipulação de 'Selects' ('combos').

var KSelectNullValue = "_"	// Reflectir em 'select.vbs' - Não deve ser vazio, para não ser igual à ausência de opção.
var KSelectAnItemMsg = "(Seleccione um item)"
var KSelectNoItemMsg = "(Não existem itens nesta lista)"


// Retorna 'true' se o campo 'cmb', que deve ser do tipo 'Select', estiver vazio.
function isNullSel (cmb) {
	cmb.substr && (cmb = elmnx (cmb))
	return cmb.value == KSelectNullValue || cmb.selectedIndex < 0 || cmb.value == ""
}

// Retorna 'false' se o campo 'cmbs', que deve ser do tipo 'Select', estiver vazio. 
// Nesse caso, apresenta, também , uma mensagem ao utilizador.
// 'cmbs' tanto pode ser uma única "combo" como um "array" delas.
function reqSel (cmbs) {	return apply (function (cmb) {	return isNullSel (cmb) ? _vError (cmb, KMsgReqField) : true	}, cmbs)	}

// Limpa a selecção em 'cmbs'. Este parâmetro tanto pode ser uma única "combo" como um "array" delas.
function unselect (cmbs) {
	cmbs.substr && (cmbs = elmnx (cmbs))
	apply (function (cmb) {
		if (!cmb.multiple)
			cmb.value = KSelectNullValue
		else for (var i = 0; i < cmb.length; ++i)
			cmb.options [i].selected = false
	}, cmbs)
}

// Limpa todos os itens de 'cmb'.
function clearSelect (cmb) {	selectMsg (cmb, KSelectNoItemMsg)	}

// Limpa todos os itens de 'cmb', deixando apenas um com a mensagem 'msg'.
function selectMsg (cmb, msg) {
	cmb.substr && (cmb = elmnx (cmbs))
	cmb.options.length = 1
	cmb.options [0] = new Option (msg, KSelectNullValue)
}

// Selecciona o item 'vl' em 'cmb' e opcionalmente dispara eventos respectivos.
function select (cmb, vl, optNoEvents) {
	cmb.substr && (cmb = elmnx (cmbs))
	cmb.value = vl
	cmb.defaultSelected != null || (cmb.defaultSelected = vl)
	var i = cmb.selectedIndex, opts = cmb.options
	// Tentar seleccionar o valor nulo ou o primeiro.
	if (i < 0 || vl != opts [i].value) {
		cmb.value = KSelectNullValue
		if (cmb.selectedIndex < 0 && opts.length > 0)
			cmb.value = opts [0].value
	}
	if (!optNoEvents && cmb.onchange) cmb.onchange (cmb)
}

// Retorna o texto mostrado em 'cmb'.
function getCmbText (cmb) {
	cmb.substr && (cmb = elmnx (cmbs))
	var i = cmb.selectedIndex
	return i < 0 ? null : cmb.options [i].text
}

// Copia todos os itens de 'srcCmb' para 'destCmb'.
function copyOpts (destCmb, srcCmb) {
	destCmb.substr && (destCmb = elmnx (destCmb))
	destCmb.substr && (srcCmb = elmnx (srcCmb))

	destCmb.options.length = 0
	var opts = srcCmb.options
	for (var i = 0; i < opts.length; ++i) {
		var opt1 = opts [i]
		var opt2 = opt1.cloneNode (false)
		opt2.text = opt1.text
		destCmb.options.add (opt2)
	}
}
