From b2bc222a31514ec26458ea3ab3ee1de8e1ab8698 Mon Sep 17 00:00:00 2001 From: ajaximrpg Date: Wed, 11 Dec 2013 12:26:49 -0800 Subject: [PATCH] Initial commit --- .project | 17 + CONTRIB | 65 + INSTALL | 25 + LICENSE | 10 + README | 19 + README.md | 62 +- UPDATES | 250 +++ admin.php | 177 ++ ajax_im.php | 893 ++++++++ config-sample.php | 21 + index.html | 153 ++ install.php | 237 +++ is_online/README | 16 + is_online/images/away.gif | Bin 0 -> 829 bytes is_online/images/offline.gif | Bin 0 -> 149 bytes is_online/images/online.gif | Bin 0 -> 149 bytes is_online/is_online.php | 41 + js/admin.js | 457 +++++ js/ajax_im.js | 479 +++++ js/browser.js | 47 + js/buddylist.js | 428 ++++ js/buttonctl.js | 76 + js/chat.js | 362 ++++ js/config.js | 110 + js/context.js | 146 ++ js/dialogs.js | 405 ++++ js/effects.js | 11 + js/im.basic.js | 584 ++++++ js/im.js | 90 + js/languages.js | 196 ++ js/popup.js | 79 + js/profile.js | 71 + js/prototype.js | 8 + js/sm2.js | 12 + js/status.js | 91 + js/system.js | 611 ++++++ js/utils.js | 309 +++ js/window.js | 1805 +++++++++++++++++ json.php | 432 ++++ languages/brazilian_portuguese/lang.js | 145 ++ languages/dutch/lang.js | 145 ++ languages/english/lang.js | 184 ++ languages/english/lingo.js | 1093 ++++++++++ languages/french/lang.js | 145 ++ languages/german/lang.js | 146 ++ languages/italian/lang.js | 146 ++ languages/japanese/lang.js | 143 ++ languages/korean/lang.js | 145 ++ languages/persian_farsi/lang.js | 149 ++ languages/russian/lang.js | 143 ++ languages/simplified_chinese/lang.js | 144 ++ languages/spanish/lang.js | 145 ++ languages/vietnamese/lang.js | 144 ++ php.ini.sample | 16 + popup.html | 207 ++ soundmanager2.swf | Bin 0 -> 2200 bytes sounds/msg_in.mp3 | Bin 0 -> 6209 bytes sounds/msg_out.mp3 | Bin 0 -> 3905 bytes test-uploads.php | 85 + themes/dark/alert/bottom-left-c.gif | Bin 0 -> 60 bytes themes/dark/alert/bottom-middle.gif | Bin 0 -> 50 bytes themes/dark/alert/bottom-right-c.gif | Bin 0 -> 61 bytes themes/dark/alert/button-close-focus.gif | Bin 0 -> 699 bytes themes/dark/alert/button-max-focus.gif | Bin 0 -> 765 bytes themes/dark/alert/button-min-focus.gif | Bin 0 -> 472 bytes themes/dark/alert/frame-left.gif | Bin 0 -> 64 bytes themes/dark/alert/frame-right.gif | Bin 0 -> 64 bytes themes/dark/alert/left-top.gif | Bin 0 -> 171 bytes themes/dark/alert/right-top.gif | Bin 0 -> 168 bytes themes/dark/alert/top-middle.gif | Bin 0 -> 97 bytes themes/dark/away.png | Bin 0 -> 146 bytes themes/dark/blocked.png | Bin 0 -> 928 bytes themes/dark/emoticons/00.png | Bin 0 -> 319 bytes themes/dark/emoticons/09 - ooh.png | Bin 0 -> 383 bytes themes/dark/emoticons/11 - crazy.png | Bin 0 -> 426 bytes themes/dark/emoticons/13 - geek.png | Bin 0 -> 373 bytes themes/dark/emoticons/14 - devil.png | Bin 0 -> 522 bytes themes/dark/emoticons/15 - doh.png | Bin 0 -> 345 bytes themes/dark/emoticons/16 - XD.png | Bin 0 -> 397 bytes themes/dark/emoticons/18 - brb.png | Bin 0 -> 264 bytes themes/dark/emoticons/Emoticons.txt | 3 + themes/dark/emoticons/angry.png | Bin 0 -> 370 bytes themes/dark/emoticons/cool.png | Bin 0 -> 362 bytes themes/dark/emoticons/cry.png | Bin 0 -> 458 bytes themes/dark/emoticons/embarassed.png | Bin 0 -> 400 bytes themes/dark/emoticons/emoticons.html | 21 + themes/dark/emoticons/emoticons.js | 1 + themes/dark/emoticons/grin.png | Bin 0 -> 383 bytes themes/dark/emoticons/heart.png | Bin 0 -> 316 bytes themes/dark/emoticons/mini_smile.gif | Bin 0 -> 882 bytes themes/dark/emoticons/sad.png | Bin 0 -> 370 bytes themes/dark/emoticons/serious.png | Bin 0 -> 339 bytes themes/dark/emoticons/silly.png | Bin 0 -> 409 bytes themes/dark/emoticons/smile.png | Bin 0 -> 363 bytes themes/dark/emoticons/tongue.png | Bin 0 -> 415 bytes themes/dark/emoticons/wink.png | Bin 0 -> 367 bytes themes/dark/logo.png | Bin 0 -> 4055 bytes themes/dark/modal/background.png | Bin 0 -> 679 bytes themes/dark/noicon.gif | Bin 0 -> 1453 bytes themes/dark/offline.png | Bin 0 -> 146 bytes themes/dark/online.png | Bin 0 -> 146 bytes themes/dark/style.css | 977 +++++++++ themes/dark/window/addbuddy.png | Bin 0 -> 172 bytes themes/dark/window/addbuddy_down.png | Bin 0 -> 172 bytes themes/dark/window/addbuddy_hover.png | Bin 0 -> 172 bytes themes/dark/window/admin.png | Bin 0 -> 341 bytes themes/dark/window/arrow.png | Bin 0 -> 3637 bytes themes/dark/window/arrow_up.png | Bin 0 -> 3632 bytes themes/dark/window/audio_off.png | Bin 0 -> 439 bytes themes/dark/window/audio_on.png | Bin 0 -> 194 bytes themes/dark/window/block.png | Bin 0 -> 420 bytes themes/dark/window/block_down.png | Bin 0 -> 419 bytes themes/dark/window/block_hover.png | Bin 0 -> 419 bytes themes/dark/window/bold_off.png | Bin 0 -> 263 bytes themes/dark/window/bold_off_hover.png | Bin 0 -> 264 bytes themes/dark/window/bold_on.png | Bin 0 -> 263 bytes themes/dark/window/bold_on_hover.png | Bin 0 -> 264 bytes themes/dark/window/bottom_left.png | Bin 0 -> 898 bytes themes/dark/window/bottom_mid.png | Bin 0 -> 896 bytes themes/dark/window/bottom_right.png | Bin 0 -> 900 bytes themes/dark/window/bottom_right_resize.png | Bin 0 -> 913 bytes themes/dark/window/button_down.png | Bin 0 -> 179 bytes themes/dark/window/button_hover.png | Bin 0 -> 179 bytes themes/dark/window/button_normal.png | Bin 0 -> 179 bytes themes/dark/window/center_left.png | Bin 0 -> 125 bytes themes/dark/window/center_right.png | Bin 0 -> 125 bytes themes/dark/window/changepassword.png | Bin 0 -> 285 bytes themes/dark/window/changepassword_down.png | Bin 0 -> 286 bytes themes/dark/window/changepassword_hover.png | Bin 0 -> 285 bytes themes/dark/window/close.png | Bin 0 -> 172 bytes themes/dark/window/close_inactive.png | Bin 0 -> 141 bytes themes/dark/window/detach.png | Bin 0 -> 173 bytes themes/dark/window/detach_inactive.png | Bin 0 -> 141 bytes themes/dark/window/imanyone.png | Bin 0 -> 188 bytes themes/dark/window/imanyone_down.png | Bin 0 -> 188 bytes themes/dark/window/imanyone_hover.png | Bin 0 -> 188 bytes themes/dark/window/italic_off.png | Bin 0 -> 236 bytes themes/dark/window/italic_off_hover.png | Bin 0 -> 236 bytes themes/dark/window/italic_on.png | Bin 0 -> 236 bytes themes/dark/window/italic_on_hover.png | Bin 0 -> 236 bytes themes/dark/window/joinroom.png | Bin 0 -> 532 bytes themes/dark/window/joinroom_down.png | Bin 0 -> 532 bytes themes/dark/window/joinroom_hover.png | Bin 0 -> 532 bytes themes/dark/window/maximize.png | Bin 0 -> 159 bytes themes/dark/window/maximize_inactive.png | Bin 0 -> 141 bytes themes/dark/window/minimize.png | Bin 0 -> 151 bytes themes/dark/window/minimize_inactive.png | Bin 0 -> 141 bytes themes/dark/window/removebuddy.png | Bin 0 -> 167 bytes themes/dark/window/removebuddy_down.png | Bin 0 -> 167 bytes themes/dark/window/removebuddy_hover.png | Bin 0 -> 167 bytes themes/dark/window/signoff.png | Bin 0 -> 335 bytes themes/dark/window/signoff_down.png | Bin 0 -> 335 bytes themes/dark/window/signoff_hover.png | Bin 0 -> 335 bytes themes/dark/window/sizer.png | Bin 0 -> 913 bytes themes/dark/window/smallx.png | Bin 0 -> 234 bytes themes/dark/window/smallx_hover.png | Bin 0 -> 230 bytes themes/dark/window/top_left.png | Bin 0 -> 256 bytes themes/dark/window/top_left_inactive.png | Bin 0 -> 195 bytes themes/dark/window/top_mid.png | Bin 0 -> 232 bytes themes/dark/window/top_mid_inactive.png | Bin 0 -> 188 bytes themes/dark/window/top_right.png | Bin 0 -> 257 bytes themes/dark/window/top_right_inactive.png | Bin 0 -> 195 bytes themes/dark/window/underline_off.png | Bin 0 -> 252 bytes themes/dark/window/underline_off_hover.png | Bin 0 -> 252 bytes themes/dark/window/underline_on.png | Bin 0 -> 252 bytes themes/dark/window/underline_on_hover.png | Bin 0 -> 252 bytes themes/default/alert/bottom-left-c.gif | Bin 0 -> 60 bytes themes/default/alert/bottom-middle.gif | Bin 0 -> 50 bytes themes/default/alert/bottom-right-c.gif | Bin 0 -> 61 bytes themes/default/alert/button-close-focus.gif | Bin 0 -> 699 bytes themes/default/alert/button-max-focus.gif | Bin 0 -> 765 bytes themes/default/alert/button-min-focus.gif | Bin 0 -> 472 bytes themes/default/alert/frame-left.gif | Bin 0 -> 64 bytes themes/default/alert/frame-right.gif | Bin 0 -> 64 bytes themes/default/alert/left-top.gif | Bin 0 -> 171 bytes themes/default/alert/right-top.gif | Bin 0 -> 168 bytes themes/default/alert/top-middle.gif | Bin 0 -> 97 bytes themes/default/away.png | Bin 0 -> 1077 bytes themes/default/blocked.png | Bin 0 -> 475 bytes themes/default/emoticons/14_pleeaase.gif | Bin 0 -> 1053 bytes themes/default/emoticons/Emoticons.txt | 3 + themes/default/emoticons/angel.gif | Bin 0 -> 1110 bytes themes/default/emoticons/angry.gif | Bin 0 -> 1086 bytes themes/default/emoticons/annoyed.gif | Bin 0 -> 1073 bytes themes/default/emoticons/confused.gif | Bin 0 -> 1068 bytes themes/default/emoticons/cool.gif | Bin 0 -> 1089 bytes themes/default/emoticons/cry.gif | Bin 0 -> 1094 bytes themes/default/emoticons/devil.gif | Bin 0 -> 1122 bytes themes/default/emoticons/embarassed.gif | Bin 0 -> 1080 bytes themes/default/emoticons/emoticons.html | 25 + themes/default/emoticons/emoticons.js | 1 + themes/default/emoticons/grin.gif | Bin 0 -> 1072 bytes themes/default/emoticons/heart.gif | Bin 0 -> 1071 bytes themes/default/emoticons/heartbroken.gif | Bin 0 -> 1040 bytes themes/default/emoticons/love.gif | Bin 0 -> 1112 bytes themes/default/emoticons/mini_smile.gif | Bin 0 -> 882 bytes themes/default/emoticons/ninja.gif | Bin 0 -> 1083 bytes themes/default/emoticons/phone.gif | Bin 0 -> 670 bytes themes/default/emoticons/sad.gif | Bin 0 -> 1083 bytes themes/default/emoticons/serious.gif | Bin 0 -> 1068 bytes themes/default/emoticons/sick.gif | Bin 0 -> 1091 bytes themes/default/emoticons/smile.gif | Bin 0 -> 1078 bytes themes/default/emoticons/surprised.gif | Bin 0 -> 1073 bytes themes/default/emoticons/tongue.gif | Bin 0 -> 1100 bytes themes/default/emoticons/wink.gif | Bin 0 -> 1087 bytes themes/default/logo.jpg | Bin 0 -> 8270 bytes themes/default/logo.png | Bin 0 -> 11036 bytes themes/default/modal/background.png | Bin 0 -> 3414 bytes themes/default/modal/background_orig.jpg | Bin 0 -> 4486 bytes themes/default/noicon.gif | Bin 0 -> 1453 bytes themes/default/offline.png | Bin 0 -> 371 bytes themes/default/online.png | Bin 0 -> 371 bytes themes/default/style.css | 955 +++++++++ themes/default/window/addbuddy.png | Bin 0 -> 1137 bytes themes/default/window/addbuddy_down.png | Bin 0 -> 615 bytes themes/default/window/addbuddy_hover.png | Bin 0 -> 1026 bytes themes/default/window/arrow.png | Bin 0 -> 240 bytes themes/default/window/arrow_up.png | Bin 0 -> 241 bytes themes/default/window/audio_off.png | Bin 0 -> 1850 bytes themes/default/window/audio_on.png | Bin 0 -> 1277 bytes themes/default/window/away.png | Bin 0 -> 1077 bytes themes/default/window/block.png | Bin 0 -> 1786 bytes themes/default/window/block_down.png | Bin 0 -> 1633 bytes themes/default/window/block_hover.png | Bin 0 -> 1784 bytes themes/default/window/bold_off.png | Bin 0 -> 282 bytes themes/default/window/bold_off_hover.png | Bin 0 -> 282 bytes themes/default/window/bold_on.png | Bin 0 -> 294 bytes themes/default/window/bold_on_hover.png | Bin 0 -> 294 bytes themes/default/window/bottom_left.gif | Bin 0 -> 187 bytes themes/default/window/bottom_mid.gif | Bin 0 -> 68 bytes themes/default/window/bottom_right.gif | Bin 0 -> 187 bytes themes/default/window/bottom_right_resize.gif | Bin 0 -> 201 bytes themes/default/window/button_down.png | Bin 0 -> 1106 bytes themes/default/window/button_hover.png | Bin 0 -> 1180 bytes themes/default/window/button_normal.png | Bin 0 -> 1181 bytes themes/default/window/center_left.gif | Bin 0 -> 52 bytes themes/default/window/center_right.gif | Bin 0 -> 49 bytes themes/default/window/changepassword.png | Bin 0 -> 1736 bytes themes/default/window/changepassword_down.png | Bin 0 -> 1112 bytes .../default/window/changepassword_hover.png | Bin 0 -> 1518 bytes themes/default/window/close.gif | Bin 0 -> 372 bytes themes/default/window/close_inactive.gif | Bin 0 -> 976 bytes themes/default/window/detach.gif | Bin 0 -> 376 bytes themes/default/window/detach_inactive.gif | Bin 0 -> 980 bytes themes/default/window/hideoffline.png | Bin 0 -> 1327 bytes themes/default/window/imanyone.png | Bin 0 -> 1318 bytes themes/default/window/imanyone_down.png | Bin 0 -> 830 bytes themes/default/window/imanyone_hover.png | Bin 0 -> 1156 bytes themes/default/window/italic_off.png | Bin 0 -> 251 bytes themes/default/window/italic_off_hover.png | Bin 0 -> 251 bytes themes/default/window/italic_on.png | Bin 0 -> 264 bytes themes/default/window/italic_on_hover.png | Bin 0 -> 264 bytes themes/default/window/joinroom.png | Bin 0 -> 1866 bytes themes/default/window/joinroom_down.png | Bin 0 -> 1416 bytes themes/default/window/joinroom_hover.png | Bin 0 -> 1633 bytes themes/default/window/maximize.gif | Bin 0 -> 372 bytes themes/default/window/maximize_inactive.gif | Bin 0 -> 976 bytes themes/default/window/minimize.gif | Bin 0 -> 362 bytes themes/default/window/minimize_inactive.gif | Bin 0 -> 964 bytes themes/default/window/offline.png | Bin 0 -> 371 bytes themes/default/window/online.png | Bin 0 -> 371 bytes themes/default/window/overlay.png | Bin 0 -> 175 bytes themes/default/window/removebuddy.png | Bin 0 -> 725 bytes themes/default/window/removebuddy_down.png | Bin 0 -> 396 bytes themes/default/window/removebuddy_hover.png | Bin 0 -> 640 bytes themes/default/window/resize.gif | Bin 0 -> 138 bytes themes/default/window/signoff.png | Bin 0 -> 1306 bytes themes/default/window/signoff_down.png | Bin 0 -> 1012 bytes themes/default/window/signoff_hover.png | Bin 0 -> 1308 bytes themes/default/window/sizer.gif | Bin 0 -> 201 bytes themes/default/window/smallx.png | Bin 0 -> 234 bytes themes/default/window/smallx_hover.png | Bin 0 -> 230 bytes themes/default/window/top_left.gif | Bin 0 -> 236 bytes themes/default/window/top_left_inactive.gif | Bin 0 -> 940 bytes themes/default/window/top_mid.gif | Bin 0 -> 150 bytes themes/default/window/top_mid_inactive.gif | Bin 0 -> 832 bytes themes/default/window/top_right.gif | Bin 0 -> 238 bytes themes/default/window/top_right_inactive.gif | Bin 0 -> 942 bytes themes/default/window/underline_off.png | Bin 0 -> 272 bytes themes/default/window/underline_off_hover.png | Bin 0 -> 272 bytes themes/default/window/underline_on.png | Bin 0 -> 285 bytes themes/default/window/underline_on_hover.png | Bin 0 -> 285 bytes update.php | 153 ++ 283 files changed, 14256 insertions(+), 3 deletions(-) create mode 100644 .project create mode 100644 CONTRIB create mode 100644 INSTALL create mode 100644 LICENSE create mode 100644 README create mode 100644 UPDATES create mode 100644 admin.php create mode 100644 ajax_im.php create mode 100644 config-sample.php create mode 100644 index.html create mode 100644 install.php create mode 100644 is_online/README create mode 100644 is_online/images/away.gif create mode 100644 is_online/images/offline.gif create mode 100644 is_online/images/online.gif create mode 100644 is_online/is_online.php create mode 100644 js/admin.js create mode 100644 js/ajax_im.js create mode 100644 js/browser.js create mode 100644 js/buddylist.js create mode 100644 js/buttonctl.js create mode 100644 js/chat.js create mode 100644 js/config.js create mode 100644 js/context.js create mode 100644 js/dialogs.js create mode 100644 js/effects.js create mode 100644 js/im.basic.js create mode 100644 js/im.js create mode 100644 js/languages.js create mode 100644 js/popup.js create mode 100644 js/profile.js create mode 100644 js/prototype.js create mode 100644 js/sm2.js create mode 100644 js/status.js create mode 100644 js/system.js create mode 100644 js/utils.js create mode 100644 js/window.js create mode 100644 json.php create mode 100644 languages/brazilian_portuguese/lang.js create mode 100644 languages/dutch/lang.js create mode 100644 languages/english/lang.js create mode 100644 languages/english/lingo.js create mode 100644 languages/french/lang.js create mode 100644 languages/german/lang.js create mode 100644 languages/italian/lang.js create mode 100644 languages/japanese/lang.js create mode 100644 languages/korean/lang.js create mode 100644 languages/persian_farsi/lang.js create mode 100644 languages/russian/lang.js create mode 100644 languages/simplified_chinese/lang.js create mode 100644 languages/spanish/lang.js create mode 100644 languages/vietnamese/lang.js create mode 100644 php.ini.sample create mode 100644 popup.html create mode 100644 soundmanager2.swf create mode 100644 sounds/msg_in.mp3 create mode 100644 sounds/msg_out.mp3 create mode 100644 test-uploads.php create mode 100644 themes/dark/alert/bottom-left-c.gif create mode 100644 themes/dark/alert/bottom-middle.gif create mode 100644 themes/dark/alert/bottom-right-c.gif create mode 100644 themes/dark/alert/button-close-focus.gif create mode 100644 themes/dark/alert/button-max-focus.gif create mode 100644 themes/dark/alert/button-min-focus.gif create mode 100644 themes/dark/alert/frame-left.gif create mode 100644 themes/dark/alert/frame-right.gif create mode 100644 themes/dark/alert/left-top.gif create mode 100644 themes/dark/alert/right-top.gif create mode 100644 themes/dark/alert/top-middle.gif create mode 100644 themes/dark/away.png create mode 100644 themes/dark/blocked.png create mode 100644 themes/dark/emoticons/00.png create mode 100644 themes/dark/emoticons/09 - ooh.png create mode 100644 themes/dark/emoticons/11 - crazy.png create mode 100644 themes/dark/emoticons/13 - geek.png create mode 100644 themes/dark/emoticons/14 - devil.png create mode 100644 themes/dark/emoticons/15 - doh.png create mode 100644 themes/dark/emoticons/16 - XD.png create mode 100644 themes/dark/emoticons/18 - brb.png create mode 100644 themes/dark/emoticons/Emoticons.txt create mode 100644 themes/dark/emoticons/angry.png create mode 100644 themes/dark/emoticons/cool.png create mode 100644 themes/dark/emoticons/cry.png create mode 100644 themes/dark/emoticons/embarassed.png create mode 100644 themes/dark/emoticons/emoticons.html create mode 100644 themes/dark/emoticons/emoticons.js create mode 100644 themes/dark/emoticons/grin.png create mode 100644 themes/dark/emoticons/heart.png create mode 100644 themes/dark/emoticons/mini_smile.gif create mode 100644 themes/dark/emoticons/sad.png create mode 100644 themes/dark/emoticons/serious.png create mode 100644 themes/dark/emoticons/silly.png create mode 100644 themes/dark/emoticons/smile.png create mode 100644 themes/dark/emoticons/tongue.png create mode 100644 themes/dark/emoticons/wink.png create mode 100644 themes/dark/logo.png create mode 100644 themes/dark/modal/background.png create mode 100644 themes/dark/noicon.gif create mode 100644 themes/dark/offline.png create mode 100644 themes/dark/online.png create mode 100644 themes/dark/style.css create mode 100644 themes/dark/window/addbuddy.png create mode 100644 themes/dark/window/addbuddy_down.png create mode 100644 themes/dark/window/addbuddy_hover.png create mode 100644 themes/dark/window/admin.png create mode 100644 themes/dark/window/arrow.png create mode 100644 themes/dark/window/arrow_up.png create mode 100644 themes/dark/window/audio_off.png create mode 100644 themes/dark/window/audio_on.png create mode 100644 themes/dark/window/block.png create mode 100644 themes/dark/window/block_down.png create mode 100644 themes/dark/window/block_hover.png create mode 100644 themes/dark/window/bold_off.png create mode 100644 themes/dark/window/bold_off_hover.png create mode 100644 themes/dark/window/bold_on.png create mode 100644 themes/dark/window/bold_on_hover.png create mode 100644 themes/dark/window/bottom_left.png create mode 100644 themes/dark/window/bottom_mid.png create mode 100644 themes/dark/window/bottom_right.png create mode 100644 themes/dark/window/bottom_right_resize.png create mode 100644 themes/dark/window/button_down.png create mode 100644 themes/dark/window/button_hover.png create mode 100644 themes/dark/window/button_normal.png create mode 100644 themes/dark/window/center_left.png create mode 100644 themes/dark/window/center_right.png create mode 100644 themes/dark/window/changepassword.png create mode 100644 themes/dark/window/changepassword_down.png create mode 100644 themes/dark/window/changepassword_hover.png create mode 100644 themes/dark/window/close.png create mode 100644 themes/dark/window/close_inactive.png create mode 100644 themes/dark/window/detach.png create mode 100644 themes/dark/window/detach_inactive.png create mode 100644 themes/dark/window/imanyone.png create mode 100644 themes/dark/window/imanyone_down.png create mode 100644 themes/dark/window/imanyone_hover.png create mode 100644 themes/dark/window/italic_off.png create mode 100644 themes/dark/window/italic_off_hover.png create mode 100644 themes/dark/window/italic_on.png create mode 100644 themes/dark/window/italic_on_hover.png create mode 100644 themes/dark/window/joinroom.png create mode 100644 themes/dark/window/joinroom_down.png create mode 100644 themes/dark/window/joinroom_hover.png create mode 100644 themes/dark/window/maximize.png create mode 100644 themes/dark/window/maximize_inactive.png create mode 100644 themes/dark/window/minimize.png create mode 100644 themes/dark/window/minimize_inactive.png create mode 100644 themes/dark/window/removebuddy.png create mode 100644 themes/dark/window/removebuddy_down.png create mode 100644 themes/dark/window/removebuddy_hover.png create mode 100644 themes/dark/window/signoff.png create mode 100644 themes/dark/window/signoff_down.png create mode 100644 themes/dark/window/signoff_hover.png create mode 100644 themes/dark/window/sizer.png create mode 100644 themes/dark/window/smallx.png create mode 100644 themes/dark/window/smallx_hover.png create mode 100644 themes/dark/window/top_left.png create mode 100644 themes/dark/window/top_left_inactive.png create mode 100644 themes/dark/window/top_mid.png create mode 100644 themes/dark/window/top_mid_inactive.png create mode 100644 themes/dark/window/top_right.png create mode 100644 themes/dark/window/top_right_inactive.png create mode 100644 themes/dark/window/underline_off.png create mode 100644 themes/dark/window/underline_off_hover.png create mode 100644 themes/dark/window/underline_on.png create mode 100644 themes/dark/window/underline_on_hover.png create mode 100644 themes/default/alert/bottom-left-c.gif create mode 100644 themes/default/alert/bottom-middle.gif create mode 100644 themes/default/alert/bottom-right-c.gif create mode 100644 themes/default/alert/button-close-focus.gif create mode 100644 themes/default/alert/button-max-focus.gif create mode 100644 themes/default/alert/button-min-focus.gif create mode 100644 themes/default/alert/frame-left.gif create mode 100644 themes/default/alert/frame-right.gif create mode 100644 themes/default/alert/left-top.gif create mode 100644 themes/default/alert/right-top.gif create mode 100644 themes/default/alert/top-middle.gif create mode 100644 themes/default/away.png create mode 100644 themes/default/blocked.png create mode 100644 themes/default/emoticons/14_pleeaase.gif create mode 100644 themes/default/emoticons/Emoticons.txt create mode 100644 themes/default/emoticons/angel.gif create mode 100644 themes/default/emoticons/angry.gif create mode 100644 themes/default/emoticons/annoyed.gif create mode 100644 themes/default/emoticons/confused.gif create mode 100644 themes/default/emoticons/cool.gif create mode 100644 themes/default/emoticons/cry.gif create mode 100644 themes/default/emoticons/devil.gif create mode 100644 themes/default/emoticons/embarassed.gif create mode 100644 themes/default/emoticons/emoticons.html create mode 100644 themes/default/emoticons/emoticons.js create mode 100644 themes/default/emoticons/grin.gif create mode 100644 themes/default/emoticons/heart.gif create mode 100644 themes/default/emoticons/heartbroken.gif create mode 100644 themes/default/emoticons/love.gif create mode 100644 themes/default/emoticons/mini_smile.gif create mode 100644 themes/default/emoticons/ninja.gif create mode 100644 themes/default/emoticons/phone.gif create mode 100644 themes/default/emoticons/sad.gif create mode 100644 themes/default/emoticons/serious.gif create mode 100644 themes/default/emoticons/sick.gif create mode 100644 themes/default/emoticons/smile.gif create mode 100644 themes/default/emoticons/surprised.gif create mode 100644 themes/default/emoticons/tongue.gif create mode 100644 themes/default/emoticons/wink.gif create mode 100644 themes/default/logo.jpg create mode 100644 themes/default/logo.png create mode 100644 themes/default/modal/background.png create mode 100644 themes/default/modal/background_orig.jpg create mode 100644 themes/default/noicon.gif create mode 100644 themes/default/offline.png create mode 100644 themes/default/online.png create mode 100644 themes/default/style.css create mode 100644 themes/default/window/addbuddy.png create mode 100644 themes/default/window/addbuddy_down.png create mode 100644 themes/default/window/addbuddy_hover.png create mode 100644 themes/default/window/arrow.png create mode 100644 themes/default/window/arrow_up.png create mode 100644 themes/default/window/audio_off.png create mode 100644 themes/default/window/audio_on.png create mode 100644 themes/default/window/away.png create mode 100644 themes/default/window/block.png create mode 100644 themes/default/window/block_down.png create mode 100644 themes/default/window/block_hover.png create mode 100644 themes/default/window/bold_off.png create mode 100644 themes/default/window/bold_off_hover.png create mode 100644 themes/default/window/bold_on.png create mode 100644 themes/default/window/bold_on_hover.png create mode 100644 themes/default/window/bottom_left.gif create mode 100644 themes/default/window/bottom_mid.gif create mode 100644 themes/default/window/bottom_right.gif create mode 100644 themes/default/window/bottom_right_resize.gif create mode 100644 themes/default/window/button_down.png create mode 100644 themes/default/window/button_hover.png create mode 100644 themes/default/window/button_normal.png create mode 100644 themes/default/window/center_left.gif create mode 100644 themes/default/window/center_right.gif create mode 100644 themes/default/window/changepassword.png create mode 100644 themes/default/window/changepassword_down.png create mode 100644 themes/default/window/changepassword_hover.png create mode 100644 themes/default/window/close.gif create mode 100644 themes/default/window/close_inactive.gif create mode 100644 themes/default/window/detach.gif create mode 100644 themes/default/window/detach_inactive.gif create mode 100644 themes/default/window/hideoffline.png create mode 100644 themes/default/window/imanyone.png create mode 100644 themes/default/window/imanyone_down.png create mode 100644 themes/default/window/imanyone_hover.png create mode 100644 themes/default/window/italic_off.png create mode 100644 themes/default/window/italic_off_hover.png create mode 100644 themes/default/window/italic_on.png create mode 100644 themes/default/window/italic_on_hover.png create mode 100644 themes/default/window/joinroom.png create mode 100644 themes/default/window/joinroom_down.png create mode 100644 themes/default/window/joinroom_hover.png create mode 100644 themes/default/window/maximize.gif create mode 100644 themes/default/window/maximize_inactive.gif create mode 100644 themes/default/window/minimize.gif create mode 100644 themes/default/window/minimize_inactive.gif create mode 100644 themes/default/window/offline.png create mode 100644 themes/default/window/online.png create mode 100644 themes/default/window/overlay.png create mode 100644 themes/default/window/removebuddy.png create mode 100644 themes/default/window/removebuddy_down.png create mode 100644 themes/default/window/removebuddy_hover.png create mode 100644 themes/default/window/resize.gif create mode 100644 themes/default/window/signoff.png create mode 100644 themes/default/window/signoff_down.png create mode 100644 themes/default/window/signoff_hover.png create mode 100644 themes/default/window/sizer.gif create mode 100644 themes/default/window/smallx.png create mode 100644 themes/default/window/smallx_hover.png create mode 100644 themes/default/window/top_left.gif create mode 100644 themes/default/window/top_left_inactive.gif create mode 100644 themes/default/window/top_mid.gif create mode 100644 themes/default/window/top_mid_inactive.gif create mode 100644 themes/default/window/top_right.gif create mode 100644 themes/default/window/top_right_inactive.gif create mode 100644 themes/default/window/underline_off.png create mode 100644 themes/default/window/underline_off_hover.png create mode 100644 themes/default/window/underline_on.png create mode 100644 themes/default/window/underline_on_hover.png create mode 100644 update.php diff --git a/.project b/.project new file mode 100644 index 0000000..7518269 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Ajax IM 3.41 + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/CONTRIB b/CONTRIB new file mode 100644 index 0000000..7f22243 --- /dev/null +++ b/CONTRIB @@ -0,0 +1,65 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + ++---------------------------------------------------------------------+ +| Contributions | ++---------------------------------------------------------------------+ +|== Source Code ======================================================| +| | +| * Joshua Gross | +| Started the AjaxIM project. Created all releases up to 3.3 alone! | +| - Framework | +| - Everything not listed | +| | +| * Benjamin Hutchins | +| Joined the AjaxIM project at version 3.3 and helped give the | +| entire project a push. | +| - Auto away | +| - Buddy profiles | +| - Buddy icons | +| - Lingo replacement | +| - Context/RightClick menus | +| - Status changes in chats | +| - Update.php | +| - Various other contributions | +| | +| | +|== Language Packs ===================================================| +| | +| Contributor Language | +| ------------------------------------------------------------------- | +| * Hilton Perantunes Brazilian Portuguese | +| * JulesJ (http://www.julesj.nl/blog/) Dutch | +| * Léonard Beaud French | +| * YNStudios.com German | +| * Matteo Cisilino (http://www.sitonerd.com) Italian | +| * Mayu Shimizu (http://www.myudesign.com) Japanese | +| * Taekyuni (http://www.gaerae.com) Korean | +| * Behrouz Pooladrag (http://www.iflashlord.com) Persian (Farsi) | +| * Grigoriy Korolev Russian | +| * ??? Simplified Chinese | +| * Victor Ortega Spanish | +| * Meo Meo? Vietnamese | +| * Feyzullah Ceylan (http://www.gencsinsen.com) Turkish | +| * ??? Arabic | +| * ??? Bulgarian | +| * Pedro Morgado Portugal Portuguese | +| * Steven Yeh Traditional Chinese | +| | +| | +|== Libraries ========================================================| +| | +| Contributor Library | +| ------------------------------------------------------------------- | +| * Sam Stephenson Prototype | +| * Sébastien Gruhier Prototype Window Class | +| * Scott Schiller SoundManager2 | +| * Dan Webb Prototype DomReady | +| * Paul Johnston MD5 Algorithms | +| | ++---------------------------------------------------------------------+ diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..38697aa --- /dev/null +++ b/INSTALL @@ -0,0 +1,25 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + +Installation +----------------------------------- +1. Configure SQL information in config-sample.php + +2. Rename config-sample.php to config.php + +3. Configure options in config.js (in the 'js' folder) + +4. Upload all files to your server. + +5. CHMOD buddyicons/ to 0777. + +6. Run install.php in your browser of choice and follow the instructions. + +7. Delete install.php and update.php! + +8. Done! diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fc09182 --- /dev/null +++ b/LICENSE @@ -0,0 +1,10 @@ +Copyright (c) 2009, Joshua Gross +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the Ajax IM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..8cc4162 --- /dev/null +++ b/README @@ -0,0 +1,19 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + +About +----------------------------------- +ajax im ("asynchronous javascript and xml instant messenger") is a browser-based instant messaging client. It uses the XMLHTTPRequest object in JavaScript to send and receive commands to and from the server. No refreshing of the page is ever needed for this "web application" to work, as everything is updated in real-time via JavaScript. + +In versions 2 and up, no XML is actually used (instead, it has been replaced with "JSON"), but for brand purposes, the name has been kept. It still uses the XMLHTTPRequest object, so the name does hold some validity. + +Credits +----------------------------------- +ajax im makes use of a number of Javascript libraries and functions to build its functionality. All such code is labeled and copyrighted to their creators. + +All other code is copyright (c) unwieldy studios / Joshua Gross diff --git a/README.md b/README.md index 2b193b2..62e9b7f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,60 @@ -AjaxIM341 -========= +# Ajax IM 3.41 -instant messaging framework v3.41 (PHP) +## What is Ajax IM 3.41? + +Ajax IM ("Asynchronous Javascript And Xml Instant Messenger") is a browser-based +instant messaging client. It uses the XMLHTTPRequest object in JavaScript to send +and receive commands to and from the server. No refreshing of the page is ever +needed for this "web application" to work, as everything is updated in real-time +via JavaScript. + +Ajax IM 3.41 is based on client-side JavaScript and PHP. Ajax IM 4.0 is a "from +the ground up" rewrite that uses client-side JavaScript and Node.js (server-side +JavaScript). Ajax IM 4.0 does not use PHP now. + +Ajax IM 3.41 is made available here because there is still interest in this older +code and it is the basis for some code forks (e.g. ajaximrpg). It is useful for +reference. + +## Installation + +1. Create a MySQL database + +2. Configure SQL information in config-sample.php + +3. Rename config-sample.php to config.php + +4. Configure options in config.js (in the 'js' folder) + +5. Upload all files to your server. + +6. CHMOD buddyicons/ to 0777. + +7. Run install.php in your browser of choice and follow the instructions. + +8. Delete install.php and update.php! + +9. Done! + +## License + +Copyright (c) 2009, Joshua Gross +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of the Ajax IM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/UPDATES b/UPDATES new file mode 100644 index 0000000..25062c3 --- /dev/null +++ b/UPDATES @@ -0,0 +1,250 @@ +version 3.41 +------------------------- +- Buddy List + > Fixed buddy removal + +- General + > Other minor fixes + +version 3.4 +------------------------- +- General + > Fixed popup.php Include Path, Bold, Italic, and Underline errors (Issue #116, Issue #111, Issue #91). + > Added option to disable the register ability. + > Multiple releases (YUI Compression, Full Source). + +- Buddy List + > Blocked buddies are now blocked when they should be (Issue #112). + > Added buddy icons (Issue #92). + > Added context/right-click menus (Issue #12). + > Added buddy profiles (Issue #13). + +- Instant Messaging + > Added Lingo-Replacement feature, can be used with multiple languages (Issue #127). + +- Chat + > Buddy status changes are shown in chat window. + > Custom timestamps now used in chat as well. + +- Admin + > User search now lists users' emails. + > Created update.php to update your AjaxIM installation from version 3.3 to 3.4. + > Created test-uploads.php to allow you to test your server for the ability to upload files. + > Created php.ini.sample. If you need a php.ini, just rename this to php.ini. + +- Miscellaneous + > Added auto-away/auto-idle feature (Issue #124). + > Fixed use of &, <, and > symbols (Issue #101). + > Fixed use of new lines (Issue #118). + > Added Shift+Enter shortcut to add a newline. + > Various minor issues. + + +version 3.3 +------------------------- +- General + > No more PHP file for languages, all language information is stored in Javascript (Issues #40 & 61) + > Language files are loaded dynamically and can be switched by user before login (Issues #40 & 61) + > index.php is now index.html, as there is now no PHP in the index file + +- Buddy List + > Fixed issue regarding buddies and letter casing (Issue #38) + +- Instant Messaging + > Sounds fixed (Issue #42) + > Timestamp format is now fully configurable (Issue #16) + +- Chat + > Selecting/hovering over users in the chatlist fixed (Issue #81) + > Rooms can now be predefined for the "Join Room" chatlist (Issue #78) + +- Admin + > Added previously nonexistent "Make Admin" PHP function (Issue #24) + +- Miscellaneous + > Fixed error when "Sign On" button clicked a second time (Issue #3) + > Various minor issues (Issue #60) + > Page title is now modifiable via config.js (Issue #21) + + +version 3.22 +------------------------- +- Buddy List + > "Remove buddy" fixed + +- Chat + > Room list style issue fixed + +- Miscellaneous + > "Register" dialog title now changes to proper language + > Users can register and login with characters of any case (upper/lower) and it will automatically be fixed + +- Admin + > Fixed error involving alternate languages and the "Search Type" field + +version 3.21 +------------------------- +- Miscellaneous + > Missed a couple of strings for localization + > Fixed issue with installer on some hosts (e.g., GoDaddy) + > Login/Register/Forgot Pass no longer produce error in IE7 + +version 3.2 +------------------------- +- General + > MAJOR overhaul of the code -- everything (PHP and JS) is now object-oriented instead of procedural + > Many functions modified to make better use of the Prototype library + > Multiple language support (need translators!) + > PHP-based sessions implemented, so the username and password isn't sent on every request + > Many minor GUI changes + > Buttons no longer separate images; buttons are now boilerplate images + text + > Code commented more thoroughly + > Proper theming system -- themes are bundled into folders instead of all over the place + > New dark theme! + +- Instant Messaging + > Popout window now more stable + +- Buddy List + > Fixed issue with selecting another buddy after deleting one + > Buddylist database structure converted to be in a separate table + > Ability to block/unblock users + +- Chat + > Userlist added, now displays all users in a chatroom + > Room list added to the "join room" dialog + > System modified to fix potential bug of grabbing multiples of the same message from the database + +- Admin Panel + > Basic (beta) admin panel added. Supports searching for users, banning, kicking, and making/removing admin + +- Miscellaneous + > Fixed numerous small bugs + +version 3.1 +------------------------- +- General + > More user-friendly install script + > Database table names should no longer conflict with existing tables in a database + +- Instant Messaging + > Full unicode support! + +- Miscellaneous + > Fixed numerous small bugs + > Optimized script + > New JSON PHP class + > Minor memory leak fixed + +version 3.0 +------------------------- +- General + > Event-based system replaces sending buddylist to client each ping + > Windows can be focused and defocused + > Away message choices now have icons (for usability) + > Completely replaced login/registration/forgot password screen + > Toolbars have mouseover & mousedown images (for usability) + > No more modal windows (preventing you from doing anything else while they were open -- Add Buddy, etc) + +- User status + > "Friends only" mode so only users on the user's buddylist can contact the user + > "Invisible" mode lets the user look as if he/she is offline, but can still chat + +- Chatrooms + > Finally! Multi-user chatrooms. + > Joined chatrooms appear as groups on the buddylist, with the chatroom users in that group + +- Instant Messaging + > Font sizes! + > Font colors! + > Emoticon list + > Textbox is now multiline for better readability + +- Detachable windows + > Click the "detach" button (next to the "minimize" button) to popout the IM/chatroom to a separate window + +- Bug fixes + > Fixed auto-url linking + > IM length limit of 1500 characters set (prevents enormous MySQL inserts) + > No more login screen scrollbars issue in Safari + > Minimize button on buddylist moved to less awkard location + +version 2.53 +------------------------- +- Bug fixes + > Non-stop away message sending issue when IMing yourself + +version 2.52 +------------------------- +- Client/Server Communication + > Modified XMLHTTPRequest object creation, should improve speed in the browser + +version 2.51 +------------------------- +- Bug fixes + > Fixed minor scrolling and focus issues in IM windows + +version 2.5 +------------------------- +- Bug fixes + > Won't send blank IM messages + > Away message list no longer falls behind the buddylist + > Fixed the "Remove User/Group window not appearing" issue + > Links in IM sessions now open in a new window, instead of the same window + > Various other small bugs and code cleanup + +- Instant Messaging + > IM sounds: sounds when a message is received or sent + > Emoticons! + > Ability to change the text font + +version 2.02 +------------------------- +- Safari support! +- IM window focus issue fixed +- Dialog alert style bug fixed + +version 2.01 +------------------------- +- Opera support! +- Enter key works on login form now + +version 2.0 +------------------------- +- Better windowing system + > Less clunky + > Resizable windows + > Smoother movement + +- Updated buddy list + > Removed drag/drop (didn't work well) + > Groups! + > Mouse over instead of selection + > Window auto-resizes and moves when browser is resized + +- Chat + > History - shows past conversations with a person throughout the same session + > Timestamp simplified + +- General + > Removed "menu" + > Menu functions added to buddy list window + +- Javascript + > Replaced XML with JSON (bandwidth-saving/faster processing) + > Many, many bugfixes + > Configurable options added + > Fixed major issue of lagginess when IMing with many buddies + +- PHP + > Cleaned up source + > XML replaced with JSON (see Javascript section) + > Bugfixes + +- MySQL + > Buddylists stored using JSON (for groups) + + +version 1.0 +------------------------- +- Initial Release diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..3e8e1b4 --- /dev/null +++ b/admin.php @@ -0,0 +1,177 @@ +json = new JSON_obj(); + + $this->username = $_SESSION['username']; + $this->password = $_SESSION['password']; + + if($this->checkInfo($this->username, $this->password)) { + switch($call) { + case 'search': + print $this->search(strtolower($_POST['by']), $_POST['for']); + break; + + case 'kick': + print $this->kickUser($_POST['user']); + break; + + case 'ban': + print $this->banUser($_POST['user']); + break; + + case 'admin': + print $this->adminUser($_POST['user']); + break; + } + } + } + + /** + * Searches the user database by the method specified, for the keyword specified + * + * @return void + * @author Joshua Gross + **/ + function search($by, $for) { + if($by != 'email' && $by != 'username') return '[]'; + + $search_query = mysql_query('SELECT username, email, last_ip, last_ping, is_online, admin, banned FROM ' . SQL_PREFIX . 'users WHERE ' . $by . ' LIKE \'' . mysql_real_escape_string(str_replace('*', '%', $for)) . '\''); + + $found = array(); + while($row = mysql_fetch_assoc($search_query)) { + $found[] = array('username'=>$row['username'], 'email'=>$row['email'], 'lastKnownIP'=>$row['last_ip'], 'lastActive'=>$row['last_ping'], + 'currentStatus'=>$row['is_online'], 'banned'=>($row['banned']==1?'true':'false'), 'admin'=>($row['admin']==1?'true':'false')); + } + + return $this->json->encode($found); + } + + /** + * Kick the user from the server (log him off) + * + * @return "kicked" + * @author Joshua Gross + **/ + function kickUser($user) { + mysql_query('INSERT INTO ' . SQL_PREFIX . "messages (message, type, sender, recipient, stamp) VALUES ('kick', 'server', '{$this->username}', '" . mysql_real_escape_string($user) . "', '" . time() . "')"); + return 'kicked'; + } + + /** + * Ban & kick the user from the server + * + * @return "true" if banned, "false" if unbanned, "no_such_user" if the user doesn't exist + * @author Joshua Gross + **/ + function banUser($user) { + $ban_status = mysql_query('SELECT banned FROM ' . SQL_PREFIX . 'users WHERE username=\'' . mysql_real_escape_string($user) . '\''); + if(mysql_num_rows($ban_status) == 0) + return 'no_such_user'; + + $is = mysql_fetch_assoc($ban_status); + if($is['banned'] == 1) { + mysql_query('UPDATE ' . SQL_PREFIX . 'users SET banned=0 WHERE username=\'' . mysql_real_escape_string($user) . '\''); + return 'false'; + } else { + $this->kickUser(mysql_real_escape_string($user)); + mysql_query('UPDATE ' . SQL_PREFIX . 'users SET banned=1 WHERE username=\'' . mysql_real_escape_string($user) . '\''); + return 'true'; + } + } + + /** + * Toggle on/off the admin status of a user. + * + * @return "on" if now an admin, "off" if not, "no_such_user" if the user doesn't exist + * @author Joshua Gross + **/ + function adminUser($user) { + $admin_status = mysql_query('SELECT admin FROM ' . SQL_PREFIX . 'users WHERE username=\'' . mysql_real_escape_string($user) . '\''); + if(mysql_num_rows($admin_status) == 0) + return 'no_such_user'; + + $is = mysql_fetch_assoc($admin_status); + if($is['admin'] == 1) { + mysql_query('UPDATE ' . SQL_PREFIX . 'users SET admin=0 WHERE username=\'' . mysql_real_escape_string($user) . '\''); + return 'false'; + } else { + mysql_query('UPDATE ' . SQL_PREFIX . 'users SET admin=1 WHERE username=\'' . mysql_real_escape_string($user) . '\''); + return 'true'; + } + } + + /** + * Check to see if the supplied user information is valid, and if so return specific information. + * + * @return false if information is invalid, array of data otherwise + * @author Joshua Gross + **/ + function checkInfo($username, $password, $return=array()) { + if(count($return) > 0) + $columns = implode(',', $return); + else + $columns = 'id'; + + $username = mysql_real_escape_string($username); + $password = mysql_real_escape_string($password); + + $query = mysql_query('SELECT ' . $columns . ' FROM ' . SQL_PREFIX . 'users WHERE username=\'' . $username . '\' AND password=\'' . $password . '\' LIMIT 1'); + + if(mysql_num_rows($query) > 0) + return mysql_fetch_assoc($query); + else + return false; + } +} + +$admin = new Ajax_IM_Admin($_POST['call']); +?> +You don't want to be here...(this is not the admin panel!) \ No newline at end of file diff --git a/ajax_im.php b/ajax_im.php new file mode 100644 index 0000000..1356b6d --- /dev/null +++ b/ajax_im.php @@ -0,0 +1,893 @@ +json = new JSON_obj(); + + $this->username = $_SESSION['username']; + $this->password = $_SESSION['password']; + + // run the garbage collector (chance run) + $this->gc(); + + // figure out which action we need to execute, + // then execute it and print the output + switch($call) { + case 'login': + print $this->login(strtolower($_POST['username']), $_POST['password']); + break; + + case 'logout': + print $this->logout(); + break; + + case 'ping': + print $this->ping($_POST['away']); + break; + + case 'send': + print $this->send($_POST['recipient'], $_POST['message'], $_POST['font'], $_POST['fontsize'], $_POST['fontcolor'], $_POST['bold'], $_POST['italic'], $_POST['underline'], $_POST['chatroom']); + break; + + case 'addbuddy': + print $this->addBuddy(strtolower($_POST['username']), $_POST['group']); + break; + + case 'removebuddy': + print $this->removeBuddy($_POST['username']); + break; + + case 'blockbuddy': + print $this->blockBuddy($_POST['username'], ($_POST['status']?$_POST['status']:0)); + break; + + case 'removegroup': + print $this->removeGroup($_POST['group']); + break; + + case 'register': + print $this->register($_POST['username'], $_POST['password'], $_POST['email']); + break; + + case 'isuser': + print $this->isUser(strtolower($_POST['username'])); + break; + + case 'reset': + print $this->reset($_POST['email']); + break; + + case 'pwdchange': + print $this->passwordChange($_POST['password'], $_POST['newpwd']); + break; + + case 'joinroom': + print $this->joinRoom($_POST['room']); + break; + + case 'leaveroom': + print $this->leaveRoom($_POST['room']); + break; + + case 'roomlist': + print $this->roomList(); + break; + + case 'changeicon': + print $this->changeIcon(); + break; + + case 'changeprofile': + print $this->changeProfile($_POST['profile']); + break; + + case 'getprofile': + print $this->getProfile($_POST['user']); + break; + } + } + + /** + * Logs the user in and sets the session for the user. + * + * @return JSON object of buddies/blocked users if it usr was successfully logged in, error string otherwise + * @author Joshua Gross + **/ + function login($username, $password) { + $user = $this->checkInfo($username, $password, array('admin', 'banned')); + if(!$user) return 'invalid'; + if($user['banned'] == 1) return 'banned'; + + $_SESSION['username'] = $username; + $_SESSION['password'] = $password; + $_SESSION['admin'] = $user['admin']; + + $set_status = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET is_online=1, last_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\' WHERE username=\'' . $username . '\''); + + $buddylist = $this->getBuddylist($username, false); + $blocklist = $this->getBlocklist($username); + + $this->userEvent($username, $buddylist, 'status', array('status'=>1)); + + $buddylist = $this->getBuddylistOnline($username); + if(count($buddylist) > 0) + $output['buddy'] = $this->json->encode($buddylist); + else + $output['buddy'] = array(); + + $output['blocked'] = $this->json->encode($blocklist); + + $output['admin'] = $user['admin']; + + return $this->json->encode($output); + } + + /** + * Logs the user out and destroys the session. + * + * @return String 'logged_out' + * @author Joshua Gross + **/ + function logout() { + if(!$this->checkInfo($this->username, $this->password)) return 'invalid'; + + $buddylist = $this->getBuddylist($this->username, false); + + $set_status = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET is_online=0, last_ping=\'' . time() . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\''); + + $in_chatrooms = mysql_query('SELECT room FROM ' . SQL_PREFIX . 'chats WHERE user=\'' . mysql_real_escape_string($this->username) . '\''); + while($row = mysql_fetch_assoc($in_chatrooms)) { + $buddylist['users'] = $this->getChatlist($row['room']); + $this->userEvent($this->username, $buddylist, 'chat', array('action'=>'left', 'room'=>$row['room'])); + } + + $exit_rooms = mysql_query('DELETE FROM ' . SQL_PREFIX . 'chats WHERE user=\'' . mysql_real_escape_string($this->username) . '\''); + + $notify_buddies = $this->userEvent($this->username, $buddylist, 'status', array('status'=>0)); + + $_SESSION = array(); + if (isset($_COOKIE[session_name()])) setcookie(session_name(), '', time()-42000, '/'); + session_destroy(); + + return 'logged_out'; + } + + /** + * Checks the database for new messages and events. + * + * @return JSON object of new messages/events if any, otherwise nothing + * @author Joshua Gross + **/ + function ping($away) { + $user = $this->checkInfo($this->username, $this->password, array('is_online', 'last_ping')); + if(!$user) { + $set_status = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET is_online=0, last_ping=\'' . time() . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\''); + return 'not_logged_in'; + } + + $buddylist = $this->getBuddylist($this->username, false); + + $set_status = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET is_online=\'' . mysql_real_escape_string($away + 1) . '\', last_ping=\'' . time() . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\''); + if($user['is_online'] != ($away + 1)) $this->userEvent($this->username, $buddylist, 'status', array('status'=>($away + 1))); + + foreach($buddylist as $group => $users) { + $user_count = count($users); + + $reverse_list = array(); + for($i = 0; $i < $user_count; $i++) + $reverse_list[$users[$i]] = $group; + } + + $query = mysql_query('SELECT id, message, type, sender, recipient FROM ' . SQL_PREFIX . 'messages WHERE (recipient=\'' . mysql_real_escape_string($this->username) . '\') GROUP BY sender, message, recipient ORDER BY id ASC'); + + $i=0; $j=0; + $to_delete = array(); + $output = array(); + while ($row = mysql_fetch_assoc($query)) { + if(strpos($row['type'], 'msg') !== false) { + if($row['sender'] != $this->username || $row['sender'] == $row['recipient']) { + $output['messages'][$i++] = array('message' => $row['message'], + 'sender' => $row['sender'], + 'recipient' => $row['recipient'], + 'chatroom' => ($row['type'] == 'chatmsg' ? 1 : 0)); + + $to_delete[] = $row['id']; + } + } else if($row['type'] == 'event') { + $output['events'][$j++] = array('event' => $row['message'], + 'sender' => $row['sender'], + 'recipient' => $row['recipient']); + + $event = explode(',', $row['message']); + if($event[0] == 'status') $output['events'][$j-1]['group'] = $reverse_list[$row['sender']]; + + $to_delete[] = $row['id']; + } else if($row['type'] == 'server') { + switch($row['message']) { + case 'kick': + $this->logout(); + print 'not_logged_in'; + break; + } + + $to_delete[] = $row['id']; + } + } + + if(count($to_delete) > 0) + $delete_new = mysql_query('DELETE FROM ' . SQL_PREFIX . 'messages WHERE id IN(' . implode(',', $to_delete) . ')'); + + return $this->json->encode($output); + } + + /** + * Sends a message to another user. + * + * @return String 'sent' if successful, error string otherwise + * @author Joshua Gross + **/ + function send($to, $message, $font, $font_size, $font_color, $bold, $italic, $underline, $is_chat) { + $to = mysql_real_escape_string($to); + + if(!$this->checkInfo($this->username, $this->password)) { + $set_status = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET is_online=0, last_ping=\'' . time() . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\''); + return 'not_logged_in'; + } + + $is_online = $this->isOnline($to); + if($is_online > 0 || $is_chat == 'true') { + if($is_online == 100) { + $check_friendship = mysql_query('SELECT is_online FROM ' . SQL_PREFIX . 'users WHERE username IN(SELECT user FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . strtolower($to) . '\' AND buddy=\'' . mysql_real_escape_string($this->username) . '\')'); + if(mysql_num_rows($check_friendship) == 0) + return 'not_online'; + } + + $check_blocked = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'blocklists WHERE user=\'' . strtolower($to) . '\' AND buddy=\'' . mysql_real_escape_string($this->username) . '\''); + if(mysql_num_rows($check_blocked) > 0) + return 'not_online'; + + $check_blocked = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'blocklists WHERE buddy=\'' . strtolower($to) . '\' AND user=\'' . mysql_real_escape_string($this->username) . '\''); + if(mysql_num_rows($check_blocked) > 0) + return 'not_online'; + + if(strlen(trim($message)) > 0 && strlen($message) <= 1500) { + $message = ('') . + ($bold == 'true' ? '' : '') . ($italic == 'true' ? '' : '') . ($underline == 'true' ? '' : '') . + $message . + ($bold == 'true' ? '' : '') . ($italic == 'true' ? '' : '') . ($underline == 'true' ? '' : '') . + (''); + + if($is_chat == 'true') { + $where_to_send = $this->getChatlist($to); + + $to_insert = ''; + foreach($where_to_send as $username) + if($username != $this->username) $to_insert .= "('" . mysql_real_escape_string($message) . "', 'chatmsg', '" . $to . '.' . mysql_real_escape_string($this->username) . "', '" . strtolower($username) . "', " . time() . "),"; + + $to_insert = substr($to_insert, 0, strlen($to_insert) - 1); + } else { + $to_insert = "('" . mysql_real_escape_string($message) . "', 'msg', '" . mysql_real_escape_string($this->username) . "', '" . strtolower($to) . "', " . time() . ")"; + } + + $query = mysql_query('INSERT INTO ' . SQL_PREFIX . 'messages (message, type, sender, recipient, stamp) VALUES ' . $to_insert); + } else { + if(strlen($message) > 1500) + return 'too_long'; + } + + return 'sent'; + } else { + return 'not_online'; + } + } + + /** + * Adds the buddy to the user's buddylist, if possible. + * + * @return String 'added' if successful, error string otherwise + * @author Joshua Gross + **/ + function addBuddy($username, $group) { + if(!$this->checkInfo($this->username, $this->password)) return 'not_added'; + + $query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND buddy=\'' . mysql_real_escape_string($username) . '\' LIMIT 1'); + + if(mysql_num_rows($query) == 0) { + $add_buddy = mysql_query('INSERT INTO ' . SQL_PREFIX . 'buddylists (user, buddy, `group`) VALUES(\'' . mysql_real_escape_string($this->username) . '\', \'' . mysql_real_escape_string($username) . '\', \'' . mysql_real_escape_string($group) . '\')'); + return 'added'; + } else { + return 'already_on_buddylist'; + } + } + + /** + * Removes the buddy from the user's buddylist, if possible. + * + * @return String 'removed' if successful, error string otherwise + * @author Joshua Gross + **/ + function removeBuddy($username) { + if(!$this->checkInfo($this->username, $this->password)) return 'not_removed'; + + $query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND buddy=\'' . mysql_real_escape_string($username) . '\' LIMIT 1'); + + if(mysql_num_rows($query) > 0) { + $remove_buddy = mysql_query('DELETE FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND buddy=\'' . mysql_real_escape_string($username) . '\''); + return 'removed'; + } else { + return 'no_user_on_buddylist'; + } + } + + /** + * Blocks the user from being able to contact the user if blocked. Unblocks the user if blocked. + * + * @return String 'blocked' if not blocked, 'unblocked' if blocked, 'not_blocked' on error + * @author Joshua Gross + **/ + function blockBuddy($username, $status) { + if(!$this->checkInfo($this->username, $this->password)) return 'not_blocked'; + + $query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'blocklists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND buddy=\'' . mysql_real_escape_string($username) . '\' LIMIT 1'); + + if(mysql_num_rows($query) == 0) { + $block_buddy = mysql_query('INSERT INTO ' . SQL_PREFIX . 'blocklists (user, buddy) VALUES(\'' . mysql_real_escape_string($this->username) . '\', \'' . mysql_real_escape_string($username) . '\')'); + + $this->userEvent($this->username, array('block'=>array(mysql_real_escape_string($username))), 'status', array('status'=>0)); + return 'blocked'; + } else { + $unblock_buddy = mysql_query('DELETE FROM ' . SQL_PREFIX . 'blocklists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND buddy=\'' . mysql_real_escape_string($username) . '\' LIMIT 1'); + + $this->userEvent($this->username, array('block'=>array(mysql_real_escape_string($username))), 'status', array('status'=>mysql_real_escape_string($status))); + return 'unblocked'; + } + } + + /** + * Removes the group (and all buddies of group) from a user's buddylist. + * + * @return String 'removed' if successful, error string otherwise + * @author Joshua Gross + **/ + function removeGroup($group) { + if(!$this->checkInfo($this->username, $this->password)) return 'not_removed'; + + $query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND `group`=\'' . mysql_real_escape_string($group) . '\' LIMIT 1'); + if(mysql_num_rows($query) > 0) { + $remove_buddy = mysql_query('DELETE FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND `group`=\'' . mysql_real_escape_string($group) . '\''); + return 'removed'; + } else { + return 'no_group_on_buddylist'; + } + } + + /** + * Registers a user. + * + * @return String 'registered' if successful, error string otherwise + * @author Joshua Gross + **/ + function register($username, $password, $email) { + $username = strtolower($username); + + if(preg_match('/^[a-z0-9_\\d]+$/', $username) !== false && strlen($username) >= 3 && strlen($username) <= 16) { + if(preg_match('/^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$/', $email) !== false) { + if(strlen($password) >= 6 && strlen($password) <= 20) { + if(mysql_num_rows(mysql_query('SELECT email FROM ' . SQL_PREFIX . 'users WHERE email=\'' . mysql_real_escape_string($email) . '\'')) == 0) { + $query = mysql_query('SELECT username FROM ' . SQL_PREFIX . 'users WHERE username=\'' . mysql_real_escape_string($username) . '\''); + if(mysql_num_rows($query) == 0) { + $query = mysql_query('INSERT INTO ' . SQL_PREFIX . 'users (username, password, email) VALUES (\'' . mysql_real_escape_string($username) . '\', \'' . md5($password) . '\', \'' . mysql_real_escape_string($email) . '\')'); + print 'user_registered'; + } else { + print 'username_taken'; + } + } else { + print 'email_already_used'; + } + } else { + print 'password_bad_length'; + } + } else { + print 'invalid_email'; + } + } else { + print 'username_bad'; + } + } + + /** + * Check if a certain user exists (only works when authenticated). + * + * @return String 'exists' if successful, error string otherwise + * @author Joshua Gross + **/ + function isUser($username) { + if(!$this->checkInfo($this->username, $this->password)) return 'not_logged_in'; + + $query = mysql_query('SELECT is_online FROM ' . SQL_PREFIX . 'users WHERE username=\'' . mysql_real_escape_string($username) . '\''); + + if(mysql_num_rows($query) > 0) { + $userinfo = mysql_fetch_assoc($query); + + if($userinfo['is_online'] == 100) { + $check_friendship = mysql_query('SELECT is_online FROM ' . SQL_PREFIX . 'users WHERE username IN(SELECT user FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . mysql_real_escape_string($username) . '\' AND buddy=\'' . mysql_real_escape_string($this->username) . '\')'); + + if(mysql_num_rows($check_friendship) == 0) return '0'; + else return $userinfo['is_online']; + } else { + return $userinfo['is_online']; + } + } else { + return 'not_exists'; + } + } + + /** + * Resets a user's password based on their email address. + * + * @return String 'reset' if successful, 'no_email_on_record' otherwise + * @author Joshua Gross + **/ + function reset($email) { + $email = urldecode($email); + + $query = mysql_query('SELECT email FROM ' . SQL_PREFIX . 'users WHERE email=\'' . mysql_real_escape_string($email) . '\''); + if(mysql_num_rows($query) > 0) { + $new_pass = $this->generatePassword(); + $query = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET password=\'' . md5($new_pass) . '\' WHERE email=\'' . mysql_real_escape_string($email) . '\''); + mail($email, 'Your Reset Password', "You requested that your password be reset, your new password is below.\n\nNew Password: $new_pass", 'From: Reset Password '); + return 'pw_reset'; + } else { + return 'no_email_on_record'; + } + } + + /** + * Changes the user's password. + * + * @return String 'changed' if successful, error string otherwise + * @author Joshua Gross + **/ + function passwordChange($password, $new_password) { + if(!$this->checkInfo($this->username, $password)) return 'invalid_pw'; + + if(strlen($new_password) >= 6 && strlen($new_password) <= 20) { + $query = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET password=\'' . md5($new_password) . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\''); + return 'pw_changed'; + } else { + return 'password_bad_length'; + } + } + + /** + * Adds a user to a chatroom. + * + * @return String 'joined' if successful, error string otherwise + * @author Joshua Gross + **/ + function joinRoom($room) { + $room = mysql_real_escape_string(strtolower($room)); + + $query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'chats WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND room=\'' . $room . '\''); + + if(mysql_num_rows($query) > 0) { + return 'already_joined'; + } else { + if(preg_match('/^[^a-z0-9_\d]+$/', $room) == false) { + $query = mysql_query('INSERT INTO ' . SQL_PREFIX . 'chats (room, user) VALUES (\'' . $room . '\', \'' . mysql_real_escape_string($this->username) . '\')'); + + $output['users'] = $this->getChatlist($room); + $notify_buddies = $this->userEvent($this->username, $output, 'chat', array('action'=>'join', 'room'=>$room)); + + return $this->json->encode($output); + } else { + return 'invalid_chars'; + } + } + } + + /** + * Removes a user from a chatroom. + * + * @return String 'left' if successful, 'not_left' otherwise + * @author Joshua Gross + **/ + function leaveRoom($room) { + $room = mysql_real_escape_string(strtolower($room)); + + $query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'chats WHERE user=\'' . mysql_real_escape_string($this->username) . '\' AND room=\'' . $room . '\'') ; + + if(mysql_num_rows($query) > 0) { + $row = mysql_fetch_assoc($query); + $query = mysql_query('DELETE FROM ' . SQL_PREFIX . 'chats WHERE id=\'' . $row['id'] . '\''); + + $output['users'] = $this->getChatlist($room); + $notify_buddies = $this->userEvent($this->username, $output, 'chat', array('action'=>'left', 'room'=>$room)); + + return 'left'; + } else { + return 'not_left'; + } + } + + /** + * Retrieves a list of room names and returns them to the user as a JSON object. + * + * @return JSON object + * @author Joshua Gross + **/ + function roomList() { + $rooms_query = mysql_query('SELECT room FROM ' . SQL_PREFIX . 'chats GROUP BY room ORDER BY room ASC'); + + $rooms = array(); + while($row = mysql_fetch_assoc($rooms_query)) + $rooms[] = $row['room']; + + return $this->json->encode($rooms); + } + + /** + * Proccesses the upload of the new Buddy Icon for the user. + * + * @return JSON object + * @author Benjamin Hutchins + **/ + function changeIcon() { + global $maxBuddyIconSize; + + if (!isset($maxBuddyIconSize) || $maxBuddyIconSize == 0) { + return "unkown"; + } + + /* + @ini_set('file_uploads', 'On'); + @ini_set('upload_max_filesize', $maxBuddyIconSize.'M'); + @ini_set('post_max_size', $maxBuddyIconSize.'M'); + */ + + $allowed_types = array("image/x-ms-bmp", "image/x-icon", "image/jpeg", "image/x-png", "image/gif", "image/png", "image/tiff"); + $allowed_files = array('jpeg', 'jpg', 'jpe', 'bmp', 'png', 'gif', 'ico', "tif", "tiff"); + + if (empty($_FILES['icon']['tmp_name'])) { + return "nofile"; + } + if ($_FILES['icon']['size'] > $maxBuddyIconSize*1024) { + return "size"; + } + if (!in_array($_FILES['icon']['type'], $allowed_types)) { + return "bad_type"; + } + $filename = $_FILES['icon']['name']; + $extension = strtolower(end(explode(".", $filename))); + if (!in_array($extension, $allowed_files)) { + return "bad_extension"; + } + if (move_uploaded_file($_FILES['icon']['tmp_name'], "./buddyicons/".$this->username.".".$extension)) { + if (mysql_query('UPDATE ' . SQL_PREFIX . 'users SET buddyicon=\'' . mysql_real_escape_string($extension) . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\'')) { + return "success"; + } else { + return "unkown"; + } + } else { + return "unkown"; + } + } + + /** + * Updates a user's profile. + * + * @return success value + * @author Benjamin Hutchins + **/ + function changeProfile($profile) { + if (mysql_query('UPDATE ' . SQL_PREFIX . 'users SET profile=\'' . mysql_real_escape_string(strip_tags($profile)) . '\' WHERE username=\'' . mysql_real_escape_string($this->username) . '\'')) { + return 'success'; + } else { + return 'failed'; + } + } + + /** + * Returns a user's profile. + * + * @return HTML content + * @author Benjamin Hutchins + **/ + function getProfile($username) { + $query = mysql_query('SELECT profile FROM ' . SQL_PREFIX . 'users WHERE username=\'' . mysql_real_escape_string($username) . '\''); + + $result = mysql_fetch_assoc($query); + return $result['profile']; + } + + /* Begin private functions */ + + /** + * Return a user's status. + * + * @return Integer representing user's status + * @author Joshua Gross + **/ + function isOnline($username) { + $query = mysql_query('SELECT is_online FROM ' . SQL_PREFIX . 'users WHERE username=\'' . mysql_real_escape_string($username) . '\''); + + $result = mysql_fetch_assoc($query); + return $result['is_online']; + } + + /** + * Check to see if the supplied user information is valid, and if so return specific information. + * + * @return false if information is invalid, array of data otherwise + * @author Joshua Gross + **/ + function checkInfo($username, $password, $return=array()) { + if(count($return) > 0) + $columns = implode(',', $return); + else + $columns = 'id'; + + $username = mysql_real_escape_string($username); + $password = mysql_real_escape_string($password); + + $query = mysql_query('SELECT ' . $columns . ' FROM ' . SQL_PREFIX . 'users WHERE username=\'' . $username . '\' AND password=\'' . $password . '\' LIMIT 1'); + + if(mysql_num_rows($query) > 0) + return mysql_fetch_assoc($query); + else + return false; + } + + /** + * Retrieves a list of users in a specific chatroom. + * + * @return Array of users + * @author Joshua Gross + **/ + function getChatlist($room) { + $query = mysql_query('SELECT DISTINCT user FROM ' . SQL_PREFIX . 'chats WHERE room=\'' . mysql_real_escape_string(strtolower($room)) . '\''); + + while ($row = mysql_fetch_assoc($query)) + $userlist[]=$row['user']; + return $userlist; + } + + /** + * Retrieves a list of all of the user's buddies. + * + * @return Array of buddies by group + * @author Joshua Gross + * @update Benjamin Hutchins - returns none-blocked buddies if $inc_blocked = false + **/ + function getBuddylist($username, $inc_blocked=true) { + $username = mysql_real_escape_string($username); + + $query = mysql_query('SELECT ' . SQL_PREFIX . 'buddylists.buddy AS buddy, `group` FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . $username . '\' AND ' . SQL_PREFIX . 'buddylists.buddy NOT IN(SELECT user FROM ' . SQL_PREFIX . 'blocklists WHERE buddy=\'' . $username . '\')' . ($inc_blocked ? "" : ' AND ' . SQL_PREFIX . 'buddylists.buddy NOT IN(SELECT buddy FROM ' . SQL_PREFIX . 'blocklists WHERE user=\'' . $username . '\')')); + + $buddylist = array(); + while($row = mysql_fetch_assoc($query)) + $buddylist[$row['group']][] = $row['buddy']; + + return $buddylist; + } + + /** + * Retrieves a list of the user's buddies that are online (with any status). + * + * @return Array of buddies by group with status information + * @author Joshua Gross + * @update Benjamin Hutchins - only returns buddies that did not block user. + **/ + function getBuddylistOnline($username) { + $username = mysql_real_escape_string($username); + + //$query = mysql_query('SELECT ' . SQL_PREFIX . 'buddylists.buddy, `group`, buddyicon, is_online FROM ' . SQL_PREFIX . 'buddylists LEFT JOIN ' . SQL_PREFIX . 'users ON ' . SQL_PREFIX . 'buddylists.buddy = ' . SQL_PREFIX . 'users.username WHERE ' . SQL_PREFIX . 'buddylists.user=\'' . $username . '\' AND ' . SQL_PREFIX . 'buddylists.buddy NOT IN(SELECT user FROM ' . SQL_PREFIX . 'blocklists WHERE buddy=\'' . $username . '\')'); + $query = mysql_query('SELECT ' . SQL_PREFIX . 'buddylists.buddy, `group`, buddyicon, is_online, ' . SQL_PREFIX . 'buddylists.buddy IN(SELECT user FROM ' . SQL_PREFIX . 'blocklists WHERE buddy=\'' . $username . '\') AS blocked FROM ' . SQL_PREFIX . 'buddylists LEFT JOIN ' . SQL_PREFIX . 'users ON ' . SQL_PREFIX . 'buddylists.buddy = ' . SQL_PREFIX . 'users.username WHERE ' . SQL_PREFIX . 'buddylists.user=\'' . $username . '\''); + + $buddylist = array(); + while($row = mysql_fetch_assoc($query)) { + $buddylist[$row['group']][] = array('username'=>$row['buddy'], 'icon'=>$row['buddyicon'], 'is_online'=>($row['blocked'] ? 0 : $row['is_online'])); + } + return $buddylist; + } + + /** + * Retrieves the list of blocked buddies from the database. + * + * @return Array of buddies + * @author Joshua Gross + **/ + function getBlocklist($username) { + $username = mysql_real_escape_string($username); + + $query = mysql_query('SELECT buddy FROM ' . SQL_PREFIX . 'blocklists WHERE user=\'' . $username . '\''); + + $blocklist = array(); + while($row = mysql_fetch_assoc($query)) + $blocklist[] = $row['buddy']; + + return $blocklist; + } + + /** + * Event handler for status or chat status updates. + * + * @return void + * @author Joshua Gross + **/ + function userEvent($username, $buddylist, $event, $args) { + $username = mysql_real_escape_string($username); + + switch($event) { + case 'chat': + $users = $buddylist['users']; + $users_str = @implode("','", $users); + + $query = mysql_query('SELECT username, is_online FROM ' . SQL_PREFIX . 'users WHERE username IN(\'' . $users_str . '\') AND is_online > 0 ORDER BY username ASC'); + + while ($row = mysql_fetch_assoc($query)) + if(strlen($to_insert[$row['username']]) == 0) $to_insert[$row['username']] = mysql_real_escape_string($event . ',' . $args['action'] . ',' . $args['room']); + break; + + case 'status': + if($args['status'] == 100) { + $args['status'] = 0; // we're going to do this backwards + // instead of broadcasting a positive message to our buddies + // we will send a negative (offline) message to all our non-buddies + // who have us on their buddylist + $query_string = 'username IN(SELECT user FROM ' . SQL_PREFIX . 'buddylists WHERE buddy=\'' . $username . '\') AND ' . + 'username NOT IN(\''; + } else { + $query_string = '(username IN(SELECT user FROM ' . SQL_PREFIX . 'buddylists WHERE buddy=\'' . $username . '\') AND username NOT IN(SELECT buddy FROM ' . SQL_PREFIX . 'blocklists WHERE user=\'' . $username . '\')) OR ' . + 'username IN(\''; + } + + if(count($buddylist) == 0) $buddylist[''] = array(''); + + foreach($buddylist as $group => $users) { + $users_str = implode("','", $users); + + $query = mysql_query('SELECT username, is_online FROM ' . SQL_PREFIX . 'users WHERE (' . $query_string . $users_str . '\')) GROUP BY username'); + + while($row = mysql_fetch_assoc($query)) { + if(in_array($row['username'], $users) !== false) { + if($row['is_online'] == 100) { + $friend_query = mysql_query('SELECT id FROM ' . SQL_PREFIX . 'buddylists WHERE user=\'' . $row['username'] . '\' AND buddy=\'' . $username . '\' LIMIT 1'); + if(mysql_num_rows($friend_query) == 0) $row['is_online'] = 0; + } + } + + if($row['is_online'] != 0 && strlen($to_insert[$row['username']]) == 0) $to_insert[$row['username']] = mysql_real_escape_string($event . ',' . $args['status']); + } + } + break; + } + + if(count($to_insert) > 0) { + $time_cur = time(); + foreach($to_insert as $user => $evt) + $insert_str .= "('" . $evt . "', 'event', '" . $username . "', '" . mysql_real_escape_string($user) . "', " . $time_cur . "),"; + + $insert_str = substr($insert_str, 0, strlen($insert_str) - 1); + $query = @mysql_query('INSERT INTO ' . SQL_PREFIX . 'messages (message, type, sender, recipient, stamp) VALUES ' . $insert_str); + } + } + + /** + * Generates a random string of the specified length (default = 10). + * + * @return String + * @author Joshua Gross + **/ + function generatePassword($length=10) { + $randstr=''; + srand((double)microtime()*1000000); + + $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + while(strlen($randstr)<$length) { + $randstr.=substr($chars,(rand()%(strlen($chars))),1); + } + return $randstr; + } + + /** + * Garbage collector. Resets users who have been inactive for more than 5 minutes. + * + * @return void + * @author Joshua Gross + **/ + function gc() { + // cleanup logged-in users in database? [30% chance] + if(rand(1, 100) <= 30) { + // yes, cleanup! // + $expire_time = time() - 30; // idle for more than 30 seconds? + + $cleanup_event = mysql_query('SELECT username FROM ' . SQL_PREFIX . 'users WHERE last_ping < ' . $expire_time . ' AND is_online > 0'); + if(mysql_num_rows($cleanup_event) > 0) { + while($row = mysql_fetch_assoc($cleanup_event)) + $notify_buddies = $this->userEvent($row['username'], $this->getBuddylist($row['username']), 'status', array('status'=>0)); + } + + $cleanup_event2 = mysql_query('SELECT user, room FROM ' . SQL_PREFIX . 'chats WHERE user IN(SELECT username FROM ' . SQL_PREFIX . 'users WHERE last_ping < ' . $expire_time . ' AND is_online > 0)'); + if(mysql_num_rows($cleanup_event2) > 0) { + while($row = mysql_fetch_assoc($cleanup_event2)) { + $room = mysql_query('SELECT user FROM ' . SQL_PREFIX . 'chats WHERE room=\'' . $row['room'] . '\''); + + if(mysql_num_rows($room) > 0) { + while($row2 = mysql_fetch_assoc($room)) + $chatusers['users'][] = $row2['user']; + } + + $notify_chatusers = $this->userEvent($row['user'], $chatusers, 'chat', array('action'=>'left', 'room'=>$row['room'])); + } + } + + $cleanup_chats = mysql_query('DELETE FROM ' . SQL_PREFIX . 'chats WHERE user IN(SELECT username FROM ' . SQL_PREFIX . 'users WHERE last_ping < ' . $expire_time . ' AND is_online > 0)'); + $cleanup_msgs = mysql_query('DELETE FROM ' . SQL_PREFIX . 'messages WHERE stamp < ' . (time() - 300)); + $cleanup = mysql_query('UPDATE ' . SQL_PREFIX . 'users SET is_online=0 WHERE last_ping < ' . $expire_time . ' AND is_online > 0'); + } + } +} + +$ajax_im = new Ajax_IM($_POST['call']); + +mysql_close(); +?> diff --git a/config-sample.php b/config-sample.php new file mode 100644 index 0000000..309fd9b --- /dev/null +++ b/config-sample.php @@ -0,0 +1,21 @@ + diff --git a/index.html b/index.html new file mode 100644 index 0000000..220e506 --- /dev/null +++ b/index.html @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+    +    +    +    +    +    +    +
+ +
+ 8 + 10 + 12 + 14 + 16 + 18 + 20 + 22 + 24 +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + +
+
+
+ + diff --git a/install.php b/install.php new file mode 100644 index 0000000..ea74343 --- /dev/null +++ b/install.php @@ -0,0 +1,237 @@ + + + + + + ajax im - installation + + + + +

ajax im

+ +
+

before you begin...

+ Did you remember to: +
    +
  • setup a database for ajax im?
  • +
  • edit config.php to match your MySQL configuration?
  • + 0 && trim(substr(sprintf('%o', fileperms('./buddyicons/')), -4)) != 777) { echo '
  • CHMOD buddyicons/ to 0777, it is at: '. substr(sprintf('%o', fileperms('./buddyicons/')), -4) .'?
  • '; } ?> +
+
+ +
+
+

first admin account

+ + This will be the first account registered on ajax im. It will automatically be set to be an admin account. + + + + +
+ +
+

ready?

+ + +
+
+ +
+

installing...

+
\n"; + $problem = true; + } else { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

\n"); + $error = true; + } + } else { + mysql_query('ALTER TABLE `'.SQL_PREFIX.'messages` CHANGE `message` `message` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL'); + print "Table '".SQL_PREFIX."messages' added successfully!

\n"; + } + + $table_users = 'CREATE TABLE `'.SQL_PREFIX.'users` ( `username` varchar(32), `password` varchar(32), `email` text, `is_online` int(11) default \'0\', `last_ping` text, `last_ip` varchar(15), `banned` tinyint(1) default \'0\', `admin` tinyint(1) default \'0\', `buddyicon` varchar(4) NOT NULL default \'none\', `profile` text, `id` bigint(20) unsigned NOT NULL auto_increment, UNIQUE KEY `id` (`id`), UNIQUE `username` (`username`) ) ;'; + if(!mysql_query($table_users)) { + if(mysql_errno() == 1050) { + print "Table '".SQL_PREFIX."users' already exists! If you had a version of ajax im less than 3.2 installed on this database, please delete the table and then run this script again, otherwise ignore this error.

\n"; + } else { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

\n"); + $error = true; + } + } else { + print "Table '".SQL_PREFIX."users' added successfully!

\n"; + } + + $table_chats = 'CREATE TABLE `'.SQL_PREFIX.'chats` ( `room` text, `user` text, `id` bigint(20) unsigned NOT NULL auto_increment, UNIQUE KEY `id` (`id`) ) ;'; + if(!mysql_query($table_chats)) { + if(mysql_errno() == 1050) { + print "Table '".SQL_PREFIX."chats' already exists! If you had a version of ajax im less than 3.0 installed on this database, please delete the table and then run this script again, otherwise ignore this error.

\n"; + $problem = true; + } else { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

\n"); + $error = true; + } + } else { + mysql_query('ALTER TABLE `'.SQL_PREFIX.'chats` CHANGE `room` `room` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL'); + print "Table '".SQL_PREFIX."chats' added successfully!

\n"; + } + + $table_buddylists = 'CREATE TABLE `'.SQL_PREFIX.'buddylists` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `user` VARCHAR( 100 ) NOT NULL, `buddy` VARCHAR( 100 ) NOT NULL, `group` VARCHAR( 100 ) NOT NULL, INDEX ( `user` , `group` )) ENGINE = MYISAM ;'; + if(!mysql_query($table_buddylists)) { + if(mysql_errno() == 1050) { + print "Table '".SQL_PREFIX."buddylists' already exists! If you had a version of ajax im less than 3.2 installed on this database, please delete the table and then run this script again, otherwise ignore this error.

\n"; + $problem = true; + } else { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

\n"); + $error = true; + } + } else { + print "Table '".SQL_PREFIX."buddylists' added successfully!

\n"; + } + + $table_blocklists = 'CREATE TABLE `'.SQL_PREFIX.'blocklists` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `user` VARCHAR( 100 ) NOT NULL, `buddy` VARCHAR( 100 ) NOT NULL, INDEX ( `user` , `buddy` )) ENGINE = MYISAM ;'; + if(!mysql_query($table_blocklists)) { + if(mysql_errno() == 1050) { + print "Table '".SQL_PREFIX."blocklists' already exists! If you had a version of ajax im less than 3.2 installed on this database, please delete the table and then run this script again, otherwise ignore this error.

\n"; + $problem = true; + } else { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

\n"); + $error = true; + } + } else { + print "Table '".SQL_PREFIX."blocklists' added successfully!

\n"; + } + + $add_user = 'INSERT INTO `'.SQL_PREFIX.'users` (username, password, email, admin) VALUES (\'' . mysql_real_escape_string($_POST['username']) . '\', \'' . mysql_real_escape_string(md5($_POST['password'])) . '\', \'' . mysql_real_escape_string($_POST['email']) . '\', 1)'; + if(!mysql_query($add_user)) { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

\n"); + print "Unable to add the first user! This likely means there was some other issue during installation.

\n"; + $error = true; + } else { + print "First/admin user registered!

\n"; + } + + if ($maxBuddyIconSize > 0) { + if (trim(substr(sprintf('%o', fileperms('./buddyicons/')), -4)) != 777) { + $error = true; + print "File permissions::

CHMOD buddyicons/ to 0777

"; + } else { + print "You have change permissions of buddyicons/

"; + } + } + + mysql_close(); + ?> +
+ +
+

status

+ here. Please be sure to delete install.php and update.php!'; + ?> +
+ + + diff --git a/is_online/README b/is_online/README new file mode 100644 index 0000000..4e4b6dd --- /dev/null +++ b/is_online/README @@ -0,0 +1,16 @@ +/////////////////////////////////// +// ajax im 3.4 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + +The is_online.php script allows you to display a users status as an image. It is very simple to use. + +To use: +1. Upload the is_online.php script and accompanying images folder to your server. +2. To display a user's status, insert this line anywhere: + + + Replace [pathtoscript] with the path to the script and [username] with the username you want to display the status of. diff --git a/is_online/images/away.gif b/is_online/images/away.gif new file mode 100644 index 0000000000000000000000000000000000000000..746e738e9e7b0f7acad0b5c417b392ffdd4d789b GIT binary patch literal 829 zcmZ?wbhEHbWMyDw_|Cv^vy6PrSYVe)#Y*Gn0W7p!kyotXu~~g6w2q6HqxebHafruN^MG z{{EVOb9Uab%);Y2Rj13^&NnfT0u+C;fR*cjNRXWjtU?bCNgNMgSTSLN1H(q%Pa1rJ HObpfl78EO= literal 0 HcmV?d00001 diff --git a/is_online/is_online.php b/is_online/is_online.php new file mode 100644 index 0000000..84e9dd4 --- /dev/null +++ b/is_online/is_online.php @@ -0,0 +1,41 @@ + diff --git a/js/admin.js b/js/admin.js new file mode 100644 index 0000000..7ffb669 --- /dev/null +++ b/js/admin.js @@ -0,0 +1,457 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + +/** + * Object to hold all Admin Windows as variables + * + * @author Joshua Gross + **/ +var AdminWindows = { + /** + * Display window to allow admin to search for users + * + * @author Joshua Gross + **/ + userSearch: function() { + var userSearchWin; + if($('admin-userSearch')) { + Windows.getWindow('admin-userSearch').toFront(); + return; + } + + userSearchWin = new Window({id: 'admin-userSearch', className: "dialog", width: 250, height: 110, resizable: true, + title: Languages.get('admin-admin') + ' - ' + Languages.get('admin-userSearch'), draggable: true, closable: true, maximizable: false, minimizable: true, detachable: false, + minWidth: 250, minHeight: 110, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + userSearchWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + userSearchWin.getContent().innerHTML = '
' + Languages.get('admin-chooseByAndSearch') + '
\ +
\ +
' + Languages.get('admin-searchType') + ':
\ +
\ +
' + Languages.get('search') + ':
\ + \ +
' + + ButtonCtl.create(Languages.get('search'), 'Admin.findUser($(\'admin-searchType\').value, $(\'admin-search\').value);') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'admin-userSearch\');') + + '
'; + + $('admin-searchButtons').setStyle({position: 'absolute', + top: '105px', + left: '32px'}); + + userSearchWin.setDestroyOnClose(); + userSearchWin.showCenter(); + }, + + /** + * On admin window resize, fix elements within window + * + * @arguments + * win - window to be resized + * + * @author Joshua Gross + **/ + handleResize: function(win) { + switch(win.getId().replace(/admin-/, '')) { + case 'userSearch': + if($('admin-userSearchResults')) { + $('admin-userSearchResults').setStyle({'width': win.getSize()['width'] + 'px'}); + $('admin-userSearchResults').parentNode.setStyle({'width': win.getSize()['width'] + 'px'}); + $('admin-userExecFunctions').setStyle({'left': ((win.getSize()['width'] - $('admin-userExecFunctions').getWidth()) / 2) + 'px'}); + } + + $('admin-searchButtons').setStyle({'left': ((win.getSize()['width'] - $('admin-searchButtons').getWidth()) / 2) + 'px'}); + break; + } + } +} + + +/** + * Handle all Admin requests + * + * @author Joshua Gross + **/ +var Admin = { + // current selected user from the user-search-results list + selectedUser: null, + + /** + * Finds and displays users searched for by the admin + * + * @author Joshua Gross + * @update Benjamin Hutchins + * - User's email be displayed. + **/ + findUser: function(searchType, search) { + var xhConn = new XHConn(); + + xhConn.connect(adminPingTo, "POST", "call=search&by="+searchType+"&for="+search, function(xh) { + if(xh.responseText == 'access_denied') return Admin.noAccess(); + + if($('admin-userSearchResults')) + $('admin-userSearchResults').parentNode.parentNode.removeChild($('admin-userSearchResults').parentNode); + + var results = xh.responseText.parseJSON(); + var resultsTable = ''; + resultsTable += ''; + + for(var i=0; i' + results[i].username + '' + + '' + '' + + ''; + } + resultsTable += '
' + Languages.get('username') + '' + Languages.get('email') + '' + Languages.get('admin-lastKnownIP') + '' + Languages.get('admin-lastActive') + '' + Languages.get('admin-status') + '' + Languages.get('admin-banned') + '' + Languages.get('admin-admin') + '
' + results[i].email + '' + results[i].lastKnownIP + '' + lastActive + '' + results[i].currentStatus + '' + results[i].banned + '' + results[i].admin + '
'; + + var userSearch = Windows.getWindow('admin-userSearch') + userSearch.setSize(500, 232); + userSearch.options.minWidth = 500; + userSearch.options.minHeight = 232; + userSearch.showCenter(false); + userSearch.getContent().innerHTML += resultsTable; + + if(!$('admin-userExecFunctions')) { + userSearch.getContent().innerHTML += '
' + + ButtonCtl.create(Languages.get('admin-kick'), 'Admin.kickUser(Admin.selectedUser.getElementsByTagName(\'td\')[0].innerHTML);') + + ButtonCtl.create(Languages.get('admin-ban'), 'Admin.banUser(Admin.selectedUser.getElementsByTagName(\'td\')[0].innerHTML);', 'admin-banButton') + + ButtonCtl.create(Languages.get('admin-makeAdmin'), 'Admin.toggleAdmin(Admin.selectedUser.getElementsByTagName(\'td\')[0].innerHTML);', 'admin-makeAdminButton') + + '
'; + + $('admin-userExecFunctions').setStyle({position: 'absolute', + top: '195px', + left: '83px'}); + } + + $('admin-searchButtons').innerHTML = ButtonCtl.create(Languages.get('searchAgain'), 'Admin.findUser($(\'admin-searchType\').value, $(\'admin-search\').value);') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'admin-userSearch\');'); + + + $('admin-searchButtons').setStyle({position: 'absolute', + top: '225px', + left: '130px'}); + + var t = new ScrollableTable($('admin-userSearchResults'), 100, 500); + t = new SortableTable($('admin-userSearchResults')); + + $('admin-searchType').value = searchType; + $('admin-search').value = search; + }); + }, + + /** + * Sends request to server to ban user + * + * @arguments + * user - user to be banned + * + * @author Joshua Gross + **/ + banUser: function(user) { + var xhConn = new XHConn(); + + xhConn.connect(adminPingTo, "POST", "call=ban&user="+user, function(xh) { + if(xh.responseText == 'access_denied') return Admin.noAccess(); + + Admin.selectedUser.getElementsByTagName('td')[4].innerHTML = xh.responseText; + $('admin-banButton').innerHTML = (xh.responseText=='true'?Languages.get('admin-unban'):Languages.get('admin-ban')); + }); + }, + + /** + * Sends request to server to kick a user offline + * + * @arguments + * user - user to be kicked + * + * @author Joshua Gross + **/ + kickUser: function(user) { + var xhConn = new XHConn(); + + xhConn.connect(adminPingTo, "POST", "call=kick&user="+user, function(xh) { + if(xh.responseText == 'access_denied') return Admin.noAccess(); + + Admin.selectedUser.getElementsByTagName('td')[3].innerHTML = '0'; + }); + }, + + /** + * Toggles a user's admin rights + * + * @arguments + * user - user to be toggled + * + * @author Joshua Gross + **/ + toggleAdmin: function(user) { + var xhConn = new XHConn(); + + xhConn.connect(adminPingTo, "POST", "call=admin&user="+user, function(xh) { + if(xh.responseText == 'access_denied') return Admin.noAccess(); + + Admin.selectedUser.getElementsByTagName('td')[5].innerHTML = xh.responseText; + $('admin-makeAdminButton').innerHTML = (xh.responseText=='true'?Languages.get('admin-removeAdmin'):Languages.get('admin-makeAdmin')); + }); + }, + + /** + * Add hover effect to an element + * + * @arguments + * el - element to have effect added + * + * @author Joshua Gross + **/ + findUserListHover: function(el) { + Element.addClassName(el, 'listHover').removeClassName('listSelected').removeClassName('listNotSelected'); + }, + + /** + * Remove hover effect added by Admin.findUserListHover + * + * @arguments + * el - element to have effect removed + * + * @author Joshua Gross + **/ + findUserListDefault: function(el) { + if(el != Admin.selectedUser) Element.addClassName(el, 'listNotSelected').removeClassName('listSelected').removeClassName('listHover'); + else Element.addClassName(el, 'listSelected').removeClassName('listNotSelected').removeClassName('listHover'); + }, + + /** + * Change Admin.selectedUser to the user clicked by the admin + * + * @arguments + * el - list element to turn into selected + * + * @author Joshua Gross + **/ + findUserListSelect: function(el) { + if(Admin.selectedUser) Element.addClassName(Admin.selectedUser, 'listNotSelected').removeClassName('listSelected').removeClassName('listHover'); + Element.addClassName(el, 'listSelected').removeClassName('listNotSelected').removeClassName('listHover'); + Admin.selectedUser = el; + + if(el.getElementsByTagName('td')[4].innerHTML == 'true') + $('admin-banButton').innerHTML = Languages.get('admin-unban'); + else + $('admin-banButton').innerHTML = Languages.get('admin-ban'); + + if(el.getElementsByTagName('td')[5].innerHTML == 'true') + $('admin-makeAdminButton').innerHTML = Languages.get('admin-removeAdmin'); + else + $('admin-makeAdminButton').innerHTML = Languages.get('admin-makeAdmin'); + } +}; + +/** +* +* Scrollable HTML table +* http://www.webtoolkit.info/ +* +**/ +function ScrollableTable (tableEl, tableHeight, tableWidth) { + + this.initIEengine = function () { + + this.containerEl.style.overflowY = 'auto'; + if (this.tableEl.parentElement.clientHeight - this.tableEl.offsetHeight < 0) { + this.tableEl.style.width = this.newWidth - this.scrollWidth +'px'; + } else { + this.containerEl.style.overflowY = 'hidden'; + this.tableEl.style.width = this.newWidth +'px'; + } + + if (this.thead) { + var trs = this.thead.getElementsByTagName('tr'); + for (x=0; x= (this.newHeight - (headHeight + footHeight))) { + this.tbody.style.overflow = '-moz-scrollbars-vertical'; + for (x=0; x]+>/g,''); + } + + this.getParent = function (el, pTagName) { + if (el == null) return null; + else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) + return el; + else + return this.getParent(el.parentNode, pTagName); + } + + this.sort = function (cell) { + + var column = cell.cellIndex; + var itm = this.getInnerText(this.tbody[0].rows[1].cells[column]); + var sortfn = this.sortCaseInsensitive; + + if (itm.match(/\d\d[-]+\d\d[-]+\d\d\d\d/)) sortfn = this.sortDate; // date format mm-dd-yyyy + if (itm.replace(/^\s+|\s+$/g,"").match(/^[\d\.]+$/)) sortfn = this.sortNumeric; + + this.sortColumnIndex = column; + + var newRows = new Array(); + for (j = 0; j < this.tbody[0].rows.length; j++) { + newRows[j] = this.tbody[0].rows[j]; + } + + newRows.sort(sortfn); + + if (cell.getAttribute("sortdir") == 'down') { + newRows.reverse(); + cell.setAttribute('sortdir','up'); + } else { + cell.setAttribute('sortdir','down'); + } + + for (i=0;i 0)) return; + + if (sortSection && sortSection[0].rows && sortSection[0].rows.length > 0) { + var sortRow = sortSection[0].rows[0]; + } else { + return; + } + + for (var i=0; i0?siteName:document.title); +var blinkerTimer; +var pingTimer; +var newWin, newWinRcvd; +var windowButtons; +var smilies = []; +var soundManager; + + +/** + * Before the window is 'unloaded', confirm the user wants to leave + * + * @author Joshua Gross + **/ +window.onbeforeunload = function(event) { + event = event || window.event; + if(event && loggedIn) { + var text = Languages.get('onunload'); + event.returnValue = text; + window.onbeforeunload = function() { }; + return text; + } +} + + +/** + * After all content and images for the web page is loaded, + * run some functions + * + * @author Joshua Gross + **/ +window.onload = function() { + Windows.addObserver({ onResize: IM.handleResize }); + Windows.addObserver({ onClose: IM.handleClose }); + Windows.addObserver({ onMaximize: IM.handleResize }); + Windows.addObserver({ onMinimize: IM.handleMinimize }); + + // initialize the sound manager + soundManager = new SoundManager(); + soundManager.onload = function() { + soundManager.createSound({id: 'msg_in', url: './sounds/msg_in.mp3', autoLoad: true}); + soundManager.createSound({id: 'msg_out', url: './sounds/msg_out.mp3', autoLoad: true}); + soundManager.play('msg_out'); + }; + soundManager.beginDelayedInit(); + + // attach event + // before window is unloaded, remove sound manager + Element.observe(window, 'beforeunload', soundManager.destruct); + + // center modal + setTimeout(function() { recenterModal(null); }, 1000); + + // on window resize, recenter modal + Event.observe(window, 'resize', recenterModal); + + // on window unload, logout the user + Event.observe(window, 'unload', function() { if(loggedIn) System.logout(); }); + + // clear all inputs + clearInputs(); + + // replace status images with theme-based images + $('statusList').getElementsBySelector('img').each(function(el) { + el.src = el.src.replace(/images/g, 'themes/' + theme); + }); + + // initialize Context Menus + Context.loaded(); + + // hook mousedown for status list + var dOMD = (document.onmousedown ? document.onmousedown : new Function()); + document.onmousedown = window.onmousedown = function(e) { + showHide(e); + dOMD(e); + } + + // if the user wants to disable register, hide the button + if (!allowNewUsers) { + $$('.registerObject').each(function(el) { + el.remove(); + }); + // then fix the buttons for login + $('login_dialog_links').setStyle({width:'190px'}); + } + + // show login + Dialogs.login(); +}; + + +/** + * After all content for the web page is loaded, + * load some more stuff. + * + * @author Joshua Gross + **/ +Event.onReady(function() { + var getEmoteHTML = new XHConn(); + getEmoteHTML.connect('themes/' + theme +'/emoticons/emoticons.html', 'GET', '', function(xh) { + document.body.innerHTML += xh.responseText; + + var getEmoteJS = new XHConn(); + getEmoteJS.connect('themes/' + theme +'/emoticons/emoticons.js', 'GET', '', function(xh) { + window.smilies = xh.responseText.parseJSON(); + }); + }); + + // load language file + var s = document.createElement('script'); + s.src = 'languages/' + languageOptions[0][0] + '/lang.js?' + (new Date()).getTime(); + s.type = 'text/javascript'; + document.getElementsByTagName('head').item(0).appendChild(s); + + // if lingo is enabled + if (useLingo) { + // load the lingo file + var l = document.createElement('script'); + l.src = 'languages/' + languageOptions[0][0] + '/lingo.js?' + (new Date()).getTime(); + l.type = 'text/javascript'; + document.getElementsByTagName('head').item(0).appendChild(l); + } + + // if there is more than one language installed on the server, show them as options + if(languageOptions.length > 1) { + for(var i=0; i' + languageOptions[i][1] + ' | '; + + $('languageList').innerHTML = $('languageList').innerHTML.substring(0, $('languageList').innerHTML.length - 3); + } +}); + + +/** + * Clear the value of input elements + * + * @author Joshua Gross + **/ +function clearInputs() { + var formInputs = document.getElementsByTagName('input'); + for (var i=0; i 10 ? '...' : '') + '"'; + blinkerTimer = setTimeout("titlebarBlink('"+name+"', '"+message+"', 2, "+chatroom+")", 1000); + } else if(alter == 2) { + document.title = defaultTitle; + blinkerTimer = setTimeout("titlebarBlink('"+name+"', '"+message+"', 0, "+chatroom+")", 1000); + } +} + + +/** + * Toggle the variable 'titlebarBlinker' to true/false + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ +function blinkerOn(onoff) { + titlebarBlinker = (onoff == true ? true : false); +} + + +/** + * Button effects for browsers without ":" support + * + * @arguments + * el - element to affect + * + * @author Joshua Gross + **/ +function buttonHover(el) { + var newsrc = el.src; + newsrc = newsrc.replace(/_hover/, ''); + el.src = newsrc.replace(/\.png/, '_hover.png'); +} +function buttonDown(el) { + el.src = el.src.replace(/_hover\.png/, '_down.png'); +} +function buttonNormal(el) { + el.src = el.src.replace(/\_hover.png/, '.png').replace(/\_down.png/, '.png'); +} + + +/** + * Check to see is an email is valid + * + * @arguments + * email - email to check + * + * @author Joshua Gross + * @updated Benjamin Hutchins + * @return true if email is valid, false otherwise + **/ +function checkEmailAddr(email) { + var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; + return filter.test(email); +} + + +/** + * Generates a random string + * + * @arguments + * length - length of string to be created + * + * @author Joshua Gross + * @return random string + **/ +function randomString(length) { + var chars = "abcdefghijklmnopqrstuvwxyz1234567890"; + var pass = ""; + var charLength = chars.length; + + for(x=0;x 0) { + do { + if (this[i] === search_term) { + return true; + } + } while (i--); + } + return false; +} + + +/** + * Checks to see if a string is alphanumeric (only letters and numbers) + * + * @author Joshua Gross + * @return true if string is alphanumeric, false otherwise + **/ +String.prototype.isAlphaNumeric = function() {return /^[A-Za-z0-9_\d]+$/.test (this)}; + + +/** + * Load the theme stylesheet + **/ +var loadCSS = document.createElement("link"); +loadCSS.setAttribute("rel", "stylesheet") +loadCSS.setAttribute("type", "text/css") +loadCSS.setAttribute("href", 'themes/' + theme + '/style.css') +if (typeof loadCSS != "undefined") + document.getElementsByTagName("head")[0].appendChild(loadCSS); diff --git a/js/browser.js b/js/browser.js new file mode 100644 index 0000000..50f49f7 --- /dev/null +++ b/js/browser.js @@ -0,0 +1,47 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Class to handle browser requests + **/ +var Browser = { + /** + * Get the width of the client browser + * + * @author Joshua Gross + * @return Document Width + **/ + width: function() { + if (self.innerWidth) { + return self.innerWidth; + } else if (document.documentElement && document.documentElement.clientWidth) { + return document.documentElement.clientWidth; + } else if (document.body) { + return document.body.clientWidth; + } + return 630; + }, + + /** + * Get the height of the client browser + * + * @author Joshua Gross + * @return Document Height + **/ + height: function() { + if (self.innerWidth) { + return self.innerHeight; + } else if (document.documentElement && document.documentElement.clientWidth) { + return document.documentElement.clientHeight; + } else if (document.body) { + return document.body.clientHeight; + } + return 470; + } +}; diff --git a/js/buddylist.js b/js/buddylist.js new file mode 100644 index 0000000..5618f90 --- /dev/null +++ b/js/buddylist.js @@ -0,0 +1,428 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Class to handle buddylist events + * + * @author Joshua Gross + **/ +var Buddylist = { + buddyListWin: null, // buddy list window + + /** + * Process the creation of the buddy list window + * + * @author Joshua Gross + **/ + create: function() { + Event.observe(window, 'resize', Buddylist.fixBuddyList); + + if(!$('bl')) { + this.buddyListWin = new Window({id: 'bl', className: "dialog", width: 210, height: (Browser.height() - 60), zIndex: 100, resizable: true, title: Languages.get('buddyList'), draggable: true, closable: false, maximizable: false, detachable: false, minWidth: 205, minHeight: 150, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + this.buddyListWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + } + + this.buddyListWin.getContent().innerHTML = '
' + + '' + Languages.get('addBuddyButton') + '' + + '' + Languages.get('removeBuddyButton') + '' + + '' + Languages.get('IMAnyoneButton') + '' + + '' + Languages.get('joinChatroomButton') + '' + + '' + Languages.get('changeSettingsButton') + '' + + '' + Languages.get('toggleSoundButton') + '' + + (typeof(Status) != 'undefined' ? '' : '') + + '
' + Languages.get('signOff') + '
'; + Event.observe(this.buddyListWin.getContent(), 'contextmenu', function() { return false; }); + + $('bl_minimize').setStyle({left: (this.buddyListWin.getSize()['width'] - 21) + 'px'}); + + this.sizeBuddyList(); + + this.buddyListWin.showCenter(false, (((Browser.height()-40) / 2) - (this.buddyListWin.getSize()['height'] / 2)), (buddyListLoc == 0 ? 10 : (Browser.width() - this.buddyListWin.getSize()['width'] - 10))); + this.buddyListWin.toFront(); + + this.list = {}; + this.listObjects = {}; + this.blocked = {}; + }, + + /** + * Destroy the buddy list window + * + * @author Joshua Gross + **/ + destroy: function() { + this.buddyListWin.destroy(); + }, + + /** + * Reposition buddylist + * + * @author Joshua Gross + **/ + fixBuddyList: function() { + if(Buddylist.buddyListWin.isVisible()) { + Buddylist.buddyListWin.setSize(210, (Browser.height() - 60)); + Buddylist.buddyListWin.setLocation((((Browser.height()-40) / 2) - (Buddylist.buddyListWin.getSize()['height'] / 2)), (buddyListLoc == 0 ? 10 : (Browser.width() - Buddylist.buddyListWin.getSize()['width'] - 10))); + Buddylist.sizeBuddyList(); + } + }, + + /** + * Resize buddylist + * + * @author Joshua Gross + **/ + sizeBuddyList: function() { + $('blContainer').setStyle({width: (this.buddyListWin.getSize()['width'] - 8) + 'px', + height: (this.buddyListWin.getSize()['height'] - 95) + 'px'}); + + $('blBottomToolbar').setStyle({width: (this.buddyListWin.getSize()['width'] - 8) + 'px', + top: (this.buddyListWin.getSize()['height'] - 7) + 'px'}); + + $('bl_minimize').setStyle({left: (this.buddyListWin.getSize()['width'] - 21) + 'px'}); + }, + + /** + * Add new buddy to the list + * + * @arguments + * username - user's username + * groupname - group the user is in + * + * @author Joshua Gross + **/ + addNewBuddy: function(username, groupname) { + username = username.toLowerCase(); + if(!inArray(Buddylist.list, username) && (!Buddylist.listObjects[username] || !$(Buddylist.listObjects[username].obj))) { + var xhConn = new XHConn(); + + xhConn.connect(pingTo, "POST", "call=isuser&username="+username, function(xh) { + if(xh.responseText == 'not_exists') { + $('newbuddy_error_msg').innerHTML = Languages.get('noSuchUser'); + } else { + if(!$(groupname.replace(/\s/, '_') + '_group')) { + Buddylist.addGroup(groupname); + Buddylist.list[groupname] = []; + } + + Buddylist.addBuddy(username, 'Offline', 'none'); + + if(parseInt(xh.responseText) == 0) { + Buddylist.moveBuddy(username, 'Offline'); + $(Buddylist.listObjects[username].img).src = 'themes/' + theme + '/offline.png'; + } else if(parseInt(xh.responseText) == 2) { + Buddylist.moveBuddy(username, groupname); + $(Buddylist.listObjects[username].img).src = 'themes/' + theme + '/away.png'; + } else { + Buddylist.moveBuddy(username, groupname); + $(Buddylist.listObjects[username].img).src = 'themes/' + theme + '/online.png'; + } + + Buddylist.list[groupname][username] = {'username': username, 'blocked': false, 'status': parseInt(xh.responseText)}; + + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=addbuddy&username="+username+'&group='+groupname, null); + + Windows.close('newBuddy'); + } + }); + } else { + $('newbuddy_error_msg').innerHTML = Languages.get('alreadyOnBuddylist'); + } + }, + + /** + * Add buddy to the list + * + * @arguments + * username - username of the buddy we're adding + * groupname - the group the buddy is in + * buddyicon - the buddy's buddyiocn + * + * @author Joshua Gross + * update Benjamin Hutchins + **/ + addBuddy: function(username, groupname, buddyicon) { + if(!$(groupname.replace(/\s/, '_') + '_group')) this.addGroup(groupname); + var groupList = $(groupname.replace(/\s/, '_') + '_group'); + var iconsrc = (buddyicon=='none'?defaultIcon:pathToIcons+username+'.'+buddyicon); + + var randId = Math.floor(Math.random()*1000000000); + while($(randId + '_blItem')) + randId = Math.floor(Math.random()*1000000000); + + groupList.innerHTML += '
  • ' + (useIcons&&showInList?(defaultIcon==""&&buddyicon=='none'?'':''):'') + '     '+username+'
  • '; + + Buddylist.listObjects[username] = {}; + Buddylist.listObjects[username].obj = randId + '_blItem'; + Buddylist.listObjects[username].img = randId + '_blImg'; + Buddylist.listObjects[username].icon = buddyicon; + Buddylist.listObjects[username].group = groupname; + + $(Buddylist.listObjects[username].obj).setStyle({listStyleType: 'none'}); + }, + + /** + * Move a buddy from one group to another + * + * @arguments + * username - username of the buddy we're moving + * groupname - new group name + * + * @author Joshua Gross + **/ + moveBuddy: function(username, groupname) { + if(groupname == null) return; + if($(Buddylist.listObjects[username].obj).parentNode == $(groupname.replace(/\s/, '_') + '_group')) return; + if(!$(groupname.replace(/\s/, '_') + '_group')) this.addGroup(groupname); + + var group = $(groupname.replace(/\s/, '_') + '_group') + + group.insertBefore($(Buddylist.listObjects[username].obj), null); + }, + + /** + * Add a new group the buddylist window + * + * @arguments + * groupname - group to add + * + * @author Joshua Gross + **/ + addGroup: function(groupname) { + var bList = $('buddylist'); + bList.innerHTML = (groupname=='Offline' ? bList.innerHTML : '') + '
  •   ' + groupname + + (groupname!='Offline' ? ' ' : '') + '
  • ' + "\n" + '
      ' + (groupname!='Offline' ? bList.innerHTML : ''); + }, + + /** + * Remove buddy from the buddylist permanently + * + * @arguments + * username - buddy we're removin + * + * @author Joshua Gross + **/ + deleteBuddy: function(username) { + if(username.indexOf('_group') != -1) { + this.deleteGroup(username.substring(0, username.length - 6)); + return; + } + + var usernam = username; + + var ingroup = null; + for (var group in this.list) { + if(typeof(this.list[group][username]) !== 'undefined' && this.list[group][username].username == username) { + ingroup = group; + break; + } + } + + var buddyToRmv = $(Buddylist.listObjects[username].obj); + + if(typeof(buddyToRmv) !== 'undefined') { + buddyToRmv.parentNode.removeChild(buddyToRmv); + if(this.list[ingroup]) { + this.list[ingroup][username] = null; + + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=removebuddy&username="+username, null); + + } + Dialog.closeInfo(); + } + }, + + /** + * Process the blocking of a buddy + * + * @arguments + * username - the buddy to be blocked + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + blockBuddy: function(username) { + var isBlocked = this.blocked.inArray(username); + if(isBlocked) { + for(var i=0; i= 2 ? 'themes/' + theme + '/away.png' : 'themes/' + theme + '/offline.png'))); + if(!blockedBuddyStatus && isBlocked) { + Buddylist.moveBuddy(username, Languages.get('offline')); + } + break; + } + } + }, + + /** + * Remove a group from the buddylist permanently + * + * @arguments + * groupname - group to be removes + * + * @author Joshua Gross + **/ + deleteGroup: function(groupname) { + var groupNoSpaces = groupname.replace(/\s/, '_'); + var groupToRmv = $(groupNoSpaces+"_group"); + var groupTop = $(groupNoSpaces+"_groupTop"); + + if(typeof(groupToRmv) !== 'undefined') { + groupToRmv.parentNode.removeChild(groupToRmv); + groupTop.parentNode.removeChild(groupTop); + + for(var i=0;i 0) { + try { + var el = $(Buddylist.listObjects[curSelected].obj); + Element.addClassName(el, 'listNotSelected'); + Element.removeClassName(el, 'listSelected'); + Element.removeClassName(el, 'listHover'); + } catch(e) { } + } + + curSelected = username; + + var oel = $(Buddylist.listObjects[curSelected].obj); + Element.addClassName(oel, 'listSelected'); + Element.removeClassName(oel, 'listNotSelected'); + Element.removeClassName(oel, 'listHover'); + } + return false; + }, + + /** + * Process double clicks, open the IM window + * + * @author Joshua Gross + **/ + onBuddyDblClick: function() { + if(curSelected.length > 0) { + if(typeof(IM.windows[curSelected]) == 'undefined') { + IM.create(curSelected, curSelected); + } else { + if(IM.windows[curSelected].detached) { + if(IM.windows[curSelected].popup.closed) { + IM.windows[curSelected] = IM.windows[curSelected].old; + IM.windows[curSelected].show(); + } else { + IM.windows[curSelected].popup.focus(); + } + } else if(!IM.windows[curSelected].isVisible()) { + IM.windows[curSelected].show(); + IM.windows[curSelected].toFront(); + setTimeout("scrollToBottom('" + IM.windows[curSelected].getId() + "_rcvd')", 125); + setTimeout("$('" + IM.windows[curSelected].getId() + "_sendBox').focus();", 250); + } else { + IM.windows[curSelected].toFront(); + setTimeout("$('" + IM.windows[curSelected].getId() + "_sendBox').focus();", 250); + } + } + } + } +}; diff --git a/js/buttonctl.js b/js/buttonctl.js new file mode 100644 index 0000000..84e7bfd --- /dev/null +++ b/js/buttonctl.js @@ -0,0 +1,76 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Button control class + */ +var ButtonCtl = { + /** + * Create a button/link wrapper + * + * @arguments + * text - innerHTML for link + * action - onClick action + * id - element ID to apply (if none is supplied, none is set) + * + * @author Joshua Gross + **/ + create: function(text, action, id) { + return '' + text + ''; + }, + + /** + * Create a submit input button wrapper + * + * @arguments + * text - value for input + * id - element ID to apply (if none is supplied, none is set) + * + * @authro Benjamin Hutchins + **/ + createSubmit: function(text, id) { + return ''; + }, + + /** + * Effect to apply to 'el' (element) on mouseover + * + * @arguments + * el - element to affect + * + * @author Joshua Gross + **/ + hover: function(el) { + el.className = 'stdButton btnHover'; + }, + + /** + * Effect to apply to 'el' (element) on mousedown + * + * @arguments + * el - element to affect + * + * @author Joshua Gross + **/ + down: function(el) { + el.className = 'stdButton btnDown'; + }, + + /** + * Restore 'el' (element) to normal on mouseout + * + * @arguments + * el - element to affect + * + * @author Joshua Gross + **/ + normal: function(el) { + el.className = 'stdButton'; + } +}; diff --git a/js/chat.js b/js/chat.js new file mode 100644 index 0000000..7e3e270 --- /dev/null +++ b/js/chat.js @@ -0,0 +1,362 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Chatroom Class + **/ +var Chatroom = { + windows: {}, // JavaScript object to store all chatroom windows + + /** + * Create a new chatroom + * + * @arguments + * name - chatroom name + * imTitle - window title, default is chatroom name + * + * @author Joshua Gross + **/ + create: function(name, imTitle) { + var imLeft = Math.round(Math.random()*(Browser.width()-360))+'px'; + var imTop = Math.round(Math.random()*(Browser.height()-400))+'px'; + + var winId = randomString(32) + '_chat'; + + this.windows[name] = new ChatWindow({id: winId, className: "dialog", width: 475, height: 340, top: imTop, left: imLeft, resizable: true, title: imTitle, draggable: true, detachable: false, minWidth: 475, minHeight: 150, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + this.windows[name].setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + this.windows[name].getContent().innerHTML = '
      ' + "\n" + + '
      ' + "\n" + + '
      ' + Languages.get('bold') + ' ' + + '' + Languages.get('italic') + ' '+ + '' + Languages.get('underline') + '
      ' + + ' Tahoma' + + ' 12' + + '
      ' + + ' ' + + "\n" + '
      '; + + this.windows[name].setRoom(name); + + $(winId + '_userlist').setStyle({left: (this.windows[name].getSize().width - 155) + 'px', height: (this.windows[name].getSize().height - 12) + 'px'}); + $(winId + '_rcvd').setStyle({marginTop: '5px', height: (this.windows[name].getSize().height - 103) + 'px', width: (this.windows[name].getSize().width - 170) + 'px'}); + $(winId + '_toolbar').setStyle({top: (this.windows[name].getSize().height - 73) + 'px', width: (this.windows[name].getSize().width - 170) + 'px'}); + $(winId + '_setFont').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontSize').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontColor').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontColorColor').setStyle({backgroundColor: '#000'}); + $(winId + '_insertEmoticon').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + + var sendBox = $(winId + '_sendBox'); + sendBox.setStyle({top: (this.windows[name].getSize().height - 45) + 'px', + left: '2px', + width: (this.windows[name].getSize().width - 175) + 'px', + fontWeight: '400', + fontStyle: 'normal', + textDecoration: 'none'}); + + this.windows[name].show(); + this.windows[name].toFront(); + Windows.focusedWindow = this.windows[name]; + setTimeout("$('"+winId+"_sendBox').focus();", 250); + }, + + /** + * Process chatroom window resize + * + * @arguments + * name - chatroom name + * + * @author Joshua Gross + **/ + handleResize: function(name) { + var winId = this.windows[name].getId(); + + $(winId + '_userlist').setStyle({left: (this.windows[name].getSize().width - 155) + 'px', height: (this.windows[name].getSize().height - 12) + 'px'}); + $(winId + '_rcvd').setStyle({height: (this.windows[name].getSize().height - 103) + 'px', width: (this.windows[name].getSize().width - 170) + 'px'}); + $(winId + '_toolbar').setStyle({top: (this.windows[name].getSize().height - 73) + 'px', width: (this.windows[name].getSize().width - 170) + 'px'}); + $(winId + '_setFont').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontSize').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontColor').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontColorColor').setStyle({backgroundColor: '#000'}); + $(winId + '_insertEmoticon').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_sendBox').setStyle({top: (this.windows[name].getSize().height - 45) + 'px', left: '2px', width: (this.windows[name].getSize().width - 175) + 'px'}); + }, + + /** + * Send request to server to enter a chatroom + * + * @argument + * room - room name user is entering + * + * @author Joshua Gross + **/ + join: function(room) { + room = room.toLowerCase(); + + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=joinroom&room="+room, + function(xh) { + if(xh.responseText.indexOf('"') == -1) { + switch(xh.responseText) { + case 'already_joined': + $('newroom_error_msg').innerHTML = Languages.get('alreadyInRoom').replace('%1', room); + break; + case 'room_is_user': + $('newroom_error_msg').innerHTML = Languages.get('invalidRoom'); + break; + case 'invalid_chars': + $('newroom_error_msg').innerHTML = Languages.get('invalidRoomChars'); + break; + } + } else { + if(!$(room + '_im')) { + Chatroom.create(room, room); + } else { + if(!Chatroom.windows[room].isVisible()) { + Chatroom.windows[room].show(); + setTimeout("scrollToBottom('" + room + "_rcvd')", 125); + } + } + var users = xh.responseText.parseJSON().users; + for(var i=0; i '+username+''; + $(username+'_'+this.room+'_chatUser').setStyle({listStyleType: 'none'}); + }, + + /** + * Remove a user from the chatroom user list + * + * @arguments + * username - user to remove + * + * @author Joshua Gross + **/ + deleteUser: function(username) { + var toDelete = $(username + '_' + this.room + '_chatUser'); + if(typeof(toDelete) !== 'undefined') + toDelete.parentNode.removeChild(toDelete); + }, + + /** + * Process mouseover and mousout calls for the user list + * + * @arguments + * sel - element + * username - user's username + * selected - is mouse over or did it go out + * + * @author Joshua Gross + **/ + selectUser: function(sel, username, selected) { + if(selected === false) { + if(this.curSelected != username) { + try { + Element.addClassName(sel, 'listNotSelected'); + Element.removeClassName(sel, 'listSelected'); + Element.removeClassName(sel, 'listHover'); + } catch(e) { } + } else { + Element.addClassName(sel, 'listSelected'); + Element.removeClassName(sel, 'listNotSelected'); + Element.removeClassName(sel, 'listHover'); + } + } else { + Element.addClassName(sel, 'listHover'); + Element.removeClassName(sel, 'listSelected'); + Element.removeClassName(sel, 'listNotSelected'); + } + }, + + /** + * Process event when a user is clicked + * + * @arguments + * username - the username of the user clicked + * + * @author Josh Gross + **/ + clickUser: function(username) { + if(this.curSelected.length > 0) { + try { + var el = $(this.curSelected + '_' + this.room + '_chatUser'); + Element.addClassName(el, 'listNotSelected'); + Element.removeClassName(el, 'listSelected'); + Element.removeClassName(el, 'listHover'); + } catch(e) { } + } + + this.curSelected = username; + + var oel = $(this.curSelected + '_' + this.room + '_chatUser'); + Element.addClassName(oel, 'listSelected'); + Element.removeClassName(oel, 'listNotSelected'); + Element.removeClassName(oel, 'listHover'); + }, + + /** + * On DoubleClick of a user from the chatroom user + * list, start a private IM with him/her. + * + * @author Joshua Gross + **/ + onUserDblClick: function() { + if(this.curSelected.length > 0) { + if(typeof(IM.windows[this.curSelected]) == 'undefined') { + IM.create(this.curSelected, this.curSelected); + } else { + if(!IM.windows[this.curSelected].isVisible()) { + IM.windows[this.curSelected].show(); + IM.windows[this.curSelected].toFront(); + setTimeout("scrollToBottom('" + IM.windows[this.curSelected].getId() + "_rcvd')", 125); + setTimeout("$('" + IM.windows[this.curSelected].getId() + "_sendBox').focus();", 250); + } else { + IM.windows[this.curSelected].toFront(); + setTimeout("$('" + IM.windows[this.curSelected].getId() + "_sendBox').focus();", 250); + } + } + } + } +}); + + +/** + * Class to handle the window of the chat rooms + **/ +var ChatroomList = { + curSelected: '', // current selected chat room + + /** + * Get list of chat rooms that exist + * + * @author Joshua Gross + **/ + get: function(applyTo) { + var xhConn = new XHConn(); + + xhConn.connect(pingTo, "POST", "call=roomlist", function(xh) { + var rooms = xh.responseText.parseJSON(); + + applyTo.innerHTML = '
      • '; + + if(rooms.length > 0 || predefRooms.length > 0) { + for(var i=0; i' + rooms[i] + ''; + } + } + + for(var i=0; i' + predefRooms[i] + ''; + } + } + } else { + applyTo.innerHTML += '
      • ' + Languages.get('noRoomsExist') + '
      • '; + } + applyTo.innerHTML += '
      '; + }); + }, + + /** + * Proccess mouseover and mouseout of list items + * + * @arguments + * sel - list element + * roomname - chatroom name + * selected - did mouse go over or out + * + * @author Joshua Gross + **/ + selectRoom: function(sel, roomname, selected) { + if(selected === false) { + if(this.curSelected != roomname) { + try { + Element.addClassName(sel, 'listNotSelected').removeClassName('listSelected').removeClassName('listHover'); + } catch(e) { } + } else { + Element.addClassName(sel, 'listSelected').removeClassName('listNotSelected').removeClassName('listHover'); + } + } else { + Element.addClassName(sel, 'listHover').removeClassName('listSelected').removeClassName('listNotSelected'); + } + }, + + /** + * Process the clicking of a room + * + * @arguments + * roomname - room that was clicked + * + * @author Joshua Gross + **/ + clickRoom: function(roomname) { + if(this.curSelected.length > 0) { + try { + Element.addClassName($('chatroom_list_' + hex_md5(this.curSelected)), 'listNotSelected').removeClassName('listSelected').removeClassName('listHover'); + } catch(e) { } + } + + this.curSelected = roomname; + $('roomname').value = roomname; + + Element.addClassName($('chatroom_list_' + hex_md5(roomname)), 'listSelected').removeClassName('listNotSelected').removeClassName('listHover'); + } +}; diff --git a/js/config.js b/js/config.js new file mode 100644 index 0000000..e48f8b5 --- /dev/null +++ b/js/config.js @@ -0,0 +1,110 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + +// Configuration // + +// Title // +var siteName = 'ajax im'; // Name of your site (appears as the page title). + // If '', then the title will be used from the index file. + +// Registration // +var allowNewUsers = true; // Enable/Disable open registration + +// Languages // +// Format: [ +// ['folderName', 'properName'], +// ['language2Folder', 'Language 2 Proper Name'], +// ... +// ] +// Note: The first language will be used as the default language. +var languageOptions = [ + ['english', 'English'] + ]; + +// Theme Settings // +var theme = 'dark'; // ajax im theme +var alertWidth = 400; // alert window width + +// Notification // +var useBlinker = true; // Show new message in titlebar when window isn't active. +var blinkSpeed = 1000; // How fast to change between the titles when "blinking" (in milliseconds). +var pulsateTitles = true; // Pulsate (blink) IM window titles on new IM when they are not the active window. +var audioNotify = true; // By default, play sounds upon getting an IM? + +// Server // +var pingFrequency = 2500; // How often to ping the server (in milliseconds). Best range between 2500 and 3500 ms. +var pingTo = 'ajax_im.php'; // The file that is the "server". +var adminPingTo = 'admin.php'; // The "server" script for admin functions. +var blockedBuddyStatus = false; // Show blocked buddies' status. + +// Windows // +var imWidth = 310; // Default IM window width +var imHeight = 335; // Default IM window height +var imDetachable = true; // Enable/Disable ability to detach IM windows from the application +var buddyListLoc = 1; // Default buddylist location: 0=left, 1=right (of window) + +// Timeouts // +var idleTime = 15; // How long until a user goes idle from now sending any messages (in minutes). + // If 0, feature not used. + +// Lingo Text-Replacement // +var useLingo = true; // Automated text replacement for messaging. Will replace typos and shorthand, + // as defined in the current language's lingo.js file, with the proper replacement + // text. +var lingoPunction = [ // Punction the can be placed at the end of a word/setence. + [" ", " "], // Format: [RegularExpression, Real] + ["\\.\\.", ".."], + ["\\.\\.\\.", "..."], + ["\\.\\.\\.\\.", "...."], + ["\\.\\.\\.\\.\\.", "....."], + ["\\.", "."], + [",", ","], + [";", ";"], + ["\\!", "!"], + ["\\?", "?"] + ]; + +// Buddy Icons // +var useIcons = true; // Enable/Disable use of buddy icons +var pathToIcons = './buddyicons/';// Path to buddy icons, include trailing slash. +var showInList = false; // Enable/Disable showing of buddy icons in the buddy list +var vanishingIcons = true; // Enable/Disable the hiding of the buddy icons in a chat +var vanishingSpeed = 10000; // Show the buddy icon for X amount until it is hidden (in milliseconds). +var defaultIcon = ''; // Location of image to use when no buddy icon is availible + // If blank, no default icon is used + + +// Messaging History // +var imHistory = true; // Retain conversations with buddies throughout the session? + // How it works: If an IM window is closed an imHistory is true, + // next time that IM window is opened (during the same session!), + // the old chat text will be there + +// Chatrooms // +var predefRooms = []; // Define preset rooms that will always exist when a user views the "Join Room" list. + // Format: ['room1', 'room2', ...] + +// Timestamp Format // +// This is the timestamp format used to note when an IM was received. +/* M = month, Jan - Dec + * m = month, 01 - 12, with prepended 0 (01, 02, ...) + * u = month, 1 - 12, without prepended 0 (1, 2, ...) + * d = day, 01 - 31, with prepended 0 (01, 02, ...) + * x = day, 1 - 31, without prepended 0 (1, 2, ...) + * Y = year, 4 digits (eg: 2008) + * y = year, 2 digits (eg: 08) + * H = hours, 24-hour format with prepended 0 (01, 02, ...) + * h = hours, 12-hour format without prepended 0 (1, 2, ...) + * Q = hours, 24-hour format without prepended 0 (1, 2, ...) + * q = hours, 12-hour format with prepended 0 (01, 02, ...) + * i = minutes + * s = seconds + * a = am/pm + * A = AM/PM + */ +var timestamp = '[h:i:s a]'; diff --git a/js/context.js b/js/context.js new file mode 100644 index 0000000..a5e8fd5 --- /dev/null +++ b/js/context.js @@ -0,0 +1,146 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Handle all right-click menus for buddy list + * + * @author Benjamin Hutchins + **/ +var Context = { + currentUser: null, // current user that the menu is being shown for + lastClicked: null, // last user that was right-clicked + + /** + * On window load, apply new observes + * + * @author Benjamin Hutchins + **/ + loaded: function() { + if (typeof document.oncontextmenu != 'undefined') { + document.oncontextmenu = Context.oncontextmenu; + } else { + window.oncontextmenu = Context.oncontextmenu; + } + + document.onmousedown = window.onmousedown = Context.onmousedown; + }, + + /** + * onClick of 'Get Info', open the users' profile. + * + * @author Benjamin Hutchins + **/ + profile: function() { + $('divContext').style.display = 'none'; + if(typeof(Profile.windows[Context.currentUser]) == 'undefined') { + Profile.create(Context.currentUser, Context.currentUser); + } else { + if(!Profile.windows[Context.currentUser].isVisible()) { + Profile.windows[Context.currentUser].show(); + Profile.windows[Context.currentUser].toFront(); + } else { + Profile.windows[Context.currentUser].toFront(); + } + } + }, + + /** + * onClick of 'IM', open the conversation window with the user. + * + * @author Benjamin Hutchins + **/ + createIM: function() { + $('divContext').style.display = 'none'; + if(typeof(IM.windows[Context.currentUser]) == 'undefined') { + IM.create(Context.currentUser, Context.currentUser); + } else { + if(IM.windows[Context.currentUser].detached) { + if(IM.windows[Context.currentUser].popup.closed) { + IM.windows[Context.currentUser] = IM.windows[Context.currentUser].old; + IM.windows[Context.currentUser].show(); + } else { + IM.windows[Context.currentUser].popup.focus(); + } + } else if(!IM.windows[Context.currentUser].isVisible()) { + IM.windows[Context.currentUser].show(); + IM.windows[Context.currentUser].toFront(); + setTimeout("scrollToBottom('" + IM.windows[Context.currentUser].getId() + "_rcvd')", 125); + setTimeout("$('" + IM.windows[Context.currentUser].getId() + "_sendBox').focus();", 250); + } else { + IM.windows[Context.currentUser].toFront(); + setTimeout("$('" + IM.windows[Context.currentUser].getId() + "_sendBox').focus();", 250); + } + } + }, + + /** + * onClick of 'Block' or 'Unblock', toggle the user's blocked status. + * + * @author Benjamin Hutchins + **/ + blockBuddy: function() { + $('divContext').style.display = 'none'; + Dialogs.blockBuddy(Context.currentUser); + }, + + /** + * onClick of 'Remove', remove the user from the friend's list. + * + * @author Benjamin Hutchins + **/ + removeBuddy: function() { + $('divContext').style.display = 'none'; + Dialogs.removeBuddy(Context.currentUser); + }, + + /** + * Global onContextMenu handler + * + * @author Benjamin Hutchins + **/ + oncontextmenu: function (event) { + if (loggedIn && Context.lastClicked != null) { + event = event || window.event; + + Context.currentUser = Context.lastClicked; + var scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop; + var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft; + + $('divContext').style.display = 'none'; + var group = Buddylist.listObjects[Context.currentUser].group; + $('contextBlock').innerHTML = (typeof Buddylist.list[group] != 'undefined' && Buddylist.list[group][Context.currentUser].blocked == true ? Languages.get('contextUnblock') : Languages.get('contextBlock')); + Element.setStyle($('divContext'), { + left: (event.clientX + scrollLeft - 5) + 'px', + top: (event.clientY + scrollTop - 5) + 'px', + zIndex: Windows.maxZIndex + 20, + display: 'block' + }); + + Context.lastClicked = null; + return false; + } else if ($('divContext')) { + $('divContext').style.display = 'none'; + } + }, + + /** + * Global onMouseDown handler, hide right-click menu, + * as long as it wasn't a right click. + * + * @author Benjamin Hutchins + **/ + onmousedown: function (event) { + if (loggedIn) { + event = event || window.event; + if (event.button != 2 && event.button != 3) { + setTimeout("$('divContext').style.display='none';", 100); + } + } + } +}; diff --git a/js/dialogs.js b/js/dialogs.js new file mode 100644 index 0000000..118a6d3 --- /dev/null +++ b/js/dialogs.js @@ -0,0 +1,405 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Dialog and windows class + * + * @author Joshua Gross + **/ +var Dialogs = { + /** + * Display login modal + * + * @author Joshua Gross + **/ + login: function() { + clearInputs(); + $('login_error_msg').innerHTML = ''; + this.mainDialogShow('login'); + this.currentMainDialog = 'login'; + setTimeout("try { $('username').focus(); } catch(e) { }", 1125); + }, + + /** + * Display register modal + * + * @author Joshua Gross + **/ + register: function() { + clearInputs(); + $('register_error_msg').innerHTML = ''; + Dialogs.mainDialogShow('register'); + this.currentMainDialog = 'register'; + setTimeout("try { $('newusername').focus(); } catch(e) { }", 505); + }, + + /** + * Display forgot password modal + * + * @author Joshua Gross + **/ + forgotPass: function() { + clearInputs(); + $('forgotpass_error_msg').innerHTML = ''; + Dialogs.mainDialogShow('forgotPass'); + this.currentMainDialog = 'forgotPass'; + setTimeout("try { $('resetto').focus(); } catch(e) { }", 505); + }, + + /** + * Display main dialog + * + * @author Joshua Gross + **/ + mainDialogShow: function(dialog) { + if(this.currentMainDialog) Element.setStyle(this.currentMainDialog + 'Dialog', {'display': 'none'}); + Element.setStyle(dialog + 'Dialog', {'display': 'block'}); + }, + + /** + * New IM window, or IM Anyone. Displays a window to enter a + * username in attempt to message a new friend. + * + * @author Joshua Gross + **/ + newIM: function() { + var newIMWin; + if($('newIM')) { + Windows.getWindow('newIM').toFront(); + return; + } + + newIMWin = new Window({id: 'newIM', className: "dialog", width: 240, height: 120, resizable: false, title: Languages.get('newIM'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 120, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + newIMWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + newIMWin.getContent().innerHTML = '
      ' + Languages.get('newIMPlease') + '
      \ +   \ +
      \ +
      ' + Languages.get('username') + ':
      \ +
      \ +
      ' + + ButtonCtl.create(Languages.get('openIM'), 'IM.newIMWindow();') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'newIM\');') + + '
      '; + + $('newim_buttons').setStyle({position: 'absolute', top: '110px', left: '25px'}); + newIMWin.setDestroyOnClose(); + newIMWin.showCenter(); + setTimeout("$('sendto').focus();", 125); + }, + + /** + * Display a window that will allow the user + * to enter a name for a chat room to be created. + * + * @author Joshua Gross + **/ + newRoom: function() { + var newRoomWin; + if($('newRoom')) { + Windows.getWindow('newRoom').toFront(); + return; + } + + newRoomWin = new Window({id: 'newRoom', className: "dialog", width: 240, height: 300, resizable: false, title: Languages.get('newRoom'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 120, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + newRoomWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + newRoomWin.getContent().innerHTML = '
      ' + Languages.get('newRoomPlease') + '
      \ +   \ +
      \ +
      ' + Languages.get('roomname') + ':
      \ +
      \ +
      \ +
      ' + + ButtonCtl.create(Languages.get('joinRoom'), 'Chatroom.join($(\'roomname\').value);') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'newRoom\');') + + '
      '; + + $('newroom_buttons').setStyle({position: 'absolute', top: '290px', left: '25px'}); + + ChatroomList.get($('newroom_room_list')); + + newRoomWin.setDestroyOnClose(); + newRoomWin.showCenter(); + setTimeout("$('roomname').focus();", 125); + }, + + /** + * Display a window to allow the user to enter another + * buddy's username and a group name to have the user added + * to the user's buddylist. + * + * @author Joshua Gross + **/ + newBuddy: function() { + var newBuddyWin; + if($('newBuddy')) { + Windows.getWindow('newBuddy').toFront(); + return; + } + + newBuddyWin = new Window({id: 'newBuddy', className: "dialog", width: 240, height: 160, resizable: false, title: Languages.get('newBuddy'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 120, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + newBuddyWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + newBuddyWin.getContent().innerHTML = '
      ' + Languages.get('newBuddyPlease') + '
      \ +   \ +
      \ +
      ' + Languages.get('username') + ':

      \ +
      ' + Languages.get('addtogroup') + ':
      \ +
      \ +
      ' + + ButtonCtl.create(Languages.get('add'), 'Buddylist.addNewBuddy($(\'newBuddyUsername\').value, $(\'newBuddyGroup\').value);') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'newBuddy\');') + + '
      '; + + $('newbuddy_buttons').setStyle({position: 'absolute', top: '150px', left: '25px'}); + + newBuddyWin.setDestroyOnClose(); + newBuddyWin.showCenter(); + setTimeout("$('newBuddyUsername').focus();", 125); + }, + + /** + * Display a window to confirm the removal of a buddy. + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + removeBuddy: function(username) { + var delBuddyWin; + + if (typeof username == 'undefined') + var username = curSelected; + + if(username == '' || username.length == 0) + return; + + if($('delBuddy')) { + Windows.getWindow('delBuddy').toFront(); + return; + } + + delBuddyWin = new Window({id: 'delBuddy', className: "dialog", width: 240, height: 70, resizable: false, title: Languages.get('removeBuddy'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight:70, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + delBuddyWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + delBuddyWin.getContent().innerHTML = '
      ' + Languages.get('removeBuddyAreYouSure').replace('%1', username) + '
      \ +
      ' + + ButtonCtl.create(Languages.get('ok'), 'Buddylist.deleteBuddy(\'' + username + '\');Windows.close(\'delBuddy\');') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'delBuddy\');') + + '
      '; + + $('delbuddy_buttons').setStyle({position: 'absolute', top: '60px', left: '25px'}); + + delBuddyWin.setDestroyOnClose(); + delBuddyWin.showCenter(); + }, + + /** + * Display a window to confirm the blocking/unblocking + * of a buddy. + * + * @author Joshua Gross + **/ + blockBuddy: function(buddy) { + var blockBuddyWin; + + if($('blockBuddy')) { + Windows.getWindow('blockBuddy').toFront(); + return; + } + + blockBuddyWin = new Window({id: 'blockBuddy', className: "dialog", width: 240, height: 70, resizable: false, title: Languages.get('blockBuddy'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight:70, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + blockBuddyWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + blockBuddyWin.getContent().innerHTML = '
      ' + (Buddylist.blocked.inArray(buddy) ? Languages.get('unblockBuddyAreYouSure').replace('%1', buddy) : Languages.get('blockBuddyAreYouSure').replace('%1', buddy)) + '
      \ +
      ' + + ButtonCtl.create(Languages.get('ok'), 'Buddylist.blockBuddy(\'' + buddy + '\');Windows.close(\'blockBuddy\');') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'blockBuddy\');') + + '
      '; + + $('blockbuddy_buttons').setStyle({position: 'absolute', top: '60px', left: '25px'}); + + blockBuddyWin.setDestroyOnClose(); + blockBuddyWin.showCenter(); + }, + + /** + * Display a window to confirm the removal of an + * entire buddy group. + * + * @author Joshua Gross + **/ + removeGroup: function(group) { + var delGroupWin; + if($('delGroup')) { + Windows.getWindow('delGroup').toFront(); + return; + } + + delGroupWin = new Window({id: 'delGroup', className: "dialog", width: 240, height: 70, resizable: false, title: Languages.get('removeGroup'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight:70, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + delGroupWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + delGroupWin.getContent().innerHTML = '
      ' + Languages.get('removeGroupAreYouSure').replace('%1', group) + '
      \ +
      ' + + ButtonCtl.create(Languages.get('ok'), 'Buddylist.deleteGroup(\'' + group + '\');Windows.close(\'delGroup\');') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'delGroup\');') + + '
      '; + + $('delgroup_buttons').setStyle({position: 'absolute', top: '60px', left: '25px'}); + + delGroupWin.setDestroyOnClose(); + delGroupWin.showCenter(); + }, + + /** + * Display a window to show the available settings + * that the user can change. + * + * @author Benjamin Hutchins + **/ + changeSettings: function() { + var changeSettings; + if($('changeSettings')) { + Windows.getWindow('changeSettings').toFront(); + return; + } + + changeSettings = new Window({id: 'changeSettings', className: "dialog", width: 300, height: 160, resizable: false, title: Languages.get('changeSettings'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 150, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + changeSettings.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + changeSettings.getContent().innerHTML = '
      ' + Languages.get('changeSettingsInstructions') + '
      \ +
      ' + + ButtonCtl.create(Languages.get('changeSettingsPassword'), 'Dialogs.changePass();if($(\'changeSettings\')){Windows.close(\'changeSettings\');}') + + ButtonCtl.create(Languages.get('changeSettingsProfile'), 'Dialogs.changeProfile();if($(\'changeSettings\')){Windows.close(\'changeSettings\');}') + + (useIcons ? ButtonCtl.create(Languages.get('changeSettingsBuddyicon'), 'Dialogs.changeIcon();if($(\'changeSettings\')){Windows.close(\'changeSettings\');}') : '') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'changeSettings\');') + + '
      '; + + $('changesettings_buttons').setStyle({position: 'absolute', top: '60px', left: '85px'}); + + changeSettings.setDestroyOnClose(); + changeSettings.showCenter(); + }, + + /** + * Display a window to allow the user to change + * their buddy profile. + * + * @author Benjamin Hutchins + **/ + changeProfile: function() { + var changeProfileWin; + if($('changeProfile')) { + Windows.getWindow('changeProfile').toFront(); + return; + } + + changeProfileWin = new Window({id: 'changeProfile', className: "dialog", width: 300, height: 250, resizable: false, title: Languages.get('changeProfile'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 240, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + changeProfileWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + changeProfileWin.getContent().innerHTML = '
      ' + Languages.get('changeProfileInstructions') + '
      \ +   \ + \ +
      ' + + ButtonCtl.create(Languages.get('change'), 'System.changeProfile();') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'changeProfile\');') + + '
      '; + + $('changeprofile_buttons').setStyle({position: 'absolute', top: '245px', left: '55px'}); + + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=getprofile&user="+user, + function(xh) { + $('changeprofile_textarea').value = xh.responseText; + } + ); + + changeProfileWin.setDestroyOnClose(); + changeProfileWin.showCenter(); + }, + + /** + * Display a window to allow the user to upload + * a new buddy icon. + * + * @author Benjamin Hutchins + **/ + changeIcon: function () { + if(!useIcons) return; + + var changeIconWin; + if($('changeIcon')) { + Windows.getWindow('changeIcon').toFront(); + return; + } + + changeIconWin = new Window({id: 'changeIcon', className: "dialog", width: 300, height: 160, resizable: false, title: Languages.get('changeBuddyicon'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 120, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + changeIconWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + changeIconWin.getContent().innerHTML = '
      ' + Languages.get('changeBuddyiconInstructions') + '
      \ +   \ +
      \ + \ + \ +
      ' + + ButtonCtl.createSubmit(Languages.get('change')) + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'changeIcon\');') + + '' + + '' + + '
      '; + + $('changeicon_buttons').setStyle({position: 'absolute', top: '150px', left: '55px'}); + + changeIconWin.setDestroyOnClose(); + changeIconWin.showCenter(); + }, + + /** + * Display a window to allow the user to change + * their password. + * + * @author Joshua Gross + **/ + changePass: function() { + var changePassWin; + if($('changePass')) { + Windows.getWindow('changePass').toFront(); + return; + } + + changePassWin = new Window({id: 'changePass', className: "dialog", width: 300, height: 160, resizable: false, title: Languages.get('changePassword'), draggable: true, closable: true, maximizable: false, minimizable: false, detachable: false, minWidth: 240, minHeight: 120, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + changePassWin.setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + changePassWin.getContent().innerHTML = '
      ' + Languages.get('changePasswordInstructions') + '
      \ +   \ +
      \ +
      ' + Languages.get('currentPassword') + ':

      \ +
      ' + Languages.get('newPassword') + ':
      \ +
      ' + Languages.get('confirmPassword') + ':
      \ +
      \ +
      ' + + ButtonCtl.create(Languages.get('change'), 'System.changePass();') + + ButtonCtl.create(Languages.get('cancel'), 'Windows.close(\'changePass\');') + + '
      '; + + $('changepass_buttons').setStyle({position: 'absolute', top: '150px', left: '55px'}); + + changePassWin.setDestroyOnClose(); + changePassWin.showCenter(); + setTimeout("$('currentpw').focus();", 125); + } +}; diff --git a/js/effects.js b/js/effects.js new file mode 100644 index 0000000..d57727e --- /dev/null +++ b/js/effects.js @@ -0,0 +1,11 @@ +// script.aculo.us effects.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008 + +// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ +String.prototype.parseColor=function(){var A="#";if(this.slice(0,4)=="rgb("){var C=this.slice(4,this.length-1).split(",");var B=0;do{A+=parseInt(C[B]).toColorPart()}while(++B<3)}else{if(this.slice(0,1)=="#"){if(this.length==4){for(var B=1;B<4;B++){A+=(this.charAt(B)+this.charAt(B)).toLowerCase()}}if(this.length==7){A=this.toLowerCase()}}}return(A.length==7?A:(arguments[0]||this))};Element.collectTextNodes=function(A){return $A($(A).childNodes).collect(function(B){return(B.nodeType==3?B.nodeValue:(B.hasChildNodes()?Element.collectTextNodes(B):""))}).flatten().join("")};Element.collectTextNodesIgnoreClass=function(A,B){return $A($(A).childNodes).collect(function(C){return(C.nodeType==3?C.nodeValue:((C.hasChildNodes()&&!Element.hasClassName(C,B))?Element.collectTextNodesIgnoreClass(C,B):""))}).flatten().join("")};Element.setContentZoom=function(A,B){A=$(A);A.setStyle({fontSize:(B/100)+"em"});if(Prototype.Browser.WebKit){window.scrollBy(0,0)}return A};Element.getInlineOpacity=function(A){return $(A).style.opacity||""};Element.forceRerendering=function(A){try{A=$(A);var C=document.createTextNode(" ");A.appendChild(C);A.removeChild(C)}catch(B){}};var Effect={_elementDoesNotExistError:{name:"ElementDoesNotExistError",message:"The specified DOM element does not exist, but is required for this effect to operate"},Transitions:{linear:Prototype.K,sinoidal:function(A){return(-Math.cos(A*Math.PI)/2)+0.5},reverse:function(A){return 1-A},flicker:function(A){var A=((-Math.cos(A*Math.PI)/4)+0.75)+Math.random()/4;return A>1?1:A},wobble:function(A){return(-Math.cos(A*Math.PI*(9*A))/2)+0.5},pulse:function(B,A){A=A||5;return(((B%(1/A))*A).round()==0?((B*A*2)-(B*A*2).floor()):1-((B*A*2)-(B*A*2).floor()))},spring:function(A){return 1-(Math.cos(A*4.5*Math.PI)*Math.exp(-A*6))},none:function(A){return 0},full:function(A){return 1}},DefaultOptions:{duration:1,fps:100,sync:false,from:0,to:1,delay:0,queue:"parallel"},tagifyText:function(A){var B="position:relative";if(Prototype.Browser.IE){B+=";zoom:1"}A=$(A);$A(A.childNodes).each(function(C){if(C.nodeType==3){C.nodeValue.toArray().each(function(D){A.insertBefore(new Element("span",{style:B}).update(D==" "?String.fromCharCode(160):D),C)});Element.remove(C)}})},multiple:function(B,C){var E;if(((typeof B=="object")||Object.isFunction(B))&&(B.length)){E=B}else{E=$(B).childNodes}var A=Object.extend({speed:0.1,delay:0},arguments[2]||{});var D=A.delay;$A(E).each(function(G,F){new C(G,Object.extend(A,{delay:F*A.speed+D}))})},PAIRS:{"slide":["SlideDown","SlideUp"],"blind":["BlindDown","BlindUp"],"appear":["Appear","Fade"]},toggle:function(B,C){B=$(B);C=(C||"appear").toLowerCase();var A=Object.extend({queue:{position:"end",scope:(B.id||"global"),limit:1}},arguments[2]||{});Effect[B.visible()?Effect.PAIRS[C][1]:Effect.PAIRS[C][0]](B,A)}};Effect.DefaultOptions.transition=Effect.Transitions.sinoidal;Effect.ScopedQueue=Class.create(Enumerable,{initialize:function(){this.effects=[];this.interval=null},_each:function(A){this.effects._each(A)},add:function(B){var C=new Date().getTime();var A=Object.isString(B.options.queue)?B.options.queue:B.options.queue.position;switch(A){case"front":this.effects.findAll(function(D){return D.state=="idle"}).each(function(D){D.startOn+=B.finishOn;D.finishOn+=B.finishOn});break;case"with-last":C=this.effects.pluck("startOn").max()||C;break;case"end":C=this.effects.pluck("finishOn").max()||C;break}B.startOn+=C;B.finishOn+=C;if(!B.options.queue.limit||(this.effects.length=this.startOn){if(C>=this.finishOn){this.render(1);this.cancel();this.event("beforeFinish");if(this.finish){this.finish()}this.event("afterFinish");return }var B=(C-this.startOn)/this.totalTime,A=(B*this.totalFrames).round();if(A>this.currentFrame){this.render(B);this.currentFrame=A}}},cancel:function(){if(!this.options.sync){Effect.Queues.get(Object.isString(this.options.queue)?"global":this.options.queue.scope).remove(this)}this.state="finished"},event:function(A){if(this.options[A+"Internal"]){this.options[A+"Internal"](this)}if(this.options[A]){this.options[A](this)}},inspect:function(){var A=$H();for(property in this){if(!Object.isFunction(this[property])){A.set(property,this[property])}}return"#"}});Effect.Parallel=Class.create(Effect.Base,{initialize:function(A){this.effects=A||[];this.start(arguments[1])},update:function(A){this.effects.invoke("render",A)},finish:function(A){this.effects.each(function(B){B.render(1);B.cancel();B.event("beforeFinish");if(B.finish){B.finish(A)}B.event("afterFinish")})}});Effect.Tween=Class.create(Effect.Base,{initialize:function(C,F,E){C=Object.isString(C)?$(C):C;var B=$A(arguments),D=B.last(),A=B.length==5?B[3]:null;this.method=Object.isFunction(D)?D.bind(C):Object.isFunction(C[D])?C[D].bind(C):function(G){C[D]=G};this.start(Object.extend({from:F,to:E},A||{}))},update:function(A){this.method(A)}});Effect.Event=Class.create(Effect.Base,{initialize:function(){this.start(Object.extend({duration:0},arguments[0]||{}))},update:Prototype.emptyFunction});Effect.Opacity=Class.create(Effect.Base,{initialize:function(B){this.element=$(B);if(!this.element){throw (Effect._elementDoesNotExistError)}if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}var A=Object.extend({from:this.element.getOpacity()||0,to:1},arguments[1]||{});this.start(A)},update:function(A){this.element.setOpacity(A)}});Effect.Move=Class.create(Effect.Base,{initialize:function(B){this.element=$(B);if(!this.element){throw (Effect._elementDoesNotExistError)}var A=Object.extend({x:0,y:0,mode:"relative"},arguments[1]||{});this.start(A)},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle("left")||"0");this.originalTop=parseFloat(this.element.getStyle("top")||"0");if(this.options.mode=="absolute"){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop}},update:function(A){this.element.setStyle({left:(this.options.x*A+this.originalLeft).round()+"px",top:(this.options.y*A+this.originalTop).round()+"px"})}});Effect.MoveBy=function(B,A,C){return new Effect.Move(B,Object.extend({x:C,y:A},arguments[3]||{}))};Effect.Scale=Class.create(Effect.Base,{initialize:function(B,C){this.element=$(B);if(!this.element){throw (Effect._elementDoesNotExistError)}var A=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:C},arguments[2]||{});this.start(A)},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle("position");this.originalStyle={};["top","left","width","height","fontSize"].each(function(B){this.originalStyle[B]=this.element.style[B]}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var A=this.element.getStyle("font-size")||"100%";["em","px","%","pt"].each(function(B){if(A.indexOf(B)>0){this.fontSize=parseFloat(A);this.fontSizeType=B}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=="box"){this.dims=[this.element.offsetHeight,this.element.offsetWidth]}if(/^content/.test(this.options.scaleMode)){this.dims=[this.element.scrollHeight,this.element.scrollWidth]}if(!this.dims){this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth]}},update:function(A){var B=(this.options.scaleFrom/100)+(this.factor*A);if(this.options.scaleContent&&this.fontSize){this.element.setStyle({fontSize:this.fontSize*B+this.fontSizeType})}this.setDimensions(this.dims[0]*B,this.dims[1]*B)},finish:function(A){if(this.restoreAfterFinish){this.element.setStyle(this.originalStyle)}},setDimensions:function(A,D){var E={};if(this.options.scaleX){E.width=D.round()+"px"}if(this.options.scaleY){E.height=A.round()+"px"}if(this.options.scaleFromCenter){var C=(A-this.dims[0])/2;var B=(D-this.dims[1])/2;if(this.elementPositioning=="absolute"){if(this.options.scaleY){E.top=this.originalTop-C+"px"}if(this.options.scaleX){E.left=this.originalLeft-B+"px"}}else{if(this.options.scaleY){E.top=-C+"px"}if(this.options.scaleX){E.left=-B+"px"}}}this.element.setStyle(E)}});Effect.Highlight=Class.create(Effect.Base,{initialize:function(B){this.element=$(B);if(!this.element){throw (Effect._elementDoesNotExistError)}var A=Object.extend({startcolor:"#ffff99"},arguments[1]||{});this.start(A)},setup:function(){if(this.element.getStyle("display")=="none"){this.cancel();return }this.oldStyle={};if(!this.options.keepBackgroundImage){this.oldStyle.backgroundImage=this.element.getStyle("background-image");this.element.setStyle({backgroundImage:"none"})}if(!this.options.endcolor){this.options.endcolor=this.element.getStyle("background-color").parseColor("#ffffff")}if(!this.options.restorecolor){this.options.restorecolor=this.element.getStyle("background-color")}this._base=$R(0,2).map(function(A){return parseInt(this.options.startcolor.slice(A*2+1,A*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(A){return parseInt(this.options.endcolor.slice(A*2+1,A*2+3),16)-this._base[A]}.bind(this))},update:function(A){this.element.setStyle({backgroundColor:$R(0,2).inject("#",function(B,C,D){return B+((this._base[D]+(this._delta[D]*A)).round().toColorPart())}.bind(this))})},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}))}});Effect.ScrollTo=function(D){var C=arguments[1]||{},B=document.viewport.getScrollOffsets(),E=$(D).cumulativeOffset(),A=(window.height||document.body.scrollHeight)-document.viewport.getHeight();if(C.offset){E[1]+=C.offset}return new Effect.Tween(null,B.top,E[1]>A?A:E[1],C,function(F){scrollTo(B.left,F.round())})};Effect.Fade=function(C){C=$(C);var A=C.getInlineOpacity();var B=Object.extend({from:C.getOpacity()||1,to:0,afterFinishInternal:function(D){if(D.options.to!=0){return }D.element.hide().setStyle({opacity:A})}},arguments[1]||{});return new Effect.Opacity(C,B)};Effect.Appear=function(B){B=$(B);var A=Object.extend({from:(B.getStyle("display")=="none"?0:B.getOpacity()||0),to:1,afterFinishInternal:function(C){C.element.forceRerendering()},beforeSetup:function(C){C.element.setOpacity(C.options.from).show()}},arguments[1]||{});return new Effect.Opacity(B,A)};Effect.Puff=function(B){B=$(B);var A={opacity:B.getInlineOpacity(),position:B.getStyle("position"),top:B.style.top,left:B.style.left,width:B.style.width,height:B.style.height};return new Effect.Parallel([new Effect.Scale(B,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(B,{sync:true,to:0})],Object.extend({duration:1,beforeSetupInternal:function(C){Position.absolutize(C.effects[0].element)},afterFinishInternal:function(C){C.effects[0].element.hide().setStyle(A)}},arguments[1]||{}))};Effect.BlindUp=function(A){A=$(A);A.makeClipping();return new Effect.Scale(A,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(B){B.element.hide().undoClipping()}},arguments[1]||{}))};Effect.BlindDown=function(B){B=$(B);var A=B.getDimensions();return new Effect.Scale(B,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:A.height,originalWidth:A.width},restoreAfterFinish:true,afterSetup:function(C){C.element.makeClipping().setStyle({height:"0px"}).show()},afterFinishInternal:function(C){C.element.undoClipping()}},arguments[1]||{}))};Effect.SwitchOff=function(B){B=$(B);var A=B.getInlineOpacity();return new Effect.Appear(B,Object.extend({duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(C){new Effect.Scale(C.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(D){D.element.makePositioned().makeClipping()},afterFinishInternal:function(D){D.element.hide().undoClipping().undoPositioned().setStyle({opacity:A})}})}},arguments[1]||{}))};Effect.DropOut=function(B){B=$(B);var A={top:B.getStyle("top"),left:B.getStyle("left"),opacity:B.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(B,{x:0,y:100,sync:true}),new Effect.Opacity(B,{sync:true,to:0})],Object.extend({duration:0.5,beforeSetup:function(C){C.effects[0].element.makePositioned()},afterFinishInternal:function(C){C.effects[0].element.hide().undoPositioned().setStyle(A)}},arguments[1]||{}))};Effect.Shake=function(D){D=$(D);var B=Object.extend({distance:20,duration:0.5},arguments[1]||{});var E=parseFloat(B.distance);var C=parseFloat(B.duration)/10;var A={top:D.getStyle("top"),left:D.getStyle("left")};return new Effect.Move(D,{x:E,y:0,duration:C,afterFinishInternal:function(F){new Effect.Move(F.element,{x:-E*2,y:0,duration:C*2,afterFinishInternal:function(G){new Effect.Move(G.element,{x:E*2,y:0,duration:C*2,afterFinishInternal:function(H){new Effect.Move(H.element,{x:-E*2,y:0,duration:C*2,afterFinishInternal:function(I){new Effect.Move(I.element,{x:E*2,y:0,duration:C*2,afterFinishInternal:function(J){new Effect.Move(J.element,{x:-E,y:0,duration:C,afterFinishInternal:function(K){K.element.undoPositioned().setStyle(A)}})}})}})}})}})}})};Effect.SlideDown=function(C){C=$(C).cleanWhitespace();var A=C.down().getStyle("bottom");var B=C.getDimensions();return new Effect.Scale(C,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:B.height,originalWidth:B.width},restoreAfterFinish:true,afterSetup:function(D){D.element.makePositioned();D.element.down().makePositioned();if(window.opera){D.element.setStyle({top:""})}D.element.makeClipping().setStyle({height:"0px"}).show()},afterUpdateInternal:function(D){D.element.down().setStyle({bottom:(D.dims[0]-D.element.clientHeight)+"px"})},afterFinishInternal:function(D){D.element.undoClipping().undoPositioned();D.element.down().undoPositioned().setStyle({bottom:A})}},arguments[1]||{}))};Effect.SlideUp=function(C){C=$(C).cleanWhitespace();var A=C.down().getStyle("bottom");var B=C.getDimensions();return new Effect.Scale(C,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,scaleMode:{originalHeight:B.height,originalWidth:B.width},restoreAfterFinish:true,afterSetup:function(D){D.element.makePositioned();D.element.down().makePositioned();if(window.opera){D.element.setStyle({top:""})}D.element.makeClipping().show()},afterUpdateInternal:function(D){D.element.down().setStyle({bottom:(D.dims[0]-D.element.clientHeight)+"px"})},afterFinishInternal:function(D){D.element.hide().undoClipping().undoPositioned();D.element.down().undoPositioned().setStyle({bottom:A})}},arguments[1]||{}))};Effect.Squish=function(A){return new Effect.Scale(A,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(B){B.element.makeClipping()},afterFinishInternal:function(B){B.element.hide().undoClipping()}})};Effect.Grow=function(C){C=$(C);var B=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var A={top:C.style.top,left:C.style.left,height:C.style.height,width:C.style.width,opacity:C.getInlineOpacity()};var G=C.getDimensions();var H,F;var E,D;switch(B.direction){case"top-left":H=F=E=D=0;break;case"top-right":H=G.width;F=D=0;E=-G.width;break;case"bottom-left":H=E=0;F=G.height;D=-G.height;break;case"bottom-right":H=G.width;F=G.height;E=-G.width;D=-G.height;break;case"center":H=G.width/2;F=G.height/2;E=-G.width/2;D=-G.height/2;break}return new Effect.Move(C,{x:H,y:F,duration:0.01,beforeSetup:function(I){I.element.hide().makeClipping().makePositioned()},afterFinishInternal:function(I){new Effect.Parallel([new Effect.Opacity(I.element,{sync:true,to:1,from:0,transition:B.opacityTransition}),new Effect.Move(I.element,{x:E,y:D,sync:true,transition:B.moveTransition}),new Effect.Scale(I.element,100,{scaleMode:{originalHeight:G.height,originalWidth:G.width},sync:true,scaleFrom:window.opera?1:0,transition:B.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(J){J.effects[0].element.setStyle({height:"0px"}).show()},afterFinishInternal:function(J){J.effects[0].element.undoClipping().undoPositioned().setStyle(A)}},B))}})};Effect.Shrink=function(C){C=$(C);var B=Object.extend({direction:"center",moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var A={top:C.style.top,left:C.style.left,height:C.style.height,width:C.style.width,opacity:C.getInlineOpacity()};var F=C.getDimensions();var E,D;switch(B.direction){case"top-left":E=D=0;break;case"top-right":E=F.width;D=0;break;case"bottom-left":E=0;D=F.height;break;case"bottom-right":E=F.width;D=F.height;break;case"center":E=F.width/2;D=F.height/2;break}return new Effect.Parallel([new Effect.Opacity(C,{sync:true,to:0,from:1,transition:B.opacityTransition}),new Effect.Scale(C,window.opera?1:0,{sync:true,transition:B.scaleTransition,restoreAfterFinish:true}),new Effect.Move(C,{x:E,y:D,sync:true,transition:B.moveTransition})],Object.extend({beforeStartInternal:function(G){G.effects[0].element.makePositioned().makeClipping()},afterFinishInternal:function(G){G.effects[0].element.hide().undoClipping().undoPositioned().setStyle(A)}},B))};Effect.Pulsate=function(C){C=$(C);var B=arguments[1]||{};var A=C.getInlineOpacity();var E=B.transition||Effect.Transitions.sinoidal;var D=function(F){return E(1-Effect.Transitions.pulse(F,B.pulses))};D.bind(E);return new Effect.Opacity(C,Object.extend(Object.extend({duration:2,from:0,afterFinishInternal:function(F){F.element.setStyle({opacity:A})}},B),{transition:D}))};Effect.Fold=function(B){B=$(B);var A={top:B.style.top,left:B.style.left,width:B.style.width,height:B.style.height};B.makeClipping();return new Effect.Scale(B,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(C){new Effect.Scale(B,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(D){D.element.hide().undoClipping().setStyle(A)}})}},arguments[1]||{}))};Effect.Morph=Class.create(Effect.Base,{initialize:function(C){this.element=$(C);if(!this.element){throw (Effect._elementDoesNotExistError)}var A=Object.extend({style:{}},arguments[1]||{});if(!Object.isString(A.style)){this.style=$H(A.style)}else{if(A.style.include(":")){this.style=A.style.parseStyle()}else{this.element.addClassName(A.style);this.style=$H(this.element.getStyles());this.element.removeClassName(A.style);var B=this.element.getStyles();this.style=this.style.reject(function(D){return D.value==B[D.key]});A.afterFinishInternal=function(D){D.element.addClassName(D.options.style);D.transforms.each(function(E){D.element.style[E.style]=""})}}}this.start(A)},setup:function(){function A(B){if(!B||["rgba(0, 0, 0, 0)","transparent"].include(B)){B="#ffffff"}B=B.parseColor();return $R(0,2).map(function(C){return parseInt(B.slice(C*2+1,C*2+3),16)})}this.transforms=this.style.map(function(G){var F=G[0],E=G[1],D=null;if(E.parseColor("#zzzzzz")!="#zzzzzz"){E=E.parseColor();D="color"}else{if(F=="opacity"){E=parseFloat(E);if(Prototype.Browser.IE&&(!this.element.currentStyle.hasLayout)){this.element.setStyle({zoom:1})}}else{if(Element.CSS_LENGTH.test(E)){var C=E.match(/^([\+\-]?[0-9\.]+)(.*)$/);E=parseFloat(C[1]);D=(C.length==3)?C[2]:null}}}var B=this.element.getStyle(F);return{style:F.camelize(),originalValue:D=="color"?A(B):parseFloat(B||0),targetValue:D=="color"?A(E):E,unit:D}}.bind(this)).reject(function(B){return((B.originalValue==B.targetValue)||(B.unit!="color"&&(isNaN(B.originalValue)||isNaN(B.targetValue))))})},update:function(A){var D={},B,C=this.transforms.length;while(C--){D[(B=this.transforms[C]).style]=B.unit=="color"?"#"+(Math.round(B.originalValue[0]+(B.targetValue[0]-B.originalValue[0])*A)).toColorPart()+(Math.round(B.originalValue[1]+(B.targetValue[1]-B.originalValue[1])*A)).toColorPart()+(Math.round(B.originalValue[2]+(B.targetValue[2]-B.originalValue[2])*A)).toColorPart():(B.originalValue+(B.targetValue-B.originalValue)*A).toFixed(3)+(B.unit===null?"":B.unit)}this.element.setStyle(D,true)}});Effect.Transform=Class.create({initialize:function(A){this.tracks=[];this.options=arguments[1]||{};this.addTracks(A)},addTracks:function(A){A.each(function(B){B=$H(B);var C=B.values().first();this.tracks.push($H({ids:B.keys().first(),effect:Effect.Morph,options:{style:C}}))}.bind(this));return this},play:function(){return new Effect.Parallel(this.tracks.map(function(A){var D=A.get("ids"),C=A.get("effect"),B=A.get("options");var E=[$(D)||$$(D)].flatten();return E.map(function(F){return new C(F,Object.extend({sync:true},B))})}).flatten(),this.options)}});Element.CSS_PROPERTIES=$w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex");Element.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;String.__parseStyleElement=document.createElement("div");String.prototype.parseStyle=function(){var B,A=$H();if(Prototype.Browser.WebKit){B=new Element("div",{style:this}).style}else{String.__parseStyleElement.innerHTML='
      ';B=String.__parseStyleElement.childNodes[0].style}Element.CSS_PROPERTIES.each(function(C){if(B[C]){A.set(C,B[C])}});if(Prototype.Browser.IE&&this.include("opacity")){A.set("opacity",this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1])}return A};if(document.defaultView&&document.defaultView.getComputedStyle){Element.getStyles=function(B){var A=document.defaultView.getComputedStyle($(B),null);return Element.CSS_PROPERTIES.inject({},function(C,D){C[D]=A[D];return C})}}else{Element.getStyles=function(B){B=$(B);var A=B.currentStyle,C;C=Element.CSS_PROPERTIES.inject({},function(D,E){D[E]=A[E];return D});if(!C.opacity){C.opacity=B.getOpacity()}return C}}Effect.Methods={morph:function(A,B){A=$(A);new Effect.Morph(A,Object.extend({style:B},arguments[2]||{}));return A},visualEffect:function(C,E,B){C=$(C);var D=E.dasherize().camelize(),A=D.charAt(0).toUpperCase()+D.substring(1);new Effect[A](C,B);return C},highlight:function(B,A){B=$(B);new Effect.Highlight(B,A);return B}};$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function(A){Effect.Methods[A]=function(C,B){C=$(C);Effect[A.charAt(0).toUpperCase()+A.substring(1)](C,B);return C}});$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(A){Effect.Methods[A]=Element[A]});Element.addMethods(Effect.Methods) \ No newline at end of file diff --git a/js/im.basic.js b/js/im.basic.js new file mode 100644 index 0000000..9abf415 --- /dev/null +++ b/js/im.basic.js @@ -0,0 +1,584 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * AjaxIM Class + * + * @author Joshua Gross + **/ +var AjaxIM = { + windows: {}, // JavaScript object to hold all IM windows + sendBoxWithFocus: null, // current box that has focus + + /** + * Create new IM window + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + create: function(name, imTitle) { + var buddyicon = typeof Buddylist.listObjects[name] == 'undefined' ? 'none' : Buddylist.listObjects[name].icon; + var iconsrc = (buddyicon=='none'?defaultIcon:pathToIcons+name+'.'+buddyicon); + var imLeft = Math.round(Math.random()*(Browser.width()-360))+'px'; + var imTop = Math.round(Math.random()*(Browser.height()-400))+'px'; + + var winId = randomString(32) + '_im'; + + this.windows[name] = new IMWindow({id: winId, className: "dialog", width: 320, height: 335, top: imTop, left: imLeft, resizable: true, title: imTitle, draggable: true, detachable: imDetachable, minWidth: 320, minHeight: 150, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + this.windows[name].setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + + this.windows[name].getContent().innerHTML = '
      ' + + '' + Languages.get('addBuddyButton') + ' ' + + '' + + '
      ' + + (useIcons?(defaultIcon==""&&buddyicon=="none"?'':'Buddy Icon'):'') + + '
      ' + "\n" + + '
      ' + Languages.get('bold') + ' ' + + '' + Languages.get('italic') + ' '+ + '' + Languages.get('underline') + '
      ' + + ' Tahoma' + + ' 12' + + '
      ' + + ' ' + + "\n" + '
      '; + + this.windows[name].setUsername(name); + + $(winId + '_rcvd').setStyle({height: (this.windows[name].getSize().height - 135) + 'px', width: (this.windows[name].getSize().width - 10) + 'px'}); + $(winId + '_toolbar').setStyle({top: (this.windows[name].getSize().height - 73) + 'px', width: (this.windows[name].getSize().width - 10) + 'px'}); + $(winId + '_setFont').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontSize').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontColor').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_setFontColorColor').setStyle({backgroundColor: '#000'}); + $(winId + '_insertEmoticon').setStyle({top: (this.windows[name].getSize().height - 65) + 'px'}); + $(winId + '_sendBox').setStyle({top: (this.windows[name].getSize().height - 45) + 'px', left: '2px', width: (this.windows[name].getSize().width - 16) + 'px', fontWeight: '400', fontStyle: 'normal', textDecoration: 'none'}); + + this.windows[name].show(); + this.windows[name].toFront(); + Windows.focusedWindow = this.windows[name]; + setTimeout("$('"+winId+"_sendBox').focus();", 250); + if (vanishingIcons){setTimeout("if($('buddyIcon_"+name+"')){$('buddyIcon_"+name+"').hide();}", vanishingSpeed);} + }, + + /** + * Sends a message to the server + * + * @arguments + * username - who the message is being sent to + * message - the message to send + * chatroom - (bool) is this a chatroom + * isBold - (bool) is the message bolded + * isItalic - (bool) is the message italicized + * isUnderline - (bool) is the message underlined + * fontName - font family for the message + * fontSize - font size for the message + * fontColor - font color for the message + * + * @author Joshua Gross + **/ + sendMessage: function(username, message, chatroom, isBold, isItalic, isUnderline, fontName, fontSize, fontColor) { + var xhConn = new XHConn(); + + xhConn.connect(pingTo, "POST", "call=send&recipient="+username+"&chatroom="+chatroom+"&bold="+isBold+"&italic="+isItalic+"&underline="+isUnderline+"&font="+fontName+"&fontsize="+fontSize+"&fontcolor="+fontColor+"&message="+encodeURIComponent(message), + function(xh) { + var error = null; + + switch(xh.responseText) { + case 'sent': + // do nothing + break; + + case 'sent_offline': + error = Languages.get('notifySentButOffline'); + break; + + case 'not_online': + error = Languages.get('errorNotLoggedIn'); + break; + + case 'too_long': + error = Languages.get('errorMsgTooLong'); + break; + + case 'not_logged_in': + if (typeof System != 'undefined') { + System.logout(); + } else { + self.opener.System.logout(); + } + break; + + default: + error = Languages.get('errorUnknown'); + break; + } + + if(chatroom == 'true') + Chatroom.windows[username].sendResult(message, isBold, isItalic, isUnderline, fontName, fontSize, fontColor, error); + else + IM.windows[username].sendResult(message, isBold, isItalic, isUnderline, fontName, fontSize, fontColor, error); + } + ); + + if(audioNotify == true) soundManager.play('msg_out'); + }, + + /** + * Replaces emotes with images + * + * @arguments + * str - the message to run replaces on + * itemsList - array of emotes + **/ + emoteReplace: function(str, itemsList) { + var r; + for(var s in itemsList) { + if(str.indexOf(s) > -1) + str = str.replace(new RegExp(regExpEscape(s), 'g'), '' + itemsList[s] + ''); + } + return str; + }, + + /** + * Start a new message with a user that might not be in your buddy list, + * ran via Dialogs.newIM() + * + * @author Joshua Gross + **/ + newIMWindow: function() { + if($('sendto').value.replace(/^\s*|\s*$/g,"").length > 0) { + var toWhom = $('sendto').value; + + if(typeof(this.windows[toWhom]) == 'undefined') { + this.create(toWhom, toWhom); + } else { + if(!this.windows[toWhom].isVisible()) { + this.windows[toWhom].show(); + setTimeout("scrollToBottom('" + this.windows[toWhom].getId() + "_rcvd')", 125); + } + } + + Windows.close('newIM'); + this.windows[toWhom].toFront(); + setTimeout("$('" + this.windows[toWhom].getId() + "_sendBox').focus()", 125); + } else { + $('newim_error_msg').innerHTML = Languages.get('newIMProper'); + } + }, + + /** + * @author Joshua Gross + **/ + handleClose: function(eventName, win) { + if(win.getId().indexOf('_im') == -1 && win.getId().indexOf('_chat') == -1) return; + + if(typeof(win.room) !== 'undefined') Chatroom.leave(win.room); + + var rcvdBox = $(win.getId() + '_rcvd'); + if(imHistory == true) { + rcvdBox.innerHTML = '' + + rcvdBox.innerHTML.replace(new RegExp('\(' + Languages.get('autoreply') + ':\)/g'), Languages.get('autoreply') + ':').replace(/<(?![Bb][Rr] ?\/?)([^>]+)>/ig, '') + + "\n"; + } else { + rcvdBox.innerHTML = ''; + } + }, + + /** + * @author Joshua Gross + **/ + handleMinimize: function(eventName, win) { + if(win.getId().indexOf('_im') == -1) return; + + var curIM = $(win.getId() + '_rcvd'); + curIM.scrollTop = curIM.scrollHeight - curIM.clientHeight + 6; + }, + + /** + * Create a timestamp to use in a chat window based off the + * configuration variable 'timestamp' + * + * @author Joshua Gross + **/ + createTimestamp: function() { + Stamp = new Date(); + var tH = String(Stamp.getHours()); var ti = String(Stamp.getMinutes()); var ts = String(Stamp.getSeconds()); + var th = tH > 12 ? tH - 12 : tH; var ta = tH > 12 ? 'pm' : 'am'; var tA = tH > 12 ? 'PM' : 'AM'; + var td = String(Stamp.getDate()); var tm = String(Stamp.getMonth() + 1); + var tM = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'July', 'Aug', 'Sep', 'Nov', 'Dec'][tm - 1]; + var tY = String(Stamp.getFullYear()); var ty = tY.substring(2); + + tu = tm; tx = td; tQ = tH; + + tH = (tH.length > 1) ? tH : "0"+tH; ti = (ti.length > 1) ? ti : "0"+ti; + tq = (th.length > 1) ? th : "0"+th; ts = (ts.length > 1) ? ts : "0"+ts; + td = (td.length > 1) ? td : "0"+td; tm = (tm.length > 1) ? tm : "0"+tm; + if(typeof timestamp == 'undefined') { + timestamp = self.opener.timestamp; + } + return timestamp.replace(/H/, tH).replace(/h/, th).replace(/i/, ti).replace(/s/, ts) + .replace(/d/, td).replace(/Y/, tY).replace(/y/, ty).replace(/m/, tm) + .replace(/u/, tu).replace(/x/, tx).replace(/Q/, tQ).replace(/q/, tq) + .replace(/a/, ta).replace(/A/, tA).replace(/M/, tM); + }, + + /** + * Append status changes to chat window + * + * @author Benjamin Hutchins + **/ + notifyUser: function(username, error) { + if(typeof(IM.windows[username]) != 'undefined') { + if(IM.windows[username].isVisible()) { + IM.windows[username].sendResult('', '', '', '', '', '', '', error); + } + } + }, + + /** + * Add effects to a buddy icon. + * + * @arguments + * el - buddy icon element + * + * @author Benjamin Hutchins + **/ + buddyIconHover: function(el) { + /*var clone = new Element('img', { + 'src': $(el).src, + // 'id': $(el).id + '_clone', + // 'class': 'buddyIconClone', + // 'alt': '' // valid XHTML + }).insert(Element.getOffsetParent(el), 'content'); //.setStyle({'position': 'absolute', 'top': el.offsetTop, 'left': el.offsetLeft}); + //clonePosition(clone, el, {setLeft:true, setTop:true});*/ + }, + + /** + * Restore effects set by IM.buddyIconHover back to 'Normal' + * + * @arguments + * el - buddy icon element + * + * @author Benjamin Hutchins + **/ + buddyIconNormal: function(el) { + if ($(el.id + '_clone')) { + $(el.id + '_clone').remove(); + } + } +}; + + +/** + * A class to mantain an IM Window's guts. + * + * @author Joshua Gross + **/ +var AjaxIMWindow = Class.create(); +Object.extend(AjaxIMWindow.prototype, Window.prototype); +Object.extend(AjaxIMWindow.prototype, { + /** + * Set the class' username variable + * + * @author Joshua Gross + **/ + setUsername: function(username) { + this.username = username; + }, + + send: function() { + // do nothing here. + }, + + /** + * After a message is sent to the server via IM.sendMessage(), + * this function is ran to append the message to the user's window + * + * @arguments + * message - the message to send + * isBold - (bool) is the message bolded + * isItalic - (bool) is the message italicized + * isUnderline - (bool) is the message underlined + * fontName - font family for the message + * fontSize - font size for the message + * fontColor - font color for the message + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + sendResult: function(message, isBold, isItalic, isUnderline, fontName, fontSize, fontColor, result) { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + var rcvdBox = $(winId + '_rcvd'); + + if(result != null) { + rcvdBox.innerHTML = rcvdBox.innerHTML + '' + result + '
      '; + } + + if(trim(message).length > 0) { + message = message.replace(//g, '\n').replace(//g, '>').replace(/<([^>]+)>/ig, '').replace(/\n/g, '
      ').replace(/(\s|\n|>|^)(\w+:\/\/[^<\s\n]+)/, '$1$2'); + message = IM.emoteReplace(message, smilies); + if(message.replace(/<([^>]+)>/ig, '').indexOf('/me') == 0) + rcvdBox.innerHTML = rcvdBox.innerHTML + "" + IM.createTimestamp() + " " + user + ' ' + message.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "
      \n"; + else + rcvdBox.innerHTML = rcvdBox.innerHTML + "" + IM.createTimestamp() + " " + user + ": " + (isBold == 'true' ? "" : "") + (isItalic == 'true' ? "" : "") + (isUnderline == 'true' ? "" : "") + message + (isBold == 'true' ? "" : "") + (isItalic == 'true' ? "" : "") + (isUnderline == 'true' ? "" : "") + "
      \n"; + } + + scrollToBottom(winId + '_rcvd'); + }, + + /** + * @author Joshua Gross + **/ + toggleBold: function() { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.hide(); // horrah weird Opera 9 input refresh! + if(sendBox.style.fontWeight == '400') { + $(winId + '_bold').src = 'themes/' + theme + '/window/bold_on.png'; + sendBox.setStyle({fontWeight: '700'}); + } else { + sendBox.setStyle({fontWeight: '400'}); + $(winId + '_bold').src = 'themes/' + theme + '/window/bold_off.png'; + } + sendBox.show(); // horrah weird Opera 9 input refresh! + setTimeout("$('" + winId + "_sendBox').focus();", 125); + }, + + /** + * @author Joshua Gross + **/ + toggleItalic: function() { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.hide(); // horrah weird Opera 9 input refresh! + if(sendBox.style.fontStyle == 'normal') { + sendBox.setStyle({fontStyle: 'italic'}); + $(winId + '_italic').src = 'themes/' + theme + '/window/italic_on.png'; + } else { + sendBox.setStyle({fontStyle: 'normal'}); + $(winId + '_italic').src = 'themes/' + theme + '/window/italic_off.png'; + } + sendBox.show(); // horrah weird Opera 9 input refresh! + setTimeout("$('" + winId + "_sendBox').focus();", 125); + }, + + /** + * @author Joshua Gross + **/ + toggleUnderline: function() { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.hide(); // horrah weird Opera 9 input refresh! + if(sendBox.style.textDecoration == 'none') { + sendBox.setStyle({textDecoration: 'underline'}); + $(winId + '_underline').src = 'themes/' + theme + '/window/underline_on.png'; + } else { + sendBox.setStyle({textDecoration: 'none'}); + $(winId + '_underline').src = 'themes/' + theme + '/window/underline_off.png'; + } + sendBox.show(); // horrah weird Opera 9 input refresh! + setTimeout("$('" + winId + "_sendBox').focus();", 125); + }, + + /** + * @author Joshua Gross + **/ + toggleFontList: function() { + var fL = $('fontsList'); + var fLBtn = $(this.getId() + '_setFont'); + + $('emoticonList', 'fontColorList', 'fontSizeList').invoke('hide'); + + if($('fontsList').style.display == 'block') { + fL.hide(); + } else { + fL.setStyle({left: Position.cumulativeOffset(fLBtn)[0] + 'px', + top: (Position.cumulativeOffset(fLBtn)[1] + Element.getHeight(fLBtn) - 1) + 'px', + zIndex: Windows.maxZIndex + 20, + display: 'block'}); + + IM.active = this; + } + }, + + /** + * @author Joshua Gross + **/ + toggleFontSizeList: function() { + var fsL = $('fontSizeList'); + var fsLBtn = $(this.getId() + '_setFontSize'); + + $('emoticonList', 'fontsList', 'fontColorList').invoke('hide'); + + if($('fontSizeList').style.display == 'block') { + $('fontSizeList').setStyle({display: 'none'}); + } else { + fsL.setStyle({left: Position.cumulativeOffset(fsLBtn)[0] + 'px', + top: (Position.cumulativeOffset(fsLBtn)[1] + Element.getHeight(fsLBtn) - 1) + 'px', + zIndex: Windows.maxZIndex + 20, + display: 'block'}); + + IM.active = this; + } + }, + + /** + * @author Joshua Gross + **/ + toggleEmoticonList: function() { + var eL = $('emoticonList'); + var eLBtn = $(this.getId() + '_insertEmoticon'); + + $('fontsList', 'fontSizeList', 'fontColorList').invoke('hide'); + + if($('emoticonList').style.display == 'block') { + $('emoticonList').setStyle({display: 'none'}); + } else { + eL.setStyle({left: Position.cumulativeOffset(eLBtn)[0] + 'px', + top: (Position.cumulativeOffset(eLBtn)[1] + Element.getHeight(eLBtn) - 1) + 'px', + zIndex: Windows.maxZIndex + 20, + display: 'block'}); + + IM.active = this; + } + }, + + /** + * @author Joshua Gross + **/ + toggleFontColorList: function() { + var fcL = $('fontColorList'); + var fcLBtn = $(this.getId() + '_setFontColor'); + + $('fontsList', 'fontSizeList', 'emoticonList').invoke('hide'); + + if($('fontColorList').style.display == 'block') { + $('fontColorList').setStyle({display: 'none'}); + } else { + fcL.setStyle({left: Position.cumulativeOffset(fcLBtn)[0] + 'px', + top: (Position.cumulativeOffset(fcLBtn)[1] + Element.getHeight(fcLBtn) - 1) + 'px', + zIndex: Windows.maxZIndex + 20, + display: 'block'}); + + IM.active = this; + } + }, + + /** + * @author Joshua Gross + **/ + setFont: function(fontname) { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.hide(); + sendBox.setStyle({fontFamily: fontname + ', sans-serif'}); + sendBox.show(); + + $(winId + '_setFont').innerHTML = fontname; + setTimeout("$('" + winId + "_sendBox').focus();", 125); + this.toggleFontList(''); + }, + + /** + * @author Joshua Gross + **/ + setFontSize: function(size) { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.hide(); + sendBox.setStyle({fontSize: size + 'px'}); + sendBox.show(); + + $(winId + '_setFontSize').innerHTML = size; + setTimeout("$('" + winId + "_sendBox').focus();", 125); + this.toggleFontSizeList(''); + }, + + /** + * @author Joshua Gross + **/ + setFontColor: function(color) { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.setStyle({color: color}); + + $(winId + '_setFontColorColor').setStyle({backgroundColor: color}); + setTimeout("$('" + winId + "_sendBox').focus();", 125); + this.toggleFontColorList(''); + }, + + /** + * Adds text to a windows' message box + * + * @author Joshua Gross + **/ + insertText: function(tti) { + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + sendBox.value += tti; + setTimeout("$('" + winId + "_sendBox').focus();", 125); + this.toggleEmoticonList(); + return false; + }, + + /** + * Checks for pressing on 'Return' or 'Enter' + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + keyHandler: function(event) { + event = event || window.event; + var asc = document.all ? event.keyCode : event.which; + var shift = event.shiftKey; + + if(useLingo) { + var message = $(this.getId() + '_sendBox').value; + if(trim(message).length > 0) { + for(var i=0; i 0) { + var message = sendBox.value; + sendBox.value = ''; + IM.sendMessage((chatroom == 'true' ? this.room : this.username), message.replace(/&/g, "&").replace(//g, '>').replace(/\n/g, "
      "), chatroom, isBold, isItalic, isUnderline, fontName, fontSize, fontColor); + + Status.lastIM = new Date().getTime(); + if (typeof(Status) != 'undefined' && Status.wasSetAutoAway) { + Status.set(1, Languages.get('available')); + } + } + + scrollToBottom(winId + '_rcvd'); + sendBox.focus(); + } +}); diff --git a/js/languages.js b/js/languages.js new file mode 100644 index 0000000..93605cc --- /dev/null +++ b/js/languages.js @@ -0,0 +1,196 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Language class + * + * @author Joshua Gross + * @update Benjamin Hutchins + * - Added to popup + * - Added lingo-replacement + **/ +var Languages = { + current: '', // current language being used + previous: '', // previous language used + available: languageOptions, // list of available languages + loaded: [], // list of languages loaded + dictionary: {}, // dictionary of languages + lingodict: {}, // dictionary of lingo-replacements + + + /** + * Load a new language + * + * @arguments + * language - the language to be loaded + * + * @author Joshua Gross + * @update Benjamin Hutchins + * - Loads lingo dictionary for language as well + **/ + load: function(language) { + for(var i=0; i -1) break; + + langItem = langItem[i].substring(5); + + var langText = Languages.get(langItem); + var oldLangText = Languages.get(langItem, Languages.previous); + + var preprocessEl = $(document.createElement('div')); + preprocessEl.setStyle({display: 'none'}); + preprocessEl.innerHTML = oldLangText + ''; + document.body.appendChild(preprocessEl); + + oldLangText = preprocessEl.innerHTML; + + if(el.className.indexOf('langinsert-post') > -1 && el.innerHTML.indexOf(oldLangText) == -1) + el.innerHTML += Languages.get(langItem); + else if(el.className.indexOf('langinsert-clear') > -1) + el.innerHTML = Languages.get(langItem); + else if(el.className.indexOf('langinsert-pre') > -1 && el.innerHTML.indexOf(oldLangText) == -1) + el.innerHTML = Languages.get(langItem) + el.innerHTML; + else { + if(el.innerHTML.length == 0) { + el.innerHTML = langText; + return; + } + + if(langText.indexOf('%1') > -1) { + langText = langText.split(/%1/); + oldLangText = preprocessEl.innerHTML.split(/%1/); + + el.innerHTML = el.innerHTML.replace(oldLangText[0], langText[0]).replace(oldLangText[1], langText[1]); + } else + el.innerHTML = el.innerHTML.replace(oldLangText, langText); + } + + document.body.removeChild(preprocessEl); + }); + }, + + /** + * Get the text to show for a language + **/ + get: function(text, language) { + if(language != null && language.length == 0) + return -1; + + return Languages.dictionary[language != null ? language : Languages.current][text]; + }, + + /** + * Removed lingo-text from a message + * + * @arguments + * message - the message entered by the user + * last - last punction character + * + * @author Benjamin Hutchins + * @return none-lingo message + **/ + lingoReplace: function(message, last) { + var exp = RegExp(last[0]+"$"); + var mostof = message.replace(exp,""); + var word = trim(mostof.substring(mostof.lastIndexOf(" "), mostof.length)).replace(exp,""); + mostof = mostof.substring(0, mostof.length-word.length); + return mostof + Languages.lingo(word) + last[1]; + }, + + /** + * Runs a single word through the lingo-dictionary + * + * @arguments + * text - word to try and replace + * + * @author Benjamin Hutchins + * @return none-lingo text if availible, else returns text + **/ + lingo: function(text, language) { + if(language != null && language.length == 0) + return text; + language = language != null ? language : Languages.current; + if (typeof Languages.lingodict[language] != 'undefined') { + if (typeof Languages.lingodict[language][text.toLowerCase()] != 'undefined') { + return Languages.lingodict[language][text.toLowerCase()]; + } + } + return text; + } +}; diff --git a/js/popup.js b/js/popup.js new file mode 100644 index 0000000..f194910 --- /dev/null +++ b/js/popup.js @@ -0,0 +1,79 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + +/** + * IM Class + * + * @author Joshua Gross + **/ +var IM = { + /** + * Handle resize of window + * + * @author Joshua Gross + **/ + handleResize: function(e) { + var rcvdBox = $(winName + '_rcvd'); + rcvdBox.style.height = (browserHeight() - 133) + 'px'; + rcvdBox.style.width = (browserWidth() - 15) + 'px'; + + $(winName + '_toolbar').style.top = (browserHeight() - 93) + 'px'; + $(winName + '_toolbar').style.width = (browserWidth() - 10) + 'px'; + $(winName + '_setFont').style.top = (browserHeight() - 85) + 'px'; + $(winName + '_setFontSize').style.top = (browserHeight() - 85) + 'px'; + $(winName + '_setFontColor').style.top = (browserHeight() - 85) + 'px'; + $(winName + '_insertEmoticon').style.top = (browserHeight() - 85) + 'px'; + $(winName + '_sendBox').style.top = (browserHeight() - 65) + 'px'; + $(winName + '_sendBox').style.width = (browserWidth() - 16) + 'px'; + + rcvdBox.scrollTop = rcvdBox.scrollHeight - rcvdBox.clientHeight + 6; + } +}; +Object.extend(IM, AjaxIM); + +/** + * A class to mantain an IM Window's guts. + * + * @author Joshua Gross + **/ +var IMWindow = Class.create(AjaxIMWindow); +IMWindow.addMethods({ + /** + * Checks to see if there is a message, if there is, + * send it to the server. + * + * @author Joshua Gross + * @update Benjamin Hitchins + **/ + send: function($super) { + $super(); + var winId = this.getId(); + var sendBox = $(winId + '_sendBox'); + + var isBold = (sendBox.style.fontWeight == '400' ? 'false' : 'true'); + var isItalic = (sendBox.style.fontStyle == 'normal' ? 'false' : 'true'); + var isUnderline = (sendBox.style.textDecoration == 'none' ? 'false' : 'true'); + var fontName = $(winId + '_setFont').innerHTML; + var fontSize = $(winId + '_setFontSize').innerHTML; + var fontColor = $(winId + '_setFontColorColor').style.backgroundColor; + + if(trim(sendBox.value).length > 0) { + var message = sendBox.value; + sendBox.value = ''; + IM.sendMessage(this.username, message.replace(/&/g, "&").replace(//g, '>').replace(/\n/g, "
      "), '', isBold, isItalic, isUnderline, fontName, fontSize, fontColor); + + self.opener.Status.lastIM = new Date().getTime(); + if (typeof(Status) != 'undefined' && self.opener.Status.wasSetAutoAway) { + self.opener.Status.set(1, Languages.get('available')); + } + } + + scrollToBottom(winId + '_rcvd'); + sendBox.focus(); + } +}); diff --git a/js/profile.js b/js/profile.js new file mode 100644 index 0000000..6d5bc75 --- /dev/null +++ b/js/profile.js @@ -0,0 +1,71 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Handle all requests that deal with a users' profile + * + * @author Benjamin Hutchins + **/ +var Profile = { + windows: {}, // store all existent windows + + /** + * Create new window for a user's profile, + * load the user profile and append it inside the window + * + * @arguments + * name - username of user we're getting the profile of + * title - title for window, default is the user's username + * + * @author Benjamin Hutchins + **/ + create: function(name, title) { + var winLeft = Math.round(Math.random()*(Browser.width()-360))+'px'; + var winTop = Math.round(Math.random()*(Browser.height()-400))+'px'; + + var winId = randomString(32) + '_profile'; + + this.windows[name] = new Window({id: winId, className: "dialog", width: 320, height: 335, top: winTop, left: winLeft, resizable: true, title: title, draggable: true, detachable: false, minWidth: 320, minHeight: 150, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}}); + + this.windows[name].setConstraint(true, {left: 0, right: 0, top: 0, bottom: 0}); + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=getprofile&user="+name, + function(xh) { + Profile.windows[name].getContent().innerHTML = '
      ' + + (xh.responseText == "" ? Languages.get('hasNoProfile') : xh.responseText) + '
      ' + + '
      ' + + ButtonCtl.create(Languages.get('update'), 'Profile.update(\''+name+'\');') + + '
      '; + }.bind(name) + ); + //this.windows[name].setDestroyOnClose(); + this.windows[name].show(); + this.windows[name].toFront(); + Windows.focusedWindow = this.windows[name]; + }, + + /** + * Force-update a user's profile + * + * @arguments + * name - user's username + * + * @author Benjamin Hutchins + **/ + update: function(name) { + if ($(name+'_userProfile')) { + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=getprofile&user="+name, + function(xh) { + $(name+'_userProfile').innerHTML = (xh.responseText == "" ? Languages.get('hasNoProfile') : xh.responseText); + } + ); + } + } +}; diff --git a/js/prototype.js b/js/prototype.js new file mode 100644 index 0000000..949fa30 --- /dev/null +++ b/js/prototype.js @@ -0,0 +1,8 @@ +/* Prototype JavaScript framework, version 1.6.0.2 + * (c) 2005-2008 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ +var Prototype={Version:"1.6.0.2",Browser:{IE:!!(window.attachEvent&&!window.opera),Opera:!!window.opera,WebKit:navigator.userAgent.indexOf("AppleWebKit/")>-1,Gecko:navigator.userAgent.indexOf("Gecko")>-1&&navigator.userAgent.indexOf("KHTML")==-1,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement("div").__proto__&&document.createElement("div").__proto__!==document.createElement("form").__proto__},ScriptFragment:"]*>([\\S\\s]*?)<\/script>",JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(A){return A}};if(Prototype.Browser.MobileSafari){Prototype.BrowserFeatures.SpecificElementExtensions=false}var Class={create:function(){var E=null,D=$A(arguments);if(Object.isFunction(D[0])){E=D.shift()}function A(){this.initialize.apply(this,arguments)}Object.extend(A,Class.Methods);A.superclass=E;A.subclasses=[];if(E){var B=function(){};B.prototype=E.prototype;A.prototype=new B;E.subclasses.push(A)}for(var C=0;C0){if(B=D.match(E)){A+=D.slice(0,B.index);A+=String.interpret(C(B));D=D.slice(B.index+B[0].length)}else{A+=D,D=""}}return A},sub:function(C,A,B){A=this.gsub.prepareReplacement(A);B=Object.isUndefined(B)?1:B;return this.gsub(C,function(D){if(--B<0){return D[0]}return A(D)})},scan:function(B,A){this.gsub(B,A);return String(this)},truncate:function(B,A){B=B||30;A=Object.isUndefined(A)?"...":A;return this.length>B?this.slice(0,B-A.length)+A:String(this)},strip:function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,"")},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"")},extractScripts:function(){var B=new RegExp(Prototype.ScriptFragment,"img");var A=new RegExp(Prototype.ScriptFragment,"im");return(this.match(B)||[]).map(function(C){return(C.match(A)||["",""])[1]})},evalScripts:function(){return this.extractScripts().map(function(script){return eval(script)})},escapeHTML:function(){var A=arguments.callee;A.text.data=this;return A.div.innerHTML},unescapeHTML:function(){var A=new Element("div");A.innerHTML=this.stripTags();return A.childNodes[0]?(A.childNodes.length>1?$A(A.childNodes).inject("",function(B,C){return B+C.nodeValue}):A.childNodes[0].nodeValue):""},toQueryParams:function(B){var A=this.strip().match(/([^?#]*)(#.*)?$/);if(!A){return{}}return A[1].split(B||"&").inject({},function(E,F){if((F=F.split("="))[0]){var C=decodeURIComponent(F.shift());var D=F.length>1?F.join("="):F[0];if(D!=undefined){D=decodeURIComponent(D)}if(C in E){if(!Object.isArray(E[C])){E[C]=[E[C]]}E[C].push(D)}else{E[C]=D}}return E})},toArray:function(){return this.split("")},succ:function(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)},times:function(A){return A<1?"":new Array(A+1).join(this)},camelize:function(){var D=this.split("-"),A=D.length;if(A==1){return D[0]}var C=this.charAt(0)=="-"?D[0].charAt(0).toUpperCase()+D[0].substring(1):D[0];for(var B=1;B-1},startsWith:function(A){return this.indexOf(A)===0},endsWith:function(A){var B=this.length-A.length;return B>=0&&this.lastIndexOf(A)===B},empty:function(){return this==""},blank:function(){return/^\s*$/.test(this)},interpolate:function(A,B){return new Template(this,B).evaluate(A)}});if(Prototype.Browser.WebKit||Prototype.Browser.IE){Object.extend(String.prototype,{escapeHTML:function(){return this.replace(/&/g,"&").replace(//g,">")},unescapeHTML:function(){return this.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}})}String.prototype.gsub.prepareReplacement=function(B){if(Object.isFunction(B)){return B}var A=new Template(B);return function(C){return A.evaluate(C)}};String.prototype.parseQuery=String.prototype.toQueryParams;Object.extend(String.prototype.escapeHTML,{div:document.createElement("div"),text:document.createTextNode("")});with(String.prototype.escapeHTML){div.appendChild(text)}var Template=Class.create({initialize:function(A,B){this.template=A.toString();this.pattern=B||Template.Pattern},evaluate:function(A){if(Object.isFunction(A.toTemplateReplacements)){A=A.toTemplateReplacements()}return this.template.gsub(this.pattern,function(D){if(A==null){return""}var F=D[1]||"";if(F=="\\"){return D[2]}var B=A,G=D[3];var E=/^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;D=E.exec(G);if(D==null){return F}while(D!=null){var C=D[1].startsWith("[")?D[2].gsub("\\\\]","]"):D[1];B=B[C];if(null==B||""==D[3]){break}G=G.substring("["==D[3]?D[1].length:D[0].length);D=E.exec(G)}return F+String.interpret(B)})}});Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;var $break={};var Enumerable={each:function(C,B){var A=0;C=C.bind(B);try{this._each(function(E){C(E,A++)})}catch(D){if(D!=$break){throw D}}return this},eachSlice:function(D,C,B){C=C?C.bind(B):Prototype.K;var A=-D,E=[],F=this.toArray();while((A+=D)=A){A=E}});return A},min:function(C,B){C=C?C.bind(B):Prototype.K;var A;this.each(function(E,D){E=C(E,D);if(A==null||EC?1:0}).pluck("value")},toArray:function(){return this.map()},zip:function(){var B=Prototype.K,A=$A(arguments);if(Object.isFunction(A.last())){B=A.pop()}var C=[this].concat(A).map($A);return this.map(function(E,D){return B(C.pluck(D))})},size:function(){return this.toArray().length},inspect:function(){return"#"}};Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,filter:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray,every:Enumerable.all,some:Enumerable.any});function $A(C){if(!C){return[]}if(C.toArray){return C.toArray()}var B=C.length||0,A=new Array(B);while(B--){A[B]=C[B]}return A}if(Prototype.Browser.WebKit){$A=function(C){if(!C){return[]}if(!(Object.isFunction(C)&&C=="[object NodeList]")&&C.toArray){return C.toArray()}var B=C.length||0,A=new Array(B);while(B--){A[B]=C[B]}return A}}Array.from=$A;Object.extend(Array.prototype,Enumerable);if(!Array.prototype._reverse){Array.prototype._reverse=Array.prototype.reverse}Object.extend(Array.prototype,{_each:function(B){for(var A=0,C=this.length;A1?this:this[0]},uniq:function(A){return this.inject([],function(D,C,B){if(0==B||(A?D.last()!=C:!D.include(C))){D.push(C)}return D})},intersect:function(A){return this.uniq().findAll(function(B){return A.detect(function(C){return B===C})})},clone:function(){return[].concat(this)},size:function(){return this.length},inspect:function(){return"["+this.map(Object.inspect).join(", ")+"]"},toJSON:function(){var A=[];this.each(function(B){var C=Object.toJSON(B);if(!Object.isUndefined(C)){A.push(C)}});return"["+A.join(", ")+"]"}});if(Object.isFunction(Array.prototype.forEach)){Array.prototype._each=Array.prototype.forEach}if(!Array.prototype.indexOf){Array.prototype.indexOf=function(C,A){A||(A=0);var B=this.length;if(A<0){A=B+A}for(;A"},toJSON:function(){return Object.toJSON(this.toObject())},clone:function(){return new Hash(this)}}})());Hash.prototype.toTemplateReplacements=Hash.prototype.toObject;Hash.from=$H;var ObjectRange=Class.create(Enumerable,{initialize:function(C,A,B){this.start=C;this.end=A;this.exclusive=B},_each:function(A){var B=this.start;while(this.include(B)){A(B);B=B.succ()}},include:function(A){if(A1&&!((A==4)&&this._complete)){this.respondToReadyState(this.transport.readyState)}},setRequestHeaders:function(){var E={"X-Requested-With":"XMLHttpRequest","X-Prototype-Version":Prototype.Version,"Accept":"text/javascript, text/html, application/xml, text/xml, */*"};if(this.method=="post"){E["Content-type"]=this.options.contentType+(this.options.encoding?"; charset="+this.options.encoding:"");if(this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005){E["Connection"]="close"}}if(typeof this.options.requestHeaders=="object"){var C=this.options.requestHeaders;if(Object.isFunction(C.push)){for(var B=0,D=C.length;B=200&&A<300)},getStatus:function(){try{return this.transport.status||0}catch(A){return 0}},respondToReadyState:function(A){var C=Ajax.Request.Events[A],B=new Ajax.Response(this);if(C=="Complete"){try{this._complete=true;(this.options["on"+B.status]||this.options["on"+(this.success()?"Success":"Failure")]||Prototype.emptyFunction)(B,B.headerJSON)}catch(D){this.dispatchException(D)}var E=B.getHeader("Content-type");if(this.options.evalJS=="force"||(this.options.evalJS&&this.isSameOrigin()&&E&&E.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))){this.evalResponse()}}try{(this.options["on"+C]||Prototype.emptyFunction)(B,B.headerJSON);Ajax.Responders.dispatch("on"+C,this,B,B.headerJSON)}catch(D){this.dispatchException(D)}if(C=="Complete"){this.transport.onreadystatechange=Prototype.emptyFunction}},isSameOrigin:function(){var A=this.url.match(/^\s*https?:\/\/[^\/]*/);return !A||(A[0]=="#{protocol}//#{domain}#{port}".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?":"+location.port:""}))},getHeader:function(A){try{return this.transport.getResponseHeader(A)||null}catch(B){return null}},evalResponse:function(){try{return eval((this.transport.responseText||"").unfilterJSON())}catch(e){this.dispatchException(e)}},dispatchException:function(A){(this.options.onException||Prototype.emptyFunction)(this,A);Ajax.Responders.dispatch("onException",this,A)}});Ajax.Request.Events=["Uninitialized","Loading","Loaded","Interactive","Complete"];Ajax.Response=Class.create({initialize:function(C){this.request=C;var D=this.transport=C.transport,A=this.readyState=D.readyState;if((A>2&&!Prototype.Browser.IE)||A==4){this.status=this.getStatus();this.statusText=this.getStatusText();this.responseText=String.interpret(D.responseText);this.headerJSON=this._getHeaderJSON()}if(A==4){var B=D.responseXML;this.responseXML=Object.isUndefined(B)?null:B;this.responseJSON=this._getResponseJSON()}},status:0,statusText:"",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||""}catch(A){return""}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders()}catch(A){return null}},getResponseHeader:function(A){return this.transport.getResponseHeader(A)},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders()},_getHeaderJSON:function(){var A=this.getHeader("X-JSON");if(!A){return null}A=decodeURIComponent(escape(A));try{return A.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())}catch(B){this.request.dispatchException(B)}},_getResponseJSON:function(){var A=this.request.options;if(!A.evalJSON||(A.evalJSON!="force"&&!(this.getHeader("Content-type")||"").include("application/json"))||this.responseText.blank()){return null}try{return this.responseText.evalJSON(A.sanitizeJSON||!this.request.isSameOrigin())}catch(B){this.request.dispatchException(B)}}});Ajax.Updater=Class.create(Ajax.Request,{initialize:function($super,A,C,B){this.container={success:(A.success||A),failure:(A.failure||(A.success?null:A))};B=Object.clone(B);var D=B.onComplete;B.onComplete=(function(E,F){this.updateContent(E.responseText);if(Object.isFunction(D)){D(E,F)}}).bind(this);$super(C,B)},updateContent:function(D){var C=this.container[this.success()?"success":"failure"],A=this.options;if(!A.evalScripts){D=D.stripScripts()}if(C=$(C)){if(A.insertion){if(Object.isString(A.insertion)){var B={};B[A.insertion]=D;C.insert(B)}else{A.insertion(C,D)}}else{C.update(D)}}}});Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function($super,A,C,B){$super(B);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=A;this.url=C;this.start()},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent()},stop:function(){this.updater.options.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments)},updateComplete:function(A){if(this.options.decay){this.decay=(A.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=A.responseText}this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options)}});function $(B){if(arguments.length>1){for(var A=0,D=[],C=arguments.length;A';delete C.name;return Element.writeAttribute(document.createElement(D),C)}if(!B[D]){B[D]=Element.extend(document.createElement(D))}return Element.writeAttribute(B[D].cloneNode(false),C)};Object.extend(this.Element,A||{})}).call(window);Element.cache={};Element.Methods={visible:function(A){return $(A).style.display!="none"},toggle:function(A){A=$(A);Element[Element.visible(A)?"hide":"show"](A);return A},hide:function(A){$(A).style.display="none";return A},show:function(A){$(A).style.display="";return A},remove:function(A){A=$(A);A.parentNode.removeChild(A);return A},update:function(A,B){A=$(A);if(B&&B.toElement){B=B.toElement()}if(Object.isElement(B)){return A.update().insert(B)}B=Object.toHTML(B);A.innerHTML=B.stripScripts();B.evalScripts.bind(B).defer();return A},replace:function(B,C){B=$(B);if(C&&C.toElement){C=C.toElement()}else{if(!Object.isElement(C)){C=Object.toHTML(C);var A=B.ownerDocument.createRange();A.selectNode(B);C.evalScripts.bind(C).defer();C=A.createContextualFragment(C.stripScripts())}}B.parentNode.replaceChild(C,B);return B},insert:function(C,E){C=$(C);if(Object.isString(E)||Object.isNumber(E)||Object.isElement(E)||(E&&(E.toElement||E.toHTML))){E={bottom:E}}var D,F,B,G;for(var A in E){D=E[A];A=A.toLowerCase();F=Element._insertionTranslations[A];if(D&&D.toElement){D=D.toElement()}if(Object.isElement(D)){F(C,D);continue}D=Object.toHTML(D);B=((A=="before"||A=="after")?C.parentNode:C).tagName.toUpperCase();G=Element._getContentFromAnonymousElement(B,D.stripScripts());if(A=="top"||A=="after"){G.reverse()}G.each(F.curry(C));D.evalScripts.bind(D).defer()}return C},wrap:function(B,C,A){B=$(B);if(Object.isElement(C)){$(C).writeAttribute(A||{})}else{if(Object.isString(C)){C=new Element(C,A)}else{C=new Element("div",C)}}if(B.parentNode){B.parentNode.replaceChild(C,B)}C.appendChild(B);return C},inspect:function(B){B=$(B);var A="<"+B.tagName.toLowerCase();$H({"id":"id","className":"class"}).each(function(F){var E=F.first(),C=F.last();var D=(B[E]||"").toString();if(D){A+=" "+C+"="+D.inspect(true)}});return A+">"},recursivelyCollect:function(A,C){A=$(A);var B=[];while(A=A[C]){if(A.nodeType==1){B.push(Element.extend(A))}}return B},ancestors:function(A){return $(A).recursivelyCollect("parentNode")},descendants:function(A){return $(A).select("*")},firstDescendant:function(A){A=$(A).firstChild;while(A&&A.nodeType!=1){A=A.nextSibling}return $(A)},immediateDescendants:function(A){if(!(A=$(A).firstChild)){return[]}while(A&&A.nodeType!=1){A=A.nextSibling}if(A){return[A].concat($(A).nextSiblings())}return[]},previousSiblings:function(A){return $(A).recursivelyCollect("previousSibling")},nextSiblings:function(A){return $(A).recursivelyCollect("nextSibling")},siblings:function(A){A=$(A);return A.previousSiblings().reverse().concat(A.nextSiblings())},match:function(B,A){if(Object.isString(A)){A=new Selector(A)}return A.match($(B))},up:function(B,D,A){B=$(B);if(arguments.length==1){return $(B.parentNode)}var C=B.ancestors();return Object.isNumber(D)?C[D]:Selector.findElement(C,D,A)},down:function(B,C,A){B=$(B);if(arguments.length==1){return B.firstDescendant()}return Object.isNumber(C)?B.descendants()[C]:B.select(C)[A||0]},previous:function(B,D,A){B=$(B);if(arguments.length==1){return $(Selector.handlers.previousElementSibling(B))}var C=B.previousSiblings();return Object.isNumber(D)?C[D]:Selector.findElement(C,D,A)},next:function(C,D,B){C=$(C);if(arguments.length==1){return $(Selector.handlers.nextElementSibling(C))}var A=C.nextSiblings();return Object.isNumber(D)?A[D]:Selector.findElement(A,D,B)},select:function(){var A=$A(arguments),B=$(A.shift());return Selector.findChildElements(B,A)},adjacent:function(){var A=$A(arguments),B=$(A.shift());return Selector.findChildElements(B.parentNode,A).without(B)},identify:function(B){B=$(B);var C=B.readAttribute("id"),A=arguments.callee;if(C){return C}do{C="anonymous_element_"+A.counter++}while($(C));B.writeAttribute("id",C);return C},readAttribute:function(C,A){C=$(C);if(Prototype.Browser.IE){var B=Element._attributeTranslations.read;if(B.values[A]){return B.values[A](C,A)}if(B.names[A]){A=B.names[A]}if(A.include(":")){return(!C.attributes||!C.attributes[A])?null:C.attributes[A].value}}return C.getAttribute(A)},writeAttribute:function(E,C,F){E=$(E);var B={},D=Element._attributeTranslations.write;if(typeof C=="object"){B=C}else{B[C]=Object.isUndefined(F)?true:F}for(var A in B){C=D.names[A]||A;F=B[A];if(D.values[A]){C=D.values[A](E,F)}if(F===false||F===null){E.removeAttribute(C)}else{if(F===true){E.setAttribute(C,C)}else{E.setAttribute(C,F)}}}return E},getHeight:function(A){return $(A).getDimensions().height},getWidth:function(A){return $(A).getDimensions().width},classNames:function(A){return new Element.ClassNames(A)},hasClassName:function(A,B){if(!(A=$(A))){return }var C=A.className;return(C.length>0&&(C==B||new RegExp("(^|\\s)"+B+"(\\s|$)").test(C)))},addClassName:function(A,B){if(!(A=$(A))){return }if(!A.hasClassName(B)){A.className+=(A.className?" ":"")+B}return A},removeClassName:function(A,B){if(!(A=$(A))){return }A.className=A.className.replace(new RegExp("(^|\\s+)"+B+"(\\s+|$)")," ").strip();return A},toggleClassName:function(A,B){if(!(A=$(A))){return }return A[A.hasClassName(B)?"removeClassName":"addClassName"](B)},cleanWhitespace:function(B){B=$(B);var C=B.firstChild;while(C){var A=C.nextSibling;if(C.nodeType==3&&!/\S/.test(C.nodeValue)){B.removeChild(C)}C=A}return B},empty:function(A){return $(A).innerHTML.blank()},descendantOf:function(D,C){D=$(D),C=$(C);var F=C;if(D.compareDocumentPosition){return(D.compareDocumentPosition(C)&8)===8}if(D.sourceIndex&&!Prototype.Browser.Opera){var E=D.sourceIndex,B=C.sourceIndex,A=C.nextSibling;if(!A){do{C=C.parentNode}while(!(A=C.nextSibling)&&C.parentNode)}if(A&&A.sourceIndex){return(E>B&&E","",1],TBODY:["","
      ",2],TR:["","
      ",3],TD:["
      ","
      ",4],SELECT:["",1]}};(function(){Object.extend(this.tags,{THEAD:this.tags.TBODY,TFOOT:this.tags.TBODY,TH:this.tags.TD})}).call(Element._insertionTranslations);Element.Methods.Simulated={hasAttribute:function(A,C){C=Element._attributeTranslations.has[C]||C;var B=$(A).getAttributeNode(C);return B&&B.specified}};Element.Methods.ByTag={};Object.extend(Element,Element.Methods);if(!Prototype.BrowserFeatures.ElementExtensions&&document.createElement("div").__proto__){window.HTMLElement={};window.HTMLElement.prototype=document.createElement("div").__proto__;Prototype.BrowserFeatures.ElementExtensions=true}Element.extend=(function(){if(Prototype.BrowserFeatures.SpecificElementExtensions){return Prototype.K}var A={},B=Element.Methods.ByTag;var C=Object.extend(function(F){if(!F||F._extendedByPrototype||F.nodeType!=1||F==window){return F}var D=Object.clone(A),E=F.tagName,H,G;if(B[E]){Object.extend(D,B[E])}for(H in D){G=D[H];if(Object.isFunction(G)&&!(H in F)){F[H]=G.methodize()}}F._extendedByPrototype=Prototype.emptyFunction;return F},{refresh:function(){if(!Prototype.BrowserFeatures.ElementExtensions){Object.extend(A,Element.Methods);Object.extend(A,Element.Methods.Simulated)}}});C.refresh();return C})();Element.hasAttribute=function(A,B){if(A.hasAttribute){return A.hasAttribute(B)}return Element.Methods.Simulated.hasAttribute(A,B)};Element.addMethods=function(C){var I=Prototype.BrowserFeatures,D=Element.Methods.ByTag;if(!C){Object.extend(Form,Form.Methods);Object.extend(Form.Element,Form.Element.Methods);Object.extend(Element.Methods.ByTag,{"FORM":Object.clone(Form.Methods),"INPUT":Object.clone(Form.Element.Methods),"SELECT":Object.clone(Form.Element.Methods),"TEXTAREA":Object.clone(Form.Element.Methods)})}if(arguments.length==2){var B=C;C=arguments[1]}if(!B){Object.extend(Element.Methods,C||{})}else{if(Object.isArray(B)){B.each(H)}else{H(B)}}function H(F){F=F.toUpperCase();if(!Element.Methods.ByTag[F]){Element.Methods.ByTag[F]={}}Object.extend(Element.Methods.ByTag[F],C)}function A(L,K,F){F=F||false;for(var N in L){var M=L[N];if(!Object.isFunction(M)){continue}if(!F||!(N in K)){K[N]=M.methodize()}}}function E(L){var F;var K={"OPTGROUP":"OptGroup","TEXTAREA":"TextArea","P":"Paragraph","FIELDSET":"FieldSet","UL":"UList","OL":"OList","DL":"DList","DIR":"Directory","H1":"Heading","H2":"Heading","H3":"Heading","H4":"Heading","H5":"Heading","H6":"Heading","Q":"Quote","INS":"Mod","DEL":"Mod","A":"Anchor","IMG":"Image","CAPTION":"TableCaption","COL":"TableCol","COLGROUP":"TableCol","THEAD":"TableSection","TFOOT":"TableSection","TBODY":"TableSection","TR":"TableRow","TH":"TableCell","TD":"TableCell","FRAMESET":"FrameSet","IFRAME":"IFrame"};if(K[L]){F="HTML"+K[L]+"Element"}if(window[F]){return window[F]}F="HTML"+L+"Element";if(window[F]){return window[F]}F="HTML"+L.capitalize()+"Element";if(window[F]){return window[F]}window[F]={};window[F].prototype=document.createElement(L).__proto__;return window[F]}if(I.ElementExtensions){A(Element.Methods,HTMLElement.prototype);A(Element.Methods.Simulated,HTMLElement.prototype,true)}if(I.SpecificElementExtensions){for(var J in Element.Methods.ByTag){var G=E(J);if(Object.isUndefined(G)){continue}A(D[J],G.prototype)}}Object.extend(Element,Element.Methods);delete Element.ByTag;if(Element.extend.refresh){Element.extend.refresh()}Element.cache={}};document.viewport={getDimensions:function(){var A={};var C=Prototype.Browser;$w("width height").each(function(E){var B=E.capitalize();A[E]=(C.WebKit&&!document.evaluate)?self["inner"+B]:(C.Opera)?document.body["client"+B]:document.documentElement["client"+B]});return A},getWidth:function(){return this.getDimensions().width},getHeight:function(){return this.getDimensions().height},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)}};var Selector=Class.create({initialize:function(A){this.expression=A.strip();this.compileMatcher()},shouldUseXPath:function(){if(!Prototype.BrowserFeatures.XPath){return false}var A=this.expression;if(Prototype.Browser.WebKit&&(A.include("-of-type")||A.include(":empty"))){return false}if((/(\[[\w-]*?:|:checked)/).test(this.expression)){return false}return true},compileMatcher:function(){if(this.shouldUseXPath()){return this.compileXPathMatcher()}var e=this.expression,ps=Selector.patterns,h=Selector.handlers,c=Selector.criteria,le,p,m;if(Selector._cache[e]){this.matcher=Selector._cache[e];return }this.matcher=["this.matcher = function(root) {","var r = root, h = Selector.handlers, c = false, n;"];while(e&&le!=e&&(/\S/).test(e)){le=e;for(var i in ps){p=ps[i];if(m=e.match(p)){this.matcher.push(Object.isFunction(c[i])?c[i](m):new Template(c[i]).evaluate(m));e=e.replace(m[0],"");break}}}this.matcher.push("return h.unique(n);\n}");eval(this.matcher.join("\n"));Selector._cache[this.expression]=this.matcher},compileXPathMatcher:function(){var E=this.expression,F=Selector.patterns,B=Selector.xpath,D,A;if(Selector._cache[E]){this.xpath=Selector._cache[E];return }this.matcher=[".//*"];while(E&&D!=E&&(/\S/).test(E)){D=E;for(var C in F){if(A=E.match(F[C])){this.matcher.push(Object.isFunction(B[C])?B[C](A):new Template(B[C]).evaluate(A));E=E.replace(A[0],"");break}}}this.xpath=this.matcher.join("");Selector._cache[this.expression]=this.xpath},findElements:function(A){A=A||document;if(this.xpath){return document._getElementsByXPath(this.xpath,A)}return this.matcher(A)},match:function(H){this.tokens=[];var L=this.expression,A=Selector.patterns,E=Selector.assertions;var B,D,F;while(L&&B!==L&&(/\S/).test(L)){B=L;for(var I in A){D=A[I];if(F=L.match(D)){if(E[I]){this.tokens.push([I,Object.clone(F)]);L=L.replace(F[0],"")}else{return this.findElements(document).include(H)}}}}var K=true,C,J;for(var I=0,G;G=this.tokens[I];I++){C=G[0],J=G[1];if(!Selector.assertions[C](H,J)){K=false;break}}return K},toString:function(){return this.expression},inspect:function(){return"#"}});Object.extend(Selector,{_cache:{},xpath:{descendant:"//*",child:"/*",adjacent:"/following-sibling::*[1]",laterSibling:"/following-sibling::*",tagName:function(A){if(A[1]=="*"){return""}return"[local-name()='"+A[1].toLowerCase()+"' or local-name()='"+A[1].toUpperCase()+"']"},className:"[contains(concat(' ', @class, ' '), ' #{1} ')]",id:"[@id='#{1}']",attrPresence:function(A){A[1]=A[1].toLowerCase();return new Template("[@#{1}]").evaluate(A)},attr:function(A){A[1]=A[1].toLowerCase();A[3]=A[5]||A[6];return new Template(Selector.xpath.operators[A[2]]).evaluate(A)},pseudo:function(A){var B=Selector.xpath.pseudos[A[1]];if(!B){return""}if(Object.isFunction(B)){return B(A)}return new Template(Selector.xpath.pseudos[A[1]]).evaluate(A)},operators:{"=":"[@#{1}='#{3}']","!=":"[@#{1}!='#{3}']","^=":"[starts-with(@#{1}, '#{3}')]","$=":"[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']","*=":"[contains(@#{1}, '#{3}')]","~=":"[contains(concat(' ', @#{1}, ' '), ' #{3} ')]","|=":"[contains(concat('-', @#{1}, '-'), '-#{3}-')]"},pseudos:{"first-child":"[not(preceding-sibling::*)]","last-child":"[not(following-sibling::*)]","only-child":"[not(preceding-sibling::* or following-sibling::*)]","empty":"[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]","checked":"[@checked]","disabled":"[@disabled]","enabled":"[not(@disabled)]","not":function(B){var H=B[6],G=Selector.patterns,A=Selector.xpath,E,C;var F=[];while(H&&E!=H&&(/\S/).test(H)){E=H;for(var D in G){if(B=H.match(G[D])){C=Object.isFunction(A[D])?A[D](B):new Template(A[D]).evaluate(B);F.push("("+C.substring(1,C.length-1)+")");H=H.replace(B[0],"");break}}}return"[not("+F.join(" and ")+")]"},"nth-child":function(A){return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ",A)},"nth-last-child":function(A){return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ",A)},"nth-of-type":function(A){return Selector.xpath.pseudos.nth("position() ",A)},"nth-last-of-type":function(A){return Selector.xpath.pseudos.nth("(last() + 1 - position()) ",A)},"first-of-type":function(A){A[6]="1";return Selector.xpath.pseudos["nth-of-type"](A)},"last-of-type":function(A){A[6]="1";return Selector.xpath.pseudos["nth-last-of-type"](A)},"only-of-type":function(A){var B=Selector.xpath.pseudos;return B["first-of-type"](A)+B["last-of-type"](A)},nth:function(E,C){var F,G=C[6],B;if(G=="even"){G="2n+0"}if(G=="odd"){G="2n+1"}if(F=G.match(/^(\d+)$/)){return"["+E+"= "+F[1]+"]"}if(F=G.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(F[1]=="-"){F[1]=-1}var D=F[1]?Number(F[1]):1;var A=F[2]?Number(F[2]):0;B="[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";return new Template(B).evaluate({fragment:E,a:D,b:A})}}}},criteria:{tagName:'n = h.tagName(n, r, "#{1}", c); c = false;',className:'n = h.className(n, r, "#{1}", c); c = false;',id:'n = h.id(n, r, "#{1}", c); c = false;',attrPresence:'n = h.attrPresence(n, r, "#{1}", c); c = false;',attr:function(A){A[3]=(A[5]||A[6]);return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(A)},pseudo:function(A){if(A[6]){A[6]=A[6].replace(/"/g,'\\"')}return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(A)},descendant:'c = "descendant";',child:'c = "child";',adjacent:'c = "adjacent";',laterSibling:'c = "laterSibling";'},patterns:{laterSibling:/^\s*~\s*/,child:/^\s*>\s*/,adjacent:/^\s*\+\s*/,descendant:/^\s/,tagName:/^\s*(\*|[\w\-]+)(\b|$)?/,id:/^#([\w\-\*]+)(\b|$)/,className:/^\.([\w\-\*]+)(\b|$)/,pseudo:/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,attrPresence:/^\[([\w]+)\]/,attr:/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/},assertions:{tagName:function(A,B){return B[1].toUpperCase()==A.tagName.toUpperCase()},className:function(A,B){return Element.hasClassName(A,B[1])},id:function(A,B){return A.id===B[1]},attrPresence:function(A,B){return Element.hasAttribute(A,B[1])},attr:function(B,C){var A=Element.readAttribute(B,C[1]);return A&&Selector.operators[C[2]](A,C[5]||C[6])}},handlers:{concat:function(B,A){for(var C=0,D;D=A[C];C++){B.push(D)}return B},mark:function(A){var D=Prototype.emptyFunction;for(var B=0,C;C=A[B];B++){C._countedByPrototype=D}return A},unmark:function(A){for(var B=0,C;C=A[B];B++){C._countedByPrototype=undefined}return A},index:function(A,D,G){A._countedByPrototype=Prototype.emptyFunction;if(D){for(var B=A.childNodes,E=B.length-1,C=1;E>=0;E--){var F=B[E];if(F.nodeType==1&&(!G||F._countedByPrototype)){F.nodeIndex=C++}}}else{for(var E=0,C=1,B=A.childNodes;F=B[E];E++){if(F.nodeType==1&&(!G||F._countedByPrototype)){F.nodeIndex=C++}}}},unique:function(B){if(B.length==0){return B}var D=[],E;for(var C=0,A=B.length;C0?[A]:[]}return $R(1,C).inject([],function(D,E){if(0==(E-A)%B&&(E-A)/B>=0){D.push(E)}return D})},nth:function(A,L,N,K,C){if(A.length==0){return[]}if(L=="even"){L="2n+0"}if(L=="odd"){L="2n+1"}var J=Selector.handlers,I=[],B=[],E;J.mark(A);for(var H=0,D;D=A[H];H++){if(!D.parentNode._countedByPrototype){J.index(D.parentNode,K,C);B.push(D.parentNode)}}if(L.match(/^\d+$/)){L=Number(L);for(var H=0,D;D=A[H];H++){if(D.nodeIndex==L){I.push(D)}}}else{if(E=L.match(/^(-?\d*)?n(([+-])(\d+))?/)){if(E[1]=="-"){E[1]=-1}var O=E[1]?Number(E[1]):1;var M=E[2]?Number(E[2]):0;var P=Selector.pseudos.getIndices(O,M,A.length);for(var H=0,D,F=P.length;D=A[H];H++){for(var G=0;G+()\s-]+|\*|\[.*?\])+)\s*(,|$)/,function(C){A.push(C[1].strip())});return A},matchElements:function(F,G){var E=$$(G),D=Selector.handlers;D.mark(E);for(var C=0,B=[],A;A=F[C];C++){if(A._countedByPrototype){B.push(A)}}D.unmark(E);return B},findElement:function(B,C,A){if(Object.isNumber(C)){A=C;C=false}return Selector.matchElements(B,C||"*")[A||0]},findChildElements:function(E,G){G=Selector.split(G.join(","));var D=[],F=Selector.handlers;for(var C=0,B=G.length,A;C1)?F.unique(D):D}});if(Prototype.Browser.IE){Object.extend(Selector.handlers,{concat:function(B,A){for(var C=0,D;D=A[C];C++){if(D.tagName!=="!"){B.push(D)}}return B},unmark:function(A){for(var B=0,C;C=A[B];B++){C.removeAttribute("_countedByPrototype")}return A}})}function $$(){return Selector.findChildElements(document,$A(arguments))}var Form={reset:function(A){$(A).reset();return A},serializeElements:function(G,B){if(typeof B!="object"){B={hash:!!B}}else{if(Object.isUndefined(B.hash)){B.hash=true}}var C,F,A=false,E=B.submit;var D=G.inject({},function(H,I){if(!I.disabled&&I.name){C=I.name;F=$(I).getValue();if(F!=null&&(I.type!="submit"||(!A&&E!==false&&(!E||C==E)&&(A=true)))){if(C in H){if(!Object.isArray(H[C])){H[C]=[H[C]]}H[C].push(F)}else{H[C]=F}}}return H});return B.hash?D:Object.toQueryString(D)}};Form.Methods={serialize:function(B,A){return Form.serializeElements(Form.getElements(B),A)},getElements:function(A){return $A($(A).getElementsByTagName("*")).inject([],function(B,C){if(Form.Element.Serializers[C.tagName.toLowerCase()]){B.push(Element.extend(C))}return B})},getInputs:function(G,C,D){G=$(G);var A=G.getElementsByTagName("input");if(!C&&!D){return $A(A).map(Element.extend)}for(var E=0,H=[],F=A.length;E=0}).sortBy(function(D){return D.tabIndex}).first();return A?A:C.find(function(D){return["input","select","textarea"].include(D.tagName.toLowerCase())})},focusFirstElement:function(A){A=$(A);A.findFirstElement().activate();return A},request:function(B,A){B=$(B),A=Object.clone(A||{});var D=A.parameters,C=B.readAttribute("action")||"";if(C.blank()){C=window.location.href}A.parameters=B.serialize(true);if(D){if(Object.isString(D)){D=D.toQueryParams()}Object.extend(A.parameters,D)}if(B.hasAttribute("method")&&!A.method){A.method=B.method}return new Ajax.Request(C,A)}};Form.Element={focus:function(A){$(A).focus();return A},select:function(A){$(A).select();return A}};Form.Element.Methods={serialize:function(A){A=$(A);if(!A.disabled&&A.name){var B=A.getValue();if(B!=undefined){var C={};C[A.name]=B;return Object.toQueryString(C)}}return""},getValue:function(A){A=$(A);var B=A.tagName.toLowerCase();return Form.Element.Serializers[B](A)},setValue:function(A,B){A=$(A);var C=A.tagName.toLowerCase();Form.Element.Serializers[C](A,B);return A},clear:function(A){$(A).value="";return A},present:function(A){return $(A).value!=""},activate:function(A){A=$(A);try{A.focus();if(A.select&&(A.tagName.toLowerCase()!="input"||!["button","reset","submit"].include(A.type))){A.select()}}catch(B){}return A},disable:function(A){A=$(A);A.blur();A.disabled=true;return A},enable:function(A){A=$(A);A.disabled=false;return A}};var Field=Form.Element;var $F=Form.Element.Methods.getValue;Form.Element.Serializers={input:function(A,B){switch(A.type.toLowerCase()){case"checkbox":case"radio":return Form.Element.Serializers.inputSelector(A,B);default:return Form.Element.Serializers.textarea(A,B)}},inputSelector:function(A,B){if(Object.isUndefined(B)){return A.checked?A.value:null}else{A.checked=!!B}},textarea:function(A,B){if(Object.isUndefined(B)){return A.value}else{A.value=B}},select:function(D,A){if(Object.isUndefined(A)){return this[D.type=="select-one"?"selectOne":"selectMany"](D)}else{var C,F,G=!Object.isArray(A);for(var B=0,E=D.length;B=0?this.optionValue(B.options[A]):null},selectMany:function(D){var A,E=D.length;if(!E){return null}for(var C=0,A=[];C<\/script>");$("__onDOMContentLoaded").onreadystatechange=function(){if(this.readyState=="complete"){this.onreadystatechange=null;A()}}}})();Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(A,B){return Element.insert(A,{before:B})},Top:function(A,B){return Element.insert(A,{top:B})},Bottom:function(A,B){return Element.insert(A,{bottom:B})},After:function(A,B){return Element.insert(A,{after:B})}};var $continue=new Error('"throw $continue" is deprecated, use "return" instead');var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(B,A,C){if(this.includeScrollOffsets){return this.withinIncludingScrolloffsets(B,A,C)}this.xcomp=A;this.ycomp=C;this.offset=Element.cumulativeOffset(B);return(C>=this.offset[1]&&C=this.offset[0]&&A=this.offset[1]&&this.ycomp=this.offset[0]&&this.xcomp0})._each(A)},set:function(A){this.element.className=A},add:function(A){if(this.include(A)){return }this.set($A(this).concat(A).join(" "))},remove:function(A){if(!this.include(A)){return }this.set($A(this).without(A).join(" "))},toString:function(){return $A(this).join(" ")}};Object.extend(Element.ClassNames.prototype,Enumerable);Element.addMethods() \ No newline at end of file diff --git a/js/sm2.js b/js/sm2.js new file mode 100644 index 0000000..265f7c0 --- /dev/null +++ b/js/sm2.js @@ -0,0 +1,12 @@ +/* + SoundManager 2: Javascript Sound for the Web + -------------------------------------------- + http://www.schillmania.com/projects/soundmanager2/ + + Copyright (c) 2007, Scott Schiller. All rights reserved. + Code licensed under the BSD License: + http://www.schillmania.com/projects/soundmanager2/license.txt + + V2.0b.20070415 +*/ +function SoundManager(B,A){var C=this;this.version="V2.0b.20070415";this.url=(B||"soundmanager2.swf");this.debugMode=false;this.useConsole=true;this.consoleOnly=false;this.nullURL="data/null.mp3";this.defaultOptions={"autoLoad":false,"stream":true,"autoPlay":false,"onid3":null,"onload":null,"whileloading":null,"onplay":null,"whileplaying":null,"onstop":null,"onfinish":null,"onbeforefinish":null,"onbeforefinishtime":5000,"onbeforefinishcomplete":null,"onjustbeforefinish":null,"onjustbeforefinishtime":200,"multiShot":true,"pan":0,"volume":100};this.allowPolling=true;this.enabled=false;this.o=null;this.id=(A||"sm2movie");this.oMC=null;this.sounds=[];this.soundIDs=[];this.isIE=(navigator.userAgent.match(/MSIE/));this.isSafari=(navigator.userAgent.match(/safari/i));this.debugID="soundmanager-debug";this._debugOpen=true;this._didAppend=false;this._appendSuccess=false;this._didInit=false;this._disabled=false;this._hasConsole=(typeof console!="undefined"&&typeof console.log!="undefined");this._debugLevels=!C.isSafari?["debug","info","warn","error"]:["log","log","log","log"];this.getMovie=function(D){return C.isIE?window[D]:(C.isSafari?document[D+"-embed"]:document.getElementById(D+"-embed"))};this.loadFromXML=function(D){try{C.o._loadFromXML(D)}catch(E){C._failSafely();return true}};this.createSound=function(D){if(!C._didInit){throw new Error("soundManager.createSound(): Not loaded yet - wait for soundManager.onload() before calling sound-related methods")}if(arguments.length==2){D={"id":arguments[0],"url":arguments[1]}}var E=C._mergeObjects(D);C._writeDebug('soundManager.createSound(): "'+E.id+'" ('+E.url+")",1);if(C._idCheck(E.id,true)){C._writeDebug("sound "+E.id+" already defined - exiting",2);return false}C.sounds[E.id]=new SMSound(C,E);C.soundIDs[C.soundIDs.length]=E.id;try{C.o._createSound(E.id,E.onjustbeforefinishtime)}catch(F){C._failSafely();return true}if(E.autoLoad||E.autoPlay){C.sounds[E.id].load(E)}if(E.autoPlay){C.sounds[E.id].playState=1}};this.destroySound=function(D){if(!C._idCheck(D)){return false}for(var E=C.soundIDs.length;E--;){if(C.soundIDs[E]==D){delete C.soundIDs[E];continue}}C.sounds[D].unload();delete C.sounds[D]};this.load=function(D,E){if(!C._idCheck(D)){return false}C.sounds[D].load(E)};this.unload=function(D){if(!C._idCheck(D)){return false}C.sounds[D].unload()};this.play=function(D,E){if(!C._idCheck(D)){if(typeof E!="Object"){E={url:E}}if(E&&E.url){C._writeDebug('soundController.play(): attempting to create "'+D+'"',1);E.id=D;C.createSound(E)}else{return false}}C.sounds[D].play(E)};this.start=this.play;this.setPosition=function(D,E){if(!C._idCheck(D)){return false}C.sounds[D].setPosition(E)};this.stop=function(D){if(!C._idCheck(D)){return false}C._writeDebug("soundManager.stop("+D+")",1);C.sounds[D].stop()};this.stopAll=function(){C._writeDebug("soundManager.stopAll()",1);for(var D in C.sounds){if(C.sounds[D] instanceof SMSound){C.sounds[D].stop()}}};this.pause=function(D){if(!C._idCheck(D)){return false}C.sounds[D].pause()};this.resume=function(D){if(!C._idCheck(D)){return false}C.sounds[D].resume()};this.togglePause=function(D){if(!C._idCheck(D)){return false}C.sounds[D].togglePause()};this.setPan=function(D,E){if(!C._idCheck(D)){return false}C.sounds[D].setPan(E)};this.setVolume=function(E,D){if(!C._idCheck(E)){return false}C.sounds[E].setVolume(D)};this.setPolling=function(D){if(!C.o||!C.allowPolling){return false}C._writeDebug("soundManager.setPolling("+D+")");C.o._setPolling(D)};this.disable=function(){if(C._disabled){return false}C._disabled=true;C._writeDebug("soundManager.disable(): Disabling all functions - future calls will return false.",1);for(var D=C.soundIDs.length;D--;){C._disableObject(C.sounds[C.soundIDs[D]])}C.initComplete();C._disableObject(C)};this.getSoundById=function(E,F){if(!E){throw new Error("SoundManager.getSoundById(): sID is null/undefined")}var D=C.sounds[E];if(!D&&!F){C._writeDebug('"'+E+'" is an invalid sound ID.',2)}return D};this.onload=function(){soundManager._writeDebug("Warning: soundManager.onload() is undefined.",2)};this.onerror=function(){};this._idCheck=this.getSoundById;this._disableObject=function(E){for(var D in E){if(typeof E[D]=="function"&&typeof E[D]._protected=="undefined"){E[D]=function(){return false}}}D=null};this._failSafely=function(){var F="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html";var G="You may need to whitelist this location/domain eg. file:///C:/ or C:/ or mysite.com, or set ALWAYS ALLOW under the Flash Player Global Security Settings page. Note that this seems to apply only to file system viewing.";var E='view/edit';var D='FPGSS';if(!C._disabled){C._writeDebug("soundManager: JS->Flash communication failed. Possible causes: flash/browser security restrictions ("+E+"), insufficient browser/plugin support, or .swf not found",2);C._writeDebug("Verify that the movie path of "+C.url+' is correct (test link)',1);if(C._didAppend){if(!document.domain){C._writeDebug("Loading from local file system? (document.domain appears to be null, this URL path may need to be added to 'trusted locations' in "+D+")",1);C._writeDebug("Possible security/domain restrictions ("+E+"), should work when served by http on same domain",1)}}C.disable()}};this._createMovie=function(F,E){if(C._didAppend&&C._appendSuccess){return false}if(window.location.href.indexOf("debug=1")+1){C.debugMode=true}C._didAppend=true;var J=['',''];var M='
      -
      ';var K='
      ';var I="soundManager._createMovie(): appendChild/innerHTML set failed. Serving application/xhtml+xml MIME type? Browser may be enforcing strict rules, not allowing write to innerHTML. (PS: If so, this means your commitment to XML validation is going to break stuff now, because this part isn't finished yet. ;))";var G='
      '+J[C.isIE?0:1]+"
      "+(C.debugMode&&((!C._hasConsole||!C.useConsole)||(C.useConsole&&C._hasConsole&&!C.consoleOnly))&&!document.getElementById(C.debugID)?"x"+K+M:"");var D=(document.body?document.body:document.getElementsByTagName("div")[0]);if(D){C.oMC=document.createElement("div");C.oMC.className="movieContainer";C.oMC.style.position="absolute";C.oMC.style.left="-256px";C.oMC.style.width="1px";C.oMC.style.height="1px";try{D.appendChild(C.oMC);C.oMC.innerHTML=J[C.isIE?0:1];C._appendSuccess=true}catch(L){throw new Error(I)}if(!document.getElementById(C.debugID)&&((!C._hasConsole||!C.useConsole)||(C.useConsole&&C._hasConsole&&!C.consoleOnly))){var N=document.createElement("div");N.id=C.debugID;N.style.display=(C.debugMode?"block":"none");if(C.debugMode){try{var H=document.createElement("div");D.appendChild(H);H.innerHTML=M}catch(L){throw new Error(I)}}D.appendChild(N)}D=null}C._writeDebug("-- SoundManager 2 Version "+C.version.substr(1)+" --",1);C._writeDebug('soundManager._createMovie(): trying to load '+E+"",1)};this._writeDebug=function(D,I){if(!C.debugMode){return false}if(C._hasConsole&&C.useConsole){console[C._debugLevels[I]||"log"](D);if(C.useConsoleOnly){return true}}var H="soundmanager-debug";try{var G=document.getElementById(H);if(!G){return false}var F=document.createElement("div");F.innerHTML=D;G.insertBefore(F,G.firstChild)}catch(E){}G=null};this._writeDebug._protected=true;this._writeDebugAlert=function(D){alert(D)};if(window.location.href.indexOf("debug=alert")+1){C.debugMode=true;C._writeDebug=C._writeDebugAlert}this._toggleDebug=function(){var E=document.getElementById(C.debugID);var D=document.getElementById(C.debugID+"-toggle");if(!E){return false}if(C._debugOpen){D.innerHTML="+";E.style.display="none"}else{D.innerHTML="-";E.style.display="block"}C._debugOpen=!C._debugOpen};this._toggleDebug._protected=true;this._debug=function(){C._writeDebug("soundManager._debug(): sounds by id/url:",0);for(var E=0,D=C.soundIDs.length;Etest URL]'));A.loaded=E;A.loadSuccess=E;A.readyState=E?3:2;if(A.options.onload){A.options.onload.apply(A)}};this._onbeforefinish=function(){if(!A.didBeforeFinish){A.didBeforeFinish=true;if(A.options.onbeforefinish){A.options.onbeforefinish.apply(A)}}};this._onjustbeforefinish=function(E){if(!A.didJustBeforeFinish){A.didJustBeforeFinish=true;if(A.options.onjustbeforefinish){A.options.onjustbeforefinish.apply(A)}}};this._onfinish=function(){D._writeDebug('SMSound._onfinish(): "'+A.sID+'"');A.playState=0;A.paused=false;if(A.options.onfinish){A.options.onfinish.apply(A)}if(A.options.onbeforefinishcomplete){A.options.onbeforefinishcomplete.apply(A)}A.setPosition(0);A.didBeforeFinish=false;A.didJustBeforeFinish=false}} \ No newline at end of file diff --git a/js/status.js b/js/status.js new file mode 100644 index 0000000..312f0ae --- /dev/null +++ b/js/status.js @@ -0,0 +1,91 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Handles user status changes + **/ +var Status = { + state: 0, // current status + awayMessage: '', // away message + wasSetAutoAway: false, // did you get set as away because you were being antisocial? + lastIM: null, // timestamp of the last IM you sent + + /** + * Change your status + * + * @arguments + * status - status [0=online, 1=away, 99=friends only, 49=invisible] + * away_msg - away message to use + * + * @author Joshua Gross + **/ + set: function(status, away_msg) { + lastIM = new Date().getTime(); + if(status == 1) { // away + this.state = 1; + this.awayMessage = away_msg; + $('curStatus').innerHTML = this.awayMessage.substring(0, 30) + (this.awayMessage.length > 30 ? '...' : ''); + } else { // back + this.state = status; // 0 for avail, 99 for "friends only", 49 for "invisible" + this.awayMessage = ''; + $('curStatus').innerHTML = away_msg; + } + + $('statusList').hide(); + }, + + /** + * Display entry box to allow the user to enter + * a custom away message. + * + * @author Joshua Gross + **/ + customAway: function() { + $('curStatus').hide(); + $('customStatus').show().focus(); + }, + + /** + * Handle keyboard entires on customStatus. + * + * @arguments + * event - sent by browser + * + * @author Joshua Gross + **/ + processCustomAway: function(event) { + event = event || event.window; + var asc = document.all ? event.keyCode : event.which; + + if(asc == 13) { + awayMessage = $('customStatus').value; + $('curStatus').innerHTML = awayMessage.substring(0, 30) + (awayMessage.length > 30 ? '...' : ''); + $('curStatus').show(); + $('customStatus').hide(); + + Status.set(1, awayMessage); + } + return asc != 13; + }, + + /** + * Display/Hide the status drop down list + * + * @author Joshua Gross + **/ + toggleStatusList: function() { + var sL = $('statusList'); + if(sL.style.display == 'block') { + sL.hide(); + if(sL.style.zIndex > Windows.maxZIndex) Windows.maxZIndex = sL.style.zIndex; + } else { + Element.setStyle(sL, {left: parseInt(Buddylist.buddyListWin.getLocation()['left']) + $('statusSettings').offsetLeft + $('blTopToolbar').offsetLeft + 'px', top: parseInt(Buddylist.buddyListWin.getLocation()['top']) + $('statusSettings').offsetTop + $('blTopToolbar').offsetTop + $('statusSettings').offsetHeight + 'px', zIndex: Windows.maxZIndex + 20, display: 'block'}); + } + } +}; diff --git a/js/system.js b/js/system.js new file mode 100644 index 0000000..f5f7bd5 --- /dev/null +++ b/js/system.js @@ -0,0 +1,611 @@ +/////////////////////////////////// +// ajax im 3.41 // +// AJAX Instant Messenger // +// Copyright (c) 2006-2008 // +// http://www.ajaxim.com/ // +// Do not remove this notice // +/////////////////////////////////// + + +/** + * Handles session and most requests to the server + * + **/ +var System = { + /** + * Checks to see if a login is valid and, + * if so logs the user in, else it shows an error. + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + login: function(u, p) { + var username = (u ? u : $('username').value); + var password = (p ? p : $('password').value); + + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=login&username="+username+"&password="+hex_md5(password), + function(xh) { + if(xh.responseText == 'invalid' || xh.responseText == 'banned') { + $('login_error_msg').innerHTML = (xh.responseText == 'invalid' ? Languages.get('incorrectInfo') : Languages.get('userBanned')); + $('login_error_msg').show(); + new Effect.Shake('modal'); + } else { + loggedIn = true; + user = username; + pass = hex_md5(password); + defaultTitle = document.title = document.title + ': ' + user; + + $('languageList').hide(); + + if(typeof(Buddylist) != 'undefined') { + Buddylist.create(); + + if(trim(xh.responseText).length == 0) System.logout(); + + var response = xh.responseText.parseJSON(); + + pingTimer = setInterval('System.ping()', pingFrequency); + $('modal').hide(); + + if(response.blocked && response.blocked.length > 0) { + var blockList = response.blocked.parseJSON(); + Buddylist.blocked = blockList; + } else { + Buddylist.blocked = {}; + } + + var buddy; + if(response.buddy && response.buddy.length > 0) { + var budList = response.buddy.parseJSON(); + for(var group in budList) { + if(!$(group.replace(/\s/, '_')+'_group') && group != 'toJSONString') Buddylist.addGroup(group); + if(!Buddylist.list[group]) Buddylist.list[group] = {}; + for(i=0; i'; + $('admin-button').setStyle({'position':'absolute', 'left': '0', 'top': '0'}); + } + + Event.observe(document, 'focus', function() { blinkerOn(false); }); + Event.observe(window, 'focus', function() { blinkerOn(false); }); + + Event.observe(document, 'blur', function() { blinkerOn(true); }); + Event.observe(window, 'blur', function() { blinkerOn(true); }); + + Event.observe(document, 'keypress', + function(event) { + event = event || window.event; + if(Windows.focusedWindow.getId().indexOf('_im') != -1 && IM.sendBoxWithFocus == null) { + var sB = $(Windows.focusedWindow.getId() + '_sendBox'); + sB.focus(); sB.value += String.fromCharCode(event.charCode); + } + } + ); + + Event.stopObserving(window, 'resize', recenterModal); + Status.lastIM = new Date().getTime(); + System.ping(); + } + } + ); + }, + + /** + * Check for press of 'return' or 'enter' and run 'func' + * + * @author Benjamin Hutchins + **/ + keyHandler: function(event, func) { + event = event || window.event; + var asc = document.all ? event.keyCode : event.which; + if(asc == 13 && typeof func == 'function') func(); + return asc != 13; + }, + + /** + * Log out the user + * + * @author Joshua Gross + **/ + logout: function() { + if(user == '' || pass == '') return; + var xmlhttp=false; + /*@cc_on @*/ + /*@if (@_jscript_version >= 5) + try { + xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (E) { + xmlhttp = false; + } + } + @end @*/ + if (!xmlhttp && typeof XMLHttpRequest!='undefined') { + xmlhttp = new XMLHttpRequest(); + } + xmlhttp.open('POST', pingTo, false); + xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + xmlhttp.send('call=logout'); + + clearTimeout(pingTimer); + + defaultTitle = document.title = document.title.replace(': ' + user, ''); + user = ''; + pass = ''; + loggedIn = false; + + if(typeof(Status) != 'undefined') { + Status.state = 0; + Status.awayMessage = ''; + } + Element.stopObserving(window, 'resize', recenterModal); + + if(typeof(Buddylist) != 'undefined') Buddylist.destroy(); + + for(var name in IM.windows) { + if(typeof(IM.windows[name].getId) != 'undefined' && typeof($(IM.windows[name].getId())) != 'undefined') { + try { + if(IM.windows[name].detached) + IM.windows[name].popup.close(); + else + IM.windows[name].destroy(); + } catch(e) { } + } + } + + for(var name in Chatroom.windows) { + if(typeof(Chatroom.windows[name].getId) != 'undefined' && typeof($(Chatroom.windows[name].getId())) != 'undefined') { + try { + Chatroom.windows[name].destroy(); + } catch(e) { } + } + } + + if($('admin-userSearch')) + Windows.getWindow('admin-userSearch').destroy(); + + Dialog.alert('' + Languages.get('signedOff') + '', + { windowParameters: {className:'alert', width:alertWidth, height: 85}, + okLabel: Languages.get('reconnect'), + ok:function(win) { + try { + window.location.reload(); + } catch(e) { } + } + } + ); + }, + + /** + * Processes register requests + * + * @author Jostua Gross + **/ + register: function() { + // if registration is disabled, don't do anything + if (!allowNewUsers) { + return; + } + + var error = ''; + + var registerButton = $('register_button'); + Event.stopObserving(registerButton, 'click', System.register); + + if(($('newpassword').value == $('newpassword2').value)) { + if(checkEmailAddr($('newemail').value)) { + if($('newpassword').value.length >= 6 && $('newpassword').value.length <= 20) { + if($('newusername').value.isAlphaNumeric() && $('newusername').value.length >= 3 && $('newusername').value.length <= 16) { + var xhConn = new XHConn(); + + var username = $('newusername').value.toLowerCase(); + var password = $('newpassword').value; + var email = $('newemail').value; + xhConn.connect(pingTo, "POST", "call=register&username="+username+"&password="+password+"&email="+email, + function(xh) { + switch(xh.responseText) { + case 'user_registered': + Dialog.alert('' + Languages.get('registerSuccess') + '
      ', + {windowParameters: {className:'alert', width:alertWidth}, + ok:function(win) { clearInputs(); Dialog.closeInfo(); Dialogs.login(); }}); + Event.observe(registerButton, 'click', System.register); + return; + case 'username_taken': + error = Languages.get('registerUsernameTaken'); + break; + case 'username_bad': + error = Languages.get('registerUsernameBad'); + break; + case 'password_bad_length': + error = Languages.get('registerPasswordShort'); + break; + case 'invalid_email': + error = Languages.get('registerInvalidEmail'); + break; + case 'email_already_used': + error = Languages.get('registerEmailTaken'); + break; + default: + error = Languages.get('registerFailed'); + } + + $('register_error_msg').innerHTML = error; + $('register_error_msg').setStyle({display: 'block'}); + + new Effect.Shake('modal'); + Event.observe(registerButton, 'click', System.register); + }); + return; + } else { + error = Languages.get('registerUsernameBad'); + } + } else { + error = Languages.get('registerPasswordShort'); + } + } else { + error = Languages.get('registerInvalidEmail'); + } + } else { + error = Languages.get('registerPasswordsMatch'); + } + + $('register_error_msg').innerHTML = error; + $('register_error_msg').setStyle({display: 'block'}); + + new Effect.Shake('modal'); + + Event.observe(registerButton, 'click', System.register); + }, + + /** + * Check how long a user has been idle, + * if they've been idle more than idleTime allows, + * set them as away. + * + * @author Benjamin Hutchins + **/ + idle: function() { + var timeStamp = new Date().getTime() - (idleTime * 60 * 1000); + if (Status.lastIM < timeStamp && typeof(Status) != 'undefined' && Status.state == 0) { + Status.set(1, Languages.get('away')); + Status.wasSetAutoAway = true; + } + }, + + /** + * The heart of this script, + * ping the server for new events and messages + * + * @author Joshua Gross + **/ + ping: function(initial) { + // if auto-away is enabled, check the idle timer + if (idleTime > 0) + System.idle(); + + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=ping&away="+(typeof(Status) != 'undefined' ? Status.state : 0)+(initial == true ? '&initial=true' : ''), + function(xh) { + var i; + + if((typeof xh.status != 'undefined' && xh.status!=200) || xh.responseText == 'not_logged_in') { + System.logout(); + return; + } + + if(trim(xh.responseText).length == 0) return; + + var response = xh.responseText.parseJSON(); + + var from, data, chatroom; + var messageCount = (typeof(response.messages) !== 'undefined' ? response.messages.length : 0); + for(i=0; i|^)(\w+:\/\/[^<\s\n]+)/, '$1$2'); + data = IM.emoteReplace(data, smilies); + + if(data.replace(/<([^>]+)>/ig, '').indexOf('/me') == 0) + curIM.innerHTML += "" + IM.createTimestamp() + " " + from + ' ' + data.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "
      \n"; + else + curIM.innerHTML += "" + IM.createTimestamp() + " " + from + ": " + data + "
      \n"; + curIM.scrollTop = curIM.scrollHeight - curIM.clientHeight + 6; + + if(!initial) { + if(curIM.innerHTML.toLowerCase().replace(/<\S[^>]*>/g, '').indexOf(user.toLowerCase()+': (' + Languages.get('autoreply').toLowerCase() + ')') == -1 && typeof(Status) != 'undefined' && Status.state == 1 && who == from) { + var fontName = $(winId + '_setFont').innerHTML; + var fontSize = $(winId + '_setFontSize').innerHTML; + var fontColor = $(winId + '_setFontColorColor').style.backgroundColor; + window[chatroom ? 'Chatroom' : 'IM'].sendMessage(from, '(' + Languages.get('autoreply') + ') ' + Status.awayMessage, false, false, false, fontName, fontSize, fontColor); + } + + if(Windows.getFocusedWindow().getId() != window[chatroom ? 'Chatroom' : 'IM'].windows[who].getId() && pulsateTitles == true) { + new Effect.Pulsate(window[chatroom ? 'Chatroom' : 'IM'].windows[who].getId() + '_top'); + } + + if(titlebarBlinker == true && useBlinker == true) { + clearTimeout(blinkerTimer); + blinkerTimer = setTimeout("titlebarBlink('"+who+"', \""+data.replace(/\"/, '\"').replace(/<([^>]+)>/ig, '')+"\", 0, "+chatroom+")", blinkSpeed); + } + } + + curIM = null; + } + + if(messageCount > 0 && audioNotify == true) soundManager.play('msg_in'); + + from = null; data = null; + var group = '', buddy = '', event = ''; + var eventCount = (typeof(response.events) !== 'undefined' ? response.events.length : 0); + + for(i=0; i" + IM.createTimestamp() + " "+from+" " + Languages.get('hasJoined') + "
      "; + scrollToBottom(Chatroom.windows[event[2]].getId()+"_rcvd"); + } else if(event[1] == 'left') { + if(typeof(Chatroom.windows[event[2]]) != 'undefined') Chatroom.windows[event[2]].deleteUser(from); + rcvdBox.innerHTML = rcvdBox.innerHTML + "" + IM.createTimestamp() + " "+from+" " + Languages.get('hasLeft') + "
      "; + scrollToBottom(Chatroom.windows[event[2]].getId()+"_rcvd"); + } + break; + } + + event = null; + } + + from = null; data = null; who = null; + } + ); + + xhConn = null; + }, + + /** + * Update a user's budddy profile + * + * @author Benjamin Hutchins + **/ + changeProfile: function() { + var profile = $('changeprofile_textarea').value, error = ''; + if(profile.replace(/\s/g, "") != "") { + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=changeprofile&profile="+encodeURIComponent(profile), + function(xh) { + if(xh.responseText == 'success') { + Dialog.closeInfo(); + Dialog.alert('' + Languages.get('changeProfileSuccess') + '
      ', + {windowParameters: {className:'alert', width:alertWidth, height:85}, + ok: function(win) { Dialog.closeInfo(); Windows.close('changeProfile'); } }); + } else { + error = Languages.get('changeProfileFailed'); + } + + if(error.length > 0) { + $('changeprofile_error_msg').innerHTML = error; + } + } + ); + } else { + error = Languages.get('changeProfileEmpty'); + } + if(error.length > 0) { + $('changeprofile_error_msg').innerHTML = error; + } + }, + + /** + * Update a users's buddy icon + * + * @author Benjamin Hutchins + **/ + changeIcon: function() { + // get the iframe as a variable + var i = $('changeicon_iframe'); + if (i.contentDocument) { + var d = i.contentDocument; + } else if (i.contentWindow) { + var d = i.contentWindow.document; + } else { + var d = window.frames['changeicon_iframe'].document; + } + + // if the iframe was never processed, then return empty + if (d.location.href == "about:blank") { + return; + } + + // handle returns from the server + var error = '', response = d.body.innerHTML; + if(response == 'success'){ + Dialog.closeInfo(); + Dialog.alert(''+Languages.get('changeBuddyiconSuccess')+'
      ',{windowParameters:{className:'alert',width:alertWidth,height:85},ok:function(win){Dialog.closeInfo();Windows.close('changeIcon');}}); + } else if (response == 'nofile') { + error = Languages.get('changeIconSelectFile'); + } else if (response == 'size') { + error = Languages.get('changeIconSize'); + } else if (response == 'bad_type') { + error = Languages.get('changeIconBadType'); + } else if (response == 'bad_extension') { + error = Languages.get('changeIconBadExtension'); + } else { + error = Languages.get('changeIconFailed'); + } + + // if there was an error, show it + if(error.length > 0) { + $('changeicon_error_msg').innerHTML = error; + } + }, + + /** + * Change a user's password + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + changePass: function() { + var currentPw = $('currentpw').value, newPw = $('newpw').value, error = ''; + + if(hex_md5(currentPw) == pass) { + if(newPw == $('confirmpw').value) { + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=pwdchange&username="+user+"&password="+hex_md5(currentPw)+"&newpwd="+newPw, + function(xh) { + if(xh.responseText == 'pw_changed') { + Dialog.closeInfo(); + Dialog.alert('' + Languages.get('changeSuccess') + '
      ', {windowParameters: {className:'alert', width:alertWidth, height:85}, ok: function(win) { Dialog.closeInfo(); Windows.close('changePass'); setTimeout('System.logout();', 250); } }); + } else if(xh.responseText == 'invalid_pw') { + error = Languages.get('currentPassInvalid'); + $('currentpw').value = ''; + } else if(xh.responseText == 'password_bad_length') { + error = Languages.get('changePasswordShort'); + $('newpw').value = ''; + $('confirmpw').value = ''; + } else { + error = Languages.get('changeFailed'); + } + if(error.length > 0) { + $('changepass_error_msg').innerHTML = error; + } + } + ); + } else { + error = Languages.get('changeNoMatch'); + } + } else { + error = Languages.get('currentPassInvalid'); + } + if(error.length > 0) { + $('changepass_error_msg').innerHTML = error; + } + }, + + /** + * Reset a user's password to something new because they forgot it + * + * @author Joshua Gross + * @update Benjamin Hutchins + **/ + resetPass: function() { + var xhConn = new XHConn(); + xhConn.connect(pingTo, "POST", "call=reset&email="+encodeURIComponent($('resetto').value), + function(xh) { + var error = ''; + if(xh.responseText == 'pw_reset') { + Dialog.alert('' + Languages.get('newPasswordEmailed').replace('%1', $('resetto').value) + '
      ', {windowParameters: {className:'alert', width:alertWidth}, ok:function(win) { clearInputs(); Dialog.closeInfo(); Dialogs.login(); }}); + } else if(xh.responseText == 'no_email_on_record') { + error = Languages.get('noEmailOnRecord'); + } else { + error = Languages.get('problemResetting'); + } + + if (error.length > 0) { + $('forgotpass_error_msg').innerHTML = error; + $('forgotpass_error_msg').setStyle({display: 'block'}); + new Effect.Shake('modal'); + } + } + ); + } +}; diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 0000000..8085c32 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,309 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ +var hexcase=0;var b64pad="";var chrsz=8;function hex_md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz));} +function b64_md5(s){return binl2b64(core_md5(str2binl(s),s.length*chrsz));} +function str_md5(s){return binl2str(core_md5(str2binl(s),s.length*chrsz));} +function hex_hmac_md5(key,data){return binl2hex(core_hmac_md5(key,data));} +function b64_hmac_md5(key,data){return binl2b64(core_hmac_md5(key,data));} +function str_hmac_md5(key,data){return binl2str(core_hmac_md5(key,data));} +function md5_vm_test() +{return hex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72";} +function core_md5(x,len) +{x[len>>5]|=0x80<<((len)%32);x[(((len+64)>>>9)<<4)+14]=len;var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;for(var i=0;i16)bkey=core_md5(bkey,key.length*chrsz);var ipad=Array(16),opad=Array(16);for(var i=0;i<16;i++) +{ipad[i]=bkey[i]^0x36363636;opad[i]=bkey[i]^0x5C5C5C5C;} +var hash=core_md5(ipad.concat(str2binl(data)),512+data.length*chrsz);return core_md5(opad.concat(hash),512+128);} +function safe_add(x,y) +{var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF);} +function bit_rol(num,cnt) +{return(num<>>(32-cnt));} +function str2binl(str) +{var bin=Array();var mask=(1<>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);return bin;} +function binl2str(bin) +{var str="";var mask=(1<>5]>>>(i%32))&mask);return str;} +function binl2hex(binarray) +{var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var str="";for(var i=0;i>2]>>((i%4)*8+4))&0xF)+ +hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&0xF);} +return str;} +function binl2b64(binarray) +{var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var str="";for(var i=0;i>2]>>8*(i%4))&0xFF)<<16)|(((binarray[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)|((binarray[i+2>>2]>>8*((i+2)%4))&0xFF);for(var j=0;j<4;j++) +{if(i*8+j*6>binarray.length*32)str+=b64pad;else str+=tab.charAt((triplet>>6*(3-j))&0x3F);}} +return str;} + +/* + json + 2006-04-28 + + This file adds these methods to JavaScript: + + object.toJSONString() + + This method produces a JSON text from an object. The + object must not contain any cyclical references. + + array.toJSONString() + + This method produces a JSON text from an array. The + array must not contain any cyclical references. + + string.parseJSON() + + This method parses a JSON text to produce an object or + array. It will return false if there is an error. +*/ +(function () { + var m = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + s = { + array: function (x) { + var a = ['['], b, f, i, l = x.length, v; + for (i = 0; i < l; i += 1) { + v = x[i]; + f = s[typeof v]; + if (f) { + v = f(v); + if (typeof v == 'string') { + if (b) { + a[a.length] = ','; + } + a[a.length] = v; + b = true; + } + } + } + a[a.length] = ']'; + return a.join(''); + }, + 'boolean': function (x) { + return String(x); + }, + 'null': function (x) { + return "null"; + }, + number: function (x) { + return isFinite(x) ? String(x) : 'null'; + }, + object: function (x) { + if (x) { + if (x instanceof Array) { + return s.array(x); + } + var a = ['{'], b, f, i, v; + for (i in x) { + v = x[i]; + f = s[typeof v]; + if (f) { + v = f(v); + if (typeof v == 'string') { + if (b) { + a[a.length] = ','; + } + a.push(s.string(i), ':', v); + b = true; + } + } + } + a[a.length] = '}'; + return a.join(''); + } + return 'null'; + }, + string: function (x) { + if (/["\\\x00-\x1f]/.test(x)) { + x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) { + var c = m[b]; + if (c) { + return c; + } + c = b.charCodeAt(); + return '\\u00' + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }); + } + return '"' + x + '"'; + } + }; + + Object.prototype.toJSONString = function () { + return s.object(this); + }; + + Array.prototype.toJSONString = function () { + return s.array(this); + }; +})(); + +String.prototype.parseJSON = function () { + try { + return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test( + this.replace(/"(\\.|[^"\\])*"/g, ''))) && + eval('(' + this + ')'); + } catch (e) { + return false; + } +}; + +/** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08 ** + ** Code licensed under Creative Commons Attribution-ShareAlike License ** + ** http://creativecommons.org/licenses/by-sa/2.0/ **/ +function XHConn() +{ + var xmlhttp, bComplete = false; + xmlhttp = XHRFactory.getInstance(); + if (!xmlhttp) return null; + this.connect = function(sURL, sMethod, sVars, fnDone) + { + if (!xmlhttp) return false; + bComplete = false; + sMethod = sMethod.toUpperCase(); + + try { + if (sMethod == "GET") + { + xmlhttp.open(sMethod, sURL+"?"+sVars, true); + sVars = ""; + } + else + { + xmlhttp.open(sMethod, sURL, true); + xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1"); + xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + } + xmlhttp.onreadystatechange = function(){ + if (xmlhttp.readyState == 4 && !bComplete) + { + bComplete = true; + if(fnDone != null) fnDone(xmlhttp); + XHRFactory.release(xmlhttp); + }}; + xmlhttp.send(sVars); + } + catch(z) { return false; } + return true; + }; + return this; +} + + +/** XHRFactory ** + ** This class from: http://blogs.pathf.com/agileajax/2006/08/object_pooling_.html **/ +var XHRFactory = (function(){ + // static private member + var stack = new Array(); + var poolSize = 10; + + var nullFunction = function() {}; // for nuking the onreadystatechange + + // private static methods + + function createXHR() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } else if (window.ActiveXObject) { + return new ActiveXObject('Microsoft.XMLHTTP') + } + } + + // cache a few for use + for (var i = 0; i < poolSize; i++) { + stack.push(createXHR()); + } + + // shared instance methods + return ({ + release:function(xhr){ + xhr.onreadystatechange = nullFunction; + stack.push(xhr); + }, + getInstance:function(){ + if (stack.length < 1) { + return createXHR(); + } else { + return stack.pop(); + } + }, + toString:function(){ + return "stack size = " + stack.length; + } + }); +})(); + +// Adapted from DOM Ready extension by Dan Webb +// http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype +// which was based on work by Matthias Miller, Dean Edwards and John Resig +// +// Usage: +// +// Event.onReady(callbackFunction); +Object.extend(Event, { + _domReady : function() { + if (arguments.callee.done) return; + arguments.callee.done = true; + + if (Event._timer) clearInterval(Event._timer); + + Event._readyCallbacks.each(function(f) { f() }); + Event._readyCallbacks = null; + + }, + onReady : function(f) { + if (!this._readyCallbacks) { + var domReady = this._domReady; + + if (domReady.done) return f(); + + if (document.addEventListener) + document.addEventListener("DOMContentLoaded", domReady, false); + + /*@cc_on @*/ + /*@if (@_win32) + var dummy = location.protocol == "https:" ? "https://javascript:void(0)" : "javascript:void(0)"; + document.write(" + + + + + + + + + + + + +
      + 8 + 10 + 12 + 14 + 16 + 18 + 20 + 22 + 24 +
      +
      + + + + + + + + + + + + + + + + + + + + + + +
      +
      + + diff --git a/soundmanager2.swf b/soundmanager2.swf new file mode 100644 index 0000000000000000000000000000000000000000..18e4af7d00fec41df7b63184e6232a9099c9b701 GIT binary patch literal 2200 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 + + + + ajax im - test upload max size + + + + +

      ajax im

      +
      +

      uploads not working?

      +

      If your uploads aren't working, try looking at the below reasons?

      + \$maxBuddyIconSize is set to 0 (zero), please set it to a higher value."; + } else if (trim(substr(sprintf('%o', fileperms('buddyicons/')), -4)) != 777) { + print "The directory buddyicons/ is not writeable, please CHMOD it to 0777."; + } else if (ini_get('file_uploads') == 0) { + if (file_exists('php.ini')) { + print "File uploads are not supported on your server."; + } else { + @ini_set('file_uploads', 'On'); + if (ini_get('file_uploads') == 0) { + print "PHP cannot use ini_set to allow file uploads. Try creating a file called php.ini in the parent directory with the following contents:

      file_uploads = On\nupload_max_filesize = {$maxBuddyIconSize}M\npost_max_size = {$maxBuddyIconSize}M
      "; + } else { + $continue = true; + } + } + } else { + $continue = true; + } + + if (isset($continue)) { + $upload_max_filesize = substr(ini_get('upload_max_filesize'), 0, -1); + $post_max_size = substr(ini_get('post_max_size'), 0, -1); + + if ($upload_max_filesize == 0 || $post_max_size == 0) { + print "Your max upload size is 0 (zero), please increase it."; + } else { + if ($upload_max_filesize >= ini_get('post_max_size')) { + $max = 'upload_max_filesize'; + } else { + $max = 'post_max_size'; + } + + print "Things look good on your server, your max upload size is:
      " . ini_get('post_max_size') . "

      If this value to too low, say, below 2MBs, then most images will be to large to be uploaded. Please keep that in mind."; + print "

      Other misc. information:
      +-------------------------------+---------------------|                          
      +| PHP Configuration Variable    | Suggested value     |
      ++-------------------------------+---------------------|
      +| max_execution_time = " . space_fix(ini_get('max_execution_time'), 8) . " | >= 30               |
      +| max_input_time = " . space_fix(ini_get('max_input_time'), 12) . " | ~ 60                |
      ++-------------------------------+---------------------|
      +
      "; + } + } + ?> +
      + + diff --git a/themes/dark/alert/bottom-left-c.gif b/themes/dark/alert/bottom-left-c.gif new file mode 100644 index 0000000000000000000000000000000000000000..531acdc513d068f75e8a1ccf78d2103b0a167cf1 GIT binary patch literal 60 zcmZ?wbhEHbWM^P!_{hkxbLY N>ke>9-mJx74FEO$5qkgt literal 0 HcmV?d00001 diff --git a/themes/dark/alert/bottom-middle.gif b/themes/dark/alert/bottom-middle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4ce3be02ce72c51d28af307b19cea24abdf4b52 GIT binary patch literal 50 zcmZ?wbhEHbWMp7x_{hkxbLYEH<;s<-KydBKtvfev-@SSF z?%n(M?>~6(;Much@87@w@ZrO+U%&qR`SbVh-~a#rpE+{|?6V<2DE?$&WMFV-Q2Zz4 zT$GwvlA5C6RH;yupOjh@;?JN1@&PEO7})UJ_O4~$y~}`uSy%ex zNdeA%F3y~Sr%tMIFe=O3yd}!Bk4N;@EoDYVb-Cxy#f8qf2usMzeUMjwqNSp$x>C&b z&+orKR)tI`p13H%k@t^L!-)g_%?F$GP8`f|+{nr;tmHH!qcJeqwab8oWyQxuOHNMK z@V_R|ncQ}IxzYeRXwHf_d?88c_joHc9K?Af#D%$YNH?%a9v=FOi! zf5CzU3l}b2ym;}FB}h$T;XU?2Cdlrb!o;!c`+_`fXE?l^H@#3XRmo8tveC5iOt3Yt=%C&3Pu3x`? zget0>gk(g)x{fSGQ&iK6&Q*lGfkp+ zc>{Eo>#!89UbDK8RZo9Y5HGW*lJZWr;U)R&Hq|i2M%vsl+evp ztfR4~fRVY)QZnH{hhQ@M9yueUa~BMjFLv)&$h&c%(V1h9l4a1dhQdek2by#;KD@Yi zm|dvCyN-cTNTp-KeCH-1#h@iC1eM*F9a!DO;yG!#*A$(|LrbzItNCrR>pa9dPh2Z> zRfJ?UYxhl^jLkU@4{h_7tZ>cP*TSjnc4mfQ%BM-1!N+=L8aG^A(zx91>@3q9fz64R tm-Ws*o_Eiq&DpYnp<;${_Pv~$eb3J?aPF4#-L>WA0000nIXp%^K}JnbSy@?GUt(ljU}SZpP!d%| ztE;Q5tgNlAt*)-FudlDMv9YzawYa#rxw*N#yu7`=y}rJ_!NI}8!otPH#m2_Q%gf8m z%*@Ts&Cbrw(9zG-)zjA3)z;S5*VotD+}PXQ+27ya;Nall;o;}!=kM?D@bK{c{r&&{ z|IEzHA^8LW002J#A^s9Wa%Ew3Wn>^ic_4CcVr6nvPXH_c0000N02crN2H!x0EkrCD zk476ph-@O2iJEgtR32iRtai)Y$_fV;CW9H5&*(I)Kv+@U@VGqA8W1> z_us#N|Ns9#bLI>K7%2W^VPs(7WzYffKxQzoL~QWn%$hqb)9v6r->;4LR&=TbFI#=H z@4a~b=b5*X1vuX8@vOa@;1I#d+2ZsvLPNr9|B}R4oC0$%H@hpC%J6ZVXW({IVPJH+ XHYb3A#jhaxp z_us#N|Ns9#bLI>K7%2W^VPs(7WzYffKxQzogbH}v%u1c%JKH#SE_;Kb*)+9=S*x$D z((XB>D$C>~aHV;|{T9dk=b8dd_LCPT$Y}9;FL}w(%U8y5q)|#VLx@9ni@^mAp#(ie UhJYQHy&JtYT6D8Fa4=W{05-QwkpKVy literal 0 HcmV?d00001 diff --git a/themes/dark/alert/top-middle.gif b/themes/dark/alert/top-middle.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cab17d53de3e1df534c9d2e93b8c7eee08b8dee GIT binary patch literal 97 zcmZ?wbhEHbWMq(J_{_twbLY-4U%q_(`t{qlZ{NRv|MBC;&!0bk{rdI$_wPS{{`~#> y_us#N|Ns9#bLI>K7%2W^VPs(7WzYffKxQzo@Cj`2)aFi_kaWhebCZrBgEastW-&eh literal 0 HcmV?d00001 diff --git a/themes/dark/away.png b/themes/dark/away.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5d98ce0247896b3d92c9b5e29728303569c841 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxE`3HASft!(QTa}P=u)@$S?Rm!_(~sUO=9Rr;B4q n#jT`-6b5DuSEGhZb`Apuh8qm53!@phf$|KVu6{1-oD!M{0D=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8x zIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#h zOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aR zU0q#XUS3~cUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCC zZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T6m3E7x9#jOUoeMliBE0Mq-)`Z`3!p*UAQ~$t9)~kH_Uga6gK-8A#`Q- zCNECyiCkU_Iz&Yus`IbE@GRlT96SBpTz4Bv?uc0H&rW1tSMi{#J8*fik3|yqGu{Um zOcU0ApOzRrUne8i;lQ`RLpmqkul{z=Db#QJj8m(sE4KXUaGqXLd^2svF9WBV$s%D> zEf@u#7|&D?3OO9Yw&?=9!-WfX�DxGdLCkT-tv^LoO9MZG##|G(k4T{Ee&{%evE P(DMwQu6{1-oD!M-=VWux~vV8!oUXWezC5rVzSdIR#~DH3WjCh0H6hY9QVx!Ogafnc;lv+ zd?!bxz>>3Mz&CCww3vAt_V-i6e1_S~<^X$2x|)U(b4hn|3B8_oyqKB6W|7?$sBcd0revF_S0-@WHG?3pIsHHD8*);Z d#nt8mpnsbefoCX2ro#XL002ovPDHLkV1jB$nce^Z literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/11 - crazy.png b/themes/dark/emoticons/11 - crazy.png new file mode 100644 index 0000000000000000000000000000000000000000..43b68cd6e7a9c9e2df85f66363df8ff422494498 GIT binary patch literal 426 zcmV;b0agBqP)%&wkGi0iaLiW01uz{dpIyNOUEEQ%f6h z^!q5L6+tTkS^^$kT8I9NX+=V-b>bAnL$%uP@(2SaSDKI6aR44-yrZrp@MGRjTi7ev z2QAi>rrCA}0H}oN+ltlFd}rIR?V<27)9e+S=NTk_pcUbTJAl(R9>xo8v4<;zPxFQQ z7K@Zxq%myTBRuX(LXsqAavQ;F>8%z3TuPA|h{NFT*Adpb62pnHXyq32F~PgzQoKP)RCt`Nl)VwdAPj{y1|xWg6r6YP3NF%l0D6y-qe@y&;03Zm z3Q7jZO92A$mo)L+D=edrX9+<7=wJF9D8X*mdn0d1A1i^i&q=zsehBl1;0*zmfK$k3 z=uen8q`irWuSx>yP3y7;Yas(D1G_MGq?Bp|T)J@yOt51O#m>q3DWPqge>cIDQaIL7 zU`}$*!8sS+2l3|?oW*a+S?JuWOkxK$jN{z(WugiuI#~RgjT=>UV^9OzXVH4@nxz6H z2 literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/14 - devil.png b/themes/dark/emoticons/14 - devil.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b3f3ee844ef6610868fb6f8044d7900271d449 GIT binary patch literal 522 zcmV+l0`>igP)5GU2P_eh~d*t z9*EZ*`v+=Gwbz5);xLT<^aCWxfBXA1#&jTK40FE{|9ci3w zIBI~KbMoe#dI2b;>-A!qrjRoX0`Q8180o$Hc3yfD3{!2~NV==%1BOFSkP`zub^rhX M07*qoM6N<$f))qk`Tzg` literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/15 - doh.png b/themes/dark/emoticons/15 - doh.png new file mode 100644 index 0000000000000000000000000000000000000000..f146a915da3aa1250ef7e3e1091396cd70d90340 GIT binary patch literal 345 zcmV-f0jB$qNY5D5>1dgN1#Sff z$N=~XV&gatG!(y1CxuV8^8iGIxAGdq*gW<{q6fDQfRw4_IBR_siykm~Kn#GmiG&M% z#G(fmefn@$5oq*fl@?Ya6_h{|D=NZI9$jI`LB`hM95(K0RvJoK2Q|lQhE8JVqJ*u( z2_CrMfeS-C27%E|=a^`bK*BP}Xtir9m^@R|9{p$Z4x3uBpfay40{eX}EP#E!YUeFn zU;JFa#dsD+NDT}00000NkvXXu0mjf)%S_8 literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/16 - XD.png b/themes/dark/emoticons/16 - XD.png new file mode 100644 index 0000000000000000000000000000000000000000..43b8f07f3518ddd1e542c64a28f3b5b87e6ed7c2 GIT binary patch literal 397 zcmV;80doF{P)I%uWDkHMm?cxQ zm@TthKZU651MI(op7yl2Y-UYPSVGUYbJ|h?Kzu8{26^oCIQ|Q(guEUED0J;Z=H~BW zRtZ=ofKdQ97Gpp^Vpa)hl}lWcxVb-Y&$P-M2CQ3K7-LA+;Wr1fSXz-)@p^HXTIQg~ zu7_>0eF91VC3GD?syYR!U5>?Vt)ZG1&UoP*)-1t%l$4mn?tS(LDKn6yPGg3F00000NkvXXu0mjfy|1Mz literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/18 - brb.png b/themes/dark/emoticons/18 - brb.png new file mode 100644 index 0000000000000000000000000000000000000000..a096a7e30a6f706a5a32ebbe1960b7dd358455f4 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3oArNM~bhqvgP;i&0 zi(^Q|oTGiZd@Tk7t@jO|@pMS(ISB0Kw)IwZeDuN8;|y2HSu38^20OmyA5~*Hxb2Us z_P&%)&(2O~^t^L4S7}m%xn9S$Sy9=?s_yOBa3;!oX~?oEr`Bu@Obpnf-hIl+ec|1O zMQe&9L|)Ak`n&7k4)Lj1bwv@jP z*Y55)vwQRY+HLdnYqzO(*Og7%G&gM19>qzIjFcuFl4ck5eE)#?vb&c~gyY6Spf4Ca MUHx3vIVCg!0QN9zy#N3J literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/Emoticons.txt b/themes/dark/emoticons/Emoticons.txt new file mode 100644 index 0000000..19161b4 --- /dev/null +++ b/themes/dark/emoticons/Emoticons.txt @@ -0,0 +1,3 @@ +These emoticons were created by and are Copyrighted (c) MazeNL77 + +http://mazenl77.deviantart.com/ \ No newline at end of file diff --git a/themes/dark/emoticons/angry.png b/themes/dark/emoticons/angry.png new file mode 100644 index 0000000000000000000000000000000000000000..2496cd2f6ed9353953f3d75b0bf8ae83d28487f8 GIT binary patch literal 370 zcmV-&0ge8NP)mvMDPEnSOpkDUCIJITbF)pT@)(- z(-p>j>!2>}QE@RnH3Lcu$wW5ZV%fvS)70O#N&`q$KMoeV>TJsmsKdN%G1=36y`RW! zvI9>tR^`3{0*+N!#DmVTXu&aMfYN{Oro^6}{RA20`l~U3(LNT*sb<7}0TJyRuc@W5 Q6951J07*qoM6N<$f?f=iu>b%7 literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/cool.png b/themes/dark/emoticons/cool.png new file mode 100644 index 0000000000000000000000000000000000000000..64cc1eaf8944dbc4be408a71e23bb3eeb630969b GIT binary patch literal 362 zcmV-w0hRuVP)%Na;H8Mj=!Z%WAOc<`@)N~J2_*3?eGNnsI9?B?f`?ltP&5xJXT>*R!Gpnr zTtHqDEl=oMSnzPc$HZHq1R8u@r3I@Y4X6N3SXB{sxylNc97q!Ax{jY}ovI!>g`NM- z-2dz~SPW?GtrHX~PFIxyCru!CZ0^OY3Uurv?07w7Kn;$4GWUwUWw3d8oRXQ4G+yWK zQp5g#4VVt-i*d+?I99bzHO$R}J?W_|*w}+(AKjEWn+H_Qm9=df%fr&D%om`*@~ literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/cry.png b/themes/dark/emoticons/cry.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccb884e1cbc137b15aae7b9309adb41d4cdd7d1 GIT binary patch literal 458 zcmV;*0X6=KP)RCt`Nl%bBoKomvq=ky~g8q%QG)U83#r8ss?%_K;EVjU!; z3dEWsF_=x0CaCpTlKBAcis_q~mX=+CxJf7NJ9FQi*8xd9OHTt?*ml0VlU9hz6cnvS zR#D&ggD|Z?txPdbMynCX!a@IpX@y8DSF9Dti;)kPXWwNXjJ(`~9szq{;z$Z5D>5V* zx^>ewi#E{0%G8AIgQ_bTu4!R;ZPs0&wClsj!ojL5nb+ivd)~Nj0rQ$In4EMQ*0gx| zS(*Zd)XKFh&aGpw)g%~zNjqABRUC5zaN4L$Vci|Rm;Eq*o@D1THLxmMplaJBlO#lfXO8?R*Cr)Nt(ud~$PU z)p4H$ojH>!UX4J^jttl2=hxB##UTqL*-$`3utebnD^t1N$}v`6k(hZ z)V9#?%!9?cD_RrAZo(xYVbb$1qc>!1tjR(cmMzZ07*qoM6N<$f_R6` AHUIzs literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/embarassed.png b/themes/dark/emoticons/embarassed.png new file mode 100644 index 0000000000000000000000000000000000000000..825a79ae0ecdbc3733ba95bab6f352334032d189 GIT binary patch literal 400 zcmV;B0dM|^P) zOMHOV7dwg2mq|#$n;5bJ$eCBw&<-8I@us%qT+Nyntz~0l-7r z2-8~c!@>(;AmHC61XrPFarWkqG=Br(eyqWM2>2%8i(qdj*!hx;hMh04w-fN`^SrB3 zu3;jZuX4r~=A0>9v2WOG9yxck;i|d;5y%VCy53E>BM#bvi40h|76aS#|JNvhA`}+d{Lh|tTztU$tT#0P0000 + + + + + + + + + + + + + + + + + + +
      +
      \ No newline at end of file diff --git a/themes/dark/emoticons/emoticons.js b/themes/dark/emoticons/emoticons.js new file mode 100644 index 0000000..b157a98 --- /dev/null +++ b/themes/dark/emoticons/emoticons.js @@ -0,0 +1 @@ +{":)": "smile.png", ":-)": "smile.png", ":D": "grin.png", ":-D": "grin.png", ";)": "wink.png", ";-)": "wink.png", ":[": "embarassed.png", ":-[": "embarassed.png", ":(": "sad.png", ":-(": "sad.png", ":'(": "cry.png", ":'-(": "cry.png", "8-)": "cool.png", ":angry:": "angry.png", ":|": "serious.png", ":-|": "serious.png", ":P": "tongue.png", ":-P": "tongue.png", ":heart:": "heart.png"} \ No newline at end of file diff --git a/themes/dark/emoticons/grin.png b/themes/dark/emoticons/grin.png new file mode 100644 index 0000000000000000000000000000000000000000..f11070b254c4270efc5ebf0aa938b8985c22206d GIT binary patch literal 383 zcmV-_0f7FAP)`t-Z-W?H?QfHKO{#ARDP7G`rS-Fz z*95N#*b#6R*$wDJ%xh9!$Bn;P1nTv)$`Zz#Q+pCj?MkqS$%^`x04xA3!shfJE9~mf zvIH6H+c0ddB0`hoEe|tP5(~r5usgmva~QWi!p_5-WWGLzh}VPTHKD0yuvdOXES*qS z6RwxzQ_%HtL{}4jK1*0Uox^4cV+^ddaL$bY=NzoHFvj4pS@I}yOv&nAZLz7uX|DD+ zN)Mj_)7n&3@e5!uzCWk!dW4*|>moFVDG6q`1^RXjHPt`gW=dSho4pRFCXmOsMh2?1 dG0W_I_6Hmlq1Y6iA6fta002ovPDHLkV1i9uqB;No literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/heart.png b/themes/dark/emoticons/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..88bfc1e0086c4a221f2f77f0d2deabf4f4c851c8 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3oArNM~bhqvgQ1G3n zi(^Q|oVAxW^0pZ8uwLkyTp02A#e^Fw#uH{83XXAo{i;OQ`;WF#be}NCQN_rvA0N9N zIT;S^*OK`hCu;0`D&0(dky^gl&GwEhnNzfnov}DC%&?(#0jtCEFF#K|VbW5Q-oGrT z`MmCmhJr@2ZCCP&UL7mL3B zm1(kCrpSdgf77*&o%!+PPSds&tMB&rEt_X@mz}Aux8k=t;lDK8dD-ixxt)J(S8rJU zKsF>Xe8B?c6$jrP5WI4<>VfbJq0c}J;`Rn^v4_7HZSjPYTN&W6g*{e$pH+FR1_XwB*Kou`6>FzC1nsZY%Gu ziCGUf`+m5bb9af@o#UHdZ;}7^@86euRX;8`J=o~}<$l$ND>)~YwH#j1@ayx7eKSga ze0*_xiTt-C8b2?(JYBE!?Xddp$$4+L@NQ@dU0BA2GFMFk*%+vh; z|3AYhpjikg{$ycfVCZ4c0oee`6AT>w43eBO9vdDUsOJ!tO8N4>VRm~SpM%B?0VS7C zcG+D&zfVX$QqN?Y_l84I#kpI|^o{sv|2@;EmUEGcgYDOR0B_2v(;UN0)9xTId0dF}`+_F+#*d=l7!uA44UrS71vAs%cnFz}yPV@3O)2jIjiKfg=T#r>* zb#FihMVr)jvj>eZRe++8yg4#U&@z3wn<;o=0X$Cy^82q*fhsMmV)#G%0EixdEr5oo QtpET307*qoM6N<$f;DrRg#Z8m literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/serious.png b/themes/dark/emoticons/serious.png new file mode 100644 index 0000000000000000000000000000000000000000..a22f09097b7c58951f4437da3189870341b1f8a8 GIT binary patch literal 339 zcmV-Z0j&OsP)(UUyn;jiPW~kT^soF4%Gh} zr&#plqE7>#Dg_#S-KB-qNCRci#Hx;PlhGXp31)1a-is}uO@YCf^09`l#AGpUn0vyG z1v{4fojWWr-f4+#zhTi6#_j}TgtKF5uA9K-z9{&10}}SQTUa3be6`M7>S~>8%!%$8 zEl#}nr=~b|#cp1Q3(bAHLV6IdmjQ8C<_*Z8zLN!FK`qP)P=y}=hQ{v0-Q=V~tkVHJ l?gBY~H5BN0pi1*SdjX?sL;qfP86*Gz002ovPDHLkV1fn(i+lh8 literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/silly.png b/themes/dark/emoticons/silly.png new file mode 100644 index 0000000000000000000000000000000000000000..610478fd766906ea4d04d3b8714bcda8bf4b3a79 GIT binary patch literal 409 zcmV;K0cQS*P)$`ItI8tJ5Zw6L_*@V znIKYxL<1wFptNXc_+Me4b8(zU1Jd7|oDbjG2?3yQszm0eMKMsg^Yuu$7D#>q zE^5me8jZPOD~u|@GU1J1cNo4FV{+1SOttuUJV3?I43k=_)iPVbFuDZ-$;`raK@Rl3 zgA~>j>fc6(Xb8xsTJPEt?6yx~t=gR*tjtkrGN0$^fPrgRcC{EYv)x6*l?+_tb-w^W z0LzR}X6iJryE8R~pNR%ldtF61ZZ~+I4tU)!7`Vo9yFr;n_e^ea0ONPkM?i@{YnYjV zQDjCkr!xEJ-IVx+=&I?O-1al%^H(DRjXW4-^?UXQQM7=n`?vc~00000NkvXXu0mjf DNhhr| literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/smile.png b/themes/dark/emoticons/smile.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6db15c31abf47397839dbcdcddc5673da08854 GIT binary patch literal 363 zcmV-x0hIoUP)(nw<-$Fv0bHwwMYkL(8TnLxK6+*kv6qu4GOk~z1R%#$6(Xe*3fBeFSf!c z067x=@Pix)6l{!7`i!Y9rj$VbamM@uDJ65O)6l`N?Hw56n#py+c#X|o&9?1`hJf*C ztM1+FZeitu&i?vp$i!t;YiKd2SEmm|ve;K+8VJ*%PV@GB)9g!4s#D^~1jee&7a$-H zs%y2_P!Dq_unM0jL(_2aHaVpu)^Gr?`w98{*Qh|p1FLlZXa9CKgDexU0O0@t002ov JPDHLkV1h3EoihLc literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/tongue.png b/themes/dark/emoticons/tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..c08dea590bef9fa785e11104230f5528a66625d9 GIT binary patch literal 415 zcmV;Q0bu@#P)KnvfrKr!ltu-DJyz7cKzGWDF<+ zW|>eIdze}B!X<%#GLD&ebuz52#L>HLh6*I|h)wsE-40urNw;b_yZLbuvBg2>m`bX1 z=*SHKVD3AN+~DW?E5qu7P#5AfPveo=O04QK_Z^=1E1vf&=Dv&As;bR5Ab=*WK5~;* zwE^v6DgoWZ+kwKhkWgLx^KSaM2SdX>D3JGGjTNZ;#8q~`XMcjye?mm`2lxO0002ov JPDHLkV1n}TxW51Z literal 0 HcmV?d00001 diff --git a/themes/dark/emoticons/wink.png b/themes/dark/emoticons/wink.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4afac6302d0851fd076175ca8da3bd03717a59 GIT binary patch literal 367 zcmV-#0g(QQP)OrGtVL)G5csHC@kp; z0f8Q%Z$W&{-NlItTIrRl$bNF?pAZ20RelCF?0LEGQWE(o5;)_~;`zTEe~6VtD2aef zz(XW!^b{+Jd`WfUY*Imfkp+900=SAJRJN+HT}8OAZDtMf8X{}3VN+ZeTR}2;eKth` z{}|+UCALm5SV^^t`m7`ZMUC-JYs|KYE8h5Ttu<`;!?G-@)!@FscA2-`#C(8_gE&iE z$%A%~dQm-huUikxy1H?w71%Q;4lu8&#k{Jn0^)FPu)%^O1SfX$dAU<}f^6%gs_qSF zpuLj<=|M-BSD*>+BtyZS+)Yj$h$(Ks>!uLcIj7&V;K=ht6W<#TfIf$kW-716KkNVi N002ovPDHLkV1mkIn+N~^ literal 0 HcmV?d00001 diff --git a/themes/dark/logo.png b/themes/dark/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c8cadb78a9a477f3663a706dd59a1dd36cf5f6d5 GIT binary patch literal 4055 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 T<57w9H6M@3l+OupV6X-NcHGi4 literal 0 HcmV?d00001 diff --git a/themes/dark/offline.png b/themes/dark/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e36bd168067d89558085c919b8fe7199695227 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxZY&c7ZemMe6=DJD8f_{{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxGp%TD<~)^cl!ztP=u)@$S?Rm!_(~sUO=9Rr;B4q n#jT`-6b5DuSEGhZb`Apuh8qm53!@phf$|KVu6{1-oD!MEaktaVsey=?L=-35kzQ50%a`ur&M6Vr0D#UM0YOdV_b@kIf1W4U7!?r!s54lSFM8^>bP0l+XkKJ>)Xv literal 0 HcmV?d00001 diff --git a/themes/dark/window/admin.png b/themes/dark/window/admin.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb3e54f517f1551c855b09b5d548deaae1eac34 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^#y~8{!3-qbrBhUalw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JVt^l79*H525ojQFcJ}G_5v{`%h9cb_DU9@CbRZYYCjhkIO z{DMNGo;-b)lV5WE#?Al#|C?Jo3JMA~%)ZbMvalq`FBm9@0vJ@+&P)PI&h~V145_$v zWb$o3W75 z8$X?r__*Z!lGG~=JrU}TVdAIKR2S?^lvo<|KgG!LOaj|W5z&hRY|6P3Tv8XeL@t$h zy!=Un@uJ$}JQXc-1*7(@ARJ!_4Al` Z7*;;i6FFG-Xfe>444$rjF6*2Ung9yCnUnwk literal 0 HcmV?d00001 diff --git a/themes/dark/window/arrow.png b/themes/dark/window/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..10d7427dbe8e084a382cd05cb942fabfe456f8b6 GIT binary patch literal 3637 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 Hu0mjfybb7o literal 0 HcmV?d00001 diff --git a/themes/dark/window/arrow_up.png b/themes/dark/window/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..dccc02bd84ffc2fb55f186f9a852c4b8b6cb406f GIT binary patch literal 3632 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 u*mYh(&%HKCGIFPb}V z!OYonA3l2Y|Nnm-eG@@J!JxwvP692GFA4Gs1`6T<3}+?F1b|96db&7P4pAGlTc67RW q-U;*k#7$i+js6BICNy^ z_3MuxKYRisHgDb0)YkRj;iIea(+wJNJfb~-|@m`hF^r!&C5^19My6hoMy~Dpc2#6X1`oR zc-;Z#FW&Y=A=x%n=RSTo`T1~txb)v$JEHz?xcUC);eDAO?>_OJH%&q2&xZTkc67RW q-U;*k#elF{r5}E)>ZPDfc literal 0 HcmV?d00001 diff --git a/themes/dark/window/bold_off.png b/themes/dark/window/bold_off.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb504e9691044ffc5efcb60027db402c954d696 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sTpvGv+}l6t+Vvaz_8-j1&UbeAZES822#$z}Pg%Nr z<*CzWX3n1X{{4G%YezvrK?7s{mq3mDB|(0{|4{(Ll{+&Q0;NJdT^vIyZXKBv$#p=1 zhc$W2?Ank2j$h@rXcc?&r1(Lr&NYGGE0{CHP8hwFx?*&BQtu_htD0t+>9GniyLN1! wFCZ5=bL+#J8Tl&|Zx-^y*kaBh*R{ZU0tC!hrkp00i_>zopr0DszT761SM literal 0 HcmV?d00001 diff --git a/themes/dark/window/bold_off_hover.png b/themes/dark/window/bold_off_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..0c480d61a0448a4bbd5683c068de281f86937c5f GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sT%SC7GG+Sg8#iwqI(#%BG^VJmIwm3Q?78y`7A;-9 zc0*^+g!Jsf_wV1kdIbs!3ck*f;{EaktaqGyWNWKOI z9#(Hb@tUXqj<<3fsLgutrFhcyl8tRQ++`g$J50;G{y@W6_ol|%;JHbYwO%tlymWN$ y-?k4YPOa%>x6ag^S7&*W`|pSBKPzJ!7#YqBtJ=T(rpE@ffx*+&&t;ucLK6VsCvimp literal 0 HcmV?d00001 diff --git a/themes/dark/window/bold_on.png b/themes/dark/window/bold_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e440571c58a5ff3013483dcd609b048765a554e7 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sTpvAp+}_!J_1d-Fd-f(Ir&-!MEL^-KI4rWNrhdw_ z8E&4wCr+Mv|Ngy>fr+4?;19MPZa|IvB|(0{|4{(Ll{+&Q0;NJdT^vIyZXKBv$#p=1 zhc$W2?Ank2j$h@rXcc?&r1(Lr&NYGGE0{CHP8hwFx|6z0ReGt_RZX*(DX|JMw{~uq w7m$mbx%Fd$_}ZhF_0=mE%GdSUZ{;>%xOiOEUc>zKPoM=1p00i_>zopr03G;j#Q*>R literal 0 HcmV?d00001 diff --git a/themes/dark/window/bold_on_hover.png b/themes/dark/window/bold_on_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..0c480d61a0448a4bbd5683c068de281f86937c5f GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sT%SC7GG+Sg8#iwqI(#%BG^VJmIwm3Q?78y`7A;-9 zc0*^+g!Jsf_wV1kdIbs!3ck*f;{EaktaqGyWNWKOI z9#(Hb@tUXqj<<3fsLgutrFhcyl8tRQ++`g$J50;G{y@W6_ol|%;JHbYwO%tlymWN$ y-?k4YPOa%>x6ag^S7&*W`|pSBKPzJ!7#YqBtJ=T(rpE@ffx*+&&t;ucLK6VsCvimp literal 0 HcmV?d00001 diff --git a/themes/dark/window/bottom_left.png b/themes/dark/window/bottom_left.png new file mode 100644 index 0000000000000000000000000000000000000000..419e98ad0b184fc2d0c9838abb8c65d2348f43b9 GIT binary patch literal 898 zcmV-|1AY97P){0D=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8x zIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#h zOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aR zU0q#XUS3~cUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCC zZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T67)eAyRCwBAU=(D60EU5MK>-6J3;+Ze Y0F=K1Gen}M-v9sr07*qoM6N<$f_y}u<^TWy literal 0 HcmV?d00001 diff --git a/themes/dark/window/bottom_mid.png b/themes/dark/window/bottom_mid.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba55785ea921334218c02b865ba3bebaeb7ccf5 GIT binary patch literal 896 zcmV-`1AqL9P){0D=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8x zIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#h zOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aR zU0q#XUS3~cUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCC zZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T60000{0D=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8x zIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#h zOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aR zU0q#XUS3~cUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCC zZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T68c9S!RCwBAV1fWaMuvf62|@uQ10xIo a1Q-C36#_GOaARix0000{0D=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8x zIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#h zOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aR zU0q#XUS3~cUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCC zZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T6CrLy>RCwBAV1fWaMg~e*j4&1>OpFmG n%ZMb4p;r(J7#SF003g5skMaU8oDSr z1<%~X^wgl##FWaylc_d9MQi~+A+9?5CW3;3XJZmsfFevKL4Lvi8J=!8@B;EoJzX3_ zDsCkuEYVF^(EO8U3zNWSNr{Y%gDZY6e%3$BKIuY5>F*Se?e`g&co-hDGd^5= SHqRbt0E4HipUXO@geCw2(>gE! literal 0 HcmV?d00001 diff --git a/themes/dark/window/button_hover.png b/themes/dark/window/button_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..91126b97f547d17e96826c30b94d8beb2221973b GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^@jxuY!3-n~;wG~KDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MQi~+A+D}ofr5g9`+E<}0*Ww|1o;L3XL!2ZzzfJT^>lFz zskoJtutYauLGw?ZEldKRB_%R44zBpQ_*wrf`>cOZhR)gLrN2`=w%=!9;$e8q&iHWg S**tro0Sun5elF{r5}E*qsymqg literal 0 HcmV?d00001 diff --git a/themes/dark/window/button_normal.png b/themes/dark/window/button_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3804fb7669e0ed33f36bf87e0396626548cda6 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^@jxuY!3-n~;wG~KDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MQi~+A+F}uj)H=Mxo19Y0E#e`1o;L3XL!2ZzzfJT^>lFz zskoJtutYauLGw?ZEldKRB_%R44zBpQ_*wrf`>cOZhR)gLrN2`=w%=!9;$e8q&iHWg S**tro0Sun5elF{r5}E*r-aDZH literal 0 HcmV?d00001 diff --git a/themes/dark/window/center_left.png b/themes/dark/window/center_left.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5b9be95dd5edffdfc84f48ac78ffabd3605923 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y!3-o1|LNZWq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6|n{Qgt$7nc?${(M%-C-11Q4l>EaktaVseyfrZ0>fq{jA U>2$tCF;IfR)78&qol`;+0BEWp8~^|S literal 0 HcmV?d00001 diff --git a/themes/dark/window/center_right.png b/themes/dark/window/center_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e359da3bf860e7f20f54d9e9d8d9692fb7610a7f GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Y!3-o1|LNZWq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6|n{Qgt$7nc?${(M%-C-11Q4l>EaktaVseyg@MC>fq|8Q UNtj!A6HtP|)78&qol`;+09(EvRR910 literal 0 HcmV?d00001 diff --git a/themes/dark/window/changepassword.png b/themes/dark/window/changepassword.png new file mode 100644 index 0000000000000000000000000000000000000000..4d686c7a6a2ee8e88aa923a431070a643adf9956 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sT+7ppg8Zx+a`p2POqRB)J2=|UuGic?Noie=%A`u| zm=KH9D6<1I6wIw11qB5k)%v&rHS(7P`33(+0Ss5}%vcDN%Jy_|45_&FN793N&qIc)l_I`h_pao*;qFuA+8yr8u*Q`~Oe6D5gL?J1eFFd_E)3Xe2 z9dftdd}DF$ynAZP_wt(Q*RH5z@y%P$6|~I#Z=LY5Ym+Vh=g)New*P_F0fvrR?Zeud Sn{ETGW$<+Mb6Mw<&;$V1!*3G+ literal 0 HcmV?d00001 diff --git a/themes/dark/window/changepassword_down.png b/themes/dark/window/changepassword_down.png new file mode 100644 index 0000000000000000000000000000000000000000..2d22b68862c5c4b7cee892518b23911415be368c GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sTniJltJ5{TTnrX9tE5Njn3);RtWn)IQE^R|a(}6M zu(y6}knVvQ3Of2Gf`Wo4u6wEgHS(7P`33(+0Ss5}%vcDN%JFn@45_&FwNj`|;Ngc${?ov_#D96ZW$<+Mb6Mw<&;$Uker>D( literal 0 HcmV?d00001 diff --git a/themes/dark/window/changepassword_hover.png b/themes/dark/window/changepassword_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..4507467d335f0d2335a98b3874a33f62a1c4271d GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbOU@sTQJWb+gVnA!Y&dd$QK~Bxh^A=A08N};0 z`{|4H#Of_)FW-K$W&6QrJNd8nFF5%&wDI(p75DQG-Kdh8{$Kapgf3w3fls)z4*}Q$iB}137sn literal 0 HcmV?d00001 diff --git a/themes/dark/window/close.png b/themes/dark/window/close.png new file mode 100644 index 0000000000000000000000000000000000000000..0025754daa205ea4b4648abe8c7837973bd21ac3 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn3?z9rZ$AN~BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxL&?`Lr_p~`_`H*KoO>rAiv=M3{STkcma8Oo-U3d z6}OTST-bS@bQ>s4G!SIdV7z{mflcF?0!u+x!iz&Dl9$V}esZ%iut+dWX=nI#?DU4e PK%ESpu6{1-oD!M{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxC#n_G~YP!%o0d3mIV0)GdMiEkp|=lc)B=-RNP8R gkYHWH*ucQdz-Yw4I63v%0-zj&r>mdKI;Vst06DQF2mk;8 literal 0 HcmV?d00001 diff --git a/themes/dark/window/detach.png b/themes/dark/window/detach.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bac1e456d65cd87be710c54f7caafe36bc6b22 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn3?z9rZ$AN~BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxL&?`Lr_p~`_`H*KoO>rAiv=M3{STkcma9(o-U3d z6}OTST-bS@bQ>@*b~p$px(GH3WGL~hc&5N@q!8H=&%&kgm6cJjfq|J}MlK_xM&K1U PpjHM?S3j3^P6{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxC#n_G~YP!%o0d3mIV0)GdMiEkp|=lc)B=-RNP8R gkYHWH*ucQdz-Yw4I63v%0-zj&r>mdKI;Vst06DQF2mk;8 literal 0 HcmV?d00001 diff --git a/themes/dark/window/imanyone.png b/themes/dark/window/imanyone.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d8cedb0b288eefe7b419ad0e08e09866b81a8b GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XI0Jk_TqT!ZHMe#Y6ciM?G360ZkhvttFZlm|hU=$z9f4dc zPZ!6Kid#tuNk^DxNJxBaI;elPfpNl8Nr{3J{a%-SW;skza951ss;&{9kfx$=_Jn~) gkk&sP4uJ#)KNF^Gp2j!4KvNhzUHx3vIVCg!02kso?f?J) literal 0 HcmV?d00001 diff --git a/themes/dark/window/imanyone_down.png b/themes/dark/window/imanyone_down.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9e9fbf753bb2accda94a0c562ee0ce10f867f6 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XI0Jk_TqT!Z)zLQ*6cpU#!5#(_WG)Hv3;zF~;rc0FM literal 0 HcmV?d00001 diff --git a/themes/dark/window/imanyone_hover.png b/themes/dark/window/imanyone_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2bca04ceaa731077cf82d8e3d0acf362e5bf8bd8 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XI0Jk_TqT!Zb@d7q6cju#bJ+=?AahBOU-19`4A)QbIs&;? zo-U3d6}OTSl8!LXkdXM;bWs0n1LK6Hk`e_c`n@ju%yO8b;I0_MRb3-IAx%Z$>GGAQPM_Jg|KR)g?*oD(GP3hGZQg2b z?I%Zl1)U~E7 zc4RK+RGB3ayUBT(%;!l{C%8MFYn$V8Crka^R>9+s8g-S$o%@ddU3}EcuBLbXE*1#} Y>n^Ft^Fe`3KvNk!UHx3vIVCg!0IO76p#T5? literal 0 HcmV?d00001 diff --git a/themes/dark/window/italic_off_hover.png b/themes/dark/window/italic_off_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d54e08b88e596d08c871ba8acf40a957d4ed50ae GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X6a#!hT&GN*{p87$)oVALJ$L^7`}aj<)iDWahYlazwquv8 zSD>Jv;JjZ)N`Z>GOM?7@|HA=;mp|htps<&xi(^Q|tuvRbxfm1#oDc4(yZ&4LMqO*V zVn^n3PL){_v74Ni$$XwPb%MM5xwbhjcf3^BEfqZes8LtB+_~@Q-^EAG>}q=F?_!Z) Yu%Zl1)U~E7 zc4RK+RGB3ayUBT(%;!myC%8MGYg^+IlcoM{tHAL`jk?O_&V5J!EJv;JjZ)N`Z>GOM?7@|HA=;mp|htps<&xi(^Q|tuvRbxfm1#oDc4(yZ&4LMqO*V zVn^n3PL){_v74Ni$$XwPb%MM5xwbhjcf3^BEfqZes8LtB+_~@Q-^EAG>}q=F?_!Z) YuG`L_ldXGK7|KoAz3a)RwjEwBK6ZQe9k_7u()6wRdNFy<+wUr_ywbng z;N!q$J4vdzvngQbBlGopLWDvv54npQd`R>>*4*ecJ1S?*wb0@EPFUIZ4WWe6Fp}B znIm+w(dh)%+_wJh-Ag5MPY3&@P!d-38W*}g5^%k*R> z?Nm;0@Q*fXov**-i23C!SEc5k@(&F4*>!K@nIPGT+i%^vJ!O+#)kJ;Io%fa>wK;q4 z{EY3ockkWX_2g6Qc2D!QSF9b4FFl%L?{4h2eqsN_DZQ)oRv!)OS+4it!$&tyU&WPI za`Fmq+`Q$r63~16aPZ!6Kid$zc9~V2MAmSQ$ z$;9^Cz3TV6jeq{?v1&n@iUe%evJWlg*llbY-~TMzG#`%)k5Qa+!}!(zjosd^}TUg)vl z|BRyhcb-ZR)!p`Xd-qZa(Y&C4JGP&^A+q7|s~y=HFV;=oIjyc#N%r!FZ~o5H_CE-2 bU}RXl^gzW7+seg27c+Re`njxgN@xNAk3bV! literal 0 HcmV?d00001 diff --git a/themes/dark/window/joinroom_hover.png b/themes/dark/window/joinroom_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..01bbdad01023177a7fb3c782da7e94475c83a30d GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xb_Mu^xJoZR|LxoNp5>;>lXvv4FqyMkUunv&Yu9gfFEuqN z>z7$@=Elw2{i{uu95Gj%zAquqZTV3f*?A`>t}|}i;ib6p%EL#G3z{4}ciwyd{zKC& z%S(^u?0WL4wz173tuiGeZ_Tmb>01p0B7G*TG4|SdXU28|pI!Iv-n&0*r@^OBpYPp& z5EAF@wqapRV*2GP*A%DiHD7mCdEz$b?RO6yK4u@5^ycl`jc0=9&R^`m=f3RxQwt92 zN-n?p|NnniuRuXTL2+(Tb)YZoN`m}?fr8`%hF!l4&44B?^K@|xskn9K@^P_43L>t7 zmrQKG-K&1D+xX{y{>e!?3SKiTE*RfETrS@+afyUN=Kl24Y@XXx6YLlLWV$Ai9se<+ za_f%HN-j_DzVe=a&gYizzo zb~&SH`t6emqPcokw|6g<`05w*Z^!o2H$)2(UhVMAc#$??=d_0lRAeu&`swdHZU2Md b21bVMt_Lc{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxL&?`Lr_p~`_`H*KoO>rAiv=M3{STkcma8eo-U3d z6}OTST-bS@bQ?G@#tEhfuh4Ev6yN%%m5G6ghhe%0BZKEE-A15d22WQ%mvv4FO#lKt BEaCtF literal 0 HcmV?d00001 diff --git a/themes/dark/window/maximize_inactive.png b/themes/dark/window/maximize_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..2b82aa6422a822348e471f72a7503ecabe1d5452 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn3?z9rZ$AN~BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxC#n_G~YP!%o0d3mIV0)GdMiEkp|=lc)B=-RNP8R gkYHWH*ucQdz-Yw4I63v%0-zj&r>mdKI;Vst06DQF2mk;8 literal 0 HcmV?d00001 diff --git a/themes/dark/window/minimize.png b/themes/dark/window/minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..27591362a1f60241f466ec5169d1063e8d6617ae GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn3?z9rZ$AN~BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxL&?`Lr_p~`_`H*KoO>rAiv=M3{STkc!3P@ba4!+ sxRsRP!p`ID+``E9q4UC#vIYibhULnPLVN*TAZr;sUHx3vIVCg!0G<3QaR2}S literal 0 HcmV?d00001 diff --git a/themes/dark/window/minimize_inactive.png b/themes/dark/window/minimize_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..2b82aa6422a822348e471f72a7503ecabe1d5452 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn3?z9rZ$AN~BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrH1%u?6^qxC#n_G~YP!%o0d3mIV0)GdMiEkp|=lc)B=-RNP8R gkYHWH*ucQdz-Yw4I63v%0-zj&r>mdKI;Vst06DQF2mk;8 literal 0 HcmV?d00001 diff --git a/themes/dark/window/removebuddy.png b/themes/dark/window/removebuddy.png new file mode 100644 index 0000000000000000000000000000000000000000..c9594ff0894dd4d2ab6f350849ee3268d37b471a GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XI0Jk_TyHTJnOi#w3JTWlSFApX3JTuUu{Hn-GM5DT1^@rgaQzgoBao}= z>EaktaVsey=?L=-35kzQftgWW#tRsJdG)(-{$27h-LZjznSsNHIq=(;Q++@U44$rj JF6*2UngAiIF=qe( literal 0 HcmV?d00001 diff --git a/themes/dark/window/removebuddy_hover.png b/themes/dark/window/removebuddy_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..945ee1e386b88b9926a2bdba6052a5075a7958fd GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XI0Jk_TyHTJxq1Z(3JR|OJ8K5dHy%nTep%z@v&oazH=VDNPH Kb6Mw<&;$UngEKe) literal 0 HcmV?d00001 diff --git a/themes/dark/window/signoff.png b/themes/dark/window/signoff.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8c44042e80ffd545ffa0b4bd27b2bd26338218 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^#y~8{!3-qbrBhUalw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JVt^l79*XuWKws-b^`t+%)reXcY&8JSEdGhp`i-%uOXjD#q z$)Y98_UtQd3Pku+7ppYh&ERn+B79hc0Fj+kf|}p=vDSWPXcH7etrG7lh@z z#_eVOd~lnEDEBdA=C6lmIev0@Bk1w#!?LS;b^rOjZT#-?`~SY$kM-}Eco-Vb>t3!- S{CpqiKn71&KbLh*2~7ZCU6bAb literal 0 HcmV?d00001 diff --git a/themes/dark/window/signoff_down.png b/themes/dark/window/signoff_down.png new file mode 100644 index 0000000000000000000000000000000000000000..6a36304ad69fc51ba7036716b19b7765e8f02c99 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^#y~8{!3-qbrBhUalw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JVt^l79*Q-~rH8iz;{P=P8nsr4b6^|c3Iey}#m93M9w|`1n z*3MnK=gwOY78%<&Vetfi%8-|;Hn=WM$+kf|JpmHqZWPXcD7etrG7lh@z z#_eVOdT^VCDEBdA=Ff*`Iev5aBIxn&!?LS;b^rOjZT#-?|Np+)kM-}Eco-V)>RuK& S6!`$?Kn71&KbLh*2~7asQITf= literal 0 HcmV?d00001 diff --git a/themes/dark/window/signoff_hover.png b/themes/dark/window/signoff_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..4161cc8fa790032f275d343aa0b4b3775f9c485d GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^#y~8{!3-qbrBhUalw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JVt^l79*IT#m^iP`p`Sa)Iw(hOlcb+|e@!9hifnl+6Ng3r; z^#>0hU9oyyR$j@Rd5ix4|L^J*C@3iSXx*QaAPY-^{DOgkD1bqA?aU;gF! zM}i&s4lD39J215-e*eEdc9)!)@7q;=QO~87`ecOL}m{2EH%}%1KTWPvo?lJylFV;cj#gkvHf?i8mh)JPUg4RbU}1^d_h>g zYusMe&j+_zh;kn@X8wA3mg6UfH-a9&J}kSsSNEUa+s5xM|Nrl+{aF8wiHD(qMfdWR T@5k-|9mwG6>gTe~DWM4fDW8?- literal 0 HcmV?d00001 diff --git a/themes/dark/window/sizer.png b/themes/dark/window/sizer.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1e8f4c28533cfed0ff8c8201141cadf262a257 GIT binary patch literal 913 zcmV;C18)3@P){0D=aK5EiElBE-o)GFEB7LF)=YRGBPtWGc+_bH8nLhHa0gmH#j&rIXO8x zIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?RM@UFWNl8gcN=i#h zOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBSy@?HT3TCMTU=aR zU0q#XUS3~cUtnNhVPRonVq#-sV`OAxWo2b%W@cw+XJ}|>X=!O{YHDk1Yiw+6ZEbCC zZf7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?si~=|s;aB2tE{Z7t*x!DuCA}IuduMNv9YnTva++Y zv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@zP`V|zreu2!NI}8!otJD!^FhI z#l^+O#>U6T$H>UY$;rve%F4^j%goHo&CSiu&d$%z&(P4&(b3V;($dq@)6~?|)z#J3 z*4Ee8*Vx$D+1c6J+S=RO+uYpT-QC^Z-rnEe-{9cj;o;%p;^O1ulq(=H}<; z=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku z`T6CrLy>RCwBAV1fWaMg~e*j4&1>OpFmG n%ZMb4p;r(J7#SF003g5skMaU8oC#5QQ<|d}62BjvZR2H60wE-$p3GfMVegFRB+qWNn{`__M^5w5z zzy167@AvQDpFVwg_3G`nZ{J_Oe50hKeDCxZK}JRlZCU)>4%cYg{=+_Yagb6dvdzr(1|+re}B0Q7y@50 V*_drl>ILd&@O1TaS?83{1ORG@W_bVr literal 0 HcmV?d00001 diff --git a/themes/dark/window/smallx_hover.png b/themes/dark/window/smallx_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8a00fedbf076e7219b86338dc4d7727e037b31 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfSkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$p4DbnYt*oqBwQ9}h&!5koyO5h( zIC0{XkdVk*w{CCSw!_22S4m0v(AftiK*ii8L4Lvi;ef%*pYan=*u>MtF{I*_$!SkM z1_KTzhg~Zk{Fjf(j`9=c@F*3kYILZK>EOx!5o22^QMqxod~3Zu6Ay#u7AB@S4LeGK P`WZZ3{an^LB{Ts5uFfbxoSCwBGNEVwSLJ*RPIQuBMB^0@tqC zzhb@8YyT@sS>mQ0R<6E_9!>nZcm3WK$8`@dyiMTx^*&8$JhVq2=vB@7#I$^wkQRC-@j^o?ODz?=aP*b{xM2jp>vYNB7Gi-Zm)0=3e8#68OxI_?{ZQ9 a0K@yw9CuCozsdm3VeoYIb6Mw<&;$Sh)jvxB literal 0 HcmV?d00001 diff --git a/themes/dark/window/top_mid_inactive.png b/themes/dark/window/top_mid_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..cdcb0152631b2f4eff826a7837cdff33f40b68eb GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^oIotj!3-qdO`duZNJ*BsMwA5Sri(^Q|t(Iffd<+U4E(b&ZJp9X_^RM32_w_6%`T^($Up5FfdeC*U-|^mRC@+w6v6zl+@MJ z6B85D*4B}gmDSMD)YI43(A1QZlT%ewla`j&H!zTpkPs9U6c!eCa`P_xzxFlIOn*-o z$B>F!I_Hk_9&z9~;9!}4-*VM|Ki>vxeLKmO`})HzT^5@^7TVf9%jN1KvB0@2d_%Nf z349g)dVTW7E-TmGMR|dnS2SsT4^e%k`AIl|!R$Eq++#s6qku*;c)I$ztaD0e0sv8! BOr!t+ literal 0 HcmV?d00001 diff --git a/themes/dark/window/top_right_inactive.png b/themes/dark/window/top_right_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..707524a19ee20c9b44c3b120eab2d8eb6c8d6168 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^oIotj!3-qdO`duZNJ*BsMwA5SrhVq2={y=IVAu9 literal 0 HcmV?d00001 diff --git a/themes/dark/window/underline_off.png b/themes/dark/window/underline_off.png new file mode 100644 index 0000000000000000000000000000000000000000..830b2a4f5f75937103a157508ce23bb0249f87ec GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xv;urWTr;xs_w7G;=6JY5_^DsCk`ILa-dG3D7o z<_gJ*4@|E-H*aR(6f29l)T6-1{P@GJ`vuDEDbLST< zS~_L=?A2>GxOxQ&3JSjd$)*m}#a9yK7yKU?Ft{GLa{?&i=jq}YQgJKk!BK7rjVaF# zGFM1ed|-Ozxp^}Kr&w9cr5*)7=Eol?k-V9fvk literal 0 HcmV?d00001 diff --git a/themes/dark/window/underline_on_hover.png b/themes/dark/window/underline_on_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..df47b64303e8f5fb163b4d77c814c50714399f99 GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^azHG}!3-n?U*~CnI3=zTCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xv;urWT#L%84;?;w^w^1j(3qHnv?ouVY}>J`vuDEDbLST< zS~_L=?A2>GxOxQ&3JSjd$)*m}#a9yK7yKU?Ft{GLa{?&i=jq}YQgJKk!BK7rjVaF# zGFM1ed|-Ozxp^}Kr&w9cr5*)7=Eol N>ke>9-mJx74FEO$5qkgt literal 0 HcmV?d00001 diff --git a/themes/default/alert/bottom-middle.gif b/themes/default/alert/bottom-middle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4ce3be02ce72c51d28af307b19cea24abdf4b52 GIT binary patch literal 50 zcmZ?wbhEHbWMp7x_{hkxbLYEH<;s<-KydBKtvfev-@SSF z?%n(M?>~6(;Much@87@w@ZrO+U%&qR`SbVh-~a#rpE+{|?6V<2DE?$&WMFV-Q2Zz4 zT$GwvlA5C6RH;yupOjh@;?JN1@&PEO7})UJ_O4~$y~}`uSy%ex zNdeA%F3y~Sr%tMIFe=O3yd}!Bk4N;@EoDYVb-Cxy#f8qf2usMzeUMjwqNSp$x>C&b z&+orKR)tI`p13H%k@t^L!-)g_%?F$GP8`f|+{nr;tmHH!qcJeqwab8oWyQxuOHNMK z@V_R|ncQ}IxzYeRXwHf_d?88c_joHc9K?Af#D%$YNH?%a9v=FOi! zf5CzU3l}b2ym;}FB}h$T;XU?2Cdlrb!o;!c`+_`fXE?l^H@#3XRmo8tveC5iOt3Yt=%C&3Pu3x`? zget0>gk(g)x{fSGQ&iK6&Q*lGfkp+ zc>{Eo>#!89UbDK8RZo9Y5HGW*lJZWr;U)R&Hq|i2M%vsl+evp ztfR4~fRVY)QZnH{hhQ@M9yueUa~BMjFLv)&$h&c%(V1h9l4a1dhQdek2by#;KD@Yi zm|dvCyN-cTNTp-KeCH-1#h@iC1eM*F9a!DO;yG!#*A$(|LrbzItNCrR>pa9dPh2Z> zRfJ?UYxhl^jLkU@4{h_7tZ>cP*TSjnc4mfQ%BM-1!N+=L8aG^A(zx91>@3q9fz64R tm-Ws*o_Eiq&DpYnp<;${_Pv~$eb3J?aPF4#-L>WA0000nIXp%^K}JnbSy@?GUt(ljU}SZpP!d%| ztE;Q5tgNlAt*)-FudlDMv9YzawYa#rxw*N#yu7`=y}rJ_!NI}8!otPH#m2_Q%gf8m z%*@Ts&Cbrw(9zG-)zjA3)z;S5*VotD+}PXQ+27ya;Nall;o;}!=kM?D@bK{c{r&&{ z|IEzHA^8LW002J#A^s9Wa%Ew3Wn>^ic_4CcVr6nvPXH_c0000N02crN2H!x0EkrCD zk476ph-@O2iJEgtR32iRtai)Y$_fV;CW9H5&*(I)Kv+@U@VGqA8W1> z_us#N|Ns9#bLI>K7%2W^VPs(7WzYffKxQzoL~QWn%$hqb)9v6r->;4LR&=TbFI#=H z@4a~b=b5*X1vuX8@vOa@;1I#d+2ZsvLPNr9|B}R4oC0$%H@hpC%J6ZVXW({IVPJH+ XHYb3A#jhaxp z_us#N|Ns9#bLI>K7%2W^VPs(7WzYffKxQzogbH}v%u1c%JKH#SE_;Kb*)+9=S*x$D z((XB>D$C>~aHV;|{T9dk=b8dd_LCPT$Y}9;FL}w(%U8y5q)|#VLx@9ni@^mAp#(ie UhJYQHy&JtYT6D8Fa4=W{05-QwkpKVy literal 0 HcmV?d00001 diff --git a/themes/default/alert/top-middle.gif b/themes/default/alert/top-middle.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cab17d53de3e1df534c9d2e93b8c7eee08b8dee GIT binary patch literal 97 zcmZ?wbhEHbWMq(J_{_twbLY-4U%q_(`t{qlZ{NRv|MBC;&!0bk{rdI$_wPS{{`~#> y_us#N|Ns9#bLI>K7%2W^VPs(7WzYffKxQzo@Cj`2)aFi_kaWhebCZrBgEastW-&eh literal 0 HcmV?d00001 diff --git a/themes/default/away.png b/themes/default/away.png new file mode 100644 index 0000000000000000000000000000000000000000..105a44a00e7132290741e65280c585bbeb332bde GIT binary patch literal 1077 zcmaKr^=}(?5XHY)23e=7n>MXerFM0gnc0cs*g?l(W=oV0zykmrm;pG{0e}||z(=bn?H)J) z!~i9wAa-$jkQ0gt!N9YE%qH>TxsIIaj{JB_j%J*|V5~$>1gr)pGCSPb?#H>Bg9^1m z#F?{IdT^vV@P%0;Mq@-X1I>m)dFMu2_lwYDkpkO!sO5CzR4lYQ9XFRKww@*R_VxyW zKuAeR$;ima$;l}wC@3i@si>%^si|pbXlQ9^>FDU_>FF657#JBDnV6WEnVDHwSXfzE z+1S|F+1WWbI5;^uxwyEvxw(0GczAhv`S|$w`S}F|1Ox>Ig@lBJg@vI|sECM&sHi9m z1``t#gTvwC;^GJd0*ORQNJvOZN=ivdNlQ!1$jHdb%A!yxIXO8r8Z9p`ub`lysHmu< zq@=8@tfHc#s;a7{rlzj0uA!l!si~=@rKPQ{t)ru(tE;Q0r>C#4Z(v|xXlQ6;WMph? zY+_*C zP;hW?NJvO%XlPhiSa^7NL_|bnWMouSRCIK7OiWB{Y;0UyTzq^y9*<8*NJvafOiD^h zPEJlqNl8sjO-oBlPfyRt$jHph%*x8j&d$!s$;r*l&CAQn&(AL?C@3r}EGjB0E-o%9 zDJd;2Eh{T4FE6jCsHm*0tg5Q2uCA`Bsj024t*fi6udi=tXlQI~Y-(z1ZfFMq5?d$97@9!TN7#JKJ92y!L9v&VU85tcN9UB`P zA0MBXn3$ZLoSK@No}QkWnVFrPotvARpPye?SXf+KTv}RMUS3{VSy^3OU0YjQUtizY z*x20M+}hgO-rnBX+1cIQ-P_yS-`_ttI5<2!JUTi$K0ZD^?xVXH$ zyt=x&zP`S>xw*Z)y}P@+zrTNYczAq#e0q9%etv#=d3k+(B^;;D6z-DnHxPTYj6A{q zZ-KOqaR_1A772qYI4>rT*8NS)LIRVkUQCWA`sMiHt;`-07Q}EDSB8aXjIVs%;P%-T zR&u&po`HX{Kq)GIrvGU{8}kv1oqyB#m*|I}%acJ;zpJCszx1ALPRKr6rk4KUrOv{} qrX1&Avczs_{^jQoUDZw!aQ^}1y?i2ao1`ltqywaw46IZ{$LBvKq$*AT literal 0 HcmV?d00001 diff --git a/themes/default/blocked.png b/themes/default/blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..6b69348efaf096f7e89dfcb58403789ebc6f87d5 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl9c^W(?Gg$pk&Ui|<6f2kYI zi-0aPDhcun269OQ47>p|-UD^_db&7K-z|ik2TJ!35Ed|D)vlX z&UD%EqFi*`%~mEm=CuhfQ&gDPvZsmkPkhI!boZ#sM^>vlySAs>6s|sfek%92YZJ}~ l%vP)_%&!eT@k13JXD|6&`Z&`c)%=Tr)=Kucv`SbJBhACy=&)L6z@$|$!Di3zTd{Xd-LjzlS|%Qntgt{ z!rP0Jw|4};zA*3ETHXtr`tIMq|7=g_yXz}RfPf9+$diZjKz|+04JG;Yg9$0c} zveI)PSSN62YtFyFzkhxEe0WaLr`_VOHw*m$f-fKb{P=i&UBkWw)u*Q@{CZrxqbKsk zix)qhH7>7o{&*$#(=L&}FUp_H)BFzx45NVVA)xq^g^_`wnL!6+Gbm3maQtFm=ali- zu;5@bhp?83Mn_ApZ0@!#8HWz`E@*Cgr6T#5ok^Y}ag{)3!Ndg%guL?@7$z)u>ZN7j zAv8ttDKi5*Q_-^$hJ<4+94w}DPBO1p5x6*IQH8<@1gZ zCyx0aHzt2nlJjyvxuD!ib^Xq=Oo72@_ zEK_*DPV?>KTh`Xy@1NcMc0|iM`}FryX6x$w{(Y+b_xJDm`hfqhH2yp-+0Yd7WHs-q za@U8e6#xDE`((Sl z|6gezUDEn-r|97Y4d0*Cf4-6Tb_?(Ar79cCl^$$#|8~FX+r#SbXKk*`68n6^`NXo8 z|1agvO%eb4WWl`+k++w~KiO>c^-kf>2O6*LUEVb@>;FrI)g=aB?pJ+%|MLI;KTp>y z{kY(CWwGzK53e6>@jkqu{{IWnf6tijtPTEkJNnclMWB*vD+Z^fngzo4oDu9Cm1;XGdOeds6IZ?<@}q#!0Ro##ca^ufuD{(|=o1u7eKNC;Q6-OPA>AXv$t z@7^m(#R86Y7ET$*2?Y-hNOB5TsXJ_RRG4c%H)wU-TB*sbjXoTOv(`2od~$r!pc+^(kx@kK&qaqaK2{b6YXGt# B#W(-} literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/angry.gif b/themes/default/emoticons/angry.gif new file mode 100644 index 0000000000000000000000000000000000000000..905e139d708cbb211792d584ae46695197c5ca66 GIT binary patch literal 1086 zcmZ?wbhEHb6lM@+_&$N*@0{v?3!6$zWETrF{77>+I84HF(yFGdLiMe-AYHuf;_COmTU2`P#0m;wMp_>os-u$#Z-(6+PP8^Jd-ZXZ_tbH*CEV z75w$p>nDkU-{;hQIeYq>hx&(m4_{l#eY$z;|KGnC)kV*#iGA%UxSkO6G{=_&?MYco6FL#K-c_l#-2#O7HY|zqzS@?#TN#y?Tq1;zKiq zCx*gbrdIBiXaE22-_M5+?rZSh4f8#vqjhe6%Jkwmk{~8DQS0J*=j?xFHKN<^t zv6B7|1`MNsdLf|rlZBCiVFH5=$VgD0VBq-ApvWoXv0=f%W)A+Qi<6Z(*z?C>%ky(H`1`r+yhKzdFfeij&ATGRR#wYu&4p)Bpbd-Bl*IuFh|LeZbqtx86Uy`}=3XHxOXN2+g{&{rJiMUc*R$G3TYWb)h5q{d;>*+1Z@2LNyy&uf zQufae55B&<{BVWHy$z8^m$ZI6tp52%-m_ypR~GyJ|Mzd-jFMXmrEbg@`}+RX;bQMA zv&6R5s(kzK`oeVSb5q2>+^gx>#oJ3&HkK>xnwWLx_~ws0MW1Zvqhy*Vk_z+3@9F)zh_d@3!(j-0XXIiP(dU?oU?p{<@9*=He{Y&T?iBj_s`|-1&HrG)Fbe1x0*XIb7#SE^8FWB)g7O3d z$A1QHP8p943l27O@L#)d=s8a>ukoV{2ak@U-CW5HUuG(+_=p*{a0z8iWOQzrtifzk z*rfF2fNuUwL_%%Z38MjH9Oo z7@61<4`?wohBGoxs1Uf3;>E*VrN$GnyNpRjG|O&=zzw%9Cf4Rpd|HdkFT`r3u!J!d zJ~*J@#KR`(w&n+eECg#3lh$%TM(G9v!vuwc8JCtZ#yk{sR8W+* zV>&s{*ZM*)J1^Tei=yQYjgEXWJfC6@9F^l_;S}}Uq|Dm*{QT<&4x5iH^;6Sc@uy?b d^25?x{3;QA`Y(?0_Xs#DNOVq^o#4P=4FEIec$@$L literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/confused.gif b/themes/default/emoticons/confused.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a4e14bbbb76d08d4dbc5b848d7583fbe73f5ef5 GIT binary patch literal 1068 zcmZ?wbhEHb6lM@+_};?s??dN@9sKXN@%(*NeV|wdXEk8%#ws{Vam@@lP0c>8nf z?9*QlDBQmN{{6GNzwf7fKWp>lLj1ZqzY>4Ne}DhJeSB+ueZbSTavz@GyS5_Y)+V|LRi)-%-@p8M(dFx%!rM#ak1lC_u#A7-jFQzQ2G5T5tSoo^d?WA8 zmDOM0zk0IWtJp{G+!XOgTYdli`}gHu)&GD0etdlK`(D!5mzVFX4c=C(^5cTjhaF;9 z<|ur*Uv+Ad;=?We8_Si-LJU@y8ou5l|8RxK_cym*-Mjq#?cIyh#Xh~b`Ta?KNs#uv z4UrEvx=DodC<>OA#!wc$9ENl7s z;lY)~zTZB)-qIQW{ha-`!|D%q{sx z#T0#pzd7Ub^3wS%8)Cm- zRA@YOz)U}giT-_6{b2|HpGP^X zW_sRTDqmM@`S$UxSqa+Tj%a;7pz!^a+4}l`Q|JD_e|C3mp1P7e|M#;tb%kc@>ikmD z>Tl1K|M&NAb)mJXsp-@8N{_bs9$nJ9Yhu>NouV6>Lf>xT{eC;?;THdQk8ge0A@=)z za&MXHuV=N7xA}g5eSOXZpNE@$Z!MHsU20kwDf9aE>-$Uj-AuW^KdHYkUE0Jza!Y6Y zz8NJypVT~DA+oyE@a__^uXhT6eSYENB6oX<{LLd9?yL=dvMccazrXW)?O)xyoSdBe z<>_eyZ82tM#()3*ZfFYm`u^p!V?F=>{aaP;`sIGrwpx|zt77l2^}V(t;`=%K!wVW# zml!-*&HL?P^@(LI@3!&=xGS8Rr10%$A-+OaqwYN3*;RW>%mhnGbE4QUuu{_rG+YybQ z7hS%;x%KUS)!Mad=gpgUZ$sqAYw_Pcy#8=G=hy9+-IKBnbi^L6QvCGd=Iga8E6ZKi zmua#vGvAmmwy|94>F%Hx>*T+^zOJJxwyMj{gj%oH8C8794Em;P)$Ze%>`pCrCxnaYm-^0_B!f4>X$DgrD8ZgXTX|C%FYE+EqJD z5!k^T*vKTP;BjC9YcmUn;6JVfN(C$vy(cJp_w}SV9Z*Wraurf&U}WZ#(drcQP3t~j z(G#M<_2EGyD>o0{2|I^FUCfO$E1s+nQ3zfp#mFKdk>}9X#>dPa$aKisp@5Nd(eEFD zjS0&{jPK2mI55{*!aZin4mp__nq3Rs({oC8Dy#RmaXsdqHB*`C)FRF@83lC-0S0RT Dl7NFO literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/cry.gif b/themes/default/emoticons/cry.gif new file mode 100644 index 0000000000000000000000000000000000000000..e7f76dae7e63efe0a4ff0f8ae8e0c381fd39abf6 GIT binary patch literal 1094 zcmZ?wbhEHb6lM@+_&%B8&!e1wA38tm;Q#xo`tS3SC-XEv?~(YjSNiLIx&PM#k5+5E z-^NpIto-)ztuHqke{a`bUmvip&hOvfzYPEXzkhc3%3|N$lk?V>X+GTI|8RxKmd^Ow zOXQ!d7Cbv$_WG*W4_9(lml_^k(D409{kyHaTdEa*e0*VW`tICgO(&MMe7RTk|A6k- zmzN!{|G&G|cXf%u#pz<(YE^zctNs4=?!SNkKK}WCXKnDe!|G3V1-`km`srG^KTk{E z|M`D-LA}nE|H|{9+?X%+YM0E7dBU&mU4F39{rl_drzR3XG)J4GL^Qhc(S_u*#WC)>S#{ri9M+y5UIoPOU+ z`h7p;+lSZR-`x6n(M4>@m(Mry9&hvg|Ge_gvyw+!eZSnVdb&I4=8+8_p5J@0Bmd`< zng`4H|9_k?BhlpFo2CQh+8=icF#v-e3>ZcM#UY^hlZBCiVKRdb$RtpnVBq-Apw21d zv0=f%W)A*C6B`dZw`#`Uka5)Dk`6d1dkRZAW|=q!Ek2j-#F10{kaL1?uZy$PU5{2V zO9Ls6DOZ*@s|ZJ?af|1vHMKO>sBHXk*s9(=lvy%8X4H>t(dbTJjp0Y8y5$3U5PWDNZ=hv67 zj~eN$HnrKESN7`iwL4M4tIX`*>he6%@wS#4*G zyQnUD!O`@5dggjfo!6FfA5BG9x%xfMiP|bGx+|;rdSlbOTX%M67rk%IIb~_|t|{xm z+{C&CS`c%irS;C{?RWe7{{8xO#X$b?qD3eC0za6Fe)CX2(b9cAA?9#H z`-gMqK6mCHP*wVNDE(6|rx9)4=c z+^DGZxx3)7zSe_Kw=)jrPfg|C96a=ER?Xw3%RaYee!YMHwzDdO2wy}x9$VY42k{JS#TxLXG?tgN>~3&`Gr5`)NK(I z{Yw;jnGoeEO%98-4{J(?^gR>(o9%Pp8KOv!Fs=~31U6iRq zG`i72QN%z*Bt_)Kh1uL3Y$v96KR7hsPD@Kv=5fn8CT@dR?90`uc#?$3JgRcm6(A_}|~Z@1NcMeLv-U1MlaZ;=ew>xVuE`R*~qB zk1wvRi1_ogWOa$b_b2twCrUk8&3kx3!<(HR-yT*!-sb!HM&8>kykFnH+)}Ohba&9p z&Cb7`)qZ_>`R9I{FZZj~muY@qD*x?}=GQxgKWh2DcJY2)B>Zuk;QgiiukKy`^y23C zw|9>&X#w_HA1vel|L^aO`C_kg1-`$z^`nUE;&ie5 z)8$u{yZ-<8@6lG@caLv<+99%gQufA%;D7)AeSdxZK&jU5$$9r0#6NEnJ2yrA=8+BG z&)MHvDD~#b>L;5le|~uI^GVJ3KH(?Zy&i7%-BqFZp-kZ0Zj~<+`M)d{{PV2j<#g%q zoqP{Ax_?_J`emoom04oXj`gfAHN7y;?Az<>t4htkPZRxq%Iw`%-aE%PpIFwiv0UlP z)6?J2+T2+ie0V|q-L<~IZbknr;{JUv>Cz<0mF2D2_R3=4fB*jOn^E$8 zf%wA}B45`@e48ZjsY&?j`&YXrWZqBmSx0tomC! zHZ(POPF7Z$ps|tti33mafq+?_lhwG@J=o$Vr6@J1dNVft{moA1J8zTsuU%OGZN zj#+lD4GO&yvP>UO2wn+kT*?x=Uv0$$)qV$U?=vDhSPllYF3V-y*|E^A%Rxcm70=3` z1AOy!S-DPp*r;(vS&d0qcA?_Jiw(yo+}$!!V8t2c#we4Bf)>|?=jX+9)_4}Vwm5hg zoLeyS$S%`t4g0JKkqRFsEpjwxc%gTop)v1njEs+jMvGsY*NMsM=~tSW4to1P+GClx tpz5o&o6VDgmBOwfwvh!bq6&*tTA8`-aQkr{IxMh|y-tirT|$7t8UR`9o#+4n literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/emoticons.html b/themes/default/emoticons/emoticons.html new file mode 100644 index 0000000..d3a756e --- /dev/null +++ b/themes/default/emoticons/emoticons.html @@ -0,0 +1,25 @@ +
      + + + + + + + + + + + + + + + + + + + + + + +
      +
      \ No newline at end of file diff --git a/themes/default/emoticons/emoticons.js b/themes/default/emoticons/emoticons.js new file mode 100644 index 0000000..ec26604 --- /dev/null +++ b/themes/default/emoticons/emoticons.js @@ -0,0 +1 @@ +{":)": "smile.gif", ":-)": "smile.gif", ":D": "grin.gif", ":-D": "grin.gif", ";)": "wink.gif", ";-)": "wink.gif", ":[": "embarassed.gif", ":-[": "embarassed.gif", ":*": "love.gif", ":-*": "love.gif", ":(": "sad.gif", ":-(": "sad.gif", ":'(": "cry.gif", ":'-(": "cry.gif", "8-)": "cool.gif", ":angry:": "angry.gif", ":O": "surprised.gif", ":-O": "surprised.gif", ":|": "serious.gif", ":-|": "serious.gif", ":-S": "sick.gif", ":P": "tongue.gif", ":-P": "tongue.gif", ":heart:": "heart.gif", ":brokenheart:": "heartbroken.gif"} \ No newline at end of file diff --git a/themes/default/emoticons/grin.gif b/themes/default/emoticons/grin.gif new file mode 100644 index 0000000000000000000000000000000000000000..f4d63135da733afc3708375c96cd322f6cc74836 GIT binary patch literal 1072 zcmZ?wbhEHb6lM@+_&$~4--ph>&r2>$b^iOR`eK*XlX;r|-ZZVR4>&)`=E5}R^HUuE z{rh`!ru5s#w=Pf8Jkg}FuFmiNLa{Sv&b)ti_sT@se}DhJd-v{AzslXacQ5oR{rLFe z-=A;0C+B^+Uv+&|?Bi{|54ZR~S}J{QMZ}ZsUN?_y`1P#z@6Y#to|U}0vij(f){W&# z4_7H3UeNG*6W_L4m1jq%{QU6X+lSYuIxWAxfA!~S$xDxBmV4 zes`_!!zD5&mbLr`+Wqsx^AoeaJ*p{!^0_SC<&P-XeeJ_~x&73b%B|AFkF| zS?>Dv{mT!RbG}>%TvhIRZi@KoQp44yrvLu^`*Jb(*XI`(r;B~NU-jkb=?zUGhZoeZ zDmA~oME=Hnv7b+B9&PnK-lThBp4o-z(if+?eSLQP?)vQSZ|^=k*7J0&+=u7)UfsKV zd#TFX3)8>9xpi|{)Q20ZUTx(2a3$ySjl2y_p?B5>KiHA~biLB=Pj{ZI=Doj6F>Cjv>??B=zCAzn{q>cT9X7WXN_~HQ{nLw^ zR~Gwzdwu=ykGEg$Ro&YV`TyU)?@#L2muY^z9Qhv%7)AjFA)xq^g^___DuWKl3{ak6 z;P}s=%_-xtVZp&>4t^)2=0k^-1k)vcI(Tp%QGmf8Wonx1mzv*ba3Qs<r}xv>%IH_$HsnRVtRM{#C37; zZ|?4YzJ5I;A^F7G=6_1c-yc8z2L+vXbw8k`bIQT#c6-M;d&f)S630`b50qL4GRu37#%S1_@FTP0E2PBl@|&JA1-6B(Tk{5O6zR$alF)# z(CiU3rGNIj9}gZToN4E9K6T^6p`(lo#UnqhxcMZ5SDC?KBg?PPk9h+YR7AYEv81JW z>2m+Zj6jyJnr(tXW`dc`D_4ih#O>8{a!3>IbYsz58GHKMqzR%5LOHh-o_ouhv#`9l z>V2TE%fhGY#Z421pf-s%r+|XM1qWF8rRF?oID8;+nS0YSnF~jD8mDXNZsU>Ip&;0# zHqY95<)!8Bj$Q_3KAv|E91wJ1Gymy$IW_1xb9jbK)P(BG3%uB*3e1>S9(nPIQDM%F lWJS(N#%f*sJOzuLx(wXrW%G#7;AEQX#CUAAzJvgSH2`h_cTxZV literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/heartbroken.gif b/themes/default/emoticons/heartbroken.gif new file mode 100644 index 0000000000000000000000000000000000000000..81e10eaf2940609b6cb6993bc2d07a057ab846eb GIT binary patch literal 1040 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 EJ2$WFE&u=k literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/sad.gif b/themes/default/emoticons/sad.gif new file mode 100644 index 0000000000000000000000000000000000000000..749bb9306375795db41f46c72b9140c205e67900 GIT binary patch literal 1083 zcmZ?wbhEHb6lM@+_}iqs6(0%*(ma%d1mm7_rc8R`!cK6@Ezu%5%{QLLs=~}tB zTX?^|e|c-6)ap{xn@2WWUlsdgv(@(}^+%VqK3%W0Yhu>Z-9gWe^=vFx+RzkwVp+?> z6(UczdtI1k_HeWB-L<|yE;wD8qwwj)%{yy@*QIK#DmDLbIp^J0-cyql?=BI$GE3~@ zbg_LiN?zT&yt>5T{!;#*A0BLI3i*5^@7rPZRpqX~KEHUp&G*~=swb;?e?6<+R;%*! zqRY3}*Z=?f_y6DDKhH|OeR%!l>FI9|tABia@$*T|*O!+MFQ~t^BI3!ez$=S=zuc?( z|8c_lGR^D`mEzrKI4 zhpQBKPtN=P_U`IZ!w1XwKRmy8d#TEwrzIb*=3(ieDmQ24fi%gt}J)`eLv;g6!95}CjZ_veb~W&pj`XoPNDx`z%UAE90H0z zSr{1@IvI38_JHyP1IK>`VNMy34GRu7bMTvG3bVOP(^j8h;n=}(LSD!0NXG@E<43qn zI=GZpO?t-BFj<4q!%#@|$pIz36#}z7C#MNnSF0oNySKh&)6Zrf9;~^dv=_G+08{1f!>>oHZBnT|xZ06&g)sP|Z zT%wL;+QUQ3omw0h@^{LKENqfe6=G3(Wazf-{ryeW4jBdlUcEA{leEM49qMIm>Nrqw zVdKF@MX5HKI}08!Zug!mb7Fynz!&C|vt=t3B7VdfFwYTmWYFE9)M#4{o-`73)7`< z%oqFfwB*C(obPXLtt@x_`K0F0vyw0OtL|-xTwQ8-eO2s_3r_$3{e7}4@bwn?ZM7=@ z|NZ^<@89=x_CG&7_d?BBEGuR^w+c6JI6Qw`uyU_YTl=7<-Q$Oe|D_r z)xFE#-`>5uMC|LG!cQ-5et3TG>-$%?m&m_+eCy$6-|tWA@2>Sdv8?6m`4*seH<;5O7d|5F%jvgmY3aHq&TzU8?wMAB@g-a-?k&&livIb+y zLkHC-4#p)7e`b14R+HqmV-vbn;M&mO*eu17!Ej}{w5~f#+<`;N2Nj$|*esVicw|k` z$Y+_h@Z*sKm${nvgssSGIM{8?^s~e>`AKGrBM+PFidpSP+eMka`zSg*aBO4}n&t81 zcSHUp9;WmYf=702e0(fJjf2NoX~NUfGxYO46%Edb3pO})%kg@2O=4x@TzKK(@~!eL z8)AQ7TyWr^gGB8umK(JTzQ1D#?Ql@=$T&AcI)F_hJTJAq*Ho|ck!7M&&pcz(qA39k YidBwk1x^i|KMWThWxCD6%*0>~00EbNHUIzs literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/sick.gif b/themes/default/emoticons/sick.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e6b33570939701c018b3ccbad7817a5c04b54e3 GIT binary patch literal 1091 zcmZ?wbhEHb6lM@+_`Zuc|-qk@&h_?%h`21LfKuc8b2;BJlTl$)86#A9nEH zzWx5~<6B=Y#Q(mZa;jC;I{WmxI=}bN?tVR>u)aRv-`~IQxAA;GYZKo7d`q?BlU;$| zUtfQ>Rq(+g=?9A>eq3;Rvf1j##}`j`2mSo;;POPJhgseiDdS`9$$DN{g*ZO|Gk@x-W-4n}NPByDO-0b^mgW%atmHSKiU){TW zyg~iLm7I55MQ_Ydc(UE=)Fj2LlNB~Jg)b+k77^p4?DzeEtLAOUG&o~(O=JM4=-r= zxKrraYT@T=#4b)3d$~^d!aTDZ^Tod1uljz@{>mJMPcLrXnJ2TV-1W+0-+%x9tu8hE z^Q`3Mdhwr6YQEg7`gzgi*XI{^j&I&ptMYn_{FkSvKRmzpVy*bMht(^~UC&JszrHGV z_oVFaZ*Kkn_wQ7z+U=z(S7wR5dwlD`M)$W{1lN~oUg!aONAcQpv z`WhTDjIIr-&Sh36h6xS*T+B=_RtS2u21%OaPMc7W@{&hV#V>(D@Q8zghK~iG&4&XI zeJ5%J%lSklt2wncnyzcGEO2OKGMic?6S%>%pQUMm($5B$!%eJA4>*q~>|A(csh@Ut giHg@Hr=Hn7f+{ogXDpwJ;`Rn^v4_7HZSjPYTN&W6g*{e$pH+FR1_XwB*Kou`6>FzC1nsZY%Gu ziCGUf`+m5bb9af@o#UHdZ;}7^@86euRX;8`J=o~}<$l$ND>)~YwH#j1@ayx7eKSga ze0*_xiTt-C8b2?(JYBE!?Xddp$$4+L@NQ@dU0BA2GFMFk*%+vf2 z1`MNsHX)$+lZBCip@%^SWIQNOFmU{5kmQu{*s$PWGY9{>g@R06{E|UE3{E>vxK9y{ zJvBoh*{yYfWH*;y*FtyChRGVtUm_=|J~?0#V<9ukbF$hzK6^I3ONOir46a=@|9H3* zJQm6@U7xVA$l>B5*REN1y|VpvY>~x z_kdu@B$ovX7#o?j_yjT*2s}JInTJVycfTFcT3;XV_VKNS(bmSs#S0=Wf8R^`_4&oyExeDn`ToA2ynAxq_fuxK zm&jjR5%KTezne!ktS&WORciilmEzO&N=KKp{(MrizD#plt;)U`B~RDNeLJlF^?<^u zNs4!lZ~k$?>HFKeU!I=+^y22LdzYWA=3NkFH8;d`*Tk#~)1|+^zW(jQ>tDB{ugns= zy;SAg6!C{!{GT1`Syk@(_5G{=|NefsoO5N4!qeSBPj&@vsaE{3L+szbzwfs4o>` zPEHw*4GRu7bMTuLI<}n@;j_EL;@EKDfr3SD7spJ4!+ugqCV4!oED8dq$@#OnNGzE2 zbPl&Zo8X#+wj=XqTjVn_eR1LxGWrA<(8$GJ@-~Y>N277N zJX3bgkHa%IDmeB^FRoCyaJb81hH>^e81=YR}lD1M8k}swDI0#t0Xz69xz&yi^ zi=%8RD-YWvhQ?zJ`Hpo>%tjO1{g|7Y_tjiTe8^Q`-!LiSrjWB*kwL|^4-b@-yJVEP Yr6TyuZ!A2`p_L?;(Kumtf&+s!0ATBIBme*a literal 0 HcmV?d00001 diff --git a/themes/default/emoticons/tongue.gif b/themes/default/emoticons/tongue.gif new file mode 100644 index 0000000000000000000000000000000000000000..feb2f6ce71f98e9fa69509b5f4715b0becc97db2 GIT binary patch literal 1100 zcmZ?wbhEHb6lM@+_`ZnY%UdO+dd z-@k7+D1AR`^Y7o^M_YX#Zt>q+p#SZD)vwPlZY`8Lkr#S*iP*Ij5i84Gudj-|yVm#V zdZmY}6hG{Dy}eZB=#thay8^#`c>U{H?W2CJE!B$O4y*sT;Phm>*QrU0R~GyJyy&uf za^CyRLJv3lzPfk$%l)d)H}bx|f4RO)^ZPmbZM7;}I^!=+7kj!^?%syTpHFHYZ}Z(Z zqvY^{`iCn-&P@?N)Sz@>y7ZMf3g6${+E}jiba&9Ia@Ui&R{#F}+dV1!!E({nB?b?c z3;+N3?^K!9x7XLd9nn}_YWVZRgAY5z?yL=dvYPkzy`+yjMgKf2d3LPl+r#Qz6SMxT zpY!Kw$%p6n-dtJz>BY_OZ|~liFLq&`*^|vy_m>HMy;FE)me_-h?%!Wu|MK+oiDfPS z|NUK6YX0GJ&i$qQANISv-NO5BEAO4-n;$IWKfIvf`;+?5UHM;MUcPx`!-F09U*Era z_xRTL{?ZLiq4(<@?^U}znWFvWUe%9}FMdy{I#Fi+e@5N?CBm<_$nVM1-_R8DZN-$^ zOMq;>)upBfs+2!m$$2tQ^FJ6ci~?*Sp!k!8k%3_mgAPa%lqVQC{xi68%6M#8aIl$! zzo_xCnrokM#-2Bh5?VY$618qsn!^l+?X7+K+ESc4hn$$$d3iNTBrY{NG4sl(#H>;ZIIG6M z?hwh~Fmn@Y06T+Bp@M)QA2S;t$BR!78b!UB_!|10JQgS^CUKppTe7lA(I+xxw&Ed& zgcYg*9316amR(vR5ZyBQ#D>HK9y>J=jfRlMz)tlN5fjGZ#)K8FbKfv%J~C{ctnS_T pDC6V9P3ZzU!E=5n8lT|k}OD%da;HJlPd^ZAHZOSvd9uS+e=mMtPQ@h*!RIk_kA-;UT=~AcE4(6 zx$B1=VjnK&{Jxj;_5G_y%LP}LntnT?^<=x(@eb}sTYdjLE4j0fZ+)5O_jC5Qm&iX{ zrFeZ+?BN9s_clb{T_o`J<>lM+`9I&td$>a6{!;!E%UZr2(Ri?o|Np;#rzR<0m@fV8 z!|R7z{J-8Q{P*wQu8CPsR|{_`Vt=??@ZIBEtIAz}eSYz3ljyhC*H86uU6^O~;NYyc zTX?_RtNM0W{o!Wc?{9A1m@oG1SkJavl@HJFotq+l^T>wpPwKxttbTK4_39FXjpa%g zr;FWPBKBmp$ggL$hZofU`}gegvM@3* z%wW&~X$9p829Ey>hMY1U8x|aF=HOp+vazFEP@wVM9ES?e=IQ*tEfSA{9gj2EPUnha zI_&1zI9c73$D-u1`-#TVKQRIZ2?tadEefqxeM*0zDwV{*!D^7%aKUpj!xl{@&xAH* zVCb5pUvMNXZaPsLz@!W$LQ2x%Tos%yyEKjfKG)05s;B Aw*UYD literal 0 HcmV?d00001 diff --git a/themes/default/logo.jpg b/themes/default/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9be14c5d9d2d17161f7efe7434898a44af4aa77 GIT binary patch literal 8270 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 literal 0 HcmV?d00001 diff --git a/themes/default/logo.png b/themes/default/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b40bf7911420f54c8529720a17bbe4d197adc7 GIT binary patch literal 11036 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 literal 0 HcmV?d00001 diff --git a/themes/default/modal/background.png b/themes/default/modal/background.png new file mode 100644 index 0000000000000000000000000000000000000000..a4421b959f3dab6e9700c8fb95439dadb825f7c6 GIT binary patch literal 3414 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 literal 0 HcmV?d00001 diff --git a/themes/default/noicon.gif b/themes/default/noicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..4363f7609059ce565a522942595ac330ff04ec3c GIT binary patch literal 1453 zcmZ?wbhEHbG+;1bXlGy$7IzU5brcbE5|(fklJydm@)wix6O#!MmkAY@kC&7Ul8}$) zR}1CW4Cm8|NS0PfkyOrBQVUbj zh*HsvR?~{oF^DrTj#tn~RnW>)(XZ4n$kj6|)HJTpx2!d>%r>*mGqx&XcP?XhEobm5 z;&3W)bgyyuDVNi2)i!T7vS~1NXf<){H+Sx}@|b1hve?zX+a+|ZSM=71g#NhHsWE8_ z<1?2;XKzc&oS9UxBcWh#Ro%kG(n~q@S1OzL7B-%%Za+R{)}G!Or&}gnX_<6&?xG_z z7hj&Z@cFVemlv$Qzi#{Ejl17$*$+hT_8z>k`^dY!N8cYf{_Nb9k5_NJxOVH!m0O># z-u-s%&evP_Ki_-&_5S1UkDmQ}_VVkqmp`As{`unduea}izy0v*!>3;#KmY#p`S-`q ze?EWx^X2QGA3uTU?@u85_4n7Wf4_eJ`wc{Y{{8v$@9*FLfB*ge_wPT$C>R7Gp!kyo z=!*XgIv}@z@&p6Ne}-5N8IKJM4mNWLYsH+{u<&rZfU?&dkBy6tc1sv%soZ$v)XL7M z5O82apkg;WGt-KgokmQplVp?`5^7_l7J^4QMfDO-Okg~m$~{HNKyA&Ntc{1RF_}$D z@tnN8|Nj2kdmR%WH9LEYi9~-0v3%q)!>abjo0)sq3+7u!SDEk%G$yr7<*b;n^RW9T zIoslA4_*e})K8OT3%NI?qfwPhz3Sh)&cjE&M0FSc{1bZlh(UNKZy4W&g{&K9X}edv z;aJpidhUtZHyMTpFEP1@&F25}U*fYkzqqoInaYiX#htVFSDm|~v0)OU3%3qGL!@zy zS0Af(>IP=1U3(juYi%7v7`<6J64_)YR5l*r(2;Ctmi%yXdnALd%@+n=p&1U&ye2aa z91PRyY;cjTKf6)ZH_q~igD=CCh{u7-3>#Tf>IBp8cP0r6SbYbsie3>}aec^!?iR&K=-K9bW9GxZ_nr%^-sinDq zMRLm1KsOQVfQXcKzK8DV3<@=cvGRK)4G%LV%6+}t=DJGZczlwIBU6*>E%v~o6efYg z5}8W^+eFM9ye5|mTy|EEIuwNQ<h;U7~dZbaHe&fd$_TD1VbXT9o8_wbxYc{$H7F`rM zxI^sal^5);HXmICwJx+=*($}`nZzK}BEYoO>> T<57w9H6M@3l+OupV6X-NcHGi4 literal 0 HcmV?d00001 diff --git a/themes/default/offline.png b/themes/default/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..102854f35f8b77fd196240d0ca3915344718f4df GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlEm-OBI5u5|IT~m+JJT`lmz(&1G)GBLrjeH zTcFxpPZ!6Kid%EedGa+V@HhmrupDG$-;x#juHJj{r40oyqfPBIqbAxNxzFI0&8ixb zF)cBICrsu--jO7}3o&aLxr%IVYG`)+*q~9w!Om@YqAWc(uJKoz>4(VeLhVmCp8LM{ l{i$TlvstsQ_&nA=z@R)qQc>CGq9@Q|22WQ%mvv4FO#qtfpYZ?y literal 0 HcmV?d00001 diff --git a/themes/default/online.png b/themes/default/online.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb2459949c3cd93f61424ce4eb2197b953603c9 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlP5>taYnc>{+?ot$kBi-+}P%J;8NLgK8EB*3F5ZbtbWAS6JQbxQY8?F5W&?Jj>(K zonwt#J?33Xntm#J)!wPI&&Bs03~Alz)3w)s(y@sD|NsA3qdOUBmqJO9Uoeo14=}{U zNWTTD&GmF~45_#^=bR^Bg9493APZ}uQ{$@ANB_2)X!3GT-xvCM@-oqv&VP6pEc0~a z6y>{TX`gVE@vWQAGls_p-4-Z3pL=#v(+jz4oie{Bf3-aEEX_Br@mG@Rhse!B%}+Pp o$hv#%Q-qhJZa0_7J|-RpEg?z8{nvyNffh4(y85}Sb4q9e0DzRLH~;_u literal 0 HcmV?d00001 diff --git a/themes/default/style.css b/themes/default/style.css new file mode 100644 index 0000000..a838bec --- /dev/null +++ b/themes/default/style.css @@ -0,0 +1,955 @@ +/**** GENERAL ****/ + html,body{ + width: 100%; + height: 100%; + overflow: hidden; + } + + body { + margin: 0px; + padding: 0px; + background-color: #e3eaf3; + background-image: url(logo.png); + background-position: center center; + background-repeat: no-repeat; + background-attachment: fixed; + width: 100%; + } + + div { + margin: 0px; + padding: 0px; + } + + a { color: #333; } + + input, textarea { + margin: 2px 4px 2px 4px; + border: 1px solid #dddcd8; + font-size: 12px; + } + + .rcvdMessages, input { + font-family: Tahoma, Verdana, Arial, sans-serif; + } + + .rcvdMessages { + display: block; + position: absolute; + left: 5px; + right: 10px; + margin-top: 37px; + padding-top: 2px; + padding-left: 2px; + border-width: 1px; + border-style: solid; + border-color: #bfbcb8 #e0dcd8 #e0dcd8 #bfbcb8; + background-color: #fff; + overflow: auto; + font-size: 11px; + text-align: left; + } + + .rcvdMessages a { + color: #5c78cb; + } + + .inputText { + position: absolute; + left: 5px; + right: 10px; + margin-top: 5px; + height: 50px; + border: 1px solid #bfbcb8; + padding: 3px; + font-family: Tahoma, sans-serif; + } + + .userToolbar { + position: absolute; + left: 5px; + margin-top: 3px; + height: 32px; + } + + .imToolbar { + position: absolute; + left: 5px; + right: 10px; + margin-top: 5px; + height: 16px; + } + + .toolbarButton { + cursor: pointer; + } + + img.buddyIcon { + max-width: 50px; + max-height: 50px; + _width: 50px; + _height: 50px; + position: absolute; + right: 10px; + z-index: 800; + margin-top: 40px; + } + + .toolbarSpacer img { + border-right: 2px solid #bfbcb8; + } + + .chatUserList { + position: absolute; + display: block; + width: 150px; + margin-top: 5px; + background-color: #fff; + border-width: 1px; + border-style: solid; + border-color: #bfbcb8 #e0dcd8 #e0dcd8 #bfbcb8; + text-align: left; + overflow-x: hidden; + overflow-y: auto; + } + + .errorMsg { + display: block; + width: 100%; + padding: 5px 0 10px 0; + color: #ff0000; + font-weight: bold; + text-align: center; + } + + + .userA { color: #8f3838; } + + .userB { color: #30407b; } + + .imHistory { color: #aaa; } + + .imError { + color: #ff0000; + font-weight: 700; + } + + ul.sortable li { position: relative; } + + ul.box { + list-style-type: none; + padding: 0px; + margin: 0px; + width: 100%; + cursor: default; + } + + ul.box li { + color: #333; + vertical-align: middle; + font-family: Tahoma, Arial, sans-serif; + font-size: 12px; + padding: 5px 3px 1px 3px; + margin: 0; + } + + ul.group { + margin-left: 0px; + padding-left: 0px; + } + + ul.group li { + padding: 0; + margin: 0; + } + + div#blContainer { + display: block; + position: absolute; + left: 5px; + right: 8px; + margin-top: 66px; + background-color: #fff; + border-width: 1px; + border-style: solid; + border-color: #bfbcb8 #e0dcd8 #e0dcd8 #bfbcb8; + text-align: left; + overflow-x: hidden; + overflow-y: auto; + } + + div#blTopToolbar { + display: block; + position: absolute; + left: 5px; + right: 8px; + height: 56px; + margin-top: 5px; + text-align: left; + overflow: hidden; + } + + div#blBottomToolbar { + display: block; + position: absolute; + left: 5px; + right: 8px; + height: 41px; + margin-top: 5px; + text-align: right; + overflow: hidden; + } + + div#statusSettings { + display: block; + margin-top: 2px; + } + + a.setFontLink { + position: absolute; + left: 105px; + display: block; + -moz-outline-style: none; + text-decoration: none; + width: 85px; + height: 14px; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + vertical-align: middle; + background-color: #ebe6e1; + padding: 2px; + background-image: url(window/arrow.png); + background-position: center right; + background-repeat: no-repeat; + border: 1px solid #bfbcb8; + overflow: hidden; + } + + a.insertEmoticonLink { + position: absolute; + left: 284px; + display: block; + -moz-outline-style: none; + text-decoration: none; + width: 24px; + height: 14px; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + vertical-align: middle; + background-color: #ebe6e1; + padding: 2px; + background-image: url(window/arrow.png); + background-position: center right; + background-repeat: no-repeat; + border: 1px solid #bfbcb8; + overflow: hidden; + } + + a.setFontSizeLink { + position: absolute; + left: 205px; + display: block; + -moz-outline-style: none; + text-decoration: none; + width: 24px; + height: 14px; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + vertical-align: middle; + background-color: #ebe6e1; + padding: 2px; + background-image: url(window/arrow.png); + background-position: center right; + background-repeat: no-repeat; + border: 1px solid #bfbcb8; + overflow: hidden; + } + + a.setFontColorLink { + position: absolute; + left: 244px; + display: block; + -moz-outline-style: none; + text-decoration: none; + width: 24px; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + vertical-align: middle; + background-color: #ebe6e1; + padding: 2px; + background-image: url(window/arrow.png); + background-position: center right; + background-repeat: no-repeat; + border: 1px solid #bfbcb8; + overflow: hidden; + } + + a#curStatus { + display: block; + -moz-outline-style: none; + text-decoration: none; + width: 165px; + height: 14px; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + background-color: #ebe6e1; + padding: 2px; + background-image: url(window/arrow.png); + background-position: center right; + background-repeat: no-repeat; + border: 1px solid #ebe6e1; + overflow: hidden; + } + + a#curStatus:hover { + border: 1px solid #bfbcb8; + } + + div.itemList { + display: none; + position: absolute; + border: 1px solid #bfbcb8; + background-color: #ebe6e1; + z-index: 1000; + } + + div.itemList a { + padding: 1px 3px 1px 3px; + display: block; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + background-color: #ebe6e1; + text-decoration: none; + } + + div.itemList a:hover { + background-color: #e1ebf7; + } + + div#statusList { + width: 165px; + } + + div#fontSizeList { + width: 28px; + } + + div#fontSizeList a { + width: 22px; + } + + div#fontsList { + width: 89px; + overflow: hidden; + } + + div#fontsList a { + width: 120px; + } + + input#customStatus { + position: absolute; + padding: 1px; + border: 1px solid #000; + margin: 0px; + font-size: 11px; + width: 114px; + } + + div#divContext { + width: 96px; + } + + div#divContext a { + padding: 3px 0 3px 4px; + } + + .listSelected, .listHover { + color: #000; + } + + .listNotSelected { + background-color: #fff; + color: #333; + } + + .listSelected { + background-color: #d0dae6; + } + + .listHover { + background-color: #e1ebf7; + } + + div#newroom_room_list { + display: block; + overflow: auto; + width: 187px; + height: 165px; + border: 1px solid #000; + background-color: #fff; + cursor: default; + font-size: 11px; + } + + div#languageList { + position: absolute; + display: block; + font-family: Tahoma, Arial, sans-serif; + font-size: 11px; + color: #333; + width: 500px; + margin-left: -250px; + left: 50%; + bottom: 10px; + text-align: center; + } + + .buddyicon { + list-style-type: none; + height: 30px; + clear: both; + } + .buddyicon img.blIcon { + float: right; + max-height: 25px; + max-width: 25px; + margin-top: 2.5px; + _height: 25px; + _width: 25px; + } + + #changesettings_buttons .stdButton { + padding-left: 4px; + padding-right: 4px; + display: block; + clear: both; + margin: 3px auto 0px auto; + background: transparent; + width: 135px; + } + + #changesettings_buttons .btnHover { + background: transparent; + text-decoration: underline; + } + + #changesettings_buttons .btnDown { + background: transparent; + } + + .userProfile { + padding: 10px; + } + + .updateProfile { + position: absolute; + bottom: 10px; + right: 10px; + } +/**** END GENERAL ****/ + + +/**** WINDOWS ****/ + .overlay_dialog { + background-color: #666666; + filter:alpha(opacity=60); + -moz-opacity: 0.6; + opacity: 0.6; + } + + .overlay___invisible__ { + background-color: #666666; + filter:alpha(opacity=0); + -moz-opacity: 0; + opacity: 0; + } + + .dialog_nw { + width: 9px; + height: 23px; + background: transparent url(window/top_left.gif) no-repeat 0 0; + } + + .dialog_n { + background: transparent url(window/top_mid.gif) repeat-x 0 0; + height: 23px; + } + + .dialog_ne { + width: 9px; + height: 23px; + background: transparent url(window/top_right.gif) no-repeat 0 0; + } + + .dialog_nw_inactive { + width: 9px; + height: 23px; + background: transparent url(window/top_left_inactive.gif) no-repeat 0 0; + } + + .dialog_n_inactive { + background: transparent url(window/top_mid_inactive.gif) repeat-x 0 0; + height: 23px; + } + + .dialog_ne_inactive { + width: 9px; + height: 23px; + background: transparent url(window/top_right_inactive.gif) no-repeat 0 0; + } + + .dialog_e { + width: 2px; + background: transparent url(window/center_right.gif) repeat-y 0 0; + } + + .dialog_w { + width: 2px; + background: transparent url(window/center_left.gif) repeat-y 0 0; + } + + .dialog_sw { + width: 9px; + height: 19px; + background: transparent url(window/bottom_left.gif) no-repeat 0 0; + } + + .dialog_s { + background: transparent url(window/bottom_mid.gif) repeat-x 0 0; + height: 19px; + } + + .dialog_se { + width: 9px; + height: 19px; + background: transparent url(window/bottom_right.gif) no-repeat 0 0; + } + + .dialog_sizer { + width: 9px; + height: 19px; + background: transparent url(window/sizer.gif) no-repeat 0 0; + cursor:se-resize; + } + + .dialog_close { + width: 17px; + height: 17px; + background: transparent url(window/close.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:8px; + cursor:pointer; + z-index:2000; + } + + .dialog_minimize { + width: 17px; + height: 17px; + background: transparent url(window/minimize.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:49px; + cursor:pointer; + z-index:2000; + } + + .dialog_detach { + width: 17px; + height: 17px; + background: transparent url(window/detach.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:70px; + cursor:pointer; + z-index:2000; + } + + .dialog_maximize { + width: 17px; + height: 17px; + background: transparent url(window/maximize.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:28px; + cursor:pointer; + z-index:2000; + } + + .dialog_close_inactive { + width: 17px; + height: 17px; + background: transparent url(window/close_inactive.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:8px; + cursor:pointer; + z-index:2000; + } + + .dialog_minimize_inactive { + width: 17px; + height: 17px; + background: transparent url(window/minimize_inactive.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:49px; + cursor:pointer; + z-index:2000; + } + + .dialog_detach_inactive { + width: 17px; + height: 17px; + background: transparent url(window/detach_inactive.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:70px; + cursor:pointer; + z-index:2000; + } + + .dialog_maximize_inactive { + width: 17px; + height: 17px; + background: transparent url(window/maximize_inactive.gif) no-repeat 0 0; + position:absolute; + top:3px; + right:28px; + cursor:pointer; + z-index:2000; + } + + .dialog_title { + float:left; + height:14px; + font-size:12px; + text-align:center; + width:100%; + font-family: Tahoma, Arial, sans-serif; + font-weight: bold; + font-size: 11px; + color:#ebe6e1; + } + + .dialog_content { + overflow:hidden; + color: #000; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + background-color:#ebe6e1; + padding: 0; + } + + .top_draggable, .bottom_draggable { + cursor: default; + } + + .status_bar { + font-size:12px; + } + .status_bar input{ + font-size:12px; + } + /* DO NOT CHANGE THESE VALUES*/ + .dialog { + display: block; + position: absolute; + } + + .dialog table.table_window { + border-collapse: collapse; + border-spacing: 0; + width: 100%; + margin: 0px; + padding:0px; + } + + .dialog table.table_window td , .dialog table.table_window th { + padding: 0; + } + + .dialog .title_window { + -moz-user-select:none; + } + + .stdButton { + display: block; + float: left; + width: 95px; + height: 23px; + background-image: url(window/button_normal.png); + font-family: Tahoma, Verdana, Arial, sans-serif; + font-size: 12px; + text-decoration: none; + text-align: center; + padding-top: 5px; + color:#333; + } + + input.stdButton { + padding-top: 0px; + padding-bottom: 5px; + height:30px; + margin:0px; + } + + .btnHover { + background-image: url(window/button_hover.png); + } + + .btnDown { + width: 93px; + height: 22px; + background-image: url(window/button_down.png); + padding-top: 6px; + padding-left: 2px; + } + + .dialog_label, .dialog_input, .dialog_error { + padding: 10px; + color: #000; + text-align: right; + float: left; + width: 150px; + font-size: 14px; + font-weight: bold; + } + + .dialog_long_label { + padding: 10px; + color: #000; + text-align: center; + width: 100%; + font-size: 14px; + font-weight: bold; + } + + .dialog_links { + display: block; + font-size: 14px; + font-weight: bold; + color: #000; + padding: 10px; + text-align: center; + margin: 0px auto; + } + + .dialog_modal_title { + font-size: 18px; + color: #000; + margin-bottom: 15px; + width: 100%; + text-align: center; + } + + .dialog_input { + width: 150px; + } + + .dialog_error { + width: 100%; + text-align: center; + color: #F00; + } + + .dialog_input input { + width: 100%; + font-weight: normal; + } +/**** END WINDOWS ****/ + +/**** LOGIN SCREEN ****/ + .modalFrame { + display: none; + position: absolute; + display: block; + width: 762px; + height: 529px; + margin: 0px auto; + padding-top: 140px; + text-align: center; + background-image: url(modal/background.png); + background-repeat: no-repeat; + cursor: default; + } + + .modalFrame input { + cursor: text; + } + + .modalFrame p { + font-family: Verdana, Tahoma, Arial, sans-serif; + font-size: 14px; + margin: 3px; + } + + .modalFrame .dialog_label{ + padding-left: 190px; + } + + .modalFrame a { + cursor: default; + } + + div#loginDialog { + padding-top: 35px; + } + + div#forgotPassDialog { + padding-top: 60px; + } + + div#registerDialog { + margin-top: -15px; + } +/**** END LOGIN SCREEN ****/ + + +/**** ALERT DIALOGS ****/ + .overlay_alert { + background-color: #85BBEF; + filter:alpha(opacity=60); + -moz-opacity: 0.6; + opacity: 0.6; + z-index: 2; + } + + .alert_nw { + background: transparent url(alert/left-top.gif) no-repeat 0 0; + width:10px; + height:25px; + } + + .alert_n { + background: transparent url(alert/top-middle.gif) repeat-x 0 0; + height:25px; + } + + .alert_ne { + background: transparent url(alert/right-top.gif) no-repeat 0 0; + width:10px; + height:25px; + } + + .alert_w { + background: transparent url(alert/frame-left.gif) repeat-y top left; + width:7px; + } + + .alert_e { + background: transparent url(alert/frame-right.gif) repeat-y top right; + width:7px; + } + + .alert_sw { + background: transparent url(alert/bottom-left-c.gif) no-repeat 0 0; + width:7px; + height:7px; + } + + .alert_s { + background: transparent url(alert/bottom-middle.gif) repeat-x 0 0; + height:7px; + } + + .alert_se, .alert_sizer { + background: transparent url(alert/bottom-right-c.gif) no-repeat 0 0; + width:7px; + height:7px; + } + + .alert_sizer { + cursor:se-resize; + } + + .alert_close { + width: 23px; + height: 23px; + background: transparent url(alert/button-close-focus.gif) no-repeat 0 0; + position:absolute; + top:0px; + right:11px; + cursor:pointer; + z-index:1000; + } + + .alert_minimize { + width: 23px; + height: 23px; + background: transparent url(alert/button-min-focus.gif) no-repeat 0 0; + position:absolute; + top:0px; + right:55px; + cursor:pointer; + z-index:1000; + } + + .alert_maximize { + width: 23px; + height: 23px; + background: transparent url(alert/button-max-focus.gif) no-repeat 0 0; + position:absolute; + top:0px; + right:33px; + cursor:pointer; + z-index:1000; + } + + .alert_title { + float:left; + height:14px; + font-size:14px; + text-align:center; + margin-top:2px; + width:100%; + color:#123456; + } + + .alert_content { + overflow:hidden; + color: #000; + font-family: Tahoma, Arial, sans-serif; + font-size: 10px; + background:#FDFDFD; + } + + .alert_window { + overflow:hidden; + border:1px solid #F00; + background: #FFF; + padding:20px; + margin-left:auto; + margin-right:auto; + width:390px; + z-index: 1; + } + + .alert_message { + font-size:12px; + text-align:center; + width:100%; + padding-bottom:10px; + overflow:hidden; + } + + .alert_buttons { + text-align:center; + width:100%; + } + + .alert_buttons input { + width:20%; + margin:10px; + } + + .alert_progress { + float:left; + margin:auto; + text-align:center; + width:100%; + height:16px; + background: #FFF url(alert/progress.gif) no-repeat center center + } +/**** END ALERT DIALOGS ****/ diff --git a/themes/default/window/addbuddy.png b/themes/default/window/addbuddy.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9304037f079dcbf4a818dba4bccc1f9f4c6107 GIT binary patch literal 1137 zcmd6n{WIGK9LK+CZBrS$J)s=Eb=}?egC4u?YOalmC{;?Lw4A4f*3?rIRZ1;d5fUP+ zXIB(yGZjlJ5(!B}&j5_u5fp=G+WuAHp5E&VU{x%+%x_xa`h%lm!rrpt-3Ag=%~ z002O77a%DvhP>PNJzN(u(kyb}$n~g8Q2_9p9`_2?97#c*S8eJrt*}+s&(%CA)cX zW7V>s}Y=&MX7Ylea$|zkhxTskeWAupTxE8C*W-`#&{YIT~c~K+avgM*V%s`<`#Alj_ zW{Xm*ls2`3d9 zXHGLGMwH0WnRbSefT1U|EJV3_nqh1+=~YtU?9?QUVn8!YgdTa0-XQ9bT*ES93bCM{ z(x}r&P~8c1>ew?)9e$)_LPubUpZq#Syx&(KQZO)+$tzX^ar8EskM9!Z5$Dr49A>$C zMy27mjZ`!Z7P*86Cb1+|D_!4K+ncFYh^Oe(O^3x`5HpsD0^anv3j4xgd(3DmA;fQQ z*eLyA?=1}E?pP*1^CglUyL_~|!( z4CoQBJ-=wU6YxCR&il#k-5!K%%nCL$ZX(x|Ln0>P>_b?rpEwzxk4xNUb}6NTTKj>LcIQ zd|6Y`)}RUvK3NZzKyH@Za*7?F4SC?n8#}w(0WqITYcN^JYi?bn7kyBsGG22G1tsiB=6 zc%}8B_-J>VTIQ=WKltc#ac65^Sx{kYW?(kD_$27~nX$ij+`R#x#AbK*Fw?sZ0pem3 KA>%*f)c*%?Os_fs literal 0 HcmV?d00001 diff --git a/themes/default/window/addbuddy_down.png b/themes/default/window/addbuddy_down.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef0c90bb3ecb4621dbf1ed6d5b08edac3139a1e GIT binary patch literal 615 zcmV-t0+{`YP);GQFA!a%gE&5+GtSw6951J@kvBM zRCwB?)9FsaKoo}Iq9}@@xRh3kmR(!{cR@u31qAgRxc_^BFYOSe%pu0-=ggbTk{n|& zhcOt6{v5a~;A(?ZnjoFh1x1Pj6?Fm88W8D&Wsrg`kb)>kK^UYUG1k2Mm=4ZvAIMWG z^{W@`vG-MwJNCD!_kQU(4l7wd$eZ2Ay|I`2`Qi_)FFy2w12g$uC_GgbetXUE(ImKP zyxoMRw96{Uo5}lABj7Wmj>w(V)V09< zZIFTp=mVQqfo)x2`9EN32glj~>mQ>xE0|*>zyJXP5V*M2l#u`c002ovPDHLkV1kEB BC8+=a literal 0 HcmV?d00001 diff --git a/themes/default/window/addbuddy_hover.png b/themes/default/window/addbuddy_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..ca7b94baf701c3daea8146e3cb5d0d484c0229bb GIT binary patch literal 1026 zcmV+d1pWJoP)0eNsXs-rJ|m0jZ}2CL!ZcWqs@0}iBe~a zP?g1DbB$To)XbT~Yu??|sivZr%VUGVPLai3!@#?s$#uiVvsHdNRed?Lu&krcbgZeR z$IG|Ay0&|^OQ*Pzp`Mz9m}+LBJ-o!LrJldAdZhuByhvz0b?VzQwJ$z^9U?cwB)-&Bw&SzPe_jJ&UApSb0IC&UB~K zcXX6mk+E>f%)4o&KWvOt~d5EEw1a`?7jEKy(bE&;9|NLDDKI~Irx3Or|lIl27O-jm;PU*$thd?54QUA zpVkEpyGg@_!9X>T>VXXcRS!D|)GKYE7(f95U`iWsfV~8OYXfEh93%i1(*;5T6cPX_ zw1EMzj{q3jfSUk^Grs@$VDjAH+T(?*+lzNc?6=$&;sfxt7atNm0OFMB?YaT|T#YozLTVjAa5P-bLa= z6Px}rQ--(vfM5M`DZ8!x#k$oATns-smcwe9+mV^&={Rr9JQm9Endt>V(DjJ}ChI#NIOin-Eu wVva4{oF8XR(O_#^@5kP@*1@8+#a{vp0LJzEPbHvj+t07*qoM6N<$f&+^oIRF3v literal 0 HcmV?d00001 diff --git a/themes/default/window/arrow.png b/themes/default/window/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc6a02946b3c6f8a55d259b6f12bb8594f8d05e GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&v7|ftIx;YR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6DcH9^ez=dh6;%XJ;oz2L}&#H!n|* zJ2x)hxP1QV#k29TF^})vI=p|khK9zgrw`O}${K)LcuRu(g8w4{2HO`(Z9oY#PZ!6K zid#t!8kyNt)TG5lHW(RfC}?J6S7+vDHf~`JI(?2Kt#Ru{)z4*}Q$iB}lFwD0 literal 0 HcmV?d00001 diff --git a/themes/default/window/arrow_up.png b/themes/default/window/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec1ba8d6b2f98725b68825169b2b6892ea4e92d GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&v7|ftIx;YR|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6DcH9^ez=`u6Qx7Z(>dH@DZXUw`=U z!Ozdn+uQraix;V>so%eUzjEb@hK9!f|NrlpxJUuD@RkJm1p~Qoz+n4AsSPM$?&;zf zQgO@XbR-{x0ta(ojNr?^=d~RdoK$(goJF4Zb@p9_eBPq#3g*72GA{sX5iWIyv*qDIJ@3(`edpZ!o%H;VgDAlLo-UVnS#Z?$N;! zG$JiHEGc$`1_1yNK){fY{Lqk?gz|bAjOP{Rf-Pj)A*>u3R$%69oi>b7v$?)f>gf3I zHEkIfTmgkv!eAS(mRB`%>uZ{orP-zVY2EU|tChteUte`d$Wt`B)6H$1O6|d7C3t*0 z3bm%4AEi*bF&JfFpei`H&(l*uCeP1IF1%DthlaMhxs^j8qg3j^&6~}!F`a0%+{fop zM0h0>+D{^l2L!Ysk-~Plfr0Lxe;&#Y7L0$#c_6)r3MfHy!VY zWmpo$VL}1|J1`{drklAJL-D53av!Ju+%_=|m_!E^$3AlvAO? z``qmi_O?B0d>k3>08dJH#^mArld{?qIeo0;5^DH8oPT{=yPU(+9$J9^diZLD3v@L=<6A87s?(#ls7$!wsS3UaLCQB`w}1P3%_^Zx3IKWli-`03>;D_TYuE5J0O)tP zBjBXO#jyJ{k{SG1E~r#otyK(h4bQt9sfp*{C3lE5x}T5j64`&VTW%cBPG$Lt%@%vj zuWr|Us{J8uxi9@*slm0>ti^bO`y-x({( zemcku^j`01a4;j=DQZV^nxLcDJIAAL`G!BhHi6nQg{1=ZCCs zjtPD{kRpm&|JWmqk7qKOg0HN+N$uF6VbTEqvmfx-qtV9t_=(bD0+LJE? z=}`MZoX?f58kwJ6*AwO&nC|o(aX0$MpOYb{jNXXfeR;}q`iVX>tRduW_dh?=yKemP kE$J9q<9hs$=Y9GIfxH0(Ghx5FZtwg6cO(wc>Kv5yUmEHG{r~^~ literal 0 HcmV?d00001 diff --git a/themes/default/window/audio_on.png b/themes/default/window/audio_on.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebf9aa49127f9b269b2a9dedf861104a3a7ba01 GIT binary patch literal 1277 zcmdUt{ZrBh0LH(Toz=88rDiLZwOw^?*Vb;nER6wyiWwrJV!qPA*EteV9JnN3P{@}~ zO#?+StuzxuOhrHgM0`nxs3-~|Mw(XB-MV(&vc~?5J$KLZx##ESVPnvNE_*-Q3jlx% zDhPqK)8jwy-f2%nD`&(G$7I+=7yxvQ`t0JY+xsCZ5>E{$CsAnx3JHJ_$(KnUs0>0f z2}>dnf6W{t`2)ZXH%tf)S;V;$K~`N%lHxKHMcld26dCsC$C$Lis7$rZY6>ArSUh9! zPkn{A4EQXKZF!MZzp(anDZ5x&(y)jk^ggqiS69qd^Zc@D4jFSlD6z+&*LI1AOB+qv z3C$V!)ujbPV7%BgKVzKL@tXSBjpmglquDsSv1(Ng>lWvyX{GZ1fzg}1Zq<+!8o^IU zDX-)Au$#;ab9&w6=#Sy`=kZPOsK$V}ZZ5x<+t_C`OzD3gheb9*aSfW`A$r-c>apxQ zcs@3cJ*6FkMcpgpbexaAha*(c%BLQRhsQ<~2`LpZIip!ck~C^le$7l^oN#S*n}RsB&1cINBH? zz48LS1aYYy5iNMJwt|cmc?FhS#1|@6lf>U9@agxNHM5yaaSd10|40OlyesYRiA$+v zRH(bVIS!MSsYC3U=hot57%Hk-yqlJp<22#@t3+YE~-;bJ;`M@sW&TEwy;yJih&@Wr295 z;knK7EtFy3h4Q@G&;B716^jo4@IMnU_d1pc01jdl0*1?7piU=8xxqk8D-wg}T+k7} zP~7+&9&~&iS|ISiI)c6m5&@p`sX3p(IIoj-wc;gyZ`o+?64f6sSGT>_APGs@SkL3B z({EJXdE`w53g!Yh50-vR0SrPYES9-;7@Tuzbp`N0N|C<8wBB&ag=BcwTj0&X2SGp$ zSW~WY;<**doK94yiX5(j**S-gl)2mZ4udDTd7oO>h3>LzmC^lCsiJNH8&GfgpfKCY zZucw5Ew94OKcCgV5c3yHU3W$t^KVLj@cyqY6JZeSdJ3F;bh7m&tqwRMFM7A9;N6#r zkzpQT7^b5XwD+hhsMbM9gq=Qwp<^)Z&RgL9wrXbN48xfQ@iMg84zdmm`*5{$ArMgK zKi>HRqzwo>BCthX>+kiV-S@3<)42O=_Q}IO0Xueeo=%-MoOKembmr6L@BQ}p9+5`$K7!CqR0ec-*%`Gj))E%rdTLbo`ybbO2hYuUyHDm(%v| N0VpIIA%rIu{0nFn*y{iQ literal 0 HcmV?d00001 diff --git a/themes/default/window/away.png b/themes/default/window/away.png new file mode 100644 index 0000000000000000000000000000000000000000..105a44a00e7132290741e65280c585bbeb332bde GIT binary patch literal 1077 zcmaKr^=}(?5XHY)23e=7n>MXerFM0gnc0cs*g?l(W=oV0zykmrm;pG{0e}||z(=bn?H)J) z!~i9wAa-$jkQ0gt!N9YE%qH>TxsIIaj{JB_j%J*|V5~$>1gr)pGCSPb?#H>Bg9^1m z#F?{IdT^vV@P%0;Mq@-X1I>m)dFMu2_lwYDkpkO!sO5CzR4lYQ9XFRKww@*R_VxyW zKuAeR$;ima$;l}wC@3i@si>%^si|pbXlQ9^>FDU_>FF657#JBDnV6WEnVDHwSXfzE z+1S|F+1WWbI5;^uxwyEvxw(0GczAhv`S|$w`S}F|1Ox>Ig@lBJg@vI|sECM&sHi9m z1``t#gTvwC;^GJd0*ORQNJvOZN=ivdNlQ!1$jHdb%A!yxIXO8r8Z9p`ub`lysHmu< zq@=8@tfHc#s;a7{rlzj0uA!l!si~=@rKPQ{t)ru(tE;Q0r>C#4Z(v|xXlQ6;WMph? zY+_*C zP;hW?NJvO%XlPhiSa^7NL_|bnWMouSRCIK7OiWB{Y;0UyTzq^y9*<8*NJvafOiD^h zPEJlqNl8sjO-oBlPfyRt$jHph%*x8j&d$!s$;r*l&CAQn&(AL?C@3r}EGjB0E-o%9 zDJd;2Eh{T4FE6jCsHm*0tg5Q2uCA`Bsj024t*fi6udi=tXlQI~Y-(z1ZfFMq5?d$97@9!TN7#JKJ92y!L9v&VU85tcN9UB`P zA0MBXn3$ZLoSK@No}QkWnVFrPotvARpPye?SXf+KTv}RMUS3{VSy^3OU0YjQUtizY z*x20M+}hgO-rnBX+1cIQ-P_yS-`_ttI5<2!JUTi$K0ZD^?xVXH$ zyt=x&zP`S>xw*Z)y}P@+zrTNYczAq#e0q9%etv#=d3k+(B^;;D6z-DnHxPTYj6A{q zZ-KOqaR_1A772qYI4>rT*8NS)LIRVkUQCWA`sMiHt;`-07Q}EDSB8aXjIVs%;P%-T zR&u&po`HX{Kq)GIrvGU{8}kv1oqyB#m*|I}%acJ;zpJCszx1ALPRKr6rk4KUrOv{} qrX1&Avczs_{^jQoUDZw!aQ^}1y?i2ao1`ltqywaw46IZ{$LBvKq$*AT literal 0 HcmV?d00001 diff --git a/themes/default/window/block.png b/themes/default/window/block.png new file mode 100644 index 0000000000000000000000000000000000000000..764277b5cbef9e5ab99dd6e81affcbd62987f807 GIT binary patch literal 1786 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 literal 0 HcmV?d00001 diff --git a/themes/default/window/block_hover.png b/themes/default/window/block_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8c35f5e9a37735e7894d005b40abf84100060730 GIT binary patch literal 1784 zcmV zw}phGH#n|5J&ZCkwzICBTU)fIqK!;U%3EBkjf=NjUbUT@cr!GyKR~luTe_;H=i}Xl zFEG%}$9XI*&Sq%Av8}kZu)Re_zPh%WG&PxWag{VR!IqVqH#mh#N}W}7wu2@>rYHQNW$*zZme?30U#=(e9O~PPep*cFMmy@SuW~5YB ziZ3vePEWzTxP&k*JEWBM`ic?eR<=~|_IhHp#r#U*e zLPK*aE0<7GqhDcjDl2p@F1bQPm|kC~RacNoONB#2gFirfJUo{(G}LQto-{S<=j7|> z;@Q;CoHR9`H8$ei*VSxp)XvP$$;RW}+1}aJ;oR2O(#)wkJJHI=p*A<%*U`{vYS7BZ z($2}OJ3Q&;;ndH|&B(&f%*M{i!?8X;-PzR8XKBX6z0GB3*wfD6+tstMth7Ku=;hzY zVr1sw+r`1W-PqE>zPiZ7z{|$M)zQq_*3hauJmc8a)6UAnz`LF{H@`+l$6#X1W@yV~ zWxKet&B(>g$HdRe#fMK&#b05MQc}Xdy0^5j=HcAExwWvYr=e6;$Yp1;M#F2E4Dr$5dZ)Ken~_@RCwA< zlXpN9R~*ML2_UEh6Osl;6-z3O(TY+TYI>m|2`b>gUZQCe5|T(r0%3-*x3~~TMQv@R zi`u1?w%Wb-rhD(bhn)|V(e6yO9~qrwB+fO)5dIrL9D@Yv!^-*Sq4Kk*3~%~=dFa< zx-}uA;Fo@|qWb!57BS}XX^_>|ixFR0%3OGYFuQku`Q*3J!9i$5V)0@lRyckGD;A3Z zcPaD4Q>5^R4`yS}-po(`LRKIU$ORrd3|SyhhIq4;vEH!eYq4lC*82TDcgG`2Boam8 z^a3bFG`WrneUF3fEbC-(mv7hJ$-u0#vQ8y#lqoNL?=1CaDo& zG&5*K{ereyekF??Z7%@IO_Ys8Ql&Jih;J6LSk&Wj)4g!o-Ja?tN9kvmPhjaP%=yFb zD5kqPYALSW)w1Lc7^OuUBMixaMT%>?-F6!lY?exgKXcL`om{3|O3~0#*1xi^DY2u@ z5q2bd)_v}|h2M-+zM(-G|uJCn)`+0%KX}zHD#hdSaefUyJ<~?uy{7#>>)EVwN aE5HEz794|qxEc@u0000a>QWZRN6Vp?JQWH}u3s0un02LVr_=LF1$VlJ5aXBp|skFG@?8&3e zjdgr{yy0OX9`0`1TAGvkdlt@{wQu)!D@%*@YgPg^y?XZW=YcbMKvu4&i(^Q|ts@g1 z`5F{>SfUvPx9a?_U)y_R#)YD*JHHsPt8s6Y{Id1oDwpFbC8rFf4j#_*T~!^?nB#kO zGs7dPdksftDJ?lKaGpygYO=F{uEKtWMe*5Em1-|-Zn4eFH3(}D+!KAg>ht4#X+1_Z ZhRfSko^%{t_8e$2gQu&X%Q~loCIGL^X~h5l literal 0 HcmV?d00001 diff --git a/themes/default/window/bold_off_hover.png b/themes/default/window/bold_off_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc0013fa93edd763e3ac67cac1308c575d141e1 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02LVr_=LDhOG#Zgb@b5Q9r-z#iE+_2 zm1VrVJg&};!2y1n8tOBqOz3KF-m-p`xv9yrMRS3g?%lYQo1$F>WaWCgIEGZ*Ix^9b zuR(!_<+c)6R^-3`QPQ1;3k$C9{9?ea#(h=t%hrcUCl0une7Yxn^zchx9ruXFC%zju zGgz7IVeB@KJULHsp6H5-$xZ><3kn+-#O7=D`fRCO!)tSU!Fs;E72Bs3eSVy8t;fj5 Za9K&^$)hHv4M2+-JYD@<);T3K0RSVlX7m66 literal 0 HcmV?d00001 diff --git a/themes/default/window/bold_on.png b/themes/default/window/bold_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3d405dccd5a23afd8179148519d6d3bcf2283e88 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02NsV_=LF1$VlJ5aXBp|skFG@?8&3e zjdgr{yy0OX9`0`1TAGvkdlt@{wQu)!D@%*@YgVpUy6EeNS3s?=o;_^f3g82>ialK% zLn>}a>QWZRN6Vp?JQWH}u3s0un02NsV_=LDhOG#Zgb@b5Q9r-z#iE+_2 zm1VrVJg&};!2y1n8tOBqOz3KF-m-p`xv9yrMRQjyUG(+CE1=eUH!jJZIqMB%6??ik zhE&|zGSQo_L4k*rTl7Dx+;{smy~mDR*i>Q`d#34R^C=Fkv&;XbIE5`r7Lwbx*Su-^ zlaxCWkmG$mO m`s*3_b^n92Uv+plFfy>+*YNRlDY*}{p25@A&t;ucLK6Vo?Qg;W literal 0 HcmV?d00001 diff --git a/themes/default/window/bottom_left.gif b/themes/default/window/bottom_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c73d3563531b3470951a5d45e5302f79cc4af45 GIT binary patch literal 187 zcmZ?wbhEHb+5T6ZLO)PDJdxdYGEK6DE?$&WMB|v&;jWH*~!3av7o5u$qELiRb0+5T6ZLO)PDJdxdYGEK6DE?$&WMB|v&;jWH*~!3a@j$U}kq<|rY}gk!$<;@Kv0dSSf-b|l8`_MAYAvLAjwrA&SOWmY CGeFh= literal 0 HcmV?d00001 diff --git a/themes/default/window/bottom_right_resize.gif b/themes/default/window/bottom_right_resize.gif new file mode 100644 index 0000000000000000000000000000000000000000..649b0d870dd137007a578158ae2e1f3a2e23d14f GIT binary patch literal 201 zcmZ?wbhEHb+5T6ZLO)PDJdxdYGEK6DE?$&WMB|v&;jWH*~!4__CT?3kq?oo$ZWsnY${?AqJ8BOhsT^{P3#XQgqAY0HAol;iyzBi QU_4Z3A;ohsNj9zeStSB0)i+YqH-gOoC_(|BR>OSZB)^Bzr4El;Kv|j9iA$B><5adUi{YcWq9R6 z&4i$SO6d6-^4J%ICbKFiJUDKZwtI|dq>nHa$pnUfG&TrX3&+u88|erf9ZTVLEFSv9 zu?u{SClFRQDf9uO+#Wvq<9&*g^OxIFedp34fwrGXVi9Tk%K{CaCR*9k#x|`H=f&^Q zWFHXf`9H~boLyIh+N>^C5`i(!R^D-OMUj{ssooO^`GDzm_w*ZP$hcBHZRdD`ty&VC zg7XJ!Ck4UzgL!=%jznM3&#fNkqe!d-{Kl@*ye&7$bykJmrqEf{#!IF|&y^cFGNa09 zV@VAvgH36$ZAlF!6*cxUZ*FeDU~q77Fa!dDLZL7iEF>f(G&D3UEG#@cJR%|@GBPqM zDk?fUIwmFt4u>NUh}hWJxVShZ5*Z&KpOBD{n3$N9l$4yDoRX4~nwpxHmX@BLo{^D( zLZLDCxw)mKrM0!St*s4@ z#}fzyB9YkM-rmvC(b?HaB9X{sa#vSZcXxMBPfu@eZ(mMr5PuTGGr>FOdu5tI# zuRn7xct_QAo5e{eCqE3|&`;EhTycm%R7oOTOfL`CeXS3^2mi=Mx_Q0N@)H z85ZloSDwCm!`m|hUm~u1zz-7sJ0$LXG9(iOP6C7^zE4QH7xfnOcT#K;C^0*gk@N!q z;0=iRB|h9E7VB)vQ@he=7in#3lU=AiQ=Qts119$`%L9U=KmGDy%dE70PKI2T-w%q6 zhqV3EOn>wQ^aepwE95~>6Sd0Sl+JaE_=v>PrgkwJiNZ%wpduW5e@B$s$pCjT1RQ2I ziW&0`uG*KSbTTADPCTSlrPx`O8X^*);O>pJ9V2!{0VfItD)ZwPIcUl*hOVGV3~gjt z;UF7Hk;kOKeQ)2n>;FvPg26C&FEKR7GkV^#6LAF41rZG9RW~bKVIJ91}lxDuh%2QkQRwr9!(OaC# zJt>d1sk1n_Dobr+i`(r6gTZNOX%Gk`Jv}`mBO^02Gb<}AJ3BikCnq;IH!m+QKR>^q zpa2Sm78Vv36%`d17sFt%l9H0r($ccBvhwosii(QL%F3#$s_N?Mnwpy0+SP$ z5{XnQmC0l~J3Df@e0O(uZ*OmZe_x?c92^`dl}eRLrB&l$(^HelWHy^E7K_ztJv%$I*=*ZR$Mk#Hg^4_$(<=80`ZKyhBfQF8;h8d+Q6;Ew2wg zF21kBTV33Yc{k>1@IsLV_OE+04^jJvpT&z`;l`JK1wrxDtI$$cyN@&aBbz9|VEj$IG&By41Gz^(H)7qh zl*it0$zM;=!o6ex@-+@0p3i;$y+!tuf96UciK;Ghz9B9eu+JUtMY!WeARrP4RNre2 R`O33DASxUfh7bL#_&-Oa4YB|L literal 0 HcmV?d00001 diff --git a/themes/default/window/button_normal.png b/themes/default/window/button_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..603e4dfcf0e0929ad71822efae70d90227270e3b GIT binary patch literal 1181 zcmcgrS5KP<6tzk#MYIH}@Y1R+=|lSxNKmD!%>Y6K4K!t#BqGhAfa0WWNGOrn7-O4d zumQ8eGT;xJiu`*W@Sh+gU5qaz*ZT%D_n4G+EV;{2sE1Ojmh z4ho2H;2)0u>XMUVdPkLg;(#yUfluHM<6ps(W8T9c{x9QWVON9S#=M3_z+zseCd|R^ zKp;+#@ZTNy9sp zLQ70RT=TkK-_+Jh>ujSj^=i3~?_GmdaqG5kVG$t>ku|-*t0t1tGf@MhvpTgb9f8Wo zL_d#;)~Tdv2$X=gC>HWmGEwC3FEF{dRvMGd>7p{&bXMPGSJxUMX?|(V$In0V=?gAT z91;dCz!Tc(taX`&!S46)xSD~)G?J-pbY}2_(Ah;klf~vQ&xeFU$<57JT#2izn^3Ce zu84zv4T1d`ht4e=8lR_jaB#(CbVf%%|7FzK$z(EFEEb#1 z=5RP&U0vPX-90@$y}iACeSQ7?{R0C7gM))ZLqo&E!y_Xjqobo^V`Jmv;}a7TlarHE zQ&ZE^(=#(Ov$L~vb93|a^IR@>VPRo$adByBX?b~hWo3oOzihNF-9JR3?+j<#L5Wp;RhWDwSHT)@U?ZtyZVg>Gk@JjSYjru(`QuG#X7N zli6(E+S=OQ-rm{S+1=gU+uPgU-?vyS2L}g-hlf_H)n>CD9UUDXAD^6@oSvSZot>SZ zpI=;DfFS6&(RWBV%<%wlctq$!2mQYbVuMe;arm=?1N>g6yW;!)V=!t>}z{OY>L=_hagk%?SW3$PKU=YQ6fh=uZ%tY$@b~M53~eQd{}|r z_fYB1jqPsuo;1?(M41Dk0FVHH1pt@}fM@`$13(-AmI7c6kQo5A--FtJf!h6{_P}b; zz~A|dI&-FZcKb@)GyGA)KQ62=)8B^X3$4X-+wQgaz6J5)@y|xk3yVB+wtgNBiR0Zo Uvj%+|?pPlZ92gqFxEGE77aVK;kN^Mx literal 0 HcmV?d00001 diff --git a/themes/default/window/center_left.gif b/themes/default/window/center_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..79e7a1cca64733b76c7bf467a0f3537cd3f33adf GIT binary patch literal 52 zcmZ?wbhEHbdC6~qJ4?AXjKE8AQ}3D4BLHUX2% z1H#Zm#Uw!v1-S*0FCchvDxPWW*0#>19nMxuKkQ$zpPA=<=K1}7=BbQ{3iI*u_X2@H zKG1M*tlI-V%5$~*f|*#Y+dQs@M23Js9Nm#M*gxEP8ya#NjZD9S&c2wL0t&gDo}3Z@ zO}ltCB{t>axQ;l=#WYIR(XgIJ|RR!XCZ{imj!mclLwPL3Ec0pqrjnF*U>x?VX;)hMO%={lEv zY;Mv)9yl$VtbIJ?w2zupv(#=oA)N@Du#a-|gdyX=^tjdTG)y`y0(Ik`^V6z1+N{go zs=!m(MO{id*GObaaL=C1_N!!;A){@?G-}rO$;7!VNFFQ9F=ob4;tQ!4G}`VO;4Dwg zc(yRZGn14C4vvA+4D$J-#AY$Js6JV*Rb`N14$Ba8D3d9w>R0zx&~CUKqs6@N_P#3P zfVxBgWl2fH7Ij7QmAa-flU`dXL0E?eYg&qAVqtbeWCwuFZVK0!1o6YQAecNFrbo&3}zWiRmG9e#1llWt+bk+FVeJBFj8?3()l*Lps$J7$B-+!_Z)#cF(nYe51)@Rk5(D+AY~` zu#*26_fDUXAdY&hpHiEO%8ij9a~D=Sl=9T7)LfNp-A+VhPRt{O>I*gikm*5oMWFbzKM}XBlKsyH?ovH zr3Z5-p5F_WpDXn9>G~?nqvHIk@6#jJ_Bnx_nfdjO&*u)jBsDstR!&%-zPkG)*ClGm5StokMGP+eepA#b8ZMo+Os3NlNF4LC1ddreS`4et*jGA)_v9%T>qt?C6>G@ z2p9Y+bO+THfh@=hdk<4ZaG*YEI}V%oqU>i9XZ;Z>ug>$HHxAJW$k~APr0dH;Z_2M8 zAAel3m<(#cuKybrnDoiFo21Vc?q39cp{%w~)%afu+I2e}_u9+X8PExKq5T=tVWuFi z>*SmytzqHm;>sf!3n%tJv?{?+u*N_{p^u7!&WdyDDY~tLCi+1^R`PRTAp{em+5-6UseSUcflj{A# zoS5|27FlA-$l?x8Z97;7A3UV^$IpA<`VU`!N0?c6yo&y8p$)VeRR0>XW?r-R;}n6Q MkSK8HPe~>J0w@_GfB*mh literal 0 HcmV?d00001 diff --git a/themes/default/window/changepassword_down.png b/themes/default/window/changepassword_down.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a20f5d71c12120facfa02de55b58857f1f0db5 GIT binary patch literal 1112 zcmV-e1gHCnP)e6+!$l&5)~!+49QZlB0^ zp0S2nk~UeAHK@3gVT4PkxsrdGVuG7wVV6FP#8-@}Ze5Z*ez{G>$+M-=c$%<-o6TjP z#dnXaZ(N)-U6eXzj82iOd6cVsq|1Dv%ygm4c~W#bpUrSri#A%1I9roBmb!9bp*UWi zH^RxXf4fbQv2ay_IF`9^)6>P!(!p4XH&%H*k+E`JmOEvhKa#U@T8%kdkvO@hi%II+8&mbi0RggaP=JCLw&l*V3ctUp(JK%T>Ok;q%FyP12tNTttvSBE!c zp*^6^aHGt3qqdD+oj8lST(rQUpRb2xp*wq-UX{CURf0Ekl381sG-|3nm%4P1u5jGk z(X7;dR)aW{tbAsoJ)6OGkg#uXut2BNcXqf$&e6bImoBhJ00GEJL_t(|+MLt(TT)RR$8ju5vvG@V(IuvA0%Syl*f85e z8`>`0d+%+_ENz>%%=WPI`+@(kbMC#+g-7tI*AJZUdG7lM&Vj4Tj6j#kmi6y}NxUHX z$^?-bBC?7lg9wqs{DDX;5twRdjo0fnQ(cKbAjb^mAw4z?AIzm$Q#l8HEDlTu6N#H5 z3#N0sX|v#2?Gb$WU?>0bMAzx~G%ik7d2jus2HmTuD;9eYC)zrNW6wh7W^;(Fzm>p4 z`$jYG&n;NS*GqJ2DO-A$tUPN`g2gmjr+CUgUa{TR^DhH|d8k!_?{uv~qj6~d#mU@W z)GI+9wT{oZdiu?aiK-KDDS<$=y=f-1?(>$ayfY_}3aiIt1wFgl-tfFS=gPvvfWe)= zDBnaKW literal 0 HcmV?d00001 diff --git a/themes/default/window/changepassword_hover.png b/themes/default/window/changepassword_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d914e2a91311f62091993cd76ccba9e31d8605 GIT binary patch literal 1518 zcmV-J=xUHtk!+p*U_)rfwZx$t=N99*nf7pL)6d9&Bw&Uz`N7V z%9_1((8|ZL+kvCbbj{ zi@IEtt9)CRHCvN8-PqEMrgE0KaKXK}W`a|w(tDPwfzZvzo6TjiwxwE)Ii$3XW{ggM zyG^~hwO4vTQgk|2gE)SeVO4@R$jH6Q&%KezTaT=7pUrTCzEHBdpv%U>TbVSu#j3o( ztI*QHq04!ntcZ}XZ{y(Faf4o$)f zS&ufQ&wFNvP?@iS&C$JFoHUHYS8A#~U42Vke@I<^OPR}LcDO{0s&06UU|oSov#+bX z!>**wcw3G-w7{X4x^!WoIDWZJSb9QOhdZFIiMh71W}-chu5ewHI$M!AwzaBMbv#vc zK2?7>kg#xNp*@wmZc}wTU4lndf;i*e*@&cVQFA!a%gE&5+IT?mxc~qHbV)=(RCwBi zk!5rfK@>*AE@6uVNFX7E0BHo8x=^7;l^Shv*HW~&dyBifyHniV-QC^YZQpB{*`!HM zPh0Mfeczn9XLimvqOAWQ$};6kP9e^DrL%87LdXID*zTOC5CY((Zw_!HFTn-2czSy3 zp#`6-zz2d?CBiW{V&ZcXn063Tj^YIenH)mgxa8y)!}>u?1g%DB@E2##8wvJ%whQG@BcCkpmkXa*-Ow*)F(jV6hYuu!T!R89_t^Dpz|vHI7G&Z z-u(wH*(hhSn^S4pTK5lj8F zbrC-mvhf^i9#`~Ia*R+EF&5s%z6Aw3na2=pB3FtfLQ&M1gx`w@e8yB^zDmLI9K%~4 zi)Yhukpm^wh<}CPa30%Ac#~DwgEfj#PT@C8x{OOC*5~HA)0k0;a0PKH8q;V@!O^Vk z1o6-}n2|QNp%G_hc1L6A&CqRlO=>T=_W4cA!CgM;tviK8YP1tLY2>+x`d>G!eqTr1 z&HK?Eyw|L@pVCfXRdPjj^%L)U(NS_Yl6=$yH)~Y3OPUz5QXZ?&M!RX09`5o;g;p^} z=fN>HfmG$;s?%xQJ98|jl4|5SsfyMl2m&%gypyA&Q&5sYW=IO6G2S2(cK!)40Pzw~ U--i2!!2kdN07*qoM6N<$g3q8E2mk;8 literal 0 HcmV?d00001 diff --git a/themes/default/window/close.gif b/themes/default/window/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..00b76a230f5bfd2ceccaeef68d52a9b7cf7b0b36 GIT binary patch literal 372 zcmZ?wbhEHb6l4%&xT?V5W@c}1Z(?F%Wo6~)=xAYKVPj)sWMrhQtnA?65EmDxqod>D z;jw!4Y6jW^#h)yU3=9ekIv}e+eqvyo=pgXISx2hV>0$ce9IKh96Vtuc2I-&nS5Mf= zwm~{~>7$Q5$De+DxcP#YO6qy*e_=HWx4P}*uE%r8^F)cXh}5)-2+OlZiS>!q^ow!G zvqcHcs7ak6C?U@qB`jRHXo)bVJad$UMCzI~>m>N(`J-gE@7TGWNuFWbt^<1*oF$JQ aJAQPpla%{ec_~i?smoWcUiNfkum%8=Iadz= literal 0 HcmV?d00001 diff --git a/themes/default/window/close_inactive.gif b/themes/default/window/close_inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb1e4ba8d302d3dc6765c88300033da8b3b24a77 GIT binary patch literal 976 zcmZ?wbhEHb6l4%&_^!aPaN)vb%a*mbw{O_6Ve;h3+qP}nvSrKk>C-1poY>#rKXvNV zef#$9+_`hprcJ%Qz3bMk+p}lSlqpl@&6_uA(xe$PW-M5+VA`~4vuDqqFkwP{ef|9T z^A8+2(An9!V#SL8|NlosL@+Qg07=>bp!uUF0mYvzj0_A43_2haKzV|JV=aSY z!w<&|3mlu6SpVHPuwkKd8#jB|43CXUN4dG{OE?lPCNcC#n}n@+aPaVniK^~$KQ=ln zX5mz|-P7|k=pa9bl>Unz$>8U#O!g8POB|*!onIuP_D5sE#in3xoB2@=9}YJh#}xqWxV=X;_bm>XjEHvD9gn6Yrf d!^5q=xvms!_{h)8>6kIYXXmFUEsTr|)&PYot(*V= literal 0 HcmV?d00001 diff --git a/themes/default/window/detach.gif b/themes/default/window/detach.gif new file mode 100644 index 0000000000000000000000000000000000000000..f56a442a0bbcfb163da5da315e17e6429a8a2d00 GIT binary patch literal 376 zcmZ?wbhEHb6l4%&xT?TlWMt&%=;-9+MU7#J866B8aDZfIy| zYHAu46%`s9YG7bsY;5f7>uYIgX>V_DVPRorW@cq&WnyAtV`HPNtnA?65EmDxqocEW z^=c0f4+aK?SI-^-N!kI$pDc_F3h#HjPEzg{<)u6oq^{q%dEL{I!5RQqOkFbo literal 0 HcmV?d00001 diff --git a/themes/default/window/detach_inactive.gif b/themes/default/window/detach_inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..26a14c201629f4a6420fa5bdcac1d1f80b06e686 GIT binary patch literal 980 zcmZ?wbhEHb6l4%&_^!Y(VZwxk3l}b0v}oC~W$o?lQ>RYduwld2ty?#3+O&WF{+&B_ z_V@Qso;-Qao;};QZ}02tn>caex^?Sj%$PB6-n{A4r%#zOW#-J8lO|1?J$rV2ef|9T z^A8?8*xA|n|Ns9LD^^5CMlvuk07=>bp!uUF0mYvzj0_A43_2haKzV|JV<0K0dol>h($ literal 0 HcmV?d00001 diff --git a/themes/default/window/hideoffline.png b/themes/default/window/hideoffline.png new file mode 100644 index 0000000000000000000000000000000000000000..34e795d64d54e14e970a86d58b610ab3530cc429 GIT binary patch literal 1327 zcmdUt{ZrBh0LH&ocAcB8b4IgP^Lkljvukr*t*p%khWIj4@~Wjq#$1{rgfEdMMv8Kz zASQug2wW1LnrFAI+IDT_*q^cI?s-1<{QNw%$duEeAzMQL z00>QhLsJ8c{LdTK1`;Zy8Uk3C6PFwZ0AkaTVCwTgk08L#5z??f5K7Q^3=nq(dl?g% zkdMy6q+-xlZs5i+u>i1U6EX<}qYNb14WXX-7k+-cNCm&6Y0uF0=~e2a2E(~Z1)Qux zJYJmBdhaj!=I@yZ41t6 z-~8;reB)1M<5S=K%!Jipw+w^oIfvanJ83bFjE(B%ol{Rdt~OO|vn{LN-B`>_lj^u~ zStn5h1J#PH07quV?nTWn#2}OmZunR0^T>%}z z=2u_mz^x{|+SxQdF@R+t?(%WnDt1{nv}?4!2fY8-?|h`Mli3>N!w>q6?WKYQ8kknf zhnEQAC#)tyGu-2H5If`53Mr{8nXE)$8xRa(X%#28v7PupLFv-4#tlPS4_nYj!!wX2 zt%=SlTZ=WD2BwoFNiDr(&*HRfsFmMG?V2G9Ci3q;xB0)i!xeuajD@ zIbYd==F0Ar36N47{n7MIp0Y+fSFV2x$e z>CQ@LDC&iJuKDV`+ul3Ps1@dk1{>vb)f8E}Xyh(QoTStXNnCWBvbLZe5!iA0;R{CK zKoUY~O4{oGOMrW6GXemDo+m)#P^GTHsk2P?p>Wa!D(XO#>Y)&A`ywWwCN|n^u~@nb z-d$E@N620zd5Al@u?8gpllTvLMZ2CIt=P_tiD7P6M6)a2!@Jl$CyZemIzQ~<9X^sr zJa#~(ASDY!#wzU=e)8dFHRs{JJcy;TuxTYvj-8%!7guP|8zDQOS?ETF8cJeH_{*UcK9T>tfah1#w~0X1wpc;luyzRzJ{biyVgIkiF+`R4Em{Q zV2ss9sDkZpX<%$UYDE929^FJcuHXeNU4vY=^MdhTg|D7d=zA{jdnVTDvp#^01)o+IC4O+6ziQ2itSkMIP^f7pzFa_W6HJ0Y6^5;PmYm@48K^j{MnPgF`x=Luz}WVG-gR0Q)@BoH2t zREz{taVnk!GX+yXQ0_y>v~y;yr#ADcu|H$)^Stlpd4GQ2B1Bl=I_K}50RUJBKLw4n zbLW3v##5uy#mhM>j>xg-)n?uF-7*Eb@fp{1U;?sN}vd zvUfl(7+&Td-Q3sBPr=JBla%3c#lyn>?A$xi86)7JvMQE2?h}xQA}H}>Uavr;*Xj$4Ybz;@6|`+kZrI=hYs=lAqV zVR77mvs_$-n#MNjrd1NDGV+qp2TH7O8H&Y9PGg1(s)n*iJRG3`5mywKMgzl(ORKwX zR%rdg>Eok+1SYg8#wDe-6ZkyZ@WX+4+;}LuKjyk5;-c`(wUO|&!Lv8Ukm{ZoW{(57yK;Tuj$)^nHu`G)oqyWlCfEFY<=g_=sZ8o=q6aZ_-R&*{+tmq z=a4vo5|MF*-a2tGf9-wZGX;}(D0@7o@ye0o2`->rdyaYS-v7xUOC4g*FN2aiH$4AZ zc!+O%*}PQGAb>hNos+fsTJDEiXF!;uTqb{Uxo{)U#f-5B_}*<+P8mS1+DQ z4Ek;I2xrsk1@XH#K`wcjn>2(7*F3zpsLc|-$`e&G6j%ebUAB*@QgN9HTy!o9~gUwu;r zIvhz{5V31t{Z-Hcz*i0cng#ts51(kZ%?)8bBrsXx_Xs7lCM^mipJxDC-z!vo?uNCHaN5p1&{foeUa_oDQ7ksLr_H9;OD~+sf y{?Yk6Zx8qIXs4Qu{y%;Gvgl3rO8xLz05||89!q^6&8408V*+qk7_`klDgR%`3jx6Z literal 0 HcmV?d00001 diff --git a/themes/default/window/imanyone_down.png b/themes/default/window/imanyone_down.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8eb0e76d8830a9acbb7adb217a67456b29d1a5 GIT binary patch literal 830 zcmV-E1Ht@>P)+Sk=7 zICNHCiYPa7JyNoYkEkm{3gp|hl^yr`h?SVGPgjI0Idw5ZmwS}i zdXdsDI%Rf_&V7ffC^v4%#>+fVu1HaSB{O7IaLap>*CjGzE;(g%jn-mxt0gmKG)ACg zfzf4w&`(!`Zh4|XOLsq1wRDZuM_s~5UBOjek63fgPiDrAma#KLn9$DATxpnFc+Wma zbR#id)zi{mYLYQQjc|LTZiB!{U&c;l$16I1c8$(tb*&{bVn9{5F+-Vkf1)NbUpP#q zP-er1j;)oMu(-O$YJInUm)hCZ)Mtd!LRY$ak=2Tluxxgm&CAZSw7^+plvrezT4k0@ zRDoG_&O}5y*I!q;?|;kntHclPRh zf-?ZY`Kjsuf}F91WSy_uqP+u8aKUI>?qGu5w6DfFd>vICX0ie$IA?1P$|9>(f?ifb z29<1533SXJ?5)jk66tb3qSq_IH8X~PGjvTgFE5390Q`qD<3M-T=wQ$fJQz;j9eSYf zAOffFBsJLhAgMwBD@hHa-biZD@J!;tHj-XQJgCOb6Nv|9D0!sBVp<9I(K4SZ{8C(p zIrm_CFk=f*Wk`}Vo@Z%7qRc0k0B_|cQ*MXry_40^&gMslDblcB(HSG6v9z9CwG3D` zZGhF^?2jR?WTUmv?_HQ7#-s02<8Z7%iuPrhul{&?0elHC0F|x12!#31Gynhq07*qo IM6N<$g8T`2(f|Me literal 0 HcmV?d00001 diff --git a/themes/default/window/imanyone_hover.png b/themes/default/window/imanyone_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..801790f461c3a321bafdf91c02a74aebeac72224 GIT binary patch literal 1156 zcmV-~1bh35P)d%?Z9+0@U`%Ezp!rD1;2&B(&Jwy`8JU(d_M&&DL8Z}H*#-@)z#6=udJuTz`NAX%gV*U$i%=-ReM`$mnb)G zHbH8jprb!jwMbEUb9RbscAQdLgrlds%f`YuOrBb*QDLJyNnXMxZl9mo!G2 z&dI|uLzl(Dyjf(Fdz072!M?Pyu`xl7F+-VTb*&{bVpUy_N>hApgTPsJ&RS)bbdA;MyWDY*hdN0oh4JK~#9! zjMHUz6G0S!;Ta|iWtlay4NV|k_u}rfKwFBtySuwPr8u-`arfy>ejRs{Hrv1);Q2D= z%z1Y{%-$i1e;|qEU;S^e{Kc^=o@@tSPkNULMhdxGoxyD}{^Hv^9ognSIetNmP6h0h z*xezsU)-k{FuGD)l?JoKAT@x2;t|_=b$6(&eE>SJqOefIfby-PsBcQy!j{JC6MAO= z7#0S)N31HEvHH@Z!##fkVEafy_3u40vGt=2fFA?J%!N}wqyR`C3`j0K`zhrH!@fzm z!Mg8KZgBF8R98?BZ@x-(1@~a=XQ|G>+y@^%$!vrNPN4d0;rY%bJ^rv^FuXUNz>W-u z$E7*0Yw>t|>iLpIFeK>QBsB`Q421616c>+c#`W@DuZ};9Y38PvYezhtytJRA0rqTO zzbp)O)2AFAL%0*DMtLw6YO0vmAGHCL>?#GAc60uXngU(Hc}P-4C(-INr(=0&2ZR?t zgas!mLY2WPTcfF&qzbo5RlXNRw?p_WoEsX7Rp*|R3=2OoZH}iW<$5Z2`~V2 Wp5K=7U{=`x0000a>QWZRN6Vp?JQWH}u3s0un02S#5_=LEgJ$ZEfnw9%@Z@03vxP9Yt zX>oyvyIXT(owk;yjEwZcd9%X9Lef%_fXZJzd-%z3(NZ8Q#M8wwq~g|*ia>QWZRN6Vp?JQWH}u3s0un02S#5_=LC~+Ph=fqPbhvuQE3^xp3-e zeom&QhWd;t6Qrf2662z4D$9Zc{9K)ZW;5Koaj9X=P97jD#M8wwq~g|*ia>QWZRN6Vp?JQWH}u3s0un02LVr_=LEgJ$ZEfnw9%@Z@03vxP9Yt zX>oyvyIXT(owk;yjEwZcd9%X9Lef%_RxDlg^}{QmrdQ7%-uV)_2gr){ba4!+xV7h^ zrBH(bk8@ypvcKJTd)+A?dt#byg-0ky_b2_mCK>Ow)q!WzG~r3pn3l0#D8FaydYW=xP8$a>QWZRN6Vp?JQWH}u3s0un02LVr_=LC~+Ph=fqPbhvuQE3^xp3-e zeom&QhWd;t6Qrf2662z4D$9Zc{9K(KS1euh^}{Qmrh7LoRc^ZU7s!hCba4!+xV7h^ zrBH(bk8@ypvcKJTd)+A?dt#byg-0ky_b2_mCK>Ow)q!WzG~r3pn3l0#D8FaydYWtZ zG`99>*{hzVHm+hd+v_)PwWa3;r;Q1(bL#(IIoa`v!+@b{y2`HYfp^4!)-ZUw`njxg HN@xNATSQ~% literal 0 HcmV?d00001 diff --git a/themes/default/window/joinroom.png b/themes/default/window/joinroom.png new file mode 100644 index 0000000000000000000000000000000000000000..80cd1489f5092afb2154906d75f14e29c0296898 GIT binary patch literal 1866 zcmd^=3pbky0*1d1T07Hh>9HMVx?8#}H8ba^WvJWmAvcLgNU3SGNaL=8xJzh)CQ%`g z%cxXET#8UF+FX%wzXqvPNZd+y>~uRjJGwpF?o8MIj(yL0-sil(;ALSkaLC7>eGC8q z1c?ZZJhbEgu(mkt&{p=up)8ZZa1a0(d8-#AXE1nD!_cOv69$``8Y`{p(kKQSlSnfY-xqLJuEA0w2zT-- z(0TWe&lcwxk1=^vI3a}}miV|eA;ByZie?EkclVyjy4z21+YJqC0s%*huhB%`8H!>z znb;a^X%*Tdl+IG(nl9tL!)o%~-1>`(*s7@8d~L;36f&kdn~!V>h5oR+xw&rm>x+#S zn`_b84y=}A6 zup~Eg#5y9U#XPdpz*OMYo-Yrp<@71PRqyz-8L;^K{k z8Q8V{fn~1J%%kxQ#T{@jC=H*Uo5qG0GP;<`hyn>B1k4el(K)Gsr84MheSPCXd@6m3 zk^xFV(8OY;)ndOT@f1b@FF2S)4lnPA`C~IgvhtuI+# zA1`qRO{{Ms@A{!A((BhM1|p~-_#Om;ExAd|5)%t=rI2|OQwq@p(GOYfgRYxoGP_e# zX+4ON4ittoNb5o?I@`-+=)C%<+|p*XNt9Fx)x^fGuj=UnUAbVjcJwksO00a4HZ!d& z3-{HIj7?0;8`x}KTQRS@fThOfOW^fl21`tC>k&52k|I*&x8>M-3pd6`)Z-JXr1Hfq zroPDEBfexlm)gcw;i$>M3RYEIc3E15t}H#ItPjx&f^BfPTBQlPELpFqA@h(q+=wSs zY7CJZnXclD;0@1bUhbH0)`ndSD*4;XZTVaN1^^rZD3O?`5C7i*qTU`m4*(yHAwxlY z;aY{Bgtx=lmv6Tn-TyYuCc!nf?elC9w5b#KT`VxiDZxG~)gx8kc=Q+ydfZN>!j46w z#U($#UdYLx4E!efw>ia64IaPD|NBzU2Q6+`A^9*HLTaLE1GSZf_s-?{{>e(Vm0yaK z>9K$4fFR#xfxHMf? zw}0W{*Kx}8uh{F|4G@S>D6Ap$T8fUzU+6}*wt{~27ELOtDW}^%a)QoS_-;KDlQv&p z8QuJK)zNO+fBO(c z`dk@-N$H;4@y6y4L0+V0iBTi#?aer_m1o&}e%kE>8B(Jh7#LU}%{o0*YIuU4p3Avk zAJh+@n^!#b_VFp2TL}2cY4*_sghg!+w6)wbJ*ERja<4o|Z*HY_I#r91~36Bg=I_ys#1#bL0dBw8c8O z`2hbogMR;e`>5+zUrkZo7}`?CleSONU8YJcgP>N0tG2NYcDuYkZ%J~+u>p6N-<;a@ zKl&fbzAyBreclH*yUa#4NddT(+g0+XKz~NSSmR{<-X03M^3N9f1KnOvfOEG?XrjB* yslW4hm(o>8*Yjtsvxh>%^yidh!r-GaD|Hh^f9UGtk literal 0 HcmV?d00001 diff --git a/themes/default/window/joinroom_down.png b/themes/default/window/joinroom_down.png new file mode 100644 index 0000000000000000000000000000000000000000..9be4732bfc19945a4e0a77b28d0ec1f50aa8acb5 GIT binary patch literal 1416 zcmV;31$X+1P)1ra3oCr+$~)L|VRhkI;L*Mp1M)Iz@1Ol-XO9I3zJ&FhP!mp=qz% zfuLJm-`v!t)N{kb$#9F++JAx7!M%dROV823NnOL#adWBCeqo|FR$!7NF9JPA@-9Qgt|bI!H7|p<0bOjWji>*Lhq`GUMLYE;(h7rgL~J zELL#I#KO2+WR6W>YFA}B(z~}-T{WoBeNtLKlEq+)!C7;WS9O+Jdz)Wgpf!3lHKaE< z(`#*JaF%l`EK+khm$`L-v|EC{Qq9ZGnp9QL%EsBr#b%^EC^TVQXF9CZe>O;+x4)w^ zF;_1?RJ27#NmGP-li7khJf&b_r)Ot?!AUbjnXNoMl}=Dnb~ralrczstRb7vfGBa3W zmU@!ZRCYXPJT7>T)>~pYNL^n*N_V)q!gY(xJW#83jLX!0ep-<>M_j^XcCaozf;mKT zVxT*8jMa9J*D*g|HaK33rEg?zlwoX_aVslWWRzQHmR+1TLQHt2Iy_x@%wBrWYlPA_ zN})PVr$#qX;@sBb-Pdp`D_fT}yt~7rU0-&M&UG#?dz02qWW}!7f75$?NKt+zFBQRdk%gE&5+D=+|-T(js4oO5oRCwBA z_(uRR{QHj=pecBH{g|~Z3|QZtr;er|mDNoY8F*h%M^SK`bw9&vDFnzoCwc>>Kr1|p znfb{chPM*P;J~fhPz74dOI1`roa~^luiyXo{BCh%kn(pWSi!Y|)yg0c^EaBwSP=}2*)1%#*D(G42v$%xBTh|C zt*zp{$KSt33SjV;qxqZJ-@l!Z$Xd{_O$HZ}k6kJ`U~{hz}U%%49zs37bw(D)`UE`$PJRFJ&>?_bv)$O`yTLDZiq_sq?a z6$qe$6@R{3SC%i;M#$NtYBwllLz{>VVUpFdt)_0Nzqj&snTKQbjRcKv~X?-^XN z=sByS@Xw#Tyg%`(K#<7ARgWd>t^Fgz_9q9-ocI)L-gN)-=NHz@3kS=3v1NaN00RJz WDoMP2LBDSR0000;=zPh%dTwcn= z!L8PRbd1$lPBC01B~58IPjWj+Uc^F7ci7X;R%JTDNlGO%WOR*N(9OqPnm5M7y<{gR zLr#5eDJoui&TEC!d%i}ks;79mM2VzsHc6t>&dEAWr6e(5FhPz{aX7%dw_TJv({Xdp zd3vv{sBp1BR$Vr7wL#w5)P+Al%*MkiHeqhAKWeKzs?&b5uc}8}!FIVs$HTxVH*#X0 zJ5O1PpIcp3f;V)uLu;x&TxU9Dr8!%YH!3-GH#uKcgg7=qZ&P_VYA7i&LX?U#H7h%R z*V4?-$;CcVvOiR}IZdlPPp(2&yJ@OBRbP>1ra69>+vDEZ-`myV-Pg~_#(0m=L|VSl z%Ex__*=(*oTa-B2)X&}7)ZyIL(8|Yjwn2rVY1GflYpgwKr#-LRfzQmwrPOoF#=>xm z)x*HM$i%?a(aXI>M$X8^R$!80qBmZcJJrFxytuQ&!^xX9HjOnlWT8B)LPTMD!@It% zl}=DKDn?m}Ic%#wdz)WssXdG_F~!EWp2c&>#J;GLkv>pYsLy>&RCi>cJKBGNRd+tN zxT>+Rwad-Cr)z0@li8=ydw{-8(`#+met(NnQi7gmN>n>eVN-rgOIL|DG)AFbpf!8A zOTn+Itf!+hM48RV#c!-ZjHGgSgJqgjRV+MGD>zu7#&^rc!Cg5lkC=UMuR&+2J7S$Y z%f-TFl2NGCczc&(RZ%fwJ37m3ZdP!~SaZyeZ*FFWP-}!%$HcuwF-}G|QCu=WfKE<# zkJo=KE}Wo_m$`LZlR3Gpr+KeUudAr6s;zL7YcVlbF*RFPBP3ZZCsJz3Hb|XdnLA;b zJY7&Tq0?=H!Awb0gmso$xVxxnsXVx9Yf*DJBQRdk%gE&5+LR7uI{*Lz=Sf6CRCwBA z_(uRR{QHjp49wa>2%yb8?f-ui1x(2ig~%X6Xc~$FhGbD$;R*y0mMvs1fhw4?QQpVr zK9ekeF*4v66)md*E12SQJTfveaiVZF3~YMT-Q8{R-Lw>}poAszw;PWePys*xBUKCY zn;-c2w16Pk!J)npsGy{bMTuw4Hl9SL+2%L+f-4c=?_ZH}kb+YAxm#UbuP6S^%SQ!& z|JH#Nl-0|~=;`Urdh^#l2NnGNtCIy(&>$is)8C)Y`}VJWHY)i0HxsO2iJE6@tgi0K zzqWa(0IFbv#KPw0<{ekW{(j6w1rP-#N1LCn3=CX(O5v|07b^Jc2UJj1W@8iB-rlaV z`So9i1V<=Hv$Z|snDAE{=*X&4fgfKxJ3B86E>-yZ*8u|lX6%*J|NGZ(J8tb1~u7&9;j;oE6@@6 zlN4_>X_8Sb1UyUPa5|G}w*9%G2v|XR-JG?5{-nh3+w+G50{;BDYO?#FVpnE;8CZdc z;W~pqe>nC?0cF5I?Y+q@tEs&$BBdoD1&#HYU5ZwB{``rG`g4pC2(GECKV)@24U{hf zE2t_JY3WsDJ^P0v<cl1HzK?=%%D&%?;f!5saF*XkEU8XG8(Z}iC zPy)_wz?@YARFP>X*LC-2hh1i!j!vddorrfs8AKkW;NQQh@(FSmm6b309-feuRSrar fjaBgM4-jAgwBZ+YyprTg00000NkvXXu0mjf5s4W@ literal 0 HcmV?d00001 diff --git a/themes/default/window/maximize.gif b/themes/default/window/maximize.gif new file mode 100644 index 0000000000000000000000000000000000000000..088c2526968a646e563ea068ec8dd25fe92f075c GIT binary patch literal 372 zcmZ?wbhEHb6l4%&xT?TlWMt&%=xA?m@8sm<=H{lQrDbVp85kJo@9%GJZXOd86CNIJ zY;5f7>l+*#92y#GU|?WsY8n+4WoT$i95EmDxqocEW z^=c0f4+h!;#h)yU3=9ekIv}e+eqvyo=pgXISx2hV>0$ce9IKh97p8ly4KhC6-=45l zXoGaF!UfIQr;`u6FBIiCmtOuz`C^*U+}(2Z{WW4yqN1`*t<6p1^88U^VzRvx`g(cf z`JzNbWM|BtIfFr-JxW|$cJZ<$i-qMmq8Jzo($)#c^G3;R-?4K$t330zT?h6sJ4+lr acKqmGCn@){@=~4(QkSn>z3l18U=08p9adTZ literal 0 HcmV?d00001 diff --git a/themes/default/window/maximize_inactive.gif b/themes/default/window/maximize_inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..8f60ca16290ba63e84bc252cde36ba927686d3ab GIT binary patch literal 976 zcmZ?wbhEHb6l4%&_^!Y(VZwxk3m49tH*e9RMaz~gYj1C#F=NK2O`A4s*f4eK)cyPS z@7%d_;>3yT)~(yRb?f%++xzbp!uUF0mYvzj0_A43_2haKzV|JV=aSY z!w<&|3mlu6SpVHPuwkKd8#jB^43CXUM|rsGD-;qgDlzs*o3L?QSh(cmBxT+|0Sf{f z8YZj9s{K%OOm5?m&3kpE()dt6tCV)g3xzE&0v3wb*<8pt=+wR}V6Iu}hr^9-Tq0Hp zcV~%eH^{S_#O=6{xF&K_vicu~1wiX(sNHq?anV7!eRsv@d%7Qz8)El1{N$79Sh(Tg c;nv?=R|++2gF9BgT6X=rF@ zU|`_y?;jNv6&@ZQ6B82}8ft88Y-VPrtgLKhW##DTXklStZ*TA5;9z586Bie^di81@ z9UTu34+h!;#h)yU3=9ekIv}e+eqvy2cMy2ttRvOw^f3K!j@8W53)8*U2AQ7jPfys& zw?TSss*hg3sC!Ifh*Z%n5P{$}Q7$x4`(b+B}&lx2=VdA6- z4DxJIjEpj~=ggkTEzcXpz%Y025*~SuDA~2^)~{ueXIisi+a@Mwk==Xt?%wPq>3&#V Q(o;e5IMWym|AqY17uPU%z$h))_Nq zOqejCudi?8#*KUT?%lO(*Z%$cckI|PY0{*rQ>QjGG|ZYcYvIC$)2C0LKY#v$1qq!To-qai?c2q^w!VPs%XV9)`X0Ll{#919s7 z8-6%$Sm4;i#QN{Xfej0t+ql`QW_WB=a^>Z&uaHQ%_=urL+9XQCbJG(KR(pkvBL_Au z^`6FFXK`W0!ewV?n{xlDSg^6_{CtO6wjY9yk6RaeOqQGaLAmi5XTV~wR;~x_jJ=FZ z1vgHWW?y5qm&#yaSdbmQiKkBC!i|M%Z*R}#{3CEcY+dY5Cbpm(r?Em-OBI5u5|IT~m+JJT`lmz(&1G)GBLrjeH zTcFxpPZ!6Kid%EedGa+V@HhmrupDG$-;x#juHJj{r40oyqfPBIqbAxNxzFI0&8ixb zF)cBICrsu--jO7}3o&aLxr%IVYG`)+*q~9w!Om@YqAWc(uJKoz>4(VeLhVmCp8LM{ l{i$TlvstsQ_&nA=z@R)qQc>CGq9@Q|22WQ%mvv4FO#qtfpYZ?y literal 0 HcmV?d00001 diff --git a/themes/default/window/online.png b/themes/default/window/online.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb2459949c3cd93f61424ce4eb2197b953603c9 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlP5>taYnc>{+?ot$kBi-+}P%J;8NLgK8EB*3F5ZbtbWAS6JQbxQY8?F5W&?Jj>(K zonwt#J?33Xntm#J)!wPI&&Bs03~Alz)3w)s(y@sD|NsA3qdOUBmqJO9Uoeo14=}{U zNWTTD&GmF~45_#^=bR^Bg9493APZ}uQ{$@ANB_2)X!3GT-xvCM@-oqv&VP6pEc0~a z6y>{TX`gVE@vWQAGls_p-4-Z3pL=#v(+jz4oie{Bf3-aEEX_Br@mG@Rhse!B%}+Pp o$hv#%Q-qhJZa0_7J|-RpEg?z8{nvyNffh4(y85}Sb4q9e0DzRLH~;_u literal 0 HcmV?d00001 diff --git a/themes/default/window/overlay.png b/themes/default/window/overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac83e34c93cd93f07e131f2cd337ee60749e506 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8v_I5FVp|pKn_c~qpu?a!}=5EtX(gGe902m zh?3y^w370~qErUQl>DSr1<%~X^wgl##FWaylc_d9MUI{>jv*Ddl5+C$@)8)B)Yvo_ zI270>aLiyAaOg3x6aezvcv=hC92gd^I6T3Xje*f+j~5p!BNNYRSC`jvDO`;GOZgJm T78tDp8ph!1>gTe~DWM4fnsO~w literal 0 HcmV?d00001 diff --git a/themes/default/window/removebuddy.png b/themes/default/window/removebuddy.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2f5a548dc20167e377f7b037de3f334ffa0d54 GIT binary patch literal 725 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIM3I_OuxbF4$fA;XsRu7N+x2`^( zHS1VJ#Fg`>j~v+Z;_sCE~boa@F+vnor?@yop_}(Z!Dzrb?$mKg@>LIPrwuN8_uXy4JO z9pm9}$j_@ymh*(iOwS$MA02BB9z1dUjiSQ2Hl`!2CNq9YC_ZEeIe1q6)cGE!AFe-l uIDWct_ZNiNJWF*1u+N^vroUVCywuXa( zJ3N~?JG56=+I@bIGc?q7cerV4(rj+ZSz5Ave78bGh%hmhH#opiQqEvv!&h0nYi-6+ zQo~D3y>4&CPf^HWW4udDi!d>dNlKDAI?i!(%2-;XU0-o3E78lyxvSw<{C6Rv<;9|z!v qg#$M)Hfdh|(F8+Z1q1*}j*QN6bKTg|v3q;Ly||V)ID$e$k4Z|}eSVTTI=!Hsp=M>IX=k^Tl7m7+%2-;; zSz5V`iqv&?&R}A;n3mFPZqBi;v#_kgOH9zs$Dn0oxQvRvy0+5J$%rs9$YEo_zPhiB ziM&fpqg`KdDl5^;$mHPK)I$BO0002*Nkl|pN& z5G)`TuqNF5KL?PEGk4A*51_xV`~Q&atkE08=y|{T5B$MmOoWKFzk@w7!kP}?NGweT zUB%=1{LbYmr~vQ8?woS}(7e5wFFegEn{o?>0kDoJAHQ#Gf0d>J&gC_OVc@K|PFy?F z%_So~$y_nB>~i%B4+%G4?dWts)P6QOLA^;NlqW1Rz)EmRP;b%$K*q=qj3K~ZI@&S% a0t^6#Ru^aFH>QvP0000sr>%I9Q a-{aMs>C2oAJgk}KI7yWJytGz{!5RRI95na< literal 0 HcmV?d00001 diff --git a/themes/default/window/signoff.png b/themes/default/window/signoff.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a3813c9ead493fc29935434e73023b0981f74d GIT binary patch literal 1306 zcmd5)`BTyf9Q~?jr)Fto*LGO#I@_w_#A=f!5@fWB4r-94;{j=An^&GFZY3%rpok@T zuvwX#=qRhAtArN{$R#3jh$4}t&8S(U)mF=&v2W(RH}C!Sna?W?MF!e$-Mlsl$LT;zDlT!=^Pe_Gy^ku5Qe|6&ZMf2R0Oe7+ac=zv1#)iAdWT{9XxpQanwb4AI z(NU=ejY=F9HAy0=3JNqtBDb?$o}4_)X)A)m>LHMkrl*=onXt7*oRabapGSnjdRTSC zB_$d%d2FDc77;GX%zO@oPL-9h3koEC+)@}!HTcrNV93hLCuL$@Z}6kfkCJnxRnH=n$J!T!lf`-n^j}43>q4a2_&x==2I79}*bcO{FsZ{MzAgIhBg{ z^c;aeEQc(;i#urfE;R#%4Ez4S0dc(!(ukw8~^IucKa1$Jj01h(%S zcR@v|MxRzC)sVN`zi!C$i2Qo}G9?}1bJEj^VElR{=hWL(-r1$yJKf6u4diz=Vn0Ah zeEZqWi$%;mE8h;iPx=`0zNZ$kiCaVS`k`Fu<>|c6Y_D*FO89mdmYsxuz?vP?RSWo&?!)aQkw0Ec}|WvC-Vv z8CkwY@<89(ahiB^8rlt(NST90V<06-hO#{!*c~MAaCbmDWv3jz(hgbF_9m?DpYL;t zDcSi`kWJZRoE?kx^O;A{uC{L`RvjrA9pk*y#vj|!FH}1323h^C1=DU2G3J81@`T)G zZzG+5N^6r-C46!NV(wr`d|gw1JUZ&oQloK~e%Xfc&)stm6?df29kw02N=B_5IJV7r znw9(3P`$5i9uKi*%QySQq;X1{%8{&J4)^=Rp1aQq(2^we6`mKxF<5aNbRZp@Y3-I+ zVZ%Ik$VJ~j@Co0%?5k+1IB0DTD{NkR=>5UY;V!hqGqpbP_)bXUvFI-T?~L*W-QN$_ z;LkzpsV11);k}Ooa9bjKV<;8QwfIMqPm!k217_^S!X$Y&sI-lspHD!ZD>(BZ~IXyf|y+NbrdA!m5(cl|*ccgZieAD_SU3Dr&$ ze@UXw*hNtr3i8asgl5N$8nQOeKV0178XtczKgXXp|~kS^F6HW Y0D7|bienxx*fM_r0Y}1Gp)q&=17*4C6951J literal 0 HcmV?d00001 diff --git a/themes/default/window/signoff_down.png b/themes/default/window/signoff_down.png new file mode 100644 index 0000000000000000000000000000000000000000..08a08d443554a20b29a9492e56fb4d607318c385 GIT binary patch literal 1012 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIl!3-p$j&#ifQY`6?zK#qG>ra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFzN*Ogt)G%sJOm!>!yUbBRyS< z?d%pfJ3qa3_2KzbYePd8ySdGEbi8xqz=6j4ZP}T-%Sx7cc%16(y|i}K3NO!T(UB{? zy-#*`pPWAB+@kr%ySirE*Y;Rv19)7H??fLy%*A5>z)Y-W@Jp9J-BikDr zw`RW6Kbdlm`T3LR`}}2oD)!SvZZh8AnBdMF- zFJ9O1ox$$w@7fimznAOcX~gc zzH0XE()>2RT>?k#WBGh)eyrZLf9>)~L971n+_%qWQB1y0S!J@leO-AW`=8){90m;Y Xl;WM0|4c0brYr_eS3j3^P6o6c| literal 0 HcmV?d00001 diff --git a/themes/default/window/signoff_hover.png b/themes/default/window/signoff_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8471c830848f95f55af10bdf14ff36c527dfe395 GIT binary patch literal 1308 zcmd5*|5MTj0R5PKA=7EiUFpuWZ@aZxS+bm^7K&f6L{2HRrC~{i>C7~>Pzy{DMIpiP zij;Ddh-fJws3;I$gcS1&BA|e&eX%+EdRA_0{26<9@4b6JzI*q`2zZp6i?<5^0B*2o zXuQJ_4sHNBJM_4sqTXT4(;=}C0BGwETv74Lk-hRF67v$W&*T-PUcdm5wCqzDKUh|3 zIwl^InszBig9!!zCm!MmGNQS#&>$AHqf-==ikCB%#?Vl9c=+^?cFv@~4T12EA{!$k zUp$+dR7j=xE5dWw`_a+e`FYQ$CueQu5ngjs3`|>9#W{Rf!(?bGD|L4po=r{6T1~e? zL#HPV>WYe~iLtuiV5><#P+i>;8#`k$D$C2~rYCh&s?9t;F{+~>6S^66vtfiD6ePRT zpziE2jSn03PbVivJ4ht`(*eVXP9^VU9yp-kami399d%5O!|^Iegn)pOJ$tGX;&~`k zM_sKjGgBw%80-=Cv2H!??IJ><8j*mH!OYLu#)h6~T3g5=A>1OIm`+!emdeRwNm*HM zZmv$NGN|N~z(6^HAS01@B_+LG!nr9UFD`Ca+N0=b8_{WqU~qS7sgOd^(P$>EN=_n) z*|$Z4N0o@Uhe=7DRO;|x|BbU}+KY?z@;<#%W*i&p#N$;&qVmB#E(+BzlhBSL8Hp&? zIc!@|QR&{jk7{cKXtX#ht1~mxV$=_*AItD~^MGcsU(trcQTOlHs$^OUW&Zi}_>i_N z0$Swn-v9MUEj4p2K;YVU>|@;PiBE*A3@hV~kJrA_SeRF1tZhr! zuAN~Lzt!(jxEG!I)rY>Zc>}gsC#J`R^YC!%G5f@p`p-N?%P=_|VAc@yd`i#E`}xa- zFF(GD=WK-4FUEv*r$iK~YoZYx z@SXoPaO8ulyG+g(8Js_I*cnM9k@agubejA3zC#(c9{*fw@f}sN`5Qp!7%%6f;70J@ z#Jo)bZcX-Naeid?wGF642TrGjp))$l9#rMC8#g{a2yJRe+V(@baK18eeN_4Vv+D?@ zLG32IXW_W>@9(qD2~xSlM1DLX6WvQVxZgb^a!1 zCd#~i%_EOmTWg>9j@f5n;HIA-X2w834Iv?$-UY^}T4iOAE8( z*Eu8tsd&Fzxj>HV%&($)-krB+k+3&a|B8eB-l}sybS-Ga zOJ%1*wVy9Dr&cDrHzenNEWWbI_Y;RBq?ArS{n_m dZC6h&a|P6I0^ba}-pzI#0Dwinp{-$P!hcyL=cfPw literal 0 HcmV?d00001 diff --git a/themes/default/window/sizer.gif b/themes/default/window/sizer.gif new file mode 100644 index 0000000000000000000000000000000000000000..649b0d870dd137007a578158ae2e1f3a2e23d14f GIT binary patch literal 201 zcmZ?wbhEHb+5T6ZLO)PDJdxdYGEK6DE?$&WMB|v&;jWH*~!4__CT?3kq?oo$ZWsnY${?AqJ8BOhsT^{P3#XQgqAY0HAol;iyzBi QU_4Z3A;ohC#5QQ<|d}62BjvZR2H60wE-$p3GfMVegFRB+qWNn{`__M^5w5z zzy167@AvQDpFVwg_3G`nZ{J_Oe50hKeDCxZK}JRlZCU)>4%cYg{=+_Yagb6dvdzr(1|+re}B0Q7y@50 V*_drl>ILd&@O1TaS?83{1ORG@W_bVr literal 0 HcmV?d00001 diff --git a/themes/default/window/smallx_hover.png b/themes/default/window/smallx_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8a00fedbf076e7219b86338dc4d7727e037b31 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfSkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$p4DbnYt*oqBwQ9}h&!5koyO5h( zIC0{XkdVk*w{CCSw!_22S4m0v(AftiK*ii8L4Lvi;ef%*pYan=*u>MtF{I*_$!SkM z1_KTzhg~Zk{Fjf(j`9=c@F*3kYILZK>EOx!5o22^QMqxod~3Zu6Ay#u7AB@S4LeGK P`WZZ3{an^LB{Ts5uNadfZ|UUMg|561|5(*$W8{< zOa-;B(8ykq)V0%AM7iZ8WF_9;;`(L}*B=Lmqe>c5tj=vkCndb*1)SXAxYn#~`kHS> zb1L>vPE7Lg<6(dCCE-WLZh7a{nspLv?|vL8IQU+_O|Y>^(3zvHox_>0yNAzNbAqNQ MyTH_G0*VaQ0LxK7SO5S3 literal 0 HcmV?d00001 diff --git a/themes/default/window/top_left_inactive.gif b/themes/default/window/top_left_inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..8a6713a7ddf511f5ef80f32dffe707128aee0c61 GIT binary patch literal 940 zcmZ?wbhEHbR8ylOQon2K`RbF161_T*d%a<>&sHk9IV6evqfa0TIGz1212q^w! zVPs&CV9)`%5R@kvI64^&IYc5BCbTw+XhcM0I4*GFW>bmgxqnJvk1W)0!uW7rokJP}FpOzOb8`gqO*|6O0~{`6PZW zSb3RUS=3|hs)Uq=)e+1+F$cE3Zki}~sH@jNsPX1z4mYca)7K83Xekg5vtU@bE|!Cl Hk--`OOAlh% literal 0 HcmV?d00001 diff --git a/themes/default/window/top_mid.gif b/themes/default/window/top_mid.gif new file mode 100644 index 0000000000000000000000000000000000000000..d53c692921985c99ee9c1e1c94e1629b779b2bf9 GIT binary patch literal 150 zcmZ?wbhEHbWMmL$IKsf7udlD8qobjrVPj)sX=!O{YHDO;q^zp$?Ch+jrsm+_pscKH zU|^uDtE;7@Wo~Y6Vqy{(7pJ14VrOTkr>7?^Ep2RU%zzsx{$v45>VQa)oeZqP4+IrY WnF#nZMzS#n_&(t1+!CV5U=09QE*HH3 literal 0 HcmV?d00001 diff --git a/themes/default/window/top_mid_inactive.gif b/themes/default/window/top_mid_inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f655d43201923fa844ef8d2e74e51842132d6b3 GIT binary patch literal 832 zcmZ?wbhEHbWMmL$_|CvkTwGjGP>_?8)6~>dUteEURaIVIo|ci_)zy`mnc3FXmX?-Q zT3T9ISeTcWS5s3{Sy{Pa#ftRw^p=*EqN1YM*w~7S3VYmuVHAvpz#t9*#h)x-*Xe*r pP@Z7mkY(U^aafRWh=GZp%V9%810w?$FO!A91cyUST#Sqi)&S9hG2;LL literal 0 HcmV?d00001 diff --git a/themes/default/window/top_right.gif b/themes/default/window/top_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5cbd93aa2a51088350e290375f14963161491a8 GIT binary patch literal 238 zcmZ?wbhEHb7?^Ev=!UVQOk>WMrhTudl4EtfZu*qM~AKY|MZG6o0ZXGB5z` z0m*>uWMIvHpePp=DVC8KyX>J9$Du5j+~jFyZ)}cn9awNcTtkX^MoaR^k{@apUL5(p zB1(Q=Puc8`f%_7=@*VZ`Yo>15^{9EreF6Dozw{prKWq+MfAL$|PN=C_$d0SMgUe2$ Vr?*F3Y~my_JHctw1??0WtN}+9Lu>#5 literal 0 HcmV?d00001 diff --git a/themes/default/window/top_right_inactive.gif b/themes/default/window/top_right_inactive.gif new file mode 100644 index 0000000000000000000000000000000000000000..640b15e50d774cf13ab8d97a7cffe9b854db7e8a GIT binary patch literal 942 zcmZ?wbhEHb1_x9C6d47h zAuwn|K=CIFBLjmJgAT}rpgh6A(apfmVY6Ui!a*hu?uZ=;7aE+IIRp%@I4oG?$|GjN zbK`^{vooWDGuH=+1xrpcNC;U(oV?U{oYNrL@57G;%g(aP8NawQ^PqC;d6w{ znEFL0X{~)A*mQZhfQ``%uc?jh3=x}|KHONa`Z}AOYKN@$!NpCRGej$n9N4CNn_KMB SsjUwTo9^xwv|(dmum%9u$!3WF literal 0 HcmV?d00001 diff --git a/themes/default/window/underline_off.png b/themes/default/window/underline_off.png new file mode 100644 index 0000000000000000000000000000000000000000..78322ea54f49488d87990c2529c1b589ce0352d1 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02S#5_=LFb+r9nvjmyoAb$oohllptk zo;9mxj@UW25;sPs6i}h<(0+qjd_HfhG%zPj#)6>N?HTN|8LjTQ6nkjO@V6bDRej*A3d71T4Lb$*cKnyVslCxw zb93r;A=Z?K609xlcODf?lNC;#U$fCaTp{#V!TbwZ*`3=Kamp8Q88EOaC}^$8dQ=az Ol)=;0&t;ucLK6VZ`(q{m literal 0 HcmV?d00001 diff --git a/themes/default/window/underline_off_hover.png b/themes/default/window/underline_off_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..92f5bbdf14d5d0e90c968d2679d457dccccf5402 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02S#5_=LD_S-V{~uq==$*fsd7PNuSl60AD>JC8opkrYmyU!(0Gt`PdGVE%=y{LXEQIOU7D3>a8^6|{C}Pn88) O%HZkh=d#Wzp$PzpTVM15 literal 0 HcmV?d00001 diff --git a/themes/default/window/underline_on.png b/themes/default/window/underline_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d35a3d99a3121e39dfbfc3f4468782fe4c00139b GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02LVr_=LFb+r9nvjmyoAb$oohllptk zo;9mxj@UW25;sPs6i}h<(u2{P0>xWlBO|PCkEbis|17sC=x;TbZ+&VMK zQ>a0Kho!lJo8|cb{b5~8BaSpzZPX9BIQg{7lXnW`JvZ$oz1EA(ow?x%!-DAKMuXIb zmq`|qpUpRmE{>YKxpJEX+Y_A{(Fu!QpKVuOl^-(WgZ|YF?jt_@-;%Sh-74VSyTAEw dUvL8>gWf0Q91*>bKz}kYc)I$ztaD0e0stnUZpr`v literal 0 HcmV?d00001 diff --git a/themes/default/window/underline_on_hover.png b/themes/default/window/underline_on_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..870518d8984c5e1cb7c9b4e48d0080197f1e3df0 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hUmUKs7M+S!VC(K#9UVa>QWZRN6Vp?JQWH}u3s0un02LVr_=LD_S-VL^0qqd{uJ z%OnfQ&*q!Ol%pqauG}WUc15Q~G+@!|v+c^8@+epeL`K^L)*J0ifLsp00i_>zopr07DCHn*aa+ literal 0 HcmV?d00001 diff --git a/update.php b/update.php new file mode 100644 index 0000000..9ff498d --- /dev/null +++ b/update.php @@ -0,0 +1,153 @@ + + + + + ajax im - update version 3.3 to 3.x + + + + +

      ajax im

      + +
      +

      before you begin...

      +
        +
      • are you sure you are updating, not installing?
      • + CHMOD buddyicons/ to 0777, it is at: '. substr(sprintf('%o', fileperms('./buddyicons/')), -4) .'!'; } ?> +
      +
      + +
      +
      +

      ready?

      + + +
      +
      + +
      + +
      +

      status

      + here. Please be sure to delete install.php and update.php!'; + ?> +
      + + +
      +

      updating...

      +
      \n"; + } else { + print("A MySQL error occured: (" . mysql_errno() . ") " . mysql_error() . "

      \n"); + $error = true; + } + } else { + print "Table '".SQL_PREFIX."users' altered successfully!

      \n"; + } + + if ($maxBuddyIconSize > 0) { + if (trim(substr(sprintf('%o', fileperms('./buddyicons/')), -4)) != 777) { + $error = true; + print "File permissions::

      CHMOD buddyicons/ to 0777


      "; + } else { + print "You have change permissions of buddyicons/

      "; + } + } + + mysql_close(); + ?> +