source: sandbox/expresso2.2/phpgwapi/expressoAjax/expressoAjax.js @ 1661

Revision 1661, 15.9 KB checked in by amuller, 15 years ago (diff)

Ticket #490 - Criação dos códigos de unificação ajax

Line 
1var debug_controller =false;
2var files = new Array();
3var progressBar;
4var handlerExecuteForm = null;
5
6  if (document.all)
7        {
8                navigator.userAgent.toLowerCase().indexOf('msie 5') != -1 ? is_ie5 = true : is_ie5 = false;
9                is_ie = true;
10                is_moz1_6 = false;
11                is_mozilla = false;
12                is_ns4 = false;
13        }
14        else if (document.getElementById)
15        {
16                navigator.userAgent.toLowerCase().match('mozilla.*rv[:]1\.6.*gecko') ? is_moz1_6 = true : is_moz1_6 = false;
17                is_ie = false;
18                is_ie5 = false;
19                is_mozilla = true;
20                is_ns4 = false;
21        }
22        else if (document.layers)
23        {
24                is_ie = false;
25                is_ie5 = false
26                is_moz1_6 = false;
27                is_mozilla = false;
28                is_ns4 = true;
29        }
30
31/****************************************** Connector Class *************************************************/
32        // Constructor
33        function cConnector()
34        {
35                this.requests = new Array();
36                this.oxmlhttp = null;
37                this.isVisibleBar = false;
38                this.tid = 0;
39                this.progressBar = null;
40                this.oldX = 0;
41                this.oldY = 0;
42                this.updateVersion = "";
43                this.connectorCache = {
44                                'valid' : [],
45                                'result' : []
46                };
47                this.expurgatedCache = new Array(); // Data to purge from cache
48
49        }
50
51        cConnector.prototype.buildBar = function()
52                {
53                        var div = document.getElementById('divProgressBar');
54
55                        if(! div) {
56                                div = document.createElement("DIV");
57                                div.style.visibility    = "hidden";
58                                div.style.width = "103px";
59                                div.id = 'divProgressBar';
60                                div.align = "center";
61                                div.innerHTML = '&nbsp;&nbsp;<font face="Verdana" size="2" color="WHITE">'+document.getElementById('txt_loading').value+'...</font>&nbsp;';
62                                div.style.background = "#cc4444";
63                                div.style.position = 'fixed';
64                                div.style.top = '0px';
65                                div.style.right = '0px';
66                                document.body.appendChild(div);
67
68                                if(is_ie) {
69                                        var elem = document.all[div.id];
70                                        elem.style.position="absolute";
71                                        var root = document.body;
72                                        var posX = elem.offsetLeft-root.scrollLeft;
73                                        var posY = elem.offsetTop-root.scrollTop;
74                                        root.onscroll = function() {
75                                                elem.style.right = '0px';
76                                                elem.style.top = (posY + root.scrollTop) + "px";
77                                        };
78                                }
79
80                                if(debug_controller) {
81                                        div = document.createElement("DIV");
82                                        div.style.width = "800px";
83                                        div.style.height= "400px";
84                                        div.id = "debug_controller";
85                                        div.align='right';
86                                        document.body.appendChild(div);
87                                }
88                        }
89        }
90//------------------------------------ BEGIN: Functions for Connector HTTPRequest  -------------------------------------------------//
91        // Serialize Data Method
92        cConnector.prototype.serialize = function(data)
93        {       var _thisObject = this;
94                var f = function(data)
95                {
96                        var str_data;
97
98                        if (data == null ||
99                                (typeof(data) == 'string' && data == ''))
100                        {
101                                str_data = 'N;';
102                        }
103
104                        else switch(typeof(data))
105                        {
106                                case 'object':
107                                        var arrayCount = 0;
108
109                                        str_data = '';
110
111                                        for (i in data)
112                                        {
113                                                if (i == 'length')
114                                                {
115                                                        continue;
116                                                }
117
118                                                arrayCount++;
119                                                switch (typeof(i))
120                                                {
121                                                        case 'number':
122                                                                str_data += 'i:' + i + ';' + f(data[i]);
123                                                                break;
124
125                                                        case 'string':
126                                                                str_data += 's:' + i.length + ':"' + i + '";' + f(data[i]);
127                                                                break;
128
129                                                        default:
130                                                                showMessage(Element('cc_msg_err_serialize_data_unknown').value);
131                                                                break;
132                                                }
133                                        }
134
135                                        if (!arrayCount)
136                                        {
137                                                str_data = 'N;';
138                                        }
139                                        else
140                                        {
141                                                str_data = 'a:' + arrayCount + ':{' + str_data + '}';
142                                        }
143
144                                        break;
145
146                                case 'string':
147                                        str_data = 's:' + data.length + ':"' + data + '";';
148                                        break;
149
150                                case 'number':
151                                        str_data = 'i:' + data + ';';
152                                        break;
153
154                                case 'boolean':
155                                        str_data = 'b:' + (data ? '1' : '0') + ';';
156                                        break;
157
158                                default:
159                                        showMessage(Element('cc_msg_err_serialize_data_unknown').value);
160                                        return null;
161                        }
162
163                        return str_data;
164                }
165
166                return f(data);
167        }
168
169
170        //Unserialize Data Method
171        cConnector.prototype.unserialize = function(str)
172        {
173
174                _thisObject = this;
175                var matchB = function (str, iniPos)
176                {
177                        var nOpen, nClose = iniPos;
178                        do
179                        {
180                                nOpen = str.indexOf('{', nClose+1);
181                                nClose = str.indexOf('}', nClose+1);
182
183                                if (nOpen == -1)
184                                {
185                                        return nClose;
186                                }
187                                if (nOpen < nClose )
188                                {
189                                        nClose = matchB(str, nOpen);
190                                }
191                        } while (nOpen < nClose);
192
193                        return nClose;
194                }
195
196                var f = function (str)
197                {
198                        switch (str.charAt(0))
199                        {
200                                case 'a':
201
202                                        var data = new Array();
203                                        var n = parseInt( str.substring( str.indexOf(':')+1, str.indexOf(':',2) ) );
204                                        var arrayContent = str.substring(str.indexOf('{')+1, str.lastIndexOf('}'));
205
206                                        for (var i = 0; i < n; i++)
207                                        {
208                                                var pos = 0;
209
210                                                /* Process Index */
211                                                var indexStr = arrayContent.substr(pos, arrayContent.indexOf(';')+1);
212                                                var index = f(indexStr);
213                                                pos = arrayContent.indexOf(';', pos)+1;
214
215                                                /* Process Content */
216                                                var part = null;
217                                                switch (arrayContent.charAt(pos))
218                                                {
219                                                        case 'a':
220                                                                var pos_ = matchB(arrayContent, arrayContent.indexOf('{', pos))+1;
221                                                                part = arrayContent.substring(pos, pos_);
222                                                                pos = pos_;
223                                                                data[index] = f(part);
224                                                                break;
225
226                                                        case 's':
227                                                                var pval = arrayContent.indexOf(':', pos+2);
228                                                                var val  = parseInt(arrayContent.substring(pos+2, pval));
229                                                                pos = pval + val + 4;
230                                                                data[index] = arrayContent.substr(pval+2, val);
231                                                                break;
232
233                                                        default:
234                                                                part = arrayContent.substring(pos, arrayContent.indexOf(';', pos)+1);
235                                                                pos = arrayContent.indexOf(';', pos)+1;
236                                                                data[index] = f(part);
237                                                                break;
238                                                }
239                                                arrayContent = arrayContent.substr(pos);
240                                        }
241                                        break;
242
243                                case 's':
244                                        var pos = str.indexOf(':', 2);
245                                        var val = parseInt(str.substring(2,pos));
246                                        var data = str.substr(pos+2, val);
247                                        str = str.substr(pos + 4 + val);
248                                        break;
249
250                                case 'i':
251                                case 'd':
252                                        var pos = str.indexOf(';');
253                                        var data = parseInt(str.substring(2,pos));
254                                        str = str.substr(pos + 1);
255                                        break;
256
257                                case 'N':
258                                        var data = null;
259                                        str = str.substr(str.indexOf(';') + 1);
260                                        break;
261
262                                case 'b':
263                                        var data = str.charAt(2) == '1' ? true : false;
264                                        break;
265                        }
266                        return data;
267                }
268
269                return f(str);
270        }
271
272        //Create XMLHTTP object Method
273        cConnector.prototype.createXMLHTTP = function ()
274        {
275                try
276                {
277                        this.oxmlhttp = new XMLHttpRequest();
278                        this.oxmlhttp.overrideMimeType('text/xml');
279                }
280                catch (e)
281                {
282                        try
283                        {
284                                this.oxmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
285                        }
286                        catch (e1)
287                        {
288                                try
289                                {
290                                        this.oxmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
291                                }
292                                catch (e2)
293                                {
294                                        this.oxmlhttp = null;
295                                }
296                        }
297                }
298
299        }
300
301        // Request Constructor Connector
302        cConnector.prototype.newRequest = function (id, target, method, handler, data)
303        {
304                var params = data;
305                this.tid = id;
306                if (this.requests[id]) {
307                        return false;
308                }
309
310                this.createXMLHTTP();
311                var oxmlhttp = this.oxmlhttp;
312                var _thisObject = this;
313
314                if (! oxmlhttp)
315                        return false;
316
317                this.requests[id] = oxmlhttp;
318                this.buildBar();
319                this.showProgressBar();
320
321                var sub_handler = function ()
322                {
323                        var progressBar = _thisObject.progressBar;
324
325                        try
326                        {
327                                if (oxmlhttp.readyState == 4 )
328                                {
329
330                                        switch (oxmlhttp.status)
331                                        {
332
333                                                case 200:
334                                                        if (typeof(handler) == 'function')
335                                                        {
336                                                                _thisObject.hideProgressBar();
337                                                                var data = _thisObject.unserialize(oxmlhttp.responseText);
338                                                                if ( typeof data == 'undefined' )
339                                                                        data = oxmlhttp.responseText;
340                                                                if(debug_controller) {
341                                                                        document.getElementById("debug_controller").innerHTML += oxmlhttp.responseText;
342                                                                        document.getElementById("debug_controller").innerHTML += "<br>-------------------------------------------------------------------------------------<br>";
343                                                                }
344                                                                handler(data);
345                                                                _thisObject.addToCache(params?id+"&"+params:id,data);
346                                                                delete _thisObject.requests[id];
347                                                                _thisObject.requests[id] = null;
348                                                        }
349
350                                                        break;
351
352                                                case 404:
353
354                                                        alert(get_lang('Page Not Found!'));
355                                                        break;
356
357                                                default:
358                                        }
359                                }
360                        }
361                        catch (e)
362                        {
363                                _thisObject.hideProgressBar();
364                                if(debug_controller)
365                                        alert(e+"\n"+oxmlhttp.responseText);
366                                // View Exception in Javascript Console
367                                throw(e);
368                        }
369
370                }
371
372                try
373                {
374
375                        if (method == '' || method == 'GET')
376                        {
377                                oxmlhttp.open("GET",target,true);
378                                if (typeof(handler) == 'function')
379                                {
380                                        oxmlhttp.onreadystatechange =  sub_handler;
381                                        oxmlhttp.send(null);
382                                }
383
384                        }
385                        else if (method == 'POST')
386                        {
387                                oxmlhttp.open("POST",target, true);
388                                oxmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
389                                if (typeof(handler) == 'function')
390                                {
391                                        oxmlhttp.onreadystatechange = sub_handler;
392                                        oxmlhttp.send(data);
393                                }
394
395                        }
396                }
397                catch(e)
398                {
399                        _thisObject.hideProgressBar();
400                        if(debug_controller)
401                                alert(e);
402                        // View Exception in Javascript Console
403                        throw(e);
404                }
405
406                return true;
407        }
408        // Cancel Request Connector
409        cConnector.prototype.cancelRequest = function (){
410                if (!this.requests[this.tid]){
411                        return false;
412                }
413                this.oxmlhttp.onreadystatechange = null;
414                this.requests[this.tid].abort();
415                this.hideProgressBar();
416        }
417//------------------------------------  END: Functions for Connector HTTPRequest  -------------------------------------------------//
418
419//      ----------------------------------- BEGIN: Functions for build Bar Progress ---------------------------------------------------------//
420        cConnector.prototype.hideProgressBar = function ()
421        {
422                var div = document.getElementById('divProgressBar');
423                div.style.visibility = 'hidden';
424                this.isVisibleBar = false;
425        }
426
427        cConnector.prototype.showProgressBar = function(){
428                var div = document.getElementById('divProgressBar');
429                div.style.visibility = 'visible';
430
431                this.isVisibleBar = true;
432        }
433
434        cConnector.prototype.loadAllScripts = function(scripts) {
435                for(var i = 0; i < scripts.length; i++){
436                        this.loadScript(scripts[i]);
437                }
438        }
439
440        cConnector.prototype.loadScript = function(scriptPath)  {
441        if (document.getElementById('uploadscript_'+scriptPath)) {
442                return;
443        }
444                var head = document.getElementsByTagName("head")[0];
445                var script = document.createElement("SCRIPT");
446                script.id = 'uploadscript_'+scriptPath;
447                script.type = 'text/javascript';
448
449                if(is_ie) {
450
451                        this.oxmlhttp.open("GET", "js/"+scriptPath+".js?"+this.updateVersion, false);
452                        this.oxmlhttp.setRequestHeader('Content-Type','text/plain');
453                        this.oxmlhttp.send(null);
454                        if(this.oxmlhttp.status != 0 && this.oxmlhttp.status != 200 ||  this.oxmlhttp.status == 0 && this.oxmlhttp.responseText.length == 0)
455                                throw new Error("Error " + this.oxmlhttp.status + "("+this.oxmlhttp.statusText+") when loading script file '"+scriptPath+"'");
456                        script.text = this.oxmlhttp.responseText;
457                }
458                else {
459                        script.src =  "js/"+scriptPath+".js?"+this.updateVersion;
460                }
461
462                head.appendChild(script);
463                return;
464        }
465//------------------------------------  END: Functions for Progress Bar  -------------------------------------------------//
466        // Default Controller File
467        var DEFAULT_URL = 'controller.php?action=';
468        // connector object
469        var _onmouseup = document.onmouseup;
470        var isExecuteForm = false;
471        var id = null;
472
473        cConnector.prototype.queryConnectorCache = function(url,handler){
474                if (this.connectorCache.valid[url])
475                {
476                        handler(this.connectorCache.result[url]);
477                        return true;
478                }
479                else
480                        return false;
481        }
482        cConnector.prototype.purgeCache= function(){
483                if (typeof(preferences) == "undefined" || preferences.use_cache != 'True')
484                        return false;
485                var i;
486                for (i=0; i<= this.expurgatedCache.length; i++)
487                {
488                        this.connectorCache.valid[this.expurgatedCache[i]] = false;
489                        try {
490                        delete this.connectorCache.result[this.expurgatedCache[i]];
491                        }
492                        catch (e) { };
493                }
494        }
495        cConnector.prototype.addToCache = function(id,data){
496                if (typeof(preferences) == "undefined" || preferences.use_cache != 'True')
497                        return false;
498                var func = id.substr(id.lastIndexOf('.')+1);
499                if (func.indexOf('&') > 0)
500                        func = func.substr(0,func.indexOf('&'));
501                switch (func){
502                        // functions that enters in cache
503                        case 'get_info_msg':
504                                data.cacheHit = true;
505                        case 'get_preferences':
506                        case 'getSharedUsersFrom':
507                        case 'get_organizations':
508                        case 'get_catalogs':
509                        case 'get_dropdown_contacts':
510                        case 'get_cc_contacts':
511                        case 'get_cc_groups':
512                        case 'getUsersByEmail':
513                                this.connectorCache.valid[id] = true;
514                                this.connectorCache.result[id] = data;
515                                break;
516                        // function that needs expire
517                        case 'get_range_msgs2':
518                        case 'quicksearch':
519                        case 'get_folders_list':
520                        case 'search_msg':
521                        case 'search_for':
522                                this.connectorCache.valid[id] = true;
523                                this.connectorCache.result[id] = data;
524                                var i = this.expurgatedCache.length;
525                                this.expurgatedCache[i+1] = id;
526                                break;
527                        //functions that expires the cache
528                        case 'move_messages':
529                        case 'delete_msgs':
530                        case 'getReturnExecuteForm':
531                        case 'set_messages_flag':
532                        case 'empty_trash':
533                                this.purgeCache();
534                        default: // no cache
535                                break;
536                }
537        }
538
539        //      Function executes AJAX
540        //      cExecute (url, handler, params)
541        //      url: 'module.class.method'
542        //  handle: function handle() receive response.
543        //  params: parameters for POST method
544        //      form: form element (for upload files)
545        function cExecute(url, handler, params, form) {
546                if(isExecuteForm){
547                        isExecuteForm = false;
548                        document.onmouseup = _onmouseup;
549                }
550                if(form) {
551                        cExecuteForm(url, form);
552                        return;
553                }
554
555                url = DEFAULT_URL + url;
556
557                if (expresso.connector.queryConnectorCache(params?url+"&"+params:url,handler))
558                        return;
559
560                if(params)
561                        method = "POST";
562                else
563                        method = "GET";
564
565                id = url;
566                expresso.connector.newRequest(id, url, method, handler, params);
567        }
568
569// This function executes submit values to Controller (POST)
570        // The return is void.
571        //      cExecuteForm (url, form)
572        //      url: 'module.class.method'
573        //      form: form element (for upload files)
574        function cExecuteForm(url, form, handler,id){
575                expresso.connector.buildBar();
576                isExecuteForm = true;
577
578                document.onmouseup = alertBut;
579
580                expresso.connector.showProgressBar();
581                if(! (divUpload = document.getElementById('divUpload'))) {
582                        divUpload               = document.createElement('DIV');
583                        divUpload.id    = 'divUpload';
584                        document.body.appendChild(divUpload);
585                }
586
587                if(! (el = document.getElementById('_action'))) {
588                        el                      = document.createElement('input');
589                        el.type = 'hidden';
590                        el.id           = '_action';
591                        el.name = '_action';
592                        form.appendChild(el);
593                }
594
595                var divFiles = Element("divFiles_"+id);
596                if (divFiles && divFiles.firstChild) {
597                        el                      = document.createElement('input');
598                        el.type = 'hidden';
599                        el.name = 'countFiles';
600                        var countDivFiles = 0;
601                        try{
602                                countDivFiles = parseInt(divFiles.lastChild.firstChild.id.split('_')[2]) + 1; // The id of last file
603                                }
604                        catch (e) { var countDivFiles = 0; };
605                        el.value        = countDivFiles ;
606                        form.appendChild(el);
607                }
608
609                form._action.value = url;
610                // Connector Bug fixing: Encapsulating returned handler function
611                handlerExecuteForm = handler;
612                var form_handler = function (data){
613                        handlerExecuteForm(data);
614                        handlerExecuteForm = null;
615                }
616                divUpload.innerHTML= "<iframe onload=\"cExecute('$this.functions.getReturnExecuteForm',"+form_handler+");\"  style='display:"+(debug_controller ? "" : "none")+";width:"+(debug_controller ? 400 : 0)+";height:"+(debug_controller ? 400 : 0)+";' name='uploadFile'></iframe>";
617                form.action ="controller.php";
618                form.target ="uploadFile";
619                form.submit();
620                // Connector Bug fixing: Exclude '_action' element after cExecuteForm execution
621                if(el && el.id == '_action'){
622                        el.parentNode.removeChild(el);
623                }
624        }
625
626
627        function alertBut(e) {
628                if(!e)
629                        e = window.event;
630
631            if(_onmouseup)
632                        _onmouseup(e);
633
634                if(isExecuteForm) {
635                if(confirm(get_lang("There's an action processing. Do you want abort it?"))) {
636                        expresso.connector.hideProgressBar();
637                        isExecuteForm = false;
638                        delete expresso.connector.requests[id];
639                                expresso.connector.requests[id] = null;
640                        stop();
641                        return;
642                }
643                else
644                        return false;
645            }
646        }
647
648function expressoAjax(){
649        this.connector = new cConnector();
650
651}
652expressoAjax.prototype.require = function (module){
653        expresso.connector.loadScript(module);
654}
655var expresso = new expressoAjax();
Note: See TracBrowser for help on using the repository browser.