diff --git a/PLUGIN_CATEGORIES.txt b/PLUGIN_CATEGORIES.txt
new file mode 100644
index 00000000..281fab95
--- /dev/null
+++ b/PLUGIN_CATEGORIES.txt
@@ -0,0 +1,151 @@
+FRONTEND_EXTERNAL_SERVICES
+ serendipity_event_creativecommons
+ serendipity_event_searchhighlight
+ serendipity_event_yq
+ serendipity_plugin_creativecommons
+ serendipity_plugin_remoterss
+ serendipity_plugin_wikipedia_finder
+ serendipity_event_babelfish
+ serendipity_event_externalphp
+ serendipity_event_google_sitemap
+ serendipity_event_motm
+ serendipity_plugin_amazon
+ serendipity_plugin_delicious
+ serendipity_plugin_flickr
+ serendipity_plugin_google_last_query
+ serendipity_plugin_hitmaps
+ serendipity_plugin_weather
+FRONTEND_FEATURES
+ serendipity_plugin_eventwrapper
+ serendipity_plugin_shoutbox
+ serendipity_superuser_plugin
+ serendipity_event_contactform
+ serendipity_event_guestbook
+ serendipity_event_linklist
+ serendipity_event_loginform
+ serendipity_event_mycalendar
+ serendipity_event_todolist
+ serendipity_plugin_loginform
+FRONTEND_FULL_MODS
+ serendipity_event_aggregator
+ serendipity_event_blogpdf
+FRONTEND_VIEWS
+ serendipity_plugin_authors
+ serendipity_plugin_comments
+ serendipity_plugin_history
+ serendipity_plugin_recententries
+ serendipity_plugin_templatedropdown
+ serendipit_calendar_plugin
+ serendipity_archives_plugin
+ serendipity_syndication_plugin
+ serendipity_plug_plugin
+ serendipity_html_nugget_plugin
+ serendipity_categories_plugin
+ serendipity_event_filter_entries
+ serendipity_plugin_category_dhtml_menu
+FRONTEND_ENTRY_RELATED
+ serendipity_event_livesearch
+ serendipity_event_mailer
+ serendipity_plugin_entrylinks
+ serendipity_quicksearch_plugin
+ serendipity_event_customarchive
+ serendipity_event_deletelink
+ serendipity_event_entrylastmodified
+ serendipity_event_entrypaging
+ serendipity_event_linktoolbar
+ serendipity_event_mailentry
+ serendipity_event_multilingual
+ serendipity_event_mymood
+ serendipity_event_outdate_entries
+
+BACKEND_EDITOR
+ serendipity_event_entrysplit
+ serendipity_event_contentrewrite
+ serendipity_event_entryproperties
+ serendipity_event_htmlvalidator
+ serendipity_event_staticpage
+ serendipity_event_weblogping
+ serendipity_event_amazonchooser
+ serendipity_event_cpgselector
+ serendipity_event_custom_permalinks
+ serendipity_event_emoticonchooser
+ serendipity_event_entrycheck
+ serendipity_event_freetag
+ serendipity_event_ljupdate
+ serendipity_event_multilingual
+ serendipity_event_mymood
+ serendipity_event_podcast
+ serendipity_event_relatedlinks
+ serendipity_event_tinymce
+ serendipity_event_trackback
+ serendipity_event_typesetbuttons
+BACKEND_USERMANAGEMENT
+ serendipity_event_externalauth
+ serendipity_event_userprofiles
+ serendipity_plugin_adduser
+BACKEND_METAINFORMATION
+ serendipity_event_geourl
+ serendipity_event_head_nugget
+ serendipity_event_randomblogdescription
+BACKEND_TEMPLATES
+ serendipity_event_xhtmlcleanup
+ serendipity_event_browsercompatibility
+ serendipity_event_templatechooser
+ serendipity_event_authorpic
+ serendipity_event_layout_linkmarkup
+ serendipity_event_layout_printerfriendly
+ serendipity_event_layout_quotemarkup
+ serendipity_event_sidebarhider
+BACKEND_FEATURES
+ serendipity_event_spartacus
+ serendipity_event_assigncategories
+ serendipity_event_cachesimple
+ serendipity_event_staticpage
+ serendipity_event_popfetcher
+
+IMAGES
+ serendipity_event_cpgselector
+ serendipity_event_gravatar
+ serendipity_event_imageselectorplus
+ serendipity_event_kubrickheader
+ serendipity_event_photoblog
+ serendipity_event_picasa
+ serendipity_event_thumbnails
+ serendipity_event_usergallery
+ serendipity_plugin_coppermine
+ serendipity_plugin_flickr
+ serendipity_plugin_gallery_menalto_random
+ serendipity_plugin_photoblog
+ANTISPAM
+ serendipity_event_spamblock
+ serendipity_event_spamblock_rbl
+ serendipity_event_spamblock_surbl
+
+MARKUP
+ serendipity_event_bbcode
+ serendipity_event_emoticate
+ serendipity_event_nl2br
+ serendipity_event_s9ymarkup
+ serendipity_event_textile
+ serendipity_event_textwiki
+ serendipity_event_geshi
+ serendipity_event_markdown
+ serendipity_event_mimetex
+ serendipity_event_smartymarkup
+ serendipity_event_typoquote
+ serendipity_event_unstrip_tags
+ serendipity_event_wordwrap
+ serendipity_event_glossary
+
+STATISTICS
+ serendipity_event_karma
+ serendipity_event_statistics
+ serendipity_event_trackexits
+ serendipity_topreferrers_plugin
+ serendipity_topexits_plugin
+ serendipity_event_phpopentracker
+ serendipity_plugin_karmaranking
+ serendipity_plugin_pollbox
+ serendipity_plugin_popularentries
+ serendipity_plugin_topreferers
+
\ No newline at end of file
diff --git a/README b/README
index e69de29b..9d445a2d 100644
--- a/README
+++ b/README
@@ -0,0 +1 @@
+Additional plugins for Serendipity Weblog
\ No newline at end of file
diff --git a/alpha/bogo.php b/alpha/bogo.php
new file mode 100644
index 00000000..66426f9d
--- /dev/null
+++ b/alpha/bogo.php
@@ -0,0 +1,60 @@
+title = 'Bogobogo';
+
+ $propbag->add('name', $this->title);
+ $propbag->add('version', '0.1');
+ $propbag->add('event_hooks', array('frontend_saveComment' => true));
+ $propbag->add('groups', array('ANTISPAM'));
+ }
+
+ function generate_content(&$title) {
+ $title = $this->title;
+ }
+
+ function bogo(&$comment) {
+ $f = '/tmp/bogo.log';
+ $fp = fopen($f, 'w');
+ flock($fp, LOCK_EX);
+ fwrite($fp, $comment['name'] . "\n" . $comment['url'] . "\n" . $comment['comment'] . "\n");
+ fclose($fp);
+ $return = `bogofilter -v -H < $f`;
+ if (preg_match('@X-Bogosity: Spam@imsU', $return)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function event_hook($event, &$bag, &$eventData, $addData = null) {
+ global $serendipity;
+
+ $hooks = &$bag->get('event_hooks');
+
+ if (isset($hooks[$event])) {
+ switch($event) {
+ case 'frontend_saveComment':
+ if (!is_array($eventData) || serendipity_db_bool($eventData['allow_comments'])) {
+ $serendipity['csuccess'] = 'true';
+ if ($this->bogo($addData)) {
+ $eventData = array('allow_comments' => false);
+ $serendipity['messagestack']['comments'][] = PLUGIN_EVENT_SPAMBLOCK_ERROR_RBL . ' ('.implode(', ', $dnsbl->getTxt($remoteIP)).')';
+ return false;
+ }
+ }
+
+ return true;
+ break;
+
+ default:
+ return false;
+ break;
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/alpha/serendipity_event_challengeresponse.php b/alpha/serendipity_event_challengeresponse.php
new file mode 100644
index 00000000..220c838c
--- /dev/null
+++ b/alpha/serendipity_event_challengeresponse.php
@@ -0,0 +1,102 @@
+title = 'Spam: Challenge/Response';
+
+ $propbag->add('name', $this->title);
+ $propbag->add('description', '');
+ $propbag->add('stackable', false);
+ $propbag->add('author', 'Nobody');
+ $propbag->add('requirements', array(
+ 'serendipity' => '1.0',
+ 'smarty' => '2.6.7',
+ 'php' => '4.1.0'
+ ));
+ $propbag->add('version', '0.10');
+ $propbag->add('event_hooks', array(
+ 'frontend_saveComment' => true,
+ 'frontend_comment' => true
+ ));
+ $propbag->add('configuration', array(
+ 'challenge',
+ 'response',
+ 'error'));
+ $propbag->add('groups', array('ANTISPAM'));
+ }
+
+ function introspect_config_item($name, &$propbag) {
+ global $serendipity;
+
+ switch($name) {
+ case 'challenge':
+ $propbag->add('type', 'text');
+ $propbag->add('name', 'Challenge');
+ $propbag->add('description', '');
+ $propbag->add('default', 'What\'s the name of this blog?');
+ break;
+
+ case 'response':
+ $propbag->add('type', 'text');
+ $propbag->add('name', 'Response');
+ $propbag->add('description', '');
+ $propbag->add('default', 'Serendipity');
+ break;
+
+ case 'error':
+ $propbag->add('type', 'text');
+ $propbag->add('name', 'Error message');
+ $propbag->add('description', '');
+ $propbag->add('default', 'You suck.');
+ break;
+
+ default:
+ return false;
+ }
+
+ return true;
+ }
+
+ function generate_content(&$title) {
+ $title = $this->title;
+ }
+
+ function event_hook($event, &$bag, &$eventData, $addData = null) {
+ global $serendipity;
+
+ $hooks = &$bag->get('event_hooks');
+
+ if (isset($hooks[$event])) {
+ switch($event) {
+ case 'frontend_saveComment':
+ if (!is_array($eventData) || serendipity_db_bool($eventData['allow_comments'])) {
+ if (strtolower($_POST['response']) != strtolower($this->get_config('response'))) {
+ $eventData = array('allow_comments' => false);
+ $serendipity['messagestack']['comments'][] = $this->get_config('error');
+ return false;
+ }
+ }
+
+ return true;
+ break;
+
+ case 'frontend_comment':
+ echo '
' . $this->get_config('challenge') . '
+
+
';
+
+ return true;
+ break;
+
+ default:
+ return false;
+ break;
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/alpha/serendipity_event_mailcc.php b/alpha/serendipity_event_mailcc.php
new file mode 100644
index 00000000..4494a89d
--- /dev/null
+++ b/alpha/serendipity_event_mailcc.php
@@ -0,0 +1,61 @@
+add('name', 'Adds CC to all sent emails');
+ $propbag->add('description', '(Notice: Make sure that the all of your authors have the option to receiv comment notification emails activated, or else no mails will be created that can be CCed');
+ $propbag->add('stackable', false);
+ $propbag->add('author', 'Garvin Hicking');
+ $propbag->add('version', '1.0');
+ $propbag->add('requirements', array('serendipity' => '0.8','smarty' => '2.6.7','php' => '4.1.0'
+ ));
+ $propbag->add('groups', array('BACKEND_FEATURES'));
+ $propbag->add('event_hooks', array('backend_sendmail' => true));
+ $propbag->add('configuration', array('cc'));
+ }
+
+ function generate_content(&$title) {
+ $title = $this->title;
+ }
+
+ function introspect_config_item($name, &$propbag) {
+ switch($name) {
+ case 'cc':
+ $propbag->add('type', 'string');
+ $propbag->add('name', 'E-Mail address to CC');
+ $propbag->add('description', '');
+ $propbag->add('default', 'nobody@example.com');
+ break;
+ }
+ return true;
+ }
+
+ function event_hook($event, &$bag, &$eventData) {
+ global $serendipity;
+ $hooks = &$bag->get('event_hooks');
+
+ if (isset($hooks[$event])) {
+ switch($event) {
+ case 'backend_sendmail':
+ $eventData['headers'][] = 'CC: ' . $this->get_config('cc');
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/alpha/serendipity_event_smfmarkup.php b/alpha/serendipity_event_smfmarkup.php
new file mode 100644
index 00000000..186f4215
--- /dev/null
+++ b/alpha/serendipity_event_smfmarkup.php
@@ -0,0 +1,156 @@
+add('name', 'SMF Markup');
+ $propbag->add('description', 'SMF Markup');
+ $propbag->add('stackable', false);
+ $propbag->add('author', 'Garvin Hicking');
+ $propbag->add('version', '1.00');
+ $propbag->add('requirements', array(
+ 'serendipity' => '0.8',
+ 'smarty' => '2.6.7',
+ 'php' => '4.1.0'
+ ));
+ $propbag->add('cachable_events', array('frontend_display' => true));
+ $propbag->add('event_hooks', array('frontend_display' => true, 'frontend_comment' => true, 'css' => true));
+ $propbag->add('groups', array('MARKUP'));
+
+ $this->markup_elements = array(
+ array(
+ 'name' => 'ENTRY_BODY',
+ 'element' => 'body',
+ ),
+ array(
+ 'name' => 'EXTENDED_BODY',
+ 'element' => 'extended',
+ ),
+ array(
+ 'name' => 'COMMENT',
+ 'element' => 'comment',
+ ),
+ array(
+ 'name' => 'HTML_NUGGET',
+ 'element' => 'html_nugget',
+ )
+ );
+
+ $conf_array = array();
+ foreach($this->markup_elements as $element) {
+ $conf_array[] = $element['name'];
+ }
+ $propbag->add('configuration', $conf_array);
+ }
+
+ function generate_content(&$title) {
+ $title = $this->title;
+ }
+
+
+ function introspect_config_item($name, &$propbag) {
+ switch($name) {
+ default:
+ $propbag->add('type', 'boolean');
+ $propbag->add('name', constant($name));
+ $propbag->add('description', sprintf(APPLY_MARKUP_TO, constant($name)));
+ $propbag->add('default', 'true');
+ break;
+ }
+ return true;
+ }
+
+ function install() {
+ serendipity_plugin_api::hook_event('backend_cache_entries', $this->title);
+ }
+
+ function uninstall() {
+ serendipity_plugin_api::hook_event('backend_cache_purge', $this->title);
+ serendipity_plugin_api::hook_event('backend_cache_entries', $this->title);
+ }
+
+ function callback($matches) {
+ $alt = $align = '';
+
+ if (preg_match('@align=(right|left)@imsU', $matches[1], $m)) {
+ $align = $m[1];
+ }
+
+ if (preg_match('@alt=(.)@imsU', $matches[1], $m)) {
+ $alt = $alt;
+ }
+
+ return ' ';
+
+ }
+
+ function smfcode($input) {
+ $input = preg_replace_callback('@\[img(.*)\]([^\[]+)\[/img\]@imsU', array($this, 'callback'), $input);
+
+ $input = preg_replace('@[^"\'\]\[](https?://[^\s"\'\]\[]+)[\s"\'\]\[$]@imsU', '\1 ', $input);
+
+ $input = preg_replace('@\[flash=([0-9]+),([0-9]+)\](.+)\[/flash\]@imsU', '
+
+
+ \3
+
+ ', $input);
+
+ return $input;
+ }
+
+ function event_hook($event, &$bag, &$eventData) {
+ global $serendipity;
+
+ $hooks = &$bag->get('event_hooks');
+
+ if (isset($hooks[$event])) {
+ switch($event) {
+ case 'frontend_display':
+
+ foreach ($this->markup_elements as $temp) {
+ if (serendipity_db_bool($this->get_config($temp['name'], true)) && isset($eventData[$temp['element']]) &&
+ !$eventData['properties']['ep_disable_markup_' . $this->instance] &&
+ !isset($serendipity['POST']['properties']['disable_markup_' . $this->instance])) {
+ $element = $temp['element'];
+ $eventData[$element] = $this->smfcode($eventData[$element]);
+ }
+ }
+ return true;
+ break;
+
+ case 'frontend_comment':
+ return true;
+ break;
+
+ case 'css':
+ return true;
+ break;
+
+ default:
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+}
+
+/* vim: set sts=4 ts=4 expandtab : */
diff --git a/alpha/serendipity_plugin_sidebarlogo.zip b/alpha/serendipity_plugin_sidebarlogo.zip
new file mode 100644
index 00000000..38bd04bb
Binary files /dev/null and b/alpha/serendipity_plugin_sidebarlogo.zip differ
diff --git a/alpha/stalkerbuster/lang_en.inc.php b/alpha/stalkerbuster/lang_en.inc.php
new file mode 100644
index 00000000..ae5e9da5
--- /dev/null
+++ b/alpha/stalkerbuster/lang_en.inc.php
@@ -0,0 +1,3 @@
+title = $this->get_config('title', $this->title);
+ $propbag->add('name', PLUGIN_STALKERBUSTER);
+ $propbag->add('description', PLUGIN_STALKERBUSTER_DESC);
+ $propbag->add('stackable', true);
+ $propbag->add('author', 'Garvin Hicking');
+ $propbag->add('version', '1.0');
+ $propbag->add('requirements', array(
+ 'serendipity' => '0.8',
+ 'smarty' => '2.6.7',
+ 'php' => '4.1.0'
+ ));
+ $propbag->add('configuration', array(
+ 'mail',
+ 'cname'
+ ));
+ $propbag->add('event_hooks', array(
+ 'frontend_configure' => true,
+ 'backend_sendmail' => true
+ ));
+
+ }
+
+ function introspect_config_item($name, &$propbag) {
+ global $serendipity;
+
+ switch($name) {
+ case 'mail':
+ $propbag->add('name', 'E-Mail');
+ $propbag->add('description', '');
+ $propbag->add('type', 'string');
+ $propbag->add('default', $serendipity['blogMail']);
+ break;
+
+ case 'cname':
+ $propbag->add('name', 'Cookiename');
+ $propbag->add('description', '');
+ $propbag->add('type', 'string');
+ $propbag->add('default', 'PHPSESSIDSB');
+ break;
+ }
+ }
+
+ function event_hook($event, &$bag, &$eventData) {
+ global $serendipity;
+
+ $hooks = &$bag->get('event_hooks');
+ if (isset($hooks[$event])) {
+ switch($event) {
+ case 'backend_sendmail':
+ $eventData['message'] .= "\n" . 'StalkerBuster:' . $_COOKIE['serendipity'][$this->get_config('cname')] . "\n";
+ return true;
+
+ case 'frontend_configure':
+ if (!isset($_COOKIE['serendipity'][$this->get_config('cname')])) {
+ serendipity_setCookie($this->get_config('cname'), uniqid('sb', true));
+ }
+
+ $bl = @file_get_contents($serendipity['serendipityPath'] . '/stalkerbuster.php');
+ if (preg_match('@' . preg_quote($_COOKIE['serendipity'][$this->get_config('cname')]) . '@imsU', $bl)) {
+ mail($this->get_config('mail'), 'StalkerBuster', print_r($_REQUEST, true) . "\n" . print_r($_SERVER, true) . "\n");
+ header('HTTP/1.0 404 Not found');
+ header('Status: 404 Not found');
+ echo 'HTTP/1.0 404 Not found';
+ exit;
+ }
+ return true;
+ break;
+ }
+ }
+ }
+}
+
+/* vim: set sts=4 ts=4 expandtab : */
+?>
\ No newline at end of file
diff --git a/alpha/testing.php b/alpha/testing.php
new file mode 100644
index 00000000..5526884d
--- /dev/null
+++ b/alpha/testing.php
@@ -0,0 +1,86 @@
+add('name', PLUGIN_IMPORT_EXPORT_TITLE);
+ $propbag->add('description', '');
+ $propbag->add('event_hooks', array('backend_display' => true));
+ $propbag->add('author', 'Garvin Hicking');
+ $propbag->add('version', '1.0');
+ $propbag->add('requirements', array(
+ 'serendipity' => '0.8',
+ 'smarty' => '2.6.7',
+ 'php' => '4.0.0'
+ ));
+ $propbag->add('groups', array('FRONTEND_EXTERNAL_SERVICES'));
+ $propbag->add('stackable', false);
+ }
+
+ function generate_content(&$title) {
+ $title = PLUGIN_IMPORT_EXPORT_TITLE;
+ }
+
+ function export_items($table, $primary_key, $ref_key, $primary_key_value) {
+ global $serendipity;
+
+ $result = serendipity_db_Query("SELECT * FROM {$serendipity['dbPrefix']}{$table} WHERE $ref_key = $primary_key_value", false, 'assoc');
+ foreach ($result AS $row) {
+ $row[$ref_key] = '@last';
+ if ($primary_key !== null) {
+ unset($row[$primary_key]);
+ }
+
+ foreach($row AS $key => $val) {
+ if ($val != '@last') {
+ $row[$key] = "'" . serendipity_db_escape_string($val) . "'";
+ }
+ }
+ echo "INSERT INTO {$serendipity['dbPrefix']}{$table} (" . implode(', ', array_keys($row)) . ") VALUES (" . implode(', ', $row) . ");\n";
+ }
+ }
+
+ function event_hook($event, &$bag, &$eventData, $addData = null) {
+ global $serendipity;
+
+ $hooks = &$bag->get('event_hooks');
+
+ if (isset($hooks[$event])) {
+ switch($event) {
+ case 'backend_display':
+ echo '' . PLUGIN_IMPORT_EXPORT_TITLE . ' ';
+
+ if (!isset($eventData['id'])) {
+ echo 'You can only export entries that are already saved';
+ return true;
+ }
+
+ echo 'Use this SQL query to import the entry you are currently viewing into a seperate MySQL-Database:' . " \n";
+ echo '';
+ echo ' ';
+
+ return true;
+ break;
+
+ default:
+ return false;
+ break;
+ }
+ } else {
+ return false;
+ }
+ }
+}
+/* vim: set sts=4 ts=4 expandtab : */
\ No newline at end of file
diff --git a/emerge.sh b/emerge.sh
new file mode 100755
index 00000000..0982555d
--- /dev/null
+++ b/emerge.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+cd /home/garvin/cvs/serendipity/additional_plugins/
+rm additional_plugins.tgz
+rm additional_themes.tgz
+echo $(date) > last.txt
+echo $(date) > homepage/last.txt
+tar --exclude=homepage --exclude=spartacus_homepage.zip --exclude=spartacus_homepage_template.zip --exclude=emerge.sh --exclude=emerge_spartacus.dat -czf additional_plugins.tgz *
+find -maxdepth 1 -type d -not -name . -not -name CVS -exec zip -9r {}.zip {} \; 1>/dev/null
+
+cd /home/garvin/cvs/serendipity/additional_themes
+tar -czf /home/garvin/cvs/serendipity/additional_plugins/additional_themes.tgz *
+find -maxdepth 1 -type d -not -name . -not -name CVS -exec zip -9r {}.zip {} \; 1>/dev/null
+
+cd /home/garvin/cvs/serendipity/additional_plugins/
+php emerge_spartacus.php plugin en
+php emerge_spartacus.php plugin de
+php emerge_spartacus.php plugin ro
+php emerge_spartacus.php plugin es
+php emerge_spartacus.php plugin cs
+php emerge_spartacus.php plugin cz
+php emerge_spartacus.php plugin ko
+php emerge_spartacus.php plugin nl
+php emerge_spartacus.php plugin is
+php emerge_spartacus.php plugin no
+php emerge_spartacus.php plugin it
+php emerge_spartacus.php plugin fr
+php emerge_spartacus.php plugin zh
+php emerge_spartacus.php plugin tn
+php emerge_spartacus.php plugin pt
+php emerge_spartacus.php plugin da
+php emerge_spartacus.php plugin ru
+php emerge_spartacus.php plugin fa
+php emerge_spartacus.php plugin bg
+php emerge_spartacus.php plugin ja
+php emerge_spartacus.php plugin tw
+php emerge_spartacus.php plugin fi
+php emerge_spartacus.php plugin cn
+php emerge_spartacus.php plugin pt_PT
+php emerge_spartacus.php plugin se
+php emerge_spartacus.php plugin hu
+php emerge_spartacus.php plugin pl
+php emerge_spartacus.php plugin sa
+php emerge_spartacus.php plugin ta
+php emerge_spartacus.php plugin tr
+
+php emerge_spartacus.php plugin final
+php emerge_spartacus.php template
+
+rsync --partial -v -r ~/cvs/serendipity/additional_plugins/ \
+ garvinhicking,php-blog@web.sourceforge.net:/home/groups/p/ph/php-blog/htdocs/cvs/additional_plugins/
+
+rsync --partial -v -r ~/cvs/serendipity/additional_themes/ \
+ garvinhicking,php-blog@web.sourceforge.net:/home/groups/p/ph/php-blog/htdocs/cvs/additional_themes/
+
+rsync --partial -v -r ~/cvs/serendipity/additional_plugins/homepage/ \
+ garvinhicking,php-blog@web.sourceforge.net:/home/groups/p/ph/php-blog/htdocs/homepage/
+
diff --git a/emerge_spartacus.php b/emerge_spartacus.php
new file mode 100644
index 00000000..cdffdf63
--- /dev/null
+++ b/emerge_spartacus.php
@@ -0,0 +1,496 @@
+i18n = false;
+ }
+
+ // Load Serendipity Framework
+ echo "Language set to " . $lang . "\n";
+ $this->memSnap('Emerge call');
+ include_once $path . 'include/compat.inc.php';
+ $serendipity['serendipityPath'] = $path;
+ $serendipity['dbType'] = 'mysql';
+ $serendipity['lang'] = $lang;
+ $serendipity['charset'] = 'UTF-8/';
+ define('S9Y_INCLUDE_PATH', $serendipity['serendipityPath']);
+ define('S9Y_PEAR_PATH', $serendipity['serendipityPath'] . 'bundled-libs/');
+ include_once S9Y_INCLUDE_PATH . 'lang/UTF-8/serendipity_lang_' . $lang . '.inc.php';
+ include_once S9Y_INCLUDE_PATH . 'include/plugin_api.inc.php';
+ $this->memSnap('Framework loaded');
+ }
+
+ function init() {
+ $this->pluginpath = dirname(__FILE__);
+ }
+
+ function load_plugin(&$plugins) {
+ global $serendipity;
+
+ foreach($plugins AS $plugin_name => $plugin_data) {
+ $path = $this->pluginpath . '/' . $plugin_data['pluginPath'] . '/';
+ include_once $path . $plugin_data['name'] . '.php';
+ $plugins[$plugin_name]['plugin'] = new $plugin_data['name']($plugin_name);
+ $plugin =&$plugins[$plugin_name]['plugin'];
+
+ if (is_object($plugin)) {
+ $bag = new serendipity_property_bag;
+ $plugin->introspect($bag);
+ $plugins[$plugin_name]['properties'] = $bag->properties;
+ $plugins[$plugin_name]['files'] = $this->get_files($plugin_data['pluginPath']);
+
+ if (file_exists($path . 'ChangeLog')) {
+ $plugins[$plugin_name]['properties']['changelog'] = 'http://php-blog.cvs.sourceforge.net/viewvc/*checkout*/php-blog/additional_plugins/' . $plugin_data['pluginPath'] . '/ChangeLog';
+ }
+
+ echo 'Successfully loaded plugin ' . $plugin_name . "\n";
+ } else {
+ echo 'Error loading plugin ' . $plugin_name . ' (' . $plugin_data['pluginPath'] . ')' . "\n";
+ }
+ $this->memSnap($plugin_name);
+ unset($plugins[$plugin_name]['plugin']);
+ $this->memSnap($plugin_name . ' UNSET');
+ }
+ }
+
+ function memSnap($tshow = '') {
+ static $avail = null;
+ static $show = false;
+ static $memUsage = 0;
+
+ if (!$show) {
+ return false;
+ }
+
+ if ($avail === false) {
+ return true;
+ } elseif ($avail === null) {
+ if (function_exists('memory_get_usage')) {
+ $avail = memory_get_usage();
+ } else {
+ $avail = false;
+ return false;
+ }
+ }
+
+ if ($memUsage === 0) {
+ $memUsage = $avail;
+ }
+
+ $current = memory_get_usage();
+ echo '[' . date('d.m.Y H:i') . '] ' . number_format($current - $memUsage, 2, ',', '.') . ' label "' . $tshow . '",' . "\n" . ' totalling ' . number_format($current, 2, ',', '.') . "\n";
+ $memUsage = $current;
+ }
+
+ function getTemplates($dir = '/home/garvin/cvs/serendipity/additional_themes/') {
+ $this->i18n = false;
+ $ret = serendipity_traversePath($dir, '', true, null, 1, 1);
+
+ $this->xmlData['template'] = array();
+ $x = &$this->xmlData['template'];
+
+ $x[] = '';
+ $x[] = '' . "\n";
+ $x[] = '';
+
+ $t = array();
+ $nametofile = array();
+ foreach($ret AS $idx => $path) {
+ $info = array();
+ if (file_exists($dir . $path['name'] . '/info.txt')) {
+ $info = serendipity_fetchTemplateInfo($path['name'], $dir);
+ }
+
+ if (empty($info['name'])) {
+ continue;
+ }
+
+ $olddir = getcwd();
+ chdir($dir);
+ $info['files'] = $this->get_files($path['name']);
+ chdir($olddir);
+
+ $td = '';
+ $td .= '' . $this->encode($info['name']) . ' ' . $this->encode($info['summary']) . '
';
+ $td .= '' . $this->encode($path['name']) . '';
+ if (empty($info['version'])) {
+ $info['version'] = '1.0';
+ }
+ if (empty($info['license'])) {
+ $info['license'] = 'N/A (=GPL)';
+ }
+ $td .= '
' . $this->encode(VERSION . ' ' . $info['version']) . '(' . $this->encode($info['license']) . ', ' . $this->encode($info['date']) . ')
';
+ $td .= '
' . $this->encode($info['author']) . '
';
+ if (!empty($info['require serendipity'])) {
+ $td .= '
Serendipity >= ' . $this->encode($info['require serendipity']) . '
';
+ }
+ $td .= '
' . $this->encode($info['description']) . '
';
+
+ $x[] = '';
+ $x[] = '' . $this->encode($info['name'], true) . ' ';
+ $x[] = '' . $this->encode($path['name'], true) . ' ';
+ $x[] = '' . $this->encode($info['license'], true) . ' ';
+ $x[] = '' . $this->encode($info['summary']) . ' ';
+ $x[] = '' . $this->encode($info['description']) . ' ';
+ $x[] = '' . $this->encode($info['author'], true) . ' lead ';
+
+ $x[] = '';
+ $x[] = ' ' . $this->encode($info['version'], true) . ' ';
+ $x[] = ' ' . $this->encode($info['require serendipity'], true) . ' ';
+ $x[] = ' ' . $this->encode($info['date'], true) . ' ';
+ $x[] = ' ';
+ $x[] = $info['files']['xml'];
+ $x[] = ' ';
+
+ $x[] = ' ';
+ foreach($info['files']['full'] AS $file) {
+ $x[] = ' ' . $file . ' ';
+ }
+ $x[] = ' ';
+ $x[] = ' ';
+
+ $x[] = ' ';
+
+ $t[$info['name']] .= '' . $td . '
' . "\n";
+ $nametofile[$info['name']] = $path['name'];
+ }
+ $x[] = ' ';
+ ksort($t);
+
+ $theme_li = '';
+ foreach($t as $theme => $html) {
+ $theme_li .= '' . $theme . ' ' . "\n";
+ $fp = fopen('homepage/template_' . $nametofile[$theme] . '.htm', 'w');
+ fwrite($fp, $html);
+ fclose($fp);
+ }
+ $fp = fopen('homepage/template_all.htm', 'w');
+ fwrite($fp, implode("\n", $t));
+ fclose($fp);
+
+ $fp = fopen('homepage/box_groups_template.htm', 'w');
+ fwrite($fp, $theme_li);
+ fclose($fp);
+ }
+
+ function get_files($path, $init = true) {
+ if ($init) {
+ $this->helper = array('full' => array(), 'xml' => '');
+ }
+
+ if (is_dir($path)) {
+ if ($d = opendir($path)) {
+ $this->helper['xml'] .= '' . "\n";
+ while (($f = readdir($d)) !== false) {
+ if ($f[0] != '.' && $f != 'CVS') {
+ if (is_dir($path . '/' . $f)) {
+ $this->get_files($path . '/' . $f, false);
+ } else {
+ $this->helper['full'][] = $path . '/' . $f;
+ $this->helper['xml'] .= '' . $f . ' ' . "\n";
+ }
+ }
+ }
+ $this->helper['xml'] .= ' ' . "\n";
+ }
+ }
+
+ if ($init) {
+ return $this->helper;
+ }
+ }
+
+ function get_plugins() {
+ global $serendipity;
+
+ serendipity_plugin_api::traverse_plugin_dir($this->pluginpath, $this->plugins['event'], true);
+ serendipity_plugin_api::traverse_plugin_dir($this->pluginpath, $this->plugins['sidebar'], false);
+ $this->load_plugin($this->plugins['event']);
+ $this->load_plugin($this->plugins['sidebar']);
+ }
+
+ function encode($string, $force_utf8 = false) {
+ if ($force_utf8) {
+ $string = utf8_encode($string);
+ // TODO: This screw must be changed. Many authors entered their
+ // names inside plugins, but saved the file as ISO. Since some
+ // strings are not localized (like author name), it needs to
+ // be ensured that UTF-8 coding is the final result.
+ }
+ return htmlspecialchars($string);
+ }
+
+ function emerge($key) {
+ $this->xmlData[$key] = array();
+ $x = &$this->xmlData[$key];
+
+ $x[] = '';
+ $x[] = '' . "\n";
+ $x[] = '';
+
+ foreach($this->plugins[$key] AS $plugin_name => $plugin_data) {
+ $version = isset($plugin_data['properties']['version']) ? $plugin_data['properties']['version'] : '1.0';
+ $s9yVersion = isset($plugin_data['properties']['requirements']['serendipity']) ? $plugin_data['properties']['requirements']['serendipity'] : '0.8';
+ $license = isset($plugin_data['properties']['license']) ? $plugin_data['properties']['license'] : 'GPL';
+ $author = isset($plugin_data['properties']['author']) ? $plugin_data['properties']['author'] : 'Serendipity Team';
+
+ $x[] = '';
+ $x[] = '' . $this->encode($plugin_name, true) . ' ';
+ if (!empty($plugin_data['properties']['website'])) {
+ $x[] = '' . $this->encode($plugin_data['properties']['website'], true) . ' ';
+ }
+ if (!empty($plugin_data['properties']['changelog'])) {
+ $x[] = '' . $this->encode($plugin_data['properties']['changelog'], true) . ' ';
+ }
+ $x[] = '' . $this->encode($license, true) . ' ';
+ $x[] = '' . $this->encode($plugin_data['properties']['name']) . ' ';
+ $x[] = '' . $this->encode(implode(',', (array)$plugin_data['properties']['groups'])) . ' ';
+ $x[] = '' . $this->encode($plugin_data['properties']['description']) . ' ';
+ $x[] = '' . $this->encode($author, true) . ' lead ';
+
+ $x[] = '';
+ $x[] = ' ' . $this->encode($version, true) . ' ';
+ $x[] = ' ' . $this->encode($s9yVersion, true) . ' ';
+ $x[] = ' ' . date('Y-m-d', filemtime($plugin_data['pluginPath'] . '/' . $plugin_data['name'] . '.php')) . ' ';
+ $x[] = ' ';
+ $x[] = $plugin_data['files']['xml'];
+ $x[] = ' ';
+
+ $x[] = ' ';
+ foreach($plugin_data['files']['full'] AS $file) {
+ $x[] = ' ' . $file . ' ';
+ }
+ $x[] = ' ';
+ $x[] = ' ';
+
+ $x[] = ' ';
+ }
+ $x[] = ' ';
+ }
+
+ function emergeHomepage($key) {
+ global $serendipity;
+
+ $groups = array();
+ foreach($this->plugins[$key] AS $plugin_name => $plugin_data) {
+ $version = isset($plugin_data['properties']['version']) ? $plugin_data['properties']['version'] : '1.0';
+ $s9yVersion = isset($plugin_data['properties']['requirements']['serendipity']) ? $plugin_data['properties']['requirements']['serendipity'] : '0.8';
+ $license = isset($plugin_data['properties']['license']) ? $plugin_data['properties']['license'] : 'GPL';
+ $author = isset($plugin_data['properties']['author']) ? $plugin_data['properties']['author'] : 'Serendipity Team';
+
+ $x = '';
+ $x .= '';
+ $x .= '
' . $this->encode($plugin_data['properties']['name']) . '
';
+ $x .= '
' . $this->encode($plugin_name) . '
';
+ $x .= '
' . $this->encode(VERSION . ' ' . $version) . ' (' . $this->encode($license) . ', ' . $this->encode(LAST_UPDATED) . ' ' . date('Y-m-d', filemtime($plugin_data['pluginPath'] . '/' . $plugin_data['name'] . '.php')) . ')
';
+ $x .= '
' . $this->encode($author) . '
';
+ $x .= '
Serendipity >= ' . $this->encode($s9yVersion) . '
';
+ #$x .= '
' . $this->encode(implode(',', (array)$plugin_data['properties']['groups'])) . '
';
+
+ $x .= '
' . $this->encode($plugin_data['properties']['description']) . '
';
+
+ if (is_dir($plugin_name)) {
+ $zipfile = $plugin_name;
+ } else {
+ if (stristr($plugin_name, '_event_') !== FALSE) {
+ $zipfile = str_replace('_event_', '_plugin_', $plugin_name);
+ } else {
+ $zipfile = str_replace('_plugin_', '_event_', $plugin_name);
+ }
+ }
+ $x .= '
Download ViewCVS ';
+
+ if (!empty($plugin_data['properties']['website'])) {
+ $x .= '
Documentation ';
+ }
+ if (!empty($plugin_data['properties']['changelog'])) {
+ $x .= '
ChangeLog ';
+ }
+
+ $x .= '
';
+
+ foreach((array)$plugin_data['properties']['groups'] AS $group) {
+ $gnames[constant('PLUGIN_GROUP_' . $group)] = $group;
+ $groups[constant('PLUGIN_GROUP_' . $group)][$plugin_data['properties']['name']] = array(
+ 'plugin' => $this->encode($plugin_name),
+ 'name' => $this->encode($plugin_data['properties']['name']),
+ 'content' => $x
+ );
+ }
+
+ $fp = fopen('homepage/byplugin_' . $plugin_name . '_' . $serendipity['lang'] . '.htm', 'w');
+ fwrite($fp, $x);
+ fclose($fp);
+ }
+
+ $fp = fopen('homepage/bygroups_' . $key . '_' . $serendipity['lang'] . '.htm', 'w');
+ $li_groups = '';
+ ksort($groups);
+ foreach($groups AS $gname => $group) {
+ $p = array();
+ $gshort = $gnames[$gname];
+ ksort($group);
+ foreach($group AS $plug) {
+ $p[] = $plug['content'];
+ }
+ $c = '
+
' . $gname . '
+ ' . implode("\n", $p) . '
+ ';
+ fwrite($fp, $c);
+ $fp2 = fopen('homepage/bygroup_' . $key . '_' . $gshort . '_' . $serendipity['lang'] . '.htm', 'w');
+ fwrite($fp2, $c);
+ fclose($fp2);
+ $li_groups .= '' . $gname . ' ' . "\n";
+ }
+ fclose($fp);
+
+ $fp = fopen('homepage/box_groups_' . $key . '.htm', 'w');
+ fwrite($fp, $li_groups);
+ fclose($fp);
+ }
+
+ function emergeRSS($key, $title) {
+ $this->xmlData['RSS' . $key] = array();
+ $x = &$this->xmlData['RSS' . $key];
+
+ $x[] = '';
+ $x[] = '';
+ $x[] = '';
+ $x[] = 'Serendipity: Available External ' . $title . ' ';
+ $x[] = ' http://php-blog.cvs.sourceforge.net/php-blog/additional_plugins/';
+ $x[] = 'TOC ';
+ $x[] = 'en ';
+ $x[] = 'Serendipitx SPARTACUS ';
+
+ foreach($this->plugins[$key] AS $plugin_name => $plugin_data) {
+ $version = isset($plugin_data['properties']['version']) ? $plugin_data['properties']['version'] : '1.0';
+ $s9yVersion = isset($plugin_data['properties']['requirements']['serendipity']) ? $plugin_data['properties']['requirements']['serendipity'] : '0.8';
+ $license = isset($plugin_data['properties']['license']) ? $plugin_data['properties']['license'] : 'GPL';
+ $author = isset($plugin_data['properties']['author']) ? $plugin_data['properties']['author'] : 'Serendipity Team';
+
+ $x[] = '- ';
+ $x[] = '
' . $this->encode($plugin_data['properties']['name'] . ': ' . $plugin_data['properties']['description']) . ' ';
+ $x[] = ' http://php-blog.cvs.sourceforge.net/php-blog/additional_plugins/' . $plugin_data['pluginPath'] . '';
+ $x[] = '' . $this->encode($title) . ' ';
+ $x[] = '' . $this->encode($author) . ' ';
+ $x[] = '' . $this->encode('' . $plugin_name . ' ' . $plugin_data['properties']['name'] . ' ' . $plugin_data['properties']['description'] . ' For: Serendipity ' . $s9yVersion) . ' ';
+ $x[] = '' . date('r', filemtime($plugin_data['pluginPath'] . '/' . $plugin_data['name'] . '.php')) . ' ';
+ $x[] = '' . $this->encode($plugin_name) . ' ';
+ $x[] = ' ';
+ }
+ $x[] = ' ';
+ $x[] = ' ';
+ }
+
+ function output($key, $ext = 'xml') {
+ global $serendipity;
+
+ if ($this->i18n) {
+ $remotefile = 'package_' . $key . '_' . $serendipity['lang'] . '.' . $ext;
+ } else {
+ $remotefile = 'package_' . $key . '.' . $ext;
+ }
+ $file = dirname(__FILE__) . '/' . $remotefile;
+ $fp = fopen($file, 'w');
+ if ($fp) {
+ fwrite($fp, implode("\n", $this->xmlData[$key]));
+ fclose($fp);
+ }
+
+ $this->upload($file, $remotefile);
+ }
+
+ function upload($file, $remotefile) {
+ static $c, $login;
+ if (function_exists('ftp_connect')) {
+ if (!is_resource($c) || !$login) {
+ $c = ftp_connect('netmirror.org');
+ $data = explode(':', file_get_contents('../emerge_spartacus.dat'));
+ if (!$c || !is_resource($c)) {
+ echo "FTP Login failed.\n";
+ #die('FTP LOGIN IMPOSSIBLE');
+ }
+
+ $login = ftp_login($c, $data[0], $data[1]);
+ }
+ if ($c && $login) {
+ echo 'Uploading ' . $file . ' to ' . $remotefile . "\n";
+ if (ftp_delete($c, $remotefile)) {
+ echo 'Previous file ' . $remotefile . ' deleted.' . "\n";
+ } else {
+ echo 'ERROR: Could not delete previous file ' . $remotefile . '.' . "\n";
+ }
+ $retries = 0;
+ $retry_count = 3;
+ $test = ftp_put($c, $remotefile, $file, FTP_BINARY);
+ while (!$test && $retries < $retry_count) {
+ $retries++;
+ sleep(30);
+ ftp_delete($c, $remotefile);
+ $test = ftp_put($c, $remotefile, $file, FTP_BINARY);
+ }
+ }
+ }
+ }
+}
+
+$lang = (!empty($argv['2']) ? $argv[2] : 'en');
+$op = (!empty($argv['1']) ? $argv[1] : 'plugin');
+
+$spartacus = new emerge_spartacus($lang);
+$spartacus->init();
+
+if ($op == 'plugin') {
+ $spartacus->get_plugins();
+ $spartacus->emerge('event');
+ $spartacus->emerge('sidebar');
+ $spartacus->output('event');
+ $spartacus->output('sidebar');
+
+ $spartacus->emergeRSS('event', 'Event Plugins');
+ $spartacus->emergeRSS('sidebar', 'Sidebar Plugins');
+ $spartacus->emergeHomepage('event');
+ $spartacus->emergeHomepage('sidebar');
+ $spartacus->output('RSSevent');
+ $spartacus->output('RSSsidebar');
+
+ if ($lang == 'final') {
+ emerge_spartacus::upload('additional_plugins.tgz', 'additional_plugins.tgz');
+ emerge_spartacus::upload('additional_themes.tgz', 'additional_themes.tgz');
+ emerge_spartacus::upload('last.txt', 'last.txt');
+ exec('zip -9r spartacus_homepage.zip homepage/ -x \*.png -x \*.php -x \*.css -x \*.sh');
+ #emerge_spartacus::upload('spartacus_homepage.zip', 'spartacus_homepage.zip');
+ #exec('scp spartacus_homepage.zip garvinhicking@ssh.sf.net:/home/groups/p/ph/php-blog/htdocs/spartacus_homepage.zip');
+ #exec('scp last.txt garvinhicking@ssh.sf.net:/home/groups/p/ph/php-blog/htdocs/last.txt');
+ }
+} elseif ($op == 'template') {
+ $spartacus->getTemplates();
+ $spartacus->output('template');
+ exec('zip -9r spartacus_homepage_template.zip homepage/box_groups_template* homepage/template_*');
+ #exec('scp spartacus_homepage_template.zip garvinhicking@ssh.sf.net:/home/groups/p/ph/php-blog/htdocs/spartacus_homepage_template.zip');
+ #exec('ssh -l garvinhicking ssh.sf.net /home/groups/p/ph/php-blog/htdocs/cvs/additional_plugins/homepage/update.sh');
+}
diff --git a/header.php b/header.php
new file mode 100644
index 00000000..d1770e6d
--- /dev/null
+++ b/header.php
@@ -0,0 +1,28 @@
+(.+)$@iU', $p, $m)) {
+ if ($m[1] === "\n" || (ord($m[1][0]) === 13 && ord($m[1][1]) === 0)) {
+ continue;
+ }
+ for($i=0; $i <= strlen($m[1]); $i++) {
+ $char = $m[1][$i];
+ echo $i . "/" . ord($char) . ": " . dechex(ord($char)) . "\n";
+ }
+ echo $dir . '/' . $file . ' has trailing space' . "\n";
+ print_r($m);
+ }
+ }
+ }
+}
+
+check('.');
\ No newline at end of file
diff --git a/homepage/.cvsignore b/homepage/.cvsignore
new file mode 100644
index 00000000..a052631d
--- /dev/null
+++ b/homepage/.cvsignore
@@ -0,0 +1,4 @@
+by*.htm
+template*.htm
+box*.htm
+last.txt
diff --git a/homepage/.htaccess b/homepage/.htaccess
new file mode 100644
index 00000000..b0e37d7d
--- /dev/null
+++ b/homepage/.htaccess
@@ -0,0 +1 @@
+RewriteEngine Off
\ No newline at end of file
diff --git a/homepage/TODO b/homepage/TODO
new file mode 100755
index 00000000..22e66890
--- /dev/null
+++ b/homepage/TODO
@@ -0,0 +1,2 @@
+TODO:
+
diff --git a/homepage/css/back.gif b/homepage/css/back.gif
new file mode 100644
index 00000000..d207d212
Binary files /dev/null and b/homepage/css/back.gif differ
diff --git a/homepage/css/banner.gif b/homepage/css/banner.gif
new file mode 100644
index 00000000..c6a334b6
Binary files /dev/null and b/homepage/css/banner.gif differ
diff --git a/homepage/css/bkg.jpg b/homepage/css/bkg.jpg
new file mode 100644
index 00000000..3e727323
Binary files /dev/null and b/homepage/css/bkg.jpg differ
diff --git a/homepage/css/content-bottom-715.gif b/homepage/css/content-bottom-715.gif
new file mode 100644
index 00000000..40163b6a
Binary files /dev/null and b/homepage/css/content-bottom-715.gif differ
diff --git a/homepage/css/content-top-715.gif b/homepage/css/content-top-715.gif
new file mode 100644
index 00000000..c630f0a7
Binary files /dev/null and b/homepage/css/content-top-715.gif differ
diff --git a/homepage/css/contentbottom.gif b/homepage/css/contentbottom.gif
new file mode 100644
index 00000000..42732825
Binary files /dev/null and b/homepage/css/contentbottom.gif differ
diff --git a/homepage/css/contenttop.gif b/homepage/css/contenttop.gif
new file mode 100644
index 00000000..b4ad4ef3
Binary files /dev/null and b/homepage/css/contenttop.gif differ
diff --git a/homepage/css/favicon.png b/homepage/css/favicon.png
new file mode 100644
index 00000000..40eab844
Binary files /dev/null and b/homepage/css/favicon.png differ
diff --git a/homepage/css/forward.gif b/homepage/css/forward.gif
new file mode 100644
index 00000000..2a85cb20
Binary files /dev/null and b/homepage/css/forward.gif differ
diff --git a/homepage/css/graph_bar_horisontal.png b/homepage/css/graph_bar_horisontal.png
new file mode 100644
index 00000000..82102f7b
Binary files /dev/null and b/homepage/css/graph_bar_horisontal.png differ
diff --git a/homepage/css/left.gif b/homepage/css/left.gif
new file mode 100644
index 00000000..b5b23390
Binary files /dev/null and b/homepage/css/left.gif differ
diff --git a/homepage/css/leftbottom.gif b/homepage/css/leftbottom.gif
new file mode 100644
index 00000000..f65912f7
Binary files /dev/null and b/homepage/css/leftbottom.gif differ
diff --git a/homepage/css/s9y-banner-960.jpg b/homepage/css/s9y-banner-960.jpg
new file mode 100644
index 00000000..a3e3ffbc
Binary files /dev/null and b/homepage/css/s9y-banner-960.jpg differ
diff --git a/homepage/css/sidebar-bottom-960.gif b/homepage/css/sidebar-bottom-960.gif
new file mode 100644
index 00000000..46f7ba10
Binary files /dev/null and b/homepage/css/sidebar-bottom-960.gif differ
diff --git a/homepage/css/sidebar-top-960.gif b/homepage/css/sidebar-top-960.gif
new file mode 100644
index 00000000..2db66fb3
Binary files /dev/null and b/homepage/css/sidebar-top-960.gif differ
diff --git a/homepage/css/style.css b/homepage/css/style.css
new file mode 100644
index 00000000..e2b922dd
--- /dev/null
+++ b/homepage/css/style.css
@@ -0,0 +1,96 @@
+.template_summary,
+.plugin_summary {
+ font-size: 1.1em;
+ padding: 3px;
+ font-weight: bold;
+}
+
+.template_name,
+.plugin_name {
+ text-align: right;
+ font-size: 0.9em;
+ font-style: italic;
+}
+
+.template_version,
+.plugin_version {
+ text-align: right;
+}
+
+.template_maintainers,
+.plugin_maintainers {
+ text-align: right;
+}
+
+.template_requirements,
+.plugin_requirements {
+ text-align: right;
+}
+
+.template_description,
+.plugin_description {
+ margin: 15px 0px 15px 0px;
+}
+
+.template_download,
+.plugin_download {
+ text-align: right;
+}
+
+.template_download {
+ margin: 0px auto 0px auto;
+ text-align: center;
+}
+
+.template_download a,
+.plugin_download a {
+ font-size: 1em;
+ color: white;
+ padding: 5px;
+ text-decoration: none;
+ border: 0px;
+}
+
+.serendipitySideBarContent ol {
+ list-style: none;
+ margin: 0px 0px 0px 10px;
+ padding: 0px;
+}
+
+.serendipitySideBarContent .language {
+ width: 130px !important;
+}
+
+.serendipitySideBarContent input.smallsubmit {
+ width: 25px;
+ float: right;
+}
+
+#content {
+ background-color: white;
+ margin: 1px;
+ padding: 1px;
+ border: 1px solid white;
+}
+
+.group h3 {
+ border-bottom: 2px solid #8cb4c9;
+}
+
+.template,
+.group .plugin {
+ background-color: #edf5fc;
+ border: 1px solid #cce2fa;
+ padding: 5px;
+ margin: 10px 0px 10px 0px;
+}
+
+.serendipity_entry {
+ clear: both;
+ position: relative;
+}
+
+#sidebartop, #contenttop {
+ line-height: 1px;
+ font-size: 1px;
+}
diff --git a/homepage/css/style_new.css b/homepage/css/style_new.css
new file mode 100644
index 00000000..6b39acfe
--- /dev/null
+++ b/homepage/css/style_new.css
@@ -0,0 +1,698 @@
+/******************************************************/
+/* Official Serendipity Blog Theme */
+/* */
+/* This is a structured and commented version */
+/* of the serendipity blog default theme. */
+/* */
+/* Styles have been organised into the following */
+/* groups; general, header, footer, entry, comments */
+/* commentform, sidebar, calendar, image media, and */
+/* plugins. */
+/******************************************************/
+
+
+/********* General Styles *********/
+
+ /* used in entry/sidebar titles */
+h4, h3 {
+ margin: 0; }
+
+/* the input boxes used in forms */
+input, textarea, select {
+ font-size: 10pt; }
+
+/* all table headers and rows */
+th, td {
+ font-size: 10pt; }
+
+/* style for lists */
+li {
+ list-style-position: inside; }
+
+/* style for blockquotes inserted into posts */
+blockquote {
+ margin: 15px 30px 10px 15px;
+ padding-left: 15px;
+ border-left: 4px solid #354e6c; }
+
+/* all links are blue with no underline */
+a:link, a:visited, a:active {
+ color: #3e5f81;
+ text-decoration: none; }
+
+/* change link color to orange and underline when hovered over */
+a:hover {
+ color: #25253d;
+ text-decoration: underline; }
+
+/* used when s9y needs to center something */
+.serendipity_center {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center; }
+
+/* warning messages from s9y */
+.serendipity_msg_important {
+ color: red; }
+
+/* messages letting you know something has happened eg comment saved */
+.serendipity_msg_notice {
+ color: green; }
+
+/* style to temporarily change something to grey */
+.grey {
+ color:#999; }
+
+ /* code/pre rules by Don */
+pre {
+/* the following is not fully WC3 css3 compliant due to browser specific rules, but works well in all browsers tested */
+ overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
+
+code, pre {
+ background: #f6f6f6;
+ border: 2px solid #bbbbbb;
+ color: #278350;
+ font-family:"Courier New",Courier,monospace;
+ padding: 10px;
+}
+
+code {
+ display: block;
+}
+
+code pre,
+pre code {
+ border:0;
+ padding:0;
+}
+
+/********* End of General Styles *********/
+
+
+
+/********* Structural Styles *********/
+
+/* preset styles for entire blog unless overruled elsewhere, page footer is here as well */
+body {
+ direction: ltr;
+ font-size: 0.9em;
+ background-color: #fff;
+ margin: 0;
+ padding:0;
+ padding-top:8px;
+ background:#ccdee7 url(bkg.jpg) fixed top left repeat-x;
+ font-family: "verdana", "bitstream vera sans", arial, sans-serif; }
+
+/* wrapper for page */
+#wrap {
+ width: 960px;
+ margin: 0px auto; }
+
+/* container for banner */
+#header {
+ position:relative;
+ width: 960px;
+ height: 180px;
+ margin: 0px auto 10px auto;
+ text-align: center;
+ background:transparent url(s9y-banner-960.jpg) top center no-repeat; }
+
+#menu {display:block;margin:0 3px 0 0; padding:15px 0 0 0;text-align:right;font-size:8pt;font-weight:bold;}
+#menu a {margin:0; padding:0;}
+
+/* container for content and sidebar */
+#mainpane {
+ overflow: hidden; }
+
+/* container for entries column */
+#rightcolumn {
+ margin:0 1px 10px 0;padding:0 0 8px 0;
+ float:right;
+ background:transparent url(content-bottom-715.gif) bottom left no-repeat;
+ width: 715px;}
+
+#content {
+ padding:10px 10px 10px 30px;margin:0;
+ background-color:#fff; }
+
+#contenttop {height:10px; margin:0; padding:0;
+ background:transparent url(content-top-715.gif) no-repeat; }
+
+/* container for left sidebar */
+#serendipityLeftSideBar {
+ display: inline; /* ie win bugfix */
+ float: left;
+ /*width:190px;*/
+ width:230px;
+ padding:0 3px 8px 0;
+ margin:0 0 10px 3px;
+ background:transparent url(sidebar-bottom-960.gif) bottom left no-repeat; }
+
+#sidebarmiddle {
+ border-left:#fff 2px solid;margin:0;padding:10px;
+ border-right:#fff 2px solid;border-bottom:none;
+ background-color:#25253d; }
+
+#sidebartop {
+ height:8px;margin:0;padding:0;
+ background:transparent url(sidebar-top-960.gif) no-repeat; }
+
+/* container for page footer */
+#footer {
+ clear:both;
+ padding: 0;
+ margin: 5px 0px 5px 3px;
+ border-top: 1px solid #444; }
+
+.serendipity_pageFooter {
+ margin: 25px 10px 0 0;
+ padding: 10px;
+ border: 1px solid #ddecfb;
+ background-color: #f6f8fb; }
+
+#identity {
+ position:absolute;
+ right:90px; /* different from blog template due to long text */
+ width:580px; /* different from blog template due to long text */
+ text-align:center;
+ top: 80px; }
+
+/********* End of Structural Styles *********/
+
+
+/********* Header/Banner Styles *********/
+
+/* the big link in the banner, blog name/entry title */
+a.homelink1, a.homelink1:hover, a.homelink1:link, a.homelink1:visited, #header h1 {
+ color: #fff;
+ font-family: Georgia, Times New Roman, Times, serif;
+ font-size : 16pt;padding:0;margin:0;
+ text-decoration: none; }
+
+/* the smaller link in the banner, blog description */
+a.homelink2, a.homelink2:hover, a.homelink2:link, a.homelink2:visited, #header h2 {
+ color: #fff;
+ font-size: 11pt;padding:0;margin:0;
+ text-decoration: none; }
+
+/********* End of Header/Banner Styles *********/
+
+
+
+
+/********* Footer Styles *********/
+
+/* footer paragraph text */
+#footer p {
+ color:#444;
+ font-size: 9pt;
+ font-weight: normal;
+ line-height: 1.5em;
+ padding: 0px 2px 0px 0px;
+ margin:0;
+ text-align: center;
+}
+
+/* make footer links blue, no underline */
+#footer a {
+ color:#25253d;font-weight:bold;
+ text-decoration:none; }
+
+/* underline footer links when hovered over */
+#footer a:hover {
+ color:#25253d;
+ text-decoration:underline; }
+
+/********* End of Footer Styles *********/
+
+
+
+
+
+/********* Entry Styles *********/
+
+/* container for the entry/post */
+.serendipity_entry, .serendipity_Entry_Date, .staticpage_results {
+ font-family: verdana, helvetica, sans-serif;
+ color: #333;
+ font-size: 9.5pt;
+ font-weight: normal;
+ margin: 0 20px 40px 0; }
+
+/* container for entry title and date */
+.serendipity_Entry_Date {
+ clear:both; }
+
+/* entry title */
+.serendipity_title, h3.serendipity_date, .staticpage_result_header {
+ clear:left;
+ font: bold 10pt/14pt Georgia, Times New Roman, Times, serif;
+ margin-bottom: 8px;/*text-transform:lowercase;*/
+ border-bottom: 2px solid #8cb4c9;
+ color: #3e5f81; }
+
+h3.serendipity_date {margin-right:10px;}
+
+/* entry title link, regular color is black */
+.serendipity_title a:link, .serendipity_title a:visited {
+ text-decoration: none;
+ border: 0;
+ background:none;
+ color: #3e5f81; }
+
+/*entry title link when hovered over, changes to green */
+.serendipity_title a:hover {
+ color: #25253d; }
+
+/* additional styles used for entry text */
+.serendipity_entry p {
+ margin: 0px;
+ padding-bottom: 10px; }
+
+/* style for extended body */
+.serendipity_entry_extended {
+ margin-top:20px; }
+
+/* prevent styling of the extended placeholder, otherwise the background image is visible */
+#extended {
+ background:none;
+ display:none; }
+
+.serendipity_comments {
+ clear: both; }
+
+/* the meta box that includes links to comments, trackbacks etc */
+div.serendipity_entryFooter {
+ margin: 0 0px 10px 10px;
+ width:170px;
+ float:right;
+ border:1px solid #cce2fa;
+ background-color:#edf5fc;
+ font-size: 0.8em;
+ color: #000000;
+ padding: 2px;
+ padding-bottom: 4px; }
+
+/* style for links within the page footer */
+div.serendipity_entryFooter a {
+ font-weight:bolder; }
+
+/* style for hovered over links within page footer */
+div.serendipity_entryFooter a:hover {
+ text-decoration:none; }
+
+/* styles for category icon if used */
+img.serendipity_entryIcon {
+ float: right;
+ border: 0px;
+ margin-top:1px; }
+
+/* styling the continue reading byline, needed to stop firefox making the link 100% wide */
+.continue_reading {
+ display:block;
+ margin-top:10px;
+ clear:left; }
+
+/* styling the continue reading byline link */
+.continue_reading a {
+ font-weight:normal; }
+
+/* styles for the next/previous links above footer, includes start page and archives links */
+.serendipity_pageFooter {
+ clear:both;
+ font-size: 10px;
+ margin-top:10px; }
+
+/* container for summary listings in archives */
+.archive_summary {
+ clear:both;
+ margin:15px 0 0 10px;
+ font-size:0.9em;}
+
+/* style for entry title in summary archives overview */
+.archive_summary_title {
+ font-size: 1.0em;
+ font-weight: bold;
+ margin: 0; padding:0; }
+
+#archives_listing h2{
+ font-size: 0.9em;
+ font-weight: bold;
+ margin-top: 10px;
+ color: #354e6c; }
+
+
+/* style for entry summary list -don */
+#entries_summary {margin-bottom:0; padding-bottom: 10px;}
+
+#entries_summary_list {margin:0;} /*don*/
+
+/********* End of Entry Styles *********/
+
+
+
+
+/********* Comment Styles *********/
+
+/* container for all comments, not styled separately in default theme */
+.serendipity_comments {
+ }
+
+/* comments, trackbacks and commentform titles */
+.serendipity_commentsTitle {
+ font-size: 0.9em;
+ font-weight: bold;
+ margin-top: 10px;
+ border-bottom: 2px solid #8cb4c9;
+ color: #354e6c;
+ clear:left; }
+
+/* container for individual comments */
+.serendipity_comment {
+ padding: 3px; }
+
+/* style for comment author, date commented etc */
+.serendipity_comment_source {
+ margin-top: 5px;
+ padding-left: 5px;
+ margin-bottom: 5px;
+ padding-bottom: 3px; }
+
+/* style for comment author if logged in */
+.serendipity_comment_author_self {
+ border-top:3px solid #e37235;
+ border-bottom:3px solid #e37235; }
+
+/* style for even numbered comments*/
+.comment_evenbox {
+ margin:0 0 20px 0;
+ border-top:1px solid #8cb4c9;
+ border-bottom:1px solid #8cb4c9;
+ background-color: #f6f8fb;
+ color:#505050;
+ line-height:1.5em; }
+
+/* style for odd numbered comments*/
+.comment_oddbox {
+ margin:0 0 20px 0;
+ border-top:1px solid #25253d;
+ border-bottom:1px solid #25253d;
+ background-color: #f6f8fb;
+ color:#505050;
+ line-height:1.5em; }
+
+/********* End of Comment Styles *********/
+
+
+
+/********* Comment Form *********/
+
+/****** Comment Form Styles ******/
+form dt {float: left; margin-bottom: 5px; }
+form dd {padding-left: 0em; margin-left: 100px; margin-bottom: 5px; }
+form textarea {margin-bottom: 10px; }
+
+/********* End of Comment Form *********/
+
+
+
+
+/********* Sidebar Styles *********/
+
+/* container style for individual sidebar blocks */
+div.serendipitySideBarContent {
+ padding: 0 5px 6px 5px;
+ margin:0;
+ font-size: 8.5pt;
+ line-height:10pt;
+ color:#fff;
+ font-weight:normal; }
+
+div.serendipitySideBarContent a {color:#77a6bf; text-decoration:none; }
+
+div.serendipitySideBarContent a:hover {color:#77a6bf; text-decoration:underline; }
+
+/* style for each sidebar title */
+.serendipitySideBarTitle {
+ font: bold 10pt/14pt Georgia, Times New Roman, Times, serif;
+ /*text-transform: lowercase;*/
+ margin:0 0 8px 0;
+ color: #ffbf00;
+ background-color:#25253d;
+ padding: 0px 0px 0px 7px; }
+
+/* style for the powered by sidebar entry */
+div.serendipityPlug img {
+ padding-left:5px; }
+
+/* style for the powered by link */
+div.serendipityPlug a {
+ text-decoration: none;
+ border: 0px; }
+
+/* style for input and select drop downs in sidebar */
+.serendipitySideBarContent input, .serendipitySideBarContent select, .serendipitySideBarContent textarea, .serendipitySideBarContent td input {
+ width:160px; color:bbb; }
+
+/* style for side bar date eg recent entries plugin */
+.serendipitySideBarDate {
+ line-height:0.9em;
+ font-style:oblique; }
+
+.serendipitySideBarContent ul {
+ list-style-type: none;
+ margin: 0px;
+ padding: 0px; }
+
+.serendipitySideBarContent ul.navig {
+ background-color: #25253d;
+ color: #febf00; }
+
+.serendipitySideBarContent ul.navig li {
+ padding: 5px; }
+
+.serendipitySideBarContent ul.navig li a {
+ color: #febf00;
+ font-weight: bold;
+ display: block; }
+
+.serendipitySideBarContent ul.navig li a:hover {
+ text-decoration: none;
+ background-color: #ffffff;
+ color: #25253d; }
+
+.serendipitySideBarContent .serendipity_edit_nugget {
+ margin-top: 15px;
+ text-align: center;
+ font-weight: bold;
+ font-size: 9px;
+ border-top: 1px dotted #febf00; }
+
+/********* End of Sidebar Styles *********/
+
+
+
+
+/********* Calendar Styles *********/
+
+/* style for entire table in calendar plugin */
+table.serendipity_calendar {
+ border-bottom:2px solid #6092ac; }
+
+/* container style for calendar table rows */
+table.serendipity_calendar td {
+ text-align:center;
+ padding: 3px; }
+
+/* style for calendar date links */
+table.serendipity_calendar a {
+ font-weight: bold;
+ text-decoration:none; }
+
+/* style for calendar links when hovered over */
+table.serendipity_calendar a:hover {
+ text-decoration: underline; }
+
+/* style for calender header row */
+.serendipity_calendarHeader {background:#3a5777; }
+
+/* styles for month name and arrows in calendar */
+td.serendipity_calendarHeader a:link, td.serendipity_calendarHeader a:visited, td.serendipity_calendarHeader a:hover {
+ border: 0;
+ color:#fff;
+ text-decoration: none; }
+
+/* style for calendar weekday names */
+td.serendipity_weekDayName {
+ font-size:95%!important;
+ font-size:90%;
+ font-weight:575;
+ color:#25253d;
+ background:#82a9bf; }
+
+/* style for calendar day rows */
+td.serendipity_calendarDay {
+ color:#fff;
+ font-size:90%; }
+
+/* separate style for today's date
+td.Today {color: #444; text-decoration: overline; }*/
+
+
+/********* End of Calendar Styles *********/
+
+
+
+
+
+/********* Embedded images with the s9y image manager *********/
+
+/* container for images and text */
+.serendipity_imageComment_center{
+ border: 1px solid #DDDDDD;
+ background-color: #fff;
+ margin: 3px;
+ padding: 3px;
+ text-align: center; }
+
+.serendipity_imageComment_left
+{
+ border: 1px solid #DDDDDD;
+ background-color: #fff;
+ margin:0 8px 4px 0;
+ padding: 3px;
+ text-align: center; }
+.serendipity_imageComment_right
+{
+ border: 1px solid #DDDDDD;
+ background-color: #fff;
+ margin: 0 0 4px 8px;
+ padding: 3px;
+ text-align: center; }
+
+/* style for image container when linked to larger image */
+.serendipity_imageComment_center a, .serendipity_imageComment_left a, .serendipity_imageComment_right a {
+ background:none; }
+
+/* style for image container when hovered over */
+.serendipity_imageComment_center a:hover, .serendipity_imageComment_left a:hover, .serendipity_imageComment_right a:hover {
+ background:none; }
+
+/* style to center image and text within entry */
+.serendipity_imageComment_center {
+ margin: auto; }
+
+/* style to left align image and text within entry */
+.serendipity_imageComment_left {
+ float: left; }
+
+/* style to right align image and text within entry */
+.serendipity_imageComment_right {
+ float: right; }
+
+/* styles for the images */
+.serendipity_imageComment_img, .serendipity_imageComment_img img {
+ margin: 0px;
+ padding: 0px;
+ text-align: center; }
+
+/* styles for the text below the image if used */
+.serendipity_imageComment_txt {
+ border-top: 1px solid #DDDDDD;
+ margin: 0px;
+ padding: 3px;
+ clear: both;
+ font-size: 8pt;
+ text-align: center; }
+
+/********* End of Media Manager Styles *********/
+
+
+
+
+
+/********* Plugin Styles *********/
+
+/* container for search results, static page navigation and s9y no entries message */
+.serendipity_search, .staticpage_navigation, .serendipity_overview_noentries {
+ margin: 25px 10px 15px 0px;
+ padding: 10px;
+ border: 1px solid #ddecfb;
+ background-color: #f6f8fb; }
+
+/* style for the seearch term and number of results using quicksearch */
+.searchterm, .searchresults {color:#354e6c;font-weight:bold; }
+
+/* style for freetag items above entries */
+.serendipity_freetag_taglist {
+ margin:10px 0 20px 0;
+ padding:15px;
+ font-size: 80%;
+ color:#505050;
+ border: 1px solid #c0c0c0;
+ background-color: #fafbfc;
+ line-height:1.5em;
+ text-align: justify; }
+
+/* container for freetag plugin in entry footer */
+.serendipity_freeTag {
+ margin-top:10px;}
+
+/* style for the rss feed image in freetag plugin */
+img.serendipity_freeTag_xmlButton {
+ border:none;
+ padding-left:2px; }
+
+/* container for karma vote plugin */
+.serendipity_karmaVoting {
+ margin-top: 10px; }
+
+/* style for karma plugin 'Karma for this article:' and vote links */
+.serendipity_karmaVoting_text {}
+
+/* style for vote links in karma plugin */
+.serendipity_karmaVoting_links {
+ display:block;
+ clear:left; }
+
+/* style for karma plugin text and vote line */
+.serendipity_karmaVoting_current, .serendipity_karmaVoting_visits {}
+
+/* style for the separator '|' in the karma plugin top exits */
+.serendipity_karmaVoting_exits_sep, .serendipity_karmaVoting br {
+ display:none; }
+
+/* container for comments plugin within sidebar */
+.container_serendipity_plugin_comments {
+ color:#fff; }
+
+/* style for line break in comments plugin */
+.container_serendipity_plugin_comments br {
+ line-height:0.1em; }
+
+/* container for individual comment within sidebar */
+.plugin_comment_wrap {
+ display:block;
+ margin:15px 0 0 0;
+ color:#fff; }
+
+/* style for comment body within sidebar */
+.plugin_comment_body {
+ font-style:oblique; }
+
+/********* End Plugin Styles *********/
+
+.serendipity_entry {
+ clear: both;
+}
+
+/* Judebert sidebar hack */
+* html .serendipitySideBarContent ol {
+ text-indent: -1em;
+}
diff --git a/homepage/css/xml.gif b/homepage/css/xml.gif
new file mode 100644
index 00000000..1bbcc100
Binary files /dev/null and b/homepage/css/xml.gif differ
diff --git a/homepage/header.png b/homepage/header.png
new file mode 100644
index 00000000..99e68242
Binary files /dev/null and b/homepage/header.png differ
diff --git a/homepage/header.psd b/homepage/header.psd
new file mode 100644
index 00000000..1453fe3f
Binary files /dev/null and b/homepage/header.psd differ
diff --git a/homepage/header2.psd b/homepage/header2.psd
new file mode 100644
index 00000000..ed5c2ef2
Binary files /dev/null and b/homepage/header2.psd differ
diff --git a/homepage/header3.psd b/homepage/header3.psd
new file mode 100644
index 00000000..99e7c3d2
Binary files /dev/null and b/homepage/header3.psd differ
diff --git a/homepage/index.php b/homepage/index.php
new file mode 100644
index 00000000..543c1bf5
--- /dev/null
+++ b/homepage/index.php
@@ -0,0 +1,173 @@
+
+
+
+
+
+ Serendipity :: Spartacus - Serendipity Plugin And Repository Tool Access Customization/Unification System
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
« Back to main
+
+
+
You can browse these categories:
+
+
You can also quickjump to specific plugin categories on the left side.
+
+
Invalid URL
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/homepage/source/logo.png b/homepage/source/logo.png
new file mode 100644
index 00000000..b51d2f10
Binary files /dev/null and b/homepage/source/logo.png differ
diff --git a/homepage/source/s9yTheEnd2.psd b/homepage/source/s9yTheEnd2.psd
new file mode 100644
index 00000000..5c78e228
Binary files /dev/null and b/homepage/source/s9yTheEnd2.psd differ
diff --git a/homepage/source/s9yTheEnd2a.ai b/homepage/source/s9yTheEnd2a.ai
new file mode 100644
index 00000000..92af88c8
--- /dev/null
+++ b/homepage/source/s9yTheEnd2a.ai
@@ -0,0 +1,7858 @@
+%PDF-1.4
%
+1 0 obj<>
endobj
2 0 obj<>
endobj
3 0 obj<>
endobj
5 0 obj null
endobj
6 0 obj<>/ExtGState<>/Properties<>>>>>/Group 1871 0 R/PieceInfo<>/LastModified(D:20060609220111+02'00')>>
endobj
7 0 obj<>
endobj
8 0 obj<>
endobj
9 0 obj<>stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 9.0
+%%AI8_CreatorVersion: 11.0.0
+%%For: (The_Impossible_Dream) (none)
+%%Title: (s9yTheEnd2a.ai)
+%%CreationDate: 6/9/2006 10:01 PM
+%%BoundingBox: 0 0 980 700
+%%HiResBoundingBox: 0 0 980 700
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
+%%+ procset Adobe_screens_AI5 1.0 0
+%%+ procset Adobe_ColorImage_AI6 1.3 0
+%%+ procset Adobe_Illustrator_AI5 1.3 0
+%%+ procset Adobe_cshow 2.0 8
+%%+ procset Adobe_shading_AI8 1.0 0
+%AI5_FileFormat 5.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
+%%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4
+%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 1 3 ()
+%AI3_TemplateBox: 490.5 349.5 490.5 349.5
+%AI3_TileBox: 204.6025 -58.4949 775.3226 758.7051
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 980 700
+%AI5_RulerUnits: 1
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 0 0 0 1 0 0 0 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: 274.3335 373.6665 3 1140 746 26 0 0 10 82 0 0 1 1 1 0
+%AI5_OpenViewLayers: 7
+%%PageOrigin:12 12
+%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 0
+%%EndComments
+
+endstream
endobj
10 0 obj<>stream
+%%BoundingBox: 0 0 980 700
+%%HiResBoundingBox: 0 0 980 700
+%AI7_Thumbnail: 128 92 8
+%%BeginData: 4484 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
+%FDFCFFFDFCFFFDFCFFFDECFFA852272728FFFFFF522753A9FD63FFA87E7E
+%FF7EA9A8A87EA87DA9A9847DFFA9289875744B53A85927742727537EA87E
+%FD5EFF534B504B27744A4B4A512774264B4A50272750C650514A4B4A5127
+%754A9E5051265127AFFD5CFF529EC6509FC09F7AC674C6C09F9EC69E9F7A
+%9F9E7B9E7BC09FC69F9E7B9E75C67B7A52FD5DFF279EC69EC09E279E9E27
+%C09E269F7A7A9EC0749E74C6509E50C674C650C6277AC04B7EFD5DFF5250
+%9F4B517475517B27517A75507B74754A9F74757475C09F5051745174514B
+%9E52FD5EFF2700002700000027002700050000002700050005000000C64A
+%0000050000269E26A8FD5EFF530028272827282728272827282728272827
+%2827282728272827282728055127A8FD60FFA8A8FFA8A8A8FFA8A8A8FFA8
+%A8A8FFA8A8A8FFA8A8A8A9A8A8A8FFA8A8A8FDFCFFFDFCFFFDFCFFFDFCFF
+%FDFCFFFDFCFFFD8CFFA87D5253A8FFFFFF5353A8FD64FFA8FFFFFFA8FFFF
+%FFA8FFA8FFA9FFA9FFA827744A4A28A8FF534A4A2828A8FFFFA8FD5EFF7D
+%524B52285152522752285152522752535250C62775274C27284B754A7B27
+%5227527DFD5CFFA84B9E9E4A9E9E7A9E9E509E9E74749E9E27749E9E519E
+%759E9E9E9F74FD049E747453FD5CFFA827C69E9FC67B4BC65151C67B51C6
+%50C77AC64AC651C650C174C69E9F7A7B27C69E51A8FD5CFF7D277A9E4A9E
+%9E519E75279E9E519E747475749E74759E759E9E507474759E27747453FD
+%5DFFA92727272827272728272827282727272827272728272850C6272827
+%2827274A9F27A9FD5DFFA827002700270027002700270027002700270005
+%0027004B50270027002700752628A8FD5EFFFD0427002827270027272827
+%282728275352522728000000FD042728002727FD5EFFA82700270027F827
+%2128527D7D7D59A87D7C7BA67B7C527D52532728002700270027A8FD5EFF
+%27282728287D527D7DA884847E8584CFC7C6C0C6C7A75983597D7D7D28FD
+%0427FD5EFFA8270028537D83A87D847DA8A8A77CC8C7C79EC09EC8582F06
+%2E287D587D28270027A8FD5EFF27277D7DA8845A845A84A8CEC6C6C0C09E
+%C09EC098C1A7A7585958A7527D525200FD5EFFA800527D51CFA7845984A7
+%CF9EC09EC098C0989898BA98CE58280527052827585253A8FD5EFF287E7D
+%A87E7E595A5959A7CEC7C19EC098BA98C1C0CDCEAD2E2800280000577C7D
+%FD5EFFA87E52A82F5A2F592F2F59CECECEA5C7A5C8C7C8A67C2E2E2D7C51
+%7C7B7C7BCD2753FD5FFF537CCF845959597D83CEC1C098C098BB9FCEAD2E
+%0028052700272DCDCDA651007DFD5FFF7DF8A7CECFCECECEC898BA989892
+%9892929FCE000500270005F800277CF8002EFFA8FD5EFFA827005252582E
+%A7C1BA98BA92BA929892C8CEAC27270005000500827B28A8FFA8FD5EFFA8
+%FFA8520505000058CD989892926E9292C7A62EA6CDA67C51587BACCD2752
+%FF5327A8FD5DFFA928FD05FF5305A7CEC7C8C1C7C7CDA62DF8052DA6A6CE
+%CDCE7C27F8FF7D0027FD5EFFA8270052537EA8FF000051A6A6ADA6822D00
+%F87D5205F800F805F8F8F8A8FF52F827A8FD5EFF272700270027A9FF2E00
+%F805F800F8052EFD04FF845959527D7DFFFF7D002827FD5EFFA827002700
+%270028A8FFA87D537D597DA8FFA85228A8FD06FF7D5200270027A8FD5DFF
+%A9002727270028002753FD06FFA852280027002828525252272700282727
+%00FD5EFFA828F8270000F8270000F82727282727F800F8270000F800F800
+%F8000000F827F828A8FD5EFFA8A87DA87DA87DA87DA87D7E7DA87DA87DA8
+%7DA87DA87DA87DA87DA87DA87DA8A8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFF
+%FDFCFFFDFCFFFDFCFFFDFCFFFDD7FFFF
+%%EndData
+
+endstream
endobj
11 0 obj 26444
endobj
12 0 obj<>stream
+HW[o8~/}(c7,ӧ\i#δ]t
+hH*ږ%.91]bIN>|x% B#fk@wE
+J^q[C~!0J%#kt'z7