source: trunk/expressoAdmin1_2/js/jscode/finder.js @ 6072

Revision 6072, 8.3 KB checked in by thiago, 12 years ago (diff)

Ticket #2674 - Problema corrigido com codigos em jquery

  • Property svn:executable set to *
Line 
1
2var current_value = "";
3
4var default_limit = 0;
5
6var sizelimit = 10;
7
8function Element( id )
9{
10    return document.getElementById( id );
11}
12
13function optionFind( id, selectId, url, ctxId, labelId )
14{
15    var fillHandler = function( fill, raw ){
16
17        return fillContentSelect( fill, selectId );
18
19    };
20
21    getAvailable( id, fillHandler, url, ctxId, labelId, true );
22}
23
24function getAvailable( id, fillHandler, url, ctxId, labelId, bypass )
25{
26    if( id )
27    {
28        var sentence = Element( id );
29
30        sentence = sentence ? sentence.value : id;
31       
32        url += "&filter=" + sentence + "&sentence=" + sentence;
33    }
34
35    if( ctxId )
36    {
37        var ctx = Element( ctxId );
38       
39        ctx = ctx ? ctx.value : ctxId;
40
41        url += "&context=" + ctx;
42    }
43
44    if( bypass )
45        bypass = bypassParser;
46
47    userFinder( sentence, fillHandler, url, bypass, labelId );
48}
49
50var default_field = "cn";
51
52function userFinder( sentence, selectId, url, handler, labelId )
53{
54    //current_value = sentence;
55    if( typeof limit === "undefined" )
56        limit = default_limit;
57
58    //TODO: tornar esse limite configuravel de acordo com a configuracao do expresso
59    if( sentence.length < limit )
60        return( false );
61
62    if( typeof handler === "string" &&
63        typeof labelId === "undefined" )
64        labelId = handler,
65        handler = undefined;
66
67    if( typeof get_lang === "undefined" )
68        get_lang = function( key ){
69            var translator = Element( "txt_" + key );
70
71            return translator ? translator.value : key;
72        };
73
74    var urlHandler = function(){
75
76            if( labelId )
77                Element( labelId ).innerHTML = get_lang('searching') + '...';
78
79            if( typeof url === "function" )
80                url = url();
81
82            return( url );
83    };
84
85    var defaultParser = function( data, raw ){
86
87        if( labelId )
88            Element( labelId ).innerHTML = '&nbsp;';
89
90            var result = false;
91
92            if( handler )
93                result = handler( data, raw );
94
95            if( result )
96                return( result );
97
98        if( typeof data === "string" )
99            return( data );
100
101        return stackParser( data, default_field );
102    };
103
104    var fillHandler = function( fill, raw )
105    {
106        var sizeof = 0;
107
108        if( typeof selectId === "string" )
109            sizeof = fillSelect( fill, selectId, default_field );
110        else
111            sizeof = selectId( fill, raw );
112
113        if( labelId && sizeof >= sizelimit )
114            Element( labelId ).innerHTML = 'Muitos resultados encontrados. Por favor, refine sua busca.';
115
116        return( !sizeof );
117    }
118
119    return finder( sentence, fillHandler, urlHandler, defaultParser );
120}
121
122function finder( sentences, fillHandler, url, parser )
123{
124    //caso fillHandler nao seja uma funcao, usar a default
125//     if( typeof fillHandler === "string" )
126//     {
127//      var selectId = fillHandler;
128//
129//      fillHandler = function( fill ){
130//
131//          return !fillSelect( fill, selectId, default_field );
132//
133//      };
134//     }
135
136    return lookup( sentences, fillHandler, url, parser, fillHandler );
137}
138
139function getExp( sentence )
140{
141   sentence = sentence.replace(/^\s*/, "").replace(/\s*$/, "");
142 
143   sentence = sentence.replace( / /gi, ".*" );
144
145   sentence = new RegExp( ".*" + sentence + ".*", "i" );
146
147    return( sentence );
148}
149
150var options_cache = {};
151
152function setOptions( fill, select, field )
153{
154    for( var value in fill )
155    {
156        if( !options_cache[value] )
157             options_cache[value] = {};
158
159        if( !options_cache[value][field] )
160             options_cache[value][field] = new Option( fill[value][field], value );
161
162        select[select.length] = options_cache[value][field];
163    }
164
165    return( select );
166}
167
168function fillSelect( fill, selectId, field )
169{
170    //recupera as options do respectivo select
171    var select = Element( selectId ).options;
172
173    //Limpa todo o select
174    select.length = 0;
175
176    //Inclui usuario comecando com a pesquisa
177    select = setOptions( fill, select, field );
178
179    //chama o server side caso nao encontre resultado nenhum com essa sentenca
180    return( select.length );
181}
182
183function fillContentSelect( fill, selectId )
184{
185    if( typeof fill === "string" )
186    {
187        var select = Element( selectId );
188
189        //select.innerHTML = fill;
190       
191        $("#"+selectId).html(fill);
192       
193        return( select.options.length );
194    }
195
196    var content = "";
197       
198    for( var section in fill )
199    {
200        if( !fill[section] || fill[section] === "" )
201            continue;
202
203        var entry = entryTag( section );
204       
205        if(typeof entry == "string")
206                content += entry;
207        else
208                content += entry.outerHTML;
209       
210        content += fill[section];
211    }   
212       
213    return fillContentSelect( content, selectId );
214}
215
216
217function entryTag( label, select )
218{
219    var line = '-------------------';
220       
221    //var option = new Option( line + ' ' + get_lang(label) + ' ' + line + ' ', -1 );
222    //option.disabled = true;
223       
224        var option = "<option value='-1' disabled='disabled'>"+line+" "+get_lang(label)+" "+line+"</option>";
225
226    if( typeof select === "undefined" )
227        return( option );
228
229    if( typeof select === "string" )
230        select = Element( select ).options;
231
232    if( select.options )
233        select = select.options;
234
235    select[select.length] = option;
236}
237
238function fillGroupableSelect( fill, selectId, groupHandler, field )
239{
240    var groups = {};
241
242    var select = Element( selectId ).options;
243
244    var sizeof = select.length = 0;
245
246    for( value in fill )
247    {
248        var target = fill[value];
249
250        var group = groupHandler( target );
251
252        if( !groups[ group ] )
253            groups[ group ] = {};
254
255        groups[ group ][ value ] = target;
256
257        sizeof++;
258    }
259
260    for( groupId in groups )
261    {
262        var group = groups[ groupId ];
263
264         entryTag( groupId, select );
265
266        select = setOptions( group, select, field );
267    }
268
269    return( sizeof );
270}
271
272function flipParser( data )
273{
274    var result = {};
275
276    for( var section in data )
277    {
278        var target = data[section];
279
280        for ( var key in target )
281        {
282            if( !result[key] )
283                result[key] = {};
284
285            result[key][section] = target[key];
286        }
287    }
288
289    return( result );
290}
291
292function stackParser( data, field )
293{
294    if( !data ) return( false );
295
296    for( var section in data )
297        data[section] = normalize( data[section], field );
298
299    return( data );
300}
301
302function bypassParser( x ){
303    return( x );
304}
305
306var userData = {};
307
308function lookup( matchers, fillHandler, url, parser, callback )
309{
310    var serverCallback = false;
311
312    if( url )
313    {
314        //handler chamado pelo callback do servidor para repopular.
315        serverCallback = function( filters, handler ){
316
317            var refill = function( userd, data ){
318
319                //no caso de existir um custom callback
320                if( callback )
321                    if( !callback( data, userd ) )
322                        return;
323
324                //filter( filters, handler );
325
326            };
327
328            search( url, refill, parser );
329        };
330    }
331
332    serverCallback( matchers, fillHandler, serverCallback );
333}
334
335function filter( filters, fillHandler, emptinessHandler )
336{
337    filters = normalize( filters );
338
339    var fill = {};
340
341    //varrer todas as sentencas e secoes especificas
342    for( key in userData )
343    {
344        var user = userData[key];
345
346        if( !user ) continue;
347
348        var filtered = false;
349
350        //populando o mapa filtrando pela determinada sentenca
351        for( section in filters )
352        {
353            if( filtered ) break;
354
355            //filtro para a secao especifica.
356            var criteria = filters[section];
357
358            var target = user[section] || user;
359
360            if( !criteria( target ) )
361                filtered = true;
362        }
363
364        if( !filtered )
365            fill[key] = user;
366    }
367
368    //tenta chamar o handler para popular, caso nao consiga chama o server side
369    if( fillHandler )
370        if( !fillHandler( fill ) && emptinessHandler )
371            return emptinessHandler( filters, fillHandler );
372
373    return( fill );
374}
375
376function search( url, callback, parser )
377{
378    var handler = function( data )
379    {
380        if( !cExecute )
381            data = unserialize( data );
382
383        var dt = false;
384
385        if( typeof data == "string" && data.charAt(0) === '{' )
386        {
387            try{
388                dt = data;
389                data = (new Function("return " + data))();
390            }
391            catch(e){
392            }
393        }
394
395//      if( data && typeof data !== "string" && data.nosession )
396//          window.location.reload( false );
397
398        if( parser )
399            data = parser( data, dt );
400
401        if( callback )
402            callback( userData, data );
403    }
404
405    if( typeof url === "function" )
406        url = url();
407
408    if( typeof cExecute !== "undefined" )
409        return cExecute( url, handler );
410
411    return this.Connector.newRequest( 'search', url, 'GET', handler );
412}
413
414function normalize( raw, field )
415{
416    if( raw instanceof RegExp )
417    {
418        var exp = raw;
419
420        raw = function( match ){
421            return exp.test( match );
422        }
423    }
424
425    if( typeof field !== "undefined" && raw !== "object" )
426    {
427        var content = raw;
428
429        raw = {};
430       
431        raw[field] = content;
432    }
433
434    if( typeof raw === "object" )
435        for( var key in raw )
436            raw[key] = normalize( raw[key] );
437
438    return( raw );
439}
Note: See TracBrowser for help on using the repository browser.