source: trunk/jabberit_messenger/jmessenger/js/trophyim.js @ 3093

Revision 3093, 66.3 KB checked in by alexandrecorreia, 14 years ago (diff)

Ticket #1091 - Implementado a busca de salas para bate-papo no novo modulo Expresso messenger XEP-0045-MUC.

  • Property svn:executable set to *
Line 
1/**
2 *   This program is distributed under the terms of the MIT license.
3 *   Please see the LICENSE file for details.
4 *
5 *   Copyright 2008 Michael Garvin
6 */
7
8var TROPHYIM_BOSH_SERVICE       = "/proxy/ejabberd";  //Change to suit
9
10var TROPHYIM_LOG_LINES          = 200;
11
12var TROPHYIM_LOGLEVEL           = 0; //0=debug, 1=info, 2=warn, 3=error, 4=fatal
13
14var TROPHYIM_VERSION            = "0.3";
15
16var TROPHYIM_RESOURCE           = "/JABBERITWEB";
17
18//Uncomment to make session reattachment work
19//var TROPHYIM_JSON_STORE = "json_store.php";
20
21/** Object: DOMObjects
22 *  This class contains builders for all the DOM objects needed by TrophyIM
23 */
24DOMObjects = {
25    /** Function: xmlParse
26     *  Cross-browser alternative to using innerHTML
27     *  Parses given string, returns valid DOM HTML object
28     *
29     *  Parameters:
30     *    (String) xml - the xml string to parse
31     */
32    xmlParse : function(xmlString) {
33        var xmlObj = this.xmlRender(xmlString);
34        if(xmlObj) {
35            try { //Firefox, Gecko, etc
36                if (this.processor == undefined) {
37                    this.processor = new XSLTProcessor();
38                    this.processor.importStylesheet(this.xmlRender(
39                    '<xsl:stylesheet version="1.0"\
40                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
41                    <xsl:output method="html" indent="yes"/><xsl:template\
42                    match="@*|node()"><xsl:copy><xsl:copy-of\
43                    select="@*|node()"/></xsl:copy></xsl:template>\
44                    </xsl:stylesheet>'));
45                }
46                var htmlObj =
47                this.processor.transformToDocument(xmlObj).documentElement;
48                //Safari has a quirk where it wraps dom elements in <html><body>
49                if (htmlObj.tagName.toLowerCase() == 'html') {
50                    htmlObj = htmlObj.firstChild.firstChild;
51                }
52                return document.importNode(htmlObj, true);
53            } catch(e) {
54                try { //IE is so very very special
55                    var htmlObj = document.importNode(xmlObj.documentElement, true);
56                    if (htmlObj.tagName.toLowerCase() == "div") {
57                        var div_wrapper = document.createElement('div');
58                        div_wrapper.appendChild(htmlObj);
59                        if(div_wrapper.innerHTML) {
60                            div_wrapper.innerHTML = div_wrapper.innerHTML;
61                        }
62                        htmlObj = div_wrapper.firstChild;
63                    }
64                    return htmlObj;
65                } catch(e) {
66                    alert("TrophyIM Error: Cannot add html to page " + e.message);
67                }
68            }
69        }
70    },
71    /** Function: xmlRender
72     *  Uses browser-specific methods to turn given string into xml object
73     *
74     *  Parameters:
75     *    (String) xml - the xml string to parse
76     */
77    xmlRender : function(xmlString) {
78        try {//IE
79            var renderObj = new ActiveXObject("Microsoft.XMLDOM");
80            renderObj.async="false";
81            if(xmlString) {
82                renderObj.loadXML(xmlString);
83            }
84        } catch (e) {
85            try { //Firefox, Gecko, etc
86                if (this.parser == undefined) {
87                    this.parser = new DOMParser();
88                }
89                var renderObj = this.parser.parseFromString(xmlString,
90                "application/xml");
91            } catch(e) {
92                alert("TrophyIM Error: Cannot create new html for page");
93            }
94        }
95
96        return renderObj;
97    },
98    /** Function: getHTML
99     *  Returns named HTML snippet as DOM object
100     *
101     *  Parameters:
102     *    (String) name - name of HTML snippet to retrieve (see HTMLSnippets
103     *    object)
104     */
105    getHTML : function(page)
106        {
107        return this.xmlParse(HTMLSnippets[page]);
108    },
109       
110    /** Function: getScript
111     *  Returns script object with src to given script
112     *
113     *  Parameters:
114     *    (String) script - name of script to put in src attribute of script
115     *    element
116     */
117    getScript : function(script)
118        {
119        var newscript = document.createElement('script');
120        newscript.setAttribute('src', script);
121        newscript.setAttribute('type', 'text/javascript');
122        return newscript;
123    }
124};
125
126/** Object: TrophyIM
127 *
128 *  This is the actual TrophyIM application.  It searches for the
129 *  'trophyimclient' element and inserts itself into that.
130 */
131TrophyIM = {
132               
133
134        controll : { notificationNewUsers : 0 },       
135   
136        /** AutoConnection
137        *
138        */     
139               
140        autoConnection : { connect : true },
141
142        /** Object: chatHistory
143    *
144    *  Stores chat history (last 10 message) and current presence of active
145    *  chat tabs.  Indexed by jid.
146    */
147       
148        chatHistory : {},
149       
150        /** Constants:
151    *
152    *    (Boolean) stale_roster - roster is stale and needs to be rewritten.
153    */
154       
155        constants : {stale_roster: false},
156       
157        /** PosWindow
158         *
159         */     
160        posWindow : { left : 400, top : 100 }, 
161               
162        /** StatusConnection
163         *
164         */
165
166        statusConn : { connected : false },
167       
168        /** TimeOut Render Roster
169         *
170         *
171         */
172       
173        _timeOut : { renderRoster : null },
174       
175     /** Function: setCookie
176     *
177     *  Sets cookie name/value pair.  Date and path are auto-selected.
178     *
179     *  Parameters:
180     *    (String) name - the name of the cookie variable
181     *    (String) value - the value of the cookie variable
182     */
183   
184        setCookie : function(name, value)
185        {
186        var expire = new Date();
187        expire.setDate(expire.getDate() + 365);
188        document.cookie = name + "=" + value + "; expires=" + expire.toGMTString();
189    },
190   
191        /** Function: delCookie
192     *
193     *  Deletes cookie
194     *
195     *  Parameters:
196     *    (String) name) - the name of the cookie to delete
197     */
198   
199        delCookie : function(name)
200        {
201        var expire = new Date();
202        expire.setDate(expire.getDate() - 365);
203        document.cookie = name + "= ; expires=" + expire.toGMTString();
204        delete TrophyIM.cookies[name];
205    },
206   
207        /** Function: getCookies
208     *
209     *  Retrieves all trophyim cookies into an indexed object.  Inteneded to be
210     *  called once, at which time the app refers to the returned object instead
211     *  of re-parsing the cookie string every time.
212     *
213     *  Each cookie is also re-applied so as to refresh the expiry date.
214     */
215   
216        getCookies : function()
217        {
218        var cObj = {};
219        var cookies = document.cookie.split(';');
220       
221        for(var i = 0 ; i < cookies.length; i++ )
222        {
223                while ( cookies[i].charAt(0) == ' ')
224            {
225                cookies[i] = cookies[i].substring(1,cookies[i].length);
226            }
227               
228            if (cookies[i].substr(0, 8) == "trophyim")
229            {
230                var nvpair = cookies[i].split("=", 2);
231                cObj[nvpair[0]] = nvpair[1];
232                TrophyIM.setCookie(nvpair[0], nvpair[1]);
233            }
234        }
235       
236        return cObj;
237    },
238       
239    /** Function: load
240     *
241     *  This function searches for the trophyimclient div and loads the client
242     *  into it.
243     */
244
245        load : function()
246        {
247        if( loadscript.getUserCurrent() == null )
248        {
249                loadscript.setUserCurrent();     
250        }       
251
252        if ( !TrophyIM.statusConn.connected )
253                {
254                        TrophyIM.cookies = TrophyIM.getCookies();
255
256                        //Wait a second to give scripts time to load
257                        setTimeout( "TrophyIM.showLogin()", 550 );
258                }
259                else
260                {
261                        loadscript.rosterDiv();
262                }
263   },
264
265   /** Function: storeData
266     *
267     *  Store all our data in the JSONStore, if it is active
268     */
269     
270   storeData : function()
271   {
272        if ( TrophyIM.connection && TrophyIM.connection.connected )
273                {
274            TrophyIM.setCookie('trophyim_bosh_xid', TrophyIM.connection.jid + "|" +
275            TrophyIM.connection.sid + "|" +  TrophyIM.connection.rid);
276            TrophyIM.rosterObj.save();
277        }
278    },
279   
280    /**  Function: showlogin
281     *
282     *   This function clears out the IM box and either redisplays the login
283     *   page, or re-attaches to Strophe, preserving the logging div if it
284     *   exists, or creating a new one of we are re-attaching.
285     */
286     
287    showLogin : function()
288        {
289        /**
290         *
291         * JSON is the last script to load, so we wait on it
292                 * Added Strophe check too because of bug where it's sometimes missing
293                 *
294                 */
295
296                if ( typeof(JSON) != undefined && typeof(Strophe) != undefined )
297        {
298                TrophyIM.JSONStore = new TrophyIMJSONStore();
299               
300                        if ( TrophyIM.JSONStore.store_working && TrophyIM.cookies['trophyim_bosh_xid'] )
301            {
302                var xids = TrophyIM.cookies['trophyim_bosh_xid'].split("|");
303                TrophyIM.delCookie('trophyim_bosh_xid');
304                TrophyIM.constants.stale_roster = true;
305                       
306                                TrophyIM.connection                             = new Strophe.Connection(TROPHYIM_BOSH_SERVICE);
307                TrophyIM.connection.rawInput    = TrophyIM.rawInput;
308                TrophyIM.connection.rawOutput   = TrophyIM.rawOutput;
309                //Strophe.log = TrophyIM.log;
310                Strophe.info('Attempting Strophe attach.');
311                TrophyIM.connection.attach(xids[0], xids[1], xids[2], TrophyIM.onConnect);
312                TrophyIM.onConnect(Strophe.Status.CONNECTED);
313            }
314            else
315            {
316                // List Contact
317                                loadscript.rosterDiv();
318
319                                // Get User Current;
320                                var _getUserCurrent = null;
321                               
322                                var _flag       = 0;
323
324                                do
325                                {
326                                        _getUserCurrent = loadscript.getUserCurrent();
327                                        _flag++;
328                                       
329                                }while( ( _getUserCurrent == null || _flag > 3 ) )
330                                       
331                                TrophyIM.login( Base64.decode( _getUserCurrent.jid ), Base64.decode( _getUserCurrent.password ));
332            }
333        }
334        else
335        {
336                setTimeout("TrophyIM.showLogin()", 500);
337        }
338    },
339   
340        /** Function: log
341     *
342     *  This function logs the given message in the trophyimlog div
343     *
344     *  Parameter: (String) msg - the message to log
345     */
346   
347    log : function(level, msg)
348    {
349        if (TrophyIM.logging_div && level >= TROPHYIM_LOGLEVEL)
350        {
351            while(TrophyIM.logging_div.childNodes.length > TROPHYIM_LOG_LINES)
352            {
353                TrophyIM.logging_div.removeChild( TrophyIM.logging_div.firstChild );
354            }
355           
356            var msg_div = document.createElement('div');
357            msg_div.className = 'trophyimlogitem';
358            msg_div.appendChild(document.createTextNode(msg));
359           
360            TrophyIM.logging_div.appendChild(msg_div);
361            TrophyIM.logging_div.scrollTop = TrophyIM.logging_div.scrollHeight;
362        }
363    },
364       
365    /** Function: rawInput
366     *
367     *  This logs the packets actually recieved by strophe at the debug level
368     */
369    rawInput : function (data)
370        {
371        Strophe.debug("RECV: " + data);
372    },
373       
374    /** Function: rawInput
375     *
376     *  This logs the packets actually recieved by strophe at the debug level
377     */
378    rawOutput : function (data)
379        {
380        Strophe.debug("SEND: " + data);
381    },
382       
383    /** Function: login
384     *
385     *  This function logs into server using information given on login page.
386     *  Since the login page is where the logging checkbox is, it makes or
387     *  removes the logging div and cookie accordingly.
388     *
389     */
390    login : function()
391        {
392                if ( TrophyIM.JSONStore.store_working )
393                {
394                   //In case they never logged out
395            TrophyIM.JSONStore.delData(['groups','roster', 'active_chat', 'chat_history']);
396        }
397
398                TrophyIM.connection                             = new Strophe.Connection(TROPHYIM_BOSH_SERVICE);
399        TrophyIM.connection.rawInput    = TrophyIM.rawInput;
400        TrophyIM.connection.rawOutput   = TrophyIM.rawOutput;
401        //Strophe.log                                   = TrophyIM.log;
402       
403                if ( arguments.length > 0 )
404                {
405                        var barejid = arguments[0];
406                        var password = arguments[1];
407                       
408                        TrophyIM.connection.connect( barejid + TROPHYIM_RESOURCE, password, TrophyIM.onConnect );
409                }
410                else
411                {
412                       
413                        var barejid             = document.getElementById('trophyimjid').value
414                        var fulljid             = barejid + TROPHYIM_RESOURCE;
415                        var password    = document.getElementById('trophyimpass').value;
416                        var button              = document.getElementById('trophyimconnect');
417                       
418                        loadscript.setUserCurrent( barejid, password);
419                       
420                        if ( button.value == 'connect' )
421                        {
422                                button.value = 'disconnect';
423                                //TrophyIM.connection.connect( fulljid , password, TrophyIM.onConnect );
424                               
425                                TrophyIM.login( barejid, password );
426                                _winBuild('window_login_page', 'remove');
427                        }
428                }
429
430                TrophyIM.setCookie('trophyimjid', barejid);
431    },
432       
433    /** Function: logout
434     *
435     *  Logs into fresh session through Strophe, purging any old data.
436     */
437    logout : function()
438        {
439        TrophyIM.autoConnection.connect = false;
440       
441        TrophyIM.delCookie('trophyim_bosh_xid');
442       
443        delete TrophyIM['cookies']['trophyim_bosh_xid'];
444       
445        TrophyIM.connection.disconnect();
446    },
447       
448    /** Function onConnect
449     *
450     *  Callback given to Strophe upon connection to BOSH proxy.
451     */
452    onConnect : function(status)
453        {
454        var loading_gif = document.getElementById("JabberIMRosterLoadingGif");
455               
456        if( status == Strophe.Status.CONNECTING )
457                {
458                loading_gif.style.display = "block";
459                Strophe.info('Strophe is connecting.');
460        }
461               
462                if( status == Strophe.Status.CONNFAIL )
463                {
464                        TrophyIM.delCookie('trophyim_bosh_xid');
465            TrophyIM.statusConn.connected = false;
466            loading_gif.style.display = "block";
467        }
468               
469                if( status == Strophe.Status.DISCONNECTING )
470                {
471                        TrophyIM.statusConn.connected = false;
472        }
473               
474                if( status == Strophe.Status.DISCONNECTED )
475                {
476                        if( TrophyIM.autoConnection.connect )
477                        {
478                                loading_gif.style.display = "block";
479                               
480                                TrophyIM.delCookie('trophyim_bosh_xid');
481                   
482                    TrophyIM.statusConn.connected = false;
483                   
484                                setTimeout(function()
485                                {
486                            TrophyIM.showLogin();
487                           
488                                },10000);
489                               
490                    loadscript.clrAllContacts();       
491                   
492                    loadscript.setStatusJabber(i18n.STATUS_ANAVAILABLE,"unavailable");
493                   
494                    delete TrophyIM.rosterObj.roster;
495                    delete TrophyIM.rosterObj.groups;
496                        }
497        }
498               
499                if( status == Strophe.Status.CONNECTED )
500                {
501                        loadscript.setStatusJabber(i18n.STATUS_AVAILABLE,'available');
502                        TrophyIM.statusConn.connected = true;
503            TrophyIM.showClient();
504        }
505    },
506
507    /** Function: showClient
508     *
509     *  This clears out the main div and puts in the main client.  It also
510     *  registers all the handlers for Strophe to call in the client.
511     */
512    showClient : function()
513        {
514        TrophyIM.setCookie('trophyim_bosh_xid', TrophyIM.connection.jid + "|" +
515        TrophyIM.connection.sid + "|" +  TrophyIM.connection.rid);
516               
517        TrophyIM.rosterObj = new TrophyIMRoster();
518        TrophyIM.connection.addHandler(TrophyIM.onVersion, Strophe.NS.VERSION, 'iq', null, null, null);
519        TrophyIM.connection.addHandler(TrophyIM.onRoster, Strophe.NS.ROSTER, 'iq', null, null, null);
520        TrophyIM.connection.addHandler(TrophyIM.onPresence, null, 'presence', null, null, null);
521        TrophyIM.connection.addHandler(TrophyIM.onMessage, null, 'message', null, null,  null);
522       
523                //Get roster then announce presence.
524        TrophyIM.connection.send($iq({type: 'get', xmlns: Strophe.NS.CLIENT}).c('query', {xmlns: Strophe.NS.ROSTER}).tree());
525        TrophyIM.connection.send($pres().tree());
526                setTimeout( TrophyIM.renderRoster, 1000);
527    },
528       
529    /** Function: clearClient
530     *
531     *  Clears out client div, preserving and returning existing logging_div if
532     *  one exists
533     */
534     
535    clearClient : function()
536    {
537        if(TrophyIM.logging_div)
538        {
539            var logging_div = TrophyIM.client_div.removeChild(document.getElementById('trophyimlog'));
540        }
541        else
542        {
543            var logging_div = null;
544        }
545       
546        while(TrophyIM.client_div.childNodes.length > 0)
547        {
548            TrophyIM.client_div.removeChild(TrophyIM.client_div.firstChild);
549        }
550       
551        return logging_div;
552    },
553   
554    /** Function: onVersion
555     *
556     *  jabber:iq:version query handler
557     */
558     
559    onVersion : function(msg)
560    {
561        Strophe.debug("Version handler");
562        if (msg.getAttribute('type') == 'get')
563        {
564            var from = msg.getAttribute('from');
565            var to = msg.getAttribute('to');
566            var id = msg.getAttribute('id');
567            var reply = $iq({type: 'result', to: from, from: to, id: id}).c('query',
568            {name: "TrophyIM", version: TROPHYIM_VERSION, os:
569            "Javascript-capable browser"});
570            TrophyIM.connection.send(reply.tree());
571        }
572        return true;
573    },
574   
575    /** Function: onRoster
576     *
577     *  Roster iq handler
578     */
579   
580    onRoster : function(msg)
581        {
582        var roster_items = msg.firstChild.getElementsByTagName('item');
583               
584                for (var i = 0; i < roster_items.length; i++)
585                {
586                        with(roster_items[i])
587                        {
588                                var groups              = getElementsByTagName('group');       
589                                var group_array = [];
590                               
591                                for( var g = 0 ; g < groups.length; g++ )
592                                {
593                                        if( groups[g].hasChildNodes() )
594                                                group_array[group_array.length] = groups[g].firstChild.nodeValue;
595                                }
596                               
597                                if( getAttribute('ask') && getAttribute('ask').toString() === "subscribe" )
598                                {
599                                        if( getAttribute('subscription').toString() === "none" )
600                                        {
601                                                TrophyIM.rosterObj.addContact( getAttribute('jid'), getAttribute('ask'), getAttribute('name'), group_array );
602                                        }
603                                       
604                                        if( getAttribute('subscription').toString() === "remove" )
605                                        {
606                                                TrophyIM.rosterObj.removeContact( getAttribute('jid').toString() );
607                                        }
608                                }
609                                else
610                                {
611                                        if( ( getAttribute('ask') == null && getAttribute('subscription').toString() === "remove" ) || getAttribute('subscription').toString() === "remove" )
612                                        {
613                                                TrophyIM.rosterObj.removeContact( getAttribute('jid').toString() );
614                                        }
615                                        else
616                                        {
617                                                TrophyIM.rosterObj.addContact( getAttribute('jid'), getAttribute('subscription'), getAttribute('name'), group_array );
618                                        }
619                                }
620                        }
621        }
622
623                if ( msg.getAttribute('type') == 'set' )
624                {
625                        var _iq = $iq({type: 'reply', id: msg.getAttribute('id'), to: msg.getAttribute('from')});
626                        TrophyIM.connection.send( _iq.tree());
627        }
628       
629                return true;
630    },
631   
632    /** Function: onPresence
633     *
634     *  Presence handler
635     */
636   
637    onPresence : function(msg)
638        {
639        // Get Presence ChatRoom
640        TrophyIM.onPresenceChatRoom(msg);
641       
642        var type                = msg.getAttribute('type') ? msg.getAttribute('type') : 'available';
643        var show                = msg.getElementsByTagName('show').length ? Strophe.getText(msg.getElementsByTagName('show')[0]) : type;
644        var status              = msg.getElementsByTagName('status').length ? Strophe.getText(msg.getElementsByTagName('status')[0]) : '';
645        var priority    = msg.getElementsByTagName('priority').length ? parseInt(Strophe.getText(msg.getElementsByTagName('priority')[0])) : 0;
646
647        TrophyIM.rosterObj.setPresence( msg.getAttribute('from'), priority, show, status );
648               
649        return true;
650    },
651
652    /** Function : onPresenceChatRoom
653     *
654     *
655     */
656   
657    onPresenceChatRoom : function(msg)
658    {
659        var xquery = msg.getElementsByTagName("x");
660       
661        if ( xquery.length > 0 )
662        {
663                for ( var i = 0; i < xquery.length; i++ )
664            {
665                var xmlns = xquery[i].getAttribute("xmlns");
666               
667                if( xmlns.indexOf("http://jabber.org/protocol/muc#user") == 0 )
668                {
669                        var nameChatRoom = xquery[i].parentNode.getAttribute('from')
670                                nameChatRoom = Strophe.getBareJidFromJid(nameChatRoom);
671
672                        var nickName = xquery[i].parentNode.getAttribute('from');
673                                nickName = Strophe.getResourceFromJid(nickName);
674                       
675                        var type = xquery[i].parentNode.getAttribute('type') ? xquery[i].parentNode.getAttribute('type') : 'available' ;
676                       
677                        var show = ( xquery[i].parentNode.firstChild.firstChild != null ) ? xquery[i].parentNode.firstChild.firstChild.nodeValue : type ;
678                       
679                        if( xquery[i].firstChild.getAttribute('jid') )
680                        {
681                                if ( Strophe.getBareJidFromJid( xquery[i].firstChild.getAttribute('jid') ) == Strophe.getBareJidFromJid( TrophyIM.connection.jid ) )
682                                        show = loadscript.getStatusUserIM();
683                        }
684                       
685                        var _UserChatRoom = document.createElement("div");
686                                _UserChatRoom.id = nameChatRoom + "_UserChatRoom__" + xquery[i].firstChild.getAttribute('jid');
687                                _UserChatRoom.setAttribute("style","padding-left:18px ; margin:3px 0px 0px 2px; background: url('"+path_jabberit+"templates/default/images/" + show + ".gif')no-repeat center left");
688                                _UserChatRoom.appendChild( document.createTextNode(nickName) );
689               
690                        var nodeUser = document.getElementById( nameChatRoom + "_UserChatRoom__" + xquery[i].firstChild.getAttribute('jid'));           
691                               
692                        if( nodeUser == null && xquery[i].firstChild.getAttribute('jid') )
693                        {
694                                nameChatRoom = document.getElementById(nameChatRoom + '__roomChat__participants');
695                                nameChatRoom.appendChild( _UserChatRoom );
696                        }
697                        else
698                        {
699                                if( type == 'unavailable' )
700                                {
701                                        var nodeUser = document.getElementById( nameChatRoom + "_UserChatRoom__" + xquery[i].parentNode.getAttribute('to'));
702                                                nodeUser.parentNode.removeChild( nodeUser );
703                                }
704                                else if( show )
705                                {
706                                        var _UserChatRoom = document.getElementById( nameChatRoom + "_UserChatRoom__" + xquery[i].firstChild.getAttribute('jid') )
707                                                _UserChatRoom.setAttribute("style","padding-left:18px ; margin:3px 0px 0px 2px; background: url('"+path_jabberit+"templates/default/images/" + show + ".gif')no-repeat center left");   
708                                }
709                        }
710                }
711            }
712        }
713    },   
714   
715    /** Function: onMessage
716     *
717     *  Message handler
718     */
719   
720    onMessage : function(msg)
721    {
722        var checkTime = function(i)
723        {
724                if ( i < 10 ) i= "0" + i;
725               
726                return i;
727        };
728       
729                var messageDate = function( _date )
730                {
731                        var _dt = _date.substr( 0, _date.indexOf( 'T' ) ).split( '-' );
732                        var _hr = _date.substr( _date.indexOf( 'T' ) + 1, _date.length - _date.indexOf( 'T' ) - 2 ).split( ':' );
733                       
734                        ( _date = new Date ).setTime( Date.UTC( _dt[0], _dt[1] - 1, _dt[2], _hr[0], _hr[1], _hr[2] ) );
735
736                        return ( _date.toLocaleDateString( ).replace( /-/g, '/' ) + ' ' + _date.toLocaleTimeString( ) );
737                };
738
739        var data        = new Date();
740        var dtNow       = checkTime(data.getHours()) + ":" + checkTime(data.getMinutes()) + ":" + checkTime(data.getSeconds());
741       
742        var from        = msg.getAttribute('from');
743        var type        = msg.getAttribute('type');
744        var elems       = msg.getElementsByTagName('body');
745        var delay       = ( msg.getElementsByTagName('delay') ) ? msg.getElementsByTagName('delay') : null;
746        var stamp       = ( delay[0] != null ) ? "<font style='color:red;'>" + messageDate(delay[0].getAttribute('stamp')) + "</font>" :  dtNow;
747
748                var barejid             = Strophe.getBareJidFromJid(from);
749                var jidChatRoom = Strophe.getResourceFromJid(from);
750                var jid_lower   = barejid.toLowerCase();
751                var contact             = "";
752                var state               = "";
753
754                var chatBox     = document.getElementById(jid_lower + "__chatState");
755                var chatStateOnOff = null;
756                var active      = msg.getElementsByTagName('active');
757               
758                contact = barejid.toLowerCase();
759                contact = contact.substring(0, contact.indexOf('@'));
760           
761                if( TrophyIM.rosterObj.roster[barejid] )
762                {
763                        if( TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'] )
764                        {
765                                contact = TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'];
766                        }
767                }
768
769                // Message with body are "content message", this means state active
770                if ( elems.length > 0 )
771                {
772                        state = "";
773                       
774                        // Set notify chat state capability on when sender notify it themself
775                        chatStateOnOff = document.getElementById(jid_lower + "__chatStateOnOff");
776                       
777                        if (active.length > 0 & chatStateOnOff != null )
778                        {
779                                chatStateOnOff.value = 'on';
780                        }
781
782                        // Get Message
783                        var _message = document.createElement("div");
784                        _message.innerHTML = Strophe.getText(elems[0]);
785                       
786                        var scripts = _message.getElementsByTagName('script');
787                       
788                        for (var i = 0; i < scripts.length; i++)
789                                _message.removeChild(scripts[i--]);
790                       
791                        _message.innerHTML = _message.innerHTML.replace(/^\s+|\s+$|^\n|\n$/g, "");
792                       
793                        // Get Smiles
794                        _message.innerHTML = loadscript.getSmiles( _message.innerHTML );
795
796                        if (type == 'chat' || type == 'normal')
797                        {
798                                if ( _message.hasChildNodes() )
799                                {
800                                        var message =
801                                        {
802                                contact : "[" + stamp + "] <font style='font-weight:bold; color:black;'>" + contact + "</font>",
803                                msg             : "</br>" + _message.innerHTML
804                        };
805                                       
806                                        TrophyIM.addMessage( TrophyIM.makeChat( from ), jid_lower, message );
807                                }
808                        }
809                        else if( type == 'groupchat')
810                        {
811                                if ( _message.hasChildNodes() )
812                                {
813                                        var message =
814                                        {
815                                contact : "[" + stamp + "] <font style='font-weight:bold; color:black;'>" + jidChatRoom + "</font>",
816                                msg             : "</br>" + _message.innerHTML
817                        };
818
819                                        TrophyIM.addMessage( TrophyIM.makeChatRoom( barejid ), jid_lower, message );
820                                }
821                        }
822                }
823                // Message without body are "content message", this mean state is not active
824                else
825                {
826                        if( chatBox != null )
827                                state = TrophyIM.getChatState(msg);                     
828                }
829               
830                // Clean chat status message some time later           
831                var clearChatState = function()
832                {
833                        chatBox.innerHTML='';
834                }
835               
836                if (chatBox != null)
837                {
838                        var clearChatStateTimer;
839                       
840                        chatBox.innerHTML = "<font style='font-weight:bold; color:grey; float:right;'>" + state + "</font>";
841                       
842                        var _composing =  msg.getElementsByTagName('composing');
843                       
844                        if ( _composing.length == 0 )
845                               
846                                clearChatStateTimer = setTimeout(clearChatState, 2000);
847                        else
848                                clearTimeout(clearChatStateTimer);                     
849                }
850
851                return true;
852        },
853
854        /** Function: getChatState
855         *
856         *  Parameters:
857         *    (string) msg - the message to get chat state
858         *    (string) jid - the jid of chat box to update the chat state to.
859         */
860        getChatState : function(msg)
861        {
862                var     state =  msg.getElementsByTagName('inactive');
863               
864                if ( state.length > 0 )
865                {
866                return i18n.INACTIVE;
867                }
868                else
869                {
870                state = msg.getElementsByTagName('gone');
871            if ( state.length > 0 )
872            {
873                return i18n.GONE;
874                        }
875            else
876            {
877                state = msg.getElementsByTagName('composing');
878                if ( state.length > 0 )
879                {
880                        return i18n.COMPOSING;
881                                }
882                else
883                {
884                        state =  msg.getElementsByTagName('paused');
885                        if ( state.length > 0 )
886                        {
887                                return i18n.PAUSED;
888                                        }
889                                }
890                        }
891                }
892               
893                return '';
894        },
895
896        /** Function: makeChat
897     *
898     *  Make sure chat window to given fulljid exists, switching chat context to
899     *  given resource.
900     */
901     
902    makeChat : function(fulljid)
903    {
904        var barejid             = Strophe.getBareJidFromJid(fulljid);
905        var titleWindow = "";
906
907        var paramsChatBox =
908        {
909                        'enabledPopUp'  : ( ( loadscript.getIsIE() ) ? "none" : "block" ),
910                        'idChatBox'     : barejid + "__chatBox",
911                        'jidTo'                 : barejid,
912                                'path_jabberit' : path_jabberit
913        };
914
915        titleWindow = barejid.toLowerCase();
916                titleWindow = titleWindow.substring(0, titleWindow.indexOf('@'));
917
918        if( TrophyIM.rosterObj.roster[barejid] )
919        {
920            if( TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'] )
921            {
922                titleWindow = TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'];
923            }
924        }
925
926        // Position Top
927        TrophyIM.posWindow.top  = TrophyIM.posWindow.top + 10;
928        if( TrophyIM.posWindow.top > 200 )
929                TrophyIM.posWindow.top  = 100;
930       
931        // Position Left
932        TrophyIM.posWindow.left = TrophyIM.posWindow.left + 5;
933        if( TrophyIM.posWindow.left > 455 )
934                TrophyIM.posWindow.left = 400;
935       
936        var _content = document.createElement( 'div' );
937        _content.innerHTML = loadscript.parse( "chat_box", "chatBox.xsl", paramsChatBox);
938        _content = _content.firstChild;
939       
940        var _messages           = _content.firstChild.firstChild;
941        var _textarea           = _content.getElementsByTagName( 'textarea' ).item( 0 );
942        var _send                       = _content.getElementsByTagName( 'input' ).item( 0 );
943                var _chatStateOnOff     = _content.getElementsByTagName( 'input' ).item( 1 );
944
945        var _send_message = function( )
946        {
947                if ( ! TrophyIM.sendMessage( barejid, _textarea.value ) )
948                        return false;
949
950                // Add Message in chatBox;
951                TrophyIM.addMessage( _messages, barejid, {
952                        contact : "<font style='font-weight:bold; color:red;'>" + i18n.ME + "</font>",
953                        msg : "<br/>" + _textarea.value
954                } );
955
956                _textarea.value = '';
957                _textarea.focus( );
958        };
959               
960                var composingTimer_ = 0;
961                var isComposing_ = 0;
962                var timeCounter;
963
964                var setComposing = function( )
965                {
966                        var checkComposing = function()
967                        {
968                if (!isComposing_) {
969                        // User stopped composing
970                        composingTimer_ = 0;
971                        clearInterval(timeCounter);
972                        TrophyIM.sendContentMessage(barejid, 'paused');
973                } else {
974                        TrophyIM.sendContentMessage(barejid, 'composing');
975                }
976                isComposing_ = 0; // Reset composing
977                }
978
979                if (!composingTimer_) {
980                /* User (re)starts composing */
981                composingTimer_ = 1;
982                timeCounter = setInterval(checkComposing,4000);
983                }
984                isComposing_ = 1;
985        };
986
987        loadscript.configEvents( _send, 'onclick', _send_message );
988                loadscript.configEvents( _textarea, 'onkeyup', function( e )
989                {
990                        if ( e.keyCode == 13 ){
991                                _send_message( );
992                                // User stopped composing
993                composingTimer_ = 0;
994                clearInterval(timeCounter);
995                        }else{
996                                if (_chatStateOnOff.value == 'on')
997                                        setComposing();
998                        }
999                } );       
1000
1001        var winChatBox =
1002        {
1003                         id_window              : "window_chat_area_" + barejid,
1004                         barejid                : barejid,
1005                         width                  : 387,
1006                         height                 : 375,
1007                         top                    : TrophyIM.posWindow.top,
1008                         left                   : TrophyIM.posWindow.left,
1009                         draggable              : true,
1010                         visible                : "display",
1011                         resizable              : true,
1012                         zindex                 : loadscript.getZIndex(),
1013                         title                  : titleWindow,
1014                         closeAction    : "hidden",
1015                         content                : _content     
1016        }
1017       
1018                _win = _winBuild(winChatBox);
1019
1020        // Notification New Message
1021        loadscript.notification(barejid);
1022       
1023        // Photo User;
1024                loadscript.getPhotoUser(barejid);
1025               
1026                _textarea.focus( );
1027               
1028                return ( _messages = _win.content( ).firstChild );
1029    },
1030
1031        /** Function: makeChatRoom
1032    *
1033    *
1034    *
1035    */
1036   
1037    makeChatRoom : function()
1038    {
1039        var jidChatRoom = arguments[0];
1040        var titleWindow = "ChatRoom - " + arguments[1];
1041       
1042        var paramsChatRoom =
1043        {
1044                        'idChatRoom'    : jidChatRoom + "__roomChat",
1045                        'jidTo'                 : jidChatRoom,
1046                        'lang_Send'             : i18n.SEND,
1047                        'lang_Leave_ChatRoom' : i18n.LEAVE_CHATROOM,
1048                                'path_jabberit' : path_jabberit
1049        };
1050
1051        // Position Top
1052        TrophyIM.posWindow.top  = TrophyIM.posWindow.top + 10;
1053        if( TrophyIM.posWindow.top > 200 )
1054                TrophyIM.posWindow.top  = 100;
1055       
1056        // Position Left
1057        TrophyIM.posWindow.left = TrophyIM.posWindow.left + 5;
1058        if( TrophyIM.posWindow.left > 455 )
1059                TrophyIM.posWindow.left = 400;
1060
1061        var _content = document.createElement( 'div' );
1062        _content.innerHTML = loadscript.parse( "chat_room", "chatRoom.xsl", paramsChatRoom );
1063        _content = _content.firstChild;
1064       
1065        var _messages           = _content.firstChild.firstChild;
1066        var _textarea           = _content.getElementsByTagName( 'textarea' ).item( 0 );
1067        var _send                       = _content.getElementsByTagName( 'input' ).item( 0 );
1068        var _leaveChatRoom      = _content.getElementsByTagName( 'input' ).item( 1 );
1069       
1070        var _send_message = function( )
1071        {
1072                if ( ! TrophyIM.sendMessageChatRoom( jidChatRoom, _textarea.value ) )
1073                        return false;
1074               
1075                _textarea.value = '';
1076               
1077                _textarea.focus( );
1078        };
1079       
1080        loadscript.configEvents( _send, 'onclick', _send_message );
1081        loadscript.configEvents( _leaveChatRoom, 'onclick', function( )
1082        {
1083                TrophyIM.leaveChatRoom( jidChatRoom );
1084
1085                setTimeout( function()
1086                {
1087                        _winBuild('window_chat_room_' + jidChatRoom, 'remove');
1088                       
1089                }, 500 );
1090               
1091        });
1092       
1093                loadscript.configEvents( _textarea, 'onkeyup', function( e )
1094                {
1095                        if ( e.keyCode == 13 )
1096                        {
1097                                _send_message( );
1098                        }
1099                });       
1100       
1101        var winChatRoom =
1102        {
1103                         id_window              : "window_chat_room_" + arguments[0],
1104                         barejid                : jidChatRoom,
1105                         width                  : 500,
1106                         height                 : 450,
1107                         top                    : TrophyIM.posWindow.top,
1108                         left                   : TrophyIM.posWindow.left,
1109                         draggable              : true,
1110                         visible                : "display",
1111                         resizable              : true,
1112                         zindex                 : loadscript.getZIndex(),
1113                         title                  : titleWindow,
1114                         closeAction    : "hidden",
1115                         content                : _content     
1116        }
1117       
1118        _win = _winBuild(winChatRoom);
1119       
1120        return ( _messages = _win.content( ).firstChild );
1121       
1122    },
1123   
1124        /** Function addContacts
1125         *
1126         *  Parameters:
1127         *              (string) jidFrom         
1128         *      (string) jidTo
1129         *              (string) name
1130         *              (string) group   
1131         */
1132       
1133        addContact : function( jidTo, name, group )
1134        {
1135                // Add Contact
1136        var _id = TrophyIM.connection.getUniqueId('add');
1137                var newContact = $iq({type: 'set', id: _id });
1138                        newContact = newContact.c('query').attrs({xmlns : 'jabber:iq:roster'});
1139                        newContact = newContact.c('item').attrs({jid: jidTo, name:name });
1140                        newContact = newContact.c('group').t(group).tree();
1141
1142                TrophyIM.connection.send(newContact);
1143        },
1144
1145    /** Function: add
1146     *
1147     *  Parameters:
1148     *    (string) msg - the message to add
1149     *    (string) jid - the jid of chat box to add the message to.
1150     */
1151       
1152    addMessage : function( chatBox, jid, msg )
1153    {
1154        // Get Smiles
1155        msg.msg = loadscript.getSmiles( msg.msg );
1156 
1157        var messageDiv  = document.createElement("div");
1158                messageDiv.style.margin = "3px 0px 1em 3px";
1159        messageDiv.innerHTML    = msg.contact + " : " + msg.msg ;
1160               
1161        chatBox.appendChild(messageDiv);
1162        chatBox.scrollTop = chatBox.scrollHeight;
1163    },
1164       
1165    /** Function : renameContact
1166     *
1167     *
1168     */
1169   
1170    renameContact : function( jid )
1171    {
1172        // Name
1173        var name                = TrophyIM.rosterObj.roster[jid].contact.name;
1174
1175                if(( name = prompt(i18n.ASK_NEW_NAME_QUESTION + name + "!", name )))
1176                        if(( name = name.replace(/^\s+|\s+$|^\n|\n$/g,"")) == "" )
1177                                name = "";
1178
1179                if( name == null || name == "")
1180                        name = "";
1181               
1182        var jidTo = jid
1183        var name  = ( name ) ? name : TrophyIM.rosterObj.roster[jid].contact.name;
1184        var group = TrophyIM.rosterObj.roster[jid].contact.groups[0];
1185       
1186        TrophyIM.addContact( jidTo, name, group );
1187       
1188        document.getElementById('itenContact_' + jid ).innerHTML = name;
1189    },
1190   
1191    /** Function : renameGroup
1192     *
1193     *
1194     */
1195
1196    renameGroup : function( jid )
1197    {
1198        var group               = TrophyIM.rosterObj.roster[jid].contact.groups[0];
1199        var presence    = TrophyIM.rosterObj.roster[jid].presence;
1200       
1201                // Group
1202                if(( group = prompt( i18n.ASK_NEW_GROUP_QUESTION, group )))
1203                        if(( group = group.replace(/^\s+|\s+$|^\n|\n$/g,"")) == "" )
1204                                group = "";
1205
1206                if( group == null || group == "")
1207                        group = "";
1208
1209        var jidTo = TrophyIM.rosterObj.roster[jid].contact.jid;
1210        var name  = TrophyIM.rosterObj.roster[jid].contact.name;
1211                var group = ( group ) ? group : TrophyIM.rosterObj.roster[jid].contact.groups[0];
1212
1213                TrophyIM.rosterObj.removeContact( jid );
1214               
1215                TrophyIM.addContact( jidTo, name, group );
1216       
1217                document.getElementById("JabberIMRoster").innerHTML = "";
1218               
1219        TrophyIM.renderRoster();
1220       
1221        setTimeout(function()
1222        {
1223                for( var i in presence )
1224                {
1225                        if ( presence[ i ].constructor == Function )
1226                                continue;
1227                               
1228                        TrophyIM.rosterObj.setPresence( jid, presence[i].priority, presence[i].show, presence[i].status);
1229                }
1230        },500);
1231    },
1232
1233    // TESTE SALAS
1234   
1235    /** Function : joinRoom
1236     *
1237     *
1238     */
1239   
1240    joinChatRoom : function( roomName )
1241    {
1242        var presence = $pres({from: TrophyIM.connection.jid, to: roomName}).c("x",{xmlns: Strophe.NS.MUC});
1243       
1244                TrophyIM.connection.send( presence );
1245    },
1246   
1247    /** Function : Leave Chat Room
1248     *
1249     *
1250     */
1251   
1252    leaveChatRoom : function( roomName )
1253    {
1254        var room_nick   = roomName + "/USUARIO_DE_TESTE";
1255       
1256        var presenceid  = TrophyIM.connection.getUniqueId();
1257       
1258        var presence    = $pres( {type: "unavailable", id: presenceid, from: TrophyIM.connection.jid, to: room_nick} ).c("x",{xmlns: Strophe.NS.MUC});
1259       
1260        TrophyIM.connection.send( presence );       
1261    },
1262   
1263    /** Function : getlistRooms
1264     *
1265     *
1266     */
1267   
1268    getListRooms : function()
1269    {
1270        var _error_return = function(element)
1271        {
1272                alert( " ERROR : " + element );
1273        };
1274       
1275                var iq = $iq({to: "conference.im.pr.gov.br", type: "get"}).c("query",{xmlns: Strophe.NS.DISCO_ITEMS});                 
1276               
1277        TrophyIM.connection.sendIQ( iq, loadscript.listRooms, _error_return, 500 );             
1278    },
1279   
1280    /** Function: removeContact
1281     *
1282     *  Parameters:
1283     *          (string) jidTo
1284     */
1285   
1286    removeContact : function( jidTo )
1287    {
1288        var divItenContact       = null;
1289
1290        if( ( divItenContact = document.getElementById('itenContact_' + jidTo )))
1291        {       
1292                // Remove Contact
1293                var _id = TrophyIM.connection.getUniqueId();   
1294                var delContact  = $iq({type: 'set', id: _id})
1295                        delContact      = delContact.c('query').attrs({xmlns : 'jabber:iq:roster'});
1296                        delContact      = delContact.c('item').attrs({jid: jidTo, subscription:'remove'}).tree();
1297
1298                TrophyIM.connection.send( delContact );
1299               
1300                        loadscript.removeElement( document.getElementById('itenContactNotification_' + jidTo ) );
1301               
1302                var spanShow = document.getElementById('span_show_itenContact_' + jidTo )
1303                        spanShow.parentNode.removeChild(spanShow);
1304               
1305                loadscript.removeGroup( divItenContact.parentNode );
1306               
1307                divItenContact.parentNode.removeChild(divItenContact);
1308        }
1309    },
1310   
1311    /** Function: renderRoster
1312     *
1313     *  Renders roster, looking only for jids flagged by setPresence as having
1314     *  changed.
1315     */
1316   
1317        renderRoster : function()
1318        {
1319                var roster_div = document.getElementById('JabberIMRoster');
1320               
1321                if( roster_div )
1322                {
1323                        var users = new Array();
1324                       
1325                        var loading_gif = document.getElementById("JabberIMRosterLoadingGif");
1326                       
1327                        if( loading_gif.style.display == "block" )
1328                                loading_gif.style.display = "none";
1329                               
1330                        for( var user in TrophyIM.rosterObj.roster )
1331                        {
1332                                if ( TrophyIM.rosterObj.roster[ user ].constructor == Function )
1333                                        continue;
1334
1335                                users[users.length] = TrophyIM.rosterObj.roster[user].contact.jid;
1336                        }
1337
1338                        users.sort();
1339                       
1340                        var groups              = new Array();
1341                        var flagGeral   = false;
1342                       
1343                        for (var group in TrophyIM.rosterObj.groups)
1344                        {
1345                                if ( TrophyIM.rosterObj.groups[ group ].constructor == Function )
1346                                        continue;
1347                               
1348                                if( group )
1349                                        groups[groups.length] = group;
1350                               
1351                                if( group == "Geral" )
1352                                        flagGeral = true;
1353            }
1354           
1355                        if( !flagGeral && users.length > 0 )
1356                                groups[groups.length] = "Geral";
1357                               
1358                        groups.sort();
1359                       
1360                        for ( var i = 0; i < groups.length; i++ )
1361                        {
1362                                TrophyIM.renderGroups( groups[i] , roster_div );       
1363                        }
1364                       
1365                        TrophyIM.renderItensGroup( users, roster_div );
1366                }
1367                       
1368                TrophyIM._timeOut.renderRoster = setTimeout("TrophyIM.renderRoster()", 1000 );         
1369        },
1370       
1371    /** Function: renderGroups
1372     *
1373     *
1374     */
1375       
1376        renderGroups: function( nameGroup, element )
1377        {
1378                var _addGroup = function()
1379                {
1380                        var _nameGroup  = nameGroup;
1381                        var _element    = element;
1382
1383                        var paramsGroup =
1384                        {
1385                                'nameGroup'     : _nameGroup,
1386                                'path_jabberit' : path_jabberit
1387                        }
1388                       
1389                        _element.innerHTML += loadscript.parse("group","groups.xsl", paramsGroup);
1390                }
1391
1392                if( !element.hasChildNodes() )
1393                {
1394                        _addGroup();
1395                }
1396                else
1397                {
1398                        var _NodeChild  = element.firstChild;
1399                        var flagAdd             = false;
1400                       
1401                        while( _NodeChild )
1402                        {
1403                                if( _NodeChild.childNodes[0].nodeName.toLowerCase() === "span" )
1404                                {
1405                                        if( _NodeChild.childNodes[0].childNodes[0].nodeValue === nameGroup )
1406                                        {
1407                                                flagAdd = true;
1408                                        }
1409                                }
1410                               
1411                                _NodeChild = _NodeChild.nextSibling;
1412                        }
1413
1414                        if( !flagAdd )
1415                        {
1416                                _addGroup();
1417                        }
1418                }
1419        },
1420
1421    /** Function: renderItensGroup
1422     *
1423     *
1424     */
1425
1426        renderItensGroup : function( users, element )
1427        {
1428                var addItem = function()
1429                {
1430                        if( arguments.length > 0 )
1431                        {
1432                                // Get Arguments
1433                                var objContact  = arguments[0];
1434                                var group               = arguments[1];
1435                                var element             = arguments[2];
1436                                var showOffline = loadscript.getShowContactsOffline();
1437                               
1438                                // Presence e Status
1439                                var presence            = "unavailable";
1440                                var status                      = "";
1441                                var statusColor         = "black";
1442                                var statusDisplay       = "none";
1443                               
1444                                var _resource   = "";
1445                               
1446                                // Set Presence
1447                                var _presence = function(objContact)
1448                                {
1449                                        if (objContact.presence)
1450                                        {
1451                                                for (var resource in objContact.presence)
1452                                                {
1453                                                        if ( objContact.presence[resource].constructor == Function )
1454                                                                continue;
1455
1456                                                        if( objContact.presence[resource].show != 'invisible' )
1457                                                                presence = objContact.presence[resource].show;
1458
1459                                                        if( objContact.contact.subscription != "both")
1460                                                                presence = 'subscription';
1461                                                       
1462                                                        if( objContact.presence[resource].status )
1463                                                        {
1464                                                                status = " ( " + objContact.presence[resource].status + " ) ";
1465                                                                statusDisplay   = "block";
1466                                                        }
1467                                                }
1468                                        }
1469                                };
1470                               
1471                                // Set Subscription
1472                                var _subscription = function( objContact )
1473                                {
1474                                        if( objContact.contact.subscription != "both" )
1475                                        {
1476                                                switch( objContact.contact.subscription )
1477                                                {
1478                                                        case "none" :
1479                                                               
1480                                                                status          = " (( " + i18n.ASK_FOR_AUTH  + " )) ";
1481                                                                statusColor     = "red";
1482                                                                break;
1483       
1484                                                        case "to" :
1485                                                               
1486                                                                status          = " (( " + i18n.CONTACT_ASK_FOR_AUTH  + " )) ";
1487                                                                statusColor     = "orange";
1488                                                                break;
1489       
1490                                                        case "from" :
1491                                                               
1492                                                                status          = " (( " + i18n.AUTHORIZED + " )) ";
1493                                                                statusColor = "green";
1494                                                                break;
1495                                                               
1496                                                        case "subscribe" :
1497                                                               
1498                                                                status          = " (( " + i18n.AUTH_SENT  + " )) ";
1499                                                                statusColor     = "red";       
1500                                                                break;
1501
1502                                                        case "not-in-roster" :
1503                                                               
1504                                                                status          = " (( " + i18n.ASK_FOR_AUTH_QUESTION  + " )) ";
1505                                                                statusColor     = "orange";     
1506                                                                break;
1507                                                               
1508                                                        default :
1509                                                               
1510                                                                break;
1511                                                }
1512
1513                                                statusDisplay = "block";
1514                                        }
1515                                };
1516
1517                                if( objContact.contact.subscription != "remove")
1518                                {
1519                                        var itensJid    = document.getElementById( "itenContact_" + objContact.contact.jid );
1520                                       
1521                                        if( itensJid == null )
1522                                        {
1523                                                // Name
1524                                                var nameContact = "";                                   
1525                                               
1526                                                if ( objContact.contact.name )
1527                                                        nameContact = objContact.contact.name;
1528                                                else
1529                                                {
1530                                                        nameContact = objContact.contact.jid;
1531                                                        nameContact = nameContact.substring(0, nameContact.indexOf('@'));
1532                                                }
1533                                               
1534                                                // Get Presence
1535                                                _presence(objContact);
1536                                               
1537                                                var paramsContact =
1538                                                {
1539                                                        divDisplay              : "block",
1540                                                        id                              : 'itenContact_' + objContact.contact.jid ,
1541                                                        jid                             : objContact.contact.jid,
1542                                                        nameContact     : nameContact,
1543                                                        path_jabberit   : path_jabberit,
1544                                                        presence                : presence,
1545                                                        spanDisplay             : statusDisplay,
1546                                                        status                  : status,
1547                                                        statusColor             : "black",
1548                                                        subscription    : objContact.contact.subscription,
1549                                                        resource                : _resource
1550                                                }
1551                                               
1552                                                // Get Authorization
1553                                                _subscription( objContact );
1554                                               
1555                                                if( group != "")
1556                                                {
1557                                                        var _NodeChild          = element.firstChild;
1558                                                       
1559                                                        while( _NodeChild )
1560                                                        {
1561                                                                if( _NodeChild.childNodes[0].nodeName.toLowerCase() === "span" )
1562                                                                {
1563                                                                        if( _NodeChild.childNodes[0].childNodes[0].nodeValue === group )
1564                                                                        {
1565                                                                                _NodeChild.innerHTML += loadscript.parse("itens_group", "itensGroup.xsl", paramsContact);
1566                                                                        }
1567                                                                }
1568       
1569                                                                _NodeChild = _NodeChild.nextSibling;
1570                                                        }
1571                                                }       
1572                                        }
1573                                        else
1574                                        {
1575                                                // Get Presence
1576                                                _presence(objContact);
1577       
1578                                                var is_open = itensJid.parentNode.childNodes[0].style.backgroundImage; 
1579                                                        is_open = is_open.indexOf("arrow_down.gif");
1580       
1581                                                // Get Authorization
1582                                                _subscription( objContact );
1583                                               
1584                                                // Set subscription
1585                                                itensJid.setAttribute('subscription', objContact.contact.subscription );
1586                                               
1587                                                with ( document.getElementById('span_show_' + 'itenContact_' + objContact.contact.jid ) )
1588                                                {
1589                                                        if( presence == "unavailable" && !showOffline )
1590                                                        {
1591                                                                style.display = "none";
1592                                                        }
1593                                                        else
1594                                                        {
1595                                                                if( is_open > 0 )
1596                                                                {
1597                                                                        style.display   = statusDisplay;
1598                                                                        style.color             = statusColor;
1599                                                                        innerHTML               = status;
1600                                                                }
1601                                                        }
1602                                                }
1603                                               
1604                                                if( presence == "unavailable" && !showOffline )
1605                                                {
1606                                                        itensJid.style.display = "none";
1607                                                }
1608                                                else
1609                                                {
1610                                                        if( is_open > 0 )
1611                                                        {
1612                                                                itensJid.style.display = "block";
1613                                                        }
1614                                                }
1615                                               
1616                                                itensJid.style.background       = "url('"+path_jabberit+"templates/default/images/" + presence + ".gif') no-repeat center left";
1617                                        }
1618       
1619                                        // Contact OffLine
1620                                        if( !objContact.presence && !showOffline )
1621                                        {
1622                                                if( objContact.contact.subscription != "remove" )
1623                                                {
1624                                                        with ( document.getElementById('span_show_' + 'itenContact_' + objContact.contact.jid ))
1625                                                        {
1626                                                                style.display   = "none";
1627                                                        }
1628               
1629                                                        with ( document.getElementById('itenContact_' + objContact.contact.jid ) )
1630                                                        {
1631                                                                style.display   = "none";
1632                                                        }
1633                                                }
1634                                        }
1635                                }
1636                        }
1637                };
1638               
1639                var flag = false;
1640               
1641                for( var i = 0 ; i < users.length; i++ )
1642                {
1643                        if( TrophyIM.rosterObj.roster[users[i]].contact.jid != Base64.decode( loadscript.getUserCurrent().jid) )
1644                        {
1645                                var _subscription = TrophyIM.rosterObj.roster[users[i]].contact.subscription;
1646                               
1647                                if( _subscription === "to" )
1648                                {
1649                                        flag = true;
1650                                }
1651                               
1652                                if(  _subscription === "not-in-roster")
1653                                {
1654                                        flag = true;
1655                                }
1656                               
1657                                if( TrophyIM.rosterObj.roster[users[i]].contact.groups )
1658                                {
1659                                        var groups = TrophyIM.rosterObj.roster[users[i]].contact.groups;
1660                                       
1661                                        if( groups.length > 0 )
1662                                        {
1663                                                for( var j = 0; j < groups.length; j++ )
1664                                                {
1665                                                        addItem( TrophyIM.rosterObj.roster[users[i]], groups[j], element );
1666                                                }
1667                                        }
1668                                        else
1669                                        {
1670                                                addItem( TrophyIM.rosterObj.roster[users[i]], "Geral", element );
1671                                        }
1672                                }
1673                                else
1674                                {
1675                                        addItem( TrophyIM.rosterObj.roster[users[i]], "Geral", element );
1676                                }
1677                        }
1678                }
1679               
1680                if( flag )
1681                {
1682                        if ( TrophyIM.controll.notificationNewUsers == 0 )
1683                        {
1684                                loadscript.enabledNotificationNewUsers();
1685                                TrophyIM.controll.notificationNewUsers++;
1686                        }
1687                }
1688                else
1689                {
1690                        loadscript.disabledNotificationNewUsers();
1691                        TrophyIM.controll.notificationNewUsers = 0;
1692                }
1693        },
1694
1695    /** Function: rosterClick
1696     *
1697     *  Handles actions when a roster item is clicked
1698     */
1699   
1700        rosterClick : function(fulljid)
1701        {
1702        TrophyIM.makeChat(fulljid);
1703    },
1704
1705        /** Function SetAutorization
1706         *
1707         */
1708
1709        setAutorization : function( jidTo, jidFrom, _typeSubscription )
1710        {
1711        var _id = TrophyIM.connection.getUniqueId();
1712       
1713        TrophyIM.connection.send($pres( ).attrs({ from: jidFrom, to: jidTo, type: _typeSubscription, id: _id }).tree());
1714        },
1715   
1716        /** Function: setPresence
1717     *
1718     */
1719
1720        setPresence : function( _type )
1721        {
1722                if( _type != 'status')
1723                {
1724                        if( _type == "unavailable" &&  TrophyIM.statusConn.connected )
1725                        {
1726                                var loading_gif = document.getElementById("JabberIMRosterLoadingGif");
1727                               
1728                                if( TrophyIM._timeOut.renderRoster != null )
1729                                        clearTimeout(TrophyIM._timeOut.renderRoster);
1730                               
1731                                if( TrophyIM.statusConn.connected )
1732                                        TrophyIM.connection.send($pres({type : _type}).tree());
1733                               
1734                                for( var i = 0; i < TrophyIM.connection._requests.length; i++ )
1735                        {
1736                                if( TrophyIM.connection._requests[i] )
1737                                        TrophyIM.connection._removeRequest(TrophyIM.connection._requests[i]);
1738                        }
1739                               
1740                                TrophyIM.logout();
1741                               
1742                        loadscript.clrAllContacts();
1743                       
1744                        delete TrophyIM.rosterObj.roster;
1745                        delete TrophyIM.rosterObj.groups;
1746                       
1747                        setTimeout(function()
1748                        {
1749                                        if( loading_gif.style.display == "block" )
1750                                                loading_gif.style.display = "none";
1751                        }, 1000);
1752                        }
1753                        else
1754                        {
1755                                if( !TrophyIM.autoConnection.connect )
1756                                {
1757                                        TrophyIM.autoConnection.connect = true;
1758                                        TrophyIM.load();
1759                                }
1760                                else
1761                                {
1762                                        if( TrophyIM.statusConn.connected )
1763                                        {
1764                                                if( loadscript.getStatusMessage() != "" )
1765                                                {
1766                                                        var _presence = $pres( );
1767                                                        _presence.node.appendChild( Strophe.xmlElement( 'show' ) ).appendChild( Strophe.xmlTextNode( _type ) );
1768                                                        _presence.node.appendChild( Strophe.xmlElement( 'status' ) ).appendChild( Strophe.xmlTextNode( loadscript.getStatusMessage() ));
1769                                                       
1770                                                        TrophyIM.connection.send( _presence.tree() );
1771                                                }
1772                                                else
1773                                                {
1774                                                        TrophyIM.connection.send($pres( ).c('show').t(_type).tree());
1775                                                }
1776                                        }
1777                                }
1778                        }
1779                }
1780                else
1781                {
1782                        var _show       = "available";
1783                        var _status     = "";
1784                       
1785                        if( arguments.length < 2 )
1786                        {
1787                                if( loadscript.getStatusMessage() != "" )
1788                                        _status = prompt(i18n.TYPE_YOUR_MSG, loadscript.getStatusMessage());
1789                                else
1790                                        _status = prompt(i18n.TYPE_YOUR_MSG);
1791                               
1792                                var _divStatus = document.getElementById("JabberIMStatusMessage");
1793                               
1794                                if( ( _status = _status.replace(/^\s+|\s+$|^\n|\n$/g,"") ) != "")
1795                                        _divStatus.firstChild.innerHTML = "( " + _status + " )";
1796                        }
1797                        else
1798                        {
1799                                _status = arguments[1];
1800                        }
1801
1802                        for( var resource in TrophyIM.rosterObj.roster[Base64.decode(loadscript.getUserCurrent().jid)].presence )
1803                        {
1804                        if ( TrophyIM.rosterObj.roster[Base64.decode(loadscript.getUserCurrent().jid)].presence[ resource ].constructor == Function )
1805                                continue;
1806                       
1807                                if ( TROPHYIM_RESOURCE === ("/" + resource) )
1808                                        _show = TrophyIM.rosterObj.roster[Base64.decode(loadscript.getUserCurrent().jid)].presence[resource].show;
1809                        }
1810
1811                        if ( TrophyIM.statusConn.connected )
1812                        {
1813                                var _presence = $pres( );
1814                                _presence.node.appendChild( Strophe.xmlElement( 'show' ) ).appendChild( Strophe.xmlTextNode( _show ) );
1815                                _presence.node.appendChild( Strophe.xmlElement( 'status' ) ).appendChild( Strophe.xmlTextNode( _status ) );
1816                               
1817                                TrophyIM.connection.send( _presence.tree() );
1818                        }
1819                }
1820        },
1821       
1822        /** Function: sendMessage
1823     *
1824     *  Send message from chat input to user
1825     */
1826     
1827    sendMessage : function()
1828    {
1829                if (arguments.length > 0)
1830                {
1831                        var jidTo = arguments[0];
1832                        var message_input = arguments[1];
1833                       
1834                       
1835                        message_input = message_input.replace(/^\s+|\s+$|^\n|\n$/g, "");
1836                       
1837                        if (message_input != "") {
1838                       
1839                                // Send Message
1840                                var newMessage = $msg({
1841                                        to: jidTo,
1842                                        from: TrophyIM.connection.jid,
1843                                        type: 'chat'
1844                                });
1845                                newMessage = newMessage.c('body').t(message_input);
1846                                newMessage.up();
1847                                newMessage = newMessage.c('active').attrs({
1848                                        xmlns: 'http://jabber.org/protocol/chatstates'
1849                                });
1850                                // Send Message
1851                                TrophyIM.connection.send(newMessage.tree());
1852                               
1853                                return true;
1854                        }
1855                }
1856               
1857                return false;
1858    },
1859
1860        /** Function: sendMessage
1861    *
1862    *  Send message to ChatRoom
1863    */
1864   
1865    sendMessageChatRoom : function( room )
1866    {
1867        if( arguments.length > 0 )
1868        {
1869                var room_nick   = arguments[0];
1870                var message             = arguments[1];
1871                var msgid               = TrophyIM.connection.getUniqueId();
1872                var msg                 = $msg({to: room_nick, type: "groupchat", id: msgid}).c("body",{xmlns: Strophe.NS.CLIENT}).t(message);
1873               
1874                msg.up();//.c("x", {xmlns: "jabber:x:event"}).c("composing");
1875               
1876                TrophyIM.connection.send(msg);
1877               
1878                return true;
1879        }
1880    },
1881   
1882        /** Function: sendContentMessage
1883     *
1884     *  Send a content message from chat input to user
1885     */
1886        sendContentMessage : function()
1887    {
1888      if( arguments.length > 0 )
1889      {
1890         var jidTo = arguments[0];
1891         var state = arguments[1];
1892
1893         var newMessage = $msg({to: jidTo, from: TrophyIM.connection.jid, type: 'chat'});
1894         newMessage = newMessage.c(state).attrs({xmlns : 'http://jabber.org/protocol/chatstates'});
1895         // Send content message
1896         TrophyIM.connection.send(newMessage.tree());
1897      }
1898    }
1899};
1900
1901/** Class: TrophyIMRoster
1902 *
1903 *
1904 *  This object stores the roster and presence info for the TrophyIMClient
1905 *
1906 *  roster[jid_lower]['contact']
1907 *  roster[jid_lower]['presence'][resource]
1908 */
1909function TrophyIMRoster()
1910{
1911    /** Constants: internal arrays
1912     *    (Object) roster - the actual roster/presence information
1913     *    (Object) groups - list of current groups in the roster
1914     *    (Array) changes - array of jids with presence changes
1915     */
1916    if (TrophyIM.JSONStore.store_working)
1917        {
1918        var data = TrophyIM.JSONStore.getData(['roster', 'groups']);
1919        this.roster = (data['roster'] != null) ? data['roster'] : {};
1920        this.groups = (data['groups'] != null) ? data['groups'] : {};
1921    }
1922        else
1923        {
1924        this.roster = {};
1925        this.groups = {};
1926    }
1927    this.changes = new Array();
1928   
1929        if (TrophyIM.constants.stale_roster)
1930        {
1931        for (var jid in this.roster)
1932                {
1933                        this.changes[this.changes.length] = jid;
1934        }
1935    }
1936
1937        /** Function: addChange
1938         *
1939         *  Adds given jid to this.changes, keeping this.changes sorted and
1940         *  preventing duplicates.
1941         *
1942         *  Parameters
1943         *    (String) jid : jid to add to this.changes
1944         */
1945         
1946        this.addChange = function(jid)
1947        {
1948                for (var c = 0; c < this.changes.length; c++)
1949                {
1950                        if (this.changes[c] == jid)
1951                        {
1952                                return;
1953                        }
1954                }
1955               
1956                this.changes[this.changes.length] = jid;
1957               
1958                this.changes.sort();
1959        }
1960       
1961    /** Function: addContact
1962     *
1963     *  Adds given contact to roster
1964     *
1965     *  Parameters:
1966     *    (String) jid - bare jid
1967     *    (String) subscription - subscription attribute for contact
1968     *    (String) name - name attribute for contact
1969     *    (Array)  groups - array of groups contact is member of
1970     */
1971   
1972        this.addContact = function(jid, subscription, name, groups )
1973        {
1974                if( subscription === "remove" )
1975        {
1976                        this.removeContact(jid);
1977        }
1978        else
1979        {
1980                        var contact             = { jid:jid, subscription:subscription, name:name, groups:groups }
1981                var jid_lower   = jid.toLowerCase();
1982       
1983                        if ( this.roster[jid_lower] )
1984                        {
1985                    this.roster[jid_lower]['contact'] = contact;
1986                }
1987                        else
1988                        {
1989                    this.roster[jid_lower] = {contact:contact};
1990                }
1991
1992                        groups = groups ? groups : [''];
1993               
1994                        for ( var g = 0; g < groups.length; g++ )
1995                        {
1996                                if ( !this.groups[groups[g]] )
1997                                {
1998                        this.groups[groups[g]] = {};
1999                    }
2000                   
2001                                this.groups[groups[g]][jid_lower] = jid_lower;
2002                }
2003        }
2004    }
2005   
2006    /** Function: getContact
2007     *
2008     *  Returns contact entry for given jid
2009     *
2010     *  Parameter: (String) jid - jid to return
2011     */
2012     
2013    this.getContact = function(jid)
2014        {
2015        if (this.roster[jid.toLowerCase()])
2016                {
2017            return this.roster[jid.toLowerCase()]['contact'];
2018        }
2019    }
2020
2021   /** Function: getPresence
2022        *
2023        *  Returns best presence for given jid as Array(resource, priority, show,
2024        *  status)
2025        *
2026        *  Parameter: (String) fulljid - jid to return best presence for
2027        */
2028         
2029        this.getPresence = function(fulljid)
2030        {
2031                var jid = Strophe.getBareJidFromJid(fulljid);
2032                var current = null;
2033                   
2034                if (this.roster[jid.toLowerCase()] && this.roster[jid.toLowerCase()]['presence'])
2035                {
2036                        for (var resource in this.roster[jid.toLowerCase()]['presence'])
2037                        {
2038                        if ( this.roster[jid.toLowerCase()]['presence'][ resource ].constructor == Function )
2039                                continue;
2040                       
2041                                var presence = this.roster[jid.toLowerCase()]['presence'][resource];
2042                                if (current == null)
2043                                {
2044                                        current = presence
2045                                }
2046                                else
2047                                {
2048                                        if(presence['priority'] > current['priority'] && ((presence['show'] == "chat"
2049                                        || presence['show'] == "available") || (current['show'] != "chat" ||
2050                                        current['show'] != "available")))
2051                                        {
2052                                                current = presence
2053                                        }
2054                                }
2055                        }
2056                }
2057                return current;
2058        }
2059
2060        /** Function: groupHasChanges
2061         *
2062         *  Returns true if current group has members in this.changes
2063         *
2064         *  Parameters:
2065         *    (String) group - name of group to check
2066         */
2067         
2068        this.groupHasChanges = function(group)
2069        {
2070                for (var c = 0; c < this.changes.length; c++)
2071                {
2072                        if (this.groups[group][this.changes[c]])
2073                        {
2074                                return true;
2075                        }
2076                }
2077                return false;
2078        }
2079       
2080        /** Function removeContact
2081         *
2082         * Parameters
2083         *       (String) jid           
2084         */
2085         
2086         this.removeContact = function(jid)
2087         {
2088                if( this.roster[ jid ] )
2089                {
2090                        var groups = this.roster[ jid ].contact.groups;
2091                       
2092                        if( groups )
2093                        {
2094                                for ( var i = 0; i < groups.length; i++ )
2095                                {
2096                                        delete this.groups[ groups[ i ] ][ jid ];
2097                                }
2098       
2099                                for ( var i = 0; i < groups.length; i++ )
2100                                {
2101                                        var contacts = 0;
2102                                        for ( var contact in this.groups[ groups[ i ] ] )
2103                                        {
2104                                        if ( this.groups[ groups[ i ] ][ contact ].constructor == Function )
2105                                                continue;
2106                                       
2107                                                contacts++;
2108                                        }
2109               
2110                                        if ( ! contacts )
2111                                                delete this.groups[ groups[ i ] ];
2112                                }
2113                        }
2114       
2115                        // Delete Object roster
2116                        if( this.roster[jid] )
2117                                delete this.roster[jid];
2118                }
2119         }
2120         
2121    /** Function: setPresence
2122     *
2123     *  Sets presence
2124     *
2125     *  Parameters:
2126     *    (String) fulljid: full jid with presence
2127     *    (Integer) priority: priority attribute from presence
2128     *    (String) show: show attribute from presence
2129     *    (String) status: status attribute from presence
2130     */
2131   
2132        this.setPresence = function(fulljid, priority, show, status)
2133        {
2134                var barejid             = Strophe.getBareJidFromJid(fulljid);
2135        var resource    = Strophe.getResourceFromJid(fulljid);
2136        var jid_lower   = barejid.toLowerCase();
2137       
2138        if( show != 'unavailable' || show != 'error' )
2139                {
2140            if (!this.roster[jid_lower])
2141                        {
2142                this.addContact( barejid, 'not-in-roster' );
2143            }
2144           
2145            var presence =
2146                        {
2147                resource        : resource,
2148                priority        : priority,
2149                show            : show,
2150                status          : status
2151            }
2152           
2153                        if (!this.roster[jid_lower]['presence'])
2154                        {
2155                this.roster[jid_lower]['presence'] = {};
2156            }
2157           
2158            this.roster[jid_lower]['presence'][resource] = presence;   
2159                }
2160    }
2161
2162        /** Fuction: save
2163         *
2164         *  Saves roster data to JSON store
2165         */
2166       
2167        this.save = function()
2168        {
2169                if (TrophyIM.JSONStore.store_working)
2170                {
2171                        TrophyIM.JSONStore.setData({roster:this.roster,
2172                        groups:this.groups, active_chat:TrophyIM.activeChats['current'],
2173                        chat_history:TrophyIM.chatHistory});
2174                }
2175        }
2176
2177}
2178/** Class: TrophyIMJSONStore
2179 *
2180 *
2181 *  This object is the mechanism by which TrophyIM stores and retrieves its
2182 *  variables from the url provided by TROPHYIM_JSON_STORE
2183 *
2184 */
2185function TrophyIMJSONStore() {
2186    this.store_working = false;
2187    /** Function _newXHR
2188     *
2189     *  Set up new cross-browser xmlhttprequest object
2190     *
2191     *  Parameters:
2192     *    (function) handler = what to set onreadystatechange to
2193     */
2194     this._newXHR = function (handler) {
2195        var xhr = null;
2196        if (window.XMLHttpRequest) {
2197            xhr = new XMLHttpRequest();
2198            if (xhr.overrideMimeType) {
2199            xhr.overrideMimeType("text/xml");
2200            }
2201        } else if (window.ActiveXObject) {
2202            xhr = new ActiveXObject("Microsoft.XMLHTTP");
2203        }
2204        return xhr;
2205    }
2206    /** Function getData
2207     *  Gets data from JSONStore
2208     *
2209     *  Parameters:
2210     *    (Array) vars = Variables to get from JSON store
2211     *
2212     *  Returns:
2213     *    Object with variables indexed by names given in parameter 'vars'
2214     */
2215    this.getData = function(vars) {
2216        if (typeof(TROPHYIM_JSON_STORE) != undefined) {
2217            Strophe.debug("Retrieving JSONStore data");
2218            var xhr = this._newXHR();
2219            var getdata = "get=" + vars.join(",");
2220            try {
2221                xhr.open("POST", TROPHYIM_JSON_STORE, false);
2222            } catch (e) {
2223                Strophe.error("JSONStore open failed.");
2224                return false;
2225            }
2226            xhr.setRequestHeader('Content-type',
2227            'application/x-www-form-urlencoded');
2228            xhr.setRequestHeader('Content-length', getdata.length);
2229            xhr.send(getdata);
2230            if (xhr.readyState == 4 && xhr.status == 200) {
2231                try {
2232                    var dataObj = JSON.parse(xhr.responseText);
2233                    return this.emptyFix(dataObj);
2234                } catch(e) {
2235                    Strophe.error("Could not parse JSONStore response" +
2236                    xhr.responseText);
2237                    return false;
2238                }
2239            } else {
2240                Strophe.error("JSONStore open failed. Status: " + xhr.status);
2241                return false;
2242            }
2243        }
2244    }
2245    /** Function emptyFix
2246     *    Fix for bugs in external JSON implementations such as
2247     *    http://bugs.php.net/bug.php?id=41504.
2248     *    A.K.A. Don't use PHP, people.
2249     */
2250    this.emptyFix = function(obj) {
2251        if (typeof(obj) == "object") {
2252            for (var i in obj) {
2253                        if ( obj[i].constructor == Function )
2254                                continue;
2255                       
2256                if (i == '_empty_') {
2257                    obj[""] = this.emptyFix(obj['_empty_']);
2258                    delete obj['_empty_'];
2259                } else {
2260                    obj[i] = this.emptyFix(obj[i]);
2261                }
2262            }
2263        }
2264        return obj
2265    }
2266    /** Function delData
2267     *    Deletes data from JSONStore
2268     *
2269     *  Parameters:
2270     *    (Array) vars  = Variables to delete from JSON store
2271     *
2272     *  Returns:
2273     *    Status of delete attempt.
2274     */
2275    this.delData = function(vars) {
2276        if (typeof(TROPHYIM_JSON_STORE) != undefined) {
2277            Strophe.debug("Retrieving JSONStore data");
2278            var xhr = this._newXHR();
2279            var deldata = "del=" + vars.join(",");
2280            try {
2281                xhr.open("POST", TROPHYIM_JSON_STORE, false);
2282            } catch (e) {
2283                Strophe.error("JSONStore open failed.");
2284                return false;
2285            }
2286            xhr.setRequestHeader('Content-type',
2287            'application/x-www-form-urlencoded');
2288            xhr.setRequestHeader('Content-length', deldata.length);
2289            xhr.send(deldata);
2290            if (xhr.readyState == 4 && xhr.status == 200) {
2291                try {
2292                    var dataObj = JSON.parse(xhr.responseText);
2293                    return dataObj;
2294                } catch(e) {
2295                    Strophe.error("Could not parse JSONStore response");
2296                    return false;
2297                }
2298            } else {
2299                Strophe.error("JSONStore open failed. Status: " + xhr.status);
2300                return false;
2301            }
2302        }
2303    }
2304    /** Function setData
2305     *    Stores data in JSONStore, overwriting values if they exist
2306     *
2307     *  Parameters:
2308     *    (Object) vars : Object containing named vars to store ({name: value,
2309     *    othername: othervalue})
2310     *
2311     *  Returns:
2312     *    Status of storage attempt
2313     */
2314    this.setData = function(vars)
2315    {
2316        if ( typeof(TROPHYIM_JSON_STORE) != undefined )
2317        {
2318            var senddata = "set=" + JSON.stringify(vars);
2319            var xhr = this._newXHR();
2320            try
2321            {
2322                xhr.open("POST", TROPHYIM_JSON_STORE, false);
2323            }
2324            catch (e)
2325            {
2326                Strophe.error("JSONStore open failed.");
2327                return false;
2328            }
2329            xhr.setRequestHeader('Content-type',
2330            'application/x-www-form-urlencoded');
2331            xhr.setRequestHeader('Content-length', senddata.length);
2332            xhr.send(senddata);
2333            if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText ==
2334            "OK") {
2335                return true;
2336            } else {
2337                Strophe.error("JSONStore open failed. Status: " + xhr.status);
2338                return false;
2339            }
2340        }
2341    }
2342   
2343    var testData = true;
2344   
2345    if (this.setData({testData:testData})) {
2346        var testResult = this.getData(['testData']);
2347        if (testResult && testResult['testData'] == true) {
2348            this.store_working = true;
2349        }
2350    }
2351}
2352/** Constants: Node types
2353 *
2354 * Implementations of constants that IE doesn't have, but we need.
2355 */
2356if (document.ELEMENT_NODE == null) {
2357    document.ELEMENT_NODE = 1;
2358    document.ATTRIBUTE_NODE = 2;
2359    document.TEXT_NODE = 3;
2360    document.CDATA_SECTION_NODE = 4;
2361    document.ENTITY_REFERENCE_NODE = 5;
2362    document.ENTITY_NODE = 6;
2363    document.PROCESSING_INSTRUCTION_NODE = 7;
2364    document.COMMENT_NODE = 8;
2365    document.DOCUMENT_NODE = 9;
2366    document.DOCUMENT_TYPE_NODE = 10;
2367    document.DOCUMENT_FRAGMENT_NODE = 11;
2368    document.NOTATION_NODE = 12;
2369}
2370
2371/** Function: importNode
2372 *
2373 *  document.importNode implementation for IE, which doesn't have importNode
2374 *
2375 *  Parameters:
2376 *    (Object) node - dom object
2377 *    (Boolean) allChildren - import node's children too
2378 */
2379if (!document.importNode) {
2380    document.importNode = function(node, allChildren) {
2381        switch (node.nodeType) {
2382            case document.ELEMENT_NODE:
2383                var newNode = document.createElement(node.nodeName);
2384                if (node.attributes && node.attributes.length > 0) {
2385                    for(var i = 0; i < node.attributes.length; i++) {
2386                        newNode.setAttribute(node.attributes[i].nodeName,
2387                        node.getAttribute(node.attributes[i].nodeName));
2388                    }
2389                }
2390                if (allChildren && node.childNodes &&
2391                node.childNodes.length > 0) {
2392                    for (var i = 0; i < node.childNodes.length; i++) {
2393                        newNode.appendChild(document.importNode(
2394                        node.childNodes[i], allChildren));
2395                    }
2396                }
2397                return newNode;
2398                break;
2399            case document.TEXT_NODE:
2400            case document.CDATA_SECTION_NODE:
2401            case document.COMMENT_NODE:
2402                return document.createTextNode(node.nodeValue);
2403                break;
2404        }
2405    };
2406}
2407
2408/**
2409 *
2410 * Bootstrap self into window.onload and window.onunload
2411 */
2412
2413var oldonunload = window.onunload;
2414
2415window.onunload = function()
2416{
2417        if( oldonunload )
2418        {
2419        oldonunload();
2420    }
2421       
2422        TrophyIM.setPresence('unavailable');
2423}
Note: See TracBrowser for help on using the repository browser.