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

Revision 3097, 66.9 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 Presences 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        if( msg.getAttribute('from').toString().indexOf('conference') < 0 )
648        {       
649                TrophyIM.rosterObj.setPresence( msg.getAttribute('from'), priority, show, status );
650        }
651       
652        return true;
653    },
654
655    /** Function : onPresenceChatRoom
656     *
657     * Presence ChatRoom Handler
658     */
659   
660    onPresenceChatRoom : function(msg)
661    {
662        var xquery = msg.getElementsByTagName("x");
663       
664        if ( xquery.length > 0 )
665        {
666                for ( var i = 0; i < xquery.length; i++ )
667            {
668                var xmlns = xquery[i].getAttribute("xmlns");
669               
670                if( xmlns.indexOf("http://jabber.org/protocol/muc#user") == 0 )
671                {
672                        var nameChatRoom = xquery[i].parentNode.getAttribute('from');
673                                nameChatRoom = Strophe.getBareJidFromJid(nameChatRoom);
674
675                        var nickName = xquery[i].parentNode.getAttribute('from');
676                                nickName = Strophe.getResourceFromJid(nickName);
677                       
678                        var type = xquery[i].parentNode.getAttribute('type') ? xquery[i].parentNode.getAttribute('type') : 'available' ;
679                       
680                        var show = ( xquery[i].parentNode.firstChild.firstChild != null ) ? xquery[i].parentNode.firstChild.firstChild.nodeValue : type ;
681                       
682                        if( xquery[i].firstChild.getAttribute('jid') )
683                        {
684                                if ( Strophe.getBareJidFromJid( xquery[i].firstChild.getAttribute('jid') ) == Strophe.getBareJidFromJid( TrophyIM.connection.jid ) )
685                                        show = loadscript.getStatusUserIM();
686                        }
687                       
688                        var _UserChatRoom = document.createElement("div");
689                                _UserChatRoom.id = nameChatRoom + "_UserChatRoom__" + xquery[i].firstChild.getAttribute('jid');
690                                _UserChatRoom.setAttribute("style","padding-left:18px ; margin:3px 0px 0px 2px; background: url('"+path_jabberit+"templates/default/images/" + show + ".gif')no-repeat center left");
691                                _UserChatRoom.appendChild( document.createTextNode(nickName) );
692               
693                        var nodeUser = document.getElementById( nameChatRoom + "_UserChatRoom__" + xquery[i].firstChild.getAttribute('jid'));           
694                               
695                        if( nodeUser == null && xquery[i].firstChild.getAttribute('jid') )
696                        {
697                                if( document.getElementById( nameChatRoom + '__roomChat__participants' ) != null )
698                                {
699                                        nameChatRoom = document.getElementById( nameChatRoom + '__roomChat__participants' );
700                                        nameChatRoom.appendChild( _UserChatRoom );
701                                }
702                                else
703                                {
704                                        TrophyIM.makeChatRoom( nameChatRoom, "TESTE_MEU" );
705                                       
706                                        nameChatRoom = document.getElementById( nameChatRoom + '__roomChat__participants' );
707                                        nameChatRoom.appendChild( _UserChatRoom );
708                                }
709                        }
710                        else
711                        {
712                                if( type == 'unavailable' )
713                                {
714                                        var nodeUser = document.getElementById( nameChatRoom + "_UserChatRoom__" + xquery[i].parentNode.getAttribute('to'));
715                                                nodeUser.parentNode.removeChild( nodeUser );
716                                }
717                                else if( show )
718                                {
719                                        var _UserChatRoom = document.getElementById( nameChatRoom + "_UserChatRoom__" + xquery[i].firstChild.getAttribute('jid') )
720                                                _UserChatRoom.setAttribute("style","padding-left:18px ; margin:3px 0px 0px 2px; background: url('"+path_jabberit+"templates/default/images/" + show + ".gif')no-repeat center left");   
721                                }
722                        }
723                }
724            }
725        }
726    },   
727   
728    /** Function: onMessage
729     *
730     *  Message handler
731     */
732   
733    onMessage : function(msg)
734    {
735        var checkTime = function(i)
736        {
737                if ( i < 10 ) i= "0" + i;
738               
739                return i;
740        };
741       
742                var messageDate = function( _date )
743                {
744                        var _dt = _date.substr( 0, _date.indexOf( 'T' ) ).split( '-' );
745                        var _hr = _date.substr( _date.indexOf( 'T' ) + 1, _date.length - _date.indexOf( 'T' ) - 2 ).split( ':' );
746                       
747                        ( _date = new Date ).setTime( Date.UTC( _dt[0], _dt[1] - 1, _dt[2], _hr[0], _hr[1], _hr[2] ) );
748
749                        return ( _date.toLocaleDateString( ).replace( /-/g, '/' ) + ' ' + _date.toLocaleTimeString( ) );
750                };
751
752        var data        = new Date();
753        var dtNow       = checkTime(data.getHours()) + ":" + checkTime(data.getMinutes()) + ":" + checkTime(data.getSeconds());
754       
755        var from        = msg.getAttribute('from');
756        var type        = msg.getAttribute('type');
757        var elems       = msg.getElementsByTagName('body');
758        var delay       = ( msg.getElementsByTagName('delay') ) ? msg.getElementsByTagName('delay') : null;
759        var stamp       = ( delay[0] != null ) ? "<font style='color:red;'>" + messageDate(delay[0].getAttribute('stamp')) + "</font>" :  dtNow;
760
761                var barejid             = Strophe.getBareJidFromJid(from);
762                var jidChatRoom = Strophe.getResourceFromJid(from);
763                var jid_lower   = barejid.toLowerCase();
764                var contact             = "";
765                var state               = "";
766
767                var chatBox     = document.getElementById(jid_lower + "__chatState");
768                var chatStateOnOff = null;
769                var active      = msg.getElementsByTagName('active');
770               
771                contact = barejid.toLowerCase();
772                contact = contact.substring(0, contact.indexOf('@'));
773           
774                if( TrophyIM.rosterObj.roster[barejid] )
775                {
776                        if( TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'] )
777                        {
778                                contact = TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'];
779                        }
780                }
781
782                // Message with body are "content message", this means state active
783                if ( elems.length > 0 )
784                {
785                        state = "";
786                       
787                        // Set notify chat state capability on when sender notify it themself
788                        chatStateOnOff = document.getElementById(jid_lower + "__chatStateOnOff");
789                       
790                        if (active.length > 0 & chatStateOnOff != null )
791                        {
792                                chatStateOnOff.value = 'on';
793                        }
794
795                        // Get Message
796                        var _message = document.createElement("div");
797                        _message.innerHTML = Strophe.getText(elems[0]);
798                       
799                        var scripts = _message.getElementsByTagName('script');
800                       
801                        for (var i = 0; i < scripts.length; i++)
802                                _message.removeChild(scripts[i--]);
803                       
804                        _message.innerHTML = _message.innerHTML.replace(/^\s+|\s+$|^\n|\n$/g, "");
805                       
806                        // Get Smiles
807                        _message.innerHTML = loadscript.getSmiles( _message.innerHTML );
808
809                        if (type == 'chat' || type == 'normal')
810                        {
811                                if ( _message.hasChildNodes() )
812                                {
813                                        var message =
814                                        {
815                                contact : "[" + stamp + "] <font style='font-weight:bold; color:black;'>" + contact + "</font>",
816                                msg             : "</br>" + _message.innerHTML
817                        };
818                                       
819                                        TrophyIM.addMessage( TrophyIM.makeChat( from ), jid_lower, message );
820                                }
821                        }
822                        else if( type == 'groupchat')
823                        {
824                                if ( _message.hasChildNodes() )
825                                {
826                                        var message =
827                                        {
828                                contact : "[" + stamp + "] <font style='font-weight:bold; color:black;'>" + jidChatRoom + "</font>",
829                                msg             : "</br>" + _message.innerHTML
830                        };
831
832                                        TrophyIM.addMessage( TrophyIM.makeChatRoom( barejid ), jid_lower, message );
833                                }
834                        }
835                }
836                // Message without body are "content message", this mean state is not active
837                else
838                {
839                        if( chatBox != null )
840                                state = TrophyIM.getChatState(msg);                     
841                }
842               
843                // Clean chat status message some time later           
844                var clearChatState = function()
845                {
846                        chatBox.innerHTML='';
847                }
848               
849                if (chatBox != null)
850                {
851                        var clearChatStateTimer;
852                       
853                        chatBox.innerHTML = "<font style='font-weight:bold; color:grey; float:right;'>" + state + "</font>";
854                       
855                        var _composing =  msg.getElementsByTagName('composing');
856                       
857                        if ( _composing.length == 0 )
858                               
859                                clearChatStateTimer = setTimeout(clearChatState, 2000);
860                        else
861                                clearTimeout(clearChatStateTimer);                     
862                }
863
864                return true;
865        },
866
867        /** Function: getChatState
868         *
869         *  Parameters:
870         *    (string) msg - the message to get chat state
871         *    (string) jid - the jid of chat box to update the chat state to.
872         */
873        getChatState : function(msg)
874        {
875                var     state =  msg.getElementsByTagName('inactive');
876               
877                if ( state.length > 0 )
878                {
879                return i18n.INACTIVE;
880                }
881                else
882                {
883                state = msg.getElementsByTagName('gone');
884            if ( state.length > 0 )
885            {
886                return i18n.GONE;
887                        }
888            else
889            {
890                state = msg.getElementsByTagName('composing');
891                if ( state.length > 0 )
892                {
893                        return i18n.COMPOSING;
894                                }
895                else
896                {
897                        state =  msg.getElementsByTagName('paused');
898                        if ( state.length > 0 )
899                        {
900                                return i18n.PAUSED;
901                                        }
902                                }
903                        }
904                }
905               
906                return '';
907        },
908
909        /** Function: makeChat
910     *
911     *  Make sure chat window to given fulljid exists, switching chat context to
912     *  given resource.
913     */
914     
915    makeChat : function(fulljid)
916    {
917        var barejid             = Strophe.getBareJidFromJid(fulljid);
918        var titleWindow = "";
919
920        var paramsChatBox =
921        {
922                        'enabledPopUp'  : ( ( loadscript.getIsIE() ) ? "none" : "block" ),
923                        'idChatBox'     : barejid + "__chatBox",
924                        'jidTo'                 : barejid,
925                                'path_jabberit' : path_jabberit
926        };
927
928        titleWindow = barejid.toLowerCase();
929                titleWindow = titleWindow.substring(0, titleWindow.indexOf('@'));
930
931        if( TrophyIM.rosterObj.roster[barejid] )
932        {
933            if( TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'] )
934            {
935                titleWindow = TrophyIM.rosterObj.roster[barejid.toLowerCase()]['contact']['name'];
936            }
937        }
938
939        // Position Top
940        TrophyIM.posWindow.top  = TrophyIM.posWindow.top + 10;
941        if( TrophyIM.posWindow.top > 200 )
942                TrophyIM.posWindow.top  = 100;
943       
944        // Position Left
945        TrophyIM.posWindow.left = TrophyIM.posWindow.left + 5;
946        if( TrophyIM.posWindow.left > 455 )
947                TrophyIM.posWindow.left = 400;
948       
949        var _content = document.createElement( 'div' );
950        _content.innerHTML = loadscript.parse( "chat_box", "chatBox.xsl", paramsChatBox);
951        _content = _content.firstChild;
952       
953        var _messages           = _content.firstChild.firstChild;
954        var _textarea           = _content.getElementsByTagName( 'textarea' ).item( 0 );
955        var _send                       = _content.getElementsByTagName( 'input' ).item( 0 );
956                var _chatStateOnOff     = _content.getElementsByTagName( 'input' ).item( 1 );
957
958        var _send_message = function( )
959        {
960                if ( ! TrophyIM.sendMessage( barejid, _textarea.value ) )
961                        return false;
962
963                // Add Message in chatBox;
964                TrophyIM.addMessage( _messages, barejid, {
965                        contact : "<font style='font-weight:bold; color:red;'>" + i18n.ME + "</font>",
966                        msg : "<br/>" + _textarea.value
967                } );
968
969                _textarea.value = '';
970                _textarea.focus( );
971        };
972               
973                var composingTimer_ = 0;
974                var isComposing_ = 0;
975                var timeCounter;
976
977                var setComposing = function( )
978                {
979                        var checkComposing = function()
980                        {
981                if (!isComposing_) {
982                        // User stopped composing
983                        composingTimer_ = 0;
984                        clearInterval(timeCounter);
985                        TrophyIM.sendContentMessage(barejid, 'paused');
986                } else {
987                        TrophyIM.sendContentMessage(barejid, 'composing');
988                }
989                isComposing_ = 0; // Reset composing
990                }
991
992                if (!composingTimer_) {
993                /* User (re)starts composing */
994                composingTimer_ = 1;
995                timeCounter = setInterval(checkComposing,4000);
996                }
997                isComposing_ = 1;
998        };
999
1000        loadscript.configEvents( _send, 'onclick', _send_message );
1001                loadscript.configEvents( _textarea, 'onkeyup', function( e )
1002                {
1003                        if ( e.keyCode == 13 ){
1004                                _send_message( );
1005                                // User stopped composing
1006                composingTimer_ = 0;
1007                clearInterval(timeCounter);
1008                        }else{
1009                                if (_chatStateOnOff.value == 'on')
1010                                        setComposing();
1011                        }
1012                } );       
1013
1014        var winChatBox =
1015        {
1016                         id_window              : "window_chat_area_" + barejid,
1017                         barejid                : barejid,
1018                         width                  : 387,
1019                         height                 : 375,
1020                         top                    : TrophyIM.posWindow.top,
1021                         left                   : TrophyIM.posWindow.left,
1022                         draggable              : true,
1023                         visible                : "display",
1024                         resizable              : true,
1025                         zindex                 : loadscript.getZIndex(),
1026                         title                  : titleWindow,
1027                         closeAction    : "hidden",
1028                         content                : _content     
1029        }
1030       
1031                _win = _winBuild(winChatBox);
1032
1033        // Notification New Message
1034        loadscript.notification(barejid);
1035       
1036        // Photo User;
1037                loadscript.getPhotoUser(barejid);
1038               
1039                _textarea.focus( );
1040               
1041                return ( _messages = _win.content( ).firstChild );
1042    },
1043
1044        /** Function: makeChatRoom
1045    *
1046    *
1047    *
1048    */
1049   
1050    makeChatRoom : function()
1051    {
1052        var jidChatRoom = arguments[0];
1053        var titleWindow = "ChatRoom - " + arguments[1];
1054       
1055        var paramsChatRoom =
1056        {
1057                        'idChatRoom'    : jidChatRoom + "__roomChat",
1058                        'jidTo'                 : jidChatRoom,
1059                        'lang_Send'             : i18n.SEND,
1060                        'lang_Leave_ChatRoom' : i18n.LEAVE_CHATROOM,
1061                                'path_jabberit' : path_jabberit
1062        };
1063
1064        // Position Top
1065        TrophyIM.posWindow.top  = TrophyIM.posWindow.top + 10;
1066        if( TrophyIM.posWindow.top > 200 )
1067                TrophyIM.posWindow.top  = 100;
1068       
1069        // Position Left
1070        TrophyIM.posWindow.left = TrophyIM.posWindow.left + 5;
1071        if( TrophyIM.posWindow.left > 455 )
1072                TrophyIM.posWindow.left = 400;
1073
1074        var _content = document.createElement( 'div' );
1075        _content.innerHTML = loadscript.parse( "chat_room", "chatRoom.xsl", paramsChatRoom );
1076        _content = _content.firstChild;
1077       
1078        var _messages           = _content.firstChild.firstChild;
1079        var _textarea           = _content.getElementsByTagName( 'textarea' ).item( 0 );
1080        var _send                       = _content.getElementsByTagName( 'input' ).item( 0 );
1081        var _leaveChatRoom      = _content.getElementsByTagName( 'input' ).item( 1 );
1082       
1083        var _send_message = function( )
1084        {
1085                if ( ! TrophyIM.sendMessageChatRoom( jidChatRoom, _textarea.value ) )
1086                        return false;
1087               
1088                _textarea.value = '';
1089               
1090                _textarea.focus( );
1091        };
1092       
1093        loadscript.configEvents( _send, 'onclick', _send_message );
1094        loadscript.configEvents( _leaveChatRoom, 'onclick', function( )
1095        {
1096                TrophyIM.leaveChatRoom( jidChatRoom );
1097
1098                setTimeout( function()
1099                {
1100                        _winBuild('window_chat_room_' + jidChatRoom, 'remove');
1101                       
1102                }, 500 );
1103               
1104        });
1105       
1106                loadscript.configEvents( _textarea, 'onkeyup', function( e )
1107                {
1108                        if ( e.keyCode == 13 )
1109                        {
1110                                _send_message( );
1111                        }
1112                });       
1113       
1114        var winChatRoom =
1115        {
1116                         id_window              : "window_chat_room_" + arguments[0],
1117                         barejid                : jidChatRoom,
1118                         width                  : 500,
1119                         height                 : 450,
1120                         top                    : TrophyIM.posWindow.top,
1121                         left                   : TrophyIM.posWindow.left,
1122                         draggable              : true,
1123                         visible                : "display",
1124                         resizable              : true,
1125                         zindex                 : loadscript.getZIndex(),
1126                         title                  : titleWindow,
1127                         closeAction    : "hidden",
1128                         content                : _content     
1129        }
1130       
1131        _win = _winBuild(winChatRoom);
1132       
1133        return ( _messages = _win.content( ).firstChild );
1134       
1135    },
1136   
1137        /** Function addContacts
1138         *
1139         *  Parameters:
1140         *              (string) jidFrom         
1141         *      (string) jidTo
1142         *              (string) name
1143         *              (string) group   
1144         */
1145       
1146        addContact : function( jidTo, name, group )
1147        {
1148                // Add Contact
1149        var _id = TrophyIM.connection.getUniqueId('add');
1150                var newContact = $iq({type: 'set', id: _id });
1151                        newContact = newContact.c('query').attrs({xmlns : 'jabber:iq:roster'});
1152                        newContact = newContact.c('item').attrs({jid: jidTo, name:name });
1153                        newContact = newContact.c('group').t(group).tree();
1154
1155                TrophyIM.connection.send(newContact);
1156        },
1157
1158    /** Function: add
1159     *
1160     *  Parameters:
1161     *    (string) msg - the message to add
1162     *    (string) jid - the jid of chat box to add the message to.
1163     */
1164       
1165    addMessage : function( chatBox, jid, msg )
1166    {
1167        // Get Smiles
1168        msg.msg = loadscript.getSmiles( msg.msg );
1169 
1170        var messageDiv  = document.createElement("div");
1171                messageDiv.style.margin = "3px 0px 1em 3px";
1172        messageDiv.innerHTML    = msg.contact + " : " + msg.msg ;
1173               
1174        chatBox.appendChild(messageDiv);
1175        chatBox.scrollTop = chatBox.scrollHeight;
1176    },
1177       
1178    /** Function : renameContact
1179     *
1180     *
1181     */
1182   
1183    renameContact : function( jid )
1184    {
1185        // Name
1186        var name                = TrophyIM.rosterObj.roster[jid].contact.name;
1187
1188                if(( name = prompt(i18n.ASK_NEW_NAME_QUESTION + name + "!", name )))
1189                        if(( name = name.replace(/^\s+|\s+$|^\n|\n$/g,"")) == "" )
1190                                name = "";
1191
1192                if( name == null || name == "")
1193                        name = "";
1194               
1195        var jidTo = jid
1196        var name  = ( name ) ? name : TrophyIM.rosterObj.roster[jid].contact.name;
1197        var group = TrophyIM.rosterObj.roster[jid].contact.groups[0];
1198       
1199        TrophyIM.addContact( jidTo, name, group );
1200       
1201        document.getElementById('itenContact_' + jid ).innerHTML = name;
1202    },
1203   
1204    /** Function : renameGroup
1205     *
1206     *
1207     */
1208
1209    renameGroup : function( jid )
1210    {
1211        var group               = TrophyIM.rosterObj.roster[jid].contact.groups[0];
1212        var presence    = TrophyIM.rosterObj.roster[jid].presence;
1213       
1214                // Group
1215                if(( group = prompt( i18n.ASK_NEW_GROUP_QUESTION, group )))
1216                        if(( group = group.replace(/^\s+|\s+$|^\n|\n$/g,"")) == "" )
1217                                group = "";
1218
1219                if( group == null || group == "")
1220                        group = "";
1221
1222        var jidTo = TrophyIM.rosterObj.roster[jid].contact.jid;
1223        var name  = TrophyIM.rosterObj.roster[jid].contact.name;
1224                var group = ( group ) ? group : TrophyIM.rosterObj.roster[jid].contact.groups[0];
1225
1226                TrophyIM.rosterObj.removeContact( jid );
1227               
1228                TrophyIM.addContact( jidTo, name, group );
1229       
1230                document.getElementById("JabberIMRoster").innerHTML = "";
1231               
1232        TrophyIM.renderRoster();
1233       
1234        setTimeout(function()
1235        {
1236                for( var i in presence )
1237                {
1238                        if ( presence[ i ].constructor == Function )
1239                                continue;
1240                               
1241                        TrophyIM.rosterObj.setPresence( jid, presence[i].priority, presence[i].show, presence[i].status);
1242                }
1243        },500);
1244    },
1245
1246    // TESTE SALAS
1247   
1248    /** Function : joinRoom
1249     *
1250     *
1251     */
1252   
1253    joinChatRoom : function( roomName )
1254    {
1255        var presence = $pres({from: TrophyIM.connection.jid, to: roomName}).c("x",{xmlns: Strophe.NS.MUC});
1256       
1257                TrophyIM.connection.send( presence );
1258    },
1259   
1260    /** Function : Leave Chat Room
1261     *
1262     *
1263     */
1264   
1265    leaveChatRoom : function( roomName )
1266    {
1267        var room_nick   = roomName + "/USUARIO_DE_TESTE";
1268       
1269        var presenceid  = TrophyIM.connection.getUniqueId();
1270       
1271        var presence    = $pres( {type: "unavailable", id: presenceid, from: TrophyIM.connection.jid, to: room_nick} ).c("x",{xmlns: Strophe.NS.MUC});
1272       
1273        TrophyIM.connection.send( presence );       
1274    },
1275   
1276    /** Function : getlistRooms
1277     *
1278     *
1279     */
1280   
1281    getListRooms : function()
1282    {
1283        var _error_return = function(element)
1284        {
1285                alert( " ERROR : " + element );
1286        };
1287       
1288                var iq = $iq({to: "conference.im.pr.gov.br", type: "get"}).c("query",{xmlns: Strophe.NS.DISCO_ITEMS});                 
1289               
1290        TrophyIM.connection.sendIQ( iq, loadscript.listRooms, _error_return, 500 );             
1291    },
1292   
1293    /** Function: removeContact
1294     *
1295     *  Parameters:
1296     *          (string) jidTo
1297     */
1298   
1299    removeContact : function( jidTo )
1300    {
1301        var divItenContact       = null;
1302
1303        if( ( divItenContact = document.getElementById('itenContact_' + jidTo )))
1304        {       
1305                // Remove Contact
1306                var _id = TrophyIM.connection.getUniqueId();   
1307                var delContact  = $iq({type: 'set', id: _id})
1308                        delContact      = delContact.c('query').attrs({xmlns : 'jabber:iq:roster'});
1309                        delContact      = delContact.c('item').attrs({jid: jidTo, subscription:'remove'}).tree();
1310
1311                TrophyIM.connection.send( delContact );
1312               
1313                        loadscript.removeElement( document.getElementById('itenContactNotification_' + jidTo ) );
1314               
1315                var spanShow = document.getElementById('span_show_itenContact_' + jidTo )
1316                        spanShow.parentNode.removeChild(spanShow);
1317               
1318                loadscript.removeGroup( divItenContact.parentNode );
1319               
1320                divItenContact.parentNode.removeChild(divItenContact);
1321        }
1322    },
1323   
1324    /** Function: renderRoster
1325     *
1326     *  Renders roster, looking only for jids flagged by setPresence as having
1327     *  changed.
1328     */
1329   
1330        renderRoster : function()
1331        {
1332                var roster_div = document.getElementById('JabberIMRoster');
1333               
1334                if( roster_div )
1335                {
1336                        var users = new Array();
1337                       
1338                        var loading_gif = document.getElementById("JabberIMRosterLoadingGif");
1339                       
1340                        if( loading_gif.style.display == "block" )
1341                                loading_gif.style.display = "none";
1342                               
1343                        for( var user in TrophyIM.rosterObj.roster )
1344                        {
1345                                if ( TrophyIM.rosterObj.roster[ user ].constructor == Function )
1346                                        continue;
1347
1348                                users[users.length] = TrophyIM.rosterObj.roster[user].contact.jid;
1349                        }
1350
1351                        users.sort();
1352                       
1353                        var groups              = new Array();
1354                        var flagGeral   = false;
1355                       
1356                        for (var group in TrophyIM.rosterObj.groups)
1357                        {
1358                                if ( TrophyIM.rosterObj.groups[ group ].constructor == Function )
1359                                        continue;
1360                               
1361                                if( group )
1362                                        groups[groups.length] = group;
1363                               
1364                                if( group == "Geral" )
1365                                        flagGeral = true;
1366            }
1367           
1368                        if( !flagGeral && users.length > 0 )
1369                                groups[groups.length] = "Geral";
1370                               
1371                        groups.sort();
1372                       
1373                        for ( var i = 0; i < groups.length; i++ )
1374                        {
1375                                TrophyIM.renderGroups( groups[i] , roster_div );       
1376                        }
1377                       
1378                        TrophyIM.renderItensGroup( users, roster_div );
1379                }
1380                       
1381                TrophyIM._timeOut.renderRoster = setTimeout("TrophyIM.renderRoster()", 1000 );         
1382        },
1383       
1384    /** Function: renderGroups
1385     *
1386     *
1387     */
1388       
1389        renderGroups: function( nameGroup, element )
1390        {
1391                var _addGroup = function()
1392                {
1393                        var _nameGroup  = nameGroup;
1394                        var _element    = element;
1395
1396                        var paramsGroup =
1397                        {
1398                                'nameGroup'     : _nameGroup,
1399                                'path_jabberit' : path_jabberit
1400                        }
1401                       
1402                        _element.innerHTML += loadscript.parse("group","groups.xsl", paramsGroup);
1403                }
1404
1405                if( !element.hasChildNodes() )
1406                {
1407                        _addGroup();
1408                }
1409                else
1410                {
1411                        var _NodeChild  = element.firstChild;
1412                        var flagAdd             = false;
1413                       
1414                        while( _NodeChild )
1415                        {
1416                                if( _NodeChild.childNodes[0].nodeName.toLowerCase() === "span" )
1417                                {
1418                                        if( _NodeChild.childNodes[0].childNodes[0].nodeValue === nameGroup )
1419                                        {
1420                                                flagAdd = true;
1421                                        }
1422                                }
1423                               
1424                                _NodeChild = _NodeChild.nextSibling;
1425                        }
1426
1427                        if( !flagAdd )
1428                        {
1429                                _addGroup();
1430                        }
1431                }
1432        },
1433
1434    /** Function: renderItensGroup
1435     *
1436     *
1437     */
1438
1439        renderItensGroup : function( users, element )
1440        {
1441                var addItem = function()
1442                {
1443                        if( arguments.length > 0 )
1444                        {
1445                                // Get Arguments
1446                                var objContact  = arguments[0];
1447                                var group               = arguments[1];
1448                                var element             = arguments[2];
1449                                var showOffline = loadscript.getShowContactsOffline();
1450                               
1451                                // Presence e Status
1452                                var presence            = "unavailable";
1453                                var status                      = "";
1454                                var statusColor         = "black";
1455                                var statusDisplay       = "none";
1456                               
1457                                var _resource   = "";
1458                               
1459                                // Set Presence
1460                                var _presence = function(objContact)
1461                                {
1462                                        if (objContact.presence)
1463                                        {
1464                                                for (var resource in objContact.presence)
1465                                                {
1466                                                        if ( objContact.presence[resource].constructor == Function )
1467                                                                continue;
1468
1469                                                        if( objContact.presence[resource].show != 'invisible' )
1470                                                                presence = objContact.presence[resource].show;
1471
1472                                                        if( objContact.contact.subscription != "both")
1473                                                                presence = 'subscription';
1474                                                       
1475                                                        if( objContact.presence[resource].status )
1476                                                        {
1477                                                                status = " ( " + objContact.presence[resource].status + " ) ";
1478                                                                statusDisplay   = "block";
1479                                                        }
1480                                                }
1481                                        }
1482                                };
1483                               
1484                                // Set Subscription
1485                                var _subscription = function( objContact )
1486                                {
1487                                        if( objContact.contact.subscription != "both" )
1488                                        {
1489                                                switch( objContact.contact.subscription )
1490                                                {
1491                                                        case "none" :
1492                                                               
1493                                                                status          = " (( " + i18n.ASK_FOR_AUTH  + " )) ";
1494                                                                statusColor     = "red";
1495                                                                break;
1496       
1497                                                        case "to" :
1498                                                               
1499                                                                status          = " (( " + i18n.CONTACT_ASK_FOR_AUTH  + " )) ";
1500                                                                statusColor     = "orange";
1501                                                                break;
1502       
1503                                                        case "from" :
1504                                                               
1505                                                                status          = " (( " + i18n.AUTHORIZED + " )) ";
1506                                                                statusColor = "green";
1507                                                                break;
1508                                                               
1509                                                        case "subscribe" :
1510                                                               
1511                                                                status          = " (( " + i18n.AUTH_SENT  + " )) ";
1512                                                                statusColor     = "red";       
1513                                                                break;
1514
1515                                                        case "not-in-roster" :
1516                                                               
1517                                                                status          = " (( " + i18n.ASK_FOR_AUTH_QUESTION  + " )) ";
1518                                                                statusColor     = "orange";     
1519                                                                break;
1520                                                               
1521                                                        default :
1522                                                               
1523                                                                break;
1524                                                }
1525
1526                                                statusDisplay = "block";
1527                                        }
1528                                };
1529
1530                                if( objContact.contact.subscription != "remove")
1531                                {
1532                                        var itensJid    = document.getElementById( "itenContact_" + objContact.contact.jid );
1533                                       
1534                                        if( itensJid == null )
1535                                        {
1536                                                // Name
1537                                                var nameContact = "";                                   
1538                                               
1539                                                if ( objContact.contact.name )
1540                                                        nameContact = objContact.contact.name;
1541                                                else
1542                                                {
1543                                                        nameContact = objContact.contact.jid;
1544                                                        nameContact = nameContact.substring(0, nameContact.indexOf('@'));
1545                                                }
1546                                               
1547                                                // Get Presence
1548                                                _presence(objContact);
1549                                               
1550                                                var paramsContact =
1551                                                {
1552                                                        divDisplay              : "block",
1553                                                        id                              : 'itenContact_' + objContact.contact.jid ,
1554                                                        jid                             : objContact.contact.jid,
1555                                                        nameContact     : nameContact,
1556                                                        path_jabberit   : path_jabberit,
1557                                                        presence                : presence,
1558                                                        spanDisplay             : statusDisplay,
1559                                                        status                  : status,
1560                                                        statusColor             : "black",
1561                                                        subscription    : objContact.contact.subscription,
1562                                                        resource                : _resource
1563                                                }
1564                                               
1565                                                // Get Authorization
1566                                                _subscription( objContact );
1567                                               
1568                                                if( group != "")
1569                                                {
1570                                                        var _NodeChild          = element.firstChild;
1571                                                       
1572                                                        while( _NodeChild )
1573                                                        {
1574                                                                if( _NodeChild.childNodes[0].nodeName.toLowerCase() === "span" )
1575                                                                {
1576                                                                        if( _NodeChild.childNodes[0].childNodes[0].nodeValue === group )
1577                                                                        {
1578                                                                                _NodeChild.innerHTML += loadscript.parse("itens_group", "itensGroup.xsl", paramsContact);
1579                                                                        }
1580                                                                }
1581       
1582                                                                _NodeChild = _NodeChild.nextSibling;
1583                                                        }
1584                                                }       
1585                                        }
1586                                        else
1587                                        {
1588                                                // Get Presence
1589                                                _presence(objContact);
1590       
1591                                                var is_open = itensJid.parentNode.childNodes[0].style.backgroundImage; 
1592                                                        is_open = is_open.indexOf("arrow_down.gif");
1593       
1594                                                // Get Authorization
1595                                                _subscription( objContact );
1596                                               
1597                                                // Set subscription
1598                                                itensJid.setAttribute('subscription', objContact.contact.subscription );
1599                                               
1600                                                with ( document.getElementById('span_show_' + 'itenContact_' + objContact.contact.jid ) )
1601                                                {
1602                                                        if( presence == "unavailable" && !showOffline )
1603                                                        {
1604                                                                style.display = "none";
1605                                                        }
1606                                                        else
1607                                                        {
1608                                                                if( is_open > 0 )
1609                                                                {
1610                                                                        style.display   = statusDisplay;
1611                                                                        style.color             = statusColor;
1612                                                                        innerHTML               = status;
1613                                                                }
1614                                                        }
1615                                                }
1616                                               
1617                                                if( presence == "unavailable" && !showOffline )
1618                                                {
1619                                                        itensJid.style.display = "none";
1620                                                }
1621                                                else
1622                                                {
1623                                                        if( is_open > 0 )
1624                                                        {
1625                                                                itensJid.style.display = "block";
1626                                                        }
1627                                                }
1628                                               
1629                                                itensJid.style.background       = "url('"+path_jabberit+"templates/default/images/" + presence + ".gif') no-repeat center left";
1630                                        }
1631       
1632                                        // Contact OffLine
1633                                        if( !objContact.presence && !showOffline )
1634                                        {
1635                                                if( objContact.contact.subscription != "remove" )
1636                                                {
1637                                                        with ( document.getElementById('span_show_' + 'itenContact_' + objContact.contact.jid ))
1638                                                        {
1639                                                                style.display   = "none";
1640                                                        }
1641               
1642                                                        with ( document.getElementById('itenContact_' + objContact.contact.jid ) )
1643                                                        {
1644                                                                style.display   = "none";
1645                                                        }
1646                                                }
1647                                        }
1648                                }
1649                        }
1650                };
1651               
1652                var flag = false;
1653               
1654                for( var i = 0 ; i < users.length; i++ )
1655                {
1656                        if( TrophyIM.rosterObj.roster[users[i]].contact.jid != Base64.decode( loadscript.getUserCurrent().jid) )
1657                        {
1658                                var _subscription = TrophyIM.rosterObj.roster[users[i]].contact.subscription;
1659                               
1660                                if( _subscription === "to" )
1661                                {
1662                                        flag = true;
1663                                }
1664                               
1665                                if(  _subscription === "not-in-roster")
1666                                {
1667                                        flag = true;
1668                                }
1669                               
1670                                if( TrophyIM.rosterObj.roster[users[i]].contact.groups )
1671                                {
1672                                        var groups = TrophyIM.rosterObj.roster[users[i]].contact.groups;
1673                                       
1674                                        if( groups.length > 0 )
1675                                        {
1676                                                for( var j = 0; j < groups.length; j++ )
1677                                                {
1678                                                        addItem( TrophyIM.rosterObj.roster[users[i]], groups[j], element );
1679                                                }
1680                                        }
1681                                        else
1682                                        {
1683                                                addItem( TrophyIM.rosterObj.roster[users[i]], "Geral", element );
1684                                        }
1685                                }
1686                                else
1687                                {
1688                                        addItem( TrophyIM.rosterObj.roster[users[i]], "Geral", element );
1689                                }
1690                        }
1691                }
1692               
1693                if( flag )
1694                {
1695                        if ( TrophyIM.controll.notificationNewUsers == 0 )
1696                        {
1697                                loadscript.enabledNotificationNewUsers();
1698                                TrophyIM.controll.notificationNewUsers++;
1699                        }
1700                }
1701                else
1702                {
1703                        loadscript.disabledNotificationNewUsers();
1704                        TrophyIM.controll.notificationNewUsers = 0;
1705                }
1706        },
1707
1708    /** Function: rosterClick
1709     *
1710     *  Handles actions when a roster item is clicked
1711     */
1712   
1713        rosterClick : function(fulljid)
1714        {
1715        TrophyIM.makeChat(fulljid);
1716    },
1717
1718        /** Function SetAutorization
1719         *
1720         */
1721
1722        setAutorization : function( jidTo, jidFrom, _typeSubscription )
1723        {
1724        var _id = TrophyIM.connection.getUniqueId();
1725       
1726        TrophyIM.connection.send($pres( ).attrs({ from: jidFrom, to: jidTo, type: _typeSubscription, id: _id }).tree());
1727        },
1728   
1729        /** Function: setPresence
1730     *
1731     */
1732
1733        setPresence : function( _type )
1734        {
1735                if( _type != 'status')
1736                {
1737                        if( _type == "unavailable" &&  TrophyIM.statusConn.connected )
1738                        {
1739                                var loading_gif = document.getElementById("JabberIMRosterLoadingGif");
1740                               
1741                                if( TrophyIM._timeOut.renderRoster != null )
1742                                        clearTimeout(TrophyIM._timeOut.renderRoster);
1743                               
1744                                if( TrophyIM.statusConn.connected )
1745                                        TrophyIM.connection.send($pres({type : _type}).tree());
1746                               
1747                                for( var i = 0; i < TrophyIM.connection._requests.length; i++ )
1748                        {
1749                                if( TrophyIM.connection._requests[i] )
1750                                        TrophyIM.connection._removeRequest(TrophyIM.connection._requests[i]);
1751                        }
1752                               
1753                                TrophyIM.logout();
1754                               
1755                        loadscript.clrAllContacts();
1756                       
1757                        delete TrophyIM.rosterObj.roster;
1758                        delete TrophyIM.rosterObj.groups;
1759                       
1760                        setTimeout(function()
1761                        {
1762                                        if( loading_gif.style.display == "block" )
1763                                                loading_gif.style.display = "none";
1764                        }, 1000);
1765                        }
1766                        else
1767                        {
1768                                if( !TrophyIM.autoConnection.connect )
1769                                {
1770                                        TrophyIM.autoConnection.connect = true;
1771                                        TrophyIM.load();
1772                                }
1773                                else
1774                                {
1775                                        if( TrophyIM.statusConn.connected )
1776                                        {
1777                                                if( loadscript.getStatusMessage() != "" )
1778                                                {
1779                                                        var _presence = $pres( );
1780                                                        _presence.node.appendChild( Strophe.xmlElement( 'show' ) ).appendChild( Strophe.xmlTextNode( _type ) );
1781                                                        _presence.node.appendChild( Strophe.xmlElement( 'status' ) ).appendChild( Strophe.xmlTextNode( loadscript.getStatusMessage() ));
1782                                                       
1783                                                        TrophyIM.connection.send( _presence.tree() );
1784                                                }
1785                                                else
1786                                                {
1787                                                        TrophyIM.connection.send($pres( ).c('show').t(_type).tree());
1788                                                }
1789                                        }
1790                                }
1791                        }
1792                }
1793                else
1794                {
1795                        var _show       = "available";
1796                        var _status     = "";
1797                       
1798                        if( arguments.length < 2 )
1799                        {
1800                                if( loadscript.getStatusMessage() != "" )
1801                                        _status = prompt(i18n.TYPE_YOUR_MSG, loadscript.getStatusMessage());
1802                                else
1803                                        _status = prompt(i18n.TYPE_YOUR_MSG);
1804                               
1805                                var _divStatus = document.getElementById("JabberIMStatusMessage");
1806                               
1807                                if( ( _status = _status.replace(/^\s+|\s+$|^\n|\n$/g,"") ) != "")
1808                                        _divStatus.firstChild.innerHTML = "( " + _status + " )";
1809                        }
1810                        else
1811                        {
1812                                _status = arguments[1];
1813                        }
1814
1815                        for( var resource in TrophyIM.rosterObj.roster[Base64.decode(loadscript.getUserCurrent().jid)].presence )
1816                        {
1817                        if ( TrophyIM.rosterObj.roster[Base64.decode(loadscript.getUserCurrent().jid)].presence[ resource ].constructor == Function )
1818                                continue;
1819                       
1820                                if ( TROPHYIM_RESOURCE === ("/" + resource) )
1821                                        _show = TrophyIM.rosterObj.roster[Base64.decode(loadscript.getUserCurrent().jid)].presence[resource].show;
1822                        }
1823
1824                        if ( TrophyIM.statusConn.connected )
1825                        {
1826                                var _presence = $pres( );
1827                                _presence.node.appendChild( Strophe.xmlElement( 'show' ) ).appendChild( Strophe.xmlTextNode( _show ) );
1828                                _presence.node.appendChild( Strophe.xmlElement( 'status' ) ).appendChild( Strophe.xmlTextNode( _status ) );
1829                               
1830                                TrophyIM.connection.send( _presence.tree() );
1831                        }
1832                }
1833        },
1834       
1835        /** Function: sendMessage
1836     *
1837     *  Send message from chat input to user
1838     */
1839     
1840    sendMessage : function()
1841    {
1842                if (arguments.length > 0)
1843                {
1844                        var jidTo = arguments[0];
1845                        var message_input = arguments[1];
1846                       
1847                       
1848                        message_input = message_input.replace(/^\s+|\s+$|^\n|\n$/g, "");
1849                       
1850                        if (message_input != "") {
1851                       
1852                                // Send Message
1853                                var newMessage = $msg({
1854                                        to: jidTo,
1855                                        from: TrophyIM.connection.jid,
1856                                        type: 'chat'
1857                                });
1858                                newMessage = newMessage.c('body').t(message_input);
1859                                newMessage.up();
1860                                newMessage = newMessage.c('active').attrs({
1861                                        xmlns: 'http://jabber.org/protocol/chatstates'
1862                                });
1863                                // Send Message
1864                                TrophyIM.connection.send(newMessage.tree());
1865                               
1866                                return true;
1867                        }
1868                }
1869               
1870                return false;
1871    },
1872
1873        /** Function: sendMessage
1874    *
1875    *  Send message to ChatRoom
1876    */
1877   
1878    sendMessageChatRoom : function( room )
1879    {
1880        if( arguments.length > 0 )
1881        {
1882                var room_nick   = arguments[0];
1883                var message             = arguments[1];
1884                var msgid               = TrophyIM.connection.getUniqueId();
1885                var msg                 = $msg({to: room_nick, type: "groupchat", id: msgid}).c("body",{xmlns: Strophe.NS.CLIENT}).t(message);
1886               
1887                msg.up();//.c("x", {xmlns: "jabber:x:event"}).c("composing");
1888               
1889                TrophyIM.connection.send(msg);
1890               
1891                return true;
1892        }
1893    },
1894   
1895        /** Function: sendContentMessage
1896     *
1897     *  Send a content message from chat input to user
1898     */
1899        sendContentMessage : function()
1900    {
1901      if( arguments.length > 0 )
1902      {
1903         var jidTo = arguments[0];
1904         var state = arguments[1];
1905
1906         var newMessage = $msg({to: jidTo, from: TrophyIM.connection.jid, type: 'chat'});
1907         newMessage = newMessage.c(state).attrs({xmlns : 'http://jabber.org/protocol/chatstates'});
1908         // Send content message
1909         TrophyIM.connection.send(newMessage.tree());
1910      }
1911    }
1912};
1913
1914/** Class: TrophyIMRoster
1915 *
1916 *
1917 *  This object stores the roster and presence info for the TrophyIMClient
1918 *
1919 *  roster[jid_lower]['contact']
1920 *  roster[jid_lower]['presence'][resource]
1921 */
1922function TrophyIMRoster()
1923{
1924    /** Constants: internal arrays
1925     *    (Object) roster - the actual roster/presence information
1926     *    (Object) groups - list of current groups in the roster
1927     *    (Array) changes - array of jids with presence changes
1928     */
1929    if (TrophyIM.JSONStore.store_working)
1930        {
1931        var data = TrophyIM.JSONStore.getData(['roster', 'groups']);
1932        this.roster = (data['roster'] != null) ? data['roster'] : {};
1933        this.groups = (data['groups'] != null) ? data['groups'] : {};
1934    }
1935        else
1936        {
1937        this.roster = {};
1938        this.groups = {};
1939    }
1940    this.changes = new Array();
1941   
1942        if (TrophyIM.constants.stale_roster)
1943        {
1944        for (var jid in this.roster)
1945                {
1946                        this.changes[this.changes.length] = jid;
1947        }
1948    }
1949
1950        /** Function: addChange
1951         *
1952         *  Adds given jid to this.changes, keeping this.changes sorted and
1953         *  preventing duplicates.
1954         *
1955         *  Parameters
1956         *    (String) jid : jid to add to this.changes
1957         */
1958         
1959        this.addChange = function(jid)
1960        {
1961                for (var c = 0; c < this.changes.length; c++)
1962                {
1963                        if (this.changes[c] == jid)
1964                        {
1965                                return;
1966                        }
1967                }
1968               
1969                this.changes[this.changes.length] = jid;
1970               
1971                this.changes.sort();
1972        }
1973       
1974    /** Function: addContact
1975     *
1976     *  Adds given contact to roster
1977     *
1978     *  Parameters:
1979     *    (String) jid - bare jid
1980     *    (String) subscription - subscription attribute for contact
1981     *    (String) name - name attribute for contact
1982     *    (Array)  groups - array of groups contact is member of
1983     */
1984   
1985        this.addContact = function(jid, subscription, name, groups )
1986        {
1987                if( subscription === "remove" )
1988        {
1989                        this.removeContact(jid);
1990        }
1991        else
1992        {
1993                        var contact             = { jid:jid, subscription:subscription, name:name, groups:groups }
1994                var jid_lower   = jid.toLowerCase();
1995       
1996                        if ( this.roster[jid_lower] )
1997                        {
1998                    this.roster[jid_lower]['contact'] = contact;
1999                }
2000                        else
2001                        {
2002                    this.roster[jid_lower] = {contact:contact};
2003                }
2004
2005                        groups = groups ? groups : [''];
2006               
2007                        for ( var g = 0; g < groups.length; g++ )
2008                        {
2009                                if ( !this.groups[groups[g]] )
2010                                {
2011                        this.groups[groups[g]] = {};
2012                    }
2013                   
2014                                this.groups[groups[g]][jid_lower] = jid_lower;
2015                }
2016        }
2017    }
2018   
2019    /** Function: getContact
2020     *
2021     *  Returns contact entry for given jid
2022     *
2023     *  Parameter: (String) jid - jid to return
2024     */
2025     
2026    this.getContact = function(jid)
2027        {
2028        if (this.roster[jid.toLowerCase()])
2029                {
2030            return this.roster[jid.toLowerCase()]['contact'];
2031        }
2032    }
2033
2034   /** Function: getPresence
2035        *
2036        *  Returns best presence for given jid as Array(resource, priority, show,
2037        *  status)
2038        *
2039        *  Parameter: (String) fulljid - jid to return best presence for
2040        */
2041         
2042        this.getPresence = function(fulljid)
2043        {
2044                var jid = Strophe.getBareJidFromJid(fulljid);
2045                var current = null;
2046                   
2047                if (this.roster[jid.toLowerCase()] && this.roster[jid.toLowerCase()]['presence'])
2048                {
2049                        for (var resource in this.roster[jid.toLowerCase()]['presence'])
2050                        {
2051                        if ( this.roster[jid.toLowerCase()]['presence'][ resource ].constructor == Function )
2052                                continue;
2053                       
2054                                var presence = this.roster[jid.toLowerCase()]['presence'][resource];
2055                                if (current == null)
2056                                {
2057                                        current = presence
2058                                }
2059                                else
2060                                {
2061                                        if(presence['priority'] > current['priority'] && ((presence['show'] == "chat"
2062                                        || presence['show'] == "available") || (current['show'] != "chat" ||
2063                                        current['show'] != "available")))
2064                                        {
2065                                                current = presence
2066                                        }
2067                                }
2068                        }
2069                }
2070                return current;
2071        }
2072
2073        /** Function: groupHasChanges
2074         *
2075         *  Returns true if current group has members in this.changes
2076         *
2077         *  Parameters:
2078         *    (String) group - name of group to check
2079         */
2080         
2081        this.groupHasChanges = function(group)
2082        {
2083                for (var c = 0; c < this.changes.length; c++)
2084                {
2085                        if (this.groups[group][this.changes[c]])
2086                        {
2087                                return true;
2088                        }
2089                }
2090                return false;
2091        }
2092       
2093        /** Function removeContact
2094         *
2095         * Parameters
2096         *       (String) jid           
2097         */
2098         
2099         this.removeContact = function(jid)
2100         {
2101                if( this.roster[ jid ] )
2102                {
2103                        var groups = this.roster[ jid ].contact.groups;
2104                       
2105                        if( groups )
2106                        {
2107                                for ( var i = 0; i < groups.length; i++ )
2108                                {
2109                                        delete this.groups[ groups[ i ] ][ jid ];
2110                                }
2111       
2112                                for ( var i = 0; i < groups.length; i++ )
2113                                {
2114                                        var contacts = 0;
2115                                        for ( var contact in this.groups[ groups[ i ] ] )
2116                                        {
2117                                        if ( this.groups[ groups[ i ] ][ contact ].constructor == Function )
2118                                                continue;
2119                                       
2120                                                contacts++;
2121                                        }
2122               
2123                                        if ( ! contacts )
2124                                                delete this.groups[ groups[ i ] ];
2125                                }
2126                        }
2127       
2128                        // Delete Object roster
2129                        if( this.roster[jid] )
2130                                delete this.roster[jid];
2131                }
2132         }
2133         
2134    /** Function: setPresence
2135     *
2136     *  Sets presence
2137     *
2138     *  Parameters:
2139     *    (String) fulljid: full jid with presence
2140     *    (Integer) priority: priority attribute from presence
2141     *    (String) show: show attribute from presence
2142     *    (String) status: status attribute from presence
2143     */
2144   
2145        this.setPresence = function(fulljid, priority, show, status)
2146        {
2147                var barejid             = Strophe.getBareJidFromJid(fulljid);
2148        var resource    = Strophe.getResourceFromJid(fulljid);
2149        var jid_lower   = barejid.toLowerCase();
2150       
2151        if( show != 'unavailable' || show != 'error' )
2152                {
2153            if (!this.roster[jid_lower])
2154                        {
2155                this.addContact( barejid, 'not-in-roster' );
2156            }
2157           
2158            var presence =
2159                        {
2160                resource        : resource,
2161                priority        : priority,
2162                show            : show,
2163                status          : status
2164            }
2165           
2166                        if (!this.roster[jid_lower]['presence'])
2167                        {
2168                this.roster[jid_lower]['presence'] = {};
2169            }
2170           
2171            this.roster[jid_lower]['presence'][resource] = presence;   
2172                }
2173    }
2174
2175        /** Fuction: save
2176         *
2177         *  Saves roster data to JSON store
2178         */
2179       
2180        this.save = function()
2181        {
2182                if (TrophyIM.JSONStore.store_working)
2183                {
2184                        TrophyIM.JSONStore.setData({roster:this.roster,
2185                        groups:this.groups, active_chat:TrophyIM.activeChats['current'],
2186                        chat_history:TrophyIM.chatHistory});
2187                }
2188        }
2189
2190}
2191/** Class: TrophyIMJSONStore
2192 *
2193 *
2194 *  This object is the mechanism by which TrophyIM stores and retrieves its
2195 *  variables from the url provided by TROPHYIM_JSON_STORE
2196 *
2197 */
2198function TrophyIMJSONStore() {
2199    this.store_working = false;
2200    /** Function _newXHR
2201     *
2202     *  Set up new cross-browser xmlhttprequest object
2203     *
2204     *  Parameters:
2205     *    (function) handler = what to set onreadystatechange to
2206     */
2207     this._newXHR = function (handler) {
2208        var xhr = null;
2209        if (window.XMLHttpRequest) {
2210            xhr = new XMLHttpRequest();
2211            if (xhr.overrideMimeType) {
2212            xhr.overrideMimeType("text/xml");
2213            }
2214        } else if (window.ActiveXObject) {
2215            xhr = new ActiveXObject("Microsoft.XMLHTTP");
2216        }
2217        return xhr;
2218    }
2219    /** Function getData
2220     *  Gets data from JSONStore
2221     *
2222     *  Parameters:
2223     *    (Array) vars = Variables to get from JSON store
2224     *
2225     *  Returns:
2226     *    Object with variables indexed by names given in parameter 'vars'
2227     */
2228    this.getData = function(vars) {
2229        if (typeof(TROPHYIM_JSON_STORE) != undefined) {
2230            Strophe.debug("Retrieving JSONStore data");
2231            var xhr = this._newXHR();
2232            var getdata = "get=" + vars.join(",");
2233            try {
2234                xhr.open("POST", TROPHYIM_JSON_STORE, false);
2235            } catch (e) {
2236                Strophe.error("JSONStore open failed.");
2237                return false;
2238            }
2239            xhr.setRequestHeader('Content-type',
2240            'application/x-www-form-urlencoded');
2241            xhr.setRequestHeader('Content-length', getdata.length);
2242            xhr.send(getdata);
2243            if (xhr.readyState == 4 && xhr.status == 200) {
2244                try {
2245                    var dataObj = JSON.parse(xhr.responseText);
2246                    return this.emptyFix(dataObj);
2247                } catch(e) {
2248                    Strophe.error("Could not parse JSONStore response" +
2249                    xhr.responseText);
2250                    return false;
2251                }
2252            } else {
2253                Strophe.error("JSONStore open failed. Status: " + xhr.status);
2254                return false;
2255            }
2256        }
2257    }
2258    /** Function emptyFix
2259     *    Fix for bugs in external JSON implementations such as
2260     *    http://bugs.php.net/bug.php?id=41504.
2261     *    A.K.A. Don't use PHP, people.
2262     */
2263    this.emptyFix = function(obj) {
2264        if (typeof(obj) == "object") {
2265            for (var i in obj) {
2266                        if ( obj[i].constructor == Function )
2267                                continue;
2268                       
2269                if (i == '_empty_') {
2270                    obj[""] = this.emptyFix(obj['_empty_']);
2271                    delete obj['_empty_'];
2272                } else {
2273                    obj[i] = this.emptyFix(obj[i]);
2274                }
2275            }
2276        }
2277        return obj
2278    }
2279    /** Function delData
2280     *    Deletes data from JSONStore
2281     *
2282     *  Parameters:
2283     *    (Array) vars  = Variables to delete from JSON store
2284     *
2285     *  Returns:
2286     *    Status of delete attempt.
2287     */
2288    this.delData = function(vars) {
2289        if (typeof(TROPHYIM_JSON_STORE) != undefined) {
2290            Strophe.debug("Retrieving JSONStore data");
2291            var xhr = this._newXHR();
2292            var deldata = "del=" + vars.join(",");
2293            try {
2294                xhr.open("POST", TROPHYIM_JSON_STORE, false);
2295            } catch (e) {
2296                Strophe.error("JSONStore open failed.");
2297                return false;
2298            }
2299            xhr.setRequestHeader('Content-type',
2300            'application/x-www-form-urlencoded');
2301            xhr.setRequestHeader('Content-length', deldata.length);
2302            xhr.send(deldata);
2303            if (xhr.readyState == 4 && xhr.status == 200) {
2304                try {
2305                    var dataObj = JSON.parse(xhr.responseText);
2306                    return dataObj;
2307                } catch(e) {
2308                    Strophe.error("Could not parse JSONStore response");
2309                    return false;
2310                }
2311            } else {
2312                Strophe.error("JSONStore open failed. Status: " + xhr.status);
2313                return false;
2314            }
2315        }
2316    }
2317    /** Function setData
2318     *    Stores data in JSONStore, overwriting values if they exist
2319     *
2320     *  Parameters:
2321     *    (Object) vars : Object containing named vars to store ({name: value,
2322     *    othername: othervalue})
2323     *
2324     *  Returns:
2325     *    Status of storage attempt
2326     */
2327    this.setData = function(vars)
2328    {
2329        if ( typeof(TROPHYIM_JSON_STORE) != undefined )
2330        {
2331            var senddata = "set=" + JSON.stringify(vars);
2332            var xhr = this._newXHR();
2333            try
2334            {
2335                xhr.open("POST", TROPHYIM_JSON_STORE, false);
2336            }
2337            catch (e)
2338            {
2339                Strophe.error("JSONStore open failed.");
2340                return false;
2341            }
2342            xhr.setRequestHeader('Content-type',
2343            'application/x-www-form-urlencoded');
2344            xhr.setRequestHeader('Content-length', senddata.length);
2345            xhr.send(senddata);
2346            if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText ==
2347            "OK") {
2348                return true;
2349            } else {
2350                Strophe.error("JSONStore open failed. Status: " + xhr.status);
2351                return false;
2352            }
2353        }
2354    }
2355   
2356    var testData = true;
2357   
2358    if (this.setData({testData:testData})) {
2359        var testResult = this.getData(['testData']);
2360        if (testResult && testResult['testData'] == true) {
2361            this.store_working = true;
2362        }
2363    }
2364}
2365/** Constants: Node types
2366 *
2367 * Implementations of constants that IE doesn't have, but we need.
2368 */
2369if (document.ELEMENT_NODE == null) {
2370    document.ELEMENT_NODE = 1;
2371    document.ATTRIBUTE_NODE = 2;
2372    document.TEXT_NODE = 3;
2373    document.CDATA_SECTION_NODE = 4;
2374    document.ENTITY_REFERENCE_NODE = 5;
2375    document.ENTITY_NODE = 6;
2376    document.PROCESSING_INSTRUCTION_NODE = 7;
2377    document.COMMENT_NODE = 8;
2378    document.DOCUMENT_NODE = 9;
2379    document.DOCUMENT_TYPE_NODE = 10;
2380    document.DOCUMENT_FRAGMENT_NODE = 11;
2381    document.NOTATION_NODE = 12;
2382}
2383
2384/** Function: importNode
2385 *
2386 *  document.importNode implementation for IE, which doesn't have importNode
2387 *
2388 *  Parameters:
2389 *    (Object) node - dom object
2390 *    (Boolean) allChildren - import node's children too
2391 */
2392if (!document.importNode) {
2393    document.importNode = function(node, allChildren) {
2394        switch (node.nodeType) {
2395            case document.ELEMENT_NODE:
2396                var newNode = document.createElement(node.nodeName);
2397                if (node.attributes && node.attributes.length > 0) {
2398                    for(var i = 0; i < node.attributes.length; i++) {
2399                        newNode.setAttribute(node.attributes[i].nodeName,
2400                        node.getAttribute(node.attributes[i].nodeName));
2401                    }
2402                }
2403                if (allChildren && node.childNodes &&
2404                node.childNodes.length > 0) {
2405                    for (var i = 0; i < node.childNodes.length; i++) {
2406                        newNode.appendChild(document.importNode(
2407                        node.childNodes[i], allChildren));
2408                    }
2409                }
2410                return newNode;
2411                break;
2412            case document.TEXT_NODE:
2413            case document.CDATA_SECTION_NODE:
2414            case document.COMMENT_NODE:
2415                return document.createTextNode(node.nodeValue);
2416                break;
2417        }
2418    };
2419}
2420
2421/**
2422 *
2423 * Bootstrap self into window.onload and window.onunload
2424 */
2425
2426var oldonunload = window.onunload;
2427
2428window.onunload = function()
2429{
2430        if( oldonunload )
2431        {
2432        oldonunload();
2433    }
2434       
2435        TrophyIM.setPresence('unavailable');
2436}
Note: See TracBrowser for help on using the repository browser.