source: trunk/instant_messenger/js/connector.js @ 260

Revision 260, 5.1 KB checked in by niltonneto, 16 years ago (diff)
  • Property svn:executable set to *
Line 
1function Connector()
2{
3        this.__HTTP__ = [];
4        this.__THREADS__ = [];
5}
6
7Connector.prototype = {
8        'go' : function()
9        {
10                // connection
11                var index = 0;
12                var rtlen = 0;
13                var ie = false; // ie doesn't has stream
14                var __this__ = this;
15                function makeConnection(pThread)
16                {
17                        __this__.__HTTP__[pThread] = xhr();
18                }
19                function setPost(pThread)
20                {
21                        __this__.__THREADS__[pThread].__METHOD__ = 'POST';
22                        return true;
23                }
24                // this function set __this__.__THREADS__[?].__TYPE__ to 4 for request or 3 for stream
25                function setStream(pThread)
26                {
27                        __this__.__THREADS__[pThread].__TYPE__ = ( !ie ) ? 3 : 4;
28                        return true;
29                }
30                function trim(pData)
31                {
32                        return pData.replace(/^ +| +$/g, '');
33                }
34                function verifyUserHandler(pThread, pHandler)
35                {
36                        var type_of_handler = typeof pHandler;
37                        var i;
38                        switch ( type_of_handler )
39                        {
40                                case 'function' :
41                                        return true;
42                                break;
43                                case 'object' :
44                                        for ( i in pHandler )
45                                                if ( i != 'stream' && i != 'request' )
46                                                        return false;
47                                                else if ( i == 'stream' )
48                                                        setStream(pThread);
49                                        return true;
50                                break;
51                                default :
52                                        return false;
53                        }
54                }
55                // xhr = XMLHttpRequest
56                function xhr()
57                {
58                        try
59                        {
60                                return new XMLHttpRequest();
61                        }
62                        catch (e)
63                        {
64                                ie = true;
65                                try
66                                {
67                                        return new ActiveXObject('Msxml2.XMLHTTP');
68                                }
69                                catch (e1)
70                                {
71                                        try
72                                        {
73                                                return new ActiveXObject('Microsoft.XMLHTTP');
74                                        }
75                                        catch (e2)
76                                        {
77                                                return null;
78                                        }
79                                }
80                        }
81                }
82
83                function __HANDLER__()
84                {
85                        try
86                        {
87                                if ( ie && __this__.__HTTP__[arguments[0]].readyState != 4 )
88                                        return false;
89
90                                var threadId = arguments[0];
91
92                                if ( !threadId )
93                                        return false;
94
95                                if ( __this__.__HTTP__[threadId].readyState == 3 || __this__.__HTTP__[threadId].readyState == 4 )
96                                {
97                                        if ( !ie && __this__.__HTTP__[threadId].readyState == 3 && __this__.__THREADS__[threadId].__HANDLER__.stream )
98                                        {
99                                                var data = trim(__this__.__HTTP__[threadId].responseText.substr(index));
100                                                rtlen = __this__.__HTTP__[threadId].responseText.length;
101                                                if ( index < rtlen && data.length )
102                                                {
103                                                        __this__.__THREADS__[threadId].__HANDLER__.stream(data);
104                                                        index = rtlen;
105                                                }
106                                        }
107                                        if ( __this__.__THREADS__[threadId].__HANDLER__.request && __this__.__HTTP__[threadId].readyState == 4 )
108                                        {
109                                                switch ( __this__.__HTTP__[threadId].status )
110                                                {
111                                                        case 200:
112                                                                var stream = false;
113                                                                var request = false;
114                                                                var data = ( __this__.__THREADS__[threadId].__MODE__ == 'XML' ) ?
115                                                                        __this__.__HTTP__[threadId].responseXML :
116                                                                        __this__.__HTTP__[threadId].responseText;
117
118                                                                if ( ie && __this__.__THREADS__[threadId].__HANDLER__.stream )
119                                                                        stream = __this__.__THREADS__[threadId].__HANDLER__.stream;
120
121                                                                if ( __this__.__THREADS__[threadId].__HANDLER__.request )
122                                                                        request = __this__.__THREADS__[threadId].__HANDLER__.request;
123
124                                                                delete __this__.__THREADS__[threadId];
125
126                                                                if ( stream )
127                                                                        stream(data);
128
129                                                                if ( request )
130                                                                        request(data);
131
132                                                                break; // [case : status 200]
133                                                        case 404:
134                                                                alert('Page Not Found!');
135                                                                break; // [case : status 404]
136                                                        default:
137                                                }
138                                        }
139                                }
140                        }
141                        catch(e)
142                        {
143                                //alert("__HANDLER__\n" + threadId + "\n " + e + "\n ErroR: " + e.description);
144                                //delete __this__.__THREADS__[threadId];
145                        }
146                };
147
148                var argc = arguments.length;
149                if ( argc < 2 || argc > 4 )
150                        return {'error':'#0 - invalid params'};
151
152                if ( __this__.__THREADS__[arguments[0]] )
153                        return {'error':'#2 - request is running'};
154
155                __this__.__THREADS__[arguments[0]] = {
156                        '__HANDLER__' : arguments[1],
157                        '__METHOD__'  : 'GET',  // __METHOD__ = [GET | POST]
158                        '__MODE__'    : 'TEXT', // __MODE__ = [XML | TEXT]
159                        '__TYPE__'    : 4       // __TYPE__ = [4 for request | 3 for stream]
160                };
161
162                makeConnection(arguments[0]);
163
164                if ( !verifyUserHandler(arguments[0], arguments[1]) )
165                {
166                        //delete __this__.__THREADS__[arguments[0]];
167                        return {'error':'#1 - invalid handler'};
168                }
169
170                if ( argc == 3 )
171                        setPost(arguments[0]);
172
173                if ( __this__.__HTTP__[arguments[0]] != null )
174                {
175                        try
176                        {
177                                var __TARGET__ = path_im + 'controller.php?act=' + arguments[0];
178
179                                var __SEND__ = null;
180                                __this__.__HTTP__[arguments[0]].open(__this__.__THREADS__[arguments[0]].__METHOD__, __TARGET__, true);
181                                if ( __this__.__THREADS__[arguments[0]].__METHOD__ == 'POST' )
182                                {
183                                        __this__.__HTTP__[arguments[0]].setRequestHeader('Content-Type','application/x-www-form-urlencoded');
184                                        __this__.__HTTP__[arguments[0]].setRequestHeader('Cache-Control',  'no-store, no-cache, must-revalidate');
185                                        __this__.__HTTP__[arguments[0]].setRequestHeader('Cache-Control', 'post-check=0, pre-check=0');
186                                        __this__.__HTTP__[arguments[0]].setRequestHeader('Pragma', 'no-cache');
187                                        __SEND__ = 'act=' + arguments[0] + '&' + arguments[2];
188                                }
189                                var tst = arguments[0];
190                                __this__.__HTTP__[arguments[0]].onreadystatechange = function(){__HANDLER__(tst);};
191                                __this__.__HTTP__[arguments[0]].send(__SEND__);
192                        }
193                        catch(e)
194                        {
195                                alert("go\n" + e.description);
196                                return {'error':'#3 - ' + e.description};
197                        }
198                }
199        }
200};
Note: See TracBrowser for help on using the repository browser.