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

Revision 6089, 8.3 KB checked in by marcieli, 12 years ago (diff)

Ticket #2686 - Corrigido: não é possível adicionar um dono na conta compartilhada.

  • 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, selectId, field )
153{
154        var select = $('#'+selectId);
155        select.html('');
156       
157    for( var value in fill )
158    {
159        if(typeof(value) == "undefined") continue;
160       
161        if( !options_cache[value] )
162             options_cache[value] = {};
163
164        if( !options_cache[value][field] )
165             options_cache[value][field] = new Option( fill[value][field], value );
166
167        select.append('<option value="'+value+'">'+fill[value][field]+'</option>');
168    }
169
170    return( select.find('option'));
171}
172
173function fillSelect( fill, selectId, field )
174{
175    //Inclui usuario comecando com a pesquisa
176    select = setOptions( fill, selectId, field );
177
178    //chama o server side caso nao encontre resultado nenhum com essa sentenca
179    return( select.length );
180}
181
182function fillContentSelect( fill, selectId )
183{
184    if( typeof fill === "string" )
185    {
186        var select = Element( selectId );
187
188        //select.innerHTML = fill;
189       
190        $("#"+selectId).html(fill);
191       
192        return( select.options.length );
193    }
194
195    var content = "";
196       
197    for( var section in fill )
198    {
199        if( !fill[section] || fill[section] === "" )
200            continue;
201
202        var entry = entryTag( section );
203       
204        if(typeof entry == "string")
205                content += entry;
206        else
207                content += entry.outerHTML;
208       
209        content += fill[section];
210    }   
211       
212    return fillContentSelect( content, selectId );
213}
214
215
216function entryTag( label, select )
217{
218    var line = '-------------------';
219       
220    //var option = new Option( line + ' ' + get_lang(label) + ' ' + line + ' ', -1 );
221    //option.disabled = true;
222       
223        var option = "<option value='-1' disabled='disabled'>"+line+" "+get_lang(label)+" "+line+"</option>";
224
225    if( typeof select === "undefined" )
226        return( option );
227
228    if( typeof select === "string" )
229        select = Element( select ).options;
230
231    if( select.options )
232        select = select.options;
233
234    select[select.length] = option;
235}
236
237function fillGroupableSelect( fill, selectId, groupHandler, field )
238{
239    var groups = {};
240
241    var select = Element( selectId ).options;
242
243    var sizeof = select.length = 0;
244
245    for( value in fill )
246    {
247        var target = fill[value];
248
249        var group = groupHandler( target );
250
251        if( !groups[ group ] )
252            groups[ group ] = {};
253
254        groups[ group ][ value ] = target;
255
256        sizeof++;
257    }
258
259    for( groupId in groups )
260    {
261        var group = groups[ groupId ];
262
263         entryTag( groupId, select );
264
265        select = setOptions( group, select, field );
266    }
267
268    return( sizeof );
269}
270
271function flipParser( data )
272{
273    var result = {};
274
275    for( var section in data )
276    {
277        var target = data[section];
278
279        for ( var key in target )
280        {
281            if( !result[key] )
282                result[key] = {};
283
284            result[key][section] = target[key];
285        }
286    }
287
288    return( result );
289}
290
291function stackParser( data, field )
292{
293    if( !data ) return( false );
294
295    for( var section in data )
296        data[section] = normalize( data[section], field );
297
298    return( data );
299}
300
301function bypassParser( x ){
302    return( x );
303}
304
305var userData = {};
306
307function lookup( matchers, fillHandler, url, parser, callback )
308{
309    var serverCallback = false;
310
311    if( url )
312    {
313        //handler chamado pelo callback do servidor para repopular.
314        serverCallback = function( filters, handler ){
315
316            var refill = function( userd, data ){
317
318                //no caso de existir um custom callback
319                if( callback )
320                    if( !callback( data, userd ) )
321                        return;
322
323                //filter( filters, handler );
324
325            };
326
327            search( url, refill, parser );
328        };
329    }
330
331    serverCallback( matchers, fillHandler, serverCallback );
332}
333
334function filter( filters, fillHandler, emptinessHandler )
335{
336    filters = normalize( filters );
337
338    var fill = {};
339
340    //varrer todas as sentencas e secoes especificas
341    for( key in userData )
342    {
343        var user = userData[key];
344
345        if( !user ) continue;
346
347        var filtered = false;
348
349        //populando o mapa filtrando pela determinada sentenca
350        for( section in filters )
351        {
352            if( filtered ) break;
353
354            //filtro para a secao especifica.
355            var criteria = filters[section];
356
357            var target = user[section] || user;
358
359            if( !criteria( target ) )
360                filtered = true;
361        }
362
363        if( !filtered )
364            fill[key] = user;
365    }
366
367    //tenta chamar o handler para popular, caso nao consiga chama o server side
368    if( fillHandler )
369        if( !fillHandler( fill ) && emptinessHandler )
370            return emptinessHandler( filters, fillHandler );
371
372    return( fill );
373}
374
375function search( url, callback, parser )
376{
377    var handler = function( data )
378    {
379        if( !cExecute )
380            data = unserialize( data );
381
382        var dt = false;
383
384        if( typeof data == "string" && data.charAt(0) === '{' )
385        {
386            try{
387                dt = data;
388                data = (new Function("return " + data))();
389            }
390            catch(e){
391            }
392        }
393
394//      if( data && typeof data !== "string" && data.nosession )
395//          window.location.reload( false );
396
397        if( parser )
398            data = parser( data, dt );
399
400        if( callback )
401            callback( userData, data );
402    }
403
404    if( typeof url === "function" )
405        url = url();
406
407    if( typeof cExecute !== "undefined" )
408        return cExecute( url, handler );
409
410    return this.Connector.newRequest( 'search', url, 'GET', handler );
411}
412
413function normalize( raw, field )
414{
415    if( raw instanceof RegExp )
416    {
417        var exp = raw;
418
419        raw = function( match ){
420            return exp.test( match );
421        }
422    }
423
424    if( typeof field !== "undefined" && raw !== "object" )
425    {
426        var content = raw;
427
428        raw = {};
429       
430        raw[field] = content;
431    }
432
433    if( typeof raw === "object" )
434        for( var key in raw )
435            raw[key] = normalize( raw[key] );
436
437    return( raw );
438}
Note: See TracBrowser for help on using the repository browser.