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

Revision 2628, 8.5 KB checked in by rodsouza, 14 years ago (diff)

Ticket #1009 - Organizando javascript e criando cache dos mesmos.

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                                        }
129                                break;
130                                default :
131                        }
132                }
133        }
134
135        function _execute( )
136        {
137                var _ID = arguments[0];
138
139                var _ACTION = 'act=' + _ID;
140                var _TARGET = this._PATH + this._CONTROLLER + _THREADS[ _ID ]._ACCESS;
141
142                var _SEND = null;
143
144                //if ( _THREADS[_ID]._METHOD == 'GET' )
145                //      _TARGET += '?' + _ACTION;
146
147                //_TARGET += _ID;
148
149                _THREADS[ _ID ]._XHR.open( ( ( _THREADS[ _ID ]._POST ) ? 'POST' : 'GET' ), _TARGET, true);
150
151                if ( _THREADS[ _ID ]._POST )
152                {
153                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Content-Type','application/x-www-form-urlencoded' );
154                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Cache-Control',  'no-store, no-cache, must-revalidate' );
155                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Cache-Control', 'post-check=0, pre-check=0' );
156                        _THREADS[ _ID ]._XHR.setRequestHeader( 'Pragma', 'no-cache' );
157
158                        _SEND = _THREADS[ _ID ]._POST;
159
160                        if ( this._CONTROLLER_KEY && typeof _SEND.documentElement == 'object' )
161                                _SEND.documentElement.setAttribute( 'ControllerKey', this._CONTROLLER_KEY );
162                }
163
164                _THREADS[ _ID ]._XHR.setRequestHeader( 'BackgroundRequest', Date.parse( new Date ) );
165
166                var _this = this;
167                _THREADS[ _ID ]._XHR.onreadystatechange = function( ){ _HANDLER.call( _this, _ID ); };
168                _THREADS[ _ID ]._XHR.send( _SEND );
169        }
170
171        function usage( )
172        {
173                return ""+
174                        "Description:\n"+
175                        "\t<obj>.go({string access, [mixed handler[, XMLObject post]]})\n\n"+
176                        "Parameters:\n"+
177                        "\taccess : assinatura de acesso à camada de controle.\n"+
178                        "\thandler : uma função a ser executada no fim da requisição\n"+
179                        "\t\tou um objeto que poderá conter dois índices sendo\n"+
180                        "\t\tque ambos deverão ser uma função que será executada\n"+
181                        "\t\tconforme o status do objeto xhr, sendo que na posição\n"+
182                        "\t\t'stream' será a função a ser executada a cada iteração\n"+
183                        "\t\tdo objeto xhr e na posição 'request' será a função\n"+
184                        "\t\ta ser executada no fim da requisição.\n"+
185                        "\tpost : se especificado deverá ser uma query string ou um\n"+
186                        "\tXML bem formatado.\n\n";
187        }
188
189        // @PARAM <string> access :
190        //              assinatura de acesso à camada de controle
191        //
192        // @PARAM <object> handler :
193        //              OBS : neste caso a conexão assumirá que se trata de uma stream
194        //              objeto contendo dois duas funções, sendo,
195        //              no índice stream deverá conter uma função que será execultada
196        //              a cada mudança de status do objeto xhr
197        //
198        // @PARAM <function> handler :
199        //              funcão a ser executada no retorno da requisição
200        //              OBS : neste caso a conexão assumirá que se trata de uma
201        //              requisição função que será execultada no final da requisição
202        //
203        // @PARAM <XMLObject> post:
204        //              este parâmetro define se a conexão é via GET ou POST
205        //              caso o parâmetro não esteja presente a conexão será execultada
206        //              via GET, por outro lado, caso ele exista deverá ser uma query
207        //              string válida ou um xml bem formatado
208        //
209        function go( )
210        {
211                if ( arguments.length != 1 )
212                        return { 'error' : "#0\n\n" + usage( ) };
213
214                var _argv = arguments[ 0 ];
215
216                if ( ( ! _argv.access ) || ( typeof _argv.access != 'string' ) || ( ! _argv.access.length ) )
217                        return { 'error' : "#1\n\n" + usage( ) };
218
219                var _ID = _argv.access;
220
221                _THREADS[ _ID ] = {
222                        '_ACCESS'       : _argv.access,
223                        '_HANDLER'      : { },
224                        '_POST'         : ( ( _argv.post ) ? _argv.post : false ),  // [GET | POST]
225                        '_MODE'         : 'TEXT', // [XML | TEXT]
226                        '_TYPE'         : null, // [4 for request | 3 for stream]
227                        '_XHR'          : null, // [4 for request | 3 for stream]
228                        '_CACHE'        : ( ( _argv.cache && _argv.cache === true ) ? true : false )
229                };
230
231                if ( _argv.mode && ( _argv.mode == 'XML' || _argv.mode == 'TEXT' ) )
232                        _THREADS[ _ID ]._MODE = _argv.mode;
233
234                if ( _argv.handler )
235                        switch ( typeof _argv.handler )
236                        {
237                                case 'function' :
238                                        _THREADS[ _ID ]._HANDLER = { 'request' : _argv.handler };
239                                        break;
240                                case 'object' :
241                                        for ( var i in _argv.handler )
242                                                if ( i != 'stream' && i != 'request' )
243                                                {
244                                                        delete _THREADS[ _ID ];
245                                                        return { 'error' : "#2\n\n" + usage( ) };
246                                                }
247                                                else if ( i == 'stream' )
248                                                {
249                                                        _THREADS[ _ID ]._index = 0;
250                                                        _THREADS[ _ID ]._rtlen = 0;
251                                                }
252                                                _THREADS[ _ID ]._HANDLER = _argv.handler;
253                                        break;
254                        }
255
256                if ( _THREADS[ _ID ]._CACHE && this._CACHED[ _ID ] )
257                {
258                        if ( _THREADS[ _ID ]._HANDLER.request )
259                                _THREADS[ _ID ]._HANDLER.request( this._CACHED[ _ID ] );
260                }
261                else
262                {
263                        if ( ! ( _THREADS[ _ID ]._XHR = _xhr( ) ) )
264                        {
265                                delete _THREADS[_ID];
266                                return { 'error' : "#3 it cannot make a xhr object" };
267                        }
268
269                        _execute.call( this, _ID );
270                }
271
272                return { 'success' : "your thread is running and the response will be manipulated by the handler" };
273        }
274
275        function _abort()
276        {
277                for ( var _ID in _THREADS )
278                {
279                        // @TODO
280                        // try/catch for unknown error of IE.
281                        // Check, store and retrieve the try/catch.
282                        try
283                        {
284                                if ( _THREADS[_ID] && _THREADS[_ID]._XHR && _THREADS[_ID]._XHR.abort )
285                                        _THREADS[_ID]._XHR.abort();
286
287                                delete _THREADS[_ID];
288                        }
289                        catch(e){}
290                }
291        }
292
293        function Connector( )
294        {
295                var _argv = arguments;
296
297                this._PATH = '';
298
299                this._CONTROLLER  = '';
300
301                this._CACHED = [ ];
302
303                if ( ( _argv.length == 1 ) && ( typeof _argv[0] == 'object' ) )
304                {
305                        _argv = _argv[ 0 ];
306
307                        if ( _argv.path && ( typeof _argv.path == 'string' ) )
308                        {
309                                if ( _argv.path.indexOf('/') != 0 )
310                                        _argv.path = '/' + _argv.path;
311
312                                if ( _argv.path.lastIndexOf('/') != ( _argv.path.length - 1) )
313                                        _argv.path += '/';
314
315                                this._PATH = _argv.path;
316                        }
317
318                        if ( _argv.controller )
319                                this._CONTROLLER = _argv.controller;
320
321                        this._CONTROLLER_KEY = ( _argv.key ) ?
322                                _argv.key : false;
323                }
324        }
325
326        Connector.prototype.go = go;
327        Connector.prototype.abort = _abort;
328        Connector.prototype.cache = function( )
329        {
330                return this;
331        };
332        window.XConnector = Connector;
333
334        _config( window, 'onbeforeunload', _abort );
335}
336)();
Note: See TracBrowser for help on using the repository browser.