OSDN Git Service

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