var _cache = new Array(); function checkDataLoaded(elementId) { if (_cache['elements'][elementId]['populated'] !== true && _cache['requests'][_cache['elements'][elementId]['hash']]['populated'] == true) { autocompletePopulate(elementId); } } function showResult(elementId) { var index = $(elementId).value; var textResponse = (index == -1)? "Nenhum resultado encontrado!" : "OK"; $('response' + elementId).innerHTML = textResponse; $('response' + elementId).className = (index == -1)? "span_message_error" : "span_message_success"; } function selectAutocompleteElement(elementId) { if ($('input' + elementId) == null) return -1; var value = $('input' + elementId).value; var items = _cache['requests'][_cache['elements'][elementId]['hash']]['data']; var index = autocompleteIndexOf(items, value); $(elementId).value = index; $('response' + elementId).innerHTML = typeof(items); showResult(elementId); } function autocompleteIndexOf(array, value) { for (key in array){ if (array[key].toLowerCase() == value.toLowerCase()){ return key; } } return -1; } function arrayValues(array) { var i = 0; var arr = Array(); for (key in array){ arr[i++] = array[key]; } return arr; } function autocompletePopulate(elementId) { if (_cache['elements'][elementId]['populated'] == null){ var items = _cache['requests'][_cache['elements'][elementId]['hash']]['data']; var values = arrayValues(items); new Autocompleter.Local('input' + elementId, 'list' + elementId, values, { 'choices':9, 'partialChars': _cache['elements'][elementId]['minLength'] }); } _cache['elements'][elementId]['populated'] = true; } function catchJsonError(dados){ return false; } function autocompleteSelect(elementId, ajaxClass, ajaxMethod, methodParam, extraParams) { // se o parâmetro for um objeto, transforma em uma string para gerar o hash var _param = (typeof(methodParam) == 'object')? JSON.stringify(methodParam) : methodParam; var str = ajaxClass + ajaxMethod + _param; // Cria hash que identifica classe, método e parâmetro. // Componente verifica se hash já existe para não fazer requisições ajax desnecessárias var hash = new SHA1(str).hexdigest(); if(extraParams['minLength'] == null){ extraParams['minLength'] = 1; } if (extraParams['idValue'] != null){ if (extraParams['textValue'] != null){ // se texto do input já foi preenchido no momento da montagem do componente, não escreve via javascript if ($('input' + elementId).value.lenght == 0) $('input' + elementId).value = extraParams['textValue']; $(elementId).value = extraParams['idValue']; showResult(elementId); } } func = function (dados) { var result = dados[ajaxMethod]['data']; if (result !== false){ // guarda valores localmente _cache['requests'][hash]['data'] = result; _cache['requests'][hash]['populated'] = true; // Envia dados para o componente autocompletePopulate(elementId); } }; // Relaciona chamada ajax ao objeto if(_cache['elements'] == null){ _cache['elements'] = new Array(); } if(_cache['elements'][elementId] == null){ _cache['elements'][elementId] = new Array(); _cache['elements'][elementId]['hash'] = hash; _cache['elements'][elementId]['minLength'] = extraParams['minLength']; } else { // por algum motivo componente já existe. // Se o _cache na posição hash não for null, requisição ajax já foi feita. // Se o objeto já foi populado e está sendo escrito novamente, manda popular denovo // (isso pode acontecer quando o componente é escrito através de javascript) if(_cache['requests'][hash] != null) if (_cache['requests'][hash]['populated'] == true){ _cache['elements'][elementId]['populated'] = null; autocompletePopulate(elementId); } } // Cria array para armazenar localmente os valores da requisição ajax if(_cache['requests'] == null) _cache['requests'] = new Array(); if(_cache['requests'][hash] == null){ _cache['requests'][hash] = new Array(); _cache['requests'][hash]['populated'] = null; _cache['requests'][hash]['data'] = new Array(); // Faz a requisição ajax/Json var nc = new NanoController(); nc.setWfUrl(); nc.setSuccessHandler(func); nc.setExceptionHandler(catchJsonError); nc.setErrorHandler(catchJsonError); nc.addVirtualRequest(ajaxMethod, { action: ajaxClass, mode: ajaxMethod }, methodParam); nc.sendRequest(); } }