/**
 * Funções JavaScript para controle do campo de busca.
 *
 * O campo de busca funciona com um campo de entrada normal que quando está vazio possui um 
 * texto padrão e um estilo diferenciado (normalmente mais apagado).  Quando este campo ganha 
 * o foco de entrada, o texto padrão é apagado e o estilo é normalizado.
 *
 * Estas funções que pressupõem que haverá um form com pelo menos dois campos ('input'): um 
 * campo de entrada visível ('text'), cujo id elas recebem como parâmetro, e um campo escondido 
 * ('hidden'), cujo id é o mesmo do campo de entrada com sufixo SEARCH_HIDDEN_SUFFIX.
 *
 * O campo escondido é responsável por manter o valor real do campo de busca, e que será usado 
 * efetivamente na submissão do form e consequente realização da busca.  O campo de entrada é o 
 * que o usuário vê e usa; este campo é que ganha um texto padrão e tem seu estilo alterado 
 * quando é deixado vazio.
 *
 * @author Heleno Valle.
 */

/**
 * Constante que devido o texto exibido no campo quando ele está vazio.
 */
var SEARCH_EMPTY = 'busca';

/**
 * Constante que define o nome do estilo do campo de entrada quando com foco.
 */
var SEARCH_STYLE_FOCUS = 'focus';

/**
 * Constante que define o nome do estilo do campo de entrada quando com vazio.
 */
var SEARCH_STYLE_EMPTY = 'empty';

/**
 * Constante que define o sufixo usado no id do campo escondido.
 */
var SEARCH_HIDDEN_SUFFIX = 'h';

/**
 * Função que deve ser chamada logo após a carga do campo de busca.
 * Define o conteúdo e o estilo do campo de entrada em função do valor do campo escondido.
 * @param field nome do campo de entrada.
 */
function search_onload ( field ) {
	var tfield = document.getElementById( field );
	var hidden = document.getElementById( field + SEARCH_HIDDEN_SUFFIX );
	if ( hidden.value == '' ) {
		tfield.value = SEARCH_EMPTY;
		tfield.className = SEARCH_STYLE_EMPTY;
	}
	else {
		tfield.value = hidden.value;
		tfield.className = SEARCH_STYLE_FOCUS;
	}
}

/**
 * Função que deve ser chamada quando o campo de entrada recebe o foco.
 * Se o campo escondido estiver vazio, campo de entrada também deve ser limpo e ter seu estilo 
 * alterado de acordo.
 * @param field nome do campo de entrada.
 */
function search_onfocus ( field ) {
	var tfield = document.getElementById( field );
	var hidden = document.getElementById( field + SEARCH_HIDDEN_SUFFIX );
	if ( hidden.value == '' && tfield.value == SEARCH_EMPTY ) {
		tfield.value = '';
		tfield.className = SEARCH_STYLE_FOCUS;
	}
}

/**
 * Função que deve ser chamada quando o campo de entrada perde o foco.
 * Se o campo escondido estiver vazio, campo de entrada também deve receber o texto padrão e 
 * ter seu estilo alterado de acordo.
 * @param field nome do campo de entrada.
 */
function search_onblur ( field ) {
	var tfield = document.getElementById( field );
	var hidden = document.getElementById( field + SEARCH_HIDDEN_SUFFIX );
	if ( hidden.value == '' && tfield.value == '') {
		tfield.value = SEARCH_EMPTY;
		tfield.className = SEARCH_STYLE_EMPTY;
	}
}

/**
 * Função que deve ser chamada sempre que o campo de entrada é alterado, para que seu valor 
 * seja replicado no campo escondido.
 * @param field nome do campo de entrada.
 */
function search_onchange ( field ) {
	var tfield = document.getElementById( field );
	var hidden = document.getElementById( field + SEARCH_HIDDEN_SUFFIX );
	hidden.value = tfield.value;
}


/**
 * Função que deve ser chamada quando o form de busca for submetido.  Deve garantir que o
 * valor correto seja usado, para isso, simula o foco no campo de entrada e sua alteração.
 * @param field nome do campo de entrada.
 */
function search_onsubmit ( field ) {
	search_onfocus( field );
	search_onchange( field );
}
