source: sandbox/workflow/trunk/js/jscode/wf_autocomplete_input.js @ 2160

Revision 2160, 8.9 KB checked in by pedroerp, 14 years ago (diff)

Ticket #950 - Merged 2108:2139 /trunk/workflow em /sandbox/workflow/trunk

Line 
1var _cache = new Array();
2var autocompleterObjs = new Array();
3var myTimer;
4
5/* Verifica se o componente já foi populado (usado quando o tipo do componente é POPULATE_ON_LOAD) */
6function checkDataLoaded(elementId)
7{
8        if (_cache['elements'][elementId]['populated'] !== true
9                && _cache['requests'][_cache['elements'][elementId]['hash']]['populated'] == true)
10        {
11                autocompletePopulate(elementId);
12        }
13}
14
15function showResult(elementId)
16{
17        var index = $(elementId).value;
18        var textResponse = (index == -1)? "Nenhum resultado encontrado!" : "OK";
19        $('response' + elementId).innerHTML = textResponse;
20        $('response' + elementId).className = (index == -1)? "span_message_error" : "span_message_success";
21}
22
23/* Faz a verificação se o conteúdo digitado tem um correspondente na lista */
24function selectAutocompleteElement(elementId)
25{
26        if ($('input' + elementId) == null) return -1;
27        var value = $('input' + elementId).value;
28        var items = new Object();
29        if(_cache['requests'][_cache['elements'][elementId]['hash']] != undefined)
30                items = _cache['requests'][_cache['elements'][elementId]['hash']]['data'];
31        var index = autocompleteIndexOf(items, value);
32        $(elementId).value = index;
33
34        $('response' + elementId).innerHTML = typeof(items);
35        showResult(elementId);
36}
37
38/* Percorre o objeto comparando cada item com o valor digitado no componente, e retorna o índice, se encontrar */
39function autocompleteIndexOf(items, value)
40{
41        for (key in items){
42                if(items.hasOwnProperty(key)){
43                        if (items[key].toLowerCase() == value.toLowerCase()){
44                                return key;
45                        }
46                }
47        }
48        return -1;
49}
50
51function arrayValues(items)
52{
53        var i = 0;
54        var arr = Array();
55        for (key in items){
56                arr[i++] = items[key];
57        }
58        return arr;
59}
60
61function removeAccents(text) {
62        var accents = 'áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÖÔÚÙÛÜÇ';
63        var normalLetters = 'aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC';
64        var newText = '';
65
66        for (i = 0; i < text.length; i++) {
67                if (accents.search(text.substr(i, 1)) >= 0) {
68                        newText += normalLetters.substr(accents.search(text.substr(i, 1)), 1);
69                }
70                else {
71                        newText += text.substr(i, 1);
72                }
73        }
74
75        return newText;
76}
77
78/* Cria, ou recria, o objeto autocompleter do componente, carregando a lista com os valores que já devem estar no cache */
79function autocompletePopulate(elementId)
80{
81        if (_cache['elements'][elementId]['populated'] == null){
82                var items = _cache['requests'][_cache['elements'][elementId]['hash']]['data'];
83                var values = arrayValues(items);
84                autocompleterObjs[elementId] = new Autocompleter.Local('input' + elementId, 'list' + elementId, values, {
85                        'choices':9,
86                        'partialChars': _cache['elements'][elementId]['minLength']
87                });
88                _cache['elements'][elementId]['populated'] = true;
89        }
90}
91
92/* Cria array para armazenar os elementos */
93function createCacheElementsArray(){
94        if(_cache['elements'] == null)
95                _cache['elements'] = new Array();
96}
97
98/* Cria array para armazenar os valores das requisições ajax */
99function createCacheRequestsArray(){
100        if(_cache['requests'] == null)
101                _cache['requests'] = new Array();
102}
103
104/* Seta os valores do componente no _cache */
105function createCacheElement(elementId, ajaxClass, ajaxMethod, methodParam, componentMode, extraParams){
106        // se o parâmetro for um objeto, transforma em uma string para gerar o hash
107        var _param = (typeof(methodParam) == 'object')? JSON.stringify(methodParam) : methodParam;
108
109        // se o componente tiver que ser populado em sua criação, calcula o hash
110        if (componentMode == 'POPULATE_ON_LOAD'){
111                var str = ajaxClass + ajaxMethod + _param;
112                // Cria hash que identifica classe, método e parâmetro.
113                // Componente verifica se hash já existe para não fazer requisições ajax desnecessárias
114                var hash = new SHA1(str).hexdigest();
115        }
116        // senão, não há a necessidade de calcular o hash, pois a lista será carregada posteriormente
117        else
118                var hash = "";
119
120        if(extraParams['minLength'] == null){
121                extraParams['minLength'] = 1;
122        }
123
124        if (extraParams['idValue'] != null){
125                if (extraParams['textValue'] != null){
126                        // se texto do input já foi preenchido no momento da montagem do componente, não escreve via javascript
127                        if ($('input' + elementId).value.lenght == 0)
128                                $('input' + elementId).value = extraParams['textValue'];
129
130                        $(elementId).value = extraParams['idValue'];
131                        showResult(elementId);
132                }
133        }
134
135        createCacheElementsArray();
136
137        if(_cache['elements'][elementId] == null){
138                _cache['elements'][elementId] = new Array();
139                _cache['elements'][elementId]['hash'] = hash;
140                _cache['elements'][elementId]['minLength'] = extraParams['minLength'];
141        } else {
142                // por algum motivo componente já existe.
143                // Se o _cache na posição hash não for null, requisição ajax já foi feita.
144                // Se o objeto já foi populado e está sendo escrito novamente, manda popular denovo
145                //   (isso pode acontecer quando o componente é escrito através de javascript)
146                if(_cache['requests'][hash] != null)
147                        if (_cache['requests'][hash]['populated'] == true){
148                                _cache['elements'][elementId]['populated'] = null;
149                                autocompletePopulate(elementId);
150                        }
151        }
152}
153
154function catchJsonError(dados){ return false; }
155
156/* Controle de timeout para chamar a função updateCacheRequests quando o usuário ficar 0.3 segundos sem digitar. (chamada no onkeyup do componente do tipo REPOPULATE_ON_CHANGE) */
157function updateCacheRequestsTimeout(elementId, ajaxClass, ajaxMethod, methodParam, componentMode){
158        clearTimeout(myTimer);
159        myTimer = setTimeout("updateCacheRequests('" + elementId + "', '" + ajaxClass + "', '" + ajaxMethod + "', '" + methodParam + "', '" + componentMode + "')", 300);
160}
161
162/* Função que faz o gerenciamento das chamadas ajax e atualiza a lista de opções para seleção. */
163var updateCacheRequests = function(elementId, ajaxClass, ajaxMethod, methodParam, componentMode){
164        // se o parâmetro for um objeto, transforma em uma string para gerar o hash
165        var _param = (typeof(methodParam) == 'object')? JSON.stringify(methodParam) : methodParam;
166        var str = ajaxClass + ajaxMethod + _param;
167        // Cria hash que identifica classe, método e parâmetro.
168        // Componente verifica se hash já existe para não fazer requisições ajax desnecessárias
169        var hash = new SHA1(str).hexdigest();
170
171        if(_cache['requests'][hash] == null){
172                _cache['requests'][hash] = new Array();
173                _cache['requests'][hash]['populated'] = null;
174                _cache['requests'][hash]['data'] = new Array();
175
176                if (componentMode == 'POPULATE_ON_LOAD'){
177                        func = function (dados)
178                        {
179                                var result = dados[ajaxMethod]['data'];
180                                if (result !== false){
181                                        // guarda valores localmente
182                                        _cache['requests'][hash]['data'] = result;
183                                        _cache['requests'][hash]['populated'] = true;
184                                        // Envia dados para o componente
185                                        autocompletePopulate(elementId);
186                                }
187                        };
188
189                        // Faz a requisição ajax/Json
190                        var nc = new NanoController();
191                        nc.setWfUrl();
192                        nc.setSuccessHandler(func);
193                        nc.setExceptionHandler(catchJsonError);
194                        nc.setErrorHandler(catchJsonError);
195                        nc.addVirtualRequest(ajaxMethod,
196                                {
197                                        action: ajaxClass,
198                                        mode:   ajaxMethod
199                                }, methodParam);
200                        nc.sendRequest();
201                }
202                else{
203                        if(_param.length >= 3){
204                                func = function (dados)
205                                {
206                                        var result = dados[ajaxMethod]['data'];
207                                        if(typeof(result) == "object" && result.length != 0){
208                                                // guarda valores localmente
209                                                _cache['requests'][hash]['data'] = result;
210                                                _cache['requests'][hash]['populated'] = true;
211                                                _cache['elements'][elementId]['hash'] = hash;
212                                                var values = arrayValues(result);
213                                                autocompleterObjs[elementId].options.array = values;
214                                                autocompleterObjs[elementId].getUpdatedChoices();
215                                        }
216                                };
217
218                                // Faz a requisição ajax/Json
219                                var nc = new NanoController();
220                                nc.setWfUrl();
221                                nc.setSuccessHandler(func);
222                                nc.setExceptionHandler(catchJsonError);
223                                nc.setErrorHandler(catchJsonError);
224                                nc.addVirtualRequest(ajaxMethod,
225                                        {
226                                                action: ajaxClass,
227                                                mode:   ajaxMethod
228                                        }, removeAccents(methodParam));
229                                nc.sendRequest();
230                        }
231                }
232        }
233        else{
234                // Se for do modo que deve repopular a lista a cada tecla pressionada e o _cache referente à entrada digitada já estiver populada
235                if (componentMode == 'REPOPULATE_ON_CHANGE' && _cache['requests'][hash]['populated']){
236                        _cache['elements'][elementId]['hash'] = hash;
237                        var values = arrayValues(_cache['requests'][hash]['data']);
238                        autocompleterObjs[elementId].options.array = values;
239                }
240        }
241}
242
243/* Função que prepara o _cache, criando e setando os valores para cada componente */
244function autocompleteSelect(elementId, ajaxClass, ajaxMethod, methodParam, componentMode, extraParams)
245{
246        createCacheElement(elementId, ajaxClass, ajaxMethod, methodParam, componentMode, extraParams);
247        createCacheRequestsArray();
248
249        // Se o componente é do tipo que deve repopular a lista a cada tecla, cria um objeto autocompleter com a lista vazia
250        if(componentMode == 'REPOPULATE_ON_CHANGE')
251                autocompleterObjs[elementId] = new Autocompleter.Local('input' + elementId, 'list' + elementId, new Array(), {
252                        'choices':9,
253                        'partialChars': _cache['elements'][elementId]['minLength']
254                });
255
256        updateCacheRequests(elementId, ajaxClass, ajaxMethod, methodParam, componentMode);
257}
Note: See TracBrowser for help on using the repository browser.