OSDN Git Service

05ccd2d09eaa1b09dae27f5e1481f50f8df03d14
[webchat/WebChat.git] / public / scripts / chatclient.js
1 $expires = 30;       //クッキーの保持日数\r
2 $afk_time = 1000 * 60 * 60;     //AFKと判定する時間(ミリ秒で指定すること)\r
3 $log_file_name = "logfile%d.txt";       //ログファイル名(%dはそのままにしておくこと)\r
4 $system_name = "system";        //システム発言を表す名前(chat.phpと同じにすること)\r
5 $entered_message = "%sが入室しました";\r
6 $quited_message = "%sが退室しました";\r
7 $system_msg_color ="#000000";\r
8 $profile_link = "/profile/detail?name=%n"       //プロフィールシステムへのリンク先(%nで名前を表す)\r
9 $fanble_message = "[color=blue]%s ファンブル![/color]";\r
10 $critical_message = "[color=red]%s クリティカル![/color]";\r
11 $send_message = "%sからの送信 %s";\r
12 $failed_connect_message = "接続に失敗しました";\r
13 $invaild_name_message = "名前を空欄にすることはできません";\r
14 $free_password1 = "最初に入室する人が自由にパスワードを設定できます";   //自由パスワードメッセージ1\r
15 $free_password2 = "この部屋は使用されています。パスワードを入力してください";       //自由パスワードメッセージ2\r
16 $fixed_password = "この部屋にはパスワードが設定されています";       //固定パスワードルーム\r
17 $hidden_log_to_rom = "この部屋ではROMできないようになっています";    //ROM禁止ルーム\r
18 $romcount_msg = "ROM(%d人)"    //ROMカウント\r
19 \r
20 //ここから先は変更しないでください\r
21 $prefix_filelist = "!";\r
22 $socket = new Object();\r
23 $names = {};\r
24 $roominfo = {};\r
25 $romcount = 0;\r
26 //ここまで\r
27 \r
28 $(document).ready(function(){\r
29         CreateColorList();\r
30 \r
31         //クッキーからフォームに読み込む\r
32         var temp = $.cookie("name");\r
33         if(temp)        document.enter_form.name.value = temp;\r
34         temp = $.cookie("color_index");\r
35         if(temp)        document.enter_form.color.selectedIndex = temp;\r
36 \r
37         $("input[name=sid]").click(sidEventListener);\r
38         $("input[name=enter]").click(enterEventListener);\r
39         $("input[name=quit]").click(quitEventListener);\r
40         $("input[name=help]").click(function(e){\r
41                 $("#help_frame").css("display","block");\r
42         });\r
43         $("input[name=close]").click(function(e){\r
44                 $("#help_frame").css("display","none");\r
45         });\r
46         $("input[name=openPastlog]").click(openPastlogEventListener);\r
47         $("#whisper_list_view").click(function(e){\r
48                 $("#whisper_list").toggle();\r
49         });\r
50         $("#decoration_list_view").click(function(e){\r
51                 $("#decoration_list").toggle();\r
52         });\r
53         document.chat_form.onsubmit = function(){return false;};\r
54         document.enter_form.onsubmit = function(){return false;};\r
55 \r
56         $socket = io.connect(location.hostname  + "/" + document.chat_form.rno.value + "?token="+ encodeURIComponent(document.chat_form._csrf.value));\r
57         $socket.on("error",getErrorMessage);\r
58         $socket.on("send roominfo",sendRoomInfoListerner);\r
59         $socket.on("send romcount",sendRomCountListerner);\r
60         $socket.on("connect",function(){\r
61                 $socket.on("req pastlog",pastLogEventListerner);\r
62                 $socket.on("req msg",getMessageEventListerner);\r
63                 $socket.on("req pastloglist",CreatePastLogList);\r
64         });\r
65 });\r
66 \r
67 function sendRomCountListerner(count)\r
68 {\r
69         $romcount = count;\r
70         createNameList();\r
71 }\r
72 \r
73 function sendRoomInfoListerner(info)\r
74 {\r
75         $roominfo = info;\r
76         var logflag = true;\r
77         var msg = "";\r
78         if(info.type == 1){\r
79                 if(info.IsOwned)\r
80                         msg = $free_password2;\r
81                 else\r
82                         msg = $free_password1;\r
83                 logflag = false;\r
84         }else if(info.type == 2){\r
85                 msg = $fixed_password;\r
86                 logflag = false;\r
87         }else if(info.type == 3){\r
88                 msg = $hidden_log_to_rom;\r
89                 logflag = false;\r
90         }\r
91         if(msg != "")\r
92                 $("#enter_message").append(msg);\r
93         if(logflag)\r
94         {\r
95                 $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
96                 getCurretLog();\r
97         }\r
98 }\r
99 \r
100 function CreateColorList()\r
101 {\r
102         var c = new Array("00","33","66","99","CC","FF");\r
103         for(var r = 0; r < c.length; r++){\r
104                 for(var g = 0; g < c.length; g++){\r
105                         for(var b = 0; b < c.length; b++){\r
106                                 var t = document.createElement("option");\r
107                                 t.value = "#"+c[r]+c[g]+c[b];\r
108                                 t.style.backgroundColor = "#"+c[r]+c[g]+c[b];\r
109                                 t.appendChild(document.createTextNode("#"+c[r]+c[g]+c[b]));\r
110                                 $("#enter_frame form select[name=color]").append(t);\r
111                         }\r
112                 }\r
113         }\r
114 }\r
115 \r
116 function CreatePastLogList(text)\r
117 {\r
118         $("#enter_frame form select[name=past]").empty();\r
119         var rno = document.chat_form.rno.value;\r
120         var file = text.split("\n");\r
121         for(var i = 0; i < file.length; i++)\r
122         {\r
123                 var logname = file[i];\r
124                 if(logname == "")\r
125                         continue;\r
126                 var element = document.createElement("option");\r
127                 element.value = logname;\r
128                 element.appendChild(document.createTextNode(logname));\r
129                 $("#enter_frame form select[name=past]").append(element);\r
130         }\r
131 }\r
132 \r
133 function getCurretLog()\r
134 {\r
135         var rno = document.chat_form.rno.value;\r
136         var url = sprintf($log_file_name,rno);\r
137         $socket.emit("get pastLog",url);\r
138 }\r
139 \r
140 function openPastlogEventListener()\r
141 {\r
142         $tid = 0;\r
143         $("#message").empty();\r
144         $("#namelist").empty();\r
145         var url = document.enter_form.past.options[document.enter_form.past.selectedIndex].value;\r
146         $socket.emit("get pastLog",url);\r
147 }\r
148 \r
149 function pastLogEventListerner(msg)\r
150 {\r
151         if(IsRomMode() && $roominfo.type != 0 && $roominfo.admin == false)\r
152                 return;\r
153         for(var i = 0; i < msg.length; i++)\r
154                 ParseMessage(msg[i]);\r
155         createNameList();\r
156 }\r
157 \r
158 function getMessageEventListerner(msg)\r
159 {\r
160         if(IsRomMode() && $roominfo.type != 0)\r
161                 return;\r
162         ParseMessage(msg);\r
163         createNameList();\r
164         if( document.getElementById("bell").checked == true && msg.name != document.enter_form.name.value)\r
165                 document.getElementById("NoticeSound").play();\r
166 }\r
167 \r
168 var $messageTag = null;\r
169 function ParseMessage(msg)\r
170 {\r
171         var util = new Util();\r
172         msg.message = util.htmlspecialchars(msg.message);\r
173         var childtag = $GetCommandParser.parse(msg);\r
174 \r
175         if(childtag == null)\r
176                 return;\r
177         if(typeof(childtag) == "string")\r
178                 childtag = $("<span/>").append(childtag);\r
179 \r
180         var trtag = $("<tr/>");\r
181         var namepart,msgpart;\r
182 \r
183         var color = $system_msg_color;\r
184 \r
185         var mailto = "";\r
186         var date = new Date(Date.parse(msg.date));\r
187         if(msg.name != $system_name)\r
188         {\r
189                 color = $names[msg.name].color;\r
190                 $names[msg.name].time = date.getTime();\r
191                 namepart = $("<a/>")\r
192                         .attr("href",GetNameLink(msg.name))\r
193                         .attr("target","_blank")\r
194                         .css("color",color)\r
195                         .text(util.htmlspecialchars(msg.name));\r
196         }else{\r
197                 namepart = $("<span/>").append(msg.name);\r
198         }\r
199         if(msg.ip != "")\r
200                 namepart.append("@" + msg.ip);\r
201         trtag.append($("<td/>").append(namepart));\r
202 \r
203         msgpart = childtag\r
204                 .append("(" + date.toFormat("YYYY/MM/DD HH:MI:SS") +")")\r
205                 .css("color",color);\r
206         trtag.append($("<td/>").append(msgpart));\r
207 \r
208         if($messageTag == null)\r
209                 $messageTag = $("#message");\r
210 \r
211         $messageTag.prepend(trtag);\r
212 }\r
213 \r
214 function GetNameLink(name)\r
215 {\r
216         var util = new Util();\r
217         if($names[name].mailto == "")\r
218                 return $profile_link.replace("%n",encodeURIComponent(name));\r
219         return "mailto:" + util.htmlspecialchars($names[name].mailto);\r
220 }\r
221 \r
222 function createNameList()\r
223 {\r
224         var date = new Date();\r
225         $("#whisper_list").empty();\r
226         $("#whisper_list").append("<ul></ul>");\r
227 \r
228         $("#namelist").empty();\r
229         $("#namelist").append("<ul></ul>");\r
230         $("#namelist > ul").append($("<li/>").append(sprintf($romcount_msg,$romcount)));\r
231 \r
232         for(var name in $names)\r
233         {\r
234                 var diff = date.getTime() - $names[name].time;\r
235                 if(diff >= $afk_time)\r
236                         continue;\r
237                 if(name != $system_name)\r
238                 {\r
239                         var atag = $("<a/>")\r
240                                 .attr("href",GetNameLink(name))\r
241                                 .attr("target","_blank")\r
242                                 .css("color",$names[name].color)\r
243                                 .text(name);\r
244                         var spantag = $("<span/>")\r
245                                 .click(clickNameEventListener)\r
246                                 .text(name);\r
247                         $("#whisper_list > ul").append($("<li/>").append(spantag));\r
248                         $("#namelist > ul").append($("<li/>").append(atag));\r
249                 }\r
250         }\r
251 }\r
252 \r
253 function clickNameEventListener(e)\r
254 {\r
255         document.chat_form.message.value = "/tell " + $(this).text();\r
256         document.chat_form.message.focus();\r
257 }\r
258 \r
259 function AddBold()\r
260 {\r
261         var text = GetSelection(document.chat_form.message);\r
262         ReplaceSelection(document.chat_form.message,sprintf("[b]%s[/b]",text));\r
263 }\r
264 \r
265 function AddItalic()\r
266 {\r
267         var text = GetSelection(document.chat_form.message);\r
268         ReplaceSelection(document.chat_form.message,sprintf("[i]%s[/i]",text));\r
269 }\r
270 \r
271 function AddStrike()\r
272 {\r
273         var text = GetSelection(document.chat_form.message);\r
274         ReplaceSelection(document.chat_form.message,sprintf("[s]%s[/s]",text));\r
275 }\r
276 \r
277 function AddFontSize(size)\r
278 {\r
279         var text = GetSelection(document.chat_form.message);\r
280         ReplaceSelection(document.chat_form.message,sprintf("[size=%f]%s[/size]",size,text));\r
281 }\r
282 \r
283 function GetSelection(element)\r
284 {\r
285     if (document.selection) {\r
286         element.focus();\r
287         var sel = document.selection.createRange();\r
288         return sel.text;\r
289     } else if (element.selectionStart || element.selectionStart === 0) {\r
290         var startPos = element.selectionStart;\r
291         var endPos = element.selectionEnd;\r
292         var scrollTop = element.scrollTop;\r
293         return element.value.substring(startPos,endPos);\r
294     }else{\r
295         return "";\r
296     }\r
297 }\r
298 \r
299 function ReplaceSelection(element,text)\r
300 {\r
301     if (document.selection) {\r
302         element.focus();\r
303         var sel = document.selection.createRange();\r
304         sel.text = text;\r
305     } else if (element.selectionStart || element.selectionStart === 0) {\r
306         var startPos = element.selectionStart;\r
307         var endPos = element.selectionEnd;\r
308         element.value = element.value.substring(0, startPos) + text + element.value.substring(endPos, element.value.length);\r
309     } else{\r
310        element.value = text;\r
311     }\r
312 }\r
313 \r
314 function enterEventListener()\r
315 {\r
316         if(document.enter_form.name.value == "")\r
317         {\r
318                 alert($invaild_name_message);\r
319                 return;\r
320         }\r
321 \r
322         $("#enter_frame").css("display","none");\r
323         $("#chat_frame").css("display","block");\r
324 \r
325         var color = document.enter_form.color.options[document.enter_form.color.selectedIndex].value;\r
326 \r
327         $.cookie("name",document.enter_form.name.value,{ expires: $expires });\r
328         $.cookie("color_index",document.enter_form.color.selectedIndex,{ expires: $expires });\r
329 \r
330         $socket.json.emit("join",{name:document.enter_form.name.value,color:color,mailto:document.enter_form.mailto.value,password:document.enter_form.password.value});\r
331 }\r
332 \r
333 function quitEventListener(){\r
334         $socket.json.emit("quit",{name:document.enter_form.name.value});\r
335 \r
336         $("#enter_frame").css("display","block");\r
337         $("#chat_frame").css("display","none");\r
338 \r
339         if($roominfo.type != 0 && $roominfo.admin == false)\r
340         {\r
341                 $("#message").empty();\r
342                 $("#namelist").empty();\r
343                 $names = {};\r
344                 createNameList();\r
345         }\r
346         else\r
347                 $socket.json.emit("get pastLogList",{rno:document.chat_form.rno.value});\r
348 }\r
349 \r
350 function sidEventListener(){\r
351         var msg = {\r
352                 name:document.enter_form.name.value,\r
353                 message:document.chat_form.message.value\r
354         };      \r
355         msg.message = $PostCommandParser.parse(msg);\r
356 \r
357         if(msg.message != null && msg.message != "")\r
358                 $socket.json.emit("send msg",msg);\r
359 \r
360         document.chat_form.message.value ="";\r
361 }\r
362 \r
363 function ReflushChatMessage(flag)\r
364 {\r
365         if(flag)        $("#message").empty();\r
366 }\r
367 \r
368 function getErrorMessage(text)\r
369 {\r
370         if(text == "")\r
371                 alert($failed_connect_message);\r
372         else\r
373                 alert(text);\r
374 }\r
375 \r
376 function IsRomMode()\r
377 {\r
378         return $("#chat_frame").css("display") == "none";\r
379 }\r
380 \r
381 //NameCollectionクラス\r
382 function GetNameCollection(text)\r
383 {\r
384         var output = new Array();\r
385         var list = text.split("\n");\r
386         for(var i = 0; i < list.length; i++)\r
387         {\r
388                 if(list[i] == "")\r
389                         continue;\r
390                 output.push(new NameElement(list[i]));\r
391         }\r
392         return output;\r
393 }\r
394 \r
395 //\r
396 // NamesElementsクラス\r
397 //\r
398 function NameElement(s)\r
399 {\r
400         this.data = s.split("<>");\r
401         this.getName = function()\r
402         {\r
403                 return this.data[0];\r
404         }\r
405 }\r
406 \r
407 // NameInfoクラス\r
408 function CreateNameInfo(time,color,mailto)\r
409 {\r
410         var result = { time:time,color:color,mailto:""};\r
411         if(typeof(mailto) != "undifined")\r
412                 result.mailto = mailto;\r
413         return result;\r
414 }\r
415 \r
416 //\r
417 // Utilクラス\r
418 //\r
419 function Util()\r
420 {\r
421         this.get_random_number = function (a,b)\r
422         {\r
423                 return Math.floor(a + Math.random() * b);\r
424         }\r
425 \r
426         this.htmlspecialchars = function (ch) {\r
427                 ch = ch.replace(/&/g,"&amp;") ;\r
428                 ch = ch.replace(/"/g,"&quot;") ;\r
429                 ch = ch.replace(/'/g,"&#039;") ;\r
430                 ch = ch.replace(/</g,"&lt;") ;\r
431                 ch = ch.replace(/>/g,"&gt;") ;\r
432           return ch ;\r
433         }\r
434 \r
435 }\r