Browse code

initial import.

devnewton authored on 23/07/2012 06:53:28
Showing 156 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,8 @@
1
+* Stefan Strigler <steve@zeank.in-berlin.de>
2
+  Main Developer
3
+
4
+* Florian Jensen <flosoft.biz@gmail.com>
5
+  Graphical Design
6
+
7
+* devnewton ( devnewton _at_ bci.im )
8
+  Tribune features developper.
0 9
new file mode 100644
... ...
@@ -0,0 +1,340 @@
1
+		    GNU GENERAL PUBLIC LICENSE
2
+		       Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+			    Preamble
10
+
11
+  The licenses for most software are designed to take away your
12
+freedom to share and change it.  By contrast, the GNU General Public
13
+License is intended to guarantee your freedom to share and change free
14
+software--to make sure the software is free for all its users.  This
15
+General Public License applies to most of the Free Software
16
+Foundation's software and to any other program whose authors commit to
17
+using it.  (Some other Free Software Foundation software is covered by
18
+the GNU Library General Public License instead.)  You can apply it to
19
+your programs, too.
20
+
21
+  When we speak of free software, we are referring to freedom, not
22
+price.  Our General Public Licenses are designed to make sure that you
23
+have the freedom to distribute copies of free software (and charge for
24
+this service if you wish), that you receive source code or can get it
25
+if you want it, that you can change the software or use pieces of it
26
+in new free programs; and that you know you can do these things.
27
+
28
+  To protect your rights, we need to make restrictions that forbid
29
+anyone to deny you these rights or to ask you to surrender the rights.
30
+These restrictions translate to certain responsibilities for you if you
31
+distribute copies of the software, or if you modify it.
32
+
33
+  For example, if you distribute copies of such a program, whether
34
+gratis or for a fee, you must give the recipients all the rights that
35
+you have.  You must make sure that they, too, receive or can get the
36
+source code.  And you must show them these terms so they know their
37
+rights.
38
+
39
+  We protect your rights with two steps: (1) copyright the software, and
40
+(2) offer you this license which gives you legal permission to copy,
41
+distribute and/or modify the software.
42
+
43
+  Also, for each author's protection and ours, we want to make certain
44
+that everyone understands that there is no warranty for this free
45
+software.  If the software is modified by someone else and passed on, we
46
+want its recipients to know that what they have is not the original, so
47
+that any problems introduced by others will not reflect on the original
48
+authors' reputations.
49
+
50
+  Finally, any free program is threatened constantly by software
51
+patents.  We wish to avoid the danger that redistributors of a free
52
+program will individually obtain patent licenses, in effect making the
53
+program proprietary.  To prevent this, we have made it clear that any
54
+patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+  The precise terms and conditions for copying, distribution and
57
+modification follow.
58
+
59
+		    GNU GENERAL PUBLIC LICENSE
60
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+  0. This License applies to any program or other work which contains
63
+a notice placed by the copyright holder saying it may be distributed
64
+under the terms of this General Public License.  The "Program", below,
65
+refers to any such program or work, and a "work based on the Program"
66
+means either the Program or any derivative work under copyright law:
67
+that is to say, a work containing the Program or a portion of it,
68
+either verbatim or with modifications and/or translated into another
69
+language.  (Hereinafter, translation is included without limitation in
70
+the term "modification".)  Each licensee is addressed as "you".
71
+
72
+Activities other than copying, distribution and modification are not
73
+covered by this License; they are outside its scope.  The act of
74
+running the Program is not restricted, and the output from the Program
75
+is covered only if its contents constitute a work based on the
76
+Program (independent of having been made by running the Program).
77
+Whether that is true depends on what the Program does.
78
+
79
+  1. You may copy and distribute verbatim copies of the Program's
80
+source code as you receive it, in any medium, provided that you
81
+conspicuously and appropriately publish on each copy an appropriate
82
+copyright notice and disclaimer of warranty; keep intact all the
83
+notices that refer to this License and to the absence of any warranty;
84
+and give any other recipients of the Program a copy of this License
85
+along with the Program.
86
+
87
+You may charge a fee for the physical act of transferring a copy, and
88
+you may at your option offer warranty protection in exchange for a fee.
89
+
90
+  2. You may modify your copy or copies of the Program or any portion
91
+of it, thus forming a work based on the Program, and copy and
92
+distribute such modifications or work under the terms of Section 1
93
+above, provided that you also meet all of these conditions:
94
+
95
+    a) You must cause the modified files to carry prominent notices
96
+    stating that you changed the files and the date of any change.
97
+
98
+    b) You must cause any work that you distribute or publish, that in
99
+    whole or in part contains or is derived from the Program or any
100
+    part thereof, to be licensed as a whole at no charge to all third
101
+    parties under the terms of this License.
102
+
103
+    c) If the modified program normally reads commands interactively
104
+    when run, you must cause it, when started running for such
105
+    interactive use in the most ordinary way, to print or display an
106
+    announcement including an appropriate copyright notice and a
107
+    notice that there is no warranty (or else, saying that you provide
108
+    a warranty) and that users may redistribute the program under
109
+    these conditions, and telling the user how to view a copy of this
110
+    License.  (Exception: if the Program itself is interactive but
111
+    does not normally print such an announcement, your work based on
112
+    the Program is not required to print an announcement.)
113
+
114
+These requirements apply to the modified work as a whole.  If
115
+identifiable sections of that work are not derived from the Program,
116
+and can be reasonably considered independent and separate works in
117
+themselves, then this License, and its terms, do not apply to those
118
+sections when you distribute them as separate works.  But when you
119
+distribute the same sections as part of a whole which is a work based
120
+on the Program, the distribution of the whole must be on the terms of
121
+this License, whose permissions for other licensees extend to the
122
+entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+Thus, it is not the intent of this section to claim rights or contest
125
+your rights to work written entirely by you; rather, the intent is to
126
+exercise the right to control the distribution of derivative or
127
+collective works based on the Program.
128
+
129
+In addition, mere aggregation of another work not based on the Program
130
+with the Program (or with a work based on the Program) on a volume of
131
+a storage or distribution medium does not bring the other work under
132
+the scope of this License.
133
+
134
+  3. You may copy and distribute the Program (or a work based on it,
135
+under Section 2) in object code or executable form under the terms of
136
+Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+    a) Accompany it with the complete corresponding machine-readable
139
+    source code, which must be distributed under the terms of Sections
140
+    1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+    b) Accompany it with a written offer, valid for at least three
143
+    years, to give any third party, for a charge no more than your
144
+    cost of physically performing source distribution, a complete
145
+    machine-readable copy of the corresponding source code, to be
146
+    distributed under the terms of Sections 1 and 2 above on a medium
147
+    customarily used for software interchange; or,
148
+
149
+    c) Accompany it with the information you received as to the offer
150
+    to distribute corresponding source code.  (This alternative is
151
+    allowed only for noncommercial distribution and only if you
152
+    received the program in object code or executable form with such
153
+    an offer, in accord with Subsection b above.)
154
+
155
+The source code for a work means the preferred form of the work for
156
+making modifications to it.  For an executable work, complete source
157
+code means all the source code for all modules it contains, plus any
158
+associated interface definition files, plus the scripts used to
159
+control compilation and installation of the executable.  However, as a
160
+special exception, the source code distributed need not include
161
+anything that is normally distributed (in either source or binary
162
+form) with the major components (compiler, kernel, and so on) of the
163
+operating system on which the executable runs, unless that component
164
+itself accompanies the executable.
165
+
166
+If distribution of executable or object code is made by offering
167
+access to copy from a designated place, then offering equivalent
168
+access to copy the source code from the same place counts as
169
+distribution of the source code, even though third parties are not
170
+compelled to copy the source along with the object code.
171
+
172
+  4. You may not copy, modify, sublicense, or distribute the Program
173
+except as expressly provided under this License.  Any attempt
174
+otherwise to copy, modify, sublicense or distribute the Program is
175
+void, and will automatically terminate your rights under this License.
176
+However, parties who have received copies, or rights, from you under
177
+this License will not have their licenses terminated so long as such
178
+parties remain in full compliance.
179
+
180
+  5. You are not required to accept this License, since you have not
181
+signed it.  However, nothing else grants you permission to modify or
182
+distribute the Program or its derivative works.  These actions are
183
+prohibited by law if you do not accept this License.  Therefore, by
184
+modifying or distributing the Program (or any work based on the
185
+Program), you indicate your acceptance of this License to do so, and
186
+all its terms and conditions for copying, distributing or modifying
187
+the Program or works based on it.
188
+
189
+  6. Each time you redistribute the Program (or any work based on the
190
+Program), the recipient automatically receives a license from the
191
+original licensor to copy, distribute or modify the Program subject to
192
+these terms and conditions.  You may not impose any further
193
+restrictions on the recipients' exercise of the rights granted herein.
194
+You are not responsible for enforcing compliance by third parties to
195
+this License.
196
+
197
+  7. If, as a consequence of a court judgment or allegation of patent
198
+infringement or for any other reason (not limited to patent issues),
199
+conditions are imposed on you (whether by court order, agreement or
200
+otherwise) that contradict the conditions of this License, they do not
201
+excuse you from the conditions of this License.  If you cannot
202
+distribute so as to satisfy simultaneously your obligations under this
203
+License and any other pertinent obligations, then as a consequence you
204
+may not distribute the Program at all.  For example, if a patent
205
+license would not permit royalty-free redistribution of the Program by
206
+all those who receive copies directly or indirectly through you, then
207
+the only way you could satisfy both it and this License would be to
208
+refrain entirely from distribution of the Program.
209
+
210
+If any portion of this section is held invalid or unenforceable under
211
+any particular circumstance, the balance of the section is intended to
212
+apply and the section as a whole is intended to apply in other
213
+circumstances.
214
+
215
+It is not the purpose of this section to induce you to infringe any
216
+patents or other property right claims or to contest validity of any
217
+such claims; this section has the sole purpose of protecting the
218
+integrity of the free software distribution system, which is
219
+implemented by public license practices.  Many people have made
220
+generous contributions to the wide range of software distributed
221
+through that system in reliance on consistent application of that
222
+system; it is up to the author/donor to decide if he or she is willing
223
+to distribute software through any other system and a licensee cannot
224
+impose that choice.
225
+
226
+This section is intended to make thoroughly clear what is believed to
227
+be a consequence of the rest of this License.
228
+
229
+  8. If the distribution and/or use of the Program is restricted in
230
+certain countries either by patents or by copyrighted interfaces, the
231
+original copyright holder who places the Program under this License
232
+may add an explicit geographical distribution limitation excluding
233
+those countries, so that distribution is permitted only in or among
234
+countries not thus excluded.  In such case, this License incorporates
235
+the limitation as if written in the body of this License.
236
+
237
+  9. The Free Software Foundation may publish revised and/or new versions
238
+of the General Public License from time to time.  Such new versions will
239
+be similar in spirit to the present version, but may differ in detail to
240
+address new problems or concerns.
241
+
242
+Each version is given a distinguishing version number.  If the Program
243
+specifies a version number of this License which applies to it and "any
244
+later version", you have the option of following the terms and conditions
245
+either of that version or of any later version published by the Free
246
+Software Foundation.  If the Program does not specify a version number of
247
+this License, you may choose any version ever published by the Free Software
248
+Foundation.
249
+
250
+  10. If you wish to incorporate parts of the Program into other free
251
+programs whose distribution conditions are different, write to the author
252
+to ask for permission.  For software which is copyrighted by the Free
253
+Software Foundation, write to the Free Software Foundation; we sometimes
254
+make exceptions for this.  Our decision will be guided by the two goals
255
+of preserving the free status of all derivatives of our free software and
256
+of promoting the sharing and reuse of software generally.
257
+
258
+			    NO WARRANTY
259
+
260
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
262
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
266
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
267
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+REPAIR OR CORRECTION.
269
+
270
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+POSSIBILITY OF SUCH DAMAGES.
279
+
280
+		     END OF TERMS AND CONDITIONS
281
+
282
+	    How to Apply These Terms to Your New Programs
283
+
284
+  If you develop a new program, and you want it to be of the greatest
285
+possible use to the public, the best way to achieve this is to make it
286
+free software which everyone can redistribute and change under these terms.
287
+
288
+  To do so, attach the following notices to the program.  It is safest
289
+to attach them to the start of each source file to most effectively
290
+convey the exclusion of warranty; and each file should have at least
291
+the "copyright" line and a pointer to where the full notice is found.
292
+
293
+    <one line to give the program's name and a brief idea of what it does.>
294
+    Copyright (C) 19yy  <name of author>
295
+
296
+    This program is free software; you can redistribute it and/or modify
297
+    it under the terms of the GNU General Public License as published by
298
+    the Free Software Foundation; either version 2 of the License, or
299
+    (at your option) any later version.
300
+
301
+    This program is distributed in the hope that it will be useful,
302
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
304
+    GNU General Public License for more details.
305
+
306
+    You should have received a copy of the GNU General Public License
307
+    along with this program; if not, write to the Free Software
308
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
309
+
310
+
311
+Also add information on how to contact you by electronic and paper mail.
312
+
313
+If the program is interactive, make it output a short notice like this
314
+when it starts in an interactive mode:
315
+
316
+    Gnomovision version 69, Copyright (C) 19yy name of author
317
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
318
+    This is free software, and you are welcome to redistribute it
319
+    under certain conditions; type `show c' for details.
320
+
321
+The hypothetical commands `show w' and `show c' should show the appropriate
322
+parts of the General Public License.  Of course, the commands you use may
323
+be called something other than `show w' and `show c'; they could even be
324
+mouse-clicks or menu items--whatever suits your program.
325
+
326
+You should also get your employer (if you work as a programmer) or your
327
+school, if any, to sign a "copyright disclaimer" for the program, if
328
+necessary.  Here is a sample; alter the names:
329
+
330
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
331
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
332
+
333
+  <signature of Ty Coon>, 1 April 1989
334
+  Ty Coon, President of Vice
335
+
336
+This General Public License does not permit incorporating your program into
337
+proprietary programs.  If your program is a subroutine library, you may
338
+consider it more useful to permit linking proprietary applications with the
339
+library.  If this is what you want to do, use the GNU Library General
340
+Public License instead of this License.
0 341
new file mode 100644
... ...
@@ -0,0 +1,7 @@
1
+Changes since v0.1:
2
+
3
+	* autoscroll only if scrollbar at bottom
4
+	* support for private messages
5
+	* nick highlighting
6
+	* configurable backend (http polling and/or binding)
7
+	* a lot of fixes and enhancements
0 8
\ No newline at end of file
1 9
new file mode 100644
... ...
@@ -0,0 +1,192 @@
1
+MUCkl tribune 
2
+=============
3
+
4
+A special version of MUCkl with tribune features.
5
+
6
+What is MUCkl ?
7
+===============
8
+
9
+  MUCkl is a web based groupchat application with focus on ease of
10
+  installation and usage. As a user you just need to enter your
11
+  desired nickname and start chatting.
12
+  MUCkl doesn't need Perl, PHP or MySQL at the server side nor Java at
13
+  the client side. It's just plain HTML/JavaScript.
14
+
15
+  MUCkl uses [1]Jabber technology to handle all communication. It
16
+  let's you connect to any predefined [2]MUC-based chat room.
17
+
18
+  This version 
19
+
20
+
21
+  [1] http://www.jabber.org
22
+  [2] http://www.jabber.org/jeps/jep-0045.html
23
+
24
+What is a tribune?
25
+==================
26
+
27
+A tribune is a type of chat popular in some obscure french websites.
28
+
29
+It adds to traditionnal chat some usefull features:
30
+
31
+- norloge: a conversation flow highlightning tool.
32
+- totoz: a way to insert stupid images.
33
+
34
+Supported browsers and plattforms
35
+=================================
36
+
37
+  As of this release MUCkl has not been tested a lot. It should work
38
+  with any version of Internet Explorer since version 5 and all recent
39
+  versions of Gecko ("Mozilla") based browsers. 
40
+
41
+  Feedback on this is very welcome!
42
+
43
+
44
+Prerequisites
45
+=============
46
+
47
+  In order to use MUCkl you need to have access to an [3]HTTP Polling
48
+  or [4]HTTP Binding service for Jabber. These allow you to connect to
49
+  a Jabber server using the HTTP protocol rather than raw TCP/IP
50
+  sockets. There are Jabber servers that have built-in HTTP Polling
51
+  support like [5]ejabberd or some of the commercial ones.
52
+
53
+  There are also some standalone implementations of HTTP Polling
54
+  available like [6]tonneru and [7]webjah. Both allow you to connect
55
+  to any jabber server. Latest versions of punjab have built in
56
+  support for HTTP Polling and HTTP Binding. See [8]punjab's website for
57
+  details.
58
+
59
+  Additionally you need a web server of your choice capable of doing
60
+  address rewriting (at least if you're using an HTTP proxy service
61
+  that is not local to your web server).
62
+
63
+  So to sum it up: If you don't know of any public jabber server which
64
+  offers HTTP Polling as a free service, you will have to install your
65
+  own jabber server or one of the HTTP Polling components mentioned
66
+  above. If you've got the choice use ejabberd as it's the most
67
+  reliable solution available at the moment at no cost.
68
+
69
+  [3] http://www.jabber.org/jeps/jep-0025.html
70
+  [4] http://www.jabber.org/jeps/jep-0124.html
71
+  [5] http://ejabberd.jabberstudio.org
72
+  [6] http://tonneru.tanoshi.net/
73
+  [7] http://www.gonzo.kiev.ua/projects/jabber/index.html#webjah
74
+  [8] http://punjab.sourceforge.net/
75
+
76
+
77
+Installation
78
+============
79
+
80
+  1) Unpacking
81
+
82
+     Unpack MUCkl into a directory accessible by your web server.
83
+
84
+  2) Configure Web Server
85
+
86
+     This is the trickiest part of the setup as it depends on which
87
+     HTTP Polling service you've chosen. It requires some knowledge of
88
+     apache configuration as well as some understanding of what HTTP
89
+     Polling is.
90
+
91
+     First let me explain, what we need to do and why: Due to security
92
+     considerations most browsers don't allow JavaScript to access any
93
+     data outside the domain it has been loaded from. Gecko based
94
+     browsers are even more restrictive in this as they don't allow
95
+     them to access data on a different port either.
96
+
97
+     So say, the HTTP Polling service we plan to use for MUCkl is
98
+     located at http://jabber.somedomain.com:5280/http-poll/ (a
99
+     typical ejabberd URI). MUCkl itself is served at
100
+     http://www.mydomain.com/MUCkl/. Now we have to make sure that our
101
+     installation of MUCkl can access the HTTP Polling service by
102
+     calling some local URI like
103
+     http://www.mydomain.com/http-poll/. So we have to
104
+     setup a rewrite rule which redirects requests on
105
+     http://www.mydomain.com/MUCkl/http-poll/ to
106
+     http://jabber.somedomain.com:5280/http-poll/.
107
+
108
+     Using apache this can be achieved by the following steps:
109
+
110
+     * Make sure that mod_rewrite and mod_proxy (additionally
111
+       mod_proxy_http for apache2) are loaded.
112
+
113
+     * Define a rewrite rule for your MUCkl installation directory (Step 1). 
114
+       E.g. create an .htaccess file within your MUCkl installation
115
+       directory like the following:
116
+
117
+       <IfModule mod_rewrite.c>
118
+         RewriteEngine On
119
+         RewriteRule http-poll/ http://jabber.somedomain.com:5280/http-poll/ [P]
120
+       </IfModule>
121
+
122
+
123
+  3) Setup Jabber Account
124
+
125
+     In order to complete Step 3 and 4 you will need a native Jabber
126
+     client that supports registration of new accounts and the MUC
127
+     protocol for configuration of your chat room. My tip: Use Exodus
128
+     on Windows, tkabber on Linux.
129
+
130
+     Now you need to create a new jabber account. Make sure that you
131
+     can connect to it by way of the chosen HTTP Polling service. So
132
+     most probably using the example above you would create it on
133
+     jabber.somedomain.com.
134
+
135
+     Everybody using your installation of MUCkl will use this account
136
+     data to enter the Jabber network and join your chat room.
137
+
138
+  4) Setup Chat Room
139
+
140
+     Now use some different Jabber account which will be the owner of
141
+     your desired chat room. Enter your room or create a new one and
142
+     configure it to suit your needs (e.g. don't make it
143
+     private/invite only/password protected, as MUCkl doesn't support
144
+     these kind of things).
145
+
146
+  5) Configure MUCkl
147
+
148
+     Now that we have all necessary data at hand we finally may edit
149
+     config.js (located in MUCkl's installation directory). For
150
+     detailed information on how to do this refer to the comments
151
+     given in this file!
152
+
153
+     When done, fire up your prefered browser (see above! ;-)) and
154
+     login to MUCkl.
155
+
156
+
157
+Further Information/Reading
158
+===========================
159
+
160
+  MUCkl is a stripped down version of [9]JWChat - a web based Jabber
161
+  client. As such it uses the [10]JSJaC library for communication with
162
+  the Jabber network. JSJaC allows you to connect to Jabber servers
163
+  using either [11]HTTP Polling or [12]HTTP Binding. Groupchat
164
+  functionality is realized as an implementation of the [13]Multi User
165
+  Conference Protocol [MUC].
166
+
167
+
168
+  [9] http://jwchat.sourceforge.net
169
+  [10] http://jsjac.jabberstudio.org
170
+  [11] http://www.jabber.org/jeps/jep-0025.html
171
+  [12] http://www.jabber.org/jeps/jep-0124.html
172
+  [13] http://www.jabber.org/jeps/jep-0045.html
173
+
174
+
175
+Disclaimer
176
+==========
177
+
178
+  This program is free software; you can redistribute it and/or modify
179
+  it under the terms of the GNU General Public License as published by
180
+  the Free Software Foundation; either version 2 of the License, or
181
+  (at your option) any later version.
182
+
183
+  This program is distributed in the hope that it will be useful, but
184
+  WITHOUT ANY WARRANTY; without even the implied warranty of
185
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
186
+  General Public License for more details.
187
+
188
+  You should have received a copy of the GNU General Public License
189
+  along with this program; if not, write to the Free Software
190
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
191
+  USA
192
+
0 193
new file mode 100644
... ...
@@ -0,0 +1,6 @@
1
+planed for 0.3:
2
+
3
+ * allow to choose preconfigured chat rooms from a list on login
4
+ * add possibility to set online status (away) and away message
5
+
6
+
0 7
new file mode 100644
... ...
@@ -0,0 +1,34 @@
1
+/*	BrowserCheck Object
2
+	provides most commonly needed browser checking variables
3
+	19990326
4
+*/
5
+// Copyright (C) 1999 Dan Steinman
6
+// Distributed under the terms of the GNU Library General Public License
7
+// Available at http://www.dansteinman.com/dynapi/
8
+
9
+function BrowserCheck() {
10
+	var b = navigator.appName
11
+	if (b=="Netscape") this.b = "ns"
12
+	else if (b=="Microsoft Internet Explorer") this.b = "ie"
13
+	else if (b=="Opera") this.b = "op"
14
+	else this.b = b
15
+	this.v = parseInt(navigator.appVersion)
16
+	this.ns = (this.b=="ns" && this.v>=4)
17
+	this.ns4 = (this.b=="ns" && this.v==4)
18
+	this.ns5 = (this.b=="ns" && this.v==5)
19
+	this.ie = (this.b=="ie" && this.v>=4)
20
+	this.op = (this.b=="op" && this.v>=7)
21
+	this.ie4 = (navigator.userAgent.indexOf('MSIE 4')>0)
22
+	this.ie5 = (navigator.userAgent.indexOf('MSIE 5')>0)
23
+	this.ie55 = (navigator.userAgent.indexOf('MSIE 5.5')>0)
24
+	if (this.ie55) {
25
+		this.v = 5.5;
26
+		this.ie5 = false;
27
+	}
28
+	this.mac = (navigator.userAgent.indexOf('Mac')>0);
29
+	if (this.ie5) this.v = 5
30
+	this.min = (this.ns||this.ie)
31
+}
32
+
33
+// automatically create the "is" object
34
+is = new BrowserCheck()
0 35
new file mode 100644
... ...
@@ -0,0 +1,108 @@
1
+/*
2
+ * MUCkl - A Web Based Groupchat Application
3
+ * Copyright (C) 2004 Stefan Strigler <steve@zeank.in-berlin.de>
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
+ */
19
+
20
+/* ***
21
+ * This is the main configuration file for the chat client itself.
22
+ * You have to edit this before you can start using MUCkl on your website!
23
+ * ***
24
+ */
25
+
26
+/* BACKENDTYPE - the type of backend to be used
27
+ * 
28
+ * Either 'polling' for HTTP Polling
29
+ * Or     'binding' for HTTP Binding
30
+ */
31
+var BACKENDTYPE = 'binding';
32
+
33
+/* HTTPBASE - base URI to contact HTTP Polling service
34
+ * 
35
+ * This must be local to your web server which serves MUCkl. If
36
+ * HTTP Polling service is not local to your web server you have to
37
+ * define a rewrite rule which matches this address and redirects to
38
+ * the real HTTP Polling URI.
39
+ * 
40
+ * [refers to step 2 of installation instructions]
41
+ */
42
+
43
+//var HTTPBASE = "/tomcat/JHB/";
44
+var HTTPBASE = "/http-bind/";
45
+
46
+/* Login Data - the user to login
47
+ * 
48
+ * [refers to step 3 of installation instructions]
49
+ */
50
+
51
+var XMPPDOMAIN = "bci.im"; // domain name of jabber service to be used
52
+
53
+var AUTHTYPE = 'anonymous';
54
+//var AUTHHOST = "anon.localhost"; // hostname of sasl anonymous service 
55
+
56
+var MUCKLJID = "muckl"; // username
57
+var MUCKLPASS = "muckl"; // password
58
+
59
+/* ROOMS
60
+ *
61
+ * Which chat room to join
62
+ * 
63
+ * [refers to step 4 of installation instructions]
64
+ */
65
+
66
+var ROOMS =
67
+[
68
+        {
69
+                name:'newton_adventure',
70
+                description:'newton adventure',
71
+                server:'conference.bci.im'//,
72
+//		logo: 'http://localhost/spongebob.png'
73
+        }
74
+];
75
+
76
+/* CONFERENCENOHIST
77
+ * whether to not show room history upon joining 
78
+ */
79
+var CONFERENCENOHIST = false;
80
+
81
+/* DEFAULT_LOCK_MINS
82
+ * time a user is being locked out if not otherwise indicated by kick reason
83
+ */
84
+var DEFAULT_LOCK_MINS = 1;
85
+
86
+/* MAX_LOCK_MINS
87
+ * maximum allowed number of minutes a user may be locked out by kick reason
88
+ * on ban this is used as default value
89
+ */
90
+var MAX_LOCK_MINS = 60;
91
+
92
+/* ***
93
+ * some internally used vars - don't change except you really know
94
+ * what you are doing
95
+ * ***
96
+ */
97
+
98
+var timerval = 5000; // poll frequency in msec
99
+
100
+var stylesheet = "muckl.css";
101
+var THEMESDIR = "themes";
102
+
103
+/* debugging options */
104
+var DEBUG = true; // turn debugging on
105
+var DEBUG_LVL = 2; // debug-level 0..4 (4 = very noisy)
106
+
107
+/* ** Don't touch ** */
108
+var VERSION = "0.4.4";
0 109
new file mode 100644
... ...
@@ -0,0 +1,275 @@
1
+// name:	RhymBox
2
+// description:	Default set of icons in RhymBox.  Created by Greg Fleming as part of his Megapack1 icon collection.
3
+// author:	Greg Fleming
4
+// author:	Sebastiaan Deckers
5
+// creation:	2002-04-07
6
+
7
+var emoticons = new Object();
8
+var emoticonpath = "./images/emoticons/rythmbox/";
9
+
10
+emoticons[':cat:'] = 'cat.gif';
11
+
12
+emoticons[':dog:'] = 'dog.gif';
13
+
14
+emoticons['@-\\)'] = 'alien.gif';
15
+
16
+emoticons['8-\\]'] = 'ogre.gif';
17
+
18
+emoticons['o-\\)'] = 'cyclops.gif';
19
+emoticons['O-\\)'] = 'cyclops.gif';
20
+
21
+emoticons['o-\\]'] = 'robot.gif';
22
+emoticons['O-\\]'] = 'robot.gif';
23
+
24
+emoticons['\\|:-\\)'] = 'rambo.gif';
25
+
26
+emoticons[':#\\('] = 'hurt.gif';
27
+
28
+emoticons['#-\\('] = 'dead.gif';
29
+
30
+emoticons['O:-\\)'] = 'angel.gif';
31
+emoticons['o:-\\)'] = 'angel.gif';
32
+emoticons['o:\\)'] = 'angel.gif';
33
+emoticons['O:\\)'] = 'angel.gif';
34
+
35
+emoticons['\\(6\\)'] = 'devil.gif';
36
+emoticons[':devil:'] = 'devil.gif';
37
+
38
+emoticons['\\(y\\)'] = 'thumbup.gif';
39
+emoticons['\\(Y\\)'] = 'thumbup.gif';
40
+emoticons[':yes:'] = 'thumbup.gif';
41
+
42
+emoticons['\\(n\\)'] = 'thumbdown.gif';
43
+emoticons['\\(N\\)'] = 'thumbdown.gif';
44
+emoticons[':no:'] = 'thumbdown.gif';
45
+
46
+emoticons[':heart:'] = 'heart.gif';
47
+emoticons['\\(l\\)'] = 'heart.gif';
48
+emoticons['\\(L\\)'] = 'heart.gif';
49
+
50
+emoticons['\\(u\\)'] = 'heart.gif';
51
+emoticons['\\(U\\)'] = 'heart.gif';
52
+emoticons[':bheart:'] = 'heart.gif';
53
+
54
+emoticons['\\(z\\)'] = 'person.gif';
55
+emoticons['\\(Z\\)'] = 'person.gif';
56
+emoticons[':man:'] = 'person.gif';
57
+
58
+emoticons['\\(e\\)'] = 'letter.gif';
59
+emoticons['\\(E\\)'] = 'letter.gif';
60
+emoticons[':letter:'] = 'letter.gif';
61
+
62
+emoticons[':coffee:'] = 'coffee.gif';
63
+emoticons['\\(c\\)'] = 'coffee.gif';
64
+emoticons['\\(C\\)'] = 'coffee.gif';
65
+
66
+emoticons['\\(i\\)'] = 'bulb.gif';
67
+emoticons['\\(I\\)'] = 'bulb.gif';
68
+emoticons[':lamp:'] = 'bulb.gif';
69
+emoticons[':jabber:'] = 'bulb.gif';
70
+
71
+emoticons['\\}\\{'] = 'bat.gif';
72
+emoticons[':bat:'] = 'bat.gif';
73
+
74
+emoticons[':dragon:'] = 'dragon.gif';
75
+
76
+emoticons[':home:'] = 'house.gif';
77
+
78
+emoticons[':apple:'] = 'apple.gif';
79
+
80
+emoticons[':glasses:'] = 'glasses.gif';
81
+
82
+emoticons['\\(t\\)'] = 'phone.gif';
83
+emoticons['\\(T\\)'] = 'phone.gif';
84
+emoticons[':phone:'] = 'phone.gif';
85
+
86
+emoticons[':mushroom:'] = 'mushroom.gif';
87
+
88
+emoticons['\\(p\\)'] = 'camera.gif';
89
+emoticons['\\(P\\)'] = 'camera.gif';
90
+emoticons[':photo:'] = 'camera.gif';
91
+
92
+emoticons[':world:'] = 'globe.gif';
93
+
94
+emoticons[':syringe:'] = 'needle.gif';
95
+
96
+
97
+emoticons['\\(b\\)'] = 'beer.gif';
98
+emoticons['\\(B\\)'] = 'beer.gif';
99
+emoticons[':beer:'] = 'beer.gif';
100
+
101
+emoticons[':carrot:'] = 'carrot.gif';
102
+
103
+emoticons[':cherry:'] = 'cherry.gif';
104
+
105
+emoticons[':cobra:'] = 'cobra.gif';
106
+
107
+emoticons[':wine:'] = 'cocktail.gif';
108
+emoticons[':cocktail:'] = 'cocktail.gif';
109
+emoticons['\\(d\\)'] = 'cocktail.gif';
110
+emoticons['\\(D\\)'] = 'cocktail.gif';
111
+
112
+emoticons[':dinosaur:'] = 'dinosaur.gif';
113
+
114
+emoticons[':drink:'] = 'drink.gif';
115
+
116
+emoticons[':fish:'] = 'fish.gif';
117
+
118
+emoticons[':graduate:'] = 'graduate.gif';
119
+
120
+emoticons[':death:'] = 'grimreaper.gif';
121
+
122
+emoticons[':hammer:'] = 'hammer.gif';
123
+
124
+emoticons[':helicopter:'] = 'helicopter.gif';
125
+
126
+emoticons['\\(8\\)'] = 'music.gif';
127
+emoticons[':note:'] = 'music.gif';
128
+emoticons[':music:'] = 'music.gif';
129
+
130
+emoticons[':tux:'] = 'penguin.gif';
131
+emoticons[':linux:'] = 'penguin.gif';
132
+
133
+emoticons[':skull:'] = 'skull.gif';
134
+
135
+emoticons[':speaker:'] = 'speaker.gif';
136
+
137
+emoticons[':tv:'] = 'tv.gif';
138
+emoticons[':television:'] = 'tv.gif';
139
+
140
+emoticons[':p'] = 'ditsy.gif';
141
+
142
+emoticons[':pill:'] = 'pill.png';
143
+emoticons['\\(E\\)'] = 'pill.png';
144
+emoticons['\\(e\\)'] = 'pill.png';
145
+
146
+emoticons[':god:'] = 'trinity_glowing.gif';
147
+emoticons[':water:'] = 'water_molecule.gif';
148
+
149
+emoticons[':\\)'] = 'smile.gif';
150
+emoticons[':-\\)'] = 'smile.gif';
151
+emoticons['\\(:'] = 'spin.gif';
152
+emoticons['\\(-:'] = 'spin.gif';
153
+
154
+emoticons[';\\)'] = 'wink.gif';
155
+emoticons[';-\\)'] = 'wink.gif';
156
+emoticons['\\(;'] = 'wink.gif';
157
+emoticons['\\(-;'] = 'wink.gif';
158
+
159
+emoticons[':\\|'] = 'normal.gif';
160
+emoticons[':-\\|'] = 'normal.gif';
161
+
162
+emoticons[':-\\\\'] = 'ermm.gif';
163
+emoticons[':\\\\'] = 'ermm.gif';
164
+emoticons[':-\\/'] = 'ermm.gif';
165
+emoticons[':\\/'] = 'ermm.gif';
166
+
167
+emoticons[':S'] = 'puzzled.gif';
168
+emoticons[':s'] = 'puzzled.gif';
169
+emoticons[':-S'] = 'puzzled.gif';
170
+emoticons[':-s'] = 'puzzled.gif';
171
+
172
+emoticons[':\\('] = 'depressed.gif';
173
+emoticons[':-\\('] = 'depressed.gif';
174
+emoticons['\\):'] = 'depressed.gif';
175
+emoticons['\\)-:'] = 'depressed.gif';
176
+
177
+emoticons[':\'\\('] = 'cry.gif';
178
+emoticons[':\'-\\('] = 'cry.gif';
179
+
180
+emoticons[':X'] = 'speechless.gif';
181
+emoticons[':x'] = 'speechless.gif';
182
+
183
+emoticons[':o'] = 'surprised.gif';
184
+emoticons[':-o'] = 'surprised.gif';
185
+emoticons[':O'] = 'surprised.gif';
186
+emoticons[':-O'] = 'surprised.gif';
187
+
188
+emoticons['%\\)'] = 'evolved.gif';
189
+emoticons['%-\\)'] = 'evolved.gif';
190
+
191
+emoticons['\\&gt;:D'] = 'laugh.gif';
192
+
193
+emoticons[':D'] = 'silly.gif';
194
+emoticons[':-d'] = 'silly.gif';
195
+emoticons[':d'] = 'silly.gif';
196
+emoticons[':-D'] = 'silly.gif';
197
+
198
+emoticons[':o\\)'] = 'cheerful.gif';
199
+
200
+emoticons[':\\)'] = 'smiley.gif';
201
+
202
+emoticons['8-D'] = 'cheeky.gif';
203
+
204
+emoticons[':\\*\\)'] = 'embarrassed.gif';
205
+
206
+emoticons[':-0'] = 'shocked.gif';
207
+emoticons[':-O'] = 'shocked.gif';
208
+
209
+emoticons[':0'] = 'scared.gif';
210
+emoticons[':O'] = 'scared.gif';
211
+
212
+emoticons[':-P'] = 'lick.gif';
213
+emoticons[':-p'] = 'lick.gif';
214
+
215
+emoticons['B-\\)'] = 'cool.gif';
216
+
217
+emoticons['B-\\|'] = 'calm.gif';
218
+
219
+emoticons[':-!'] = 'smoker.gif';
220
+
221
+emoticons['\\|-\\)'] = 'bandit.gif';
222
+
223
+emoticons['P-\\)'] = 'pirate.gif';
224
+
225
+emoticons[':-\\)\\}'] = 'beard.gif';
226
+
227
+emoticons[':-\\)\\{'] = 'beard.gif';
228
+
229
+emoticons[':-\\)\\&gt;'] = 'old-man.gif';
230
+
231
+emoticons['\\[:\\|\\]'] = 'ninja.gif';
232
+
233
+emoticons[':-\\[\\]'] = 'gasmask.gif';
234
+
235
+emoticons[':-\\['] = 'vampire.gif';
236
+emoticons[':\\['] = 'vampire.gif';
237
+
238
+emoticons['3-\\|\\{'] = 'sleeping.gif';
239
+
240
+emoticons['8-\\/'] = 'paranoid.gif';
241
+
242
+emoticons['\\?-\\|'] = 'ponder.gif';
243
+
244
+emoticons[':-S'] = 'nervous.gif';
245
+
246
+emoticons['8-s'] = 'confused.gif';
247
+
248
+emoticons['8-\\|'] = 'tired.gif';
249
+
250
+emoticons['8-\\['] = 'bored.gif';
251
+
252
+emoticons['8-\\('] = 'disappointed.gif';
253
+
254
+emoticons[':-\\&lt;'] = 'sad.gif';
255
+
256
+emoticons['\\&gt;:-D'] = 'evil.gif';
257
+
258
+emoticons['\\&gt;:-\\|'] = 'angry.gif';
259
+
260
+emoticons['\\&gt;:-\\)'] = 'devious.gif';
261
+
262
+emoticons['\\&gt;:-o'] = 'mad.gif';
263
+
264
+emoticons[':D'] = 'grin.gif';
265
+
266
+emoticons['8\\)'] = 'classic.gif';
267
+
268
+emoticons[':-\\]'] = 'square-eyed.gif';
269
+
270
+emoticons['\\|\\|-\\)'] = 'cross-eyed.gif';
271
+
272
+emoticons['8-\\)'] = 'foureyes.gif';
273
+
274
+emoticons['x-\\)'] = 'knocked-out.gif';
275
+emoticons['X-\\)'] = 'knocked-out.gif';
0 276
new file mode 100644
... ...
@@ -0,0 +1,16 @@
1
+<?xml version="1.0" encoding="ISO-8859-1" ?>
2
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+<html xmlns="http://www.w3.org/1999/xhtml">
4
+<head>
5
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
6
+<style type="text/css" media="screen">
7
+/*<![CDATA[*/
8
+@import url(muckl.css);
9
+/*]]>*/
10
+</style>
11
+<title>MUCkl</title>
12
+</head>
13
+<body>
14
+
15
+</body>
16
+</html>
0 17
\ No newline at end of file
1 18
new file mode 100644
... ...
@@ -0,0 +1,764 @@
1
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+<html>
3
+  <head>
4
+    <title>JWChat - Groupchat</title>
5
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
6
+    <script src="shared.js"></script>
7
+    <script src="browsercheck.js"></script>
8
+    <script src="emoticons.js"></script>
9
+    <script src="config.js"></script>
10
+
11
+    <script src="switchStyle.js"></script>
12
+
13
+    <script src="roster.js"></script>
14
+
15
+    <script src="jsjac.js"></script>
16
+    <script src="uuid.core.js"></script>
17
+
18
+    <script>
19
+
20
+function submitClicked() {
21
+  if (!clearedEls['msgbox'])
22
+    return false;
23
+
24
+  var body = document.getElementById("msgbox").value;
25
+  var to = ''; 
26
+
27
+  if (body == '') // don't send empty message
28
+    return false;
29
+
30
+  var aMessage = new JSJaCMessage();
31
+  aMessage.setID('muckl' + UUID.generate());
32
+  if (frames['groupchatIRoster'].userSelected) {
33
+    to = frames['groupchatIRoster'].userSelected.getAttribute('username');
34
+    var jid = roster.getFullJIDByNick(htmlFullEnc(to));
35
+    if (jid == null) {
36
+      putMsgHTML("No such nick"+": " + htmlFullEnc(to), new Date().toLocaleTimeString(), group);
37
+
38
+      // unselect user
39
+      if (frames['groupchatIRoster'].userSelected)
40
+        frames['groupchatIRoster'].userSelected.className = "rosterUser";;
41
+      frames['groupchatIRoster'].userSelected = null;;
42
+      document.getElementById('send_to_label').innerHTML = '';
43
+
44
+      srcW.addtoHistory(body);
45
+      document.getElementById('msgbox').value=''; // empty box
46
+      document.getElementById('msgbox').focus(); // set focus back on input field
47
+      return;
48
+    } else {
49
+      aMessage.setType('chat');
50
+      aMessage.setTo(jid);
51
+    }
52
+  } else {
53
+    aMessage.setType('groupchat');
54
+    aMessage.setTo(group);
55
+  }
56
+	
57
+  /* handle commands */
58
+  if (body.match(/^\/say (.+)/)) {
59
+
60
+    /* *** say *** */
61
+
62
+    body = RegExp.$1;
63
+    aMessage.setBody(body);
64
+    srcW.con.send(aMessage);
65
+  } else if (body.match(/^\/clear/)) {
66
+
67
+    /* *** clear *** */
68
+
69
+    cFrame.body.innerHTML = '';
70
+  } else if (body.match(/^\/nick (.+)/)) {
71
+
72
+    /* *** nick *** */
73
+
74
+    var nick2 = body.replace(/^\/nick (.+)/,"$1");
75
+    var aPresence = new JSJaCPresence();
76
+    aPresence.setTo(group+"/"+nick2);
77
+    srcW.con.send(aPresence);
78
+  } else if (body.match(/^\/topic (.+)/)) {
79
+
80
+    /* *** topic *** */
81
+
82
+    var topic = body.replace(/^\/topic (.+)/,"$1");
83
+    aMessage.setType('groupchat');
84
+    aMessage.setSubject(topic);
85
+    srcW.con.send(aMessage);
86
+  } else if (body.match(/^\/ban (\S+)\s*(.*)/)) {
87
+
88
+    /* *** ban *** */
89
+
90
+    var nick2 = RegExp.$1;
91
+    var reason = RegExp.$2;
92
+
93
+    var jid = roster.getFullJIDByNick(nick2);
94
+    if (jid == null) {
95
+      putMsgHTML("No such nick"+": " + nick2, new Date().toLocaleTimeString(), group);
96
+    } else {
97
+      changeAffiliation(jid,'outcast',false,reason);
98
+    }
99
+  } else if (body.match(/^\/kick (\S+)\s*(.*)/)) {
100
+
101
+    /* *** kick *** */
102
+
103
+    var nick2 = RegExp.$1;
104
+    var reason = RegExp.$2;
105
+
106
+    var jid = roster.getFullJIDByNick(nick2);
107
+    if (jid == null) {
108
+      putMsgHTML("No such nick"+": " + nick2, new Date().toLocaleTimeString(),group);
109
+    } else {
110
+      changeRole(jid,'none',false,reason);
111
+    }
112
+  } else if (body.match(/^\/join (\S+)\s*(.*)/)) {
113
+
114
+    /* *** join *** */
115
+
116
+    var room = RegExp.$1;
117
+    var pass = RegExp.$2;
118
+    srcW.roster.openGroupchat(room,nick,pass);
119
+  } else if (body.match(/^\/msg (\S+)\s*(.*)/)) {
120
+
121
+    /* *** msg *** */
122
+
123
+    to = RegExp.$1;
124
+    var body = RegExp.$2;
125
+
126
+    var jid = roster.getFullJIDByNick(to);
127
+    if (jid == null)
128
+      putMsgHTML("No such nick"+": " + to, new Date().toLocaleTimeString(), group);
129
+    else {
130
+      aMessage.setType('chat');
131
+      aMessage.setTo(jid);
132
+      aMessage.setBody(body);
133
+      srcW.con.send(aMessage);
134
+    }
135
+  } else if (body.match(/^\/part\s*(.*)/)) {
136
+
137
+    /* *** part *** */
138
+
139
+    var msg = RegExp.$1;
140
+    var aPresence = new JSJaCPresence();
141
+    aPresence.setTo(group);
142
+    aPresence.setType('unavailable');
143
+    if (msg && msg != '')
144
+      aPresence.setStatus(msg);
145
+    srcW.con.send(aPresence);
146
+  } else if (body.match(/^\/help/)) {
147
+
148
+    /* *** help *** */
149
+
150
+    open("http://www.jabber.org/jeps/jep-0045.html#impl-client-irc");
151
+  } else {
152
+    aMessage.setBody(body);
153
+    srcW.con.send(aMessage);
154
+  }			
155
+
156
+  if (aMessage.getType() == 'chat') { // a private message we have to putMsgHTML ourself
157
+    putMsgHTML(aMessage.getBody(),new Date().toLocaleTimeString(),to,'purple',null,'to');
158
+  }
159
+
160
+  // add message to our message history
161
+  srcW.addtoHistory(body);
162
+  document.getElementById('msgbox').value=''; // empty box
163
+  document.getElementById('msgbox').focus(); // set focus back on input field
164
+  
165
+  return false;
166
+}
167
+
168
+function partRoom() {
169
+  if (confirm('Are you sure you want to leave this chat room?')) 
170
+    if (parent.document.referrer)
171
+      return parent.location.replace(parent.document.referrer);
172
+    else
173
+      return parent.location.replace('index.html');
174
+}
175
+
176
+var colors = new Array('maroon','green','olive','navy','purple','teal','red','blue');
177
+
178
+var norlogeToMtime = {};
179
+
180
+function putMsgHTML(msg,mtime,user,usercolor,err,type,norloge) {
181
+  var msgHTML = '';
182
+
183
+  if(norloge) {
184
+      msgHTML += '<div data-norloge="' + norloge +'">';
185
+      msgHTML += '<span class="norloge norloge-ref" data-norloge="' + norloge +'">[' + mtime + ']&nbsp</span>';
186
+      norlogeToMtime[norloge] = mtime;
187
+  }
188
+  else
189
+      msgHTML += '<div';
190
+
191
+  if (msg.match(/^\/me /)) {
192
+    msg = msgFormat(msg,norlogeToMtime);
193
+
194
+    msg = msg.replace(/^\/me /,"<span class='meMsg'>*&nbsp;<span class='chatUser' username=\""+htmlFullEnc(user)+"\" title='@ "+mtime+"'>"+htmlEnc(user)+"</span></span>&nbsp;");
195
+  } else if (user && user != group) {
196
+    msg = msgFormat(msg,norlogeToMtime);
197
+
198
+    if (type == 'chat' || type == 'to') { // a private message
199
+      msgHTML += "<span class='privMsg'>[";
200
+      msgHTML += "<span class='chatUser' username=\""+htmlFullEnc(user)+"\" title=\"@ "+mtime+"\">" + htmlEnc(user) + "</span>";
201
+      if (type == 'to')                 
202
+        msgHTML += "&laquo;";
203
+      else
204
+        msgHTML += "&raquo;";
205
+      msgHTML += "]</span>&nbsp;";
206
+    } else
207
+      msgHTML += "<span style=\"color:"+usercolor+";\" class='chatUser' username=\""+htmlFullEnc(user)+"\" title='@ "+mtime+"'>&lt;" + htmlEnc(user) + "&gt;</span>&nbsp;";
208
+  }
209
+
210
+  if (user == group) {/* channel status messages */
211
+    if (err)
212
+      msgHTML += "<span style=\"font-weight:bold;color:red;\">"+msg+"</span>";
213
+    else
214
+      msgHTML += "<span style=\"font-weight:bold;\">"+msg+"</span>";
215
+  } else {
216
+
217
+    if (user != nick && meRegExp.test(msg) && !notHREFMeRegExp.test(msg))
218
+      msgHTML += msg.replace(meRegExp,"<span class='highlighted'>$1</span>");
219
+    else 
220
+      msgHTML += msg;
221
+  }
222
+
223
+  msgHTML += "</div>";
224
+  
225
+  scroll_bottom = false;
226
+  if (cFrame.body.scrollTop+cFrame.body.clientHeight >= cFrame.body.scrollHeight)
227
+    scroll_bottom = true;
228
+
229
+  cFrame.body.innerHTML += msgHTML;
230
+
231
+  if (scroll_bottom)
232
+    frames.groupchatIChat.scrollTo(0,cFrame.body.scrollHeight);
233
+}
234
+
235
+function popMsgs() {
236
+  if (!user) 
237
+    user = srcW.roster.getUserByJID(group);
238
+
239
+  while (user.chatmsgs.length>0) {
240
+    var msg;
241
+    if (is.ie5||is.op) {
242
+      msg = user.chatmsgs[0];
243
+      user.chatmsgs = user.chatmsgs.slice(1,user.chatmsgs.length);
244
+    } else
245
+      msg = user.chatmsgs.shift();
246
+
247
+    var from = msg.getFrom();
248
+    if (msg.getFrom().indexOf('/') != -1)
249
+      from = msg.getFrom().substring(msg.getFrom().indexOf('/')+1);
250
+
251
+    /* get date */
252
+    var timestamp;
253
+    if (msg.jwcTimestamp)
254
+      timestamp = msg.jwcTimestamp;
255
+    else
256
+      timestamp = new Date();
257
+
258
+    var mtime = '';
259
+    if (new Date() - timestamp > 24*3600*1000)
260
+      mtime += timestamp.toLocaleDateString() + " ";
261
+		
262
+    mtime += timestamp.toLocaleTimeString();
263
+    
264
+    /* look for a subject */
265
+    if (msg.getType() == 'groupchat' && msg.getSubject()) { // set topic
266
+      user.roster.subject = msg.getSubject();
267
+      document.getElementById('room_topic').innerHTML = htmlEnc(msg.getSubject());
268
+      putMsgHTML("/me has set the topic to: "+msg.getSubject(), mtime, from);
269
+      return;
270
+    }
271
+
272
+    if(!msg.getBody() || msg.getBody() == '')
273
+      return;
274
+	
275
+    srcW.playSound('chat_recv');
276
+
277
+    /* calculate color */
278
+    var charSum = 0;
279
+    for (var i=0; i<from.length; i++)
280
+      charSum += from.charCodeAt(i);
281
+  
282
+  var norloge = msg.getID();
283
+  if(!norloge)
284
+      norloge = "message_sans_id_puxor";
285
+  
286
+  putMsgHTML(msg.getBody(),mtime,from,colors[charSum%(colors.length)],null,msg.getType(),norloge);	
287
+  } /* end while */
288
+
289
+}
290
+
291
+function displayTimestamp() {
292
+  var tstyle;
293
+  if (is.ie) {
294
+    tstyle = cFrame.styleSheets('timestampstyle');
295
+    tstyle.disabled = srcW.timestamps;
296
+  } else {
297
+    tstyle = cFrame.getElementById("timestampstyle");
298
+    tstyle.sheet.disabled = srcW.timestamps;
299
+  }
300
+}
301
+
302
+function updateMe() {
303
+  document.getElementById('submit_button').disabled = (roster.me.role == 'none');
304
+
305
+  if (roster.me.role == 'none') {// seems we left
306
+    cFrame.body.innerHTML += "<span style='color:red';>"+"Disconnected."+"</span><br>";
307
+    groupchatIChat.scrollTo(0,cFrame.body.scrollHeight);
308
+  }
309
+}
310
+
311
+function changeUserStat(jid,stat,val,confirm,reason) {
312
+  var user = roster.getUserByJID(jid);
313
+  var iq = new JSJaCIQ();
314
+  iq.setType('set');
315
+  iq.setTo(group);
316
+
317
+  var query = iq.setQuery('http://jabber.org/protocol/muc#admin');
318
+  var item = query.appendChild(iq.getDoc().createElement('item'));
319
+  item.setAttribute('nick',user.name);
320
+
321
+  item.setAttribute(stat,val);
322
+	
323
+  if (reason || (confirm && (reason = prompt("Reason","")) != ''))
324
+    item.appendChild(iq.getDoc().createElement('reason')).appendChild(iq.getDoc().createTextNode(reason));
325
+
326
+  me = this;
327
+  srcW.con.send(iq,me.handleError);
328
+}
329
+
330
+function handleError(iq) {
331
+  // handle error
332
+  if (iq && iq.getType() == 'error') {
333
+    var error = iq.getNode().getElementsByTagName('error').item(0);
334
+    if (error) {
335
+      var msg = '';
336
+      for (var i=0; i<error.childNodes.length; i++) {
337
+        switch (error.childNodes.item(i).nodeName) {
338
+        case 'not-allowed':
339
+          putMsgHTML("Not Allowed",new Date(),group,null,true);
340
+          break;
341
+        case 'forbidden':
342
+          putMsgHTML("Forbidden",new Date(),group,null,true);
343
+          break;
344
+        case 'item-not-found':
345
+          putMsgHTML("Not Found",new Date(),group,null,true);
346
+          break;
347
+        default:
348
+          putMsgHTML(error.childNodes.item(i).nodeName,new Date(),group,null,true);
349
+          break;
350
+        }
351
+      }
352
+    }
353
+  }
354
+}
355
+