source: trunk/phpgwapi/js/tools/xconnector.js @ 2642

Revision 2642, 8.4 KB checked in by rodsouza, 14 years ago (diff)

Ticket #1009 - Corigindo problemas com o ordenamento referente aos javascripts.

Line 
1(function()
2{
3        var _THREADS = [];
4        var _ie;
5
6        function _config(pObj, pEvent, pHandler)
7        {
8                if ( typeof pObj == 'object' )
9                {
10                        if ( pEvent.substring(0, 2) == 'on' )
11                                pEvent = pEvent.substring(2, pEvent.length);
12
13                        if ( pObj.addEventListener )
14                                pObj.addEventListener(pEvent, pHandler, false);
15                        else if ( pObj.attachEvent )
16                                pObj.attachEvent('on' + pEvent, pHandler);
17                }
18        }
19
20        // xhr = XMLHttpRequest
21        function _xhr()
22        {
23                try
24                {
25                        return new XMLHttpRequest();
26                }
27                catch ( _e )
28                {
29                        _ie = true;
30                        try
31                        {
32                                return new ActiveXObject('Msxml2.XMLHTTP');
33                        }
34                        catch ( _e1 )
35                        {
36                                try
37                                {
38                                        return new ActiveXObject('Microsoft.XMLHTTP');
39                                }
40                                catch ( _e2 )
41                                {
42                                        return false;
43                                }
44                        }
45                }
46        }
47
48        function _HANDLER()
49        {
50                var _ID = arguments[0];
51
52                if  ( _THREADS[_ID] )
53                {
54                        if ( _ie && _THREADS[_ID]._XHR.readyState != 4 )
55                                return false;
56
57                        switch ( _THREADS[_ID]._XHR.readyState )
58                        {
59                                case 3 :
60                                        if ( _THREADS[_ID]._HANDLER.stream )
61                                        {
62                                                var _data = _THREADS[_ID]._XHR.responseText.substr(_THREADS[_ID]._index).replace(/^ +| +$/g, '');
63                                                //alert(_data);
64                                                _THREADS[_ID]._rtlen = _THREADS[_ID]._XHR.responseText.length;
65
66                                                if ( _THREADS[_ID]._index < _THREADS[_ID]._rtlen && _data.length )
67                                                        try
68                                                        {
69                                                                _THREADS[_ID]._HANDLER.stream(_data);
70                                                        }
71                                                        catch(_e)
72                                                        {
73                                                                //alert("#stream\n\n" + _e + "\n\n" + _e.description);
74                                                        }
75
76                                                if ( _THREADS[ _ID ] )
77                                                        _THREADS[ _ID ]._index = _THREADS[ _ID ]._rtlen;
78                                        }
79                                break;
80                                case 4 :
81                                        try
82                                        {
83                                                switch ( _THREADS[ _ID ]._XHR.status )
84                                                {
85                                                        case 200:
86                                                                var _data = ( _THREADS[ _ID ]._MODE == 'XML' ) ?
87                                                                        _THREADS[ _ID ]._XHR.responseXML :
88                                                                        _THREADS[ _ID ]._XHR.responseText;
89
90                                                                if ( _ie && _THREADS[ _ID ]._HANDLER.stream )
91                                                                        _THREADS[ _ID ]._HANDLER.stream(_data);
92
93                                                                var _request = ( _THREADS[ _ID ]._HANDLER.request ) ?
94                                                                        _THREADS[ _ID ]._HANDLER.request : false;
95
96                                                                if ( _THREADS[ _ID ]._MODE == 'XML' && _data.documentElement && _data.documentElement.hasAttribute( 'ControllerKey' ) )
97                                                                {
98                                                                        this._CONTROLLER_KEY = _data.documentElement.getAttribute( 'ControllerKey' );
99                                                                        _data.documentElement.removeAttribute( 'ControllerKey' );
100                                                                }
101
102                                                                if ( _THREADS[ _ID ]._CACHE )
103                                                                        this._CACHED[ _ID ] = _data;
104
105                                                                delete _THREADS[ _ID ];
106
107                                                                if ( _request )
108                                                                        try
109                                                                        {
110                                                                          _request( _data );
111                                                                        }
112                                                                        catch ( _e )
113                                                                        {
114                                                                                alert("#request\n\n" + _ID + "\n\n" + _e + "\n\n" + _e.description);
115                                                                        }
116
117                                                        break; // [case : status 200]
118                                                        case 404:
119                                                                delete _THREADS[ _ID ];
120                                                                alert( 'Page Not Found!' );
121                                                        break; // [case : status 404]
122                                                        default:
123                                                                delete _THREADS[ _ID ];
124                                                }
125                                        }
126                                        catch( e )
127                                        {
128                                                //alert( "e\n\n" + e );
129                                        }
130                                break;
131                                default :
132                        }
133                }
134        }
135
136        function _execute( )
137        {
138                var _ID = arguments[0];
139
140                var _ACTION = 'act=' + _ID;
141                var _TARGET = this._PATH + this._CONTROLLER + _THREADS[ _ID ]._ACCESS;
142
143                var _SEND = null;
144
145                _THREADS[ _ID ]._XHR.open( ( ( _THREADS[ _ID ]._POST ) ? 'POST' : 'GET' ), _TARGET, true);
146
147                if ( _THREADS[ _ID ]._POST )
148                {
149                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Content-Type','application/x-www-form-urlencoded' );
150                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Cache-Control',  'no-store, no-cache, must-revalidate' );
151                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Cache-Control', 'post-check=0, pre-check=0' );
152                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Pragma', 'no-cache' );
153
154                        _SEND = _THREADS[ _ID ]._POST;
155
156                        if ( this._CONTROLLER_KEY && typeof _SEND.documentElement == 'object' )
157                                _SEND.documentElement.setAttribute( 'ControllerKey', this._CONTROLLER_KEY );
158                }
159
160                _THREADS[ _ID ]._XHR.setRequestHeader( 'BackgroundRequest', Date.parse( new Date ) );
161
162                var _this = this;
163                _THREADS[ _ID ]._XHR.onreadystatechange = function( ){ _HANDLER.call( _this, _ID ); };
164                _THREADS[ _ID ]._XHR.send( _SEND );
165        }
166
167        function usage( )
168        {
169                return ""+
170                        "Description:\n"+
171                        "\t<obj>.go({string access, [mixed handler[, XMLObject post]]})\n\n"+
172                        "Parameters:\n"+
173                        "\taccess : assinatura de acesso à camada de controle.\n"+
174                        "\thandler : uma função a ser executada no fim da requisição\n"+
175                        "\t\tou um objeto que poderá conter dois índices sendo\n"+
176                        "\t\tque ambos deverão ser uma função que será executada\n"+
177                        "\t\tconforme o status do objeto xhr, sendo que na posição\n"+
178                        "\t\t'stream' será a função a ser executada a cada iteração\n"+
179                        "\t\tdo objeto xhr e na posição 'request' será a função\n"+
180                        "\t\ta ser executada no fim da requisição.\n"+
181                        "\tpost : se especificado deverá ser uma query string ou um\n"+
182                        "\tXML bem formatado.\n\n";
183        }
184
185        // @PARAM <string> access :
186        //              assinatura de acesso à camada de controle
187        //
188        // @PARAM <object> handler :
189        //              OBS : neste caso a conexão assumirá que se trata de uma stream
190        //              objeto contendo dois duas funções, sendo,
191        //              no índice stream deverá conter uma função que será execultada
192        //              a cada mudança de status do objeto xhr
193        //
194        // @PARAM <function> handler :
195        //              funcão a ser executada no retorno da requisição
196        //              OBS : neste caso a conexão assumirá que se trata de uma
197        //              requisição função que será execultada no final da requisição
198        //
199        // @PARAM <XMLObject> post:
200        //              este parâmetro define se a conexão é via GET ou POST
201        //              caso o parâmetro não esteja presente a conexão será execultada
202        //              via GET, por outro lado, caso ele exista deverá ser uma query
203        //              string válida ou um xml bem formatado
204        //
205        function go( )
206        {
207                if ( arguments.length != 1 )
208                        return { 'error' : "#0\n\n" + usage( ) };
209
210                var _argv = arguments[ 0 ];
211
212                if ( ( ! _argv.access ) || ( typeof _argv.access != 'string' ) || ( ! _argv.access.length ) )
213                        return { 'error' : "#1\n\n" + usage( ) };
214
215                var _ID = _argv.access;
216
217                _THREADS[ _ID ] = {
218                        '_ACCESS'       : _argv.access,
219                        '_HANDLER'      : { },
220                        '_POST'         : ( ( _argv.post ) ? _argv.post : false ),  // [GET | POST]
221                        '_MODE'         : 'TEXT', // [XML | TEXT]
222                        '_TYPE'         : null, // [4 for request | 3 for stream]
223                        '_XHR'          : null, // [4 for request | 3 for stream]
224                        '_CACHE'        : ( ( _argv.cache && _argv.cache === true ) ? true : false )
225                };
226
227                if ( _argv.mode && ( _argv.mode == 'XML' || _argv.mode == 'TEXT' ) )
228                        _THREADS[ _ID ]._MODE = _argv.mode;
229
230                if ( _argv.handler )
231                        switch ( typeof _argv.handler )
232                        {
233                                case 'function' :
234                                        _THREADS[ _ID ]._HANDLER = { 'request' : _argv.handler };
235                                        break;
236                                case 'object' :
237                                        for ( var i in _argv.handler )
238                                                if ( i != 'stream' && i != 'request' )
239                                                {
240                                                        delete _THREADS[ _ID ];
241                                                        return { 'error' : "#2\n\n" + usage( ) };
242                                                }
243                                                else if ( i == 'stream' )
244                                                {
245                                                        _THREADS[ _ID ]._index = 0;
246                                                        _THREADS[ _ID ]._rtlen = 0;
247                                                }
248                                                _THREADS[ _ID ]._HANDLER = _argv.handler;
249                                        break;
250                        }
251
252                if ( _THREADS[ _ID ]._CACHE && this._CACHED[ _ID ] )
253                {
254                        if ( _THREADS[ _ID ]._HANDLER.request )
255                                _THREADS[ _ID ]._HANDLER.request( this._CACHED[ _ID ] );
256                }
257                else
258                {
259                        if ( ! ( _THREADS[ _ID ]._XHR = _xhr( ) ) )
260                        {
261                                delete _THREADS[_ID];
262                                return { 'error' : "#3 it cannot make a xhr object" };
263                        }
264
265                        _execute.call( this, _ID );
266                }
267
268                return { 'success' : "your thread is running and the response will be manipulated by the handler" };
269        }
270
271        function _abort()
272        {
273                for ( var _ID in _THREADS )
274                {
275                        // @TODO
276                        // try/catch for unknown error of IE.
277                        // Check, store and retrieve the try/catch.
278                        try
279                        {
280                                if ( _THREADS[_ID] && _THREADS[_ID]._XHR && _THREADS[_ID]._XHR.abort )
281                                        _THREADS[_ID]._XHR.abort();
282
283                                delete _THREADS[_ID];
284                        }
285                        catch(e){}
286                }
287        }
288
289        function Connector( )
290        {
291                var _argv = arguments;
292
293                this._PATH = '';
294
295                this._CONTROLLER  = '';
296
297                this._CACHED = [ ];
298
299                if ( ( _argv.length == 1 ) && ( typeof _argv[0] == 'object' ) )
300                {
301                        _argv = _argv[ 0 ];
302
303                        if ( _argv.path && ( typeof _argv.path == 'string' ) )
304                        {
305                                if ( _argv.path.indexOf('/') != 0 )
306                                        _argv.path = '/' + _argv.path;
307
308                                if ( _argv.path.lastIndexOf('/') != ( _argv.path.length - 1) )
309                                        _argv.path += '/';
310
311                                this._PATH = _argv.path;
312                        }
313
314                        if ( _argv.controller )
315                                this._CONTROLLER = _argv.controller;
316
317                        this._CONTROLLER_KEY = ( _argv.key ) ?
318                                _argv.key : false;
319                }
320        }
321
322        Connector.prototype.go = go;
323        Connector.prototype.abort = _abort;
324        Connector.prototype.cache = function( )
325        {
326                return this;
327        };
328        window.XConnector = Connector;
329
330        _config( window, 'onbeforeunload', _abort );
331}
332)();
Note: See TracBrowser for help on using the repository browser.