Index: trunk/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input_init.php
===================================================================
--- trunk/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input_init.php	(revision 1428)
+++ trunk/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input_init.php	(revision 1428)
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Insere código que referencia arquivos de javascript responsáveis pela funcionalidade.
+ * @package Smarty
+ * @subpackage wf_plugins
+ * @param array $params Array de parametros (vazio)
+ * @param object &$smarty Instância do objeto smarty em uso1
+ * @return string $output codigo com referencias aos javascripts.
+ * @access public
+ */
+function smarty_function_wf_autocomplete_input_init($params, &$smarty)
+{
+	$jsEffects		= $GLOBALS['phpgw_info']['server']['webserver_url'] . '/workflow/js/scriptaculous/effects.js';
+	$jsControls		= $GLOBALS['phpgw_info']['server']['webserver_url'] . '/workflow/js/scriptaculous/controls.js';
+	$jsJson			= $GLOBALS['phpgw_info']['server']['webserver_url'] . '/workflow/js/nano/JSON.js';
+	$jsSha1			= $GLOBALS['phpgw_info']['server']['webserver_url'] . '/workflow/js/jscode/sha1.js';
+	$jsAutocomplete	= $GLOBALS['phpgw_info']['server']['webserver_url'] . '/workflow/js/jscode/wf_autocomplete_input.js';
+	$output = <<<EOF
+	<script type="text/javascript" src="$jsEffects"></script>
+	<script type="text/javascript" src="$jsControls"></script>
+	<script type="text/javascript" src="$jsJson"></script>
+	<script type="text/javascript" src="$jsSha1"></script>
+	<script type="text/javascript" src="$jsAutocomplete"></script>
+EOF;
+	return $output;
+}
+?>
Index: trunk/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input.php
===================================================================
--- trunk/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input.php	(revision 1428)
+++ trunk/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input.php	(revision 1428)
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Este plugin insere um input que mostra os valores que podem ser selecionados enquanto o usuário digita.
+ * Os valores são preenchidos previamente através de uma requisição ajax: a classe e método que será invocado é passado por parêmetro no momento em que o desenvolvedor utiliza o componente.
+ *
+ * @package Smarty
+ * @subpackage wf_plugins
+ * @param array $params Array de parametros
+ * - name: o nome que o componente irá receber.
+ * - ajaxClass: classe ajax que será utilizada para fazer a consulta.
+ * - ajaxMethod: método da classe que será invocado para preencher a lista de opções.
+ * - methodParam: Parâmetro para o método que será invocado para preencher a lista de opções.
+ * - idValue: (opcional) o id de um item previamente selecionado (não é visível para o usuário).
+ * - textValue: (opcional) o texto de um item inicialmente selecionado (é visível para o usuário).
+ * - minLength: (opcional) número mínimo de caracteres necessários para que as opções apareçam na lista.
+ * - style: (opcional) estilo para o campo input
+ * @param object &$smarty Instância do objeto smarty em uso
+ * @return string $output codigo que insere os select boxes.
+ * @access public
+ */
+function smarty_function_wf_autocomplete_input($params, &$smarty)
+{
+	$requiredParams = array(
+		'name',
+		'ajaxClass',
+		'ajaxMethod'
+	);
+	$defaultValues = array(
+		'minLength'	=> 1,
+		'style'		=> "width: 200px"
+	);
+	$extractParams = array(
+		'name',
+		'ajaxClass',
+		'ajaxMethod',
+		'methodParam',
+		'minLength',
+		'idValue',
+		'textValue',
+		'style'
+	);
+
+	/* verifica se todos os parâmetros obrigatórios foram passados */
+	foreach ($requiredParams as $required)
+		if (!array_key_exists($required, $params) || (empty($params[$required])))
+			$smarty->trigger_error("[wf_autocomplete_input] missing required parameter(s): $required", E_USER_ERROR);
+
+	/* atribui valores default para os parâmetros não passados */
+	foreach ($defaultValues as $key => $value)
+		if (!isset($params[$key]))
+			$params[$key] = $value;
+
+	/* extrai alguns parâmetros da matriz de parâmetros */
+	foreach ($extractParams as $extract)
+		$$extract = $params[$extract];
+
+	/* parâmetros extras são "acumulados" em uma única variável */
+	$extraParams = array();
+	foreach ($params as $key => $value_params)
+		if (!in_array($key, $extractParams))
+			$extraParams[$key] = $value_params;
+
+	$name_input = 'input' . $name;
+	$name_list	= 'list' . $name;
+	$name_response = 'response' . $name;
+
+	/* se parâmetro for um array "joga" para o javascript como um objeto JSON */
+	if (is_array($methodParam)){
+		$methodParam = json_encode($methodParam);
+	} else {
+		$sep = "'"; // se não for um objeto passa parâmetro entre aspas
+	}
+
+	/* Cria um objeto JSON com os parâmetros opcionais utilizados pelo javascript */
+	$extraParams = array ('idValue'		=> $idValue
+						, 'textValue'	=> $textValue
+						, 'minLength'	=> $minLength
+	);
+	$extraParams = json_encode($extraParams);
+
+	$output = <<<EOF
+	<input id="$name" type="hidden"/>
+	<input id="$name_input" type="text" style="$style" onfocus="checkDataLoaded('$name');" onblur="setTimeout('selectAutocompleteElement(\'$name\')', 500);"/>
+	<span id="$name_response"></span>
+	<div id="$name_list" class="autocomplete" style="display: none;"></div>
+	<script>autocompleteSelect('$name', '$ajaxClass', '$ajaxMethod', $sep$methodParam$sep, $extraParams);</script>
+EOF;
+	return $output;
+}
+?>
