diff --git a/.gitignore b/.gitignore
index 99d83ea..4907464 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,3 @@
/public/whois/vendor
/public/np.php
/public/nothing.php
-
diff --git a/public/2019/404.php b/public/2019/404.php
new file mode 100644
index 0000000..4506e46
--- /dev/null
+++ b/public/2019/404.php
@@ -0,0 +1,25 @@
+'
+ . html_head('Error 404 - Not Found', HEAD_ERROR)
+ . '
'
+ . html_navigation(NAV_ERROR, [
+ 'title1' => '404 ',
+ 'title2' => 'not found',
+ ])
+ . '';
+?>
+
+
+
+'
+ . html_footer()
+ . ''
+ . html_close();
diff --git a/public/2019/blog.php b/public/2019/blog.php
new file mode 100644
index 0000000..93edae8
--- /dev/null
+++ b/public/2019/blog.php
@@ -0,0 +1,50 @@
+prepare('
+ SELECT `post_id`, `post_title`, `post_text`, `post_published`
+ FROM `fm_blog_posts`
+ WHERE `post_id` = :id
+ AND `post_published` IS NOT NULL
+ AND `post_published` < CURRENT_TIMESTAMP
+ AND `post_deleted` IS NULL
+');
+$getBlogPost->bindValue('id', $postId);
+$getBlogPost->execute();
+$blogPost = $getBlogPost->fetch(PDO::FETCH_OBJ);
+
+if (empty($blogPost)) die('Couldn\'t find that post.');
+
+echo html_open()
+ . ''
+ . html_head($blogPost->post_title, HEAD_FLASHWAVE)
+ . ''
+ . html_navigation(NAV_FLASHWAVE)
+ . '
';
+
+?>
+
+
=$blogPost->post_title;?>
+ post_text);
+
+ foreach ($splitLines as $paragraph)
+ if(!empty($paragraph))
+ echo '
' . trim($paragraph) . '
';
+ ?>
+
Posted =$blogPost->post_published;?>
+
+'
+ . html_footer()
+ . ''
+ . html_close();
diff --git a/public/2019/index.php b/public/2019/index.php
new file mode 100644
index 0000000..1465324
--- /dev/null
+++ b/public/2019/index.php
@@ -0,0 +1,236 @@
+ 'fas fa-at',
+ 'title' => 'E-mail',
+ 'url' => 'mailto:me@flash.moe',
+ ],
+ [
+ 'icon' => 'fas fa-bolt',
+ 'title' => 'Flashii',
+ 'url' => 'https://flashii.net/profile.php?u=1',
+ ],
+ [
+ 'icon' => 'fab fa-github',
+ 'title' => 'Github',
+ 'url' => 'https://github.com/flashwave',
+ ],
+ [
+ 'icon' => 'fab fa-youtube',
+ 'title' => 'YouTube',
+ 'url' => 'https://youtube.com/c/flashwave',
+ ],
+ [
+ 'icon' => 'fab fa-twitch',
+ 'title' => 'Twitch',
+ 'url' => 'https://twitch.tv/flashwave0',
+ ],
+ [
+ 'icon' => 'fab fa-steam',
+ 'title' => 'Steam',
+ 'url' => 'https://steamcommunity.com/id/flashwave_',
+ ],
+ [
+ 'icon' => 'fab fa-twitter',
+ 'title' => 'Twitter',
+ 'url' => 'javascript:confirm(\'Proceed with caution.\') ? location.assign(\'https://twitter.com/smugwave\') : void(0);',
+ ],
+ [
+ 'icon' => 'fab fa-lastfm',
+ 'title' => 'last.fm',
+ 'url' => 'https://www.last.fm/user/flashwave_',
+ ],
+ [
+ 'icon' => 'fab fa-nintendo-switch',
+ 'title' => 'Switch',
+ 'url' => 'javascript:alert(\'SW-7446-8163-4902\');',
+ ],
+ [
+ 'icon' => 'fab fa-paypal',
+ 'title' => 'Donate',
+ 'url' => 'https://paypal.me/flashwave',
+ ],
+];
+
+$getBlogPosts = $pdo->prepare('
+ SELECT `post_id`, `post_title`, `post_text`, `post_published`
+ FROM `fm_blog_posts` AS bp
+ WHERE `post_published` IS NOT NULL
+ AND `post_published` < CURRENT_TIMESTAMP
+ AND `post_deleted` IS NULL
+ ORDER BY `post_published` DESC
+');
+$getBlogPosts->execute();
+$blogPosts = $getBlogPosts->fetchAll(PDO::FETCH_OBJ);
+
+echo html_open()
+ . ''
+ . html_head('flash.moe', HEAD_FLASHWAVE)
+ . '';
+
+if(html_old_ie())
+ echo '
';
+if(html_netscape())
+ echo '
';
+
+echo '
';
+?>
+
+
+
+
+
+
=$post->post_title;?>
+
=trim(explode("\n", $post->post_text)[0]);?>
+
Continue reading
+
Posted =$post->post_published;?>
+
+
+
+
+
+
+'
+ . html_footer()
+ . ''
+ . html_close();
diff --git a/public/2019/projects.php b/public/2019/projects.php
new file mode 100644
index 0000000..1eddc5f
--- /dev/null
+++ b/public/2019/projects.php
@@ -0,0 +1,82 @@
+'
+ . html_head('Projects', HEAD_FLASHWAVE)
+ . ''
+ . html_navigation(NAV_FLASHWAVE)
+ . '
';
+?>
+
+
+
+
+ prepare('
+ SELECT `project_id`, `project_name`, `project_summary`, `project_homepage`, `project_repository`, `project_forum`, `project_archived`
+ FROM `fm_projects`
+ WHERE `project_deleted` IS NULL
+ ORDER BY !ISNULL(`project_archived`), `project_order` DESC
+ ');
+ $getProjects->execute();
+ $projects = $getProjects->fetchAll(PDO::FETCH_OBJ);
+
+ $getLanguages = $pdo->prepare('
+ SELECT pl.`language_name`, pl.`language_colour`
+ FROM `fm_proglangs` AS pl
+ LEFT JOIN `fm_projects_proglangs` AS ppl
+ ON ppl.`language_id` = pl.`language_id`
+ WHERE ppl.`project_id` = :project_id
+ ORDER BY ppl.`priority`
+ ');
+
+ foreach ($projects as $project) {
+ $getLanguages->bindValue('project_id', $project->project_id);
+ $getLanguages->execute();
+ $languages = $getLanguages->fetchAll(PDO::FETCH_OBJ);
+
+ if(!$archived && !empty($project->project_archived)) {
+ $archived = true;
+ ?>
+
+
+
+
+
language_colour)) { echo sprintf(' style="background-color: %1$s; box-shadow: 0 0 3px %1$s;"', html_colour($languages[0]->language_colour)); } ?>>
+
+
=$project->project_name;?>
+
=trim($project->project_summary);?>
+
+
+
+
+ =$language->language_name;?>
+
+
+
+
+
+
+
+
+
+'
+ . html_footer()
+ . ''
+ . html_close();
diff --git a/public/2020/404.php b/public/2020/404.php
new file mode 100644
index 0000000..bbe0e9a
--- /dev/null
+++ b/public/2020/404.php
@@ -0,0 +1,29 @@
+
+
+
+ =html_charset();?>
+
404 Not Found
+ =html_stylesheet('2020.css');?>
+ =html_meta();?>
+
+
+
+ =html_sidebar();?>
+
+
404 - Page not found!
+
You either went to an invalid URL or this content has been deleted.
+
+
+
+ =html_script('/assets/fixpng.js');?>
+
+
+
diff --git a/public/2020/blog.php b/public/2020/blog.php
new file mode 100644
index 0000000..bea2c2f
--- /dev/null
+++ b/public/2020/blog.php
@@ -0,0 +1,73 @@
+prepare('
+ SELECT `post_id`, `post_title`, `post_text`, UNIX_TIMESTAMP(`post_published`) AS `post_published`, `post_safe`, `post_new_url`
+ FROM `fm_blog_posts`
+ WHERE `post_id` = :id
+ AND `post_published` IS NOT NULL
+ AND `post_published` < CURRENT_TIMESTAMP
+ AND `post_deleted` IS NULL
+');
+$getPost->bindValue('id', $postId);
+$post = $getPost->execute() ? $getPost->fetch(PDO::FETCH_OBJ) : false;
+
+if(html_default_mode() === FWH_JVDG && empty($post->post_safe))
+ unset($post);
+
+if(!empty($post)) {
+ $dateCustom = date('Y-m-d @ H:i:s T', $post->post_published);
+ $dateISO = date('c', $post->post_published);
+ $preview = trim(explode("\n", $post->post_text)[0]);
+ $title = $post->post_title;
+} else http_response_code(404);
+
+echo html_doctype();
+?>
+
+
+ =html_charset();?>
+
=$title ?? 'flash.moe';?>
+ =html_stylesheet('2020.css');?>
+ =html_meta();?>
+
+
+
+
+
+
+
Post not found!
+
You either went to an invalid URL or this post has been deleted.
+
+
+
+post_new_url)): ?>
+
This post has a new url, please go here instead!
+
+
=$post->post_title;?>
+
=$dateCustom;?>
+ post_text);
+
+ foreach ($splitLines as $paragraph)
+ if(!empty($paragraph))
+ echo '
' . trim($paragraph) . '
';
+ ?>
+
+
+
+
+ =html_script('/assets/fixpng.js');?>
+
+
+
diff --git a/public/2020/index.php b/public/2020/index.php
new file mode 100644
index 0000000..5241060
--- /dev/null
+++ b/public/2020/index.php
@@ -0,0 +1,95 @@
+prepare("
+ SELECT `post_id`, `post_title`, `post_text`, UNIX_TIMESTAMP(`post_published`) AS `post_published`
+ FROM `fm_blog_posts` AS bp
+ WHERE `post_published` IS NOT NULL
+ AND `post_published` < CURRENT_TIMESTAMP
+ AND `post_deleted` IS NULL
+ ORDER BY `post_published` DESC
+ ");
+ $posts = $getPosts->execute() ? $getPosts->fetchAll(PDO::FETCH_OBJ) : false;
+ $posts = $posts ? $posts : [];
+}
+
+if(isset($_GET['blog_dump'])) {
+ header('Content-Type: application/json; charset=utf-8');
+ echo json_encode($posts ?? []);
+ return;
+}
+
+echo html_doctype();
+?>
+
+
+ =html_charset();?>
+
=$_SERVER['HTTP_HOST'];?>
+ =html_stylesheet('2020.css');?>
+ =html_meta();?>
+
+
+
+
+
+
+
+
New blog script is still work in progress, enjoy the old version!
+
+
+
+
+
+
+
+
+
+
Blog
+
+post_text)[0]);
+ $dateCustom = date('Y-m-d @ H:i:s T', $post->post_published);
+ $dateISO = date('c', $post->post_published);
+
+ echo <<
+
+
{$dateCustom}
+
{$preview}
+
Continue reading
+
\r\n
+HTML;
+ }
+?>
+
+
+
+ =html_script('/assets/lastfm2020.js');?>
+
+ =html_script('/assets/fixpng.js');?>
+
+
+
+
+
+
diff --git a/public/2020/nintendo.php b/public/2020/nintendo.php
new file mode 100644
index 0000000..662aa2a
--- /dev/null
+++ b/public/2020/nintendo.php
@@ -0,0 +1,67 @@
+
+
+
+ =html_charset();?>
+
Nintendo Friend Codes
+ =html_stylesheet('2020.css');?>
+ =html_meta();?>
+
+
+
+ =html_sidebar();?>
+
+
+
List of my Nintendo friend codes so I don't have to dig them up every time. Please use these codes only if we know each other.
+
If you're adding me on 3DS you'll have to send me your friend code as well, use the contact links in the sidebar to do so.
+
+
+
+
+
Nintendo Switch
+
+
+ SW-7446-8163-4902
+
+
+
+
+
+
Nintendo 3DS
+
+
+ 4013-0352-0648
+
+
+
+
+
+
Nintendo Wii U
+
+
+ flashwave0
+
+
+
+
+
Below are friend codes for Nintendo WFC revival services, these will only be useful with modified consoles.
+
+
+
+
+
Mario Kart Wii (Wiimmfi)
+
+
+ 5202-9182-8404
+
+
+
+
+ =html_script('/assets/lastfm2020.js');?>
+
+
diff --git a/public/2020/projects.php b/public/2020/projects.php
new file mode 100644
index 0000000..0bc4d9c
--- /dev/null
+++ b/public/2020/projects.php
@@ -0,0 +1,177 @@
+prepare('
+ SELECT `project_id`, `project_name`, COALESCE(`project_name_clean`, REPLACE(LOWER(`project_name`), \' \', \'-\')) AS `project_name_clean`, `project_summary`, `project_description`, `project_featured`, `project_order`, `project_homepage`, `project_repository`, `project_forum`, UNIX_TIMESTAMP(`project_archived`) AS `project_archived`, `project_type`, UNIX_TIMESTAMP(`project_created`) AS `project_created`, `project_colour`
+ FROM `fm_projects`
+ WHERE `project_deleted` IS NULL
+ '. ($randomFeatured ? ' AND `project_featured` <> 0 ORDER BY RAND()' : 'ORDER BY `project_order` DESC')
+);
+$getProjects->execute();
+$projects = $getProjects->fetchAll(PDO::FETCH_OBJ);
+
+$activeProjects = [];
+$toolProjects = [];
+$archivedProjects = [];
+
+foreach($projects as $project) {
+ if(!empty($project->project_archived))
+ $archivedProjects[] = $project;
+ elseif($project->project_type === 'Tool')
+ $toolProjects[] = $project;
+ else
+ $activeProjects[] = $project;
+}
+
+$getLanguages = $pdo->prepare('
+ SELECT pl.`language_id`, pl.`language_name`, pl.`language_colour`
+ FROM `fm_proglangs` AS pl
+ LEFT JOIN `fm_projects_proglangs` AS ppl
+ ON ppl.`language_id` = pl.`language_id`
+ WHERE ppl.`project_id` = :project_id
+ ORDER BY ppl.`priority`
+');
+
+function fm_project_box(stdClass $project, array $languages): string {
+ $colour = html_colour(isset($languages[0]->language_colour) ? $languages[0]->language_colour : 0x212121);
+
+ $html = <<
+
+
{$project->project_name}
+
+
+
{$project->project_summary}
+
\r\n
+HTML;
+
+ $indent = ' ';
+
+ foreach($languages as $lang) {
+ $colour = html_colour($lang->language_colour);
+ $html .= "{$indent}
\r\n";
+ }
+
+ $html .= "{$indent}
\r\n";
+
+ $links = '';
+
+ if(!empty($project->project_homepage))
+ $links .= "
project_homepage}\"> Homepage \r\n";
+ if(!empty($project->project_repository))
+ $links .= "
project_repository}\"> Source \r\n";
+ if(!empty($project->project_forum))
+ $links .= "
project_forum}\"> Discussion \r\n";
+
+ if(!empty($links)) {
+ $html .= "{$indent}
\r\n";
+ $html .= "{$indent}{$links}";
+ $html .= "{$indent}
\r\n";
+ }
+
+ $html .= <<
+
\r\n
+HTML;
+
+ return $html;
+}
+
+if(isset($_GET['dump_that_shit'])) {
+ $doConvert = !isset($_GET['noconvert']);
+ $meow = [];
+ $projects = array_merge($activeProjects, $toolProjects, $archivedProjects);
+
+ foreach($projects as $project) {
+ if($doConvert) {
+ $projKeys = array_keys((array)$project);
+ foreach($projKeys as $key) {
+ $project->{substr($key, 8)} = $project->{$key};
+ unset($project->{$key});
+ }
+ }
+
+ $getLanguages->bindValue('project_id', $project->id ?? $project->project_id);
+ $getLanguages->execute();
+ $project->languages = $getLanguages->fetchAll(PDO::FETCH_OBJ);
+ if($doConvert) {
+ $langKeys = array_keys((array)$project->languages[0]);
+ for($i = 0; $i < count($project->languages); ++$i)
+ foreach($langKeys as $key) {
+ if(!isset($project->colour))
+ $project->colour = $project->languages[$i]->language_colour;
+ $project->languages[$i]->{substr($key, 9)} = $project->languages[$i]->{$key};
+ unset($project->languages[$i]->{$key});
+ }
+ }
+
+ if($randomFeatured || !$doConvert)
+ $meow[] = $project;
+ else {
+ $key = $project->archived ? 'archive' : strtolower($project->type);
+ $meow[$key][] = $project;
+ }
+ }
+
+ header('Content-Type: application/json; charset=utf-8');
+ echo json_encode($meow);
+ return;
+}
+
+echo html_doctype();
+?>
+
+
+ =html_charset();?>
+
Projects
+ =html_stylesheet('2020.css');?>
+ =html_meta();?>
+
+
+
+ =html_sidebar();?>
+
+
Active Projects
+
+bindValue('project_id', $project->project_id);
+ $getLanguages->execute();
+ $languages = $getLanguages->fetchAll(PDO::FETCH_OBJ);
+ echo fm_project_box($project, $languages);
+ }
+?>
+
+
+
+bindValue('project_id', $project->project_id);
+ $getLanguages->execute();
+ $languages = $getLanguages->fetchAll(PDO::FETCH_OBJ);
+ echo fm_project_box($project, $languages);
+ }
+?>
+
+
Archived Projects
+
+bindValue('project_id', $project->project_id);
+ $getLanguages->execute();
+ $languages = $getLanguages->fetchAll(PDO::FETCH_OBJ);
+ echo fm_project_box($project, $languages);
+ }
+?>
+
+
+
+
+ =html_script('/assets/fixpng.js');?>
+
+
+
diff --git a/public/404.php b/public/404.php
new file mode 100644
index 0000000..d24faec
--- /dev/null
+++ b/public/404.php
@@ -0,0 +1,2 @@
+\r\n"
+ : "\r\n";
+}
+
+function html_charset(string $charset = 'utf-8', ?int $version = null): string {
+ return html_old_browser()
+ ? "
\r\n"
+ : "
\r\n";
+}
+
+function html_stylesheet(string $name, array $params = [], ?int $version = null): string {
+ if(html_modern())
+ $cssFormat = '/css/%s';
+ else {
+ $cssFormat = '/css.php?path=%s';
+
+ if(empty($params['accent']))
+ $params['accent'] = html_default_mode() === FWH_JVDG ? '#2d9940' : '#4a3650';
+
+ if(!empty($params)) {
+ foreach($params as $key => $val)
+ $cssFormat .= '&' . rawurlencode($key) . '=' . str_replace('%', '%%', rawurlencode($val));
+ }
+ }
+
+ return "
\r\n";
+}
+
+function html_script(string $path, string $charset = 'utf-8', string $language = 'javascript', ?int $version = null): string {
+ if($path[0] === '/' && $path[1] !== '/')
+ $path = html_baseurl() . $path;
+
+ $html = "\r\n";
+}
+
+function html_meta(?int $version = null): string {
+ $meta = "
\r\n";
+
+ if(html_default_mode() === FWH_JVDG)
+ $meta .= " \r\n";
+
+ return $meta;
+}
+
+function html_open(?int $version = null): string {
+ return html_doctype($version) . (($version ?? html_default_ver()) < FWH_2020 ? "" : '');
+}
+
+function html_close(?int $version = null): string {
+ return ($version ?? html_default_ver()) < FWH_2020 ? "" : '';
+}
+
+function html_head(string $title, array $vars = [], ?int $version = null): string {
+ $version = $version ?? html_default_ver();
+ $accentColour = $vars['accent_colour'] ?? '#555';
+ $html = html_charset();
+
+ $html .= "
{$title} ";
+
+ if($version < FWH_2020) {
+ $trackingCode = html_default_mode() === FWH_JVDG ? 'KyPpMvk2vNGq' : 'w4PqjBGmOL5l';
+ $html .= <<
+ var _paq = window._paq || [];
+ _paq.push(['disableCookies']);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ _paq.push(['setTrackerUrl', '//uiharu.railgun.sh/mtm']);
+ _paq.push(['setSiteId', '{$trackingCode}']);
+ var g = document.createElement('script');
+ g.type = 'text/javascript'; g.async = true;
+ g.defer = true; g.src = '//uiharu.railgun.sh/mtm.js';
+ document.head.appendChild(g);
+ })();
+
+HTML;
+ }
+
+ switch ($version) {
+ case FWH_2016:
+ return $html . html_stylesheet('2016.css', ['accent' => $accentColour], $version) . html_meta($version);
+
+ case FWH_2019:
+ $html .= html_stylesheet('2019.css', ['accent' => $accentColour], $version);
+
+ if (!empty($vars['transitional']))
+ $html .= html_stylesheet('2016-lite.css', ['accent' => $accentColour], $version);
+
+ $html .= html_meta($version);
+
+ if(html_modern()) {
+ $html .= <<
+ :root {
+ --accent-colour: {$accentColour};
+ }
+
+HTML;
+ }
+
+ return $html;
+ }
+
+ return '';
+}
+
+function html_navigation(array $navigation, array $vars = [], ?int $version = null): string {
+ $home = html_local_url($navigation[0]['link'] ?? $vars['link'] ?? '/');
+
+ if(html_old_browser()) {
+ $title = !empty($vars['title1']) ? ($vars['title1'] . ($vars['title2'] ?? '')) : $vars['title'] ?? 'flashwave';
+ $html = '
' . $title . ' ';
+
+ foreach ($navigation as $item) {
+ $item['link'] = html_local_url($item['link']);
+ $html .= "{$item['title']} ";
+ }
+
+ return $html . '
';
+ }
+
+ switch ($version ?? html_default_ver()) {
+ case FWH_2016:
+ $title = $vars['title'] ?? 'flash.moe';
+
+ $html = <<
+ \r\n
+HTML;
+ else $html .= '
';
+
+ $trackingCode = $isJvdg ? 'KyPpMvk2vNGq' : 'w4PqjBGmOL5l';
+ $html .= <<
+ var _paq = window._paq || [];
+ _paq.push(['disableCookies']);
+ _paq.push(['trackPageView']);
+ _paq.push(['enableLinkTracking']);
+ (function() {
+ _paq.push(['setTrackerUrl', '//uiharu.railgun.sh/mtm']);
+ _paq.push(['setSiteId', '{$trackingCode}']);
+ var g = document.createElement('script');
+ g.type = 'text/javascript'; g.async = true;
+ g.defer = true; g.src = '//uiharu.railgun.sh/mtm.js';
+ document.head.appendChild(g);
+ })();
+ \r\n
+HTML;
+
+ return $html;
+}
diff --git a/public/_v4/includes.php b/public/_v4/includes.php
new file mode 100644
index 0000000..b4188a6
--- /dev/null
+++ b/public/_v4/includes.php
@@ -0,0 +1,58 @@
+ PDO::CASE_NATURAL,
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
+ PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
+ PDO::ATTR_STRINGIFY_FETCHES => false,
+ PDO::ATTR_EMULATE_PREPARES => false,
+ PDO::MYSQL_ATTR_INIT_COMMAND => "
+ SET SESSION
+ sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION',
+ time_zone = '+00:00';
+ ",
+ ]);
+} catch(Exception $ex) {
+ echo '
Unable to connect to database ';
+ die($ex->getMessage());
+}
+
+define('HEAD_FLASHWAVE', [
+ 'accent_colour' => '#4a3650',
+]);
+define('HEAD_ERROR', [
+ 'accent_colour' => '#960018',
+]);
+define('HEAD_BLOG', [
+ 'accent_colour' => '#4a3650',
+ 'transitional' => true,
+]);
+define('HEAD_WHOIS', [
+ 'accent_colour' => '#555',
+ 'transitional' => true,
+]);
+
+define('NAV_FLASHWAVE', [
+ ['title' => 'Home', 'link' => '/'],
+ ['title' => 'Projects', 'link' => '/projects.php'],
+]);
+define('NAV_ERROR', [
+ ['title' => 'Retry', 'link' => $_SERVER['REQUEST_URI']],
+ ['title' => 'Home', 'link' => '/'],
+]);
+define('NAV_WHOIS', NAV_FLASHWAVE);
diff --git a/public/aiko/Release.zip b/public/aiko/Release.zip
new file mode 100644
index 0000000..249bb6e
Binary files /dev/null and b/public/aiko/Release.zip differ
diff --git a/public/aiko/index.php b/public/aiko/index.php
new file mode 100644
index 0000000..3090de5
--- /dev/null
+++ b/public/aiko/index.php
@@ -0,0 +1,20 @@
+
Aiko
+
Home -
+
Source
+
+
Aiko is a thing that can run 6502 code.
+
Download for .NET Framework 4.7.2 (will go down when a proper download page exists)
+
diff --git a/public/ascii.php b/public/ascii.php
new file mode 100644
index 0000000..fe2c888
--- /dev/null
+++ b/public/ascii.php
@@ -0,0 +1,420 @@
+
+
+
+
+
+
US-ASCII Table
+
+
+
+
+
+
+
+
+
+
+ Type printable
for all printable characters, or control
for all control characters.
+
+
+
$info):
+ $isPrintable = ($code > 31 && $code < 127);
+ $print = $isPrintable ? chr($code) : $info[1];
+ $attrs = ['data-key-code' => $code, 'data-key-desc' => $info[0], 'data-key-print' => $print, 'data-copy' => $print];
+ $attrStr = '';
+
+ if($isPrintable && isset($info[1]))
+ $attrs['data-key-html'] = $info[1];
+
+ foreach($attrs as $name => $value)
+ $attrStr .= $name . '="' . htmlentities($value) . '" ';
+ ?>
>
+
=$print;?>
+
=$info[0];?>
+
+
+
+
Octal
+
=decoct($code);?>
+
+
+
Hex
+
=dechex($code);?>
+
+
+
+
HTML
+
&=$attrs['data-key-html'];?>;
+
+
+
+
+
+
+
+
diff --git a/public/assets/Electrolize-Regular.ttf b/public/assets/Electrolize-Regular.ttf
new file mode 100644
index 0000000..ace9ba2
Binary files /dev/null and b/public/assets/Electrolize-Regular.ttf differ
diff --git a/public/assets/NotoSans-Regular.ttf b/public/assets/NotoSans-Regular.ttf
new file mode 100644
index 0000000..79a438a
Binary files /dev/null and b/public/assets/NotoSans-Regular.ttf differ
diff --git a/public/assets/NotoSansJP-Regular.otf b/public/assets/NotoSansJP-Regular.otf
new file mode 100644
index 0000000..de78e6d
Binary files /dev/null and b/public/assets/NotoSansJP-Regular.otf differ
diff --git a/public/assets/SMS-JBIOS-Demo.mid b/public/assets/SMS-JBIOS-Demo.mid
new file mode 100644
index 0000000..d88f6c9
Binary files /dev/null and b/public/assets/SMS-JBIOS-Demo.mid differ
diff --git a/public/assets/Splatoon1.otf b/public/assets/Splatoon1.otf
new file mode 100644
index 0000000..13050f4
Binary files /dev/null and b/public/assets/Splatoon1.otf differ
diff --git a/public/assets/Splatoon2.otf b/public/assets/Splatoon2.otf
new file mode 100644
index 0000000..9153359
Binary files /dev/null and b/public/assets/Splatoon2.otf differ
diff --git a/public/assets/fixpng.js b/public/assets/fixpng.js
new file mode 100644
index 0000000..5d17cd7
--- /dev/null
+++ b/public/assets/fixpng.js
@@ -0,0 +1,10 @@
+/*@if (@_jscript_version >= 5.5)
+for(i = 0; i < document.images.length; i++) {
+ var s = document.images[i].src;
+ if(s.indexOf('.png') > 0) {
+ document.images[i].src = '/assets/pixel.gif';
+ document.images[i].style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + s + '\', sizingMethod=\'scale\')';
+ }
+}
+@end
+*/
\ No newline at end of file
diff --git a/public/assets/icons/email.png b/public/assets/icons/email.png
new file mode 100644
index 0000000..acd9f43
Binary files /dev/null and b/public/assets/icons/email.png differ
diff --git a/public/assets/icons/flashii.png b/public/assets/icons/flashii.png
new file mode 100644
index 0000000..1a48eb0
Binary files /dev/null and b/public/assets/icons/flashii.png differ
diff --git a/public/assets/icons/github.png b/public/assets/icons/github.png
new file mode 100644
index 0000000..df6cf75
Binary files /dev/null and b/public/assets/icons/github.png differ
diff --git a/public/assets/icons/icon-small.psd b/public/assets/icons/icon-small.psd
new file mode 100644
index 0000000..106df47
Binary files /dev/null and b/public/assets/icons/icon-small.psd differ
diff --git a/public/assets/icons/icon.psd b/public/assets/icons/icon.psd
new file mode 100644
index 0000000..ab4a691
Binary files /dev/null and b/public/assets/icons/icon.psd differ
diff --git a/public/assets/icons/lastfm.png b/public/assets/icons/lastfm.png
new file mode 100644
index 0000000..7413af4
Binary files /dev/null and b/public/assets/icons/lastfm.png differ
diff --git a/public/assets/icons/ninswitch.png b/public/assets/icons/ninswitch.png
new file mode 100644
index 0000000..3e9e1a2
Binary files /dev/null and b/public/assets/icons/ninswitch.png differ
diff --git a/public/assets/icons/paypal.png b/public/assets/icons/paypal.png
new file mode 100644
index 0000000..d9ad9eb
Binary files /dev/null and b/public/assets/icons/paypal.png differ
diff --git a/public/assets/icons/s-code.png b/public/assets/icons/s-code.png
new file mode 100644
index 0000000..f59598e
Binary files /dev/null and b/public/assets/icons/s-code.png differ
diff --git a/public/assets/icons/s-forum.png b/public/assets/icons/s-forum.png
new file mode 100644
index 0000000..54b8725
Binary files /dev/null and b/public/assets/icons/s-forum.png differ
diff --git a/public/assets/icons/s-home.png b/public/assets/icons/s-home.png
new file mode 100644
index 0000000..4754411
Binary files /dev/null and b/public/assets/icons/s-home.png differ
diff --git a/public/assets/icons/steam.png b/public/assets/icons/steam.png
new file mode 100644
index 0000000..e47955a
Binary files /dev/null and b/public/assets/icons/steam.png differ
diff --git a/public/assets/icons/twitch.png b/public/assets/icons/twitch.png
new file mode 100644
index 0000000..9c7afe3
Binary files /dev/null and b/public/assets/icons/twitch.png differ
diff --git a/public/assets/icons/twitter.png b/public/assets/icons/twitter.png
new file mode 100644
index 0000000..edf4036
Binary files /dev/null and b/public/assets/icons/twitter.png differ
diff --git a/public/assets/icons/youtube.png b/public/assets/icons/youtube.png
new file mode 100644
index 0000000..2acbef4
Binary files /dev/null and b/public/assets/icons/youtube.png differ
diff --git a/public/assets/lastfm2020.js b/public/assets/lastfm2020.js
new file mode 100644
index 0000000..3a65eec
--- /dev/null
+++ b/public/assets/lastfm2020.js
@@ -0,0 +1,93 @@
+function createXHR() {
+ if (window.XMLHttpRequest) {
+ return new XMLHttpRequest();
+ } else if (window.ActiveXObject) {
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP");
+ } catch (e) {
+ try {
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (e) {}
+ }
+ }
+
+ return null;
+}
+
+function getNowListening(username, cb) {
+ var xhr = createXHR();
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState !== 4)
+ return;
+
+ var xml = null;
+
+ if(window.DOMParser) {
+ var parser = new DOMParser();
+ xml = parser.parseFromString(xhr.responseText, 'text/xml');
+ } else {
+ xml = new ActiveXObject('Microsoft.XMLDOM');
+ xml.async = 'false';
+ xml.loadXML(xhr.responseText);
+ xml = xml.childNodes[1];
+ }
+
+ cb(xml.getElementsByTagName('Track')[0]);
+ };
+ xhr.open('GET', '/np.php?t=' + (new Date().getTime()) + '&u=' + username, true);
+ xhr.send();
+}
+
+function getNodeText(node) {
+ if (typeof node.textContent === 'undefined') {
+ return node.text;
+ } else {
+ return node.textContent;
+ }
+}
+
+function setNodeText(node, text) {
+ if (typeof node.textContent === 'undefined') {
+ node.innerText = text;
+ } else {
+ node.textContent = text;
+ }
+}
+
+function setNowListening(track) {
+ var cover = document.getElementById('music-cover'),
+ title = document.getElementById('music-title'),
+ artist = document.getElementById('music-artist'),
+ header = document.getElementById('music-header'),
+ content = document.getElementById('music'),
+ coverUrl = getNodeText(track.getElementsByTagName('Medium')[0]);
+
+ if (content.className.indexOf('hidden') >= 0)
+ content.className = content.className.replace('hidden', '');
+
+ setNodeText(header, getNodeText(track.getElementsByTagName('IsPlaying')[0]) != '0' ? 'Listening to' : 'Last listened to');
+ cover.src = coverUrl.length < 1 ? '//now.flash.moe/resources/no-cover.png' : coverUrl.replace('/64s/', '/100s/').replace('https:', '');
+ setNodeText(title, getNodeText(track.getElementsByTagName('Name')[0]));
+ title.href = getNodeText(track.getElementsByTagName('Url')[0]);
+ setNodeText(artist, getNodeText(track.getElementsByTagName('Name')[1]));
+ artist.href = title.href.substring(0, title.href.indexOf('/_/'));
+}
+
+window.onload = function() {
+ var lastFmUsername = '',
+ lastFmFind = '//www.last.fm/user/';
+
+ var links = document.getElementsByTagName('a');
+ for (var i = 0; i < links.length; i++) {
+ var indexOf = links[i].href.indexOf(lastFmFind);
+ if(indexOf > -1) {
+ lastFmUsername = links[i].href.substring(indexOf + lastFmFind.length);
+ break;
+ }
+ }
+
+ if(lastFmUsername) {
+ setInterval(function() { getNowListening(lastFmUsername, function(track) { setNowListening(track); }); }, 60000);
+ getNowListening(lastFmUsername, function(track) { setNowListening(track); });
+ }
+};
\ No newline at end of file
diff --git a/public/assets/misaka-2.png b/public/assets/misaka-2.png
new file mode 100644
index 0000000..a584b31
Binary files /dev/null and b/public/assets/misaka-2.png differ
diff --git a/public/assets/pixel.gif b/public/assets/pixel.gif
new file mode 100644
index 0000000..35d42e8
Binary files /dev/null and b/public/assets/pixel.gif differ
diff --git a/public/bateman.txt b/public/bateman.txt
new file mode 100644
index 0000000..8660e39
--- /dev/null
+++ b/public/bateman.txt
@@ -0,0 +1 @@
+Do ya like Hewey Lewis and The News? Their early work was a little too "new-wave" for my taste, but when Sports came out in 83, I think they really came into their own - both commercially and artistically. The whole album has a clear, crisp sound, and a new sheen of consummate professionalism that really gives the songs...A big boost. He's been compared to Elvis Costello, but I think Huey has a far more bitter, cynical sense of humour. In 87, Huey released this, fore, their most accomplished album. I think their undisputed masterpiece is "Hip To Be Square", a song so catchy, most people probably don't listen to the lyrics. But they should! Because it's NOT just about the pleasures of conformity and the importance of trends! It's also a personal statement about the band itself!
\ No newline at end of file
diff --git a/public/chat/.htaccess b/public/chat/.htaccess
new file mode 100644
index 0000000..b59770a
--- /dev/null
+++ b/public/chat/.htaccess
@@ -0,0 +1,7 @@
+RewriteEngine on
+Options +FollowSymLinks
+Options -Indexes
+RewriteRule ^logs$ index.php?view=logs
+RewriteRule ^mobile$ index.php?view=mobile
+RewriteRule ^chat$ index.php
+RewriteRule ^desktop$ index.php
\ No newline at end of file
diff --git a/public/chat/FABridge.swf b/public/chat/FABridge.swf
new file mode 100644
index 0000000..1894cf4
Binary files /dev/null and b/public/chat/FABridge.swf differ
diff --git a/public/chat/css/Black.ajaxchat.css b/public/chat/css/Black.ajaxchat.css
new file mode 100644
index 0000000..df8e554
--- /dev/null
+++ b/public/chat/css/Black.ajaxchat.css
@@ -0,0 +1,98 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+@import url('meta.modern.ajaxchat.css');
+
+@media screen,projection,handheld {
+
+ /* Buttons */
+ #content #bbCodeContainer input, #content #logoutChannelContainer input, #content #submitButton, #loginForm #loginButton {
+ background-color:#000;
+ color:#f0f0f0;
+ border: 1px solid #808080;
+ background-image: linear-gradient(to bottom, #222, #000);
+ }
+ #content select, #loginForm select, #loginForm input, #content textarea {
+ background-color:#000;
+ color:#fafafa;
+ border: 1px solid #808080;
+ }
+
+ /* Status Icon */
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+
+ /* Other Theme Elements */
+ #loginContent {
+ background-color:#000;
+ color:#FFF;
+ }
+ #loginContent h1 {
+ color:#FFF;
+ }
+ #loginContent a {
+ color:#FFF;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+ #content {
+ background-color:#000;
+ color:#FFF;
+ }
+ #content h1 {
+ color:#FFF;
+ }
+ #content a {
+ color:#FFF;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer, #content textarea {
+ border-color:gray;
+ background-color:#000;
+ }
+ #content #colorCodesContainer a {
+ border-color:black;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color:#212121;
+ }
+ #content .rowOdd {
+ background-color:#000;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color:#212121;
+ color:#FFF;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/Blue.ajaxchat.css b/public/chat/css/Blue.ajaxchat.css
new file mode 100644
index 0000000..5c3c3b5
--- /dev/null
+++ b/public/chat/css/Blue.ajaxchat.css
@@ -0,0 +1,106 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ *
+ * Blue Style by nookls
+ * nookls.org
+ */
+
+@import url('meta.modern.ajaxchat.css');
+
+@media screen,projection,handheld {
+
+ /* Buttons */
+ #content #bbCodeContainer input, #content #logoutChannelContainer input, #content #submitButton, #loginForm #loginButton {
+ background-color:#002545;
+ color:#f0f0f0;
+ border: 1px solid #808080;
+ background-image: linear-gradient(to bottom, #002545, #000);
+ background-image: -webkit-linear-gradient(top, #002545, #000);
+ }
+ #content select, #loginForm select, #loginForm input, #content textarea {
+ background-color:#002545;
+ color:#fafafa;
+ border: 1px solid #808080;
+ }
+
+ /* Status Icon */
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+
+ /* Other Theme Elements */
+ #loginContent {
+ background-color:#000;
+ color:#FFF;
+ }
+ #loginContent {
+ background-color:#002545;
+ color:#FFF;
+ }
+ #loginContent h1 {
+ color:#FFF;
+ }
+ #loginContent a {
+ color:#FFF;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#002545;
+ color:#FFF;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+ #content {
+ background-color:#002545;
+ color:#FFF;
+ }
+ #content h1 {
+ color:#FFF;
+ }
+ #content a {
+ color:#FFF;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer, #content textarea {
+ border-color:#003D8E;
+ background-color:#002545;
+ }
+ #content #colorCodesContainer a {
+ border-color:#003D8E;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color:#0D355D;
+ }
+ #content .rowOdd {
+ background-color:#002545;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color:#0D355D;
+ color:#FFF;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/Halext.ajaxchat.css b/public/chat/css/Halext.ajaxchat.css
new file mode 100644
index 0000000..dbf92bb
--- /dev/null
+++ b/public/chat/css/Halext.ajaxchat.css
@@ -0,0 +1,108 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ * This style is made by freakyfurball\moegami
+ * http://zeniea.com/
+*/
+
+@import url('meta.legacy.ajaxchat.css');
+
+/*
+* Colors
+*/
+
+@media screen,projection,handheld {
+
+ #loginContent {
+ background-color: #000000;
+ background-image: -linear-gradient(to bottom, #4c3b52, #000000);
+ color: #999999;
+ }
+ #loginContent h1 {
+ color: #98ba8c;
+ }
+ #loginContent a {
+ color: #9775a3;
+ }
+ #loginContent input, #loginContent select {
+ background-color: #312634;
+ color: 9775a3;
+ }
+ #loginContent #loginFormContainer #loginButton {
+ background-color: #312634;
+ color: #9775a3;
+ }
+ #loginContent #errorContainer {
+ color: red;
+ }
+
+ #content {
+ background-color: #000000;
+ background-image: linear-gradient(to bottom, #4c3b52, #000000);
+ color: #999999;
+ }
+ #content h1 {
+ color: #FFFFFF;
+ }
+ #content a {
+ color: #9775a3;
+ }
+ #content input, #content select, #content textarea {
+ background-color: #312634;
+ color: #999999;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #bbCodeContainer, #content #colorCodesContainer, #content #emoticonsContainer {
+ border-color: gray;
+ background-color: #231b26;
+ }
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+ #content #bbCodeContainer input, #content #logoutButton, #content #submitButton {
+ background-color: #312634;
+ color: #999999;
+ }
+ #content #colorCodesContainer a {
+ border-color: #312634;
+ }
+ #content #optionsContainer input {
+ background-color: transparent;
+ }
+ #content .rowEven {
+ background-color: #312634;
+ }
+ #content .rowOdd {
+ background-color: #4c3b52;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color: red;
+ }
+ #content #chatList a {
+ color: #9775a3;
+ }
+ #content #chatList .delete {
+ background: url('../images/delete.png') no-repeat right;
+ }
+ #content #chatList .deleteSelected {
+ border-color: red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color: #312634;
+ color: #999999;
+ }
+ #content #settingsContainer #settingsList input.playback {
+ background: url('../images/playback.png') no-repeat;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/Legacy.ajaxchat.css b/public/chat/css/Legacy.ajaxchat.css
new file mode 100644
index 0000000..c27ade7
--- /dev/null
+++ b/public/chat/css/Legacy.ajaxchat.css
@@ -0,0 +1,104 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+@import url('meta.legacy.ajaxchat.css');
+
+/*
+ * Colors
+ */
+
+@media screen,projection,handheld {
+
+ #loginContent {
+ background-color:#000;
+ color:#FFF;
+ }
+ #loginContent h1 {
+ color:#FFF;
+ }
+ #loginContent a {
+ color:#FFF;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #loginContent #loginFormContainer #loginButton {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+
+ #content {
+ background-color:#000;
+ color:#FFF;
+ }
+ #content h1 {
+ color:#FFF;
+ }
+ #content a {
+ color:#FFF;
+ }
+ #content input, #content select, #content textarea {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #bbCodeContainer, #content #colorCodesContainer, #content #emoticonsContainer {
+ border-color:gray;
+ background-color:#000;
+ }
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+ #content #bbCodeContainer input, #content #logoutButton, #content #submitButton {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #content #colorCodesContainer a {
+ border-color:black;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color:#212121;
+ }
+ #content .rowOdd {
+ background-color:#000;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .delete {
+ background:url('../images/delete.png') no-repeat right;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #content #settingsContainer #settingsList input.playback {
+ background:url('../images/playback.png') no-repeat;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/Mio.ajaxchat.css b/public/chat/css/Mio.ajaxchat.css
new file mode 100644
index 0000000..a60cdcb
--- /dev/null
+++ b/public/chat/css/Mio.ajaxchat.css
@@ -0,0 +1,108 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ * Style by Flashwave for Flashii.net
+ */
+
+@import url('meta.legacy.ajaxchat.css');
+
+/*
+ * Colors
+ */
+
+@media screen,projection,handheld {
+
+ #loginContent {
+ background-color: #FBEEFF;
+ color: #000;
+ background-image: url('../images/fade-purple.png');
+ background-repeat: repeat-x;
+ }
+ #loginContent h1 {
+ color: #000;
+ }
+ #loginContent a {
+ color: #000;
+ }
+ #userNameField, #passwordField {
+ padding: 2px 4px 3px 4px;
+ border: 1px solid #AAA;
+ outline: none;
+ font-family: arial,helvetica,sans-serif;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+
+ #content {
+ background-color: #FBEEFF;
+ color: #000;
+ background-image: url('../images/fade-purple.png');
+ background-repeat: repeat-x;
+ }
+ #content h1 {
+ color:#306;
+ }
+ #content a {
+ color:#000;
+ }
+ #content textarea {
+ border: 1px solid #AAA;
+ outline: none;
+ font-family: arial,helvetica,sans-serif;
+ color:#000;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #bbCodeContainer, #content #colorCodesContainer, #content #emoticonsContainer {
+ border: 1px solid #9475B2;
+ }
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+ #content #colorCodesContainer a {
+ border: 1px solid #9475B2;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color: #C9BBCC;
+ }
+ #content .rowOdd {
+ background-color: #FBEEFF;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .delete {
+ background:url('../images/delete.png') no-repeat right;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color: #9475B2;
+ color: #306;
+ }
+ #content #settingsContainer #settingsList input.playback {
+ background:url('../images/playback.png') no-repeat;
+ }
+
+ #content .user {
+ color: #000;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/Nico.ajaxchat.css b/public/chat/css/Nico.ajaxchat.css
new file mode 100644
index 0000000..7cc5343
--- /dev/null
+++ b/public/chat/css/Nico.ajaxchat.css
@@ -0,0 +1,136 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+@import url('meta.modern.ajaxchat.css');
+
+@media screen,projection,handheld {
+
+ /* Buttons */
+ #content #bbCodeContainer input, #content #logoutChannelContainer input, #content #submitButton, #loginForm #loginButton {
+ background-color:#000;
+ color:#f0f0f0;
+ border: 1px solid #808080;
+ background-image: linear-gradient(to bottom, #110033, #000000);
+ background-image: -webkit-linear-gradient(top, #110033, #000000);
+ }
+ #loginContent #loginButton {
+ background-color:#000;
+ color:#f0f0f0;
+ border: 1px solid #808080;
+ background-image: linear-gradient(to bottom, #110033, #000000);
+ background-image: -webkit-linear-gradient(top, #110033, #000000);
+ }
+ #loginContent input {
+ background-color:#000;
+ color:#f0f0f0;
+ border: 1px solid #808080;
+ }
+ #content select, #loginForm select, #loginForm input, #content textarea {
+ background-color:#000;
+ color:#fafafa;
+ border: 1px solid #808080;
+ }
+
+ /* Status Icon */
+ #content #statusIconContainer {
+ width: 25px;
+ height: 26px;
+ }
+ #content .statusContainerOff {
+ background-image: url('../images/linkgood.gif');
+ }
+ #content .statusContainerOn {
+ background-image: url('../images/linkyellow.gif');
+ }
+ #content .statusContainerAlert {
+ background-image: url('../images/linkbad.gif');
+ }
+
+ /* Other Theme Elements */
+ #loginContent {
+ background-color:#000;
+ background-image:url('../images/pclouds.jpg');
+ color:#FFF;
+ }
+ #loginContent h1 {
+ color:#FFF;
+ }
+ #loginContent a {
+ color:#FFF;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+ #content {
+ background-color:#000;
+ background-image:url('../images/pclouds.jpg');
+ color:#FFF;
+ }
+ #content h1 {
+ color:#FFF;
+ }
+ #content a {
+ color:#FFF;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer, #content textarea {
+ border-color:gray;
+ background-color:transparent;
+ }
+ #content #colorCodesContainer a {
+ border-color:black;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+
+ }
+ #content .rowOdd {
+
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ color:#FFF;
+ }
+
+ /* Username colors
+ #content .guest {
+ color: #FF9999;
+ }
+ #content .user {
+ color: #FFFFFF;
+ }
+ #content .moderator {
+ color: #AA0000;
+ }
+ #content .admin {
+ color: #9900CC;
+ }
+ #content .chatBot {
+ color: #9E8DA7;
+ }
+ #content .purple {
+ color: #FF9900;
+ }
+ #content .cmod {
+ color: #0033FF;
+ }*/
+}
\ No newline at end of file
diff --git a/public/chat/css/Terminal.ajaxchat.css b/public/chat/css/Terminal.ajaxchat.css
new file mode 100644
index 0000000..876a868
--- /dev/null
+++ b/public/chat/css/Terminal.ajaxchat.css
@@ -0,0 +1,129 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+@import url('meta.legacy.ajaxchat.css');
+@import url('meta.terminal.ajaxchat.css');
+
+@media screen,projection,handheld {
+
+ /* Buttons */
+ #content #bbCodeContainer input, #content input, #content #submitButton, #loginForm #loginButton {
+ background-color:#000;
+ color:#00ff2b;
+ border: 1px solid #00ff2b;
+ font-family:monospace;
+ }
+ #content select, #loginForm select, #loginForm input, #content textarea {
+ background-color:#000;
+ color:#00ff2b;
+ border: 1px solid #00ff2b;
+ font-family:monospace;
+ }
+
+ /* Status Icon */
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+
+ /* Other Theme Elements */
+ #loginContent {
+ background-color:#000;
+ color:#FFF;
+ }
+ #loginContent h1 {
+ color:#FFF;
+ }
+ #loginContent a {
+ color:#FFF;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+ #content {
+ background-color:#000;
+ color:#00ff2b;
+ }
+ #content h1 {
+ color:#00ff2b;
+ }
+ #content a {
+ color:#00ff2b;
+ }
+ #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer, #content textarea {
+ border-color:#00ff2b;
+ background-color:#000;
+ }
+
+ #content #chatList {
+ color:#00ff2b;
+ }
+
+ #content #colorCodesContainer a {
+ border-color:black;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color:#000;
+ }
+ #content .rowOdd {
+ background-color:#000;
+ }
+ #content .guest {
+ text-shadow:0px 0px 5px gray;
+ }
+ #content .user {
+ text-shadow:0px 0px 5px #FFF;
+ }
+ #content .moderator {
+ text-shadow:0px 0px 5px #0A0;
+ }
+ #content .admin {
+ text-shadow:0px 0px 5px #A00;
+ }
+ #content .chatBot, #content .bots {
+ text-shadow:0px 0px 5px #9E8DA7;
+ }
+ #content .purple {
+ text-shadow:0px 0px 5px #824CA0;
+ }
+ #content .cmod {
+ text-shadow:0px 0px 5px #09F;
+ }
+ #content .donator {
+ text-shadow:0px 0px 5px #EE9400;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color:#000;
+ color:#00ff2b;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/White.ajaxchat.css b/public/chat/css/White.ajaxchat.css
new file mode 100644
index 0000000..d4ca491
--- /dev/null
+++ b/public/chat/css/White.ajaxchat.css
@@ -0,0 +1,111 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ *
+ * Color palette inspired by phpBB style "prosilver":
+ * http://www.phpbb.com/
+ */
+
+@import url('meta.legacy.ajaxchat.css');
+
+/*
+ * Colors
+ */
+
+@media screen,projection,handheld {
+
+ #loginContent {
+ background-color:#F9F9F9;
+ color:#28313F;
+ }
+ #loginContent h1 {
+ color:#333333;
+ }
+ #loginContent a {
+ color:#333333;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#FFF;
+ color:#333333;
+ }
+ #loginContent #loginFormContainer #loginButton {
+ background-color:#F7F5F1;
+ color:#333333;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+
+ #content {
+ background-color:#F9F9F9;
+ color:#28313F;
+ }
+ #content h1 {
+ color:#333333;
+ }
+ #content a {
+ color:#333333;
+ }
+ #content input, #content select, #content textarea {
+ background-color:#FFF;
+ color:#333333;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #bbCodeContainer, #content #colorCodesContainer, #content #emoticonsContainer {
+ border-color:#105289;
+ background-color:#FFF;
+ }
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+ #content #bbCodeContainer input, #content #logoutButton, #content #submitButton {
+ background-color:#F7F5F1;
+ color:#333333;
+ }
+ #content #colorCodesContainer a {
+ border-color:black;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color:#E1EBF2;
+ }
+ #content .rowOdd {
+ background-color:#ECF3F7;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#D31141;
+ }
+ #content #chatList .delete {
+ background:url('../images/delete.png') no-repeat right;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color:#E1EBF2;
+ color:#105289;
+ }
+ #content #settingsContainer #settingsList input.playback {
+ background:url('../images/playback.png') no-repeat;
+ }
+
+ #content .user {
+ color: #000;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/chatlogin.css b/public/chat/css/chatlogin.css
new file mode 100644
index 0000000..f9631e8
--- /dev/null
+++ b/public/chat/css/chatlogin.css
@@ -0,0 +1,69 @@
+h1, h3 {
+ font-weight: 100;
+ margin: 0px;
+}
+
+h1 {
+ font-size: 3em;
+ text-shadow: 0px 0px .5em #F1F1F1;
+}
+
+h3 {
+ display: inline-block;
+ box-shadow: 0px 0px .5em #700;
+ min-width: 300px;
+ font-size: 15px;
+ padding: 2px;
+ margin: 10px;
+ background: linear-gradient(180deg, #900, #600) #700;
+}
+
+div.copyright {
+ font-size: 12px;
+ color: #CCC;
+}
+
+form {
+ margin: 10px;
+}
+
+form input[type="text"], form input[type="password"] {
+ height: 18px;
+ width: 288px;
+}
+
+form input[type="text"] {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+}
+
+form input[type="submit"] {
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ background: #404;
+ box-shadow: 0px 0px 1em #707 inset;
+ color: #FFF;
+ font-weight: 700;
+ border-color: #808;
+}
+
+form *:not(option) {
+ height: 30px;
+ display: block;
+ margin: 1px auto;
+ width: 300px;
+ padding: 5px;
+ border: 1px #888 solid;
+ background: transparent;
+ box-shadow: 0px 0px 1em #888 inset
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+ transition: text-shadow .2s;
+}
+
+a:hover {
+ text-shadow: 0px 0px 1em #F1F1F1;
+}
\ No newline at end of file
diff --git a/public/chat/css/meta.legacy.ajaxchat.css b/public/chat/css/meta.legacy.ajaxchat.css
new file mode 100644
index 0000000..6b9d82d
--- /dev/null
+++ b/public/chat/css/meta.legacy.ajaxchat.css
@@ -0,0 +1,486 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+/* Import Username and Text colour CSS file */
+@import url('textcolours.ajaxchat.css');
+
+/* Nigger Rig word-wrap fix */
+* {
+ word-wrap: break-word !important;
+}
+
+/*
+ * Borders
+ */
+
+#content img {
+ border:none;
+}
+#content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #bbCodeContainer, #content #colorCodesContainer, #content #emoticonsContainer, #content #colorCodesContainer a {
+ border-width:1px;
+ border-style:solid;
+}
+#content #chatList .deleteSelected {
+ border-width:1px;
+ border-style:dotted;
+}
+#content #helpContainer #helpList table, #content #settingsContainer #settingsList table {
+ border-collapse:collapse;
+}
+
+/*
+ * Fonts
+ */
+
+#loginContent {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#loginContent h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}
+#loginContent a {
+ text-decoration:none;
+}
+#loginContent a:hover {
+ text-decoration:underline;
+}
+#loginContent #loginRegisteredUsers {
+ font-size:0.8em;
+}
+#loginContent #copyright {
+ font-size:0.8em;
+}
+
+#content {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#content h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}
+#content h3 {
+ font-size:1.0em;
+}
+#content a {
+ text-decoration:none;
+}
+#content a:hover {
+ text-decoration:underline;
+}
+#content #copyright {
+ font-size:0.8em;
+}
+#content #chatList span.dateTime {
+ font-size:0.7em;
+}
+#content #chatList .chatBotMessage {
+ font-style:italic;
+}
+#content #chatList .chatBotErrorMessage {
+ font-style:italic;
+}
+#content #chatList .privmsg {
+ font-style:italic;
+}
+#content #chatList .action {
+ font-style:italic;
+}
+#content #chatList q {
+ font-variant:small-caps;
+}
+#content #chatList code {
+ font-size:1.2em;
+}
+#content #onlineListContainer #onlineList div {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td.code {
+ font-style:italic;
+}
+#content #settingsContainer #settingsList td {
+ font-size:0.9em;
+}
+
+/*
+ * Positioning
+ */
+
+#loginContent {
+ position:absolute;
+ width:100%;
+ height:100%;
+}
+#loginContent #loginHeadlineContainer {
+ margin-left:100px;
+ margin-right:100px;
+ margin-top:100px;
+}
+#loginContent #loginFormContainer {
+ margin-left:100px;
+ margin-right:100px;
+}
+#loginContent #loginFormContainer div {
+ margin-bottom:7px;
+}
+#loginContent #loginRegisteredUsers {
+ padding-top:5px;
+}
+#loginContent #errorContainer {
+ margin-left:100px;
+ margin-right:100px;
+}
+#loginContent #copyright {
+ margin-top:20px;
+ margin-left:100px;
+ margin-right:100px;
+}
+
+#content {
+ position:absolute;
+ width:100%;
+ height:100%;
+}
+#content #copyright {
+ position:absolute;
+ right:20px;
+ top:20px;
+}
+#content #headlineContainer {
+ position:absolute;
+ left:20px;
+ top:5px;
+}
+#content #logoutChannelContainer {
+ position:absolute;
+ left:20px;
+ top:50px;
+}
+#content #statusIconContainer {
+ position:absolute;
+ right:20px;
+ top:50px;
+ width: 22px;
+ height: 22px;
+}
+#content #chatList {
+ position:absolute;
+ left:20px;
+ right:230px;
+ top:85px;
+ bottom:150px;
+ overflow:auto;
+}
+#content #inputFieldContainer {
+ position:absolute;
+ left:20px;
+ right:20px;
+ bottom:95px;
+ padding-right:4px;
+}
+#content #submitButtonContainer {
+ position:absolute;
+ right:20px;
+ bottom:60px;
+}
+#content #onlineListContainer {
+ position:absolute;
+ right:20px;
+ top:85px;
+ width:200px;
+ bottom:150px;
+}
+#content #helpContainer {
+ position:absolute;
+ right:20px;
+ top:85px;
+ width:360px;
+ bottom:150px;
+}
+#content #settingsContainer {
+ position:absolute;
+ right:20px;
+ top:85px;
+ width:360px;
+ bottom:150px;
+}
+#content #bbCodeContainer {
+ position:absolute;
+ left:20px;
+ bottom:20px;
+ padding:3px;
+}
+#content #colorCodesContainer {
+ position:absolute;
+ left:20px;
+ bottom:55px;
+ padding:3px;
+ z-index:1;
+}
+#content #emoticonsContainer {
+ position:absolute;
+ left:20px;
+ bottom:57px;
+ padding:3px;
+}
+#content #optionsContainer {
+ position:absolute;
+ right:20px;
+ bottom:20px;
+ padding:3px;
+ padding-right:0px;
+}
+#content #bbCodeContainer input {
+ padding-left:4px;
+ padding-right:4px;
+}
+#content #colorCodesContainer a {
+ display:block;
+ float:left;
+ width:20px;
+ height:20px;
+}
+#content #optionsContainer input {
+ vertical-align:middle;
+}
+#content #optionsContainer input.button {
+ width:22px;
+ height:22px;
+}
+#content #emoticonsContainer a {
+ margin-left:1px;
+ margin-right:1px;
+}
+#content #emoticonsContainer img {
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+#content #headlineContainer h1 {
+ margin-left:auto;
+ margin-top:12px;
+}
+#content #chatList div {
+ padding-left:10px;
+ padding-top:2px;
+ padding-right:10px;
+ padding-bottom:2px;
+}
+#content #chatList img {
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+#content #chatList cite {
+ margin-right:5px;
+}
+#content #chatList .bbCodeImage {
+ vertical-align:top;
+ overflow:auto;
+ margin:5px;
+}
+#content #chatList .delete {
+ display:block;
+ float:right;
+ width:10px;
+ height:10px;
+ margin-top:2px;
+ padding-left:5px;
+}
+#content #inputFieldContainer #inputField {
+ width:100%;
+ height:40px;
+}
+#content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ height:30px;
+ padding-left:10px;
+ padding-top:4px;
+ padding-right:10px;
+ padding-bottom:4px;
+ margin:0px;
+ text-align:center;
+}
+#content #onlineListContainer #onlineList, #content #helpContainer #helpList, #content #settingsContainer #settingsList {
+ position:absolute;
+ left:0px;
+ right:0px;
+ top:25px;
+ bottom:0px;
+ overflow:auto;
+}
+#content #onlineListContainer #onlineList div {
+ padding-left:10px;
+ padding-top:2px;
+ padding-right:10px;
+ padding-bottom:2px;
+}
+#content #onlineListContainer #onlineList a {
+ display:block;
+}
+#content #onlineListContainer #onlineList ul {
+ margin-left:0px;
+ margin-top:5px;
+ margin-bottom:5px;
+ padding-left:20px;
+}
+#content #helpContainer #helpList td, #content #settingsContainer #settingsList td {
+ padding-left:10px;
+ padding-top:4px;
+ padding-right:10px;
+ padding-bottom:4px;
+ vertical-align:top;
+}
+#content #settingsContainer #settingsList td {
+ vertical-align:middle;
+}
+#content #settingsContainer #settingsList td.setting {
+ width:115px;
+}
+#content #settingsContainer #settingsList input.text {
+ width:100px;
+}
+#content #settingsContainer #settingsList select.left {
+ text-align:right;
+}
+#content #settingsContainer #settingsList input.button {
+ width:22px;
+ height:22px;
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+
+/*
+ * Misc
+ */
+
+@media screen,projection,handheld {
+
+ #content #bbCodeContainer input, #content #optionsContainer input.button, #content #settingsContainer #settingsList input.button {
+ cursor:pointer;
+ }
+
+}
+
+/* Buttons */
+#content #optionsContainer #helpButton {
+ background:url('../images/help.png') no-repeat;
+}
+#content #optionsContainer #settingsButton {
+ background:url('../images/settings.png') no-repeat;
+}
+#content #optionsContainer #onlineListButton {
+ background:url('../images/users.png') no-repeat;
+}
+#content #optionsContainer #audioButton {
+ background:url('../images/audio.png') no-repeat 0px 0px;
+}
+#content #optionsContainer #audioButton.off {
+ background-position: 0px 100%;
+}
+#content #optionsContainer #autoScrollButton {
+ background:url('../images/autoscroll.png') no-repeat 0px 0px;
+}
+#content #optionsContainer #autoScrollButton.off {
+ background-position: 0px 100%;
+}
+#content #settingsContainer #settingsList input.playback {
+ background:url('../images/playback.png') no-repeat;
+}
+
+/*
+ * Print layout
+ */
+
+@media print {
+
+ #content {
+ position:static;
+ }
+ #content #copyright {
+ display:none;
+ }
+ #content #headlineContainer {
+ display:none;
+ }
+ #content #logoutChannelContainer {
+ display:none;
+ }
+ #content #statusIconContainer {
+ display:none;
+ }
+ #content #chatList {
+ position:static;
+ overflow:visible;
+ }
+ #content #inputFieldContainer {
+ display:none;
+ }
+ #content #submitButtonContainer {
+ display:none;
+ }
+ #content #onlineListContainer {
+ display:none;
+ }
+ #content #helpContainer {
+ display:none;
+ }
+ #content #settingsContainer {
+ display:none;
+ }
+ #content #bbCodeContainer {
+ display:none;
+ }
+ #content #colorCodesContainer {
+ display:none;
+ }
+ #content #emoticonsContainer {
+ display:none;
+ }
+ #content #optionsContainer {
+ display:none;
+ }
+ #content #chatList div {
+ padding-bottom:5px;
+ }
+ #content #chatList img {
+ vertical-align:middle;
+ margin-bottom:2px;
+ }
+ #content #chatList cite {
+ margin-right:5px;
+ }
+ #content #chatList .delete {
+ display:none;
+ }
+
+ #content #chatList {
+ border:none;
+ }
+
+ #content {
+ font-family:'times new roman', times, serif;
+ font-size:1.0em;
+ text-align:justify;
+ }
+ #content #chatList code {
+ font-size:0.8em;
+ }
+
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+
+}
\ No newline at end of file
diff --git a/public/chat/css/meta.modern.ajaxchat.css b/public/chat/css/meta.modern.ajaxchat.css
new file mode 100644
index 0000000..9ab4c7d
--- /dev/null
+++ b/public/chat/css/meta.modern.ajaxchat.css
@@ -0,0 +1,451 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+/* Import Username and Text colour CSS file */
+@import url('textcolours.ajaxchat.css');
+
+/* Nigger Rig word-wrap fix */
+* {
+ word-wrap: break-word !important;
+}
+
+/* Positioning */
+#loginContent {
+ position:absolute;
+ width:100%;
+ height:100%;
+}
+#loginContent #loginHeadlineContainer {
+ margin: 100px 100px 0 100px;
+}
+#loginContent #loginFormContainer, #loginContent #errorContainer {
+ margin: 0 100px;
+}
+#loginContent #loginFormContainer div {
+ margin-bottom:7px;
+}
+#loginContent #loginRegisteredUsers {
+ padding-top:5px;
+}
+#loginContent #copyright {
+ margin: 20px 100px 0 100px;
+}
+#content {
+ position:absolute;
+ width:100%;
+ height:100%;
+}
+#content #copyright {
+ position:absolute;
+ right:20px;
+ top:20px;
+}
+#content #headlineContainer {
+ position:absolute;
+ left:20px;
+ top:5px;
+}
+#content #logoutChannelContainer {
+ position:absolute;
+ left:20px;
+ top:50px;
+}
+#content #logoutChannelContainer select{
+ width: 105px;
+ height: 22px;
+}
+#content #statusIconContainer {
+ position:absolute;
+ right:20px;
+ top:50px;
+ width: 22px;
+ height: 22px;
+}
+#content #chatList {
+ position:absolute;
+ left:20px;
+ right:230px;
+ top:85px;
+ bottom:150px;
+ overflow:auto;
+}
+#content #inputFieldContainer {
+ position:absolute;
+ left:20px;
+ right:20px;
+ bottom:95px;
+ padding-right:4px;
+}
+#content #submitButtonContainer {
+ position:absolute;
+ right:20px;
+ bottom:60px;
+}
+#content #onlineListContainer {
+ position:absolute;
+ right:20px;
+ top:85px;
+ width:200px;
+ bottom:150px;
+}
+#content #helpContainer {
+ position:absolute;
+ right:20px;
+ top:85px;
+ width:360px;
+ bottom:150px;
+}
+#content #settingsContainer {
+ position:absolute;
+ right:20px;
+ top:85px;
+ width:360px;
+ bottom:150px;
+}
+#content #bbCodeContainer {
+ position:absolute;
+ left:20px;
+ bottom:20px;
+ padding:3px;
+}
+#content #colorCodesContainer {
+ position:absolute;
+ left:20px;
+ bottom:55px;
+ padding:3px;
+ z-index:1;
+}
+#content #emoticonsContainer {
+ position:absolute;
+ left:20px;
+ bottom:57px;
+ padding:3px;
+}
+#content #optionsContainer {
+ position:absolute;
+ right:20px;
+ bottom:20px;
+ padding:3px;
+ padding-right:0px;
+}
+#content #bbCodeContainer input, #content #logoutButton, #content #mobileButton, #content #submitButton, #loginContent #loginButton {
+ padding: 4px 10px;
+}
+#content #colorCodesContainer a {
+ display:block;
+ float:left;
+ width:20px;
+ height:20px;
+}
+#content #optionsContainer input {
+ vertical-align:middle;
+}
+#content #optionsContainer input.button {
+ width:22px;
+ height:22px;
+}
+#content #emoticonsContainer a {
+ margin-left:1px;
+ margin-right:1px;
+}
+#content #emoticonsContainer img {
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+#content #headlineContainer h1 {
+ margin-left:auto;
+ margin-top:12px;
+}
+#content #chatList div {
+ padding: 2px 10px;
+}
+#content #chatList img {
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+#content #chatList cite {
+ margin-right:5px;
+}
+#content #chatList .bbCodeImage {
+ vertical-align:top;
+ overflow:auto;
+ margin:5px;
+}
+#content #chatList .delete {
+ display:block;
+ float:right;
+ width:10px;
+ height:10px;
+ margin-top:2px;
+ padding-left:5px;
+ background:url('../images/delete.png') no-repeat right;
+}
+#content #inputFieldContainer #inputField {
+ width:100%;
+ height:40px;
+}
+#content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ height:30px;
+ padding: 4px 10px;
+ margin:0px;
+ text-align:center;
+}
+#content #onlineListContainer #onlineList, #content #helpContainer #helpList, #content #settingsContainer #settingsList {
+ position:absolute;
+ left:0px;
+ right:0px;
+ top:25px;
+ bottom:0px;
+ overflow:auto;
+}
+#content #onlineListContainer #onlineList div {
+ padding: 2px 10px;
+}
+#content #onlineListContainer #onlineList a {
+ display:block;
+}
+#content #onlineListContainer #onlineList ul {
+ margin: 5px 0;
+ padding-left:20px;
+}
+#content #helpContainer #helpList td, #content #settingsContainer #settingsList td {
+ padding: 4px 10px;
+ vertical-align:top;
+}
+#content #settingsContainer #settingsList td {
+ vertical-align:middle;
+}
+#content #settingsContainer #settingsList td.setting {
+ width:115px;
+}
+#content #settingsContainer #settingsList input.text {
+ width:100px;
+}
+#content #settingsContainer #settingsList select.left {
+ text-align:right;
+}
+#content #settingsContainer #settingsList input.button {
+ width:22px;
+ height:22px;
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+
+/* Buttons */
+#content #optionsContainer #helpButton {
+ background:url('../images/help.png') no-repeat;
+}
+#content #optionsContainer #settingsButton {
+ background:url('../images/settings.png') no-repeat;
+}
+#content #optionsContainer #onlineListButton {
+ background:url('../images/users.png') no-repeat;
+}
+#content #optionsContainer #audioButton {
+ background:url('../images/audio.png') no-repeat 0px 0px;
+}
+#content #optionsContainer #audioButton.off {
+ background-position: 0px 100%;
+}
+#content #optionsContainer #autoScrollButton {
+ background:url('../images/autoscroll.png') no-repeat 0px 0px;
+}
+#content #optionsContainer #autoScrollButton.off {
+ background-position: 0px 100%;
+}
+#content #settingsContainer #settingsList input.playback {
+ background:url('../images/playback.png') no-repeat;
+}
+
+/* Borders */
+#content img {
+ border:none;
+}
+#content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer,
+#content #colorCodesContainer a, #content textarea {
+ border-width:1px;
+ border-style:solid;
+}
+#content #chatList .deleteSelected {
+ border-width:1px;
+ border-style:dotted;
+}
+#content #helpContainer #helpList table, #content #settingsContainer #settingsList table {
+ border-collapse:collapse;
+}
+
+/* Misc */
+#content #bbCodeContainer input, #content #optionsContainer input.button, #content #settingsContainer #settingsList input.button, #content #logoutButton, #content #mobileButton, #content #submitButton, #loginContent #loginButton {
+ cursor:pointer;
+}
+
+/* Fonts */
+#loginContent {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#loginContent h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}
+#loginContent a {
+ text-decoration:none;
+}
+#loginContent a:hover {
+ text-decoration:underline;
+}
+#loginContent #loginRegisteredUsers {
+ font-size:0.8em;
+}
+#loginContent #copyright {
+ font-size:0.8em;
+}
+#content {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#content h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}
+#content h3 {
+ font-size:1.0em;
+}
+#content a {
+ text-decoration:none;
+}
+#content a:hover {
+ text-decoration:underline;
+}
+#content #copyright {
+ font-size:0.8em;
+}
+#content #chatList span.dateTime {
+ font-size:0.7em;
+}
+#content #chatList .chatBotMessage {
+ font-style:italic;
+}
+#content #chatList .chatBotErrorMessage {
+ font-style:italic;
+}
+#content #chatList .privmsg {
+ font-style:italic;
+}
+#content #chatList .action {
+ font-style:italic;
+}
+#content #chatList q {
+ font-variant:small-caps;
+}
+#content #chatList code {
+ font-size:1.2em;
+}
+#content #onlineListContainer #onlineList div {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td.code {
+ font-style:italic;
+}
+#content #settingsContainer #settingsList td {
+ font-size:0.9em;
+}
+
+/*
+ * Print layout
+ */
+
+@media print {
+
+ #content {
+ position:static;
+ }
+ #content #copyright {
+ display:none;
+ }
+ #content #headlineContainer {
+ display:none;
+ }
+ #content #logoutChannelContainer {
+ display:none;
+ }
+ #content #statusIconContainer {
+ display:none;
+ }
+ #content #chatList {
+ position:static;
+ overflow:visible;
+ }
+ #content #inputFieldContainer {
+ display:none;
+ }
+ #content #submitButtonContainer {
+ display:none;
+ }
+ #content #onlineListContainer {
+ display:none;
+ }
+ #content #helpContainer {
+ display:none;
+ }
+ #content #settingsContainer {
+ display:none;
+ }
+ #content #bbCodeContainer {
+ display:none;
+ }
+ #content #colorCodesContainer {
+ display:none;
+ }
+ #content #emoticonsContainer {
+ display:none;
+ }
+ #content #optionsContainer {
+ display:none;
+ }
+ #content #chatList div {
+ padding-bottom:5px;
+ }
+ #content #chatList img {
+ vertical-align:middle;
+ margin-bottom:2px;
+ }
+ #content #chatList cite {
+ margin-right:5px;
+ }
+ #content #chatList .delete {
+ display:none;
+ }
+
+ #content #chatList {
+ border:none;
+ }
+
+ #content {
+ font-family:'times new roman', times, serif;
+ font-size:1.0em;
+ text-align:justify;
+ }
+ #content #chatList code {
+ font-size:0.8em;
+ }
+
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+
+}
\ No newline at end of file
diff --git a/public/chat/css/meta.terminal.ajaxchat.css b/public/chat/css/meta.terminal.ajaxchat.css
new file mode 100644
index 0000000..2692d3f
--- /dev/null
+++ b/public/chat/css/meta.terminal.ajaxchat.css
@@ -0,0 +1,115 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license Modified MIT License
+ * @link https://blueimp.net/ajax/
+ */
+
+
+/* Nigger Rig word-wrap fix */
+* {
+ word-wrap: break-word !important;
+}
+
+/* Fonts */
+#loginContent {
+ font-family:monospace;
+ font-size:0.8em;
+}
+#loginContent h1 {
+ font-size:1.3em;
+ font-family:monospace;
+ font-weight:bold;
+}
+#loginContent a {
+ text-decoration:none;
+}
+#loginContent a:hover {
+ text-decoration:underline;
+}
+#loginContent #loginRegisteredUsers {
+ font-size:0.8em;
+}
+#loginContent #copyright {
+ font-size:0.8em;
+}
+/*#content {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#content h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}*/
+#content {
+ font-family:monospace;
+ font-size:14px;
+}
+#content h1 {
+ font-size:14px;
+ font-family:monospace;
+ font-weight:bold;
+}
+#content h3 {
+ font-size:1.0em;
+}
+#content a {
+ text-decoration:none;
+}
+#content a:hover {
+ text-decoration:underline;
+}
+#content #copyright {
+ font-size:0.8em;
+}
+#content #chatList span.dateTime {
+ font-size:0.7em;
+}
+#content #chatList span.guest {
+ font-weight:bold;
+}
+#content #chatList span.user {
+ font-weight:bold;
+}
+#content #chatList span.moderator {
+ font-weight:bold;
+}
+#content #chatList span.admin {
+ font-weight:bold;
+}
+#content #chatList span.chatBot {
+ font-weight:bold;
+ font-style:italic;
+}
+#content #chatList .chatBotMessage {
+ font-style:italic;
+}
+#content #chatList .chatBotErrorMessage {
+ font-style:italic;
+}
+#content #chatList .privmsg {
+ font-style:italic;
+}
+#content #chatList .action {
+ font-style:italic;
+}
+#content #chatList q {
+ font-variant:small-caps;
+}
+#content #chatList code {
+ font-size:1.2em;
+}
+#content #onlineListContainer #onlineList div {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td.code {
+ font-style:italic;
+}
+#content #settingsContainer #settingsList td {
+ font-size:0.9em;
+}
\ No newline at end of file
diff --git a/public/chat/css/mio.css b/public/chat/css/mio.css
new file mode 100644
index 0000000..b895c52
--- /dev/null
+++ b/public/chat/css/mio.css
@@ -0,0 +1,851 @@
+/*
+ Flashii.net Style Codename "Mio"
+ By Flashwave
+*/
+
+@charset "utf-8";
+
+html {
+ color: #000000;
+ font: 12px/20px Georgia, "Times New Roman", Times, serif;
+}
+
+body {
+ margin: 0px;
+ padding: 0px;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ background: linear-gradient(180deg, #C2AFFE, #FBEEFF) repeat-x scroll center top #FBEEFF;
+ background-size: auto 200px;
+ text-align: center;
+}
+
+img.logo {
+ height: 150px;
+ width: 450px;
+ border: 0px;
+ background: url('https://static.flash.moe/logos/logo.png') no-repeat scroll left top transparent;
+ background-size: cover;
+}
+
+
+.clear {
+ clear: both !important;
+ float: none !important;
+}
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+div.navbar a {
+ color: #000000;
+ text-decoration: none;
+}
+
+div.navbar a:hover {
+ color: #609;
+}
+
+hr {
+ color: #9475B2;
+ background: #9475B2;
+ height: 1px;
+ border: 0px;
+}
+
+div.navbar ul {
+ display: table;
+ margin: 0px auto;
+ clear: both;
+ text-align: center;
+ margin-top: 5px;
+ border-top: 1px solid;
+ min-width: 880px;
+ max-width: 1024px;
+}
+
+div.navbar li {
+ float: left;
+ display: block;
+ text-align: center;
+ margin-top: -1px;
+ position: relative;
+ left: 217.5px;
+ z-index: 1;
+}
+
+li.notcurrent {
+ background: none repeat scroll 0% 0% #C9BBCC;
+ border-width: 1px 1px 1px medium;
+ border-style: solid solid solid none;
+ border-color: inherit;
+ border-image: none;
+ padding: 2px 1em;
+}
+
+li.current {
+ background: none repeat scroll 0% 0% #FBEEFF;
+ border-width: 1px 1px 1px 1px;
+ border-style: solid solid solid solid;
+ border-color: inherit;
+ border-image: none;
+ padding: 2px 1em;
+ padding-bottom: 4px;
+ margin-left:-1px;
+ border-top: medium none;
+}
+
+li.first {
+ border-left: 1px solid;
+}
+
+li.fill {
+ border-top: 1px solid;
+ padding-bottom: 4px;
+ width: 100px !important;
+}
+
+div.pagecontent, div.profile {
+ margin: 0px auto;
+ margin-top: 5px;
+ min-width: 880px;
+ max-width: 1024px;
+ border: solid 1px #9475B2;
+ background: #FBEEFF;
+}
+
+div.profile {
+ min-height: 246px;
+}
+
+div.profile_cont {
+ text-align: left;
+ padding: 0px 20px;
+}
+
+div.profile_cont hr {
+ border: 0px solid #000;
+ height: 1px;
+ color: #000;
+ background: #000;
+ width: 75%;
+}
+
+div.mioboards, div.mioblog, div.miowhois {
+ margin: 0px auto;
+ margin-top: 5px;
+ min-width: 660px;
+ max-width: 924px;
+ border: solid 1px #9475B2;
+}
+
+div.miochatquote {
+ margin: 0px auto;
+ margin-top: 5px;
+ border: solid 1px #9475B2;
+ display: inline-block;
+}
+div.miochatquote .chatquote {
+ text-align: left;
+ color: #FFF;
+ min-width: 500px;
+}
+div.miochatquote .chatquote div .dateTime {
+ font-size: 9px;
+}
+div.miochatquote .chatquote div {
+ padding: 1px 5px 1px 7px;
+}
+div.miochatquote .chatquote div:nth-child(odd) {
+ background: #000;
+}
+div.miochatquote .chatquote div:nth-child(even) {
+ background: #212121;
+}
+
+div.miodonate {
+ margin: 0px auto;
+ margin-top: 5px;
+ min-width: 660px;
+ max-width: 924px;
+ border: solid 1px #9475B2;
+}
+
+div.miodonate h3 {
+ margin: 0px;
+}
+
+div.miodonate hr {
+ margin-bottom: 0px;
+}
+
+div.miodonate h2 {
+ margin: 0px;
+ background: #9475B2;
+ border: solid 1px #9475B2;
+ text-align: right;
+ float: right;
+ border-bottom-left-radius: 12px;
+ display: inline-block;
+ margin-top: -1px;
+ padding: 5px;
+}
+
+div.miodonate ul {
+ list-style: square outside none;
+}
+
+div.miodonate li {
+ list-style: none outside none;
+ background: #9475B2;
+ margin: 0px;
+ width: 815px;
+ margin: 8px;
+ height: 20px;
+ display: list-item;
+ box-shadow: 0 0 10px grey;
+ border-radius: 3px;
+ font-size: 140%;
+ padding: 10px;
+}
+
+div.mioucpbar {
+ min-width: 880px;
+ max-width: 1024px;
+}
+
+div.miobottom{
+ margin: 0px auto;
+ overflow: auto;
+ height: auto !important;
+}
+
+div.miobinner {
+ position: relative;
+ left: -50%;
+ float: right;
+ clear: both;
+ text-align: left;
+}
+
+h3.miotitle {
+ background-color: #9475B2;
+ color: #330066;
+ margin-top: 0px;
+ text-align: left;
+ padding: 3px;
+}
+
+h2.miotitle {
+ background-color: #9475B2;
+ color: #330066;
+ margin: 0px;
+ text-align: center;
+ padding: 3px;
+}
+
+h1.miotitle {
+ color: #330066;
+ margin: 0px;
+ text-align: center;
+}
+
+body.miomessage {
+ margin-top: 20%;
+ text-align: center;
+}
+
+h1.miomessage {
+ color: #440077;
+ font-size: 36pt;
+}
+
+.miosub {
+ color: #330066;
+ font-size: 8pt;
+}
+
+div.mioboxcontent {
+ text-align: left;
+ margin: 0px;
+ line-height: 130%;
+ overflow: auto;
+ width: 100%;
+}
+
+div.mioboxcontent h4 {
+ text-decoration: underline;
+ display: inline;
+}
+
+div.mioboards div.mioboxcontent {
+ padding: 0.25em 0.5em 0px;
+ padding-left: 20px;
+}
+
+div.miocolumn {
+ float: left;
+ width: 25%;
+ display: block;
+}
+
+a.boardlink {
+ text-decoration: none;
+ color: inherit;
+}
+
+a.boardlink:hover,a.boardlink:active {
+ text-decoration: underline;
+}
+
+div.postcontent {
+ text-align: left;
+ padding: 0px 10px 0px 10px;
+}
+
+h3.title {
+ margin-top: 0px;
+ background-color: #9475B2;
+ text-align: left;
+ padding: 3px;
+}
+
+h1.title{
+ margin-top: 0px;
+ background-color: #9475B2;
+ text-align: left;
+ padding: 5px;
+}
+
+ol,dl {
+ text-align: left;
+}
+
+dl {
+ padding-left: 10px;
+}
+
+dt.q {
+ font-weight: bold;
+ color: #550088;
+}
+
+dd.a {
+ border-bottom: solid 1px #9475B2;
+ padding-right: 10px;
+ margin-bottom: 5px;
+}
+
+span.permalink {
+ float: right;
+}
+
+span.permalink a {
+ text-decoration: none;
+}
+
+span.permalink a:hover {
+ text-decoration: underline;
+}
+
+input[type="text"],input[type="password"],input[type="date"],textarea {
+ margin: 0px 2px 0px 0px;
+ padding: 2px 4px 3px;
+ border: 1px solid #AAA;
+ outline: medium none;
+ font-family: arial,helvetica,sans-serif;
+ font-size: 10pt;
+}
+
+select {
+ padding: 1px 2px 2px;
+ border: 1px solid #AAA;
+ outline: medium none;
+ font-family: arial,helvetica,sans-serif;
+ font-size: 10pt;
+}
+
+div.copyright{
+ padding-top: 5px;
+ font-size: 11px;
+ line-height: 15px;
+}
+
+div.copyright a {
+ text-decoration: none;
+}
+
+.prof_avatar{
+ max-height: 200px;
+ max-width: 200px;
+ border: 1px solid #9475B2;
+}
+
+div.prof_avatar_cont{
+ text-align: right;
+ float: right;
+ width: 200px;
+ height: 200px;
+ clear: both;
+ margin-top: -6px;
+ margin-right: -11px;
+}
+
+div.prof_options {
+ font-size: 10px;
+ text-transform: uppercase;
+}
+
+div.prof_options a, div.prof_options a:visited {
+ color: #111;
+ text-decoration: none;
+}
+
+div.prof_options a:hover, div.prof_options a:active {
+ color: #111;
+ text-decoration: underline;
+}
+
+div.ucp_avatar_cont {
+ text-align: center;
+ font-weight: bold;
+}
+
+.windowbutton-container {
+ float: right;
+ margin-top: -2px;
+ margin-right: -2px;
+ margin-left: -2px;
+ margin-bottom: -2px;
+}
+
+.closebutton {
+ cursor: pointer;
+ height: 23px;
+ width: 23px;
+ border: 0px;
+ background: url('https://static.flash.moe/images/window-sprite.png') no-repeat scroll 0px 0px transparent;
+}
+
+.maxbutton {
+ cursor: pointer;
+ height: 23px;
+ width: 23px;
+ border: 0px;
+ background: url('https://static.flash.moe/images/window-sprite.png') no-repeat scroll 0px -23px transparent;
+}
+
+.minbutton {
+ cursor: pointer;
+ height: 23px;
+ width: 23px;
+ border: 0px;
+ background: url('https://static.flash.moe/images/window-sprite.png') no-repeat scroll 0px -46px transparent;
+}
+
+.donate-btn {
+ cursor: pointer;
+ height: 26px;
+ width: 90px;
+ border: 0px;
+ background: url('https://static.flash.moe/images/donate-btn.png') no-repeat scroll 0px 0px transparent;
+}
+
+div.topLeftBar {
+ color: #000000;
+ position: absolute;
+ left: 0px;
+ background: #FBEEFF;
+ padding: 1px 9px;
+ border: 1px #9475B2 solid;
+ border-top: 0px;
+ border-left: 0px;
+ box-shadow: 0 0 1.5em #808080;
+ z-index: 997;
+}
+
+div.topLeftBar a {
+ color: inherit;
+ text-decoration: none;
+}
+
+div.topLeftBar a:hover {
+ text-decoration: underline;
+}
+
+div.manageReportsContainer {
+ text-align: left;
+ width: 800px;
+}
+
+div.manageReportsContainer > fieldset {
+ border: #9475B2 solid 1px;
+ margin: 5px;
+}
+
+div.manageReportsContainer > fieldset > legend {
+ border: #9475B2 solid 1px;
+ background: #9475B2;
+ color: #306;
+ padding: 1px 5px;
+}
+
+div.manageReportsContainer > fieldset > span > .reportText {
+ font-size: 10px;
+ line-height: 130%;
+}
+
+table.miotable {
+ width:100%;
+}
+
+table.miotablestandalone {
+ margin: 0px auto;
+ margin-top: 5px;
+ min-width: 880px;
+ max-width: 1024px;
+ border: solid 1px #9475B2;
+}
+
+.ucptable tr {
+ width: 100%;
+}
+
+.ucptable td {
+ width: 50%;
+}
+
+.ucptable input[type="text"],.ucptable input[type="date"] {
+ width: 373px;
+}
+
+.miotable tr.head {
+ background:#9475B2;
+ text-align:center;
+ font-weight:bold;
+}
+
+.miotable tr.ucpmenu td {
+ width:25%;
+}
+
+.miotable a {
+ text-decoration:none;
+}
+
+.miotable a:hover {
+ text-decoration:underline;
+}
+
+.miotable tr.online a {
+ color:green;
+}
+
+.miotable tr.semionline a {
+ color:orange;
+}
+
+.miotable tr.offline a {
+ color:red;
+}
+
+.miotable td {
+ padding: 5px;
+}
+
+.miotable tr.online {
+ color: green;
+ background: rgba(0,45,0,0.9);}
+
+.miotable tr.semionline {
+ color: orange;
+ background: rgba(51,24,0,0.9);
+}
+
+.miotable tr.offline {
+ color: red;
+ background: rgba(51,0,0,0.9);
+}
+
+.registerbutton, .loginbutton {
+ display: block;
+ background: #9475B2;
+ color: #330066;
+ padding: 10px;
+ font-size: 20px;
+ text-decoration: none;
+ transition: text-shadow 0.2s;
+}
+
+.registerbutton:hover, .loginbutton:hover {
+ text-shadow: 0px 0px 8px #F1F1F1;
+}
+
+/* Flashii Bar */
+div.flashii-bar .barAvatar {
+ margin-bottom: -5px;
+ height: 20px;
+ width: 20px;
+}
+
+div.flashii-bar {
+ color: #000000;
+ position: absolute;
+ right: 0px;
+ background: #FBEEFF;
+ padding: 1px 9px;
+ /*border-radius: 0px 0px 0px 8px;*/
+ border: 1px #9475B2 solid;
+ border-top: 0px;
+ border-right: 0px;
+ /*box-shadow: 0 0 1px grey;*/
+ box-shadow: 0 0 1.5em #808080;
+ z-index: 997;
+}
+
+div.flashii-black {
+ background: rgba(0,0,0,0.5);
+ position: fixed;
+ top: 0px;
+ left: 0px;
+ right: 0px;
+ bottom: 0px;
+ height: 100%;
+ width: 100%;
+ z-index: 998;
+}
+
+div.flashii-bar a {
+ color: inherit;
+ text-decoration: none;
+}
+
+div.flashii-bar a:hover {
+ text-decoration: underline;
+}
+
+div.flashii-horizon {
+ background-color: transparent;
+ text-align: center;
+ position: absolute;
+ top: 30%;
+ left: 0px;
+ width: 100%;
+ height: 1px;
+ overflow: visible;
+ visibility: visible;
+ display: block;
+ z-index: 999;
+}
+
+div#flashii-login,div#flashii-register {
+ min-width: 333px;
+ max-width: 462px;
+ border: solid 1px #9475B2;
+ z-index: 999;
+ background: #FBEEFF;
+ margin: 0px auto;
+}
+
+div#flashii-login h3,div#flashii-register h3 {
+ background-color: #9475B2;
+ color: rgb(51,0,102);
+ margin-top: 0px;
+ text-align: left;
+ padding: 3px;
+}
+
+div#flashii-login h3 a,div#flashii-register h3 a {
+ float: right;
+ color: inherit;
+ text-decoration: none;
+}
+
+div#flashii-login table,div#flashii-register table {
+ margin: 0px auto;
+ text-align: left;
+}
+
+div#flashii-login tr td:first-child,div#flashii-register tr td:first-child{
+ background: #C9BBCC;
+ border: 1px #746677 solid;
+ color: #400070;
+ font-weight: bold;
+ padding: 0px 5px;
+ font-size: 10pt;
+ width: 35% !important;
+}
+
+div#flashii-login table tr:last-child td, div#flashii-register table tr:last-child td{
+ background: transparent !important;
+ border: none !important;
+ color: inherit !important;
+ font-weight: normal !important;
+ padding: 0 0 !important;
+ font-size: inherit !important;
+ text-align: center;
+}
+
+div#flashii-login #recaptcha_response_field,div#flashii-login input[type="text"],div#flashii-login input[type="password"],div#flashii-register #recaptcha_response_field,div#flashii-register input[type="text"],div#flashii-register input[type="password"] {
+ margin: 0px 2px 0px 0px;
+ padding: 2px 4px 3px;
+ border: 1px solid #AAA;
+ outline: medium none;
+ font-family: arial,helvetica,sans-serif;
+ font-size: 10pt;
+ width: 292px;
+}
+
+#recaptcha_widget img {
+ cursor: pointer;
+}
+
+div#recaptcha_image {
+ margin: 0px 2px 0px 0px;
+ border: 1px solid #AAA;
+ outline: medium none;
+}
+
+#recaptcha_response_field {
+ margin-top: 4px !important;
+}
+
+.recaptcha_custom_buttons {
+ font-size: smaller;
+}
+
+
+/* some more shit */
+.group-select {
+ margin: 0px auto;
+ text-align: center;
+ min-width: 330px !important;
+ max-width: 945px;
+}
+
+.group-select a {
+ color: inherit;
+}
+
+.group-select-user {
+ background: #9475B2;
+ float: left;
+ margin: 10px;
+ text-align: center;
+ width: 275px;
+ height: 175px;
+ padding: 10px;
+ transition: background 0.5s, box-shadow 0.2s;
+ box-shadow: inset 0px 0px 1.5em #000;
+}
+
+.group-select-user:hover {
+ background: #8364A1;
+ cursor: pointer;
+ box-shadow: inset 0px 0px 2em #000;
+}
+
+.group-select-user-avatar {
+ min-height: 150px;
+ min-width: 150px;
+ margin: auto auto;
+}
+
+.group-select-user-avatar img {
+ max-height: 150px;
+ max-width: 150px;
+ border: 0px;
+ padding: 0px;
+ margin: 0px;
+}
+
+
+.membersPage {
+ width: 100%;
+ padding: 10px 0px;
+ overflow: hidden;
+ text-align: center;
+}
+
+.membersPage a {
+ color: inherit;
+}
+
+.membersPage .groupBox, .membersPage .userBox {
+ background: #9475B2;
+ margin: 10px;
+ text-align: center;
+ display: inline-block;
+ vertical-align: top;
+ transition: background 0.5s, box-shadow 0.2s;
+}
+
+.membersPage .groupBox {
+ padding: 7px;
+ font-size: 15px;
+ min-width: 150px;
+ box-shadow: inset 0px 0px 1em #000;
+}
+
+.membersPage .userBox {
+ padding: 10px;
+ line-height: 330%;
+ width: 200px;
+ height: 230px;
+ box-shadow: inset 0px 0px 1.5em #000;
+}
+
+.membersPage .groupBox:hover, .membersPage .userBox:hover {
+ background: #8364A1;
+ cursor: pointer;
+}
+
+.membersPage .groupBox:hover {
+ box-shadow: inset 0px 0px 1em #000;
+}
+
+.membersPage .userBox:hover {
+ box-shadow: inset 0px 0px 1.5em #000;
+}
+
+.membersPage .userBox img {
+ width: 200px;
+ height: 200px;
+ display: block;
+ margin: 0px auto;
+}
+
+.membersPage .userBox .userBoxUserName {
+ font-weight: 700;
+}
+
+.news-post-time {
+ text-align: right;
+ font-size: .8em;
+ margin-right: 10px;
+ margin-bottom: 7px;
+}
+.news-poster {
+ float: right;
+ text-align: right;
+ margin-top: -3px;
+ margin-left: 5px;
+}
+.news-poster img {
+ max-width: 120px;
+ max-height: 120px;
+ border: 1px solid #9475B2;
+}
+.news-poster h2 {
+ line-height: 11px;
+ margin: -5px 0px 0px;
+ font-weight: 100;
+ background: #9475B2;
+ border-bottom-left-radius: 10px;
+ font-size: 1.5em;
+ padding: 5px !important;
+ height: 15px;
+}
+.news-comments-container {
+ margin: 5px auto 0px;
+}
\ No newline at end of file
diff --git a/public/chat/css/mobile.ajaxchat.css b/public/chat/css/mobile.ajaxchat.css
new file mode 100644
index 0000000..eb40fc2
--- /dev/null
+++ b/public/chat/css/mobile.ajaxchat.css
@@ -0,0 +1,439 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+@import url('textcolours.ajaxchat.css');
+
+/* Fonts */
+#loginContent {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#loginContent h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}
+#loginContent a {
+ text-decoration:none;
+}
+#loginContent a:hover {
+ text-decoration:underline;
+}
+#loginContent #loginRegisteredUsers {
+ font-size:0.8em;
+}
+#loginContent #copyright {
+ font-size:0.8em;
+}
+#content {
+ font-family:Verdana, Arial, Helvetica, sans-serif;
+ font-size:0.8em;
+}
+#content h1 {
+ font-size:1.3em;
+ font-family:"Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight:bold;
+}
+#content h3 {
+ font-size:1.0em;
+}
+#content a {
+ text-decoration:none;
+}
+#content a:hover {
+ text-decoration:underline;
+}
+#content #copyright {
+ font-size:0.8em;
+}
+#content #chatList span.dateTime {
+ font-size:0.7em;
+}
+#content #chatList .chatBotMessage {
+ font-style:italic;
+}
+#content #chatList .chatBotErrorMessage {
+ font-style:italic;
+}
+#content #chatList .privmsg {
+ font-style:italic;
+}
+#content #chatList .action {
+ font-style:italic;
+}
+#content #chatList q {
+ font-variant:small-caps;
+}
+#content #chatList code {
+ font-size:1.2em;
+}
+#content #onlineListContainer #onlineList div {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td {
+ font-size:0.9em;
+}
+#content #helpContainer #helpList td.code {
+ font-style:italic;
+}
+#content #settingsContainer #settingsList td {
+ font-size:0.9em;
+}
+/* Positioning */
+#loginContent {
+ position:absolute;
+ width:100%;
+ height:100%;
+}
+#loginContent #loginHeadlineContainer {
+ margin: 100px 100px 0 100px;
+}
+#loginContent #loginFormContainer, #loginContent #errorContainer {
+ margin: 0 100px;
+}
+#loginContent #loginFormContainer div {
+ margin-bottom:7px;
+}
+#loginContent #loginRegisteredUsers {
+ padding-top:5px;
+}
+#loginContent #copyright {
+ margin: 20px 100px 0 100px;
+}
+#content {
+ position:absolute;
+ width:100%;
+ height:100%;
+}
+#content #copyright {
+ position:absolute;
+ right:10px;
+ top:10px;
+}
+#content #headlineContainer {
+ position:absolute;
+ left:10px;
+ top:3px;
+}
+#content #logoutChannelContainer {
+ position:absolute;
+ left:10px;
+ top:50px;
+}
+#content #logoutChannelContainer select{
+ width: 105px;
+ height: 22px;
+}
+#content #statusIconContainer {
+ position:absolute;
+ width: 22px;
+ height: 22px;
+}
+#content #chatList {
+ position:absolute;
+ left:10px;
+ right:10px;
+ top:40px;
+ bottom:70px;
+ overflow:auto;
+}
+#content #inputFieldContainer {
+ position:absolute;
+ left:10px;
+ right:10px;
+ bottom:42px;
+ padding-right:4px;
+}
+#content #submitButtonContainer {
+ position:absolute;
+ right:10px;
+ bottom:38px;
+ padding:3px;
+}
+#content #onlineListContainer {
+ position:absolute;
+ left:10px;
+ right:10px;
+ top:40px;
+ bottom:70px;
+}
+#content #helpContainer {
+ position:absolute;
+ right:10px;
+ top:85px;
+ width:360px;
+ bottom:150px;
+}
+#content #settingsContainer {
+ position:absolute;
+ left:10px;
+ right:10px;
+ top:40px;
+ bottom:70px;
+}
+#content #bbCodeContainer {
+ position:absolute;
+ left:10px;
+ bottom:10px;
+ padding:3px;
+}
+#content #colorCodesContainer {
+ position:absolute;
+ left:10px;
+ bottom:37px;
+ padding:3px;
+ z-index:1;
+}
+#content #emoticonsContainer {
+ position:absolute;
+ left:10px;
+ bottom:57px;
+ padding:3px;
+}
+#content #optionsContainer {
+ position:absolute;
+ right:10px;
+ top:5px;
+ padding:3px;
+ margin-left:auto;
+ margin-top:2px;
+}
+#content #bbCodeContainer input, #content #logoutButton, #content #submitButton, #loginContent #loginButton {
+ padding: 1px 2px;
+}
+#content #colorCodesContainer a {
+ display:block;
+ float:left;
+ width:20px;
+ height:20px;
+}
+#content #optionsContainer input {
+ vertical-align:middle;
+}
+#content #optionsContainer input.button {
+ width:22px;
+ height:22px;
+}
+#content #emoticonsContainer a {
+ margin-left:1px;
+ margin-right:1px;
+}
+#content #emoticonsContainer img {
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+#content #headlineContainer h1 {
+ margin-left:auto;
+ margin-top:6px;
+}
+#content #chatList div {
+ padding: 2px 10px;
+}
+#content #chatList img {
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+#content #chatList cite {
+ margin-right:5px;
+}
+#content #chatList .bbCodeImage {
+ vertical-align:top;
+ overflow:auto;
+ margin:5px;
+}
+#content #chatList .delete {
+ display:block;
+ float:right;
+ width:10px;
+ height:10px;
+ margin-top:2px;
+ padding-left:5px;
+ background:url('../images/delete.png') no-repeat right;
+}
+#content #inputFieldContainer #inputField {
+ width:100%;
+ height:18px;
+}
+#content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ height:30px;
+ padding: 4px 10px;
+ margin:0px;
+ text-align:center;
+}
+#content #onlineListContainer #onlineList, #content #helpContainer #helpList, #content #settingsContainer #settingsList {
+ position:absolute;
+ left:0px;
+ top:25px;
+ right:0px;
+ bottom:0px;
+ overflow:auto;
+}
+#content #onlineListContainer #onlineList div {
+ padding: 2px 10px;
+}
+#content #onlineListContainer #onlineList a {
+ display:block;
+}
+#content #onlineListContainer #onlineList ul {
+ margin: 5px 0;
+ padding-left:10px;
+}
+#content #helpContainer #helpList td, #content #settingsContainer #settingsList td {
+ vertical-align:top;
+}
+#content #settingsContainer #settingsList td {
+ vertical-align:middle;
+}
+#content #settingsContainer #settingsList td.setting {
+}
+#content #settingsContainer #settingsList input.text {
+ width:100px;
+}
+#content #settingsContainer #settingsList select.left {
+ text-align:right;
+}
+#content #settingsContainer #settingsList input.button {
+ height:22px;
+ vertical-align:middle;
+ margin-bottom:2px;
+}
+
+/* Buttons */
+ #content #optionsContainer #helpButton {
+ background:url('../images/help.png') no-repeat;
+ }
+ #content #optionsContainer #settingsButton {
+ background:url('../images/settings.png') no-repeat;
+ }
+ #content #optionsContainer #onlineListButton {
+ background:url('../images/users.png') no-repeat;
+ }
+ #content #optionsContainer #audioButton {
+ background:url('../images/audio.png') no-repeat;
+ }
+ #content #optionsContainer #audioButton.off {
+ background:url('../images/audio-off.png') no-repeat;
+ }
+ #content #optionsContainer #autoScrollButton {
+ background:url('../images/autoscroll.png') no-repeat;
+ }
+ #content #optionsContainer #autoScrollButton.off {
+ background:url('../images/autoscroll-off.png') no-repeat;
+ }
+
+/* Borders */
+#content img {
+ border:none;
+}
+#content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer,
+#content #colorCodesContainer a, #content textarea {
+ border-width:1px;
+ border-style:solid;
+}
+#content #chatList .deleteSelected {
+ border-width:1px;
+ border-style:dotted;
+}
+#content #helpContainer #helpList table, #content #settingsContainer #settingsList table {
+ border-collapse:collapse;
+}
+
+/* Misc */
+#content #bbCodeContainer input, #content #optionsContainer input.button, #content #settingsContainer #settingsList input.button, #content #logoutButton, #content #submitButton, #loginContent #loginButton {
+ cursor:pointer;
+}
+
+@media screen,projection,handheld {
+
+ /* Buttons */
+ #content #bbCodeContainer input, #content #logoutButton, #content #submitButton, #loginForm #loginButton {
+ background-color:#000;
+ color:#f0f0f0;
+ border: 1px solid #808080;
+ background-image: linear-gradient(to bottom, #222, #000);
+ background-image: -webkit-linear-gradient(top, #222, #000);
+ }
+ #content select, #loginForm select, #loginForm input, #content textarea {
+ background-color:#000;
+ color:#fafafa;
+ border: 1px solid #808080;
+ }
+
+ /* Status Icon */
+ #content #statusIconContainer {
+ background-image: url('../images/loading-sprite.png');
+ }
+ #content .statusContainerOff {
+ background-position: 0px 0px;
+ }
+ #content .statusContainerOn {
+ background-position: 0px -22px;
+ }
+ #content .statusContainerAlert {
+ background-position: 0px -44px;
+ }
+
+ /* Other Theme Elements */
+ #loginContent {
+ background-color:#000;
+ color:#FFF;
+ }
+ #loginContent h1 {
+ color:#FFF;
+ }
+ #loginContent a {
+ color:#FFF;
+ }
+ #loginContent input, #loginContent select {
+ background-color:#212121;
+ color:#FFF;
+ }
+ #loginContent #errorContainer {
+ color:red;
+ }
+ #content {
+ background-color:#000;
+ color:#FFF;
+ }
+ #content h1 {
+ color:#FFF;
+ }
+ #content a {
+ color:#FFF;
+ }
+ #content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer, #content textarea {
+ border-color:gray;
+ background-color:#000;
+ }
+ #content #colorCodesContainer a {
+ border-color:black;
+ }
+ #content #optionsContainer input {
+ background-color:transparent;
+ }
+ #content .rowEven {
+ background-color:#212121;
+ }
+ #content .rowOdd {
+ background-color:#000;
+ }
+ #content #chatList .chatBotErrorMessage {
+ color:red;
+ }
+ #content #chatList a {
+ color:#1E90FF;
+ }
+ #content #chatList .deleteSelected {
+ border-color:red;
+ }
+ #content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color:#212121;
+ color:#FFF;
+ }
+}
\ No newline at end of file
diff --git a/public/chat/css/mobiledev.ajaxchat.css b/public/chat/css/mobiledev.ajaxchat.css
new file mode 100644
index 0000000..0ecd7a1
--- /dev/null
+++ b/public/chat/css/mobiledev.ajaxchat.css
@@ -0,0 +1,410 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @author Philip Nicolcev
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+@import url('textcolours.ajaxchat.css');
+
+/* Fonts */
+#content, #loginContent {
+ font-family: "Segoe UI", sans-serif;
+}
+
+#loginContent {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 0.8em;
+}
+#loginContent h1 {
+ font-size: 1.3em;
+ font-family: "Trebuchet MS", Verdana, Arial, sans-serif;
+ font-weight: bold;
+}
+#loginContent a {
+ text-decoration: none;
+}
+#loginContent a: hover {
+ text-decoration: underline;
+}
+#loginContent #loginRegisteredUsers {
+ font-size: 0.8em;
+}
+#loginContent #copyright {
+ font-size: 0.8em;
+}
+#content {
+ font-size: 0.8em;
+}
+#content h1 {
+ font-size: 1.3em;
+ font-weight: bold;
+}
+#content h3 {
+ font-size: 1.0em;
+}
+#content a {
+ text-decoration: none;
+}
+#content a: hover {
+ text-decoration: underline;
+}
+#content #copyright {
+ font-size: 0.8em;
+}
+#content #chatList span.dateTime {
+ font-size: 0.7em;
+}
+#content #chatList .chatBotMessage {
+ font-style: italic;
+}
+#content #chatList .chatBotErrorMessage {
+ font-style: italic;
+}
+#content #chatList .privmsg {
+ font-style: italic;
+}
+#content #chatList .action {
+ font-style: italic;
+}
+#content #chatList q {
+ font-variant: small-caps;
+}
+#content #chatList code {
+ font-size: 1.2em;
+}
+#content #onlineListContainer #onlineList div {
+ font-size: 0.9em;
+}
+#content #helpContainer #helpList td {
+ font-size: 0.9em;
+}
+#content #helpContainer #helpList td.code {
+ font-style: italic;
+}
+#content #settingsContainer #settingsList td {
+ font-size: 0.9em;
+}
+/* Positioning */
+#loginContent {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+#loginContent #loginHeadlineContainer {
+ margin: 100px 100px 0 100px;
+}
+#loginContent #loginFormContainer, #loginContent #errorContainer {
+ margin: 0 100px;
+}
+#loginContent #loginFormContainer div {
+ margin-bottom: 7px;
+}
+#loginContent #loginRegisteredUsers {
+ padding-top: 5px;
+}
+#loginContent #copyright {
+ margin: 20px 100px 0 100px;
+}
+#content {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+#content #copyright {
+ position: absolute;
+ right: 10px;
+ top: 10px;
+}
+#content #headlineContainer {
+ position: absolute;
+ left: 10px;
+ top: 3px;
+}
+#content #logoutChannelContainer {
+ position: absolute;
+ left: 10px;
+ top: 50px;
+}
+#content #logoutChannelContainer select{
+ width: 105px;
+ height: 22px;
+}
+#content #chatList {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ top: 40px;
+ bottom: 70px;
+ overflow: auto;
+}
+#content #onlineListContainer, #content #settingsContainer {
+ position: absolute;
+ left: 10px;
+ right: 10px;
+ top: 40px;
+ bottom: 70px;
+}
+#content #bbCodeContainer {
+ position: absolute;
+ left: 10px;
+ bottom: 10px;
+ padding: 3px;
+ display: block;
+}
+#content #colorCodesContainer {
+ position: absolute;
+ left: 10px;
+ bottom: 37px;
+ padding: 3px;
+ z-index: 1;
+}
+#content #emoticonsContainer {
+ position: absolute;
+ left: 10px;
+ bottom: 57px;
+ padding: 3px;
+}
+#content #optionsContainer {
+ position: absolute;
+ right: 10px;
+ top: 5px;
+ padding: 3px;
+ margin-left: auto;
+ margin-top: 2px;
+}
+#content #bbCodeContainer input, #content .actionButton, #loginContent #loginButton {
+ padding: 1px 2px;
+}
+#content #colorCodesContainer a {
+ display: block;
+ float: left;
+ width: 20px;
+ height: 20px;
+}
+#content #optionsContainer input {
+ vertical-align: middle;
+}
+#content #optionsContainer input.button {
+ width: 22px;
+ height: 22px;
+}
+#content #emoticonsContainer a {
+ margin-left: 1px;
+ margin-right: 1px;
+}
+#content #emoticonsContainer img {
+ vertical-align: middle;
+ margin-bottom: 2px;
+}
+#content #headlineContainer h1 {
+ margin-left: auto;
+ margin-top: 6px;
+}
+#content #chatList div {
+ padding: 3px 10px;
+}
+#content #chatList img {
+ vertical-align: middle;
+ margin-bottom: 2px;
+}
+#content #chatList cite {
+ margin-right: 5px;
+}
+#content #chatList .bbCodeImage {
+ vertical-align: top;
+ overflow: auto;
+ margin: 5px;
+}
+#content #chatList .delete {
+ display: block;
+ float: right;
+ width: 10px;
+ height: 10px;
+ margin-top: 2px;
+ padding-left: 5px;
+ background: url('../images/delete.png') no-repeat right;
+}
+#content #inputField {
+ position: absolute;
+ bottom: 0px;
+ left: 0px;
+ width: calc(100% - 53px);
+ height: 40px;
+ display: inline-block;
+ margin: 0px !important;
+}
+#content #submitButton {
+ position: absolute;
+ bottom: 0px;
+ right: 0px;
+ width: 50px;
+ height: 41px;
+ margin: 0px !important;
+}
+#content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ height: 30px;
+ padding: 4px 10px;
+ margin: 0px;
+ text-align: center;
+}
+#content #onlineListContainer #onlineList, #content #helpContainer #helpList, #content #settingsContainer #settingsList {
+ position: absolute;
+ left: 0px;
+ top: 25px;
+ right: 0px;
+ bottom: 0px;
+ overflow: auto;
+}
+#content #onlineListContainer #onlineList div {
+ padding: 2px 10px;
+}
+#content #onlineListContainer #onlineList a {
+ display: block;
+}
+#content #onlineListContainer #onlineList ul {
+ margin: 5px 0;
+ padding-left: 10px;
+}
+#content #helpContainer #helpList td, #content #settingsContainer #settingsList td {
+ vertical-align: top;
+}
+#content #settingsContainer #settingsList td {
+ vertical-align: middle;
+}
+#content #settingsContainer #settingsList td.setting {
+}
+#content #settingsContainer #settingsList input.text {
+ width: 100px;
+}
+#content #settingsContainer #settingsList select.left {
+ text-align: right;
+}
+#content #settingsContainer #settingsList input.button {
+ height: 22px;
+ vertical-align: middle;
+ margin-bottom: 2px;
+}
+
+/* Buttons */
+#content #optionsContainer #settingsButton {
+ background: url('../images/settings.png') no-repeat;
+}
+#content #optionsContainer #onlineListButton {
+ background: url('../images/users.png') no-repeat;
+}
+#content #optionsContainer #audioButton {
+ background: url('../images/audio.png') no-repeat 0px 0px;
+}
+#content #optionsContainer #audioButton.off {
+ background-position: 0px 100%;
+}
+#content #optionsContainer #autoScrollButton {
+ background: url('../images/autoscroll.png') no-repeat;
+}
+#content #optionsContainer #autoScrollButton.off {
+ background: url('../images/autoscroll-off.png') no-repeat;
+}
+
+/* Borders */
+#content img {
+ border: none;
+}
+#content #chatList .deleteSelected {
+ border-width: 1px;
+ border-style: dotted;
+}
+#content #helpContainer #helpList table, #content #settingsContainer #settingsList table {
+ border-collapse: collapse;
+}
+
+/* Misc */
+#content #bbCodeContainer input, #content #optionsContainer input.button, #content #settingsContainer #settingsList input.button, #content .actionButton, #loginContent #loginButton {
+ cursor: pointer;
+}
+
+/* Buttons */
+#content #bbCodeContainer input, #content .actionButton, #loginForm #loginButton {
+ background-color: #000;
+ color: #f0f0f0;
+ border: 1px solid #808080;
+ background-image: linear-gradient(to bottom, #222, #000);
+}
+#content select, #loginForm select, #loginForm input, #content textarea {
+ background-color: #000;
+ color: #fafafa;
+ border: 1px solid #808080;
+}
+
+/* Status Icon */
+#content #statusIconContainer {
+ height: 1px;
+}
+#content .statusContainerOff {
+ background: #2F2;
+}
+#content .statusContainerOn {
+ background: #FF2;
+}
+#content .statusContainerAlert {
+ background: #F22;
+}
+
+/* Other Theme Elements */
+#loginContent {
+ background-color: #000;
+ color: #FFF;
+}
+#loginContent h1 {
+ color: #FFF;
+}
+#loginContent a {
+ color: #FFF;
+}
+#loginContent input, #loginContent select {
+ background-color: #212121;
+ color: #FFF;
+}
+#loginContent #errorContainer {
+ color: red;
+}
+#content {
+ background-color: #000;
+ color: #FFF;
+}
+#content h1 {
+ color: #FFF;
+}
+#content a {
+ color: #FFF;
+}
+#content #chatList, #content #onlineListContainer, #content #helpContainer, #content #settingsContainer, #content #colorCodesContainer, #content textarea {
+ background-color: #444;
+}
+#content #colorCodesContainer a {
+ border-color: black;
+}
+#content #optionsContainer input {
+ background-color: transparent;
+}
+#content .rowEven {
+ background-color: #212121;
+}
+#content .rowOdd {
+ background-color: #000;
+}
+#content #chatList .chatBotErrorMessage {
+ color: red;
+}
+#content #chatList a {
+ color: #1E90FF;
+}
+#content #chatList .deleteSelected {
+ border-color: red;
+}
+#content #onlineListContainer h3, #content #helpContainer h3, #content #settingsContainer h3 {
+ background-color: #212121;
+ color: #FFF;
+}
\ No newline at end of file
diff --git a/public/chat/css/textcolours.ajaxchat.css b/public/chat/css/textcolours.ajaxchat.css
new file mode 100644
index 0000000..4c3bb3b
--- /dev/null
+++ b/public/chat/css/textcolours.ajaxchat.css
@@ -0,0 +1,219 @@
+/* Color Container */
+a.Silver {
+ background-color: #C0C0C0;
+}
+a.Citrine {
+ background-color: #F2D839;
+}
+a.Orange {
+ background-color: #FFA500;
+}
+a.Pumpkin {
+ background-color: #FF7518;
+}
+a.Red {
+ background-color: #F50000;
+}
+a.Crimson {
+ background-color: #C00000;
+}
+a.Ruby {
+ background-color: #E0115F;
+}
+a.Amaranth {
+ background-color: #E52B50;
+}
+a.Thulite {
+ background-color: #DE6FA1;
+}
+a.Pink {
+ background-color: #FF6FF2;
+}
+a.Purpureus {
+ background-color: #9A4EAE;
+}
+a.Antisia {
+ background-color: #915C83;
+}
+a.Cerulean {
+ background-color: #007BA7;
+}
+a.Cobalt {
+ background-color: #0047AB;
+}
+a.Aqua {
+ background-color: #20E4FF;
+}
+a.Mint {
+ background-color: #39F2B1;
+}
+a.Keppel {
+ background-color: #3AB09E;
+}
+a.Teal {
+ background-color: #008585;
+}
+a.Green {
+ background-color: #008500;
+}
+a.Chartreuse {
+ background-color: #7FFF00;
+}
+a.Nitrate {
+ background-color: #95CC00;
+}
+a.Lilive {
+ background-color: #C0C000;
+}
+a.Daive {
+ background-color: #858500;
+}
+a.Zaffre {
+ background-color: #0014A8;
+}
+a.Amethyst {
+ background-color: #9966CC;
+}
+
+/* Text Color */
+#content .Silver {
+ color: #C0C0C0;
+}
+#content .Citrine {
+ color: #F2D839;
+}
+#content .Orange {
+ color: #FFA500;
+}
+#content .Pumpkin {
+ color: #FF7518;
+}
+#content .Red {
+ color: #F50000;
+}
+#content .Crimson {
+ color: #C00000;
+}
+#content .Ruby {
+ color: #E0115F;
+}
+#content .Amaranth {
+ color: #E52B50;
+}
+#content .Irresistible {
+ color: #B3446C;
+}
+#content .Thulite {
+ color: #DE6FA1;
+}
+#content .Pink {
+ color: #FF6FF2;
+}
+#content .Purpureus {
+ color: #9A4EAE;
+}
+#content .Antisia {
+ color: #915C83;
+}
+#content .Cerulean {
+ color: #007BA7;
+}
+#content .Cobalt {
+ color: #0047AB;
+}
+#content .Aqua {
+ color: #20E4FF;
+}
+#content .Turquoise {
+ color: #40E0D0;
+}
+#content .Mint {
+ color: #39F2B1;
+}
+#content .Keppel {
+ color: #3AB09E;
+}
+#content .Teal {
+ color: #008585;
+}
+#content .Green {
+ color: #008500;
+}
+#content .Lime {
+ color: #BFFF00;
+}
+#content .Chartreuse {
+ color: #7FFF00;
+}
+#content .Nitrate {
+ color: #95CC00;
+}
+#content .Lilive {
+ color: #C0C000;
+}
+#content .Daive {
+ color: #858500;
+}
+#content .Zaffre {
+ color: #0014A8;
+}
+#content .Amethyst {
+ color: #9966CC;
+}
+
+/* Username colors */
+#content .guest {
+ color: gray;
+}
+#content #chatList span.guest {
+ font-weight: bold;
+}
+#content .user {
+ color: #FFF;
+}
+#content #chatList span.user {
+ font-weight: bold;
+}
+#content .moderator {
+ color: #0A0;
+}
+#content #chatList span.moderator {
+ font-weight: bold;
+}
+#content .admin {
+ color: #A00;
+}
+#content #chatList span.admin {
+ font-weight: bold;
+}
+#content .chatBot {
+ color: #9E8DA7;
+}
+#content #chatList span.chatBot {
+ font-weight: bold;
+ font-style: italic;
+}
+#content .purple {
+ color: #824CA0;
+}
+#content #chatList span.purple {
+ font-weight: bold;
+}
+#content .cmod {
+ color: #09F;
+}
+#content #chatList span.cmod {
+ font-weight: bold;
+}
+#content .bots {
+ color: #9E8DA7;
+}
+#content #chatList span.bots {
+ font-weight: bold;
+}
+#content .donator {
+ color: #EE9400;
+}
+#content #chatList span.donator {
+ font-weight: bold;
+}
\ No newline at end of file
diff --git a/public/chat/css/yuuno.css b/public/chat/css/yuuno.css
new file mode 100644
index 0000000..dc16060
--- /dev/null
+++ b/public/chat/css/yuuno.css
@@ -0,0 +1,1220 @@
+/*
+ * Flashii.net Style Codename "Yuuno"
+ */
+@charset "utf-8";
+
+/* Standard Elements */
+* {
+ /* Reset margin and padding */
+ margin: 0;
+ padding: 0;
+}
+html {
+ width: 100%;
+ height: 100%;
+}
+body {
+ font: 12px/20px Verdana, sans-serif;
+ background: linear-gradient(180deg, #C2AFFE, #FBEEFF) no-repeat scroll left top #FBEEFF;
+ background-size: cover;
+ color: #000;
+ height: 100%;
+ position: relative;
+ width: 100%;
+}
+
+#container {
+ min-height: 100%;
+ position: relative;
+ width: 100%;
+}
+#contentwrapper {
+ padding-bottom: 220px;
+}
+@media (max-width: 1033px) {
+ #contentwrapper {
+ padding-bottom: 230px;
+ }
+}
+@media (max-width: 860px) {
+ #contentwrapper {
+ padding-bottom: 375px;
+ }
+}
+@media (max-width: 510px) {
+ #contentwrapper {
+ padding-bottom: 380px;
+ }
+}
+@media (max-width: 426px) {
+ #contentwrapper {
+ padding-bottom: 625px;
+ }
+}
+
+.clear {
+ clear: both !important;
+ float: none !important;
+}
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+
+hr.default {
+ border: 0;
+ height: 1px;
+ color: #9475B2;
+ background: #9475B2;
+}
+
+img {
+ max-width: 100%;
+ max-height: 100%;
+}
+img.default-avatar-setting {
+ max-width: 200px;
+ max-height: 200px;
+ border: 3px solid #EEE;
+ background: #EEE;
+ box-shadow: 0 3px 7px #888;
+ border-radius: 3px;
+ margin: 5px;
+}
+img.homepage-menu-avatar {
+ float: right;
+ max-width: 100px;
+ max-width: 100px;
+ margin-top: -25px;
+ margin-right: 0;
+}
+@media (max-width: 400px) {
+ img.homepage-menu-avatar {
+ display: none;
+ }
+}
+.standalone img:not(:hover) {
+ max-width: 100%;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+a.underline:hover {
+ text-decoration: underline !important;
+}
+a.default {
+ color: #22E;
+ text-decoration: none;
+}
+a.default:hover {
+ color: #22E;
+ text-decoration: underline;
+}
+a.default:active {
+ color: #E22;
+ text-decoration: underline;
+}
+a.gotop {
+ display: inline-block;
+ background: url('https://static.flash.moe/images/arrow.png') #111;
+ color: #FFF;
+ width: 60px;
+ height: 60px;
+ border-radius: 5px;
+ text-decoration: none;
+ opacity: .3;
+ transition: opacity .5s, box-shadow .5s;
+ margin: 10px 5px;
+ float: right;
+ position: fixed;
+ bottom: 0;
+ right: 5px;
+ z-index: 2;
+}
+a.gotop:hover {
+ opacity: .8;
+ box-shadow: 0 0 1em #FFF inset;
+}
+a.gotop:active {
+ box-shadow: 0 0 1em #FFF inset;
+ opacity: .9;
+}
+
+/* Keyframe Elements */
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+@keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ display: none;
+ }
+}
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ display: block;
+ }
+}
+
+/* Notifications */
+.notifications {
+ position: fixed;
+ top: 5px;
+ right: 5px;
+ z-index: 3;
+}
+.notifications div {
+ min-width: 200px;
+ max-width: 400px;
+ background: rgba(0, 0, 0, .6);
+ border: 2px solid #306;
+ border-radius: 10px;
+ padding: 10px;
+ color: #FFF;
+ font-weight: 700;
+ margin: 5px;
+}
+
+/* Site Header Styling */
+.header {
+ text-align: center;
+ background: linear-gradient(180deg, #C2AFFE, #CCBAFE);
+ box-shadow: 0 0 5px #8364A1;
+}
+/*.header .logo {
+ display: block;
+ height: 120px;
+ width: 350px;
+ border: 0px;
+ background: url('//cdn.flashii.net/img/satorilogo.png') no-repeat scroll left top transparent;
+ background-size: cover;
+ margin: 0px auto;
+}*/
+.header .logo {
+ background: none;
+ height: auto;
+ width: auto;
+ display: inline-block;
+ text-decoration: none;
+ font: 100 70px/80px "Segoe UI", sans-serif;
+ color: #B06AC4;
+ transition: color .2s, text-shadow .2s;
+}
+.header .logo:after {
+ content: "Flashii.net";
+}
+.header .logo:hover {
+ color: #C17BD5;
+ text-shadow: 0 0 .1em #C17BD5;
+}
+.header .logo:active {
+ color: #A059B3;
+ text-shadow: 0 0 .1em #A059B3;
+}
+@media (max-width: 768px) {
+ /*.header .logo {
+ background: none;
+ height: auto;
+ width: auto;
+ display: inline-block;
+ text-decoration: none;
+ font: 50px/60px "Segoe UI Light", sans-serif;
+ color: #B06AC4;
+ }*/
+ .header .logo {
+ font: 100 50px/60px "Segoe UI", sans-serif;
+ }
+}
+.header .menu {
+ border-bottom: 2px solid #9475B2;
+}
+.header .menu .menu-nav {
+ text-align: left;
+ float: left;
+}
+.header .menu .menu-ucp {
+ text-align: right;
+ float: right;
+}
+.header .menu .menu-mob {
+ display: none;
+}
+.header .menu .menu-item {
+ margin: 0 8px -2px;
+ display: inline-block;
+ min-width: 75px;
+ padding: 5px;
+ border-bottom: 2px solid #8364A1;
+ color: inherit;
+ text-decoration: none;
+ text-align: center;
+ transition: border-color .5s, background .3s;
+}
+.header .menu .menu-item.avatar {
+ width: auto;
+ padding-left: 36px;
+ background: url('../images/pixel.png') no-repeat scroll left center / contain transparent;
+}
+.header .menu .menu-item:hover {
+ border-color: #503180 !important;
+}
+.header .menu .menu-item:active {
+ border-color: #503180 !important;
+ background-color: #503180 !important;
+}
+.header .menu .menu-donate:hover {
+ border-color: #EE9400 !important;
+}
+.header .menu .menu-donate:active {
+ border-color: #EE9400 !important;
+ background-color: #EE9400 !important;
+}
+
+@media (max-width: 1120px) and (min-width: 769px) {
+ .header .menu {
+ border: 0;
+ padding-bottom: 5px;
+ }
+ .header .menu .menu-nav, .header .menu .menu-ucp {
+ display: block;
+ float: none;
+ text-align: center;
+ }
+ .header .menu .menu-item {
+ min-width: 120px;
+ border: 0;
+ margin: 0 8px;
+ }
+ .header .menu .menu-nav .menu-item {
+ min-width: 120px;
+ border-bottom: 1px solid #8364A1;
+ }
+ .header .menu .menu-ucp .menu-item {
+ min-width: 120px;
+ border-top: 1px solid #8364A1;
+ }
+}
+
+@media (max-width: 768px) {
+ .header .menu .menu-nav, .header .menu .menu-ucp {
+ float: none;
+ text-align: center;
+ display: none;
+ }
+ .header .menu .menu-hid {
+ display: block;
+ }
+ .header .menu .menu-mob {
+ display: block;
+ }
+ .header .menu .menu-mob .menu-item {
+ width: 100px;
+ }
+ .header .menu .menu-nav .menu-item, .header .menu .menu-ucp .menu-item {
+ display: block;
+ border-top: 0;
+ border-bottom: 1px solid #8364A1;
+ margin: 0 8px;
+ }
+ .header .menu .menu-nav:before {
+ content: "Navigation";
+ font-size: 20px;
+ line-height: 40px;
+ }
+ .header .menu .menu-ucp:before {
+ content: "User Settings";
+ font-size: 20px;
+ line-height: 40px;
+ }
+}
+
+/* Footer Styling */
+.footer {
+ box-shadow: 0 0 1em #9475B2;
+ font-size: small;
+ width: 100%;
+ padding-top: 10px;
+ padding-bottom: 30px;
+ background: linear-gradient(180deg, #9475B2 0%, #FBEEFF 20%, #C2AFFE 100%) #C2AFFE;
+ position: absolute;
+ bottom: 0;
+}
+.footer .ftsections a {
+ color: inherit;
+ text-decoration: none;
+}
+.footer .ftsections a:hover {
+ text-decoration: underline;
+}
+.footer .ftsections {
+ margin: auto;
+ text-align: center;
+ width: 95%;
+ min-height: 150px;
+}
+.footer .ftsections .ftsection {
+ vertical-align: top;
+ text-align: left;
+ display: inline-block;
+ width: 200px;
+ list-style-type: none;
+}
+.footer .ftsections .ftsection li {
+ margin: 2px;
+}
+.footer .ftsections .ftsection li.fthead {
+ margin-bottom: 5px;
+ font-weight: 700;
+}
+.footer .sections .copycentre {
+ text-align: center;
+ width: 100%;
+}
+
+/* Main content related stuff */
+.content {
+ margin: 10px auto;
+ padding: 2px 3px;
+ width: 1024px;
+ border: 1px solid #9475B2;
+ box-shadow: 0 0 3px #9475B2;
+ border-radius: 3px;
+ background: #D3BFFF;
+}
+.standalone {
+ background: #C2AEEE;
+ padding: 10px;
+ width: auto;
+ max-width: 1024px;
+}
+.private-message {
+ border-top: 1px solid #C2AEEE;
+}
+
+/* Markdown Section */
+.markdown {
+ font: 12px/1.4 "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
+ word-wrap: break-word;
+}
+.markdown a {
+ color: #00F;
+ text-decoration: none;
+}
+.markdown a:hover {
+ color: #00F;
+ text-decoration: underline;
+}
+.markdown a:active {
+ color: #F00;
+ text-decoration: underline;
+}
+.markdown h1, .markdown h2, .markdown h3, .markdown h4, .markdown h5, .markdown h6 {
+ border-bottom: 1px solid;
+ padding-bottom: 5px;
+ font-weight: 700;
+}
+.markdown p, .markdown blockquote, .markdown ul, .markdown ol, .markdown dl, .markdown table, .markdown pre {
+ margin-top: 0;
+ margin-bottom: 16px;
+}
+.markdown hr {
+ border: 0;
+ height: 1px;
+ color: #000;
+ background: #000;
+ margin: 0;
+}
+.markdown table {
+ display: block;
+ width: 100%;
+ overflow: auto;
+ word-break: keep-all;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+.markdown table tr {
+ border-spacing: 0;
+ border: 1px solid #9475B2;
+}
+.markdown table th, .markdown table td {
+ padding: 6px 13px;
+ border: 1px solid #9475B2;
+}
+.markdown table tr:nth-child(even) {
+ background: #B19DDD;
+}
+.markdown hr {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC') repeat-x scroll 0px 0px transparent;
+ border: 0 none;
+ color: #CCC;
+ height: 4px;
+ padding: 0;
+ margin: 15px 0;
+}
+.markdown blockquote {
+ border-left: 4px solid #9475B2;
+ padding: 0 15px;
+ color: #555;
+}
+.markdown blockquote > blockquote {
+ margin-left: 0;
+}
+.markdown blockquote > :last-child {
+ margin-bottom: 0;
+}
+.markdown pre {
+ word-wrap: normal;
+}
+.markdown .highlight pre, .markdown pre {
+ background: #B19DDD;
+ border: 1px solid #9475B2;
+ font-size: 13px;
+ line-height: 19px;
+ overflow: auto;
+ padding: 6px 10px;
+ border-radius: 3px;
+}
+.markdown ul, .markdown ol {
+ margin-left: 40px;
+}
+
+/* Styling for the plain HTML button on the /r/ pages */
+.markdown-raw {
+ width: 100%;
+ margin-top: 7px;
+ text-align: center;
+}
+.markdown-raw a {
+ display: inline-block;
+ margin: 0 auto;
+ border-radius: 5px;
+ background: #A08DDC;
+ padding: 8px 10px;
+ box-shadow: inset 0 0 .5em #000;
+ text-decoration: none;
+ color: #000;
+ transition: box-shadow .2s;
+ min-width: 200px;
+}
+.markdown-raw a:active {
+ box-shadow: inset 0 0 1em #000;
+}
+
+/* Content div styling */
+.content-column {
+ position: relative;
+ min-height: 600px;
+}
+.content-left {
+ float: left;
+ width: 688px;
+}
+.content-right {
+ float: right;
+ width: 334px;
+}
+.content-left .head,
+.news .head,
+.donate .head,
+.loginPage > .loginCont .head,
+.messages .head {
+ margin: -1px -2px;
+ padding: 4px 5px 5px;
+ font-weight: 700;
+ font-size: 20px;
+ color: #306;
+ background: linear-gradient(90deg, rgba(148,117,178,.7), rgba(148,117,178,0)) #C2AFFE;
+ border-radius: 2px;
+}
+.content-right .head,
+.loginPage > .registerForm .head {
+ margin: -1px -2px -1px;
+ padding: 4px 5px 5px;
+ font-weight: 700;
+ font-size: 20px;
+ color: #306;
+ background: linear-gradient(270deg, rgba(148,117,178,.7), rgba(148,117,178,0)) #C2AFFE;
+ border-radius: 2px;
+}
+
+/* Button div styling */
+.button {
+ margin: 0 0 3px;
+ padding: 7px 5px;
+ text-align: center;
+ border-radius: 5px;
+ font-weight: 100;
+ background: linear-gradient(180deg, #874399, #35245E) #874399;
+ transition: text-shadow .25s;
+ color: #FFF;
+ font-size: 16px;
+ text-decoration: none;
+ display: block;
+}
+.button:hover {
+ text-shadow: 0 0 8px #F1F1F1;
+ cursor: pointer;
+}
+.content-right .registerbutton {
+ background: linear-gradient(180deg, #874399, #35245E) #874399;
+}
+.button.profileOption {
+ width: auto !important;
+}
+
+/* Frontpage news styling (and probably news page too) */
+.news {
+ min-height: 0;
+}
+.news-head {
+ margin: -1px -2px;
+ padding: 4px;
+ background: #C2AFFE;
+ font-weight: 700;
+ display: block;
+ font-size: 17px;
+ color: inherit;
+ text-decoration: none;
+}
+.news-rss {
+ float: right;
+}
+.news-body {
+ font-size: 10pt;
+ padding: 2px 0 0 3px;
+}
+.news-post-time {
+ font-size: 8pt;
+ padding: 6px 15px;
+ text-align: right;
+ font-weight: 700;
+}
+.news-poster {
+ margin-top: -20px;
+ float: right;
+ text-align: center;
+ width: 140px;
+}
+.news-poster img {
+ max-width: 120px;
+ max-height: 120px;
+}
+.news-poster h1 {
+ line-height: 100%;
+ margin: 0;
+ margin-top: -5px;
+}
+@media (max-width: 768px) {
+ .news-poster {
+ margin: 0;
+ }
+}
+@media (max-width: 400px) {
+ .news-poster {
+ margin-top: 10px;
+ width: auto;
+ padding: 0 10px 0 0;
+ }
+ .news-poster img {
+ display: none;
+ }
+}
+
+/* Heading */
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Segoe UI", sans-serif;
+ font-weight: 100;
+ margin: 5px 0;
+}
+h1.stylised {
+ text-shadow: 0 0 5px #8364A1;
+ color: #614390;
+}
+
+/* Homepage */
+.homepage .content-right ul {
+ margin: 10px 0;
+ margin-left: 30px;
+}
+
+/* Chat login */
+.content.chat {
+
+}
+.content.chat .head {
+ margin: -1px -2px -1px;
+ padding: 2px;
+ font-weight: 700;
+ font-size: 20px;
+ color: #306;
+ background: linear-gradient(270deg, rgba(148,117,178,.7), rgba(148,117,178,0)) #C2AFFE;
+ border-radius: 2px;
+}
+
+.content.chat form {
+ padding: 10px;
+}
+
+.content.chat form input[type="text"], .content.chat form input[type="password"] {
+ height: 18px;
+ width: 488px;
+}
+
+.content.chat form *:not(option) {
+ display: block;
+ margin: 1px auto;
+ width: 500px;
+ padding: 5px;
+}
+
+.content.chat .loggedIn {
+ text-align: center;
+}
+
+.content.chat .loggedIn .userBox {
+ padding: 10px;
+ line-height: 330%;
+ width: 150px;
+ height: 180px;
+ background: linear-gradient(180deg, #C2AFFE, #B19EED) no-repeat scroll left top / cover #C2AFFE;
+ margin: 7px;
+ border-radius: 5px;
+ text-align: center;
+ box-shadow: 0 0 .5em #000;
+ display: inline-block;
+ vertical-align: top;
+ transition: box-shadow 0.2s;
+}
+
+.content.chat .loggedIn .userBox:hover {
+ box-shadow: 0 0 1em #000;
+ cursor: pointer;
+}
+
+.content.chat .loggedIn .userBox:active {
+ box-shadow: 0 0 1.5em #609;
+}
+
+.content.chat .loggedIn .userBox img {
+ width: 150px;
+ height: 150px;
+ display: block;
+ margin: 0 auto;
+}
+
+.content.chat .loggedIn .userBox .userBoxUserName {
+ font-weight: 700;
+}
+
+.content.chat a {
+ color: inherit;
+}
+
+/* Profile */
+.profile .button {
+ display: inline-block !important;
+ padding: 7px 16px;
+}
+.profile .standingtable {
+ border-collapse: separate;
+ border-spacing: 0;
+}
+.profile .standingtable td {
+ border-left: 1px solid #9475B2;
+ border-bottom: 1px solid #9475B2;
+ vertical-align: middle;
+}
+.profile .standingtable td:first-child {
+ border-left: 0 none;
+}
+.profile .standingtable tr:last-child td {
+ border-bottom: 0 none;
+}
+.profile .standingtable tr:first-child td {
+ background: #9475B2;
+ padding: 0 3px;
+ font-weight: 700;
+}
+.profile .content-left {
+ max-height: 800px;
+ overflow: auto;
+}
+@media (max-width: 1024px) {
+ .content {
+ width: auto;
+ }
+ .content .content-right {
+ width: 100%;
+ min-height: 0;
+ }
+ .content .content-left {
+ width: 100%;
+ min-height: 0;
+ border-top: 1px solid #9475B2;
+ }
+}
+
+/* Settings */
+.settings .right-menu-nav > div {
+ background: #C2AFFE;
+ padding: 4px;
+ margin: -1px -2px;
+ font-weight: 700;
+ display: block;
+ font-size: 17px;
+}
+.settings .right-menu-nav > a {
+ display: block;
+ font-size: 14px;
+ line-height: 25px;
+ color: #22E;
+ text-decoration: none;
+ padding-left: 10px;
+}
+.settings .right-menu-nav > a:hover {
+ color: #22E;
+ text-decoration: underline;
+}
+.settings .right-menu-nav > a:active {
+ color: #E22;
+ text-decoration: underline;
+}
+.settings .settings-explanation {
+ font-size: 11px;
+ line-height: 18px;
+ padding: 7px;
+ border-bottom: 1px solid #C2AFFE;
+ margin-bottom: 7px;
+}
+.settings .settings-table {
+ width: 100%;
+}
+.settings .settings-table tr > th {
+ font-size: 17px;
+ background: #C2AFFE;
+ padding: 4px;
+ margin: -1px -2px;
+ font-weight: 700;
+}
+.settings .settings-table tr > td {
+ text-align: center;
+}
+.settings .settings-table > tbody > tr:not(:last-child) > td {
+ border-bottom: 1px solid #C2AFFE;
+}
+.settings .settings-table tr.current-session > td {
+ background: #B39EED;
+}
+.settings .profile-field {
+ width: 100%;
+}
+.settings .profile-field > div:nth-child(2) > input {
+ width: calc(100% - 16px);
+}
+.settings .profile-save {
+ text-align: center;
+ padding: 10px;
+}
+.settings .background-frame {
+ max-width: 600px;
+ max-height: 400px;
+ border: 3px solid #EEE;
+ background: #EEE;
+ box-shadow: 0 3px 7px #888;
+ border-radius: 3px;
+ margin: 5px;
+}
+.settings form {
+ overflow: auto;
+}
+
+/* Members page */
+.membersPage {
+ width: 100%;
+ padding: 10px 0;
+ overflow: hidden;
+ text-align: center;
+}
+.membersPage a {
+ color: inherit;
+}
+.membersPage .groupBox, .membersPage .userBox {
+ background: linear-gradient(180deg, #C2AFFE, #B19EED) no-repeat scroll left top / cover #C2AFFE;
+ margin: 7px;
+ border-radius: 5px;
+ text-align: center;
+ box-shadow: 0 0 .5em #000;
+ display: inline-block;
+ vertical-align: top;
+ transition: box-shadow .2s;
+}
+.membersPage .groupBox {
+ padding: 5px;
+ font-size: 15px;
+ min-width: 150px;
+ text-shadow: 0 0 1em #888;
+}
+.membersPage .userBox {
+ padding: 10px;
+ line-height: 330%;
+ width: 200px;
+ height: 230px;
+}
+.membersPage .groupBox:hover, .membersPage .userBox:hover {
+ box-shadow: 0 0 1em #000;
+ cursor: pointer;
+}
+.membersPage .groupBox:active, .membersPage .userBox:active {
+ box-shadow: 0 0 1.5em #609;
+}
+.membersPage .userBox img {
+ width: 200px;
+ height: 200px;
+ display: block;
+ margin: 0 auto;
+}
+.membersPage .userBox .userBoxUserName {
+ font-weight: 700;
+}
+
+/* Drop Down Styling */
+.dropDown {
+ display: inline-block;
+ position: relative;
+}
+.dropDown .dropDownInner {
+ display: inline-block;
+ background: rgba(12, 12, 12, .7);
+ min-width: 200px;
+ border: 2px solid #9475B2;
+ float: left;
+ font-family: "Segoe UI", sans-serif;
+ text-align: left;
+ margin: 0 2px;
+ transition: background .5s;
+}
+.dropDown .dropDownInner:hover {
+ background: rgba(21, 21, 21, .8);
+}
+.dropDown .dropDownInner a {
+ padding: 0 1px 0 4px;
+ display: none;
+ color: #FFF;
+ text-decoration: none;
+ clear: both;
+ transition: background .2s;
+}
+.dropDown .dropDownInner a:hover {
+ background: rgba(21, 21, 21, .5);
+}
+.dropDown .dropDownInner a:active {
+ background: rgba(21, 21, 21, .7);
+}
+.dropDown .dropDownInner a.dropDownSelected {
+ display: inline-block;
+}
+.dropDown .dropDownInner:hover a {
+ display: block;
+ float: none;
+}
+.dropDown .dropDownInner a.dropDownDesc {
+ display: inline-block;
+}
+.dropDown .dropDownInner:hover a.dropDownDesc {
+ display: none;
+}
+
+/* Donate page */
+.donate .sectionHeader {
+ margin: -1px -2px;
+ background: linear-gradient(270deg, rgba(148, 117, 178, .7), rgba(148, 117, 178, 0), rgba(148, 117, 178, .7)) #C2AFFE;
+ padding: 2px;
+ font-weight: 700;
+ font-size: 15px;
+ color: #306;
+}
+.donate .featureParent {
+ width: 100%;
+ padding: 10px 0;
+ overflow: hidden;
+ text-align: center;
+}
+.donate .featureBox {
+ background: linear-gradient(180deg, #C2AFFE, #B19EED) no-repeat scroll left top / cover #C2AFFE;
+ margin: 7px;
+ border-radius: 5px;
+ text-align: center;
+ box-shadow: 0 0 .5em #000;
+ display: inline-block;
+ vertical-align: top;
+ transition: box-shadow .2s;
+ width: 320px;
+ padding: 5px 0;
+}
+.donate .featureBox:hover {
+ box-shadow: 0 0 1em #000;
+ cursor: pointer;
+}
+.donate .featureBox:active {
+ box-shadow: 0 0 1.5em #609;
+}
+.donate .featureBoxHeader {
+ font-weight: 700;
+ font-size: 15px;
+}
+.donate .featureBoxDesc {
+ padding: 1px 2px;
+}
+.donate .featureBoxDesc.donateClosed {
+ display: none;
+}
+.donate .featureBoxDesc.donateOpened {
+ display: block;
+}
+.donate .paypal-donate-form {
+ margin: 10px auto;
+ display: block;
+ text-align: center;
+}
+
+/* Messages */
+.messages > table {
+ width: 100%;
+ border-spacing: 0;
+}
+.messages > .msg-inbox > thead > tr > td {
+ font-weight: 700;
+ text-align: center;
+}
+.messages > .msg-inbox > tbody > tr > td {
+ border-bottom: 1px solid #B19EED;
+ border-top: 1px solid #B19EED;
+}
+.messages > .msg-inbox > * > tr > td {
+ padding: 0 4px;
+}
+.messages > .msg-inbox > * > tr > td:first-child {
+ width: 150px;
+ text-align: center;
+}
+.messages > .msg-inbox > tbody > tr > td:first-child {
+ border-left: 1px solid #B19EED;
+}
+.messages > .msg-inbox > * > tr > td:last-child {
+ width: 220px;
+ text-align: center;
+}
+.messages > .msg-inbox > tbody > tr > td:last-child {
+ border-right: 1px solid #B19EED;
+}
+
+.messageFoldersContainer {
+ text-align: center;
+ padding: 9px 0 0;
+}
+
+.messageFoldersContainer > .messagesFolder {
+ background: linear-gradient(180deg, #C2AFFE, #B19EED) no-repeat scroll left top / cover #C2AFFE;
+ margin: 7px;
+ border-radius: 5px;
+ text-align: center;
+ box-shadow: 0 0 .5em #000;
+ display: inline-block;
+ vertical-align: top;
+ transition: box-shadow .2s;
+ padding: 5px;
+ font-size: 15px;
+ min-width: 150px;
+ color: inherit;
+ text-decoration: none;
+}
+.messageFoldersContainer > .messagesFolder:hover {
+ box-shadow: 0 0 1em #000;
+ cursor: pointer;
+}
+.messageFoldersContainer > .messagesFolder:active {
+ box-shadow: 0 0 1.5em #609;
+}
+
+/* Input buttons styling */
+input[type="submit"].inputStyling, input[type="button"].inputStyling, input[type="reset"].inputStyling {
+ padding: 3px 10px;
+ cursor: pointer;
+ border: 0;
+ border-radius: 3px;
+ background: linear-gradient(180deg, #9475B2 0%, #9475B2 50%, #86A 50%) #9475B2;
+ margin: 4px 1px;
+ color: #FFF;
+ box-shadow: inset #222 0 0 1px;
+ text-shadow: #888 0 0 2px;
+ transition: text-shadow .5s, box-shadow .5s;
+ font-size: 22px;
+ min-width: 120px;
+}
+input[type="submit"].inputStyling:hover, input[type="button"].inputStyling:hover, input[type="reset"].inputStyling:hover {
+ box-shadow: inset #222 0 0 3px;
+ text-shadow: #F1F1F1 0 0 5px;
+}
+input[type="submit"].inputStyling:active, input[type="button"].inputStyling:active, input[type="reset"].inputStyling:active {
+ box-shadow: inset #222 0 0 5px;
+ text-shadow: #F1F1F1 0 0 3px;
+ transition: text-shadow .2s, box-shadow .2s;
+}
+input[type="text"].inputStyling, input[type="password"].inputStyling, input[type="date"].inputStyling, input[type="url"].inputStyling {
+ padding: 3px 4px;
+ border: 1px solid #CCC;
+ box-shadow: inset #DDD 0 0 5px;
+ background: linear-gradient(180deg, #FFF 0%, #EEE 50%, #E5E5E5 50%) #FFF;
+}
+textarea.inputStyling {
+ padding: 3px 4px;
+ border: 1px solid #CCC;
+ box-shadow: inset #DDD 0 0 5px;
+ background: linear-gradient(180deg, #FFF 0%, #EEE 50%, #E5E5E5 50%) #FFF;
+}
+
+/* Login and Register pages */
+.loginPage {
+ margin: 0 auto;
+ max-width: 825px;
+}
+.loginPage > .registerForm,
+.loginPage > .loginCont > * {
+ text-align: center;
+ border: 1px solid #9475B2;
+ margin: 10px auto;
+ padding: 2px 3px;
+ width: 400px;
+ border: 1px solid #9475B2;
+ box-shadow: 0 0 3px #9475B2;
+ border-radius: 3px;
+ background: #D3BFFF;
+}
+@media (max-width: 430px) {
+ .loginPage > .registerForm,
+ .loginPage > .loginCont > * {
+ width: 300px;
+ }
+}
+.loginPage > .loginCont {
+ float: left;
+}
+.loginPage > .registerForm {
+ float: right;
+}
+@media (max-width: 820px) {
+ .loginPage > .loginCont {
+ float: none;
+ }
+ .loginPage > .registerForm {
+ float: none;
+ }
+}
+.loginPage .head {
+ text-align: left;
+}
+.loginPage > div > form > div > input {
+ font-size: 16px;
+}
+.loginPage input[type="text"], .loginPage input[type="password"] {
+ width: calc(100% - 16px);
+}
+.loginPage form > div > label {
+ font-size: 20px;
+ font-weight: 100;
+ padding: 0 5px;
+ line-height: 32px;
+ color: #222;
+ text-shadow: #888 0 0 3px;
+}
+.loginPage .subLinks {
+ font-size: 10px;
+}
+.loginPage .centreAlign {
+ text-align: center;
+}
+.loginPage .leftAlign {
+ text-align: left;
+}
+
+/* reCAPTCHA */
+.recaptcha {
+ text-align: center;
+ width: 334px;
+ margin: 0 auto;
+}
+.recaptcha > .recaptcha_widget_form {
+ border: 1px solid #9475B2;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+}
+.recaptcha > .recaptcha_widget_form > #recaptcha_image {
+ margin: 0 auto;
+ cursor: pointer;
+}
+.recaptcha > .recaptcha_widget_form > #recaptcha_response_field {
+ width: calc(300px - 10px);
+}
+.recaptcha > .recaptcha_widget_form {
+ float: left;
+}
+.recaptcha > .recaptcha_buttons {
+ float: right;
+ font-size: 25px;
+}
+.recaptcha > .recaptcha_buttons > a {
+ height: 26.9px;
+ display: block;
+ background: linear-gradient(270deg, #9475B2 0%, #9475B2 50%, #86A 50%) repeat scroll 0% 0% #9475B2;
+ padding: 2px 6px 0 4px;
+ margin-bottom: -2px;
+ color: #306;
+ text-shadow: 0 0 1px #306;
+ transition: text-shadow .5s;
+}
+.recaptcha > .recaptcha_buttons > a:hover {
+ text-shadow: #306 0 0 5px;
+}
+.recaptcha > .recaptcha_buttons > a:active {
+ text-shadow: #306 0 0 3px;
+ transition: text-shadow .2s;
+}
+.recaptcha > .recaptcha_buttons > a:first-child {
+ border-top-right-radius: 4px;
+}
+.recaptcha > .recaptcha_buttons > a:last-child {
+ border-bottom-right-radius: 4px;
+}
+@media (max-width: 430px) {
+ .recaptcha {
+ width: 301px;
+ }
+ .recaptcha > .recaptcha_widget_form {
+ position: relative;
+ left: -1px;
+ }
+ .recaptcha > .recaptcha_buttons > a {
+ display: inline-block;
+ width: 26.9px;
+ background: linear-gradient(0deg, #9475B2 0%, #9475B2 50%, #86A 50%) repeat scroll 0% 0% #9475B2;
+ }
+ .recaptcha > .recaptcha_buttons > a:first-child {
+ border-top-right-radius: 0px;
+ border-bottom-left-radius: 4px;
+ }
+}
diff --git a/public/chat/favicon.ico b/public/chat/favicon.ico
new file mode 100644
index 0000000..8f8c8a4
Binary files /dev/null and b/public/chat/favicon.ico differ
diff --git a/public/chat/ie5-6.css b/public/chat/ie5-6.css
new file mode 100644
index 0000000..f1c63c1
--- /dev/null
+++ b/public/chat/ie5-6.css
@@ -0,0 +1,70 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ */
+
+
+/*
+ * Positioning adjustments for IE versions < 7
+ */
+
+body {
+ width:100%;
+ height:100%;
+}
+#content #chatList {
+ position:static;
+ margin-right:230px;
+ margin-left:20px;
+ margin-top:85px;
+ height:360px;
+}
+#content #onlineListContainer {
+ height:360px;
+}
+#content #helpContainer {
+ height:360px;
+}
+#content #settingsContainer {
+ height:360px;
+}
+#content #inputFieldContainer {
+ top:460px;
+ padding:0px;
+}
+#content #submitButtonContainer {
+ top:517px;
+}
+#content #bbCodeContainer {
+ top:550px;
+}
+#content #colorCodesContainer {
+ top:516px;
+}
+#content #emoticonsContainer {
+ top:517px;
+}
+#content #optionsContainer {
+ top:555px;
+}
+#content #inputFieldContainer #inputField {
+ width:94%;
+}
+#content #onlineListContainer #onlineList {
+ width:100%;
+ height:335px;
+ overflow:auto;
+}
+#content #helpContainer #helpList {
+ width:100%;
+ height:335px;
+ overflow:auto;
+}
+#content #settingsContainer #settingsList {
+ width:100%;
+ height:335px;
+ overflow:auto;
+}
\ No newline at end of file
diff --git a/public/chat/images/audio.png b/public/chat/images/audio.png
new file mode 100644
index 0000000..fb37053
Binary files /dev/null and b/public/chat/images/audio.png differ
diff --git a/public/chat/images/autoscroll.png b/public/chat/images/autoscroll.png
new file mode 100644
index 0000000..7c313e5
Binary files /dev/null and b/public/chat/images/autoscroll.png differ
diff --git a/public/chat/images/delete.png b/public/chat/images/delete.png
new file mode 100644
index 0000000..ae99c71
Binary files /dev/null and b/public/chat/images/delete.png differ
diff --git a/public/chat/images/fade-purple.png b/public/chat/images/fade-purple.png
new file mode 100644
index 0000000..46f6669
Binary files /dev/null and b/public/chat/images/fade-purple.png differ
diff --git a/public/chat/images/gothic.woff b/public/chat/images/gothic.woff
new file mode 100644
index 0000000..c438704
Binary files /dev/null and b/public/chat/images/gothic.woff differ
diff --git a/public/chat/images/help.png b/public/chat/images/help.png
new file mode 100644
index 0000000..c67c7a6
Binary files /dev/null and b/public/chat/images/help.png differ
diff --git a/public/chat/images/linkbad.gif b/public/chat/images/linkbad.gif
new file mode 100644
index 0000000..a5d0513
Binary files /dev/null and b/public/chat/images/linkbad.gif differ
diff --git a/public/chat/images/linkgood.gif b/public/chat/images/linkgood.gif
new file mode 100644
index 0000000..e480670
Binary files /dev/null and b/public/chat/images/linkgood.gif differ
diff --git a/public/chat/images/linkyellow.gif b/public/chat/images/linkyellow.gif
new file mode 100644
index 0000000..0e3f9b2
Binary files /dev/null and b/public/chat/images/linkyellow.gif differ
diff --git a/public/chat/images/loading-sprite.png b/public/chat/images/loading-sprite.png
new file mode 100644
index 0000000..5d74214
Binary files /dev/null and b/public/chat/images/loading-sprite.png differ
diff --git a/public/chat/images/pclouds.jpg b/public/chat/images/pclouds.jpg
new file mode 100644
index 0000000..1afaaa7
Binary files /dev/null and b/public/chat/images/pclouds.jpg differ
diff --git a/public/chat/images/pixel.png b/public/chat/images/pixel.png
new file mode 100644
index 0000000..6c6fb51
Binary files /dev/null and b/public/chat/images/pixel.png differ
diff --git a/public/chat/images/playback.png b/public/chat/images/playback.png
new file mode 100644
index 0000000..10102d8
Binary files /dev/null and b/public/chat/images/playback.png differ
diff --git a/public/chat/images/settings.png b/public/chat/images/settings.png
new file mode 100644
index 0000000..cc91d65
Binary files /dev/null and b/public/chat/images/settings.png differ
diff --git a/public/chat/images/users.png b/public/chat/images/users.png
new file mode 100644
index 0000000..bced28c
Binary files /dev/null and b/public/chat/images/users.png differ
diff --git a/public/chat/index.php b/public/chat/index.php
new file mode 100644
index 0000000..55d86e5
--- /dev/null
+++ b/public/chat/index.php
@@ -0,0 +1,24 @@
+ 0) {
+ for (var i = 0; i < ol; i++) {
+ if (typeof objects[i].SetVariable != "undefined") {
+ activeObjects[activeObjects.length] = objects[i];
+ }
+ }
+ }
+ var embeds = document.getElementsByTagName("embed");
+ var el = embeds.length;
+ var activeEmbeds = [];
+ if (el > 0) {
+ for (var j = 0; j < el; j++) {
+ if (typeof embeds[j].SetVariable != "undefined") {
+ activeEmbeds[activeEmbeds.length] = embeds[j];
+ }
+ }
+ }
+ var aol = activeObjects.length;
+ var ael = activeEmbeds.length;
+ var searchStr = "bridgeName="+ bridgeName;
+ if ((aol == 1 && !ael) || (aol == 1 && ael == 1)) {
+ FABridge.attachBridge(activeObjects[0], bridgeName);
+ }
+ else if (ael == 1 && !aol) {
+ FABridge.attachBridge(activeEmbeds[0], bridgeName);
+ }
+ else {
+ var flash_found = false;
+ if (aol > 1) {
+ for (var k = 0; k < aol; k++) {
+ var params = activeObjects[k].childNodes;
+ for (var l = 0; l < params.length; l++) {
+ var param = params[l];
+ if (param.nodeType == 1 && param.tagName.toLowerCase() == "param" && param["name"].toLowerCase() == "flashvars" && param["value"].indexOf(searchStr) >= 0) {
+ FABridge.attachBridge(activeObjects[k], bridgeName);
+ flash_found = true;
+ break;
+ }
+ }
+ if (flash_found) {
+ break;
+ }
+ }
+ }
+ if (!flash_found && ael > 1) {
+ for (var m = 0; m < ael; m++) {
+ var flashVars = activeEmbeds[m].attributes.getNamedItem("flashVars").nodeValue;
+ if (flashVars.indexOf(searchStr) >= 0) {
+ FABridge.attachBridge(activeEmbeds[m], bridgeName);
+ break;
+ }
+ }
+ }
+ }
+ return true;
+}
+
+// used to track multiple bridge instances, since callbacks from AS are global across the page.
+
+FABridge.nextBridgeID = 0;
+FABridge.instances = {};
+FABridge.idMap = {};
+FABridge.refCount = 0;
+
+FABridge.extractBridgeFromID = function(id)
+{
+ var bridgeID = (id >> 16);
+ return FABridge.idMap[bridgeID];
+}
+
+FABridge.attachBridge = function(instance, bridgeName)
+{
+ var newBridgeInstance = new FABridge(instance, bridgeName);
+
+ FABridge[bridgeName] = newBridgeInstance;
+
+/* FABridge[bridgeName] = function() {
+ return newBridgeInstance.root();
+ }
+*/
+ var callbacks = FABridge.initCallbacks[bridgeName];
+ if (callbacks == null)
+ {
+ return;
+ }
+ for (var i = 0; i < callbacks.length; i++)
+ {
+ callbacks[i].call(newBridgeInstance);
+ }
+ delete FABridge.initCallbacks[bridgeName]
+}
+
+// some methods can't be proxied. You can use the explicit get,set, and call methods if necessary.
+
+FABridge.blockedMethods =
+{
+ toString: true,
+ get: true,
+ set: true,
+ call: true
+};
+
+FABridge.prototype =
+{
+
+
+// bootstrapping
+
+ root: function()
+ {
+ return this.deserialize(this.target.getRoot());
+ },
+//clears all of the AS objects in the cache maps
+ releaseASObjects: function()
+ {
+ return this.target.releaseASObjects();
+ },
+//clears a specific object in AS from the type maps
+ releaseNamedASObject: function(value)
+ {
+ if(typeof(value) != "object")
+ {
+ return false;
+ }
+ else
+ {
+ var ret = this.target.releaseNamedASObject(value.fb_instance_id);
+ return ret;
+ }
+ },
+//create a new AS Object
+ create: function(className)
+ {
+ return this.deserialize(this.target.create(className));
+ },
+
+
+ // utilities
+
+ makeID: function(token)
+ {
+ return (this.bridgeID << 16) + token;
+ },
+
+
+ // low level access to the flash object
+
+//get a named property from an AS object
+ getPropertyFromAS: function(objRef, propName)
+ {
+ if (FABridge.refCount > 0)
+ {
+ throw new Error("You are trying to call recursively into the Flash Player which is not allowed. In most cases the JavaScript setTimeout function, can be used as a workaround.");
+ }
+ else
+ {
+ FABridge.refCount++;
+ retVal = this.target.getPropFromAS(objRef, propName);
+ retVal = this.handleError(retVal);
+ FABridge.refCount--;
+ return retVal;
+ }
+ },
+//set a named property on an AS object
+ setPropertyInAS: function(objRef,propName, value)
+ {
+ if (FABridge.refCount > 0)
+ {
+ throw new Error("You are trying to call recursively into the Flash Player which is not allowed. In most cases the JavaScript setTimeout function, can be used as a workaround.");
+ }
+ else
+ {
+ FABridge.refCount++;
+ retVal = this.target.setPropInAS(objRef,propName, this.serialize(value));
+ retVal = this.handleError(retVal);
+ FABridge.refCount--;
+ return retVal;
+ }
+ },
+
+//call an AS function
+ callASFunction: function(funcID, args)
+ {
+ if (FABridge.refCount > 0)
+ {
+ throw new Error("You are trying to call recursively into the Flash Player which is not allowed. In most cases the JavaScript setTimeout function, can be used as a workaround.");
+ }
+ else
+ {
+ FABridge.refCount++;
+ retVal = this.target.invokeASFunction(funcID, this.serialize(args));
+ retVal = this.handleError(retVal);
+ FABridge.refCount--;
+ return retVal;
+ }
+ },
+//call a method on an AS object
+ callASMethod: function(objID, funcName, args)
+ {
+ if (FABridge.refCount > 0)
+ {
+ throw new Error("You are trying to call recursively into the Flash Player which is not allowed. In most cases the JavaScript setTimeout function, can be used as a workaround.");
+ }
+ else
+ {
+ FABridge.refCount++;
+ args = this.serialize(args);
+ retVal = this.target.invokeASMethod(objID, funcName, args);
+ retVal = this.handleError(retVal);
+ FABridge.refCount--;
+ return retVal;
+ }
+ },
+
+ // responders to remote calls from flash
+
+ //callback from flash that executes a local JS function
+ //used mostly when setting js functions as callbacks on events
+ invokeLocalFunction: function(funcID, args)
+ {
+ var result;
+ var func = this.localFunctionCache[funcID];
+
+ if(func != undefined)
+ {
+ result = this.serialize(func.apply(null, this.deserialize(args)));
+ }
+
+ return result;
+ },
+
+ // Object Types and Proxies
+
+ // accepts an object reference, returns a type object matching the obj reference.
+ getTypeFromName: function(objTypeName)
+ {
+ return this.remoteTypeCache[objTypeName];
+ },
+ //create an AS proxy for the given object ID and type
+ createProxy: function(objID, typeName)
+ {
+ var objType = this.getTypeFromName(typeName);
+ instanceFactory.prototype = objType;
+ var instance = new instanceFactory(objID);
+ this.remoteInstanceCache[objID] = instance;
+ return instance;
+ },
+ //return the proxy associated with the given object ID
+ getProxy: function(objID)
+ {
+ return this.remoteInstanceCache[objID];
+ },
+
+ // accepts a type structure, returns a constructed type
+ addTypeDataToCache: function(typeData)
+ {
+ newType = new ASProxy(this, typeData.name);
+ var accessors = typeData.accessors;
+ for (var i = 0; i < accessors.length; i++)
+ {
+ this.addPropertyToType(newType, accessors[i]);
+ }
+
+ var methods = typeData.methods;
+ for (var i = 0; i < methods.length; i++)
+ {
+ if (FABridge.blockedMethods[methods[i]] == undefined)
+ {
+ this.addMethodToType(newType, methods[i]);
+ }
+ }
+
+
+ this.remoteTypeCache[newType.typeName] = newType;
+ return newType;
+ },
+
+ //add a property to a typename; used to define the properties that can be called on an AS proxied object
+ addPropertyToType: function(ty, propName)
+ {
+ var c = propName.charAt(0);
+ var setterName;
+ var getterName;
+ if(c >= "a" && c <= "z")
+ {
+ getterName = "get" + c.toUpperCase() + propName.substr(1);
+ setterName = "set" + c.toUpperCase() + propName.substr(1);
+ }
+ else
+ {
+ getterName = "get" + propName;
+ setterName = "set" + propName;
+ }
+ ty[setterName] = function(val)
+ {
+ this.bridge.setPropertyInAS(this.fb_instance_id, propName, val);
+ }
+ ty[getterName] = function()
+ {
+ return this.bridge.deserialize(this.bridge.getPropertyFromAS(this.fb_instance_id, propName));
+ }
+ },
+
+ //add a method to a typename; used to define the methods that can be callefd on an AS proxied object
+ addMethodToType: function(ty, methodName)
+ {
+ ty[methodName] = function()
+ {
+ return this.bridge.deserialize(this.bridge.callASMethod(this.fb_instance_id, methodName, FABridge.argsToArray(arguments)));
+ }
+ },
+
+ // Function Proxies
+
+ //returns the AS proxy for the specified function ID
+ getFunctionProxy: function(funcID)
+ {
+ var bridge = this;
+ if (this.remoteFunctionCache[funcID] == null)
+ {
+ this.remoteFunctionCache[funcID] = function()
+ {
+ bridge.callASFunction(funcID, FABridge.argsToArray(arguments));
+ }
+ }
+ return this.remoteFunctionCache[funcID];
+ },
+
+ //reutrns the ID of the given function; if it doesnt exist it is created and added to the local cache
+ getFunctionID: function(func)
+ {
+ if (func.__bridge_id__ == undefined)
+ {
+ func.__bridge_id__ = this.makeID(this.nextLocalFuncID++);
+ this.localFunctionCache[func.__bridge_id__] = func;
+ }
+ return func.__bridge_id__;
+ },
+
+ // serialization / deserialization
+
+ serialize: function(value)
+ {
+ var result = {};
+
+ var t = typeof(value);
+ //primitives are kept as such
+ if (t == "number" || t == "string" || t == "boolean" || t == null || t == undefined)
+ {
+ result = value;
+ }
+ else if (value instanceof Array)
+ {
+ //arrays are serializesd recursively
+ result = [];
+ for (var i = 0; i < value.length; i++)
+ {
+ result[i] = this.serialize(value[i]);
+ }
+ }
+ else if (t == "function")
+ {
+ //js functions are assigned an ID and stored in the local cache
+ result.type = FABridge.TYPE_JSFUNCTION;
+ result.value = this.getFunctionID(value);
+ }
+ else if (value instanceof ASProxy)
+ {
+ result.type = FABridge.TYPE_ASINSTANCE;
+ result.value = value.fb_instance_id;
+ }
+ else
+ {
+ result.type = FABridge.TYPE_ANONYMOUS;
+ result.value = value;
+ }
+
+ return result;
+ },
+
+ //on deserialization we always check the return for the specific error code that is used to marshall NPE's into JS errors
+ // the unpacking is done by returning the value on each pachet for objects/arrays
+ deserialize: function(packedValue)
+ {
+
+ var result;
+
+ var t = typeof(packedValue);
+ if (t == "number" || t == "string" || t == "boolean" || packedValue == null || packedValue == undefined)
+ {
+ result = this.handleError(packedValue);
+ }
+ else if (packedValue instanceof Array)
+ {
+ result = [];
+ for (var i = 0; i < packedValue.length; i++)
+ {
+ result[i] = this.deserialize(packedValue[i]);
+ }
+ }
+ else if (t == "object")
+ {
+ for(var i = 0; i < packedValue.newTypes.length; i++)
+ {
+ this.addTypeDataToCache(packedValue.newTypes[i]);
+ }
+ for (var aRefID in packedValue.newRefs)
+ {
+ this.createProxy(aRefID, packedValue.newRefs[aRefID]);
+ }
+ if (packedValue.type == FABridge.TYPE_PRIMITIVE)
+ {
+ result = packedValue.value;
+ }
+ else if (packedValue.type == FABridge.TYPE_ASFUNCTION)
+ {
+ result = this.getFunctionProxy(packedValue.value);
+ }
+ else if (packedValue.type == FABridge.TYPE_ASINSTANCE)
+ {
+ result = this.getProxy(packedValue.value);
+ }
+ else if (packedValue.type == FABridge.TYPE_ANONYMOUS)
+ {
+ result = packedValue.value;
+ }
+ }
+ return result;
+ },
+ //increases the reference count for the given object
+ addRef: function(obj)
+ {
+ this.target.incRef(obj.fb_instance_id);
+ },
+ //decrease the reference count for the given object and release it if needed
+ release:function(obj)
+ {
+ this.target.releaseRef(obj.fb_instance_id);
+ },
+
+ // check the given value for the components of the hard-coded error code : __FLASHERROR
+ // used to marshall NPE's into flash
+
+ handleError: function(value)
+ {
+ if (typeof(value)=="string" && value.indexOf("__FLASHERROR")==0)
+ {
+ var myErrorMessage = value.split("||");
+ if(FABridge.refCount > 0 )
+ {
+ FABridge.refCount--;
+ }
+ throw new Error(myErrorMessage[1]);
+ return value;
+ }
+ else
+ {
+ return value;
+ }
+ }
+};
+
+// The root ASProxy class that facades a flash object
+
+ASProxy = function(bridge, typeName)
+{
+ this.bridge = bridge;
+ this.typeName = typeName;
+ return this;
+};
+//methods available on each ASProxy object
+ASProxy.prototype =
+{
+ get: function(propName)
+ {
+ return this.bridge.deserialize(this.bridge.getPropertyFromAS(this.fb_instance_id, propName));
+ },
+
+ set: function(propName, value)
+ {
+ this.bridge.setPropertyInAS(this.fb_instance_id, propName, value);
+ },
+
+ call: function(funcName, args)
+ {
+ this.bridge.callASMethod(this.fb_instance_id, funcName, args);
+ },
+
+ addRef: function() {
+ this.bridge.addRef(this);
+ },
+
+ release: function() {
+ this.bridge.release(this);
+ }
+};
diff --git a/public/chat/js/chat.js b/public/chat/js/chat.js
new file mode 100644
index 0000000..e3eca5f
--- /dev/null
+++ b/public/chat/js/chat.js
@@ -0,0 +1,3003 @@
+/*
+ * @package AJAX_Chat
+ * @author Sebastian Tschan
+ * @copyright (c) Sebastian Tschan
+ * @license GNU Affero General Public License
+ * @link https://blueimp.net/ajax/
+ *
+ * The SELFHTML documentation has been used throughout this project:
+ * http://selfhtml.org
+ *
+ * Stylesheet and cookie methods have been inspired by Paul Sowden (A List Apart):
+ * http://www.alistapart.com/stories/alternate/
+ *
+ * Modified for Flashii Chat
+ */
+
+// AJAX Chat client side logic:
+var ajaxChat = {
+
+ settingsInitiated: null,
+ styleInitiated: null,
+ initializeFunction: null,
+ finalizeFunction: null,
+ loginChannelID: null,
+ loginChannelName: null,
+ timerRate: null,
+ timer: null,
+ ajaxURL: null,
+ baseURL: null,
+ regExpMediaUrl: null,
+ dirs: null,
+ startChatOnLoad: null,
+ chatStarted: null,
+ domIDs: null,
+ dom: null,
+ settings: null,
+ nonPersistentSettings: null,
+ unusedSettings: null,
+ bbCodeTags: null,
+ colorCodes: null,
+ emoticonCodes: null,
+ emoticonFiles: null,
+ soundFiles: null,
+ sounds: null,
+ soundTransform: null,
+ sessionName: null,
+ cookieExpiration: null,
+ cookiePath: null,
+ cookieDomain: null,
+ cookieSecure: null,
+ chatBotName: null,
+ chatBotID: null,
+ allowUserMessageDelete: null,
+ inactiveTimeout: null,
+ privateChannelDiff: null,
+ privateMessageDiff: null,
+ showChannelMessages: null,
+ messageTextMaxLength: null,
+ socketServerEnabled: null,
+ socketServerHost: null,
+ socketServerPort: null,
+ socketServerChatID: null,
+ socket: null,
+ socketIsConnected: null,
+ socketTimerRate: null,
+ socketReconnectTimer: null,
+ socketRegistrationID: null,
+ userID: null,
+ userName: null,
+ userRole: null,
+ channelID: null,
+ channelName: null,
+ channelSwitch: null,
+ usersList: null,
+ userNamesList: null,
+ userMenuCounter: null,
+ encodedUserName: null,
+ userNodeString: null,
+ ignoredUserNames: null,
+ lastID: null,
+ localID: null,
+ lang: null,
+ langCode: null,
+ baseDirection: null,
+ originalDocumentTitle: null,
+ blinkInterval: null,
+ httpRequest: null,
+ retryTimer:null,
+ retryTimerDelay:null,
+ DOMbuffering: null,
+ DOMbuffer: null,
+ DOMbufferRowClass: 'rowOdd',
+ imageID: 0,
+
+ init: function(config, lang, initSettings, initStyle, initialize, initializeFunction, finalizeFunction) {
+ this.httpRequest = new Object();
+ this.usersList = new Array();
+ this.userNamesList = new Array();
+ this.userMenuCounter = 0;
+ this.lastID = 0;
+ this.localID = 0;
+ this.lang = lang;
+ this.initConfig(config);
+ this.initDirectories();
+ if(initSettings) {
+ this.initSettings();
+ }
+ if(initStyle) {
+ this.initStyle();
+ }
+ this.initializeFunction = initializeFunction;
+ this.finalizeFunction = finalizeFunction;
+ if(initialize) {
+ this.setLoadHandler();
+ }
+ },
+
+ initConfig: function(config) {
+ this.loginChannelID = config['loginChannelID'];
+ this.loginChannelName = config['loginChannelName'];
+ this.timerRate = config['timerRate'];
+ this.ajaxURL = config['ajaxURL'];
+ this.baseURL = config['baseURL'];
+ this.regExpMediaUrl = config['regExpMediaUrl'];
+ this.startChatOnLoad = config['startChatOnLoad'];
+ this.domIDs = config['domIDs'];
+ this.settings = config['settings'];
+ this.nonPersistentSettings = config['nonPersistentSettings'];
+ this.bbCodeTags = config['bbCodeTags'];
+ this.colorCodes = config['colorCodes'];
+ this.emoticonCodes = config['emoticonCodes'];
+ this.emoticonFiles = config['emoticonFiles'];
+ this.soundFiles = config['soundFiles'];
+ this.sessionName = config['sessionName'];
+ this.cookieExpiration = config['cookieExpiration'];
+ this.cookiePath = config['cookiePath'];
+ this.cookieDomain = config['cookieDomain'];
+ this.cookieSecure = config['cookieSecure'];
+ this.chatBotName = config['chatBotName'];
+ this.chatBotID = config['chatBotID'];
+ this.allowUserMessageDelete = config['allowUserMessageDelete'];
+ this.inactiveTimeout = config['inactiveTimeout'];
+ this.privateChannelDiff = config['privateChannelDiff'];
+ this.privateMessageDiff = config['privateMessageDiff'];
+ this.showChannelMessages = config['showChannelMessages'];
+ this.messageTextMaxLength = config['messageTextMaxLength'];
+ this.socketServerEnabled = config['socketServerEnabled'];
+ this.socketServerHost = config['socketServerHost'];
+ this.socketServerPort = config['socketServerPort'];
+ this.socketServerChatID = config['socketServerChatID'];
+ this.DOMbuffering = false;
+ this.DOMbuffer = "";
+ this.retryTimerDelay = this.timerRate + (((this.inactiveTimeout*6000) - this.timerRate)/4);
+ },
+
+ initDirectories: function() {
+ this.dirs = new Object();
+ //this.dirs['emoticons'] = 'http://cdn.flashii.net/img/emoticons/';
+ //this.dirs['sounds'] = 'http://cdn.flashii.net/snd/chat/';
+ this.dirs['emoticons'] = 'https://static.flash.moe/emoticons/';
+ this.dirs['sounds'] = 'sounds/';
+ },
+
+ initSettings: function() {
+ this.settingsInitiated = true;
+ this.unusedSettings = new Object();
+ var cookie = this.readCookie(this.sessionName + '_settings');
+ if(cookie) {
+ var settingsArray = cookie.split('&');
+ var setting,key,value,number;
+ for(var i=0; i ';
+ }
+ if(this.dom['emoticonsContainer']) {
+ this.updateDOM('emoticonsContainer', this.DOMbuffer);
+ }
+ this.DOMbuffer = "";
+ },
+
+ initColorCodes: function() {
+ if(this.dom['colorCodesContainer']) {
+ this.DOMbuffer = "";
+ for(var i=0; i'
+ + "\r\n"
+ }
+ this.updateDOM('colorCodesContainer', this.DOMbuffer);
+ this.DOMbuffer = "";
+ }
+ },
+
+ setStatus: function(currentStatus) {
+ //Make sure the status container div exists before changing its class.
+ if (document.getElementById('statusIconContainer') != null ) {
+ //currentStatus options are: Off for green, On for orange, and Alert for red.
+ document.getElementById('statusIconContainer').className = 'statusContainer' + currentStatus;
+ }
+ },
+
+ startChatUpdate: function() {
+ // Start the chat update and retrieve current user and channel info and set the login channel:
+ var infos = 'userID,userName,userRole,channelID,channelName';
+ if(this.socketServerEnabled) {
+ infos += ',socketRegistrationID';
+ }
+ var params = '&getInfos=' + this.encodeText(infos);
+ if(!isNaN(parseInt(this.loginChannelID))) {
+ params += '&channelID='+this.loginChannelID;
+ } else if(this.loginChannelName !== null) {
+ params += '&channelName='+this.encodeText(this.loginChannelName);
+ }
+ this.updateChat(params);
+ },
+
+ updateChat: function(paramString) {
+ var requestUrl = this.ajaxURL
+ + '&lastID='
+ + this.lastID;
+ if(paramString) {
+ requestUrl += paramString;
+ }
+ this.makeRequest(requestUrl,'GET',null);
+ },
+
+ loadFlashInterface: function() {
+ if(this.dom['flashInterfaceContainer']) {
+ this.updateDOM(
+ 'flashInterfaceContainer',
+ ''
+ +' '
+ +' '
+ +' '
+ +' '
+ );
+ FABridge.addInitializationCallback('ajaxChat', this.flashInterfaceLoadCompleteHandler);
+ }
+ },
+
+ flashInterfaceLoadCompleteHandler: function() {
+ ajaxChat.initializeFlashInterface();
+ },
+
+ initializeFlashInterface: function() {
+ if(this.socketServerEnabled) {
+ this.socketTimerRate = (this.inactiveTimeout-1)*60*1000;
+ this.socketConnect();
+ }
+ this.loadSounds();
+ this.initializeCustomFlashInterface();
+ },
+
+ socketConnect: function() {
+ if(!this.socketIsConnected) {
+ try {
+ if(!this.socket && FABridge.ajaxChat) {
+ this.socket = FABridge.ajaxChat.create('flash.net.XMLSocket');
+ this.socket.addEventListener('connect', this.socketConnectHandler);
+ this.socket.addEventListener('close', this.socketCloseHandler);
+ this.socket.addEventListener('data', this.socketDataHandler);
+ this.socket.addEventListener('ioError', this.socketIOErrorHandler);
+ this.socket.addEventListener('securityError', this.socketSecurityErrorHandler);
+ }
+ this.socket.connect(this.socketServerHost, this.socketServerPort);
+ } catch(e) {
+ //alert(e);
+ }
+ }
+ clearTimeout(this.socketReconnectTimer);
+ this.socketReconnectTimer = null;
+ },
+
+ socketConnectHandler: function(event) {
+ ajaxChat.socketIsConnected = true;
+ // setTimeout is needed to avoid calling the flash interface recursively:
+ setTimeout('ajaxChat.socketRegister()', 0);
+ },
+
+ socketCloseHandler: function(event) {
+ ajaxChat.socketIsConnected = false;
+ if(ajaxChat.socket) {
+ clearTimeout(ajaxChat.timer);
+ ajaxChat.updateChat(null);
+ }
+ },
+
+ socketDataHandler: function(event) {
+ ajaxChat.socketUpdate(event.getData());
+ },
+
+ socketIOErrorHandler: function(event) {
+ // setTimeout is needed to avoid calling the flash interface recursively (e.g. sound on new messages):
+ setTimeout('ajaxChat.addChatBotMessageToChatList(\'/error SocketIO\')', 0);
+ setTimeout('ajaxChat.updateChatlistView()', 1);
+ },
+
+ socketSecurityErrorHandler: function(event) {
+ // setTimeout is needed to avoid calling the flash interface recursively (e.g. sound on new messages):
+ setTimeout('ajaxChat.addChatBotMessageToChatList(\'/error SocketSecurity\')', 0);
+ setTimeout('ajaxChat.updateChatlistView()', 1);
+ },
+
+ socketRegister: function() {
+ if(this.socket && this.socketIsConnected) {
+ try {
+ this.socket.send(
+ ' '
+ );
+ } catch(e) {
+ //alert(e);
+ }
+ }
+ },
+
+ loadXML: function(str) {
+ if(!arguments.callee.parser) {
+ try {
+ // DOMParser native implementation (Mozilla, Opera):
+ arguments.callee.parser = new DOMParser();
+ } catch(e) {
+ var customDOMParser = function() {}
+ if(navigator.appName == 'Microsoft Internet Explorer') {
+ // IE implementation:
+ customDOMParser.prototype.parseFromString = function(str, contentType) {
+ if(!arguments.callee.XMLDOM) {
+ arguments.callee.XMLDOM = new ActiveXObject('Microsoft.XMLDOM');
+ }
+ arguments.callee.XMLDOM.loadXML(str);
+ return arguments.callee.XMLDOM;
+ }
+ } else {
+ // Safari, Konqueror:
+ customDOMParser.prototype.parseFromString = function(str, contentType) {
+ if(!arguments.callee.httpRequest) {
+ arguments.callee.httpRequest = new XMLHttpRequest();
+ }
+ arguments.callee.httpRequest.open(
+ 'GET',
+ 'data:text/xml;charset=utf-8,'+encodeURIComponent(str),
+ false
+ );
+ arguments.callee.httpRequest.send(null);
+ return arguments.callee.httpRequest.responseXML;
+ }
+ }
+ arguments.callee.parser = new customDOMParser();
+ }
+ }
+ return arguments.callee.parser.parseFromString(str, 'text/xml');
+ },
+
+ socketUpdate: function(data) {
+ var xmlDoc = this.loadXML(data);
+ if(xmlDoc) {
+ this.handleOnlineUsers(xmlDoc.getElementsByTagName('user'));
+ // If the root node has the attribute "mode" set to "1" it is a channel message:
+ if((this.showChannelMessages || xmlDoc.firstChild.getAttribute('mode') != '1') && !this.channelSwitch) {
+ var channelID = xmlDoc.firstChild.getAttribute('channelID');
+ if(channelID == this.channelID ||
+ parseInt(channelID) == parseInt(this.userID)+this.privateMessageDiff
+ ) {
+ this.handleChatMessages(xmlDoc.getElementsByTagName('message'));
+ }
+ }
+ }
+ },
+
+ setAudioVolume: function(volume) {
+ volume = parseFloat(volume);
+ if(!isNaN(volume)) {
+ if(volume < 0) {
+ volume = 0.0;
+ } else if(volume > 1) {
+ volume = 1.0;
+ }
+ this.settings['audioVolume'] = volume;
+ try {
+ if(!this.soundTransform) {
+ this.soundTransform = FABridge.ajaxChat.create('flash.media.SoundTransform');
+ }
+ this.soundTransform.setVolume(volume);
+ } catch(e) {
+ //alert(e);
+ }
+ }
+ return ajaxChat.setHTML5SoundVolume(volume);
+ },
+
+ loadSounds: function() {
+ try {
+ this.setAudioVolume(this.settings['audioVolume']);
+ this.sounds = new Object();
+ var sound,urlRequest;
+ for(var key in this.soundFiles) {
+ sound = FABridge.ajaxChat.create('flash.media.Sound');
+ sound.addEventListener('complete', this.soundLoadCompleteHandler);
+ sound.addEventListener('ioError', this.soundIOErrorHandler);
+ urlRequest = FABridge.ajaxChat.create('flash.net.URLRequest');
+ urlRequest.setUrl(this.dirs['sounds']+this.soundFiles[key]);
+ sound.load(urlRequest);
+ }
+ } catch(e) {
+ alert(e);
+ }
+ },
+
+ soundLoadCompleteHandler: function(event) {
+ var sound = event.getTarget();
+ for(var key in ajaxChat.soundFiles) {
+ // Get the sound key by matching the sound URL with the sound filename:
+ if((new RegExp(ajaxChat.soundFiles[key])).test(sound.getUrl())) {
+ // Add the loaded sound to the sounds list:
+ ajaxChat.sounds[key] = sound;
+ }
+ }
+ },
+
+ soundIOErrorHandler: function(event) {
+ // setTimeout is needed to avoid calling the flash interface recursively (e.g. sound on new messages):
+ setTimeout('ajaxChat.addChatBotMessageToChatList(\'/error SoundIO\')', 0);
+ setTimeout('ajaxChat.updateChatlistView()', 1);
+ },
+
+ soundPlayCompleteHandler: function(event) {
+ // soundChannel event 'soundComplete'
+ },
+
+ playSound: function(soundID) {
+ if(this.sounds && this.sounds[soundID]) {
+ try {
+ // play() parameters are
+ // startTime:Number (default = 0),
+ // loops:int (default = 0) and
+ // sndTransform:SoundTransform (default = null)
+ //return this.sounds[soundID].play(0, 0, this.soundTransform);
+ return ajaxChat.playHTML5Sound(soundID,this.sounds[soundID]);
+ } catch(e) {
+ //alert(e);
+ }
+ }
+ return null;
+ },
+
+ playSoundOnNewMessage: function(dateObject, userID, userName, userRole, messageID, messageText, channelID, ip) {
+ if(this.settings['audio'] && this.sounds && this.lastID && !this.channelSwitch) {
+ switch(userID) {
+ case this.chatBotID:
+ var messageParts = messageText.split(' ', 1);
+ switch(messageParts[0]) {
+ case '/login':
+ case '/channelEnter':
+ this.playSound(this.settings['soundEnter']);
+ break;
+ case '/logout':
+ case '/channelLeave':
+ case '/kick':
+ this.playSound(this.settings['soundLeave']);
+ break;
+ case '/error':
+ this.playSound(this.settings['soundError']);
+ break;
+ case '/unban':
+ this.playSound(this.settings['soundKick']);
+ break;
+ default:
+ this.playSound(this.settings['soundChatBot']);
+ }
+ break;
+ case this.userID:
+ this.playSound(this.settings['soundSend']);
+ break;
+ default:
+ var messageParts = messageText.split(' ', 1);
+ switch(messageParts[0]) {
+ case '/privmsg':
+ this.playSound(this.settings['soundPrivate']);
+ break;
+ default:
+ this.playSound(this.settings['soundReceive']);
+ }
+ break;
+ }
+ }
+ },
+
+ fillSoundSelection: function(selectionID, selectedSound) {
+ var selection = document.getElementById(selectionID);
+ // Skip the first, empty selection:
+ var i = 1;
+ for(var key in this.soundFiles) {
+ selection.options[i] = new Option(key, key);
+ if(key == selectedSound){
+ selection.options[i].selected = true;
+ }
+ i++;
+ }
+ },
+
+ getHttpRequest: function(identifier) {
+ if(!this.httpRequest[identifier]) {
+ if (window.XMLHttpRequest) {
+ this.httpRequest[identifier] = new XMLHttpRequest();
+ if (this.httpRequest[identifier].overrideMimeType) {
+ this.httpRequest[identifier].overrideMimeType('text/xml');
+ }
+ } else if (window.ActiveXObject) {
+ try {
+ this.httpRequest[identifier] = new ActiveXObject("Msxml2.XMLHTTP");
+ } catch (e) {
+ try {
+ this.httpRequest[identifier] = new ActiveXObject("Microsoft.XMLHTTP");
+ } catch (e) {
+ }
+ }
+ }
+ }
+ return this.httpRequest[identifier];
+ },
+
+ makeRequest: function(url, method, data) {
+ ajaxChat.setStatus('On');
+ ajaxChat.retryTimer = setTimeout("ajaxChat.updateChat(null); ajaxChat.setStatus('Alert');", this.retryTimerDelay);
+ try {
+ var identifier;
+ if(data) {
+ // Create up to 50 HTTPRequest objects:
+ if(!arguments.callee.identifier || arguments.callee.identifier > 50) {
+ arguments.callee.identifier = 1;
+ } else {
+ arguments.callee.identifier++;
+ }
+ identifier = arguments.callee.identifier;
+ } else {
+ identifier = 0;
+ }
+ this.getHttpRequest(identifier).open(method, url, true);
+ this.getHttpRequest(identifier).onreadystatechange = function() {
+ try {
+ ajaxChat.handleResponse(identifier);
+ } catch(e) {
+ try {
+ clearTimeout(ajaxChat.timer);
+ } catch(e) {
+ //alert(e);
+ }
+ try {
+ if(data) {
+ ajaxChat.addChatBotMessageToChatList('/error ConnectionTimeout');
+ ajaxChat.setStatus('Alert');
+ ajaxChat.updateChatlistView();
+ }
+ } catch(e) {
+ //alert(e);
+ }
+ try {
+ ajaxChat.timer = setTimeout('ajaxChat.updateChat(null);', ajaxChat.timerRate);
+ } catch(e) {
+ //alert(e);
+ }
+ }
+ };
+ if(method == 'POST') {
+ this.getHttpRequest(identifier).setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+ }
+ this.getHttpRequest(identifier).send(data);
+ } catch(e) {
+ clearTimeout(this.timer);
+ if(data) {
+ this.addChatBotMessageToChatList('/error ConnectionTimeout');
+ ajaxChat.setStatus('Alert');
+ this.updateChatlistView();
+ }
+ this.timer = setTimeout('ajaxChat.updateChat(null);', this.timerRate);
+ }
+ },
+
+ handleResponse: function(identifier) {
+ if (this.getHttpRequest(identifier).readyState == 4) {
+ if (this.getHttpRequest(identifier).status == 200) {
+ clearTimeout(ajaxChat.retryTimer);
+ var xmlDoc = this.getHttpRequest(identifier).responseXML;
+ ajaxChat.setStatus('Off');
+ } else {
+ // Connection status 0 can be ignored.
+ if (this.getHttpRequest(identifier).status == 0) {
+ ajaxChat.setStatus('On');
+ this.updateChatlistView();
+ return false;
+ } else {
+ this.addChatBotMessageToChatList('/error ConnectionStatus '+this.getHttpRequest(identifier).status);
+ ajaxChat.setStatus('Alert');
+ this.updateChatlistView();
+ return false;
+ }
+ }
+ }
+ if(!xmlDoc) {
+ return false;
+ }
+ this.handleXML(xmlDoc);
+ return true;
+ },
+
+ handleXML: function(xmlDoc) {
+ this.handleInfoMessages(xmlDoc.getElementsByTagName('info'));
+ this.handleOnlineUsers(xmlDoc.getElementsByTagName('user'));
+ this.handleChatMessages(xmlDoc.getElementsByTagName('message'));
+ this.channelSwitch = null;
+ this.setChatUpdateTimer();
+ },
+
+ setChatUpdateTimer: function() {
+ clearTimeout(this.timer);
+ if(this.chatStarted) {
+ var timeout;
+ if(this.socketIsConnected) {
+ timeout = this.socketTimerRate;
+ } else {
+ timeout = this.timerRate;
+ if(this.socketServerEnabled && !this.socketReconnectTimer) {
+ // If the socket connection fails try to reconnect once in a minute:
+ this.socketReconnectTimer = setTimeout('ajaxChat.socketConnect();', 60000);
+ }
+ }
+ this.timer = setTimeout('ajaxChat.updateChat(null);', timeout);
+ }
+ },
+
+ handleInfoMessages: function(infoNodes) {
+ var infoType, infoData;
+ for(var i=0; i'
+ + userName
+ + ' '
+ + ''
+ +' ';
+ if(userID == this.userID) {
+ this.userNodeString = str;
+ }
+ return str;
+ }
+ },
+
+ toggleUserMenu: function(menuID, userName, userID) {
+ // If the menu is empty, fill it with user node menu items before toggling it.
+ var isInline = false;
+ if (menuID.indexOf('ium') >= 0 ) {
+ isInline = true;
+ }
+ if(!document.getElementById(menuID).firstChild) {
+ this.updateDOM(
+ menuID,
+ this.getUserNodeStringItems(
+ this.encodeText(this.addSlashes(this.getScriptLinkValue(userName))),
+ userID,
+ isInline
+ ),
+ false,
+ true
+ )
+ }
+ this.showHide(menuID);
+ this.dom['chatList'].scrollTop = this.dom['chatList'].scrollHeight;
+ },
+
+ getUserNodeStringItems: function(encodedUserName, userID, isInline) {
+ var menu;
+ if(encodedUserName != this.encodedUserName) {
+ menu = ''
+ + this.getDeletionLink(messageID, userID, userRole, channelID)
+ + dateTime
+ + ''
+ + userName
+ + ' '
+ + colon
+ + this.replaceText(messageText)
+ + '
';
+ },
+
+ getChatListUserNameTitle: function(userID, userName, userRole, ip) {
+ return (ip != null) ? ' title="IP: ' + ip + '"' : '';
+ },
+
+ getMessageDocumentID: function(messageID) {
+ return ((messageID === null) ? 'ajaxChat_lm_'+(this.localID++) : 'ajaxChat_m_'+messageID);
+ },
+
+ getMessageNode: function(messageID) {
+ return ((messageID === null) ? null : document.getElementById(this.getMessageDocumentID(messageID)));
+ },
+
+ getUserDocumentID: function(userID) {
+ return 'ajaxChat_u_'+userID;
+ },
+
+ getUserNode: function(userID) {
+ return document.getElementById(this.getUserDocumentID(userID));
+ },
+
+ getUserMenuDocumentID: function(userID) {
+ return 'ajaxChat_um_'+userID;
+ },
+
+ getInlineUserMenuDocumentID: function(menuID, index) {
+ return 'ajaxChat_ium_'+menuID+'_'+index;
+ },
+
+ getDeletionLink: function(messageID, userID, userRole, channelID) {
+ if(messageID !== null && this.isAllowedToDeleteMessage(messageID, userID, userRole, channelID)) {
+ if(!arguments.callee.deleteMessage) {
+ arguments.callee.deleteMessage = this.encodeSpecialChars(this.lang['deleteMessage']);
+ }
+ return '