]> git.mxchange.org Git - friendica.git/commitdiff
Merge remote branch 'upstream/master'
authorMichael <icarus@dabo.de>
Sun, 19 Feb 2012 19:09:42 +0000 (20:09 +0100)
committerMichael <icarus@dabo.de>
Sun, 19 Feb 2012 19:09:42 +0000 (20:09 +0100)
Conflicts:
view/theme/vier/style.css

162 files changed:
INSTALL.txt
boot.php
database.sql
doc/Pages.md
doc/Plugins.md
doc/developer [deleted file]
images/beer_mug.gif [new file with mode: 0644]
images/coffee.gif [new file with mode: 0644]
images/icons/10/audio.png [new file with mode: 0644]
images/icons/10/image.png [new file with mode: 0644]
images/icons/10/text.png [new file with mode: 0644]
images/icons/10/video.png [new file with mode: 0644]
images/icons/10/zip.png [new file with mode: 0644]
images/icons/16/audio.png [new file with mode: 0644]
images/icons/16/image.png [new file with mode: 0644]
images/icons/16/text.png [new file with mode: 0644]
images/icons/16/video.png [new file with mode: 0644]
images/icons/16/zip.png [new file with mode: 0644]
images/icons/22/audio.png [new file with mode: 0644]
images/icons/22/image.png [new file with mode: 0644]
images/icons/22/text.png [new file with mode: 0644]
images/icons/22/video.png [new file with mode: 0644]
images/icons/22/zip.png [new file with mode: 0644]
images/icons/48/audio.png [new file with mode: 0644]
images/icons/48/image.png [new file with mode: 0644]
images/icons/48/text.png [new file with mode: 0644]
images/icons/48/video.png [new file with mode: 0644]
images/icons/48/zip.png [new file with mode: 0644]
images/icons/Makefile
images/icons/audio.png [new file with mode: 0644]
images/icons/image.png [new file with mode: 0644]
images/icons/text.png [new file with mode: 0644]
images/icons/video.png [new file with mode: 0644]
images/icons/zip.png [new file with mode: 0644]
images/smiley-bangheaddesk.gif [new file with mode: 0644]
images/smiley-facepalm.gif [new file with mode: 0644]
include/attach.php
include/auth.php
include/bb2diaspora.php
include/bbcode.php
include/conversation.php
include/datetime.php
include/delivery.php
include/diaspora.php
include/enotify.php
include/expire.php
include/items.php
include/network.php
include/notifier.php
include/oembed.php
include/plugin.php
include/poller.php
include/profile_advanced.php
include/text.php
library/fullcalendar/GPL-LICENSE.txt [new file with mode: 0644]
library/fullcalendar/MIT-LICENSE.txt [new file with mode: 0644]
library/fullcalendar/changelog.txt [new file with mode: 0644]
library/fullcalendar/fullcalendar.css [new file with mode: 0644]
library/fullcalendar/fullcalendar.js [new file with mode: 0644]
library/fullcalendar/fullcalendar.min.js [new file with mode: 0644]
library/fullcalendar/fullcalendar.print.css [new file with mode: 0644]
library/fullcalendar/gcal.js [new file with mode: 0644]
library/slinky.php
library/spam/README [new file with mode: 0644]
library/spam/b8/b8.php [new file with mode: 0644]
library/spam/b8/b8.php.ORIG [new file with mode: 0644]
library/spam/b8/degenerator/degenerator_default.php [new file with mode: 0644]
library/spam/b8/lexer/lexer_default.php [new file with mode: 0644]
library/spam/b8/storage/storage_base.php [new file with mode: 0644]
library/spam/b8/storage/storage_base.php.ORIG [new file with mode: 0644]
library/spam/b8/storage/storage_dba.php [new file with mode: 0644]
library/spam/b8/storage/storage_frndc.php [new file with mode: 0644]
library/spam/b8/storage/storage_mysql.php [new file with mode: 0644]
library/spam/doc/COPYING [new file with mode: 0644]
library/spam/doc/ChangeLog [new file with mode: 0644]
library/spam/doc/readme.htm [new file with mode: 0644]
library/spam/doc/readme.rst [new file with mode: 0644]
library/spam/example/index.php [new file with mode: 0644]
library/spam/install/setup_berkeleydb.php [new file with mode: 0644]
library/spam/install/setup_mysql.sql [new file with mode: 0644]
library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
mod/admin.php
mod/community.php
mod/contacts.php
mod/dfrn_confirm.php
mod/dfrn_poll.php
mod/dfrn_request.php
mod/directory.php
mod/display.php
mod/editpost.php
mod/events.php
mod/install.php
mod/item.php
mod/network.php
mod/newmember.php
mod/notifications.php
mod/oembed.php
mod/oexchange.php
mod/parse_url.php
mod/profile.php
mod/redir.php
mod/register.php
mod/regmod.php
mod/settings.php
mod/smilies.php [new file with mode: 0755]
mod/wall_attach.php
mod/wall_upload.php
update.php
util/fpostit/README [new file with mode: 0644]
util/fpostit/fpostit.js [new file with mode: 0644]
util/fpostit/fpostit.php [new file with mode: 0644]
util/fpostit/friendika-32.png [new file with mode: 0644]
util/messages.po
view/comment_item.tpl
view/contacts-top.tpl
view/de/messages.po [changed mode: 0755->0644]
view/de/strings.php
view/event.tpl [new file with mode: 0644]
view/event_form.tpl
view/event_head.tpl
view/events-js.tpl [new file with mode: 0644]
view/events.tpl [new file with mode: 0644]
view/head.tpl
view/install_checks.tpl
view/intros.tpl
view/jot-header.tpl
view/jot.tpl
view/mail_conv.tpl
view/nav.tpl
view/profile_advanced.tpl
view/search_item.tpl
view/settings.tpl
view/theme/darkbubble/experimental [deleted file]
view/theme/dispy/jot-header.tpl
view/theme/dispy/jot.tpl
view/theme/dispy/style.css
view/theme/dispy/wall_item.tpl
view/theme/dispy/wallwall_item.tpl
view/theme/duepuntozero/comment_item.tpl [new file with mode: 0755]
view/theme/duepuntozero/jot.tpl
view/theme/duepuntozero/style.css
view/theme/duepuntozero/wall_item.tpl
view/theme/duepuntozero/wallwall_item.tpl
view/theme/loozah/comment_item.tpl [new file with mode: 0755]
view/theme/loozah/jot.tpl
view/theme/loozah/wall_item.tpl
view/theme/loozah/wallwall_item.tpl
view/theme/quattro-green/colors.less [new file with mode: 0755]
view/theme/quattro-green/contact_template.tpl [new file with mode: 0755]
view/theme/quattro-green/experimental [new file with mode: 0755]
view/theme/quattro-green/style.css [new file with mode: 0755]
view/theme/quattro-green/style.less [new file with mode: 0755]
view/theme/quattro/icons.less
view/theme/quattro/quattro.less
view/theme/quattro/style.css
view/theme/testbubble/comment_item.tpl
view/theme/testbubble/jot-header.tpl
view/theme/testbubble/jot.tpl
view/theme/testbubble/style.css
view/theme/testbubble/wall_item.tpl
view/theme/testbubble/wallwall_item.tpl
view/theme/vier/style.css

index 70027dc4c69ef7bad66d69b56f1d8a1974269c97..fdd54b765fa4b4e2792dc1a52a530fff3a638b11 100755 (executable)
@@ -107,6 +107,11 @@ one shown, substituting for your unique paths and settings:
 You can generally find the location of PHP by executing "which php". If you 
 have troubles with this section please contact your hosting provider for 
 assistance. Friendika will not work correctly if you cannot perform this step.
+
+You should also be sure that $a->config['php_path'] is set correctly, it should
+look like (changing it to the correct PHP location)
+
+$a->config['php_path'] = '/usr/local/php53/bin/php'
   
 Alternative: You may be able to use the 'poormancron' plugin to perform this
 step if you are using a recent Friendika release. 'poormancron' may result in
index c2c99a55ec953391661cb1ac499817748dc3f4f8..0c79b6e5499fa33956ee591061ed21bab3937bb5 100755 (executable)
--- a/boot.php
+++ b/boot.php
@@ -9,9 +9,9 @@ require_once('include/nav.php');
 require_once('include/cache.php');
 
 define ( 'FRIENDICA_PLATFORM',     'Friendica');
-define ( 'FRIENDICA_VERSION',      '2.3.1237' );
+define ( 'FRIENDICA_VERSION',      '2.3.1255' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.22'    );
-define ( 'DB_UPDATE_VERSION',      1118      );
+define ( 'DB_UPDATE_VERSION',      1122      );
 
 define ( 'EOL',                    "<br />\r\n"     );
 define ( 'ATOM_TIME',              'Y-m-d\TH:i:s\Z' );
@@ -101,10 +101,12 @@ define ( 'NETWORK_OSTATUS',          'stat');    // status.net, identi.ca, GNU-s
 define ( 'NETWORK_FEED',             'feed');    // RSS/Atom feeds with no known "post/notify" protocol
 define ( 'NETWORK_DIASPORA',         'dspr');    // Diaspora
 define ( 'NETWORK_MAIL',             'mail');    // IMAP/POP
+define ( 'NETWORK_MAIL2',            'mai2');    // extended IMAP/POP
 define ( 'NETWORK_FACEBOOK',         'face');    // Facebook API     
 define ( 'NETWORK_LINKEDIN',         'lnkd');    // LinkedIn
 define ( 'NETWORK_XMPP',             'xmpp');    // XMPP     
 define ( 'NETWORK_MYSPACE',          'mysp');    // MySpace
+define ( 'NETWORK_GPLUS',            'goog');    // Google+
 
 /**
  * Maximum number of "people who like (or don't like) this"  that we will list by name
@@ -123,14 +125,15 @@ define ( 'ZCURL_TIMEOUT' , (-1));
  * email notification options
  */
 
-define ( 'NOTIFY_INTRO',   0x0001 );
-define ( 'NOTIFY_CONFIRM', 0x0002 );
-define ( 'NOTIFY_WALL',    0x0004 );
-define ( 'NOTIFY_COMMENT', 0x0008 );
-define ( 'NOTIFY_MAIL',    0x0010 );
-define ( 'NOTIFY_SUGGEST', 0x0020 );
-define ( 'NOTIFY_PROFILE', 0x0040 );
-
+define ( 'NOTIFY_INTRO',    0x0001 );
+define ( 'NOTIFY_CONFIRM',  0x0002 );
+define ( 'NOTIFY_WALL',     0x0004 );
+define ( 'NOTIFY_COMMENT',  0x0008 );
+define ( 'NOTIFY_MAIL',     0x0010 );
+define ( 'NOTIFY_SUGGEST',  0x0020 );
+define ( 'NOTIFY_PROFILE',  0x0040 );
+define ( 'NOTIFY_TAGSELF',  0x0080 );
+define ( 'NOTIFY_TAGSHARE', 0x0100 );
 
 /**
  * various namespaces we may need to parse
@@ -816,7 +819,7 @@ function profile_load(&$a, $nickname, $profile = 0) {
        } 
 
        $r = null;
-
+                          
        if($profile) {
                $profile_int = intval($profile);
                $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile` 
@@ -826,7 +829,7 @@ function profile_load(&$a, $nickname, $profile = 0) {
                        intval($profile_int)
                );
        }
-       if(! count($r)) {       
+       if((! $r) && (!  count($r))) {  
                $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile` 
                        left join `contact` on `contact`.`uid` = `profile`.`uid` LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
                        WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` = 1 and `contact`.`self` = 1 LIMIT 1",
@@ -839,6 +842,16 @@ function profile_load(&$a, $nickname, $profile = 0) {
                $a->error = 404;
                return;
        }
+       
+       // fetch user tags if this isn't the default profile
+
+       if(! $r[0]['is-default']) {
+               $x = q("select `pub_keywords` from `profile` where uid = %d and `is-default` = 1 limit 1",
+                       intval($profile_uid)
+               );
+               if($x && count($x))
+                       $r[0]['pub_keywords'] = $x[0]['pub_keywords'];
+       }
 
        $a->profile = $r[0];
 
index 9a2e5c8ddd3da63c00d4498bacd7a7aac115bb52..32d7cf40b42d1149649f311a5334198d6f62e124 100755 (executable)
@@ -96,6 +96,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
   `pending` tinyint(1) NOT NULL DEFAULT '1',
   `rating` tinyint(1) NOT NULL DEFAULT '0',
   `reason` text NOT NULL,
+  `closeness` tinyint(2) NOT NULL DEFAULT '99',
   `info` mediumtext NOT NULL,
   `profile-id` int(11) NOT NULL DEFAULT '0',
   `bdyear` CHAR( 4 ) NOT NULL COMMENT 'birthday notify flag',
@@ -116,7 +117,8 @@ CREATE TABLE IF NOT EXISTS `contact` (
   KEY `blocked` (`blocked`),
   KEY `readonly` (`readonly`),
   KEY `hidden` (`hidden`),
-  KEY `pending` (`pending`)  
+  KEY `pending` (`pending`),
+  KEY `closeness` (`closeness`)  
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
 -- --------------------------------------------------------
@@ -224,6 +226,7 @@ CREATE TABLE IF NOT EXISTS `item` (
   `pubmail` tinyint(1) NOT NULL DEFAULT '0',
   `moderated` tinyint(1) NOT NULL DEFAULT '0',
   `visible` tinyint(1) NOT NULL DEFAULT '0',
+  `spam` tinyint(1) NOT NULL DEFAULT '0',
   `starred` tinyint(1) NOT NULL DEFAULT '0',
   `bookmark` tinyint(1) NOT NULL DEFAULT '0',
   `unseen` tinyint(1) NOT NULL DEFAULT '1',
@@ -245,6 +248,7 @@ CREATE TABLE IF NOT EXISTS `item` (
   KEY `received` (`received`),
   KEY `moderated` (`moderated`),
   KEY `visible` (`visible`),
+  KEY `spam` (`spam`),
   KEY `starred` (`starred`),
   KEY `bookmark` (`bookmark`),
   KEY `deleted` (`deleted`),
@@ -777,3 +781,31 @@ INDEX ( `uid` ),
 INDEX ( `mid` )
 ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
+CREATE TABLE IF NOT EXISTS `poll_result` (
+`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`poll_id` INT NOT NULL ,
+`choice` INT NOT NULL ,
+INDEX ( `poll_id` ),
+INDEX ( `choice` )
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS `poll` (
+`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`uid` INT NOT NULL ,
+`q0` MEDIUMTEXT NOT NULL ,
+`q1` MEDIUMTEXT NOT NULL ,
+`q2` MEDIUMTEXT NOT NULL ,
+`q3` MEDIUMTEXT NOT NULL ,
+`q4` MEDIUMTEXT NOT NULL ,
+`q5` MEDIUMTEXT NOT NULL ,
+`q6` MEDIUMTEXT NOT NULL ,
+`q7` MEDIUMTEXT NOT NULL ,
+`q8` MEDIUMTEXT NOT NULL ,
+`q9` MEDIUMTEXT NOT NULL ,
+INDEX ( `uid` )
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
+
+
+
+
index ff2fb9fb3e6609dbff0bccd966eb6dec31146d7a..d0e6776a4b2b80e2a8ed4952c85438bf654bac0c 100755 (executable)
@@ -24,7 +24,7 @@ The "Automatic Friend Account" is typically used for personal profile pages wher
 
 We recommend that you create group pages with the same email address and password as your normal account. If you do this, you will find a new "Manage" tab on the menu bar which lets you toggle identities easily and manage your pages. You are not required to do this, but the alternative is to logout and log back into the other account to manage alternate pages - and this could get cumbersome if you manage several different pages/identities. 
 
-You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](/delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.  
+You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
 
 
 **Posting to Community Pages**
index 70a8726c76e9fb36ee727a4ce9a11d68f03769d8..29dff3187b33f3d7ba49f8434b096296c9042d98 100755 (executable)
@@ -1,11 +1,20 @@
 **Friendica Addon/Plugin development**
 
-This is an early specification and hook details may be subject to change.
-
 Please see the sample addon 'randplace' for a working example of using some of these features. The facebook addon provides an example of integrating both "addon" and "module" functionality. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path). 
 
 
-Plugin names cannot contain spaces and are used as filenames. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove". 
+Plugin names cannot contain spaces or other punctuation and are used as filenames and function names. You may supply a "friendly" name within the comment block. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove". 
+
+Plugins should contain a comment block with the four following parameters: 
+
+       /*
+       * Name: My Great Plugin 
+       * Description: This is what my plugin does. It's really cool
+       * Version: 1.0
+       * Author: John Q. Public <john@myfriendicasite.com>
+       */
+
+
 
 
 Register your plugin hooks during installation.
@@ -160,7 +169,8 @@ Your module functions will often contain the function plugin_name_content(&$a),
     $b is (string) HTML of content div
 
 
-A complete list of all hook callbacks with file locations (generated 09-Nov-2011): Please see the source for details of any hooks not documented above.
+A complete list of all hook callbacks with file locations (generated 14-Feb-2012): Please see the source for details of any hooks not documented above.
+
 
 boot.php:      call_hooks('login_hook',$o);
 
@@ -170,7 +180,7 @@ boot.php:   call_hooks('profile_sidebar', $arr);
 
 boot.php:      call_hooks("proc_run", $arr);
 
-include/contact_selectors.php: call_hooks('network_to_name', $s);
+include/contact_selectors.php: call_hooks('network_to_name', $nets);
 
 include/api.php:                               call_hooks('logged_in', $a->user);
 
@@ -194,8 +204,6 @@ include/nav.php:    call_hooks('page_header', $a->page['nav']);
 
 include/auth.php:              call_hooks('authenticate', $addon_auth);
 
-include/auth.php:              call_hooks('logged_in', $a->user);
-
 include/bbcode.php:    call_hooks('bbcode',$Text);
 
 include/oauth.php:             call_hooks('logged_in', $a->user);              
@@ -236,19 +244,29 @@ include/bb2diaspora.php:  call_hooks('bb2diaspora',$Text);
 
 include/cronhooks.php: call_hooks('cron', $d);
 
+include/security.php:          call_hooks('logged_in', $a->user);
+
 include/html2bbcode.php:       call_hooks('html2bbcode', $text);
 
+include/Contact.php:   call_hooks('remove_user',$r[0]);
+
 include/Contact.php:   call_hooks('contact_photo_menu', $args);
 
+include/conversation.php:      call_hooks('conversation_start',$cb);
+
+include/conversation.php:                              call_hooks('render_location',$locate);
+
 include/conversation.php:                              call_hooks('display_item', $arr);
 
+include/conversation.php:                              call_hooks('render_location',$locate);
+
 include/conversation.php:                              call_hooks('display_item', $arr);
 
 include/conversation.php:      call_hooks('item_photo_menu', $args);
 
-include/conversation.php:              call_hooks('jot_tool', $jotplugins);
+include/conversation.php:      call_hooks('jot_tool', $jotplugins);
 
-include/conversation.php:              call_hooks('jot_networks', $jotnets);
+include/conversation.php:      call_hooks('jot_networks', $jotnets);
 
 include/plugin.php:if(! function_exists('call_hooks')) {
 
@@ -282,6 +300,8 @@ mod/editpost.php:   call_hooks('jot_networks', $jotnets);
 
 mod/parse_url.php:     call_hooks('parse_link', $arr);
 
+mod/home.php:  call_hooks('home_init',$ret);
+
 mod/home.php:  call_hooks("home_content",$o);
 
 mod/contacts.php:      call_hooks('contact_edit_post', $_POST);
@@ -306,7 +326,7 @@ mod/like.php:       call_hooks('post_local_end', $arr);
 
 mod/xrd.php:   call_hooks('personal_xrd', $arr);
 
-mod/item.php:  call_hooks('post_local_start', $_POST);
+mod/item.php:  call_hooks('post_local_start', $_REQUEST);
 
 mod/item.php:  call_hooks('post_local',$datarray);
 
diff --git a/doc/developer b/doc/developer
deleted file mode 100755 (executable)
index dd8b316..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-Friendica Developer Guide
-
-Here is how you can join us.
-
-First, get yourself a working git package on the system where you will be
-doing development.
-
-Create your own github account.
-
-Follow the instructions provided here: [[http://help.github.com/fork-a-repo/]]
-to create and use your own tracking fork on github
-
-Then go to your github page and create a "Pull request" when you are ready
-to notify us to merge your work.
-
-**Important**
-
-Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.   
\ No newline at end of file
diff --git a/images/beer_mug.gif b/images/beer_mug.gif
new file mode 100644 (file)
index 0000000..a047d19
Binary files /dev/null and b/images/beer_mug.gif differ
diff --git a/images/coffee.gif b/images/coffee.gif
new file mode 100644 (file)
index 0000000..7e20371
Binary files /dev/null and b/images/coffee.gif differ
diff --git a/images/icons/10/audio.png b/images/icons/10/audio.png
new file mode 100644 (file)
index 0000000..cfc2fdc
Binary files /dev/null and b/images/icons/10/audio.png differ
diff --git a/images/icons/10/image.png b/images/icons/10/image.png
new file mode 100644 (file)
index 0000000..dce827b
Binary files /dev/null and b/images/icons/10/image.png differ
diff --git a/images/icons/10/text.png b/images/icons/10/text.png
new file mode 100644 (file)
index 0000000..a9995ea
Binary files /dev/null and b/images/icons/10/text.png differ
diff --git a/images/icons/10/video.png b/images/icons/10/video.png
new file mode 100644 (file)
index 0000000..4a3dacf
Binary files /dev/null and b/images/icons/10/video.png differ
diff --git a/images/icons/10/zip.png b/images/icons/10/zip.png
new file mode 100644 (file)
index 0000000..b90ab10
Binary files /dev/null and b/images/icons/10/zip.png differ
diff --git a/images/icons/16/audio.png b/images/icons/16/audio.png
new file mode 100644 (file)
index 0000000..f2b9998
Binary files /dev/null and b/images/icons/16/audio.png differ
diff --git a/images/icons/16/image.png b/images/icons/16/image.png
new file mode 100644 (file)
index 0000000..c52b973
Binary files /dev/null and b/images/icons/16/image.png differ
diff --git a/images/icons/16/text.png b/images/icons/16/text.png
new file mode 100644 (file)
index 0000000..1f3433a
Binary files /dev/null and b/images/icons/16/text.png differ
diff --git a/images/icons/16/video.png b/images/icons/16/video.png
new file mode 100644 (file)
index 0000000..bd1a7bb
Binary files /dev/null and b/images/icons/16/video.png differ
diff --git a/images/icons/16/zip.png b/images/icons/16/zip.png
new file mode 100644 (file)
index 0000000..f0fbc0d
Binary files /dev/null and b/images/icons/16/zip.png differ
diff --git a/images/icons/22/audio.png b/images/icons/22/audio.png
new file mode 100644 (file)
index 0000000..dbf4675
Binary files /dev/null and b/images/icons/22/audio.png differ
diff --git a/images/icons/22/image.png b/images/icons/22/image.png
new file mode 100644 (file)
index 0000000..f00e3a2
Binary files /dev/null and b/images/icons/22/image.png differ
diff --git a/images/icons/22/text.png b/images/icons/22/text.png
new file mode 100644 (file)
index 0000000..d35e45f
Binary files /dev/null and b/images/icons/22/text.png differ
diff --git a/images/icons/22/video.png b/images/icons/22/video.png
new file mode 100644 (file)
index 0000000..eca481f
Binary files /dev/null and b/images/icons/22/video.png differ
diff --git a/images/icons/22/zip.png b/images/icons/22/zip.png
new file mode 100644 (file)
index 0000000..4d4ecbe
Binary files /dev/null and b/images/icons/22/zip.png differ
diff --git a/images/icons/48/audio.png b/images/icons/48/audio.png
new file mode 100644 (file)
index 0000000..23f49b5
Binary files /dev/null and b/images/icons/48/audio.png differ
diff --git a/images/icons/48/image.png b/images/icons/48/image.png
new file mode 100644 (file)
index 0000000..cc0c868
Binary files /dev/null and b/images/icons/48/image.png differ
diff --git a/images/icons/48/text.png b/images/icons/48/text.png
new file mode 100644 (file)
index 0000000..5023945
Binary files /dev/null and b/images/icons/48/text.png differ
diff --git a/images/icons/48/video.png b/images/icons/48/video.png
new file mode 100644 (file)
index 0000000..dde02f6
Binary files /dev/null and b/images/icons/48/video.png differ
diff --git a/images/icons/48/zip.png b/images/icons/48/zip.png
new file mode 100644 (file)
index 0000000..08a9330
Binary files /dev/null and b/images/icons/48/zip.png differ
index 00c4fa4c20bef3829021f1b1a52ca491cd508f07..bfb5927df1a596452d34e6563a2a1890cb9f9486 100755 (executable)
@@ -2,7 +2,8 @@
 IMAGES=add.png edit.png        gear.png info.png menu.png \
                notify_off.png star.png  delete.png feed.png group.png \
                lock.png notice.png notify_on.png user.png link.png \
-               play.png plugin.png unlock.png
+               play.png plugin.png unlock.png zip.png audio.png video.png \
+               image.png text.png
 
 DESTS=10/ 16/ 22/ 48/ \
                $(addprefix 10/, $(IMAGES)) \
diff --git a/images/icons/audio.png b/images/icons/audio.png
new file mode 100644 (file)
index 0000000..1e15612
Binary files /dev/null and b/images/icons/audio.png differ
diff --git a/images/icons/image.png b/images/icons/image.png
new file mode 100644 (file)
index 0000000..cec105b
Binary files /dev/null and b/images/icons/image.png differ
diff --git a/images/icons/text.png b/images/icons/text.png
new file mode 100644 (file)
index 0000000..c20190c
Binary files /dev/null and b/images/icons/text.png differ
diff --git a/images/icons/video.png b/images/icons/video.png
new file mode 100644 (file)
index 0000000..467a212
Binary files /dev/null and b/images/icons/video.png differ
diff --git a/images/icons/zip.png b/images/icons/zip.png
new file mode 100644 (file)
index 0000000..df961dd
Binary files /dev/null and b/images/icons/zip.png differ
diff --git a/images/smiley-bangheaddesk.gif b/images/smiley-bangheaddesk.gif
new file mode 100644 (file)
index 0000000..91ccb8b
Binary files /dev/null and b/images/smiley-bangheaddesk.gif differ
diff --git a/images/smiley-facepalm.gif b/images/smiley-facepalm.gif
new file mode 100644 (file)
index 0000000..7243703
Binary files /dev/null and b/images/smiley-facepalm.gif differ
index 4001d2af1351bd7f92714ad3263357365b3eee46..6d611cec0418534ce50f80bae09c0c3d7189587f 100755 (executable)
@@ -38,6 +38,7 @@ function z_mime_content_type($filename) {
 
                // audio/video
                'mp3' => 'audio/mpeg',
+               'wav' => 'audio/wav',
                'qt' => 'video/quicktime',
                'mov' => 'video/quicktime',
                'ogg' => 'application/ogg',
@@ -68,12 +69,13 @@ function z_mime_content_type($filename) {
                        return $mime_types[$ext];
                }
        }
-       elseif (function_exists('finfo_open')) {
-               $finfo = finfo_open(FILEINFO_MIME);
-               $mimetype = finfo_file($finfo, $filename);
-               finfo_close($finfo);
-               return $mimetype;
-       }
+// can't use this because we're just passing a name, e.g. not a file that can be opened
+//     elseif (function_exists('finfo_open')) {
+//             $finfo = @finfo_open(FILEINFO_MIME);
+//             $mimetype = @finfo_file($finfo, $filename);
+//             @finfo_close($finfo);
+//             return $mimetype;
+//     }
        else {
                return 'application/octet-stream';
        }
index fd1c638473526d29f87ac5ed34174ee494d19932..fc52684e64b183d8a20dd746317e0d9ef49032f9 100755 (executable)
@@ -165,7 +165,7 @@ else {
                }
 
                if((! $record) || (! count($record))) {
-                       logger('authenticate: failed login attempt: ' . trim($_POST['username'])); 
+                       logger('authenticate: failed login attempt: ' . notags(trim($_POST['username']))); 
                        notice( t('Login failed.') . EOL );
                        goaway(z_root());
                }
index d367b6716678ede92306685a5dba102d27c8ee2d..c26b0c33419882c9e6efb0fc2f54247098d9018f 100755 (executable)
@@ -14,9 +14,17 @@ require_once('include/html2bbcode.php');
 function diaspora2bb($s) {
 
        $s = html_entity_decode($s,ENT_COMPAT,'UTF-8');
+    $s = str_replace("\r","\n",$s);
 
        $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s);
+
+    $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
+
        $s = Markdown($s);
+
+    $s = str_replace('&#35;','#',$s);
+    $s = str_replace("\n",'<br />',$s);
+
        $s = html2bbcode($s);
 //     $s = str_replace('&#42;','*',$s);
 
@@ -30,11 +38,6 @@ function diaspora2bb($s) {
        $s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
        $s = scale_diaspora_images($s);
 
-       // we seem to get a lot of text smushed together with links from Diaspora.
-
-       $s = preg_replace('/[^ ]\[url\=(.*?)\]/',' [url=$1]' ,$s);
-       $s = preg_replace('/\[\/url\][^ ]/','[/url] ',$s);
-
        return $s;
 }
 
@@ -209,7 +212,7 @@ function bb2diaspora($Text,$preserve_nl = false) {
        $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", 'http://vimeo.com/$1',$Text);
 
 
-
+       $Text = str_replace('[nosmile]','',$Text);
 
        // oembed tag
        //      $Text = oembed_bbcode2html($Text);
index 6b733c8f43150689e4c68c6034ae89da441e6c1f..cae867eb8cd8588b35f164a3489c31748c1734f3 100755 (executable)
@@ -11,7 +11,7 @@ function stripcode_br_cb($s) {
 
 function tryoembed($match){
        $url = ((count($match)==2)?$match[1]:$match[2]);
-       logger("tryoembed: $url");
+//     logger("tryoembed: $url");
        
        $o = oembed_fetch_url($url);
 
@@ -24,13 +24,40 @@ function tryoembed($match){
        
 }
 
+// [noparse][i]italic[/i][/noparse] turns into 
+// [noparse][ i ]italic[ /i ][/noparse], 
+// to hide them from parser.
 
+function bb_spacefy($st) {
+  $whole_match = $st[0];
+  $captured = $st[1];
+  $spacefied = preg_replace("/\[(.*?)\]/", "[ $1 ]", $captured);
+  $new_str = str_replace($captured, $spacefied, $whole_match);
+  return $new_str;
+}
+
+// The previously spacefied [noparse][ i ]italic[ /i ][/noparse], 
+// now turns back and the [noparse] tags are trimed
+// returning [i]italic[/i]
+
+function bb_unspacefy_and_trim($st) {
+  $whole_match = $st[0];
+  $captured = $st[1];
+  $unspacefied = preg_replace("/\[ (.*?)\ ]/", "[$1]", $captured);
+  return $unspacefied;
+}
 
        // BBcode 2 HTML was written by WAY2WEB.net
        // extended to work with Mistpark/Friendica - Mike Macgirvin
 
 function bbcode($Text,$preserve_nl = false) {
 
+       // Hide all [noparse] contained bbtags spacefying them
+
+       $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
+       $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text);
+       $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
+
 
        // Extract a single private image which uses data url's since preg has issues with 
        // large data sizes. Stash it away while we do bbcode conversion, and then put it back 
@@ -111,25 +138,34 @@ function bbcode($Text,$preserve_nl = false) {
        $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","<span style=\"color: $1;\">$2</span>",$Text);
 
        // Check for sized text
+        // [size=50] --> font-size: 50px (with the unit).
+       $Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1px;\">$2</span>",$Text);
        $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1;\">$2</span>",$Text);
 
-       // Check for list text
-
-       if(stristr($Text,'[/list]'))
-               $Text = str_replace("[*]", "<li>", $Text);
+       // Check for centered text
+       $Text = preg_replace("(\[center\](.*?)\[\/center\])ism","<div style=\"text-align:center;\">$1</div>",$Text);
 
-       if(stristr($Text,'[/list]'))
-               $Text = str_replace("[*]", "<li>", $Text);
+       // Check for list text
+       $Text = str_replace("[*]", "<li>", $Text);
+       $Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>' ,$Text);
 
        $Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
+       $Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' 
+,$Text);
        $Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text);
        $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
-       $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/sm",'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>' ,$Text);
-       $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/sm", '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>' ,$Text);
-       $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/sm", '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>' ,$Text);
-       $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/sm", '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>' ,$Text);
-       $Text = preg_replace("/\[li\](.*?)\[\/li\]/sm", '<li>$1</li>' ,$Text);
-
+       $Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' 
+,$Text);
+       $Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'<ul class="listlowerroman" style="list-style-type: 
+lower-roman;">$2</ul>' ,$Text);
+       $Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '<ul class="listupperroman" style="list-style-type: 
+upper-roman;">$2</ul>' ,$Text);
+       $Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '<ul class="listloweralpha" style="list-style-type: 
+lower-alpha;">$2</ul>' ,$Text);
+       $Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '<ul class="listupperalpha" style="list-style-type: 
+upper-alpha;">$2</ul>' ,$Text);
+
+       $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
        $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
        $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '<tr>$1</tr>' ,$Text);
        $Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '<table>$1</table>' ,$Text);
@@ -137,7 +173,11 @@ function bbcode($Text,$preserve_nl = false) {
        $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '<table border="1" >$1</table>' ,$Text);
        $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '<table border="0" >$1</table>' ,$Text);
 
-       
+       $Text = str_replace('[hr]','<hr />', $Text);
+
+       // This is actually executed in prepare_body()
+
+       $Text = str_replace('[nosmile]','',$Text);
 
        // Check for font change text
        $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
@@ -157,7 +197,15 @@ function bbcode($Text,$preserve_nl = false) {
        $QuoteLayout = '<blockquote>$1</blockquote>';                     
        // Check for [quote] text
        $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text);
-         
+
+       // Check for [quote=Author] text
+
+       $t_wrote = t('$1 wrote:');
+
+       $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", 
+                             "<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>", 
+                             $Text);         
+
        // [img=widthxheight]image source[/img]
        $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
 
@@ -219,6 +267,13 @@ function bbcode($Text,$preserve_nl = false) {
                $Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/ism",'',$Text);
        }
 
+       // Unhide all [noparse] contained bbtags unspacefying them 
+       // and triming the [noparse] tag.
+
+       $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim',$Text);
+       $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim',$Text);
+       $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim',$Text);
+
        // fix any escaped ampersands that may have been converted into links
        $Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text);
        if(strlen($saved_image))
index 20c7b2a511bc12256f07132af40f49e6ff4b37f9..3d13a1179882d6c269079c981e3adc62d47c6a88 100755 (executable)
@@ -4,6 +4,28 @@
  * Render actions localized
  */
 function localize_item(&$item){
+
+       $Text = $item['body'];
+       $saved_image = '';
+       $img_start = strpos($Text,'[img]data:');
+       $img_end = strpos($Text,'[/img]');
+
+       if($img_start !== false && $img_end !== false && $img_end > $img_start) {
+               $start_fragment = substr($Text,0,$img_start);
+               $img_start += strlen('[img]');
+               $saved_image = substr($Text,$img_start,$img_end - $img_start);
+               $end_fragment = substr($Text,$img_end + strlen('[/img]'));              
+               $Text = $start_fragment . '[!#saved_image#!]' . $end_fragment;
+               $search = '/\[url\=(.*?)\]\[!#saved_image#!\]\[\/url\]' . '/is';
+               $replace = '[url=' . z_path() . '/redir/' . $item['contact-id'] 
+                       . '?f=1&url=' . '$1' . '][!#saved_image#!][/url]' ;
+
+               $Text = preg_replace($search,$replace,$Text);
+
+               if(strlen($saved_image))
+                       $item['body'] = str_replace('[!#saved_image#!]', '[img]' . $saved_image . '[/img]',$Text);
+       }
+
        $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
        if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){
 
@@ -262,15 +284,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                else
                                        $profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
 
-                               $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
-                               $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
-                               if($coord) {
-                                       if($location)
-                                               $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
-                                       else
-                                               $location = '<span class="smalltext">' . $coord . '</span>';
-                               }
+                               $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
+                               call_hooks('render_location',$locate);
 
+                               $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
 
                                localize_item($item);
                                if($mode === 'network-new')
@@ -494,7 +511,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                }
 
                                $likebuttons = '';
-                               $shareable = ((($profile_owner == local_user()) && ($mode != 'display') && (! $item['private'])) ? true : false);
+                               $shareable = ((($profile_owner == local_user()) &&  (! $item['private'])) ? true : false); //($mode != 'display') &&
 
                                if($page_writeable) {
                                        if($toplevelpost) {
@@ -505,6 +522,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                                if ($shareable) $likebuttons['share'] = array( t('Share this'), t('share'));
                                        }
 
+
+                                       $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null);
+                                       $qcomment = (($qc) ? explode("\n",$qc) : null);
+
                                        if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) {
                                                $comment = replace_macros($cmnt_tpl,array(
                                                        '$return_path' => '', 
@@ -512,6 +533,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                                        '$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'),
                                                        '$id' => $item['item_id'],
                                                        '$parent' => $item['parent'],
+                                                       '$qcomment' => $qcomment,
                                                        '$profile_uid' =>  $profile_owner,
                                                        '$mylink' => $a->contact['url'],
                                                        '$mytitle' => t('This is you'),
@@ -594,16 +616,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                $like    = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
                                $dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');
 
-                               $location = (($item['location']) ? '<a target="map" title="' . $item['location'] 
-                                       . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
-                               $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] 
-                                       . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
-                               if($coord) {
-                                       if($location)
-                                               $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
-                                       else
-                                               $location = '<span class="smalltext">' . $coord . '</span>';
-                               }
+                               $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
+                               call_hooks('render_location',$locate);
+
+                               $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
 
                                $indent = (($toplevelpost) ? '' : ' comment');
 
@@ -620,11 +636,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                        if ($tag!="") $tags[] = bbcode($tag);
                                }
 
-
                                // Build the HTML
 
                                $body = prepare_body($item,true);
-                               
 
                                $tmp_item = replace_macros($template,array(
                                        '$type' => implode("",array_slice(split("/",$item['verb']),-1)),
@@ -832,104 +846,114 @@ function format_like($cnt,$arr,$type,$id) {
 }}
 
 
-function status_editor($a,$x, $notes_cid = 0) {
+function status_editor($a,$x, $notes_cid = 0, $popup=false) {
 
        $o = '';
                
        $geotag = (($x['allow_location']) ? get_markup_template('jot_geotag.tpl') : '');
 
-               $tpl = get_markup_template('jot-header.tpl');
-       
-               $a->page['htmlhead'] .= replace_macros($tpl, array(
-                       '$newpost' => 'true',
-                       '$baseurl' => $a->get_baseurl(),
-                       '$geotag' => $geotag,
-                       '$nickname' => $x['nickname'],
-                       '$ispublic' => t('Visible to <strong>everybody</strong>'),
-                       '$linkurl' => t('Please enter a link URL:'),
-                       '$vidurl' => t("Please enter a video link/URL:"),
-                       '$audurl' => t("Please enter an audio link/URL:"),
-                       '$term' => t('Tag term:'),
-                       '$whereareu' => t('Where are you right now?'),
-                       '$title' => t('Enter a title for this item') 
-               ));
-
-
-               $tpl = get_markup_template("jot.tpl");
-               
-               $jotplugins = '';
-               $jotnets = '';
+       $plaintext = false;
+       if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+               $plaintext = true;
 
-               $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
+       $tpl = get_markup_template('jot-header.tpl');
+       
+       $a->page['htmlhead'] .= replace_macros($tpl, array(
+               '$newpost' => 'true',
+               '$baseurl' => $a->get_baseurl(),
+               '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+               '$geotag' => $geotag,
+               '$nickname' => $x['nickname'],
+               '$ispublic' => t('Visible to <strong>everybody</strong>'),
+               '$linkurl' => t('Please enter a link URL:'),
+               '$vidurl' => t("Please enter a video link/URL:"),
+               '$audurl' => t("Please enter an audio link/URL:"),
+               '$term' => t('Tag term:'),
+               '$whereareu' => t('Where are you right now?'),
+               '$title' => t('Enter a title for this item') 
+       ));
 
-               $mail_enabled = false;
-               $pubmail_enabled = false;
 
-               if(($x['is_owner']) && (! $mail_disabled)) {
-                       $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
-                               intval(local_user())
-                       );
-                       if(count($r)) {
-                               $mail_enabled = true;
-                               if(intval($r[0]['pubmail']))
-                                       $pubmail_enabled = true;
-                       }
+       $tpl = get_markup_template("jot.tpl");
+               
+       $jotplugins = '';
+       $jotnets = '';
+
+       $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
+
+       $mail_enabled = false;
+       $pubmail_enabled = false;
+
+       if(($x['is_owner']) && (! $mail_disabled)) {
+               $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
+                       intval(local_user())
+               );
+               if(count($r)) {
+                       $mail_enabled = true;
+                       if(intval($r[0]['pubmail']))
+                               $pubmail_enabled = true;
                }
+       }
 
-               if($mail_enabled) {
-              $selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
-                       $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> '
-               . t("Post to Email") . '</div>';
-               }
+       if($mail_enabled) {
+               $selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
+               $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> ' . t("Post to Email") . '</div>';
+       }
+
+       call_hooks('jot_tool', $jotplugins);
+       call_hooks('jot_networks', $jotnets);
+
+       if($notes_cid)
+               $jotnets .= '<input type="hidden" name="contact_allow[]" value="' . $notes_cid .'" />';
+
+       $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));        
+
+       $o .= replace_macros($tpl,array(
+               '$return_path' => $a->cmd,
+               '$action' =>  $a->get_baseurl().'/item',
+               '$share' => (($x['button']) ? $x['button'] : t('Share')),
+               '$upload' => t('Upload photo'),
+               '$shortupload' => t('upload photo'),
+               '$attach' => t('Attach file'),
+               '$shortattach' => t('attach file'),
+               '$weblink' => t('Insert web link'),
+               '$shortweblink' => t('web link'),
+               '$video' => t('Insert video link'),
+               '$shortvideo' => t('video link'),
+               '$audio' => t('Insert audio link'),
+               '$shortaudio' => t('audio link'),
+               '$setloc' => t('Set your location'),
+               '$shortsetloc' => t('set location'),
+               '$noloc' => t('Clear browser location'),
+               '$shortnoloc' => t('clear location'),
+               '$title' => "",
+               '$placeholdertitle' => t('Set title'),
+               '$wait' => t('Please wait'),
+               '$permset' => t('Permission settings'),
+               '$shortpermset' => t('permissions'),
+               '$ptyp' => (($notes_cid) ? 'note' : 'wall'),
+               '$content' => '',
+               '$post_id' => '',
+               '$baseurl' => $a->get_baseurl(),
+               '$defloc' => $x['default_location'],
+               '$visitor' => $x['visitor'],
+               '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
+               '$emailcc' => t('CC: email addresses'),
+               '$public' => t('Public post'),
+               '$jotnets' => $jotnets,
+               '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+               '$lockstate' => $x['lockstate'],
+               '$acl' => $x['acl'],
+               '$bang' => $x['bang'],
+               '$profile_uid' => $x['profile_uid'],
+               '$preview' => t('Preview'),
+       ));
 
-               call_hooks('jot_tool', $jotplugins);
-               call_hooks('jot_networks', $jotnets);
-
-               if($notes_cid)
-                       $jotnets .= '<input type="hidden" name="contact_allow[]" value="' . $notes_cid .'" />';
-
-               $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));        
-
-               $o .= replace_macros($tpl,array(
-                       '$return_path' => $a->cmd,
-                       '$action' => 'item',
-                       '$share' => (($x['button']) ? $x['button'] : t('Share')),
-                       '$upload' => t('Upload photo'),
-                       '$shortupload' => t('upload photo'),
-                       '$attach' => t('Attach file'),
-                       '$shortattach' => t('attach file'),
-                       '$weblink' => t('Insert web link'),
-                       '$shortweblink' => t('web link'),
-                       '$video' => t('Insert video link'),
-                       '$shortvideo' => t('video link'),
-                       '$audio' => t('Insert audio link'),
-                       '$shortaudio' => t('audio link'),
-                       '$setloc' => t('Set your location'),
-                       '$shortsetloc' => t('set location'),
-                       '$noloc' => t('Clear browser location'),
-                       '$shortnoloc' => t('clear location'),
-                       '$title' => "",
-                       '$placeholdertitle' => t('Set title'),
-                       '$wait' => t('Please wait'),
-                       '$permset' => t('Permission settings'),
-                       '$shortpermset' => t('permissions'),
-                       '$ptyp' => (($notes_cid) ? 'note' : 'wall'),
-                       '$content' => '',
-                       '$post_id' => '',
-                       '$baseurl' => $a->get_baseurl(),
-                       '$defloc' => $x['default_location'],
-                       '$visitor' => $x['visitor'],
-                       '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
-                       '$emailcc' => t('CC: email addresses'),
-                       '$public' => t('Public post'),
-                       '$jotnets' => $jotnets,
-                       '$emtitle' => t('Example: bob@example.com, mary@example.com'),
-                       '$lockstate' => $x['lockstate'],
-                       '$acl' => $x['acl'],
-                       '$bang' => $x['bang'],
-                       '$profile_uid' => $x['profile_uid'],
-                       '$preview' => t('Preview'),
-               ));
+
+       if ($popup==true){
+               $o = '<div id="jot-popup" style="display: none;">'.$o.'</div>';
+               
+       }
 
        return $o;
 }
@@ -1004,3 +1028,17 @@ function find_thread_parent_index($arr,$x) {
                        return $k;
        return false;
 }
+
+function render_location_google($item) {
+       $location = '';
+       $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
+       $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
+       if($coord) {
+               if($location)
+                       $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
+               else
+                       $location = '<span class="smalltext">' . $coord . '</span>';
+       }
+       return $location;
+}
+
index d44e995cfaf5e7996ef532276dac15f5cfc43034..6d395fe3f25d06611d2c4f047c63bcc94f00e085 100755 (executable)
@@ -260,10 +260,11 @@ function relative_date($posted_date) {
        );
     
        foreach ($a as $secs => $str) {
-       $d = $etime / $secs;
-       if ($d >= 1) {
-               $r = round($d);
-               return $r . ' ' . (($r == 1) ? $str[0] : $str[1]) . t(' ago');
+               $d = $etime / $secs;
+               if ($d >= 1) {
+                       $r = round($d);
+                       // translators - e.g. 22 hours ago, 1 minute ago
+                       return sprintf( t('%1$d %2$s ago'),$r, (($r == 1) ? $str[0] : $str[1]));
         }
     }
 }}
index c05358868a9c037a1dad1b05f95b50fa9dbf0276..677d893889ce79a6be6ff93815d57d9a52ac09e4 100755 (executable)
@@ -21,6 +21,7 @@ function delivery_run($argv, $argc){
        require_once('include/items.php');
        require_once('include/bbcode.php');
        require_once('include/diaspora.php');
+       require_once('include/email.php');
 
        load_config('config');
        load_config('system');
@@ -311,6 +312,13 @@ function delivery_run($argv, $argc){
                                );
 
                                if(count($x)) {
+                                       if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) {
+                                               q("update contact set writable = 1 where id = %d limit 1",
+                                                       intval($x[0]['id'])
+                                               );
+                                               $x[0]['writable'] = 1;
+                                       }
+
                                        require_once('library/simplepie/simplepie.inc');
                                        logger('mod-delivery: local delivery');
                                        local_delivery($x[0],$atom);
@@ -373,7 +381,8 @@ function delivery_run($argv, $argc){
                        break;
 
                case NETWORK_MAIL :
-                                               
+               case NETWORK_MAIL2:
+                               
                        if(get_config('system','dfrn_only'))
                                break;
                        // WARNING: does not currently convert to RFC2047 header encodings, etc.
@@ -412,8 +421,15 @@ function delivery_run($argv, $argc){
                                if($r1 && $r1[0]['reply_to'])
                                        $reply_to = $r1[0]['reply_to'];
 
-                               $subject  = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ;
-                               $headers  = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n";
+                               $subject  = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ;
+
+                               // only expose our real email address to true friends
+
+                               if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked']))
+                                       $headers  = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n";
+                               else
+                                       $headers  = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n";
+
                                if($reply_to)
                                        $headers .= 'Reply-to: ' . $reply_to . "\n";
                                $headers .= 'Message-id: <' . $it['uri'] . '>' . "\n";
index cded389c38a82fcf03c0b0a1090e1ab032ed97c0..a8e02e5097b2679e74c143edd5efa36b02f59826 100755 (executable)
@@ -598,7 +598,7 @@ function diaspora_request($importer,$xml) {
                        `uri-date` = '%s', 
                        `avatar-date` = '%s', 
                        `blocked` = 0, 
-                       `pending` = 0,
+                       `pending` = 0
                        WHERE `id` = %d LIMIT 1
                        ",
                        dbesc($photos[0]),
@@ -611,7 +611,7 @@ function diaspora_request($importer,$xml) {
                        intval($contact_record['id'])
                );
 
-               $u = q("select * from user where id = %d limit 1",intval($importer['uid']));
+               $u = q("select * from user where uid = %d limit 1",intval($importer['uid']));
                if($u)
                        $ret = diaspora_share($u[0],$contact_record);
        }
@@ -673,6 +673,14 @@ function diaspora_post($importer,$xml) {
                        if(strpos($tag,'#') === 0) {
                                if(strpos($tag,'[url='))
                                        continue;
+
+                               // don't link tags that are already embedded in links
+
+                               if(preg_match('/\[(.*?)' . preg_quote($tag) . '(.*?)\]/',$body))
+                                       continue;
+                               if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag) . '(.*?)\)/',$body))
+                                       continue;
+
                                $basetag = str_replace('_',' ',substr($tag,1));
                                $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
                                if(strlen($str_tags))
@@ -830,6 +838,15 @@ function diaspora_reshare($importer,$xml) {
                        if(strpos($tag,'#') === 0) {
                                if(strpos($tag,'[url='))
                                        continue;
+
+                               // don't link tags that are already embedded in links
+
+                               if(preg_match('/\[(.*?)' . preg_quote($tag) . '(.*?)\]/',$body))
+                                       continue;
+                               if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag) . '(.*?)\)/',$body))
+                                       continue;
+
+
                                $basetag = str_replace('_',' ',substr($tag,1));
                                $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
                                if(strlen($str_tags))
@@ -1062,6 +1079,15 @@ function diaspora_comment($importer,$xml,$msg) {
                        if(strpos($tag,'#') === 0) {
                                if(strpos($tag,'[url='))
                                        continue;
+
+                               // don't link tags that are already embedded in links
+
+                               if(preg_match('/\[(.*?)' . preg_quote($tag) . '(.*?)\]/',$body))
+                                       continue;
+                               if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag) . '(.*?)\)/',$body))
+                                       continue;
+
+
                                $basetag = str_replace('_',' ',substr($tag,1));
                                $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
                                if(strlen($str_tags))
@@ -1282,6 +1308,7 @@ function diaspora_conversation($importer,$xml,$msg) {
                        'language' => $importer['language'],
                        'to_name' => $importer['username'],
                        'to_email' => $importer['email'],
+                       'uid' =>$importer['importer_uid'],
                        'item' => array('subject' => $subject, 'body' => $body),
                        'source_name' => $person['name'],
                        'source_link' => $person['url'],
index 9df9b57e5d8d2dc62b670d0e3a5db3447ea5af6a..a8e6e3de6d6fc449d30aba31da0a428935f7aab9 100755 (executable)
@@ -28,17 +28,19 @@ function notification($params) {
                $subject =      sprintf( t('New mail received at %s'),$sitename);
 
                $preamble = sprintf( t('%s sent you a new private message at %s.'),$params['source_name'],$sitename);
-
+               $epreamble = sprintf( t('%s sent you a private message.'),'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
                $sitelink = t('Please visit %s to view and/or reply to your private messages.');
                $tsitelink = sprintf( $sitelink, $siteurl . '/message' );
                $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/message">' . $sitename . '</a>');
-               $itemlink = '';
+               $itemlink = $siteurl . '/message';
        }
 
        if($params['type'] == NOTIFY_COMMENT) {
 
                $subject = sprintf( t('%s commented on an item at %s'), $params['source_name'], $sitename);
                $preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $params['source_name']); 
+               $epreamble = sprintf( t('%s commented on an item/conversation you have been following.'), '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]'); 
+
                $sitelink = t('Please visit %s to view and/or reply to the conversation.');
                $tsitelink = sprintf( $sitelink, $siteurl );
                $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
@@ -47,6 +49,27 @@ function notification($params) {
 
        if($params['type'] == NOTIFY_WALL) {
                $preamble = $subject =  sprintf( t('%s posted to your profile wall at %s') , $params['source_name'], $sitename);
+               $epreamble = sprintf( t('%s posted to your profile wall') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]'); 
+               
+               $sitelink = t('Please visit %s to view and/or reply to the conversation.');
+               $tsitelink = sprintf( $sitelink, $siteurl );
+               $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
+               $itemlink =  $params['link'];
+       }
+
+       if($params['type'] == NOTIFY_TAGSELF) {
+               $preamble = $subject =  sprintf( t('%s tagged you at %s') , $params['source_name'], $sitename);
+               $epreamble = sprintf( t('%s tagged you') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]'); 
+
+               $sitelink = t('Please visit %s to view and/or reply to the conversation.');
+               $tsitelink = sprintf( $sitelink, $siteurl );
+               $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
+               $itemlink =  $params['link'];
+       }
+
+       if($params['type'] == NOTIFY_TAGSHARE) {
+               $preamble = $subject =  sprintf( t('%s tagged your post at %s') , $params['source_name'], $sitename);
+               $epreamble = sprintf( t('%s tagged your post') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]'); 
 
                $sitelink = t('Please visit %s to view and/or reply to the conversation.');
                $tsitelink = sprintf( $sitelink, $siteurl );
@@ -57,6 +80,7 @@ function notification($params) {
        if($params['type'] == NOTIFY_INTRO) {
                $subject = sprintf( t('Introduction received at %s'), $sitename);
                $preamble = sprintf( t('You\'ve received an introduction from \'%s\' at %s'), $params['source_name'], $sitename); 
+               $epreamble = sprintf( t('You\'ve received an introduction from %s'), '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]'); 
                $body = sprintf( t('You may visit their profile at %s'),$params['source_link']);
 
                $sitelink = t('Please visit %s to approve or reject the introduction.');
@@ -68,6 +92,9 @@ function notification($params) {
        if($params['type'] == NOTIFY_SUGGEST) {
                $subject = sprintf( t('Friend suggestion received at %s'), $sitename);
                $preamble = sprintf( t('You\'ve received a friend suggestion from \'%s\' at %s'), $params['source_name'], $sitename); 
+               $epreamble = sprintf( t('You\'ve received a friend suggestion for %s from %s'),
+                       '[url=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/url]', 
+                       '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]'); 
                $body = t('Name:') . ' ' . $params['item']['name'] . "\n";
                $body .= t('Photo:') . ' ' . $params['item']['photo'] . "\n";
                $body .= sprintf( t('You may visit their profile at %s'),$params['item']['url']);
@@ -82,9 +109,27 @@ function notification($params) {
 
        }
 
-       // TODO - create notification entry in DB
+       // from here on everything is in the recipients language
+
+       push_lang($params['language']);
+
+       require_once('include/html2bbcode.php');        
 
+       // create notification entry in DB
 
+       $r = q("insert into notify (name,url,photo,date,msg,uid,link,type,verb,otype)
+               values('%s','%s','%s','%s','%s',%d,'%s',%d,'%s','%s')",
+               dbesc($params['source_name']),
+               dbesc($params['source_link']),
+               dbesc($params['source_photo']),
+               dbesc(datetime_convert()),
+               dbesc($epreamble),
+               intval($params['uid']),
+               dbesc($itemlink),
+               intval($params['type']),
+               dbesc($params['verb']),
+               dbesc($params['otype'])
+       );
 
        // send email notification if notification preferences permit
 
@@ -93,7 +138,6 @@ function notification($params) {
 
                logger('notification: sending notification email');
 
-               push_lang($params['language']);
 
                $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n"), "\n",
                        $body))),ENT_QUOTES,'UTF-8'));
@@ -108,7 +152,7 @@ function notification($params) {
                        '$preamble'     => $preamble,
                        '$sitename'     => $sitename,
                        '$siteurl'      => $siteurl,
-                       '$source_name'  => $parama['source_name'],
+                       '$source_name'  => $params['source_name'],
                        '$source_link'  => $params['source_link'],
                        '$source_photo' => $params['source_photo'],
                        '$username'     => $params['to_name'],
@@ -128,7 +172,7 @@ function notification($params) {
                        '$preamble'     => $preamble,
                        '$sitename'     => $sitename,
                        '$siteurl'      => $siteurl,
-                       '$source_name'  => $parama['source_name'],
+                       '$source_name'  => $params['source_name'],
                        '$source_link'  => $params['source_link'],
                        '$source_photo' => $params['source_photo'],
                        '$username'     => $params['to_name'],
@@ -153,8 +197,10 @@ function notification($params) {
                        'htmlVersion' => $email_html_body,
                        'textVersion' => $email_text_body
                ));
-               pop_lang();
        }
+
+       pop_lang();
+
 }
 
 require_once('include/email.php');
index 64dbe2536d4d880294f8060bd6e1b684d1af83df..5fa0ec758b3d723b45ac53b2a7b0dd0a951962ec 100755 (executable)
@@ -29,6 +29,11 @@ function expire_run($argv, $argc){
        $a->set_baseurl(get_config('system','url'));
 
 
+       // physically remove anything that has been deleted for more than two months
+
+       $r = q("delete from item where deleted = 1 and changed < UTC_TIMESTAMP() - INTERVAL 60 DAY");
+       q("optimize table item");
+
        logger('expire: start');
        
        $r = q("SELECT `uid`,`username`,`expire` FROM `user` WHERE `expire` != 0");
index 62f1f2ce5bc7b6146bcf002a96e4be08addb1884..f4837449d72ff7a61b97b7d024e954f2066ec3c7 100755 (executable)
@@ -814,6 +814,11 @@ function item_store($arr,$force_parent = false) {
 
        call_hooks('post_remote',$arr);
 
+       if(x($arr,'cancel')) {
+               logger('item_store: post cancelled by plugin.');
+               return 0;
+       }
+
        dbesc_array($arr);
 
        logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
@@ -900,7 +905,7 @@ function item_store($arr,$force_parent = false) {
                );
        }
 
-       tgroup_deliver($arr['uid'],$current_post);
+       tag_deliver($arr['uid'],$current_post);
 
        return $current_post;
 }
@@ -918,22 +923,22 @@ function get_item_contact($item,$contacts) {
 }
 
 
-function tgroup_deliver($uid,$item_id) {
-
+function tag_deliver($uid,$item_id) {
 
-       // setup a second delivery chain for forum/community posts if appropriate
+       // look for mention tags and setup a second delivery chain for forum/community posts if appropriate
 
        $a = get_app();
 
-       $deliver_to_tgroup = false;
+       $mention = false;
 
-       $u = q("select * from user where uid = %d and `page-flags` = %d limit 1",
-               intval($uid),
-               intval(PAGE_COMMUNITY)
+       $u = q("select uid, nickname, language, username, email, `page-flags`, `notify-flags` from user where uid = %d limit 1",
+               intval($uid)
        );
        if(! count($u))
                return;
 
+       $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
+
        $i = q("select * from item where id = %d and uid = %d limit 1",
                intval($item_id),
                intval($uid)
@@ -943,13 +948,6 @@ function tgroup_deliver($uid,$item_id) {
 
        $item = $i[0];
 
-       // prevent delivery looping - only proceed
-       // if the message originated elsewhere and is a top-level post
-
-       if(($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent']))
-               return;
-
-
        $link = normalise_link($a->get_baseurl() . '/profile/' . $u[0]['nickname']);
 
        // Diaspora uses their own hardwired link URL in @-tags
@@ -961,19 +959,57 @@ function tgroup_deliver($uid,$item_id) {
        if($cnt) {
                foreach($matches as $mtch) {
                        if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) {
-                               $deliver_to_tgroup = true;
-                               logger('tgroup_deliver: local group mention found: ' . $mtch[2]);
+                               $mention = true;
+                               logger('tag_deliver: mention found: ' . $mtch[2]);
                        }
                }
        }
 
-       if(! $deliver_to_tgroup)
+       if(! $mention)
+               return;
+
+       // send a notification
+
+       require_once('include/enotify.php');
+       notification(array(
+               'type'         => NOTIFY_TAGSELF,
+               'notify_flags' => $u[0]['notify-flags'],
+               'language'     => $u[0]['language'],
+               'to_name'      => $u[0]['username'],
+               'to_email'     => $u[0]['email'],
+               'uid'          => $u[0]['uid'],
+               'item'         => $item,
+               'link'         => $a->get_baseurl() . '/display/' . $u[0]['nickname'] . '/' . $item['id'],
+               'source_name'  => $item['author-name'],
+               'source_link'  => $item['author-link'],
+               'source_photo' => $item['author-avatar'],
+               'verb'         => ACTIVITY_TAG,
+               'otype'        => 'item'
+       ));
+
+       if(! $community_page)
+               return;
+
+       // tgroup delivery - setup a second delivery chain
+       // prevent delivery looping - only proceed
+       // if the message originated elsewhere and is a top-level post
+
+       if(($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent']))
                return;
 
        // now change this copy of the post to a forum head message and deliver to all the tgroup members
 
 
-       q("update item set wall = 1, origin = 1, forum_mode = 1 where id = %d limit 1",
+       $c = q("select name, url, thumb from contact where self = 1 and uid = %d limit 1",
+               intval($u[0]['uid'])
+       );
+       if(! count($c))
+               return;
+
+       q("update item set wall = 1, origin = 1, forum_mode = 1, `owner-name` = '%s', `owner-link` = '%s', `owner-avatar` = '%s'  where id = %d limit 1",
+               dbesc($c[0]['name']),
+               dbesc($c[0]['url']),
+               dbesc($c[0]['thumb']),
                intval($item_id)
        );
 
@@ -990,8 +1026,8 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
 
        $a = get_app();
 
-       if((! strlen($contact['issued-id'])) && (! $contact['duplex']) && (! ($owner['page-flags'] == PAGE_COMMUNITY)))
-               return 3;
+//     if((! strlen($contact['issued-id'])) && (! $contact['duplex']) && (! ($owner['page-flags'] == PAGE_COMMUNITY)))
+//             return 3;
 
        $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
 
@@ -1042,7 +1078,9 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
        $final_dfrn_id = '';
 
 
-       if(($contact['duplex'] && strlen($contact['pubkey'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
+       if(($contact['duplex'] && strlen($contact['pubkey'])) 
+               || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
+               || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
                openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
                openssl_public_decrypt($challenge,$postvars['challenge'],$contact['pubkey']);
        }
@@ -1085,7 +1123,10 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
 
 
                if($dfrn_version >= 2.1) {      
-                       if(($contact['duplex'] && strlen($contact['pubkey'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
+                       if(($contact['duplex'] && strlen($contact['pubkey'])) 
+                               || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
+                               || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
+
                                openssl_public_encrypt($key,$postvars['key'],$contact['pubkey']);
                        }
                        else {
@@ -1481,7 +1522,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
 
                                if(count($r)) {
                                        if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
-                                               $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                               $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                                       dbesc($datarray['title']),
                                                        dbesc($datarray['body']),
                                                        dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
                                                        dbesc($item_id),
@@ -1611,7 +1653,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
 
                                if(count($r)) {
                                        if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
-                                               $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                               $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                                       dbesc($datarray['title']),
                                                        dbesc($datarray['body']),
                                                        dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
                                                        dbesc($item_id),
@@ -1806,6 +1849,7 @@ function local_delivery($importer,$data) {
                        'language'     => $importer['language'],
                        'to_name'      => $importer['username'],
                        'to_email'     => $importer['email'],
+                       'uid'          => $importer['importer_uid'],
                        'item'         => $fsugg,
                        'link'         => $a->get_baseurl() . '/notifications/intros',
                        'source_name'  => $importer['name'],
@@ -1857,6 +1901,7 @@ function local_delivery($importer,$data) {
                        'language' => $importer['language'],
                        'to_name' => $importer['username'],
                        'to_email' => $importer['email'],
+                       'uid' => $importer['importer_uid'],
                        'item' => $msg,
                        'source_name' => $msg['from-name'],
                        'source_link' => $importer['url'],
@@ -2129,6 +2174,7 @@ function local_delivery($importer,$data) {
                                                                'language'     => $importer['language'],
                                                                'to_name'      => $importer['username'],
                                                                'to_email'     => $importer['email'],
+                                                               'uid'          => $importer['importer_uid'],
                                                                'item'         => $datarray,
                                                                'link'             => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
                                                                'source_name'  => stripslashes($datarray['author-name']),
@@ -2162,7 +2208,8 @@ function local_delivery($importer,$data) {
 
                                if(count($r)) {
                                        if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
-                                               $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                               $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                                       dbesc($datarray['title']),
                                                        dbesc($datarray['body']),
                                                        dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
                                                        dbesc($item_id),
@@ -2248,6 +2295,7 @@ function local_delivery($importer,$data) {
                                                                'language'     => $importer['language'],
                                                                'to_name'      => $importer['username'],
                                                                'to_email'     => $importer['email'],
+                                                               'uid'          => $importer['importer_uid'],
                                                                'item'         => $datarray,
                                                                'link'             => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
                                                                'source_name'  => stripslashes($datarray['author-name']),
@@ -2304,7 +2352,8 @@ function local_delivery($importer,$data) {
 
                        if(count($r)) {
                                if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
-                                       $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                       $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+                                               dbesc($datarray['title']),
                                                dbesc($datarray['body']),
                                                dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
                                                dbesc($item_id),
@@ -2800,7 +2849,7 @@ function drop_item($id,$interactive = true) {
 
                // delete the item
 
-               $r = q("UPDATE `item` SET `deleted` = 1, `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
+               $r = q("UPDATE `item` SET `deleted` = 1, `title` = '', `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
                        dbesc(datetime_convert()),
                        dbesc(datetime_convert()),
                        intval($item['id'])
@@ -2833,7 +2882,7 @@ function drop_item($id,$interactive = true) {
                // If it's the parent of a comment thread, kill all the kids
 
                if($item['uri'] == $item['parent-uri']) {
-                       $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' 
+                       $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = ''
                                WHERE `parent-uri` = '%s' AND `uid` = %d ",
                                dbesc(datetime_convert()),
                                dbesc(datetime_convert()),
index 551d5e1d0f7ee87ef39b0f817bec9659b90de91c..25db62d1611a0d4b78c8970981b03c5e1663abe5 100755 (executable)
@@ -579,6 +579,9 @@ function fetch_xrd_links($url) {
 
 if(! function_exists('validate_url')) {
 function validate_url(&$url) {
+       // no naked subdomains
+       if(strpos($url,'.') === false)
+               return false;
        if(substr($url,0,4) != 'http')
                $url = 'http://' . $url;
        $h = @parse_url($url);
index ead7aebad484e0478e79002cc635867f2557ae3d..37bc6dae512cad68efcdb55d5fbb0cb4dff736e5 100755 (executable)
@@ -35,7 +35,7 @@ function notifier_run($argv, $argc){
        require_once("datetime.php");
        require_once('include/items.php');
        require_once('include/bbcode.php');
-
+       require_once('include/email.php');
        load_config('config');
        load_config('system');
 
@@ -264,7 +264,7 @@ function notifier_run($argv, $argc){
                        $deny_people  = expand_acl($parent['deny_cid']);
                        $deny_groups  = expand_groups(expand_acl($parent['deny_gid']));
 
-                       // if our parent is a forum, uplink to the origonal author causing
+                       // if our parent is a forum, uplink to the origional author causing
                        // a delivery fork
 
                        if(intval($parent['forum_mode']) && (! $top_level) && ($cmd !== 'uplink')) {
@@ -526,6 +526,14 @@ function notifier_run($argv, $argc){
                                                );
 
                                                if(count($x)) {
+
+                                                       if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) {
+                                                               q("update contact set writable = 1 where id = %d limit 1",
+                                                                       intval($x[0]['id'])
+                                                               );
+                                                               $x[0]['writable'] = 1;
+                                                       }
+
                                                        require_once('library/simplepie/simplepie.inc');
                                                        logger('mod-delivery: local delivery');
                                                        local_delivery($x[0],$atom);
@@ -584,6 +592,7 @@ function notifier_run($argv, $argc){
                                        break;
 
                                case NETWORK_MAIL:
+                               case NETWORK_MAIL2:
                                                
                                        if(get_config('system','dfrn_only'))
                                                break;
@@ -625,14 +634,14 @@ function notifier_run($argv, $argc){
                                                if($r1 && $r1[0]['reply_to'])
                                                        $reply_to = $r1[0]['reply_to'];
        
-                                               $subject  = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ;
+                                               $subject  = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ;
 
                                                // only expose our real email address to true friends
 
-                                               if($contact['rel'] == CONTACT_IS_FRIEND)
-                                                       $headers  = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n";
+                                               if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked']))
+                                                       $headers  = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n";
                                                else
-                                                       $headers  = 'From: ' . $local_user[0]['username'] . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n";
+                                                       $headers  = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n";
 
                                                if($reply_to)
                                                        $headers .= 'Reply-to: ' . $reply_to . "\n";
@@ -754,9 +763,10 @@ function notifier_run($argv, $argc){
                );
                        
                $r2 = q("SELECT `id`, `name`,`network` FROM `contact` 
-                       WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+                       WHERE `network` in ( '%s', '%s')  AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
                        AND `rel` != %d order by rand() ",
                        dbesc(NETWORK_DFRN),
+                       dbesc(NETWORK_MAIL2),
                        intval($owner['uid']),
                        intval(CONTACT_IS_SHARING)
                );
index 118f7fa4a39f45fdb5b91819f864f199df40365b..5c3c595f57e910ba47577746e7afd53d89c8b1e0 100755 (executable)
@@ -11,7 +11,7 @@ function oembed_replacecb($matches){
 
 
 function oembed_fetch_url($embedurl){
-       
+
        $txt = Cache::get($embedurl);
 
        $noexts = array("mp3","mp4","ogg","ogv","oga","ogm","webm");
index fe325ac3b0db0a20428aa8ecf21666cfdd0ba471..85b51edff506c5378db13f8fd8caf939a6e33c0e 100755 (executable)
@@ -56,25 +56,29 @@ function reload_plugins() {
                if(count($parr)) {
                        foreach($parr as $pl) {
                                $pl = trim($pl);
+
+                               $fname = 'addon/' . $pl . '/' . $pl . '.php';
                                
-                               $t = filemtime('addon/' . $pl . '/' . $pl . '.php');
-                               foreach($installed as $i) {
-                                       if(($i['name'] == $pl) && ($i['timestamp'] != $t)) {    
-                                               logger('Reloading plugin: ' . $i['name']);
-                                               @include_once('addon/' . $pl . '/' . $pl . '.php');
-
-                                               if(function_exists($pl . '_uninstall')) {
-                                                       $func = $pl . '_uninstall';
-                                                       $func();
-                                               }
-                                               if(function_exists($pl . '_install')) {
-                                                       $func = $pl . '_install';
-                                                       $func();
+                               if(file_exists($fname)) {
+                                       $t = @filemtime($fname);
+                                       foreach($installed as $i) {
+                                               if(($i['name'] == $pl) && ($i['timestamp'] != $t)) {    
+                                                       logger('Reloading plugin: ' . $i['name']);
+                                                       @include_once($fname);
+
+                                                       if(function_exists($pl . '_uninstall')) {
+                                                               $func = $pl . '_uninstall';
+                                                               $func();
+                                                       }
+                                                       if(function_exists($pl . '_install')) {
+                                                               $func = $pl . '_install';
+                                                               $func();
+                                                       }
+                                                       q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
+                                                               intval($t),
+                                                               intval($i['id'])
+                                                       );
                                                }
-                                               q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
-                                                       intval($t),
-                                                       intval($i['id'])
-                                               );
                                        }
                                }
                        }
index 89e4488b92c2239ae09ddb68a3f5c5563fead479..7d42c63b5f8d1731ce57e6c280d9ab67cbd58376 100755 (executable)
@@ -369,7 +369,7 @@ function poller_run($argv, $argc){
 
                                $xml = fetch_url($contact['poll']);
                        }
-                       elseif($contact['network'] === NETWORK_MAIL) {
+                       elseif($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) {
 
                                $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
                                if($mail_disabled)
@@ -462,7 +462,7 @@ function poller_run($argv, $argc){
                                                        $datarray['contact-id'] = $contact['id'];
                                                        if($datarray['parent-uri'] === $datarray['uri'])
                                                                $datarray['private'] = 1;
-                                                       if(! get_pconfig($importer_uid,'system','allow_public_email_replies')) {
+                                                       if(($contact['network'] === NETWORK_MAIL) && (! get_pconfig($importer_uid,'system','allow_public_email_replies'))) {
                                                                $datarray['private'] = 1;
                                                                $datarray['allow_cid'] = '<' . $contact['id'] . '>';
                                                        }
index ccecb95dee7056b024c3698547c65d4d235084ec..004a58524b53385c03e32b43feca2759fb59301d 100755 (executable)
@@ -44,6 +44,8 @@ function advanced_profile(&$a) {
 
                if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
 
+               if($a->profile['pub_keywords']) $profile['pub_keywords'] = array( t('Tags:'), $a->profile['pub_keywords']);
+
                if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);
 
                if($a->profile['religion']) $profile['religion'] = array( t('Religion:'), $a->profile['religion']);
index 5f4adb27c3a60931393d6af4a934723d16b86ed7..b9813cfa9fa983c6a38c738f8c4e01f3d25d6b11 100755 (executable)
@@ -428,8 +428,10 @@ if(! function_exists('logger')) {
 function logger($msg,$level = 0) {
        // turn off logger in install mode
        global $a;
-       if ($a->module == 'install') return;
-       
+       global $db;
+
+       if(($a->module == 'install') || (! ($db && $db->connected))) return;
+
        $debugging = get_config('system','debugging');
        $loglevel  = intval(get_config('system','loglevel'));
        $logfile   = get_config('system','logfile');
@@ -538,8 +540,10 @@ function contact_block() {
        $a = get_app();
 
        $shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
-       if(! $shown)
+       if($shown === false)
                $shown = 24;
+       if($shown == 0)
+               return;
 
        if((! is_array($a->profile)) || ($a->profile['hide-friends']))
                return $o;
@@ -674,41 +678,105 @@ function linkify($s) {
  */
 
 if(! function_exists('smilies')) {
-function smilies($s) {
+function smilies($s, $sample = false) {
        $a = get_app();
 
-       $s = str_replace(
-       array( '&lt;3', '&lt;/3', '&lt;\\3', ':-)', ':)', ';-)', ':-(', ':(', ':-P', ':P', ':-"', ':-x', ':-X', ':-D', '8-|', '8-O', '\\o/', 'o.O', 'O.o', '\\.../', '\\ooo/', 
-               '~friendika', '~friendica', 'Diaspora*' ),
-       array(
+       $texts =  array( 
+               '&lt;3', 
+               '&lt;/3', 
+               '&lt;\\3', 
+               ':-)', 
+//             ':)', 
+               ';-)', 
+//             ';)', 
+               ':-(', 
+//             ':(', 
+               ':-P', 
+//             ':P', 
+               ':-"', 
+               ':-&quot;', 
+               ':-x', 
+               ':-X', 
+               ':-D', 
+//             ':D', 
+               '8-|', 
+               '8-O', 
+               ':-O', 
+               '\\o/', 
+               'o.O', 
+               'O.o', 
+               '\\.../', 
+               '\\ooo/', 
+               ":'(", 
+               ":-!", 
+               ":-/", 
+               ":-[", 
+               "8-)",
+               ':beer', 
+               ':homebrew', 
+               ':coffee', 
+               ':facepalm',
+               ':headdesk',
+               '~friendika', 
+               '~friendica', 
+               'Diaspora*' 
+       );
+
+       $icons = array(
                '<img src="' . $a->get_baseurl() . '/images/smiley-heart.gif" alt="<3" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="</3" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="<\\3" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":-)" />',
-               '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":)" />',
+//             '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":)" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";-)" />',
+//             '<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";)"/>',                
                '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":-(" />',
-               '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />',
+//             '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-P" />',
-               '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":P" />',
+//             '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":P" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-x" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-X" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":-D" />',
+//             '<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":D"/>',                
                '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-|" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-O" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt=":-O" />',                
                '<img src="' . $a->get_baseurl() . '/images/smiley-thumbsup.gif" alt="\\o/" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-Oo.gif" alt="o.O" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-Oo.gif" alt="O.o" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-shaka.gif" alt="\\.../" />',
                '<img src="' . $a->get_baseurl() . '/images/smiley-shaka.gif" alt="\\ooo/" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-cry.gif" alt=":\'(" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-foot-in-mouth.gif" alt=":-!" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-undecided.gif" alt=":-/" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-embarassed.gif" alt=":-[" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-cool.gif" alt="8-)" />',
+               '<img src="' . $a->get_baseurl() . '/images/beer_mug.gif" alt=":beer" />',
+               '<img src="' . $a->get_baseurl() . '/images/beer_mug.gif" alt=":homebrew" />',
+               '<img src="' . $a->get_baseurl() . '/images/coffee.gif" alt=":coffee" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-facepalm.gif" alt=":facepalm" />',
+               '<img src="' . $a->get_baseurl() . '/images/smiley-bangheaddesk.gif" alt=":headdesk" />',
                '<a href="http://project.friendika.com">~friendika <img src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendika" /></a>',
                '<a href="http://friendica.com">~friendica <img src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendica" /></a>',
                '<a href="http://diasporafoundation.org">Diaspora<img src="' . $a->get_baseurl() . '/images/diaspora.png" alt="Diaspora*" /></a>',
 
-       ), $s);
+       );
+
+       $params = array('texts' => $texts, 'icons' => $icons, 'string' => $s);
+       call_hooks('smilie', $params);
 
-       call_hooks('smilie', $s);
+       if($sample) {
+               $s = '<div class="smiley-sample">';
+               for($x = 0; $x < count($params['texts']); $x ++) {
+                       $s .= '<dl><dt>' . $params['texts'][$x] . '</dt><dd>' . $params['icons'][$x] . '</dd></dl>';
+               }
+       }
+       else {
+               $s = str_replace($params['texts'],$params['icons'],$params['string']);
+       }
+             
        return $s;
 
 }}
@@ -785,10 +853,10 @@ function prepare_body($item,$attach = false) {
                                        case 'audio':
                                        case 'image':
                                        case 'text':
-                                               $icon = '<div class="attachtype type-' . $icontype . '"></div>';
+                                               $icon = '<div class="attachtype icon s22 type-' . $icontype . '"></div>';
                                                break;
                                        default:
-                                               $icon = '<div class="attachtype type-unkn"></div>';
+                                               $icon = '<div class="attachtype icon s22 type-unkn"></div>';
                                                break;
                                }
                                $title = ((strlen(trim($matches[4]))) ? escape_tags(trim($matches[4])) : escape_tags($matches[1]));
@@ -814,7 +882,10 @@ function prepare_text($text) {
 
        require_once('include/bbcode.php');
 
-       $s = smilies(bbcode($text));
+       if(stristr($text,'[nosmile]'))
+               $s = bbcode($text);
+       else
+               $s = smilies(bbcode($text));
 
        return $s;
 }}
diff --git a/library/fullcalendar/GPL-LICENSE.txt b/library/fullcalendar/GPL-LICENSE.txt
new file mode 100644 (file)
index 0000000..11dddd0
--- /dev/null
@@ -0,0 +1,278 @@
+        GNU GENERAL PUBLIC LICENSE
+           Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+        GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+          NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
diff --git a/library/fullcalendar/MIT-LICENSE.txt b/library/fullcalendar/MIT-LICENSE.txt
new file mode 100644 (file)
index 0000000..46d4754
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2009 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/library/fullcalendar/changelog.txt b/library/fullcalendar/changelog.txt
new file mode 100644 (file)
index 0000000..17b31f8
--- /dev/null
@@ -0,0 +1,318 @@
+
+version 1.5.3 (2/6/12)
+       - fixed dragging issue with jQuery UI 1.8.16 (issue 1168)
+       - bundled with jQuery 1.7.1 and jQuery UI 1.8.17
+
+version 1.5.2 (8/21/11)
+       - correctly process UTC "Z" ISO8601 date strings (issue 750)
+
+version 1.5.1 (4/9/11)
+       - more flexible ISO8601 date parsing (issue 814)
+       - more flexible parsing of UNIX timestamps (issue 826)
+       - FullCalendar now buildable from source on a Mac (issue 795)
+       - FullCalendar QA'd in FF4 (issue 883)
+       - upgraded to jQuery 1.5.2 (which supports IE9) and jQuery UI 1.8.11
+
+version 1.5 (3/19/11)
+       - slicker default styling for buttons
+       - reworked a lot of the calendar's HTML and accompanying CSS
+         (solves issues 327 and 395)
+       - more printer-friendly (fullcalendar-print.css)
+       - fullcalendar now inherits styles from jquery-ui themes differently.
+         styles for buttons are distinct from styles for calendar cells.
+         (solves issue 299)
+       - can now color events through FullCalendar options and Event-Object properties (issue 117)
+         THIS IS NOW THE PREFERRED METHOD OF COLORING EVENTS (as opposed to using className and CSS)
+               - FullCalendar options:
+                       - eventColor (changes both background and border)
+                       - eventBackgroundColor
+                       - eventBorderColor
+                       - eventTextColor
+               - Event-Object options:
+                       - color (changes both background and border)
+                       - backgroundColor
+                       - borderColor
+                       - textColor
+       - can now specify an event source as an *object* with a `url` property (json feed) or
+         an `events` property (function or array) with additional properties that will
+         be applied to the entire event source:
+               - color (changes both background and border)
+               - backgroudColor
+               - borderColor
+               - textColor
+               - className
+               - editable
+               - allDayDefault
+               - ignoreTimezone
+               - startParam (for a feed)
+               - endParam   (for a feed)
+               - ANY OF THE JQUERY $.ajax OPTIONS
+                 allows for easily changing from GET to POST and sending additional parameters (issue 386)
+                 allows for easily attaching ajax handlers such as `error` (issue 754)
+                 allows for turning caching on (issue 355)
+       - Google Calendar feeds are now specified differently:
+               - specify a simple string of your feed's URL
+               - specify an *object* with a `url` property of your feed's URL.
+                 you can include any of the new Event-Source options in this object.
+               - the old `$.fullCalendar.gcalFeed` method still works
+       - no more IE7 SSL popup (issue 504)
+       - remove `cacheParam` - use json event source `cache` option instead
+       - latest jquery/jquery-ui
+
+version 1.4.11 (2/22/11)
+       - fixed rerenderEvents bug (issue 790)
+       - fixed bug with faulty dragging of events from all-day slot in agenda views
+       - bundled with jquery 1.5 and jquery-ui 1.8.9
+
+version 1.4.10 (1/2/11)
+       - fixed bug with resizing event to different week in 5-day month view (issue 740)
+       - fixed bug with events not sticking after a removeEvents call (issue 757)
+       - fixed bug with underlying parseTime method, and other uses of parseInt (issue 688)
+
+version 1.4.9 (11/16/10)
+       - new algorithm for vertically stacking events (issue 111)
+       - resizing an event to a different week (issue 306)
+       - bug: some events not rendered with consecutive calls to addEventSource (issue 679)
+
+version 1.4.8 (10/16/10)
+       - ignoreTimezone option (set to `false` to process UTC offsets in ISO8601 dates)
+       - bugfixes
+               - event refetching not being called under certain conditions (issues 417, 554)
+               - event refetching being called multiple times under certain conditions (issues 586, 616)
+               - selection cannot be triggered by right mouse button (issue 558)
+               - agenda view left axis sized incorrectly (issue 465)
+               - IE js error when calendar is too narrow (issue 517)
+               - agenda view looks strange when no scrollbars (issue 235)
+               - improved parsing of ISO8601 dates with UTC offsets
+       - $.fullCalendar.version
+       - an internal refactor of the code, for easier future development and modularity
+
+version 1.4.7 (7/5/10)
+       - "dropping" external objects onto the calendar
+               - droppable (boolean, to turn on/off)
+               - dropAccept (to filter which events the calendar will accept)
+               - drop (trigger)
+       - selectable options can now be specified with a View Option Hash
+       - bugfixes
+               - dragged & reverted events having wrong time text (issue 406)
+               - bug rendering events that have an endtime with seconds, but no hours/minutes (issue 477)
+               - gotoDate date overflow bug (issue 429)
+               - wrong date reported when clicking on edge of last column in agenda views (412)
+       - support newlines in event titles
+       - select/unselect callbacks now passes native js event
+
+version 1.4.6 (5/31/10)
+       - "selecting" days or timeslots
+               - options: selectable, selectHelper, unselectAuto, unselectCancel
+               - callbacks: select, unselect
+               - methods: select, unselect
+       - when dragging an event, the highlighting reflects the duration of the event
+       - code compressing by Google Closure Compiler
+       - bundled with jQuery 1.4.2 and jQuery UI 1.8.1
+
+version 1.4.5 (2/21/10)
+       - lazyFetching option, which can force the calendar to fetch events on every view/date change
+       - scroll state of agenda views are preserved when switching back to view
+       - bugfixes
+               - calling methods on an uninitialized fullcalendar throws error
+               - IE6/7 bug where an entire view becomes invisible (issue 320)
+               - error when rendering a hidden calendar (in jquery ui tabs for example) in IE (issue 340)
+               - interconnected bugs related to calendar resizing and scrollbars
+                       - when switching views or clicking prev/next, calendar would "blink" (issue 333)
+                       - liquid-width calendar's events shifted (depending on initial height of browser) (issue 341)
+                       - more robust underlying algorithm for calendar resizing
+
+version 1.4.4 (2/3/10)
+       - optimized event rendering in all views (events render in 1/10 the time)
+       - gotoDate() does not force the calendar to unnecessarily rerender
+       - render() method now correctly readjusts height
+
+version 1.4.3 (12/22/09)
+       - added destroy method
+       - Google Calendar event pages respect currentTimezone
+       - caching now handled by jQuery's ajax  
+       - protection from setting aspectRatio to zero
+       - bugfixes
+               - parseISO8601 and DST caused certain events to display day before
+               - button positioning problem in IE6
+               - ajax event source removed after recently being added, events still displayed
+               - event not displayed when end is an empty string
+               - dynamically setting calendar height when no events have been fetched, throws error
+
+version 1.4.2 (12/02/09)
+       - eventAfterRender trigger
+       - getDate & getView methods
+       - height & contentHeight options (explicitly sets the pixel height)
+       - minTime & maxTime options (restricts shown hours in agenda view)
+       - getters [for all options] and setters [for height, contentHeight, and aspectRatio ONLY! stay tuned..]
+       - render method now readjusts calendar's size
+       - bugfixes
+               - lightbox scripts that use iframes (like fancybox)
+               - day-of-week classNames were off when firstDay=1
+               - guaranteed space on right side of agenda events (even when stacked)
+               - accepts ISO8601 dates with a space (instead of 'T')
+
+version 1.4.1 (10/31/09)
+       - can exclude weekends with new 'weekends' option
+       - gcal feed 'currentTimezone' option
+       - bugfixes
+               - year/month/date option sometimes wouldn't set correctly (depending on current date)
+               - daylight savings issue caused agenda views to start at 1am (for BST users)
+       - cleanup of gcal.js code
+
+version 1.4 (10/19/09)
+       - agendaWeek and agendaDay views
+       - added some options for agenda views:
+               - allDaySlot
+               - allDayText
+               - firstHour
+               - slotMinutes
+               - defaultEventMinutes
+               - axisFormat
+       - modified some existing options/triggers to work with agenda views:
+               - dragOpacity and timeFormat can now accept a "View Hash" (a new concept)
+               - dayClick now has an allDay parameter
+               - eventDrop now has an an allDay parameter
+                 (this will affect those who use revertFunc, adjust parameter list)
+       - added 'prevYear' and 'nextYear' for buttons in header
+       - minor change for theme users, ui-state-hover not applied to active/inactive buttons
+       - added event-color-changing example in docs
+       - better defaults for right-to-left themed button icons
+
+version 1.3.2 (10/13/09)
+       - Bugfixes (please upgrade from 1.3.1!)
+               - squashed potential infinite loop when addMonths and addDays
+                 is called with an invalid date
+               - $.fullCalendar.parseDate() now correctly parses IETF format
+               - when switching views, the 'today' button sticks inactive, fixed
+       - gotoDate now can accept a single Date argument
+       - documentation for changes in 1.3.1 and 1.3.2 now on website
+
+version 1.3.1 (9/30/09)
+       - Important Bugfixes (please upgrade from 1.3!)
+               - When current date was late in the month, for long months, and prev/next buttons
+                 were clicked in month-view, some months would be skipped/repeated
+               - In certain time zones, daylight savings time would cause certain days
+                 to be misnumbered in month-view
+       - Subtle change in way week interval is chosen when switching from month to basicWeek/basicDay view
+       - Added 'allDayDefault' option
+       - Added 'changeView' and 'render' methods
+
+version 1.3 (9/21/09)
+       - different 'views': month/basicWeek/basicDay
+       - more flexible 'header' system for buttons
+       - themable by jQuery UI themes
+       - resizable events (require jQuery UI resizable plugin)
+       - rescoped & rewritten CSS, enhanced default look
+       - cleaner css & rendering techniques for right-to-left
+       - reworked options & API to support multiple views / be consistent with jQuery UI
+       - refactoring of entire codebase
+               - broken into different JS & CSS files, assembled w/ build scripts
+               - new test suite for new features, uses firebug-lite
+       - refactored docs
+       - Options
+               + date
+               + defaultView
+               + aspectRatio
+               + disableResizing
+               + monthNames      (use instead of $.fullCalendar.monthNames)
+               + monthNamesShort (use instead of $.fullCalendar.monthAbbrevs)
+               + dayNames        (use instead of $.fullCalendar.dayNames)
+               + dayNamesShort   (use instead of $.fullCalendar.dayAbbrevs)
+               + theme
+               + buttonText
+               + buttonIcons
+               x draggable           -> editable/disableDragging
+               x fixedWeeks          -> weekMode
+               x abbrevDayHeadings   -> columnFormat
+               x buttons/title       -> header
+               x eventDragOpacity    -> dragOpacity
+               x eventRevertDuration -> dragRevertDuration
+               x weekStart           -> firstDay
+               x rightToLeft         -> isRTL
+               x showTime (use 'allDay' CalEvent property instead)
+       - Triggered Actions
+               + eventResizeStart
+               + eventResizeStop
+               + eventResize
+               x monthDisplay -> viewDisplay
+               x resize       -> windowResize
+               'eventDrop' params changed, can revert if ajax cuts out
+       - CalEvent Properties
+               x showTime  -> allDay
+               x draggable -> editable
+               'end' is now INCLUSIVE when allDay=true
+               'url' now produces a real <a> tag, more native clicking/tab behavior
+       - Methods:
+               + renderEvent
+               x prevMonth         -> prev
+               x nextMonth         -> next
+               x prevYear/nextYear -> moveDate
+               x refresh           -> rerenderEvents/refetchEvents
+               x removeEvent       -> removeEvents
+               x getEventsByID     -> clientEvents
+       - Utilities:
+               'formatDate' format string completely changed (inspired by jQuery UI datepicker + datejs)
+               'formatDates' added to support date-ranges
+       - Google Calendar Options:
+               x draggable -> editable
+       - Bugfixes
+               - gcal extension fetched 25 results max, now fetches all
+
+version 1.2.1 (6/29/09)
+       - bugfixes
+               - allows and corrects invalid end dates for events
+               - doesn't throw an error in IE while rendering when display:none
+               - fixed 'loading' callback when used w/ multiple addEventSource calls
+               - gcal className can now be an array
+
+version 1.2 (5/31/09)
+       - expanded API
+               - 'className' CalEvent attribute
+               - 'source' CalEvent attribute
+               - dynamically get/add/remove/update events of current month
+               - locale improvements: change month/day name text
+               - better date formatting ($.fullCalendar.formatDate)
+               - multiple 'event sources' allowed
+                       - dynamically add/remove event sources
+       - options for prevYear and nextYear buttons
+       - docs have been reworked (include addition of Google Calendar docs)
+       - changed behavior of parseDate for number strings
+         (now interpets as unix timestamp, not MS times)
+       - bugfixes
+               - rightToLeft month start bug
+               - off-by-one errors with month formatting commands
+               - events from previous months sticking when clicking prev/next quickly
+       - Google Calendar API changed to work w/ multiple event sources
+               - can also provide 'className' and 'draggable' options
+       - date utilties moved from $ to $.fullCalendar
+       - more documentation in source code
+       - minified version of fullcalendar.js
+       - test suit (available from svn)
+       - top buttons now use <button> w/ an inner <span> for better css cusomization
+               - thus CSS has changed. IF UPGRADING FROM PREVIOUS VERSIONS,
+                 UPGRADE YOUR FULLCALENDAR.CSS FILE!!!
+
+version 1.1 (5/10/09)
+       - Added the following options:
+               - weekStart
+               - rightToLeft
+               - titleFormat
+               - timeFormat
+               - cacheParam
+               - resize
+       - Fixed rendering bugs
+               - Opera 9.25 (events placement & window resizing)
+               - IE6 (window resizing)
+       - Optimized window resizing for ALL browsers
+       - Events on same day now sorted by start time (but first by timespan)
+       - Correct z-index when dragging
+       - Dragging contained in overflow DIV for IE6
+       - Modified fullcalendar.css
+               - for right-to-left support
+               - for variable start-of-week
+               - for IE6 resizing bug
+               - for THEAD and TBODY (in 1.0, just used TBODY, restructured in 1.1)
+               - IF UPGRADING FROM FULLCALENDAR 1.0, YOU MUST UPGRADE FULLCALENDAR.CSS
+                 !!!!!!!!!!!
+                 
diff --git a/library/fullcalendar/fullcalendar.css b/library/fullcalendar/fullcalendar.css
new file mode 100644 (file)
index 0000000..04f1184
--- /dev/null
@@ -0,0 +1,618 @@
+/*
+ * FullCalendar v1.5.3 Stylesheet
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+
+
+.fc {
+       direction: ltr;
+       text-align: left;
+       }
+       
+.fc table {
+       border-collapse: collapse;
+       border-spacing: 0;
+       }
+       
+html .fc,
+.fc table {
+       font-size: 1em;
+       }
+       
+.fc td,
+.fc th {
+       padding: 0;
+       vertical-align: top;
+       }
+
+
+
+/* Header
+------------------------------------------------------------------------*/
+
+.fc-header td {
+       white-space: nowrap;
+       }
+
+.fc-header-left {
+       width: 25%;
+       text-align: left;
+       }
+       
+.fc-header-center {
+       text-align: center;
+       }
+       
+.fc-header-right {
+       width: 25%;
+       text-align: right;
+       }
+       
+.fc-header-title {
+       display: inline-block;
+       vertical-align: top;
+       }
+       
+.fc-header-title h2 {
+       margin-top: 0;
+       white-space: nowrap;
+       }
+       
+.fc .fc-header-space {
+       padding-left: 10px;
+       }
+       
+.fc-header .fc-button {
+       margin-bottom: 1em;
+       vertical-align: top;
+       }
+       
+/* buttons edges butting together */
+
+.fc-header .fc-button {
+       margin-right: -1px;
+       }
+       
+.fc-header .fc-corner-right {
+       margin-right: 1px; /* back to normal */
+       }
+       
+.fc-header .ui-corner-right {
+       margin-right: 0; /* back to normal */
+       }
+       
+/* button layering (for border precedence) */
+       
+.fc-header .fc-state-hover,
+.fc-header .ui-state-hover {
+       z-index: 2;
+       }
+       
+.fc-header .fc-state-down {
+       z-index: 3;
+       }
+
+.fc-header .fc-state-active,
+.fc-header .ui-state-active {
+       z-index: 4;
+       }
+       
+       
+       
+/* Content
+------------------------------------------------------------------------*/
+       
+.fc-content {
+       clear: both;
+       }
+       
+.fc-view {
+       width: 100%; /* needed for view switching (when view is absolute) */
+       overflow: hidden;
+       }
+       
+       
+
+/* Cell Styles
+------------------------------------------------------------------------*/
+
+.fc-widget-header,    /* <th>, usually */
+.fc-widget-content {  /* <td>, usually */
+       border: 1px solid #ccc;
+       }
+       
+.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */
+       background: #ffc;
+       }
+       
+.fc-cell-overlay { /* semi-transparent rectangle while dragging */
+       background: #9cf;
+       opacity: .2;
+       filter: alpha(opacity=20); /* for IE */
+       }
+       
+
+
+/* Buttons
+------------------------------------------------------------------------*/
+
+.fc-button {
+       position: relative;
+       display: inline-block;
+       cursor: pointer;
+       }
+       
+.fc-state-default { /* non-theme */
+       border-style: solid;
+       border-width: 1px 0;
+       }
+       
+.fc-button-inner {
+       position: relative;
+       float: left;
+       overflow: hidden;
+       }
+       
+.fc-state-default .fc-button-inner { /* non-theme */
+       border-style: solid;
+       border-width: 0 1px;
+       }
+       
+.fc-button-content {
+       position: relative;
+       float: left;
+       height: 1.9em;
+       line-height: 1.9em;
+       padding: 0 .6em;
+       white-space: nowrap;
+       }
+       
+/* icon (for jquery ui) */
+       
+.fc-button-content .fc-icon-wrap {
+       position: relative;
+       float: left;
+       top: 50%;
+       }
+       
+.fc-button-content .ui-icon {
+       position: relative;
+       float: left;
+       margin-top: -50%;
+       *margin-top: 0;
+       *top: -50%;
+       }
+       
+/* gloss effect */
+       
+.fc-state-default .fc-button-effect {
+       position: absolute;
+       top: 50%;
+       left: 0;
+       }
+       
+.fc-state-default .fc-button-effect span {
+       position: absolute;
+       top: -100px;
+       left: 0;
+       width: 500px;
+       height: 100px;
+       border-width: 100px 0 0 1px;
+       border-style: solid;
+       border-color: #fff;
+       background: #444;
+       opacity: .09;
+       filter: alpha(opacity=9);
+       }
+       
+/* button states (determines colors)  */
+       
+.fc-state-default,
+.fc-state-default .fc-button-inner {
+       border-style: solid;
+       border-color: #ccc #bbb #aaa;
+       background: #F3F3F3;
+       color: #000;
+       }
+       
+.fc-state-hover,
+.fc-state-hover .fc-button-inner {
+       border-color: #999;
+       }
+       
+.fc-state-down,
+.fc-state-down .fc-button-inner {
+       border-color: #555;
+       background: #777;
+       }
+       
+.fc-state-active,
+.fc-state-active .fc-button-inner {
+       border-color: #555;
+       background: #777;
+       color: #fff;
+       }
+       
+.fc-state-disabled,
+.fc-state-disabled .fc-button-inner {
+       color: #999;
+       border-color: #ddd;
+       }
+       
+.fc-state-disabled {
+       cursor: default;
+       }
+       
+.fc-state-disabled .fc-button-effect {
+       display: none;
+       }
+       
+       
+
+/* Global Event Styles
+------------------------------------------------------------------------*/
+        
+.fc-event {
+       border-style: solid;
+       border-width: 0;
+       font-size: .85em;
+       cursor: default;
+       }
+       
+a.fc-event,
+.fc-event-draggable {
+       cursor: pointer;
+       }
+       
+a.fc-event {
+       text-decoration: none;
+       }
+       
+.fc-rtl .fc-event {
+       text-align: right;
+       }
+       
+.fc-event-skin {
+       border-color: #36c;     /* default BORDER color */
+       background-color: #36c; /* default BACKGROUND color */
+       color: #fff;            /* default TEXT color */
+       }
+       
+.fc-event-inner {
+       position: relative;
+       width: 100%;
+       height: 100%;
+       border-style: solid;
+       border-width: 0;
+       overflow: hidden;
+       }
+       
+.fc-event-time,
+.fc-event-title {
+       padding: 0 1px;
+       }
+       
+.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/
+       display: block;
+       position: absolute;
+       z-index: 99999;
+       overflow: hidden; /* hacky spaces (IE6/7) */
+       font-size: 300%;  /* */
+       line-height: 50%; /* */
+       }
+       
+       
+       
+/* Horizontal Events
+------------------------------------------------------------------------*/
+
+.fc-event-hori {
+       border-width: 1px 0;
+       margin-bottom: 1px;
+       }
+       
+/* resizable */
+       
+.fc-event-hori .ui-resizable-e {
+       top: 0           !important; /* importants override pre jquery ui 1.7 styles */
+       right: -3px      !important;
+       width: 7px       !important;
+       height: 100%     !important;
+       cursor: e-resize;
+       }
+       
+.fc-event-hori .ui-resizable-w {
+       top: 0           !important;
+       left: -3px       !important;
+       width: 7px       !important;
+       height: 100%     !important;
+       cursor: w-resize;
+       }
+       
+.fc-event-hori .ui-resizable-handle {
+       _padding-bottom: 14px; /* IE6 had 0 height */
+       }
+       
+       
+       
+/* Fake Rounded Corners (for buttons and events)
+------------------------------------------------------------*/
+       
+.fc-corner-left {
+       margin-left: 1px;
+       }
+       
+.fc-corner-left .fc-button-inner,
+.fc-corner-left .fc-event-inner {
+       margin-left: -1px;
+       }
+       
+.fc-corner-right {
+       margin-right: 1px;
+       }
+       
+.fc-corner-right .fc-button-inner,
+.fc-corner-right .fc-event-inner {
+       margin-right: -1px;
+       }
+       
+.fc-corner-top {
+       margin-top: 1px;
+       }
+       
+.fc-corner-top .fc-event-inner {
+       margin-top: -1px;
+       }
+       
+.fc-corner-bottom {
+       margin-bottom: 1px;
+       }
+       
+.fc-corner-bottom .fc-event-inner {
+       margin-bottom: -1px;
+       }
+       
+       
+       
+/* Fake Rounded Corners SPECIFICALLY FOR EVENTS
+-----------------------------------------------------------------*/
+       
+.fc-corner-left .fc-event-inner {
+       border-left-width: 1px;
+       }
+       
+.fc-corner-right .fc-event-inner {
+       border-right-width: 1px;
+       }
+       
+.fc-corner-top .fc-event-inner {
+       border-top-width: 1px;
+       }
+       
+.fc-corner-bottom .fc-event-inner {
+       border-bottom-width: 1px;
+       }
+       
+       
+       
+/* Reusable Separate-border Table
+------------------------------------------------------------*/
+
+table.fc-border-separate {
+       border-collapse: separate;
+       }
+       
+.fc-border-separate th,
+.fc-border-separate td {
+       border-width: 1px 0 0 1px;
+       }
+       
+.fc-border-separate th.fc-last,
+.fc-border-separate td.fc-last {
+       border-right-width: 1px;
+       }
+       
+.fc-border-separate tr.fc-last th,
+.fc-border-separate tr.fc-last td {
+       border-bottom-width: 1px;
+       }
+       
+.fc-border-separate tbody tr.fc-first td,
+.fc-border-separate tbody tr.fc-first th {
+       border-top-width: 0;
+       }
+       
+       
+
+/* Month View, Basic Week View, Basic Day View
+------------------------------------------------------------------------*/
+
+.fc-grid th {
+       text-align: center;
+       }
+       
+.fc-grid .fc-day-number {
+       float: right;
+       padding: 0 2px;
+       }
+       
+.fc-grid .fc-other-month .fc-day-number {
+       opacity: 0.3;
+       filter: alpha(opacity=30); /* for IE */
+       /* opacity with small font can sometimes look too faded
+          might want to set the 'color' property instead
+          making day-numbers bold also fixes the problem */
+       }
+       
+.fc-grid .fc-day-content {
+       clear: both;
+       padding: 2px 2px 1px; /* distance between events and day edges */
+       }
+       
+/* event styles */
+       
+.fc-grid .fc-event-time {
+       font-weight: bold;
+       }
+       
+/* right-to-left */
+       
+.fc-rtl .fc-grid .fc-day-number {
+       float: left;
+       }
+       
+.fc-rtl .fc-grid .fc-event-time {
+       float: right;
+       }
+       
+       
+
+/* Agenda Week View, Agenda Day View
+------------------------------------------------------------------------*/
+
+.fc-agenda table {
+       border-collapse: separate;
+       }
+       
+.fc-agenda-days th {
+       text-align: center;
+       }
+       
+.fc-agenda .fc-agenda-axis {
+       width: 50px;
+       padding: 0 4px;
+       vertical-align: middle;
+       text-align: right;
+       white-space: nowrap;
+       font-weight: normal;
+       }
+       
+.fc-agenda .fc-day-content {
+       padding: 2px 2px 1px;
+       }
+       
+/* make axis border take precedence */
+       
+.fc-agenda-days .fc-agenda-axis {
+       border-right-width: 1px;
+       }
+       
+.fc-agenda-days .fc-col0 {
+       border-left-width: 0;
+       }
+       
+/* all-day area */
+       
+.fc-agenda-allday th {
+       border-width: 0 1px;
+       }
+       
+.fc-agenda-allday .fc-day-content {
+       min-height: 34px; /* TODO: doesnt work well in quirksmode */
+       _height: 34px;
+       }
+       
+/* divider (between all-day and slots) */
+       
+.fc-agenda-divider-inner {
+       height: 2px;
+       overflow: hidden;
+       }
+       
+.fc-widget-header .fc-agenda-divider-inner {
+       background: #eee;
+       }
+       
+/* slot rows */
+       
+.fc-agenda-slots th {
+       border-width: 1px 1px 0;
+       }
+       
+.fc-agenda-slots td {
+       border-width: 1px 0 0;
+       background: none;
+       }
+       
+.fc-agenda-slots td div {
+       height: 20px;
+       }
+       
+.fc-agenda-slots tr.fc-slot0 th,
+.fc-agenda-slots tr.fc-slot0 td {
+       border-top-width: 0;
+       }
+
+.fc-agenda-slots tr.fc-minor th,
+.fc-agenda-slots tr.fc-minor td {
+       border-top-style: dotted;
+       }
+       
+.fc-agenda-slots tr.fc-minor th.ui-widget-header {
+       *border-top-style: solid; /* doesn't work with background in IE6/7 */
+       }
+       
+
+
+/* Vertical Events
+------------------------------------------------------------------------*/
+
+.fc-event-vert {
+       border-width: 0 1px;
+       }
+       
+.fc-event-vert .fc-event-head,
+.fc-event-vert .fc-event-content {
+       position: relative;
+       z-index: 2;
+       width: 100%;
+       overflow: hidden;
+       }
+       
+.fc-event-vert .fc-event-time {
+       white-space: nowrap;
+       font-size: 10px;
+       }
+       
+.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay  */
+       position: absolute;
+       z-index: 1;
+       top: 0;
+       left: 0;
+       width: 100%;
+       height: 100%;
+       background: #fff;
+       opacity: .3;
+       filter: alpha(opacity=30);
+       }
+       
+.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */
+.fc-select-helper .fc-event-bg {
+       display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */
+       }
+       
+/* resizable */
+       
+.fc-event-vert .ui-resizable-s {
+       bottom: 0        !important; /* importants override pre jquery ui 1.7 styles */
+       width: 100%      !important;
+       height: 8px      !important;
+       overflow: hidden !important;
+       line-height: 8px !important;
+       font-size: 11px  !important;
+       font-family: monospace;
+       text-align: center;
+       cursor: s-resize;
+       }
+       
+.fc-agenda .ui-resizable-resizing { /* TODO: better selector */
+       _overflow: hidden;
+       }
+       
+       
diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js
new file mode 100644 (file)
index 0000000..779a313
--- /dev/null
@@ -0,0 +1,5224 @@
+/**
+ * @preserve
+ * FullCalendar v1.5.3
+ * http://arshaw.com/fullcalendar/
+ *
+ * Use fullcalendar.css for basic styling.
+ * For event drag & drop, requires jQuery UI draggable.
+ * For event resizing, requires jQuery UI resizable.
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+(function($, undefined) {
+
+
+var defaults = {
+
+       // display
+       defaultView: 'month',
+       aspectRatio: 1.35,
+       header: {
+               left: 'title',
+               center: '',
+               right: 'today prev,next'
+       },
+       weekends: true,
+       
+       // editing
+       //editable: false,
+       //disableDragging: false,
+       //disableResizing: false,
+       
+       allDayDefault: true,
+       ignoreTimezone: true,
+       
+       // event ajax
+       lazyFetching: true,
+       startParam: 'start',
+       endParam: 'end',
+       
+       // time formats
+       titleFormat: {
+               month: 'MMMM yyyy',
+               week: "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+               day: 'dddd, MMM d, yyyy'
+       },
+       columnFormat: {
+               month: 'ddd',
+               week: 'ddd M/d',
+               day: 'dddd M/d'
+       },
+       timeFormat: { // for event elements
+               '': 'h(:mm)t' // default
+       },
+       
+       // locale
+       isRTL: false,
+       firstDay: 0,
+       monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
+       monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
+       dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
+       dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
+       buttonText: {
+               prev: '&nbsp;&#9668;&nbsp;',
+               next: '&nbsp;&#9658;&nbsp;',
+               prevYear: '&nbsp;&lt;&lt;&nbsp;',
+               nextYear: '&nbsp;&gt;&gt;&nbsp;',
+               today: 'today',
+               month: 'month',
+               week: 'week',
+               day: 'day'
+       },
+       
+       // jquery-ui theming
+       theme: false,
+       buttonIcons: {
+               prev: 'circle-triangle-w',
+               next: 'circle-triangle-e'
+       },
+       
+       //selectable: false,
+       unselectAuto: true,
+       
+       dropAccept: '*'
+       
+};
+
+// right-to-left defaults
+var rtlDefaults = {
+       header: {
+               left: 'next,prev today',
+               center: '',
+               right: 'title'
+       },
+       buttonText: {
+               prev: '&nbsp;&#9658;&nbsp;',
+               next: '&nbsp;&#9668;&nbsp;',
+               prevYear: '&nbsp;&gt;&gt;&nbsp;',
+               nextYear: '&nbsp;&lt;&lt;&nbsp;'
+       },
+       buttonIcons: {
+               prev: 'circle-triangle-e',
+               next: 'circle-triangle-w'
+       }
+};
+
+
+
+var fc = $.fullCalendar = { version: "1.5.3" };
+var fcViews = fc.views = {};
+
+
+$.fn.fullCalendar = function(options) {
+
+
+       // method calling
+       if (typeof options == 'string') {
+               var args = Array.prototype.slice.call(arguments, 1);
+               var res;
+               this.each(function() {
+                       var calendar = $.data(this, 'fullCalendar');
+                       if (calendar && $.isFunction(calendar[options])) {
+                               var r = calendar[options].apply(calendar, args);
+                               if (res === undefined) {
+                                       res = r;
+                               }
+                               if (options == 'destroy') {
+                                       $.removeData(this, 'fullCalendar');
+                               }
+                       }
+               });
+               if (res !== undefined) {
+                       return res;
+               }
+               return this;
+       }
+       
+       
+       // would like to have this logic in EventManager, but needs to happen before options are recursively extended
+       var eventSources = options.eventSources || [];
+       delete options.eventSources;
+       if (options.events) {
+               eventSources.push(options.events);
+               delete options.events;
+       }
+       
+
+       options = $.extend(true, {},
+               defaults,
+               (options.isRTL || options.isRTL===undefined && defaults.isRTL) ? rtlDefaults : {},
+               options
+       );
+       
+       
+       this.each(function(i, _element) {
+               var element = $(_element);
+               var calendar = new Calendar(element, options, eventSources);
+               element.data('fullCalendar', calendar); // TODO: look into memory leak implications
+               calendar.render();
+       });
+       
+       
+       return this;
+       
+};
+
+
+// function for adding/overriding defaults
+function setDefaults(d) {
+       $.extend(true, defaults, d);
+}
+
+
+
+function Calendar(element, options, eventSources) {
+       var t = this;
+       
+       
+       // exports
+       t.options = options;
+       t.render = render;
+       t.destroy = destroy;
+       t.refetchEvents = refetchEvents;
+       t.reportEvents = reportEvents;
+       t.reportEventChange = reportEventChange;
+       t.rerenderEvents = rerenderEvents;
+       t.changeView = changeView;
+       t.select = select;
+       t.unselect = unselect;
+       t.prev = prev;
+       t.next = next;
+       t.prevYear = prevYear;
+       t.nextYear = nextYear;
+       t.today = today;
+       t.gotoDate = gotoDate;
+       t.incrementDate = incrementDate;
+       t.formatDate = function(format, date) { return formatDate(format, date, options) };
+       t.formatDates = function(format, date1, date2) { return formatDates(format, date1, date2, options) };
+       t.getDate = getDate;
+       t.getView = getView;
+       t.option = option;
+       t.trigger = trigger;
+       
+       
+       // imports
+       EventManager.call(t, options, eventSources);
+       var isFetchNeeded = t.isFetchNeeded;
+       var fetchEvents = t.fetchEvents;
+       
+       
+       // locals
+       var _element = element[0];
+       var header;
+       var headerElement;
+       var content;
+       var tm; // for making theme classes
+       var currentView;
+       var viewInstances = {};
+       var elementOuterWidth;
+       var suggestedViewHeight;
+       var absoluteViewElement;
+       var resizeUID = 0;
+       var ignoreWindowResize = 0;
+       var date = new Date();
+       var events = [];
+       var _dragElement;
+       
+       
+       
+       /* Main Rendering
+       -----------------------------------------------------------------------------*/
+       
+       
+       setYMD(date, options.year, options.month, options.date);
+       
+       
+       function render(inc) {
+               if (!content) {
+                       initialRender();
+               }else{
+                       calcSize();
+                       markSizesDirty();
+                       markEventsDirty();
+                       renderView(inc);
+               }
+       }
+       
+       
+       function initialRender() {
+               tm = options.theme ? 'ui' : 'fc';
+               element.addClass('fc');
+               if (options.isRTL) {
+                       element.addClass('fc-rtl');
+               }
+               if (options.theme) {
+                       element.addClass('ui-widget');
+               }
+               content = $("<div class='fc-content' style='position:relative'/>")
+                       .prependTo(element);
+               header = new Header(t, options);
+               headerElement = header.render();
+               if (headerElement) {
+                       element.prepend(headerElement);
+               }
+               changeView(options.defaultView);
+               $(window).resize(windowResize);
+               // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize
+               if (!bodyVisible()) {
+                       lateRender();
+               }
+       }
+       
+       
+       // called when we know the calendar couldn't be rendered when it was initialized,
+       // but we think it's ready now
+       function lateRender() {
+               setTimeout(function() { // IE7 needs this so dimensions are calculated correctly
+                       if (!currentView.start && bodyVisible()) { // !currentView.start makes sure this never happens more than once
+                               renderView();
+                       }
+               },0);
+       }
+       
+       
+       function destroy() {
+               $(window).unbind('resize', windowResize);
+               header.destroy();
+               content.remove();
+               element.removeClass('fc fc-rtl ui-widget');
+       }
+       
+       
+       
+       function elementVisible() {
+               return _element.offsetWidth !== 0;
+       }
+       
+       
+       function bodyVisible() {
+               return $('body')[0].offsetWidth !== 0;
+       }
+       
+       
+       
+       /* View Rendering
+       -----------------------------------------------------------------------------*/
+       
+       // TODO: improve view switching (still weird transition in IE, and FF has whiteout problem)
+       
+       function changeView(newViewName) {
+               if (!currentView || newViewName != currentView.name) {
+                       ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached
+
+                       unselect();
+                       
+                       var oldView = currentView;
+                       var newViewElement;
+                               
+                       if (oldView) {
+                               (oldView.beforeHide || noop)(); // called before changing min-height. if called after, scroll state is reset (in Opera)
+                               setMinHeight(content, content.height());
+                               oldView.element.hide();
+                       }else{
+                               setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated
+                       }
+                       content.css('overflow', 'hidden');
+                       
+                       currentView = viewInstances[newViewName];
+                       if (currentView) {
+                               currentView.element.show();
+                       }else{
+                               currentView = viewInstances[newViewName] = new fcViews[newViewName](
+                                       newViewElement = absoluteViewElement =
+                                               $("<div class='fc-view fc-view-" + newViewName + "' style='position:absolute'/>")
+                                                       .appendTo(content),
+                                       t // the calendar object
+                               );
+                       }
+                       
+                       if (oldView) {
+                               header.deactivateButton(oldView.name);
+                       }
+                       header.activateButton(newViewName);
+                       
+                       renderView(); // after height has been set, will make absoluteViewElement's position=relative, then set to null
+                       
+                       content.css('overflow', '');
+                       if (oldView) {
+                               setMinHeight(content, 1);
+                       }
+                       
+                       if (!newViewElement) {
+                               (currentView.afterShow || noop)(); // called after setting min-height/overflow, so in final scroll state (for Opera)
+                       }
+                       
+                       ignoreWindowResize--;
+               }
+       }
+       
+       
+       
+       function renderView(inc) {
+               if (elementVisible()) {
+                       ignoreWindowResize++; // because renderEvents might temporarily change the height before setSize is reached
+
+                       unselect();
+                       
+                       if (suggestedViewHeight === undefined) {
+                               calcSize();
+                       }
+                       
+                       var forceEventRender = false;
+                       if (!currentView.start || inc || date < currentView.start || date >= currentView.end) {
+                               // view must render an entire new date range (and refetch/render events)
+                               currentView.render(date, inc || 0); // responsible for clearing events
+                               setSize(true);
+                               forceEventRender = true;
+                       }
+                       else if (currentView.sizeDirty) {
+                               // view must resize (and rerender events)
+                               currentView.clearEvents();
+                               setSize();
+                               forceEventRender = true;
+                       }
+                       else if (currentView.eventsDirty) {
+                               currentView.clearEvents();
+                               forceEventRender = true;
+                       }
+                       currentView.sizeDirty = false;
+                       currentView.eventsDirty = false;
+                       updateEvents(forceEventRender);
+                       
+                       elementOuterWidth = element.outerWidth();
+                       
+                       header.updateTitle(currentView.title);
+                       var today = new Date();
+                       if (today >= currentView.start && today < currentView.end) {
+                               header.disableButton('today');
+                       }else{
+                               header.enableButton('today');
+                       }
+                       
+                       ignoreWindowResize--;
+                       currentView.trigger('viewDisplay', _element);
+               }
+       }
+       
+       
+       
+       /* Resizing
+       -----------------------------------------------------------------------------*/
+       
+       
+       function updateSize() {
+               markSizesDirty();
+               if (elementVisible()) {
+                       calcSize();
+                       setSize();
+                       unselect();
+                       currentView.clearEvents();
+                       currentView.renderEvents(events);
+                       currentView.sizeDirty = false;
+               }
+       }
+       
+       
+       function markSizesDirty() {
+               $.each(viewInstances, function(i, inst) {
+                       inst.sizeDirty = true;
+               });
+       }
+       
+       
+       function calcSize() {
+               if (options.contentHeight) {
+                       suggestedViewHeight = options.contentHeight;
+               }
+               else if (options.height) {
+                       suggestedViewHeight = options.height - (headerElement ? headerElement.height() : 0) - vsides(content);
+               }
+               else {
+                       suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5));
+               }
+       }
+       
+       
+       function setSize(dateChanged) { // todo: dateChanged?
+               ignoreWindowResize++;
+               currentView.setHeight(suggestedViewHeight, dateChanged);
+               if (absoluteViewElement) {
+                       absoluteViewElement.css('position', 'relative');
+                       absoluteViewElement = null;
+               }
+               currentView.setWidth(content.width(), dateChanged);
+               ignoreWindowResize--;
+       }
+       
+       
+       function windowResize() {
+               if (!ignoreWindowResize) {
+                       if (currentView.start) { // view has already been rendered
+                               var uid = ++resizeUID;
+                               setTimeout(function() { // add a delay
+                                       if (uid == resizeUID && !ignoreWindowResize && elementVisible()) {
+                                               if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) {
+                                                       ignoreWindowResize++; // in case the windowResize callback changes the height
+                                                       updateSize();
+                                                       currentView.trigger('windowResize', _element);
+                                                       ignoreWindowResize--;
+                                               }
+                                       }
+                               }, 200);
+                       }else{
+                               // calendar must have been initialized in a 0x0 iframe that has just been resized
+                               lateRender();
+                       }
+               }
+       }
+       
+       
+       
+       /* Event Fetching/Rendering
+       -----------------------------------------------------------------------------*/
+       
+       
+       // fetches events if necessary, rerenders events if necessary (or if forced)
+       function updateEvents(forceRender) {
+               if (!options.lazyFetching || isFetchNeeded(currentView.visStart, currentView.visEnd)) {
+                       refetchEvents();
+               }
+               else if (forceRender) {
+                       rerenderEvents();
+               }
+       }
+       
+       
+       function refetchEvents() {
+               fetchEvents(currentView.visStart, currentView.visEnd); // will call reportEvents
+       }
+       
+       
+       // called when event data arrives
+       function reportEvents(_events) {
+               events = _events;
+               rerenderEvents();
+       }
+       
+       
+       // called when a single event's data has been changed
+       function reportEventChange(eventID) {
+               rerenderEvents(eventID);
+       }
+       
+       
+       // attempts to rerenderEvents
+       function rerenderEvents(modifiedEventID) {
+               markEventsDirty();
+               if (elementVisible()) {
+                       currentView.clearEvents();
+                       currentView.renderEvents(events, modifiedEventID);
+                       currentView.eventsDirty = false;
+               }
+       }
+       
+       
+       function markEventsDirty() {
+               $.each(viewInstances, function(i, inst) {
+                       inst.eventsDirty = true;
+               });
+       }
+       
+
+
+       /* Selection
+       -----------------------------------------------------------------------------*/
+       
+
+       function select(start, end, allDay) {
+               currentView.select(start, end, allDay===undefined ? true : allDay);
+       }
+       
+
+       function unselect() { // safe to be called before renderView
+               if (currentView) {
+                       currentView.unselect();
+               }
+       }
+       
+       
+       
+       /* Date
+       -----------------------------------------------------------------------------*/
+       
+       
+       function prev() {
+               renderView(-1);
+       }
+       
+       
+       function next() {
+               renderView(1);
+       }
+       
+       
+       function prevYear() {
+               addYears(date, -1);
+               renderView();
+       }
+       
+       
+       function nextYear() {
+               addYears(date, 1);
+               renderView();
+       }
+       
+       
+       function today() {
+               date = new Date();
+               renderView();
+       }
+       
+       
+       function gotoDate(year, month, dateOfMonth) {
+               if (year instanceof Date) {
+                       date = cloneDate(year); // provided 1 argument, a Date
+               }else{
+                       setYMD(date, year, month, dateOfMonth);
+               }
+               renderView();
+       }
+       
+       
+       function incrementDate(years, months, days) {
+               if (years !== undefined) {
+                       addYears(date, years);
+               }
+               if (months !== undefined) {
+                       addMonths(date, months);
+               }
+               if (days !== undefined) {
+                       addDays(date, days);
+               }
+               renderView();
+       }
+       
+       
+       function getDate() {
+               return cloneDate(date);
+       }
+       
+       
+       
+       /* Misc
+       -----------------------------------------------------------------------------*/
+       
+       
+       function getView() {
+               return currentView;
+       }
+       
+       
+       function option(name, value) {
+               if (value === undefined) {
+                       return options[name];
+               }
+               if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') {
+                       options[name] = value;
+                       updateSize();
+               }
+       }
+       
+       
+       function trigger(name, thisObj) {
+               if (options[name]) {
+                       return options[name].apply(
+                               thisObj || _element,
+                               Array.prototype.slice.call(arguments, 2)
+                       );
+               }
+       }
+       
+       
+       
+       /* External Dragging
+       ------------------------------------------------------------------------*/
+       
+       if (options.droppable) {
+               $(document)
+                       .bind('dragstart', function(ev, ui) {
+                               var _e = ev.target;
+                               var e = $(_e);
+                               if (!e.parents('.fc').length) { // not already inside a calendar
+                                       var accept = options.dropAccept;
+                                       if ($.isFunction(accept) ? accept.call(_e, e) : e.is(accept)) {
+                                               _dragElement = _e;
+                                               currentView.dragStart(_dragElement, ev, ui);
+                                       }
+                               }
+                       })
+                       .bind('dragstop', function(ev, ui) {
+                               if (_dragElement) {
+                                       currentView.dragStop(_dragElement, ev, ui);
+                                       _dragElement = null;
+                               }
+                       });
+       }
+       
+
+}
+
+function Header(calendar, options) {
+       var t = this;
+       
+       
+       // exports
+       t.render = render;
+       t.destroy = destroy;
+       t.updateTitle = updateTitle;
+       t.activateButton = activateButton;
+       t.deactivateButton = deactivateButton;
+       t.disableButton = disableButton;
+       t.enableButton = enableButton;
+       
+       
+       // locals
+       var element = $([]);
+       var tm;
+       
+
+
+       function render() {
+               tm = options.theme ? 'ui' : 'fc';
+               var sections = options.header;
+               if (sections) {
+                       element = $("<table class='fc-header' style='width:100%'/>")
+                               .append(
+                                       $("<tr/>")
+                                               .append(renderSection('left'))
+                                               .append(renderSection('center'))
+                                               .append(renderSection('right'))
+                               );
+                       return element;
+               }
+       }
+       
+       
+       function destroy() {
+               element.remove();
+       }
+       
+       
+       function renderSection(position) {
+               var e = $("<td class='fc-header-" + position + "'/>");
+               var buttonStr = options.header[position];
+               if (buttonStr) {
+                       $.each(buttonStr.split(' '), function(i) {
+                               if (i > 0) {
+                                       e.append("<span class='fc-header-space'/>");
+                               }
+                               var prevButton;
+                               $.each(this.split(','), function(j, buttonName) {
+                                       if (buttonName == 'title') {
+                                               e.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>");
+                                               if (prevButton) {
+                                                       prevButton.addClass(tm + '-corner-right');
+                                               }
+                                               prevButton = null;
+                                       }else{
+                                               var buttonClick;
+                                               if (calendar[buttonName]) {
+                                                       buttonClick = calendar[buttonName]; // calendar method
+                                               }
+                                               else if (fcViews[buttonName]) {
+                                                       buttonClick = function() {
+                                                               button.removeClass(tm + '-state-hover'); // forget why
+                                                               calendar.changeView(buttonName);
+                                                       };
+                                               }
+                                               if (buttonClick) {
+                                                       var icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null; // why are we using smartProperty here?
+                                                       var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here?
+                                                       var button = $(
+                                                               "<span class='fc-button fc-button-" + buttonName + " " + tm + "-state-default'>" +
+                                                                       "<span class='fc-button-inner'>" +
+                                                                               "<span class='fc-button-content'>" +
+                                                                                       (icon ?
+                                                                                               "<span class='fc-icon-wrap'>" +
+                                                                                                       "<span class='ui-icon ui-icon-" + icon + "'/>" +
+                                                                                               "</span>" :
+                                                                                               text
+                                                                                               ) +
+                                                                               "</span>" +
+                                                                               "<span class='fc-button-effect'><span></span></span>" +
+                                                                       "</span>" +
+                                                               "</span>"
+                                                       );
+                                                       if (button) {
+                                                               button
+                                                                       .click(function() {
+                                                                               if (!button.hasClass(tm + '-state-disabled')) {
+                                                                                       buttonClick();
+                                                                               }
+                                                                       })
+                                                                       .mousedown(function() {
+                                                                               button
+                                                                                       .not('.' + tm + '-state-active')
+                                                                                       .not('.' + tm + '-state-disabled')
+                                                                                       .addClass(tm + '-state-down');
+                                                                       })
+                                                                       .mouseup(function() {
+                                                                               button.removeClass(tm + '-state-down');
+                                                                       })
+                                                                       .hover(
+                                                                               function() {
+                                                                                       button
+                                                                                               .not('.' + tm + '-state-active')
+                                                                                               .not('.' + tm + '-state-disabled')
+                                                                                               .addClass(tm + '-state-hover');
+                                                                               },
+                                                                               function() {
+                                                                                       button
+                                                                                               .removeClass(tm + '-state-hover')
+                                                                                               .removeClass(tm + '-state-down');
+                                                                               }
+                                                                       )
+                                                                       .appendTo(e);
+                                                               if (!prevButton) {
+                                                                       button.addClass(tm + '-corner-left');
+                                                               }
+                                                               prevButton = button;
+                                                       }
+                                               }
+                                       }
+                               });
+                               if (prevButton) {
+                                       prevButton.addClass(tm + '-corner-right');
+                               }
+                       });
+               }
+               return e;
+       }
+       
+       
+       function updateTitle(html) {
+               element.find('h2')
+                       .html(html);
+       }
+       
+       
+       function activateButton(buttonName) {
+               element.find('span.fc-button-' + buttonName)
+                       .addClass(tm + '-state-active');
+       }
+       
+       
+       function deactivateButton(buttonName) {
+               element.find('span.fc-button-' + buttonName)
+                       .removeClass(tm + '-state-active');
+       }
+       
+       
+       function disableButton(buttonName) {
+               element.find('span.fc-button-' + buttonName)
+                       .addClass(tm + '-state-disabled');
+       }
+       
+       
+       function enableButton(buttonName) {
+               element.find('span.fc-button-' + buttonName)
+                       .removeClass(tm + '-state-disabled');
+       }
+
+
+}
+
+fc.sourceNormalizers = [];
+fc.sourceFetchers = [];
+
+var ajaxDefaults = {
+       dataType: 'json',
+       cache: false
+};
+
+var eventGUID = 1;
+
+
+function EventManager(options, _sources) {
+       var t = this;
+       
+       
+       // exports
+       t.isFetchNeeded = isFetchNeeded;
+       t.fetchEvents = fetchEvents;
+       t.addEventSource = addEventSource;
+       t.removeEventSource = removeEventSource;
+       t.updateEvent = updateEvent;
+       t.renderEvent = renderEvent;
+       t.removeEvents = removeEvents;
+       t.clientEvents = clientEvents;
+       t.normalizeEvent = normalizeEvent;
+       
+       
+       // imports
+       var trigger = t.trigger;
+       var getView = t.getView;
+       var reportEvents = t.reportEvents;
+       
+       
+       // locals
+       var stickySource = { events: [] };
+       var sources = [ stickySource ];
+       var rangeStart, rangeEnd;
+       var currentFetchID = 0;
+       var pendingSourceCnt = 0;
+       var loadingLevel = 0;
+       var cache = [];
+       
+       
+       for (var i=0; i<_sources.length; i++) {
+               _addEventSource(_sources[i]);
+       }
+       
+       
+       
+       /* Fetching
+       -----------------------------------------------------------------------------*/
+       
+       
+       function isFetchNeeded(start, end) {
+               return !rangeStart || start < rangeStart || end > rangeEnd;
+       }
+       
+       
+       function fetchEvents(start, end) {
+               rangeStart = start;
+               rangeEnd = end;
+               cache = [];
+               var fetchID = ++currentFetchID;
+               var len = sources.length;
+               pendingSourceCnt = len;
+               for (var i=0; i<len; i++) {
+                       fetchEventSource(sources[i], fetchID);
+               }
+       }
+       
+       
+       function fetchEventSource(source, fetchID) {
+               _fetchEventSource(source, function(events) {
+                       if (fetchID == currentFetchID) {
+                               if (events) {
+                                       for (var i=0; i<events.length; i++) {
+                                               events[i].source = source;
+                                               normalizeEvent(events[i]);
+                                       }
+                                       cache = cache.concat(events);
+                               }
+                               pendingSourceCnt--;
+                               if (!pendingSourceCnt) {
+                                       reportEvents(cache);
+                               }
+                       }
+               });
+       }
+       
+       
+       function _fetchEventSource(source, callback) {
+               var i;
+               var fetchers = fc.sourceFetchers;
+               var res;
+               for (i=0; i<fetchers.length; i++) {
+                       res = fetchers[i](source, rangeStart, rangeEnd, callback);
+                       if (res === true) {
+                               // the fetcher is in charge. made its own async request
+                               return;
+                       }
+                       else if (typeof res == 'object') {
+                               // the fetcher returned a new source. process it
+                               _fetchEventSource(res, callback);
+                               return;
+                       }
+               }
+               var events = source.events;
+               if (events) {
+                       if ($.isFunction(events)) {
+                               pushLoading();
+                               events(cloneDate(rangeStart), cloneDate(rangeEnd), function(events) {
+                                       callback(events);
+                                       popLoading();
+                               });
+                       }
+                       else if ($.isArray(events)) {
+                               callback(events);
+                       }
+                       else {
+                               callback();
+                       }
+               }else{
+                       var url = source.url;
+                       if (url) {
+                               var success = source.success;
+                               var error = source.error;
+                               var complete = source.complete;
+                               var data = $.extend({}, source.data || {});
+                               var startParam = firstDefined(source.startParam, options.startParam);
+                               var endParam = firstDefined(source.endParam, options.endParam);
+                               if (startParam) {
+                                       data[startParam] = Math.round(+rangeStart / 1000);
+                               }
+                               if (endParam) {
+                                       data[endParam] = Math.round(+rangeEnd / 1000);
+                               }
+                               pushLoading();
+                               $.ajax($.extend({}, ajaxDefaults, source, {
+                                       data: data,
+                                       success: function(events) {
+                                               events = events || [];
+                                               var res = applyAll(success, this, arguments);
+                                               if ($.isArray(res)) {
+                                                       events = res;
+                                               }
+                                               callback(events);
+                                       },
+                                       error: function() {
+                                               applyAll(error, this, arguments);
+                                               callback();
+                                       },
+                                       complete: function() {
+                                               applyAll(complete, this, arguments);
+                                               popLoading();
+                                       }
+                               }));
+                       }else{
+                               callback();
+                       }
+               }
+       }
+       
+       
+       
+       /* Sources
+       -----------------------------------------------------------------------------*/
+       
+
+       function addEventSource(source) {
+               source = _addEventSource(source);
+               if (source) {
+                       pendingSourceCnt++;
+                       fetchEventSource(source, currentFetchID); // will eventually call reportEvents
+               }
+       }
+       
+       
+       function _addEventSource(source) {
+               if ($.isFunction(source) || $.isArray(source)) {
+                       source = { events: source };
+               }
+               else if (typeof source == 'string') {
+                       source = { url: source };
+               }
+               if (typeof source == 'object') {
+                       normalizeSource(source);
+                       sources.push(source);
+                       return source;
+               }
+       }
+       
+
+       function removeEventSource(source) {
+               sources = $.grep(sources, function(src) {
+                       return !isSourcesEqual(src, source);
+               });
+               // remove all client events from that source
+               cache = $.grep(cache, function(e) {
+                       return !isSourcesEqual(e.source, source);
+               });
+               reportEvents(cache);
+       }
+       
+       
+       
+       /* Manipulation
+       -----------------------------------------------------------------------------*/
+       
+       
+       function updateEvent(event) { // update an existing event
+               var i, len = cache.length, e,
+                       defaultEventEnd = getView().defaultEventEnd, // getView???
+                       startDelta = event.start - event._start,
+                       endDelta = event.end ?
+                               (event.end - (event._end || defaultEventEnd(event))) // event._end would be null if event.end
+                               : 0;                                                      // was null and event was just resized
+               for (i=0; i<len; i++) {
+                       e = cache[i];
+                       if (e._id == event._id && e != event) {
+                               e.start = new Date(+e.start + startDelta);
+                               if (event.end) {
+                                       if (e.end) {
+                                               e.end = new Date(+e.end + endDelta);
+                                       }else{
+                                               e.end = new Date(+defaultEventEnd(e) + endDelta);
+                                       }
+                               }else{
+                                       e.end = null;
+                               }
+                               e.title = event.title;
+                               e.url = event.url;
+                               e.allDay = event.allDay;
+                               e.className = event.className;
+                               e.editable = event.editable;
+                               e.color = event.color;
+                               e.backgroudColor = event.backgroudColor;
+                               e.borderColor = event.borderColor;
+                               e.textColor = event.textColor;
+                               normalizeEvent(e);
+                       }
+               }
+               normalizeEvent(event);
+               reportEvents(cache);
+       }
+       
+       
+       function renderEvent(event, stick) {
+               normalizeEvent(event);
+               if (!event.source) {
+                       if (stick) {
+                               stickySource.events.push(event);
+                               event.source = stickySource;
+                       }
+                       cache.push(event);
+               }
+               reportEvents(cache);
+       }
+       
+       
+       function removeEvents(filter) {
+               if (!filter) { // remove all
+                       cache = [];
+                       // clear all array sources
+                       for (var i=0; i<sources.length; i++) {
+                               if ($.isArray(sources[i].events)) {
+                                       sources[i].events = [];
+                               }
+                       }
+               }else{
+                       if (!$.isFunction(filter)) { // an event ID
+                               var id = filter + '';
+                               filter = function(e) {
+                                       return e._id == id;
+                               };
+                       }
+                       cache = $.grep(cache, filter, true);
+                       // remove events from array sources
+                       for (var i=0; i<sources.length; i++) {
+                               if ($.isArray(sources[i].events)) {
+                                       sources[i].events = $.grep(sources[i].events, filter, true);
+                               }
+                       }
+               }
+               reportEvents(cache);
+       }
+       
+       
+       function clientEvents(filter) {
+               if ($.isFunction(filter)) {
+                       return $.grep(cache, filter);
+               }
+               else if (filter) { // an event ID
+                       filter += '';
+                       return $.grep(cache, function(e) {
+                               return e._id == filter;
+                       });
+               }
+               return cache; // else, return all
+       }
+       
+       
+       
+       /* Loading State
+       -----------------------------------------------------------------------------*/
+       
+       
+       function pushLoading() {
+               if (!loadingLevel++) {
+                       trigger('loading', null, true);
+               }
+       }
+       
+       
+       function popLoading() {
+               if (!--loadingLevel) {
+                       trigger('loading', null, false);
+               }
+       }
+       
+       
+       
+       /* Event Normalization
+       -----------------------------------------------------------------------------*/
+       
+       
+       function normalizeEvent(event) {
+               var source = event.source || {};
+               var ignoreTimezone = firstDefined(source.ignoreTimezone, options.ignoreTimezone);
+               event._id = event._id || (event.id === undefined ? '_fc' + eventGUID++ : event.id + '');
+               if (event.date) {
+                       if (!event.start) {
+                               event.start = event.date;
+                       }
+                       delete event.date;
+               }
+               event._start = cloneDate(event.start = parseDate(event.start, ignoreTimezone));
+               event.end = parseDate(event.end, ignoreTimezone);
+               if (event.end && event.end <= event.start) {
+                       event.end = null;
+               }
+               event._end = event.end ? cloneDate(event.end) : null;
+               if (event.allDay === undefined) {
+                       event.allDay = firstDefined(source.allDayDefault, options.allDayDefault);
+               }
+               if (event.className) {
+                       if (typeof event.className == 'string') {
+                               event.className = event.className.split(/\s+/);
+                       }
+               }else{
+                       event.className = [];
+               }
+               // TODO: if there is no start date, return false to indicate an invalid event
+       }
+       
+       
+       
+       /* Utils
+       ------------------------------------------------------------------------------*/
+       
+       
+       function normalizeSource(source) {
+               if (source.className) {
+                       // TODO: repeat code, same code for event classNames
+                       if (typeof source.className == 'string') {
+                               source.className = source.className.split(/\s+/);
+                       }
+               }else{
+                       source.className = [];
+               }
+               var normalizers = fc.sourceNormalizers;
+               for (var i=0; i<normalizers.length; i++) {
+                       normalizers[i](source);
+               }
+       }
+       
+       
+       function isSourcesEqual(source1, source2) {
+               return source1 && source2 && getSourcePrimitive(source1) == getSourcePrimitive(source2);
+       }
+       
+       
+       function getSourcePrimitive(source) {
+               return ((typeof source == 'object') ? (source.events || source.url) : '') || source;
+       }
+
+
+}
+
+
+fc.addDays = addDays;
+fc.cloneDate = cloneDate;
+fc.parseDate = parseDate;
+fc.parseISO8601 = parseISO8601;
+fc.parseTime = parseTime;
+fc.formatDate = formatDate;
+fc.formatDates = formatDates;
+
+
+
+/* Date Math
+-----------------------------------------------------------------------------*/
+
+var dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],
+       DAY_MS = 86400000,
+       HOUR_MS = 3600000,
+       MINUTE_MS = 60000;
+       
+
+function addYears(d, n, keepTime) {
+       d.setFullYear(d.getFullYear() + n);
+       if (!keepTime) {
+               clearTime(d);
+       }
+       return d;
+}
+
+
+function addMonths(d, n, keepTime) { // prevents day overflow/underflow
+       if (+d) { // prevent infinite looping on invalid dates
+               var m = d.getMonth() + n,
+                       check = cloneDate(d);
+               check.setDate(1);
+               check.setMonth(m);
+               d.setMonth(m);
+               if (!keepTime) {
+                       clearTime(d);
+               }
+               while (d.getMonth() != check.getMonth()) {
+                       d.setDate(d.getDate() + (d < check ? 1 : -1));
+               }
+       }
+       return d;
+}
+
+
+function addDays(d, n, keepTime) { // deals with daylight savings
+       if (+d) {
+               var dd = d.getDate() + n,
+                       check = cloneDate(d);
+               check.setHours(9); // set to middle of day
+               check.setDate(dd);
+               d.setDate(dd);
+               if (!keepTime) {
+                       clearTime(d);
+               }
+               fixDate(d, check);
+       }
+       return d;
+}
+
+
+function fixDate(d, check) { // force d to be on check's YMD, for daylight savings purposes
+       if (+d) { // prevent infinite looping on invalid dates
+               while (d.getDate() != check.getDate()) {
+                       d.setTime(+d + (d < check ? 1 : -1) * HOUR_MS);
+               }
+       }
+}
+
+
+function addMinutes(d, n) {
+       d.setMinutes(d.getMinutes() + n);
+       return d;
+}
+
+
+function clearTime(d) {
+       d.setHours(0);
+       d.setMinutes(0);
+       d.setSeconds(0); 
+       d.setMilliseconds(0);
+       return d;
+}
+
+
+function cloneDate(d, dontKeepTime) {
+       if (dontKeepTime) {
+               return clearTime(new Date(+d));
+       }
+       return new Date(+d);
+}
+
+
+function zeroDate() { // returns a Date with time 00:00:00 and dateOfMonth=1
+       var i=0, d;
+       do {
+               d = new Date(1970, i++, 1);
+       } while (d.getHours()); // != 0
+       return d;
+}
+
+
+function skipWeekend(date, inc, excl) {
+       inc = inc || 1;
+       while (!date.getDay() || (excl && date.getDay()==1 || !excl && date.getDay()==6)) {
+               addDays(date, inc);
+       }
+       return date;
+}
+
+
+function dayDiff(d1, d2) { // d1 - d2
+       return Math.round((cloneDate(d1, true) - cloneDate(d2, true)) / DAY_MS);
+}
+
+
+function setYMD(date, y, m, d) {
+       if (y !== undefined && y != date.getFullYear()) {
+               date.setDate(1);
+               date.setMonth(0);
+               date.setFullYear(y);
+       }
+       if (m !== undefined && m != date.getMonth()) {
+               date.setDate(1);
+               date.setMonth(m);
+       }
+       if (d !== undefined) {
+               date.setDate(d);
+       }
+}
+
+
+
+/* Date Parsing
+-----------------------------------------------------------------------------*/
+
+
+function parseDate(s, ignoreTimezone) { // ignoreTimezone defaults to true
+       if (typeof s == 'object') { // already a Date object
+               return s;
+       }
+       if (typeof s == 'number') { // a UNIX timestamp
+               return new Date(s * 1000);
+       }
+       if (typeof s == 'string') {
+               if (s.match(/^\d+(\.\d+)?$/)) { // a UNIX timestamp
+                       return new Date(parseFloat(s) * 1000);
+               }
+               if (ignoreTimezone === undefined) {
+                       ignoreTimezone = true;
+               }
+               return parseISO8601(s, ignoreTimezone) || (s ? new Date(s) : null);
+       }
+       // TODO: never return invalid dates (like from new Date(<string>)), return null instead
+       return null;
+}
+
+
+function parseISO8601(s, ignoreTimezone) { // ignoreTimezone defaults to false
+       // derived from http://delete.me.uk/2005/03/iso8601.html
+       // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
+       var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);
+       if (!m) {
+               return null;
+       }
+       var date = new Date(m[1], 0, 1);
+       if (ignoreTimezone || !m[13]) {
+               var check = new Date(m[1], 0, 1, 9, 0);
+               if (m[3]) {
+                       date.setMonth(m[3] - 1);
+                       check.setMonth(m[3] - 1);
+               }
+               if (m[5]) {
+                       date.setDate(m[5]);
+                       check.setDate(m[5]);
+               }
+               fixDate(date, check);
+               if (m[7]) {
+                       date.setHours(m[7]);
+               }
+               if (m[8]) {
+                       date.setMinutes(m[8]);
+               }
+               if (m[10]) {
+                       date.setSeconds(m[10]);
+               }
+               if (m[12]) {
+                       date.setMilliseconds(Number("0." + m[12]) * 1000);
+               }
+               fixDate(date, check);
+       }else{
+               date.setUTCFullYear(
+                       m[1],
+                       m[3] ? m[3] - 1 : 0,
+                       m[5] || 1
+               );
+               date.setUTCHours(
+                       m[7] || 0,
+                       m[8] || 0,
+                       m[10] || 0,
+                       m[12] ? Number("0." + m[12]) * 1000 : 0
+               );
+               if (m[14]) {
+                       var offset = Number(m[16]) * 60 + (m[18] ? Number(m[18]) : 0);
+                       offset *= m[15] == '-' ? 1 : -1;
+                       date = new Date(+date + (offset * 60 * 1000));
+               }
+       }
+       return date;
+}
+
+
+function parseTime(s) { // returns minutes since start of day
+       if (typeof s == 'number') { // an hour
+               return s * 60;
+       }
+       if (typeof s == 'object') { // a Date object
+               return s.getHours() * 60 + s.getMinutes();
+       }
+       var m = s.match(/(\d+)(?::(\d+))?\s*(\w+)?/);
+       if (m) {
+               var h = parseInt(m[1], 10);
+               if (m[3]) {
+                       h %= 12;
+                       if (m[3].toLowerCase().charAt(0) == 'p') {
+                               h += 12;
+                       }
+               }
+               return h * 60 + (m[2] ? parseInt(m[2], 10) : 0);
+       }
+}
+
+
+
+/* Date Formatting
+-----------------------------------------------------------------------------*/
+// TODO: use same function formatDate(date, [date2], format, [options])
+
+
+function formatDate(date, format, options) {
+       return formatDates(date, null, format, options);
+}
+
+
+function formatDates(date1, date2, format, options) {
+       options = options || defaults;
+       var date = date1,
+               otherDate = date2,
+               i, len = format.length, c,
+               i2, formatter,
+               res = '';
+       for (i=0; i<len; i++) {
+               c = format.charAt(i);
+               if (c == "'") {
+                       for (i2=i+1; i2<len; i2++) {
+                               if (format.charAt(i2) == "'") {
+                                       if (date) {
+                                               if (i2 == i+1) {
+                                                       res += "'";
+                                               }else{
+                                                       res += format.substring(i+1, i2);
+                                               }
+                                               i = i2;
+                                       }
+                                       break;
+                               }
+                       }
+               }
+               else if (c == '(') {
+                       for (i2=i+1; i2<len; i2++) {
+                               if (format.charAt(i2) == ')') {
+                                       var subres = formatDate(date, format.substring(i+1, i2), options);
+                                       if (parseInt(subres.replace(/\D/, ''), 10)) {
+                                               res += subres;
+                                       }
+                                       i = i2;
+                                       break;
+                               }
+                       }
+               }
+               else if (c == '[') {
+                       for (i2=i+1; i2<len; i2++) {
+                               if (format.charAt(i2) == ']') {
+                                       var subformat = format.substring(i+1, i2);
+                                       var subres = formatDate(date, subformat, options);
+                                       if (subres != formatDate(otherDate, subformat, options)) {
+                                               res += subres;
+                                       }
+                                       i = i2;
+                                       break;
+                               }
+                       }
+               }
+               else if (c == '{') {
+                       date = date2;
+                       otherDate = date1;
+               }
+               else if (c == '}') {
+                       date = date1;
+                       otherDate = date2;
+               }
+               else {
+                       for (i2=len; i2>i; i2--) {
+                               if (formatter = dateFormatters[format.substring(i, i2)]) {
+                                       if (date) {
+                                               res += formatter(date, options);
+                                       }
+                                       i = i2 - 1;
+                                       break;
+                               }
+                       }
+                       if (i2 == i) {
+                               if (date) {
+                                       res += c;
+                               }
+                       }
+               }
+       }
+       return res;
+};
+
+
+var dateFormatters = {
+       s       : function(d)   { return d.getSeconds() },
+       ss      : function(d)   { return zeroPad(d.getSeconds()) },
+       m       : function(d)   { return d.getMinutes() },
+       mm      : function(d)   { return zeroPad(d.getMinutes()) },
+       h       : function(d)   { return d.getHours() % 12 || 12 },
+       hh      : function(d)   { return zeroPad(d.getHours() % 12 || 12) },
+       H       : function(d)   { return d.getHours() },
+       HH      : function(d)   { return zeroPad(d.getHours()) },
+       d       : function(d)   { return d.getDate() },
+       dd      : function(d)   { return zeroPad(d.getDate()) },
+       ddd     : function(d,o) { return o.dayNamesShort[d.getDay()] },
+       dddd: function(d,o)     { return o.dayNames[d.getDay()] },
+       M       : function(d)   { return d.getMonth() + 1 },
+       MM      : function(d)   { return zeroPad(d.getMonth() + 1) },
+       MMM     : function(d,o) { return o.monthNamesShort[d.getMonth()] },
+       MMMM: function(d,o)     { return o.monthNames[d.getMonth()] },
+       yy      : function(d)   { return (d.getFullYear()+'').substring(2) },
+       yyyy: function(d)       { return d.getFullYear() },
+       t       : function(d)   { return d.getHours() < 12 ? 'a' : 'p' },
+       tt      : function(d)   { return d.getHours() < 12 ? 'am' : 'pm' },
+       T       : function(d)   { return d.getHours() < 12 ? 'A' : 'P' },
+       TT      : function(d)   { return d.getHours() < 12 ? 'AM' : 'PM' },
+       u       : function(d)   { return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") },
+       S       : function(d)   {
+               var date = d.getDate();
+               if (date > 10 && date < 20) {
+                       return 'th';
+               }
+               return ['st', 'nd', 'rd'][date%10-1] || 'th';
+       }
+};
+
+
+
+fc.applyAll = applyAll;
+
+
+/* Event Date Math
+-----------------------------------------------------------------------------*/
+
+
+function exclEndDay(event) {
+       if (event.end) {
+               return _exclEndDay(event.end, event.allDay);
+       }else{
+               return addDays(cloneDate(event.start), 1);
+       }
+}
+
+
+function _exclEndDay(end, allDay) {
+       end = cloneDate(end);
+       return allDay || end.getHours() || end.getMinutes() ? addDays(end, 1) : clearTime(end);
+}
+
+
+function segCmp(a, b) {
+       return (b.msLength - a.msLength) * 100 + (a.event.start - b.event.start);
+}
+
+
+function segsCollide(seg1, seg2) {
+       return seg1.end > seg2.start && seg1.start < seg2.end;
+}
+
+
+
+/* Event Sorting
+-----------------------------------------------------------------------------*/
+
+
+// event rendering utilities
+function sliceSegs(events, visEventEnds, start, end) {
+       var segs = [],
+               i, len=events.length, event,
+               eventStart, eventEnd,
+               segStart, segEnd,
+               isStart, isEnd;
+       for (i=0; i<len; i++) {
+               event = events[i];
+               eventStart = event.start;
+               eventEnd = visEventEnds[i];
+               if (eventEnd > start && eventStart < end) {
+                       if (eventStart < start) {
+                               segStart = cloneDate(start);
+                               isStart = false;
+                       }else{
+                               segStart = eventStart;
+                               isStart = true;
+                       }
+                       if (eventEnd > end) {
+                               segEnd = cloneDate(end);
+                               isEnd = false;
+                       }else{
+                               segEnd = eventEnd;
+                               isEnd = true;
+                       }
+                       segs.push({
+                               event: event,
+                               start: segStart,
+                               end: segEnd,
+                               isStart: isStart,
+                               isEnd: isEnd,
+                               msLength: segEnd - segStart
+                       });
+               }
+       } 
+       return segs.sort(segCmp);
+}
+
+
+// event rendering calculation utilities
+function stackSegs(segs) {
+       var levels = [],
+               i, len = segs.length, seg,
+               j, collide, k;
+       for (i=0; i<len; i++) {
+               seg = segs[i];
+               j = 0; // the level index where seg should belong
+               while (true) {
+                       collide = false;
+                       if (levels[j]) {
+                               for (k=0; k<levels[j].length; k++) {
+                                       if (segsCollide(levels[j][k], seg)) {
+                                               collide = true;
+                                               break;
+                                       }
+                               }
+                       }
+                       if (collide) {
+                               j++;
+                       }else{
+                               break;
+                       }
+               }
+               if (levels[j]) {
+                       levels[j].push(seg);
+               }else{
+                       levels[j] = [seg];
+               }
+       }
+       return levels;
+}
+
+
+
+/* Event Element Binding
+-----------------------------------------------------------------------------*/
+
+
+function lazySegBind(container, segs, bindHandlers) {
+       container.unbind('mouseover').mouseover(function(ev) {
+               var parent=ev.target, e,
+                       i, seg;
+               while (parent != this) {
+                       e = parent;
+                       parent = parent.parentNode;
+               }
+               if ((i = e._fci) !== undefined) {
+                       e._fci = undefined;
+                       seg = segs[i];
+                       bindHandlers(seg.event, seg.element, seg);
+                       $(ev.target).trigger(ev);
+               }
+               ev.stopPropagation();
+       });
+}
+
+
+
+/* Element Dimensions
+-----------------------------------------------------------------------------*/
+
+
+function setOuterWidth(element, width, includeMargins) {
+       for (var i=0, e; i<element.length; i++) {
+               e = $(element[i]);
+               e.width(Math.max(0, width - hsides(e, includeMargins)));
+       }
+}
+
+
+function setOuterHeight(element, height, includeMargins) {
+       for (var i=0, e; i<element.length; i++) {
+               e = $(element[i]);
+               e.height(Math.max(0, height - vsides(e, includeMargins)));
+       }
+}
+
+
+// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010)
+
+
+function hsides(element, includeMargins) {
+       return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
+}
+
+
+function hpadding(element) {
+       return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) +
+              (parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0);
+}
+
+
+function hmargins(element) {
+       return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) +
+              (parseFloat($.curCSS(element[0], 'marginRight', true)) || 0);
+}
+
+
+function hborders(element) {
+       return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) +
+              (parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0);
+}
+
+
+function vsides(element, includeMargins) {
+       return vpadding(element) +  vborders(element) + (includeMargins ? vmargins(element) : 0);
+}
+
+
+function vpadding(element) {
+       return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) +
+              (parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0);
+}
+
+
+function vmargins(element) {
+       return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) +
+              (parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0);
+}
+
+
+function vborders(element) {
+       return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) +
+              (parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0);
+}
+
+
+function setMinHeight(element, height) {
+       height = (typeof height == 'number' ? height + 'px' : height);
+       element.each(function(i, _element) {
+               _element.style.cssText += ';min-height:' + height + ';_height:' + height;
+               // why can't we just use .css() ? i forget
+       });
+}
+
+
+
+/* Misc Utils
+-----------------------------------------------------------------------------*/
+
+
+//TODO: arraySlice
+//TODO: isFunction, grep ?
+
+
+function noop() { }
+
+
+function cmp(a, b) {
+       return a - b;
+}
+
+
+function arrayMax(a) {
+       return Math.max.apply(Math, a);
+}
+
+
+function zeroPad(n) {
+       return (n < 10 ? '0' : '') + n;
+}
+
+
+function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object
+       if (obj[name] !== undefined) {
+               return obj[name];
+       }
+       var parts = name.split(/(?=[A-Z])/),
+               i=parts.length-1, res;
+       for (; i>=0; i--) {
+               res = obj[parts[i].toLowerCase()];
+               if (res !== undefined) {
+                       return res;
+               }
+       }
+       return obj[''];
+}
+
+
+function htmlEscape(s) {
+       return s.replace(/&/g, '&amp;')
+               .replace(/</g, '&lt;')
+               .replace(/>/g, '&gt;')
+               .replace(/'/g, '&#039;')
+               .replace(/"/g, '&quot;')
+               .replace(/\n/g, '<br />');
+}
+
+
+function cssKey(_element) {
+       return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, '');
+}
+
+
+function disableTextSelection(element) {
+       element
+               .attr('unselectable', 'on')
+               .css('MozUserSelect', 'none')
+               .bind('selectstart.ui', function() { return false; });
+}
+
+
+/*
+function enableTextSelection(element) {
+       element
+               .attr('unselectable', 'off')
+               .css('MozUserSelect', '')
+               .unbind('selectstart.ui');
+}
+*/
+
+
+function markFirstLast(e) {
+       e.children()
+               .removeClass('fc-first fc-last')
+               .filter(':first-child')
+                       .addClass('fc-first')
+               .end()
+               .filter(':last-child')
+                       .addClass('fc-last');
+}
+
+
+function setDayID(cell, date) {
+       cell.each(function(i, _cell) {
+               _cell.className = _cell.className.replace(/^fc-\w*/, 'fc-' + dayIDs[date.getDay()]);
+               // TODO: make a way that doesn't rely on order of classes
+       });
+}
+
+
+function getSkinCss(event, opt) {
+       var source = event.source || {};
+       var eventColor = event.color;
+       var sourceColor = source.color;
+       var optionColor = opt('eventColor');
+       var backgroundColor =
+               event.backgroundColor ||
+               eventColor ||
+               source.backgroundColor ||
+               sourceColor ||
+               opt('eventBackgroundColor') ||
+               optionColor;
+       var borderColor =
+               event.borderColor ||
+               eventColor ||
+               source.borderColor ||
+               sourceColor ||
+               opt('eventBorderColor') ||
+               optionColor;
+       var textColor =
+               event.textColor ||
+               source.textColor ||
+               opt('eventTextColor');
+       var statements = [];
+       if (backgroundColor) {
+               statements.push('background-color:' + backgroundColor);
+       }
+       if (borderColor) {
+               statements.push('border-color:' + borderColor);
+       }
+       if (textColor) {
+               statements.push('color:' + textColor);
+       }
+       return statements.join(';');
+}
+
+
+function applyAll(functions, thisObj, args) {
+       if ($.isFunction(functions)) {
+               functions = [ functions ];
+       }
+       if (functions) {
+               var i;
+               var ret;
+               for (i=0; i<functions.length; i++) {
+                       ret = functions[i].apply(thisObj, args) || ret;
+               }
+               return ret;
+       }
+}
+
+
+function firstDefined() {
+       for (var i=0; i<arguments.length; i++) {
+               if (arguments[i] !== undefined) {
+                       return arguments[i];
+               }
+       }
+}
+
+
+
+fcViews.month = MonthView;
+
+function MonthView(element, calendar) {
+       var t = this;
+       
+       
+       // exports
+       t.render = render;
+       
+       
+       // imports
+       BasicView.call(t, element, calendar, 'month');
+       var opt = t.opt;
+       var renderBasic = t.renderBasic;
+       var formatDate = calendar.formatDate;
+       
+       
+       
+       function render(date, delta) {
+               if (delta) {
+                       addMonths(date, delta);
+                       date.setDate(1);
+               }
+               var start = cloneDate(date, true);
+               start.setDate(1);
+               var end = addMonths(cloneDate(start), 1);
+               var visStart = cloneDate(start);
+               var visEnd = cloneDate(end);
+               var firstDay = opt('firstDay');
+               var nwe = opt('weekends') ? 0 : 1;
+               if (nwe) {
+                       skipWeekend(visStart);
+                       skipWeekend(visEnd, -1, true);
+               }
+               addDays(visStart, -((visStart.getDay() - Math.max(firstDay, nwe) + 7) % 7));
+               addDays(visEnd, (7 - visEnd.getDay() + Math.max(firstDay, nwe)) % 7);
+               var rowCnt = Math.round((visEnd - visStart) / (DAY_MS * 7));
+               if (opt('weekMode') == 'fixed') {
+                       addDays(visEnd, (6 - rowCnt) * 7);
+                       rowCnt = 6;
+               }
+               t.title = formatDate(start, opt('titleFormat'));
+               t.start = start;
+               t.end = end;
+               t.visStart = visStart;
+               t.visEnd = visEnd;
+               renderBasic(6, rowCnt, nwe ? 5 : 7, true);
+       }
+       
+       
+}
+
+fcViews.basicWeek = BasicWeekView;
+
+function BasicWeekView(element, calendar) {
+       var t = this;
+       
+       
+       // exports
+       t.render = render;
+       
+       
+       // imports
+       BasicView.call(t, element, calendar, 'basicWeek');
+       var opt = t.opt;
+       var renderBasic = t.renderBasic;
+       var formatDates = calendar.formatDates;
+       
+       
+       
+       function render(date, delta) {
+               if (delta) {
+                       addDays(date, delta * 7);
+               }
+               var start = addDays(cloneDate(date), -((date.getDay() - opt('firstDay') + 7) % 7));
+               var end = addDays(cloneDate(start), 7);
+               var visStart = cloneDate(start);
+               var visEnd = cloneDate(end);
+               var weekends = opt('weekends');
+               if (!weekends) {
+                       skipWeekend(visStart);
+                       skipWeekend(visEnd, -1, true);
+               }
+               t.title = formatDates(
+                       visStart,
+                       addDays(cloneDate(visEnd), -1),
+                       opt('titleFormat')
+               );
+               t.start = start;
+               t.end = end;
+               t.visStart = visStart;
+               t.visEnd = visEnd;
+               renderBasic(1, 1, weekends ? 7 : 5, false);
+       }
+       
+       
+}
+
+fcViews.basicDay = BasicDayView;
+
+//TODO: when calendar's date starts out on a weekend, shouldn't happen
+
+
+function BasicDayView(element, calendar) {
+       var t = this;
+       
+       
+       // exports
+       t.render = render;
+       
+       
+       // imports
+       BasicView.call(t, element, calendar, 'basicDay');
+       var opt = t.opt;
+       var renderBasic = t.renderBasic;
+       var formatDate = calendar.formatDate;
+       
+       
+       
+       function render(date, delta) {
+               if (delta) {
+                       addDays(date, delta);
+                       if (!opt('weekends')) {
+                               skipWeekend(date, delta < 0 ? -1 : 1);
+                       }
+               }
+               t.title = formatDate(date, opt('titleFormat'));
+               t.start = t.visStart = cloneDate(date, true);
+               t.end = t.visEnd = addDays(cloneDate(t.start), 1);
+               renderBasic(1, 1, 1, false);
+       }
+       
+       
+}
+
+setDefaults({
+       weekMode: 'fixed'
+});
+
+
+function BasicView(element, calendar, viewName) {
+       var t = this;
+       
+       
+       // exports
+       t.renderBasic = renderBasic;
+       t.setHeight = setHeight;
+       t.setWidth = setWidth;
+       t.renderDayOverlay = renderDayOverlay;
+       t.defaultSelectionEnd = defaultSelectionEnd;
+       t.renderSelection = renderSelection;
+       t.clearSelection = clearSelection;
+       t.reportDayClick = reportDayClick; // for selection (kinda hacky)
+       t.dragStart = dragStart;
+       t.dragStop = dragStop;
+       t.defaultEventEnd = defaultEventEnd;
+       t.getHoverListener = function() { return hoverListener };
+       t.colContentLeft = colContentLeft;
+       t.colContentRight = colContentRight;
+       t.dayOfWeekCol = dayOfWeekCol;
+       t.dateCell = dateCell;
+       t.cellDate = cellDate;
+       t.cellIsAllDay = function() { return true };
+       t.allDayRow = allDayRow;
+       t.allDayBounds = allDayBounds;
+       t.getRowCnt = function() { return rowCnt };
+       t.getColCnt = function() { return colCnt };
+       t.getColWidth = function() { return colWidth };
+       t.getDaySegmentContainer = function() { return daySegmentContainer };
+       
+       
+       // imports
+       View.call(t, element, calendar, viewName);
+       OverlayManager.call(t);
+       SelectionManager.call(t);
+       BasicEventRenderer.call(t);
+       var opt = t.opt;
+       var trigger = t.trigger;
+       var clearEvents = t.clearEvents;
+       var renderOverlay = t.renderOverlay;
+       var clearOverlays = t.clearOverlays;
+       var daySelectionMousedown = t.daySelectionMousedown;
+       var formatDate = calendar.formatDate;
+       
+       
+       // locals
+       
+       var head;
+       var headCells;
+       var body;
+       var bodyRows;
+       var bodyCells;
+       var bodyFirstCells;
+       var bodyCellTopInners;
+       var daySegmentContainer;
+       
+       var viewWidth;
+       var viewHeight;
+       var colWidth;
+       
+       var rowCnt, colCnt;
+       var coordinateGrid;
+       var hoverListener;
+       var colContentPositions;
+       
+       var rtl, dis, dit;
+       var firstDay;
+       var nwe;
+       var tm;
+       var colFormat;
+       
+       
+       
+       /* Rendering
+       ------------------------------------------------------------*/
+       
+       
+       disableTextSelection(element.addClass('fc-grid'));
+       
+       
+       function renderBasic(maxr, r, c, showNumbers) {
+               rowCnt = r;
+               colCnt = c;
+               updateOptions();
+               var firstTime = !body;
+               if (firstTime) {
+                       buildSkeleton(maxr, showNumbers);
+               }else{
+                       clearEvents();
+               }
+               updateCells(firstTime);
+       }
+       
+       
+       
+       function updateOptions() {
+               rtl = opt('isRTL');
+               if (rtl) {
+                       dis = -1;
+                       dit = colCnt - 1;
+               }else{
+                       dis = 1;
+                       dit = 0;
+               }
+               firstDay = opt('firstDay');
+               nwe = opt('weekends') ? 0 : 1;
+               tm = opt('theme') ? 'ui' : 'fc';
+               colFormat = opt('columnFormat');
+       }
+       
+       
+       
+       function buildSkeleton(maxRowCnt, showNumbers) {
+               var s;
+               var headerClass = tm + "-widget-header";
+               var contentClass = tm + "-widget-content";
+               var i, j;
+               var table;
+               
+               s =
+                       "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
+                       "<thead>" +
+                       "<tr>";
+               for (i=0; i<colCnt; i++) {
+                       s +=
+                               "<th class='fc- " + headerClass + "'/>"; // need fc- for setDayID
+               }
+               s +=
+                       "</tr>" +
+                       "</thead>" +
+                       "<tbody>";
+               for (i=0; i<maxRowCnt; i++) {
+                       s +=
+                               "<tr class='fc-week" + i + "'>";
+                       for (j=0; j<colCnt; j++) {
+                               s +=
+                                       "<td class='fc- " + contentClass + " fc-day" + (i*colCnt+j) + "'>" + // need fc- for setDayID
+                                       "<div>" +
+                                       (showNumbers ?
+                                               "<div class='fc-day-number'/>" :
+                                               ''
+                                               ) +
+                                       "<div class='fc-day-content'>" +
+                                       "<div style='position:relative'>&nbsp;</div>" +
+                                       "</div>" +
+                                       "</div>" +
+                                       "</td>";
+                       }
+                       s +=
+                               "</tr>";
+               }
+               s +=
+                       "</tbody>" +
+                       "</table>";
+               table = $(s).appendTo(element);
+               
+               head = table.find('thead');
+               headCells = head.find('th');
+               body = table.find('tbody');
+               bodyRows = body.find('tr');
+               bodyCells = body.find('td');
+               bodyFirstCells = bodyCells.filter(':first-child');
+               bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div');
+               
+               markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's
+               markFirstLast(bodyRows); // marks first+last td's
+               bodyRows.eq(0).addClass('fc-first'); // fc-last is done in updateCells
+               
+               dayBind(bodyCells);
+               
+               daySegmentContainer =
+                       $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+                               .appendTo(element);
+       }
+       
+       
+       
+       function updateCells(firstTime) {
+               var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
+               var month = t.start.getMonth();
+               var today = clearTime(new Date());
+               var cell;
+               var date;
+               var row;
+       
+               if (dowDirty) {
+                       headCells.each(function(i, _cell) {
+                               cell = $(_cell);
+                               date = indexDate(i);
+                               cell.html(formatDate(date, colFormat));
+                               setDayID(cell, date);
+                       });
+               }
+               
+               bodyCells.each(function(i, _cell) {
+                       cell = $(_cell);
+                       date = indexDate(i);
+                       if (date.getMonth() == month) {
+                               cell.removeClass('fc-other-month');
+                       }else{
+                               cell.addClass('fc-other-month');
+                       }
+                       if (+date == +today) {
+                               cell.addClass(tm + '-state-highlight fc-today');
+                       }else{
+                               cell.removeClass(tm + '-state-highlight fc-today');
+                       }
+                       cell.find('div.fc-day-number').text(date.getDate());
+                       if (dowDirty) {
+                               setDayID(cell, date);
+                       }
+               });
+               
+               bodyRows.each(function(i, _row) {
+                       row = $(_row);
+                       if (i < rowCnt) {
+                               row.show();
+                               if (i == rowCnt-1) {
+                                       row.addClass('fc-last');
+                               }else{
+                                       row.removeClass('fc-last');
+                               }
+                       }else{
+                               row.hide();
+                       }
+               });
+       }
+       
+       
+       
+       function setHeight(height) {
+               viewHeight = height;
+               
+               var bodyHeight = viewHeight - head.height();
+               var rowHeight;
+               var rowHeightLast;
+               var cell;
+                       
+               if (opt('weekMode') == 'variable') {
+                       rowHeight = rowHeightLast = Math.floor(bodyHeight / (rowCnt==1 ? 2 : 6));
+               }else{
+                       rowHeight = Math.floor(bodyHeight / rowCnt);
+                       rowHeightLast = bodyHeight - rowHeight * (rowCnt-1);
+               }
+               
+               bodyFirstCells.each(function(i, _cell) {
+                       if (i < rowCnt) {
+                               cell = $(_cell);
+                               setMinHeight(
+                                       cell.find('> div'),
+                                       (i==rowCnt-1 ? rowHeightLast : rowHeight) - vsides(cell)
+                               );
+                       }
+               });
+               
+       }
+       
+       
+       function setWidth(width) {
+               viewWidth = width;
+               colContentPositions.clear();
+               colWidth = Math.floor(viewWidth / colCnt);
+               setOuterWidth(headCells.slice(0, -1), colWidth);
+       }
+       
+       
+       
+       /* Day clicking and binding
+       -----------------------------------------------------------*/
+       
+       
+       function dayBind(days) {
+               days.click(dayClick)
+                       .mousedown(daySelectionMousedown);
+       }
+       
+       
+       function dayClick(ev) {
+               if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
+                       var index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
+                       var date = indexDate(index);
+                       trigger('dayClick', this, date, true, ev);
+               }
+       }
+       
+       
+       
+       /* Semi-transparent Overlay Helpers
+       ------------------------------------------------------*/
+       
+       
+       function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive
+               if (refreshCoordinateGrid) {
+                       coordinateGrid.build();
+               }
+               var rowStart = cloneDate(t.visStart);
+               var rowEnd = addDays(cloneDate(rowStart), colCnt);
+               for (var i=0; i<rowCnt; i++) {
+                       var stretchStart = new Date(Math.max(rowStart, overlayStart));
+                       var stretchEnd = new Date(Math.min(rowEnd, overlayEnd));
+                       if (stretchStart < stretchEnd) {
+                               var colStart, colEnd;
+                               if (rtl) {
+                                       colStart = dayDiff(stretchEnd, rowStart)*dis+dit+1;
+                                       colEnd = dayDiff(stretchStart, rowStart)*dis+dit+1;
+                               }else{
+                                       colStart = dayDiff(stretchStart, rowStart);
+                                       colEnd = dayDiff(stretchEnd, rowStart);
+                               }
+                               dayBind(
+                                       renderCellOverlay(i, colStart, i, colEnd-1)
+                               );
+                       }
+                       addDays(rowStart, 7);
+                       addDays(rowEnd, 7);
+               }
+       }
+       
+       
+       function renderCellOverlay(row0, col0, row1, col1) { // row1,col1 is inclusive
+               var rect = coordinateGrid.rect(row0, col0, row1, col1, element);
+               return renderOverlay(rect, element);
+       }
+       
+       
+       
+       /* Selection
+       -----------------------------------------------------------------------*/
+       
+       
+       function defaultSelectionEnd(startDate, allDay) {
+               return cloneDate(startDate);
+       }
+       
+       
+       function renderSelection(startDate, endDate, allDay) {
+               renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); // rebuild every time???
+       }
+       
+       
+       function clearSelection() {
+               clearOverlays();
+       }
+       
+       
+       function reportDayClick(date, allDay, ev) {
+               var cell = dateCell(date);
+               var _element = bodyCells[cell.row*colCnt + cell.col];
+               trigger('dayClick', _element, date, allDay, ev);
+       }
+       
+       
+       
+       /* External Dragging
+       -----------------------------------------------------------------------*/
+       
+       
+       function dragStart(_dragElement, ev, ui) {
+               hoverListener.start(function(cell) {
+                       clearOverlays();
+                       if (cell) {
+                               renderCellOverlay(cell.row, cell.col, cell.row, cell.col);
+                       }
+               }, ev);
+       }
+       
+       
+       function dragStop(_dragElement, ev, ui) {
+               var cell = hoverListener.stop();
+               clearOverlays();
+               if (cell) {
+                       var d = cellDate(cell);
+                       trigger('drop', _dragElement, d, true, ev, ui);
+               }
+       }
+       
+       
+       
+       /* Utilities
+       --------------------------------------------------------*/
+       
+       
+       function defaultEventEnd(event) {
+               return cloneDate(event.start);
+       }
+       
+       
+       coordinateGrid = new CoordinateGrid(function(rows, cols) {
+               var e, n, p;
+               headCells.each(function(i, _e) {
+                       e = $(_e);
+                       n = e.offset().left;
+                       if (i) {
+                               p[1] = n;
+                       }
+                       p = [n];
+                       cols[i] = p;
+               });
+               p[1] = n + e.outerWidth();
+               bodyRows.each(function(i, _e) {
+                       if (i < rowCnt) {
+                               e = $(_e);
+                               n = e.offset().top;
+                               if (i) {
+                                       p[1] = n;
+                               }
+                               p = [n];
+                               rows[i] = p;
+                       }
+               });
+               p[1] = n + e.outerHeight();
+       });
+       
+       
+       hoverListener = new HoverListener(coordinateGrid);
+       
+       
+       colContentPositions = new HorizontalPositionCache(function(col) {
+               return bodyCellTopInners.eq(col);
+       });
+       
+       
+       function colContentLeft(col) {
+               return colContentPositions.left(col);
+       }
+       
+       
+       function colContentRight(col) {
+               return colContentPositions.right(col);
+       }
+       
+       
+       
+       
+       function dateCell(date) {
+               return {
+                       row: Math.floor(dayDiff(date, t.visStart) / 7),
+                       col: dayOfWeekCol(date.getDay())
+               };
+       }
+       
+       
+       function cellDate(cell) {
+               return _cellDate(cell.row, cell.col);
+       }
+       
+       
+       function _cellDate(row, col) {
+               return addDays(cloneDate(t.visStart), row*7 + col*dis+dit);
+               // what about weekends in middle of week?
+       }
+       
+       
+       function indexDate(index) {
+               return _cellDate(Math.floor(index/colCnt), index%colCnt);
+       }
+       
+       
+       function dayOfWeekCol(dayOfWeek) {
+               return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt) * dis + dit;
+       }
+       
+       
+       
+       
+       function allDayRow(i) {
+               return bodyRows.eq(i);
+       }
+       
+       
+       function allDayBounds(i) {
+               return {
+                       left: 0,
+                       right: viewWidth
+               };
+       }
+       
+       
+}
+
+function BasicEventRenderer() {
+       var t = this;
+       
+       
+       // exports
+       t.renderEvents = renderEvents;
+       t.compileDaySegs = compileSegs; // for DayEventRenderer
+       t.clearEvents = clearEvents;
+       t.bindDaySeg = bindDaySeg;
+       
+       
+       // imports
+       DayEventRenderer.call(t);
+       var opt = t.opt;
+       var trigger = t.trigger;
+       //var setOverflowHidden = t.setOverflowHidden;
+       var isEventDraggable = t.isEventDraggable;
+       var isEventResizable = t.isEventResizable;
+       var reportEvents = t.reportEvents;
+       var reportEventClear = t.reportEventClear;
+       var eventElementHandlers = t.eventElementHandlers;
+       var showEvents = t.showEvents;
+       var hideEvents = t.hideEvents;
+       var eventDrop = t.eventDrop;
+       var getDaySegmentContainer = t.getDaySegmentContainer;
+       var getHoverListener = t.getHoverListener;
+       var renderDayOverlay = t.renderDayOverlay;
+       var clearOverlays = t.clearOverlays;
+       var getRowCnt = t.getRowCnt;
+       var getColCnt = t.getColCnt;
+       var renderDaySegs = t.renderDaySegs;
+       var resizableDayEvent = t.resizableDayEvent;
+       
+       
+       
+       /* Rendering
+       --------------------------------------------------------------------*/
+       
+       
+       function renderEvents(events, modifiedEventId) {
+               reportEvents(events);
+               renderDaySegs(compileSegs(events), modifiedEventId);
+       }
+       
+       
+       function clearEvents() {
+               reportEventClear();
+               getDaySegmentContainer().empty();
+       }
+       
+       
+       function compileSegs(events) {
+               var rowCnt = getRowCnt(),
+                       colCnt = getColCnt(),
+                       d1 = cloneDate(t.visStart),
+                       d2 = addDays(cloneDate(d1), colCnt),
+                       visEventsEnds = $.map(events, exclEndDay),
+                       i, row,
+                       j, level,
+                       k, seg,
+                       segs=[];
+               for (i=0; i<rowCnt; i++) {
+                       row = stackSegs(sliceSegs(events, visEventsEnds, d1, d2));
+                       for (j=0; j<row.length; j++) {
+                               level = row[j];
+                               for (k=0; k<level.length; k++) {
+                                       seg = level[k];
+                                       seg.row = i;
+                                       seg.level = j; // not needed anymore
+                                       segs.push(seg);
+                               }
+                       }
+                       addDays(d1, 7);
+                       addDays(d2, 7);
+               }
+               return segs;
+       }
+       
+       
+       function bindDaySeg(event, eventElement, seg) {
+               if (isEventDraggable(event)) {
+                       draggableDayEvent(event, eventElement);
+               }
+               if (seg.isEnd && isEventResizable(event)) {
+                       resizableDayEvent(event, eventElement, seg);
+               }
+               eventElementHandlers(event, eventElement);
+                       // needs to be after, because resizableDayEvent might stopImmediatePropagation on click
+       }
+       
+       
+       
+       /* Dragging
+       ----------------------------------------------------------------------------*/
+       
+       
+       function draggableDayEvent(event, eventElement) {
+               var hoverListener = getHoverListener();
+               var dayDelta;
+               eventElement.draggable({
+                       zIndex: 9,
+                       delay: 50,
+                       opacity: opt('dragOpacity'),
+                       revertDuration: opt('dragRevertDuration'),
+                       start: function(ev, ui) {
+                               trigger('eventDragStart', eventElement, event, ev, ui);
+                               hideEvents(event, eventElement);
+                               hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
+                                       eventElement.draggable('option', 'revert', !cell || !rowDelta && !colDelta);
+                                       clearOverlays();
+                                       if (cell) {
+                                               //setOverflowHidden(true);
+                                               dayDelta = rowDelta*7 + colDelta * (opt('isRTL') ? -1 : 1);
+                                               renderDayOverlay(
+                                                       addDays(cloneDate(event.start), dayDelta),
+                                                       addDays(exclEndDay(event), dayDelta)
+                                               );
+                                       }else{
+                                               //setOverflowHidden(false);
+                                               dayDelta = 0;
+                                       }
+                               }, ev, 'drag');
+                       },
+                       stop: function(ev, ui) {
+                               hoverListener.stop();
+                               clearOverlays();
+                               trigger('eventDragStop', eventElement, event, ev, ui);
+                               if (dayDelta) {
+                                       eventDrop(this, event, dayDelta, 0, event.allDay, ev, ui);
+                               }else{
+                                       eventElement.css('filter', ''); // clear IE opacity side-effects
+                                       showEvents(event, eventElement);
+                               }
+                               //setOverflowHidden(false);
+                       }
+               });
+       }
+
+
+}
+
+fcViews.agendaWeek = AgendaWeekView;
+
+function AgendaWeekView(element, calendar) {
+       var t = this;
+       
+       
+       // exports
+       t.render = render;
+       
+       
+       // imports
+       AgendaView.call(t, element, calendar, 'agendaWeek');
+       var opt = t.opt;
+       var renderAgenda = t.renderAgenda;
+       var formatDates = calendar.formatDates;
+       
+       
+       
+       function render(date, delta) {
+               if (delta) {
+                       addDays(date, delta * 7);
+               }
+               var start = addDays(cloneDate(date), -((date.getDay() - opt('firstDay') + 7) % 7));
+               var end = addDays(cloneDate(start), 7);
+               var visStart = cloneDate(start);
+               var visEnd = cloneDate(end);
+               var weekends = opt('weekends');
+               if (!weekends) {
+                       skipWeekend(visStart);
+                       skipWeekend(visEnd, -1, true);
+               }
+               t.title = formatDates(
+                       visStart,
+                       addDays(cloneDate(visEnd), -1),
+                       opt('titleFormat')
+               );
+               t.start = start;
+               t.end = end;
+               t.visStart = visStart;
+               t.visEnd = visEnd;
+               renderAgenda(weekends ? 7 : 5);
+       }
+       
+
+}
+
+fcViews.agendaDay = AgendaDayView;
+
+function AgendaDayView(element, calendar) {
+       var t = this;
+       
+       
+       // exports
+       t.render = render;
+       
+       
+       // imports
+       AgendaView.call(t, element, calendar, 'agendaDay');
+       var opt = t.opt;
+       var renderAgenda = t.renderAgenda;
+       var formatDate = calendar.formatDate;
+       
+       
+       
+       function render(date, delta) {
+               if (delta) {
+                       addDays(date, delta);
+                       if (!opt('weekends')) {
+                               skipWeekend(date, delta < 0 ? -1 : 1);
+                       }
+               }
+               var start = cloneDate(date, true);
+               var end = addDays(cloneDate(start), 1);
+               t.title = formatDate(date, opt('titleFormat'));
+               t.start = t.visStart = start;
+               t.end = t.visEnd = end;
+               renderAgenda(1);
+       }
+       
+
+}
+
+setDefaults({
+       allDaySlot: true,
+       allDayText: 'all-day',
+       firstHour: 6,
+       slotMinutes: 30,
+       defaultEventMinutes: 120,
+       axisFormat: 'h(:mm)tt',
+       timeFormat: {
+               agenda: 'h:mm{ - h:mm}'
+       },
+       dragOpacity: {
+               agenda: .5
+       },
+       minTime: 0,
+       maxTime: 24
+});
+
+
+// TODO: make it work in quirks mode (event corners, all-day height)
+// TODO: test liquid width, especially in IE6
+
+
+function AgendaView(element, calendar, viewName) {
+       var t = this;
+       
+       
+       // exports
+       t.renderAgenda = renderAgenda;
+       t.setWidth = setWidth;
+       t.setHeight = setHeight;
+       t.beforeHide = beforeHide;
+       t.afterShow = afterShow;
+       t.defaultEventEnd = defaultEventEnd;
+       t.timePosition = timePosition;
+       t.dayOfWeekCol = dayOfWeekCol;
+       t.dateCell = dateCell;
+       t.cellDate = cellDate;
+       t.cellIsAllDay = cellIsAllDay;
+       t.allDayRow = getAllDayRow;
+       t.allDayBounds = allDayBounds;
+       t.getHoverListener = function() { return hoverListener };
+       t.colContentLeft = colContentLeft;
+       t.colContentRight = colContentRight;
+       t.getDaySegmentContainer = function() { return daySegmentContainer };
+       t.getSlotSegmentContainer = function() { return slotSegmentContainer };
+       t.getMinMinute = function() { return minMinute };
+       t.getMaxMinute = function() { return maxMinute };
+       t.getBodyContent = function() { return slotContent }; // !!??
+       t.getRowCnt = function() { return 1 };
+       t.getColCnt = function() { return colCnt };
+       t.getColWidth = function() { return colWidth };
+       t.getSlotHeight = function() { return slotHeight };
+       t.defaultSelectionEnd = defaultSelectionEnd;
+       t.renderDayOverlay = renderDayOverlay;
+       t.renderSelection = renderSelection;
+       t.clearSelection = clearSelection;
+       t.reportDayClick = reportDayClick; // selection mousedown hack
+       t.dragStart = dragStart;
+       t.dragStop = dragStop;
+       
+       
+       // imports
+       View.call(t, element, calendar, viewName);
+       OverlayManager.call(t);
+       SelectionManager.call(t);
+       AgendaEventRenderer.call(t);
+       var opt = t.opt;
+       var trigger = t.trigger;
+       var clearEvents = t.clearEvents;
+       var renderOverlay = t.renderOverlay;
+       var clearOverlays = t.clearOverlays;
+       var reportSelection = t.reportSelection;
+       var unselect = t.unselect;
+       var daySelectionMousedown = t.daySelectionMousedown;
+       var slotSegHtml = t.slotSegHtml;
+       var formatDate = calendar.formatDate;
+       
+       
+       // locals
+       
+       var dayTable;
+       var dayHead;
+       var dayHeadCells;
+       var dayBody;
+       var dayBodyCells;
+       var dayBodyCellInners;
+       var dayBodyFirstCell;
+       var dayBodyFirstCellStretcher;
+       var slotLayer;
+       var daySegmentContainer;
+       var allDayTable;
+       var allDayRow;
+       var slotScroller;
+       var slotContent;
+       var slotSegmentContainer;
+       var slotTable;
+       var slotTableFirstInner;
+       var axisFirstCells;
+       var gutterCells;
+       var selectionHelper;
+       
+       var viewWidth;
+       var viewHeight;
+       var axisWidth;
+       var colWidth;
+       var gutterWidth;
+       var slotHeight; // TODO: what if slotHeight changes? (see issue 650)
+       var savedScrollTop;
+       
+       var colCnt;
+       var slotCnt;
+       var coordinateGrid;
+       var hoverListener;
+       var colContentPositions;
+       var slotTopCache = {};
+       
+       var tm;
+       var firstDay;
+       var nwe;            // no weekends (int)
+       var rtl, dis, dit;  // day index sign / translate
+       var minMinute, maxMinute;
+       var colFormat;
+       
+
+       
+       /* Rendering
+       -----------------------------------------------------------------------------*/
+       
+       
+       disableTextSelection(element.addClass('fc-agenda'));
+       
+       
+       function renderAgenda(c) {
+               colCnt = c;
+               updateOptions();
+               if (!dayTable) {
+                       buildSkeleton();
+               }else{
+                       clearEvents();
+               }
+               updateCells();
+       }
+       
+       
+       
+       function updateOptions() {
+               tm = opt('theme') ? 'ui' : 'fc';
+               nwe = opt('weekends') ? 0 : 1;
+               firstDay = opt('firstDay');
+               if (rtl = opt('isRTL')) {
+                       dis = -1;
+                       dit = colCnt - 1;
+               }else{
+                       dis = 1;
+                       dit = 0;
+               }
+               minMinute = parseTime(opt('minTime'));
+               maxMinute = parseTime(opt('maxTime'));
+               colFormat = opt('columnFormat');
+       }
+       
+       
+       
+       function buildSkeleton() {
+               var headerClass = tm + "-widget-header";
+               var contentClass = tm + "-widget-content";
+               var s;
+               var i;
+               var d;
+               var maxd;
+               var minutes;
+               var slotNormal = opt('slotMinutes') % 15 == 0;
+               
+               s =
+                       "<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'>" +
+                       "<thead>" +
+                       "<tr>" +
+                       "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+               for (i=0; i<colCnt; i++) {
+                       s +=
+                               "<th class='fc- fc-col" + i + ' ' + headerClass + "'/>"; // fc- needed for setDayID
+               }
+               s +=
+                       "<th class='fc-agenda-gutter " + headerClass + "'>&nbsp;</th>" +
+                       "</tr>" +
+                       "</thead>" +
+                       "<tbody>" +
+                       "<tr>" +
+                       "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+               for (i=0; i<colCnt; i++) {
+                       s +=
+                               "<td class='fc- fc-col" + i + ' ' + contentClass + "'>" + // fc- needed for setDayID
+                               "<div>" +
+                               "<div class='fc-day-content'>" +
+                               "<div style='position:relative'>&nbsp;</div>" +
+                               "</div>" +
+                               "</div>" +
+                               "</td>";
+               }
+               s +=
+                       "<td class='fc-agenda-gutter " + contentClass + "'>&nbsp;</td>" +
+                       "</tr>" +
+                       "</tbody>" +
+                       "</table>";
+               dayTable = $(s).appendTo(element);
+               dayHead = dayTable.find('thead');
+               dayHeadCells = dayHead.find('th').slice(1, -1);
+               dayBody = dayTable.find('tbody');
+               dayBodyCells = dayBody.find('td').slice(0, -1);
+               dayBodyCellInners = dayBodyCells.find('div.fc-day-content div');
+               dayBodyFirstCell = dayBodyCells.eq(0);
+               dayBodyFirstCellStretcher = dayBodyFirstCell.find('> div');
+               
+               markFirstLast(dayHead.add(dayHead.find('tr')));
+               markFirstLast(dayBody.add(dayBody.find('tr')));
+               
+               axisFirstCells = dayHead.find('th:first');
+               gutterCells = dayTable.find('.fc-agenda-gutter');
+               
+               slotLayer =
+                       $("<div style='position:absolute;z-index:2;left:0;width:100%'/>")
+                               .appendTo(element);
+                               
+               if (opt('allDaySlot')) {
+               
+                       daySegmentContainer =
+                               $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+                                       .appendTo(slotLayer);
+               
+                       s =
+                               "<table style='width:100%' class='fc-agenda-allday' cellspacing='0'>" +
+                               "<tr>" +
+                               "<th class='" + headerClass + " fc-agenda-axis'>" + opt('allDayText') + "</th>" +
+                               "<td>" +
+                               "<div class='fc-day-content'><div style='position:relative'/></div>" +
+                               "</td>" +
+                               "<th class='" + headerClass + " fc-agenda-gutter'>&nbsp;</th>" +
+                               "</tr>" +
+                               "</table>";
+                       allDayTable = $(s).appendTo(slotLayer);
+                       allDayRow = allDayTable.find('tr');
+                       
+                       dayBind(allDayRow.find('td'));
+                       
+                       axisFirstCells = axisFirstCells.add(allDayTable.find('th:first'));
+                       gutterCells = gutterCells.add(allDayTable.find('th.fc-agenda-gutter'));
+                       
+                       slotLayer.append(
+                               "<div class='fc-agenda-divider " + headerClass + "'>" +
+                               "<div class='fc-agenda-divider-inner'/>" +
+                               "</div>"
+                       );
+                       
+               }else{
+               
+                       daySegmentContainer = $([]); // in jQuery 1.4, we can just do $()
+               
+               }
+               
+               slotScroller =
+                       $("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>")
+                               .appendTo(slotLayer);
+                               
+               slotContent =
+                       $("<div style='position:relative;width:100%;overflow:hidden'/>")
+                               .appendTo(slotScroller);
+                               
+               slotSegmentContainer =
+                       $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+                               .appendTo(slotContent);
+               
+               s =
+                       "<table class='fc-agenda-slots' style='width:100%' cellspacing='0'>" +
+                       "<tbody>";
+               d = zeroDate();
+               maxd = addMinutes(cloneDate(d), maxMinute);
+               addMinutes(d, minMinute);
+               slotCnt = 0;
+               for (i=0; d < maxd; i++) {
+                       minutes = d.getMinutes();
+                       s +=
+                               "<tr class='fc-slot" + i + ' ' + (!minutes ? '' : 'fc-minor') + "'>" +
+                               "<th class='fc-agenda-axis " + headerClass + "'>" +
+                               ((!slotNormal || !minutes) ? formatDate(d, opt('axisFormat')) : '&nbsp;') +
+                               "</th>" +
+                               "<td class='" + contentClass + "'>" +
+                               "<div style='position:relative'>&nbsp;</div>" +
+                               "</td>" +
+                               "</tr>";
+                       addMinutes(d, opt('slotMinutes'));
+                       slotCnt++;
+               }
+               s +=
+                       "</tbody>" +
+                       "</table>";
+               slotTable = $(s).appendTo(slotContent);
+               slotTableFirstInner = slotTable.find('div:first');
+               
+               slotBind(slotTable.find('td'));
+               
+               axisFirstCells = axisFirstCells.add(slotTable.find('th:first'));
+       }
+       
+       
+       
+       function updateCells() {
+               var i;
+               var headCell;
+               var bodyCell;
+               var date;
+               var today = clearTime(new Date());
+               for (i=0; i<colCnt; i++) {
+                       date = colDate(i);
+                       headCell = dayHeadCells.eq(i);
+                       headCell.html(formatDate(date, colFormat));
+                       bodyCell = dayBodyCells.eq(i);
+                       if (+date == +today) {
+                               bodyCell.addClass(tm + '-state-highlight fc-today');
+                       }else{
+                               bodyCell.removeClass(tm + '-state-highlight fc-today');
+                       }
+                       setDayID(headCell.add(bodyCell), date);
+               }
+       }
+       
+       
+       
+       function setHeight(height, dateChanged) {
+               if (height === undefined) {
+                       height = viewHeight;
+               }
+               viewHeight = height;
+               slotTopCache = {};
+       
+               var headHeight = dayBody.position().top;
+               var allDayHeight = slotScroller.position().top; // including divider
+               var bodyHeight = Math.min( // total body height, including borders
+                       height - headHeight,   // when scrollbars
+                       slotTable.height() + allDayHeight + 1 // when no scrollbars. +1 for bottom border
+               );
+               
+               dayBodyFirstCellStretcher
+                       .height(bodyHeight - vsides(dayBodyFirstCell));
+               
+               slotLayer.css('top', headHeight);
+               
+               slotScroller.height(bodyHeight - allDayHeight - 1);
+               
+               slotHeight = slotTableFirstInner.height() + 1; // +1 for border
+               
+               if (dateChanged) {
+                       resetScroll();
+               }
+       }
+       
+       
+       
+       function setWidth(width) {
+               viewWidth = width;
+               colContentPositions.clear();
+               
+               axisWidth = 0;
+               setOuterWidth(
+                       axisFirstCells
+                               .width('')
+                               .each(function(i, _cell) {
+                                       axisWidth = Math.max(axisWidth, $(_cell).outerWidth());
+                               }),
+                       axisWidth
+               );
+               
+               var slotTableWidth = slotScroller[0].clientWidth; // needs to be done after axisWidth (for IE7)
+               //slotTable.width(slotTableWidth);
+               
+               gutterWidth = slotScroller.width() - slotTableWidth;
+               if (gutterWidth) {
+                       setOuterWidth(gutterCells, gutterWidth);
+                       gutterCells
+                               .show()
+                               .prev()
+                               .removeClass('fc-last');
+               }else{
+                       gutterCells
+                               .hide()
+                               .prev()
+                               .addClass('fc-last');
+               }
+               
+               colWidth = Math.floor((slotTableWidth - axisWidth) / colCnt);
+               setOuterWidth(dayHeadCells.slice(0, -1), colWidth);
+       }
+       
+
+
+       function resetScroll() {
+               var d0 = zeroDate();
+               var scrollDate = cloneDate(d0);
+               scrollDate.setHours(opt('firstHour'));
+               var top = timePosition(d0, scrollDate) + 1; // +1 for the border
+               function scroll() {
+                       slotScroller.scrollTop(top);
+               }
+               scroll();
+               setTimeout(scroll, 0); // overrides any previous scroll state made by the browser
+       }
+       
+       
+       function beforeHide() {
+               savedScrollTop = slotScroller.scrollTop();
+       }
+       
+       
+       function afterShow() {
+               slotScroller.scrollTop(savedScrollTop);
+       }
+       
+       
+       
+       /* Slot/Day clicking and binding
+       -----------------------------------------------------------------------*/
+       
+
+       function dayBind(cells) {
+               cells.click(slotClick)
+                       .mousedown(daySelectionMousedown);
+       }
+
+
+       function slotBind(cells) {
+               cells.click(slotClick)
+                       .mousedown(slotSelectionMousedown);
+       }
+       
+       
+       function slotClick(ev) {
+               if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
+                       var col = Math.min(colCnt-1, Math.floor((ev.pageX - dayTable.offset().left - axisWidth) / colWidth));
+                       var date = colDate(col);
+                       var rowMatch = this.parentNode.className.match(/fc-slot(\d+)/); // TODO: maybe use data
+                       if (rowMatch) {
+                               var mins = parseInt(rowMatch[1]) * opt('slotMinutes');
+                               var hours = Math.floor(mins/60);
+                               date.setHours(hours);
+                               date.setMinutes(mins%60 + minMinute);
+                               trigger('dayClick', dayBodyCells[col], date, false, ev);
+                       }else{
+                               trigger('dayClick', dayBodyCells[col], date, true, ev);
+                       }
+               }
+       }
+       
+       
+       
+       /* Semi-transparent Overlay Helpers
+       -----------------------------------------------------*/
+       
+
+       function renderDayOverlay(startDate, endDate, refreshCoordinateGrid) { // endDate is exclusive
+               if (refreshCoordinateGrid) {
+                       coordinateGrid.build();
+               }
+               var visStart = cloneDate(t.visStart);
+               var startCol, endCol;
+               if (rtl) {
+                       startCol = dayDiff(endDate, visStart)*dis+dit+1;
+                       endCol = dayDiff(startDate, visStart)*dis+dit+1;
+               }else{
+                       startCol = dayDiff(startDate, visStart);
+                       endCol = dayDiff(endDate, visStart);
+               }
+               startCol = Math.max(0, startCol);
+               endCol = Math.min(colCnt, endCol);
+               if (startCol < endCol) {
+                       dayBind(
+                               renderCellOverlay(0, startCol, 0, endCol-1)
+                       );
+               }
+       }
+       
+       
+       function renderCellOverlay(row0, col0, row1, col1) { // only for all-day?
+               var rect = coordinateGrid.rect(row0, col0, row1, col1, slotLayer);
+               return renderOverlay(rect, slotLayer);
+       }
+       
+
+       function renderSlotOverlay(overlayStart, overlayEnd) {
+               var dayStart = cloneDate(t.visStart);
+               var dayEnd = addDays(cloneDate(dayStart), 1);
+               for (var i=0; i<colCnt; i++) {
+                       var stretchStart = new Date(Math.max(dayStart, overlayStart));
+                       var stretchEnd = new Date(Math.min(dayEnd, overlayEnd));
+                       if (stretchStart < stretchEnd) {
+                               var col = i*dis+dit;
+                               var rect = coordinateGrid.rect(0, col, 0, col, slotContent); // only use it for horizontal coords
+                               var top = timePosition(dayStart, stretchStart);
+                               var bottom = timePosition(dayStart, stretchEnd);
+                               rect.top = top;
+                               rect.height = bottom - top;
+                               slotBind(
+                                       renderOverlay(rect, slotContent)
+                               );
+                       }
+                       addDays(dayStart, 1);
+                       addDays(dayEnd, 1);
+               }
+       }
+       
+       
+       
+       /* Coordinate Utilities
+       -----------------------------------------------------------------------------*/
+       
+       
+       coordinateGrid = new CoordinateGrid(function(rows, cols) {
+               var e, n, p;
+               dayHeadCells.each(function(i, _e) {
+                       e = $(_e);
+                       n = e.offset().left;
+                       if (i) {
+                               p[1] = n;
+                       }
+                       p = [n];
+                       cols[i] = p;
+               });
+               p[1] = n + e.outerWidth();
+               if (opt('allDaySlot')) {
+                       e = allDayRow;
+                       n = e.offset().top;
+                       rows[0] = [n, n+e.outerHeight()];
+               }
+               var slotTableTop = slotContent.offset().top;
+               var slotScrollerTop = slotScroller.offset().top;
+               var slotScrollerBottom = slotScrollerTop + slotScroller.outerHeight();
+               function constrain(n) {
+                       return Math.max(slotScrollerTop, Math.min(slotScrollerBottom, n));
+               }
+               for (var i=0; i<slotCnt; i++) {
+                       rows.push([
+                               constrain(slotTableTop + slotHeight*i),
+                               constrain(slotTableTop + slotHeight*(i+1))
+                       ]);
+               }
+       });
+       
+       
+       hoverListener = new HoverListener(coordinateGrid);
+       
+       
+       colContentPositions = new HorizontalPositionCache(function(col) {
+               return dayBodyCellInners.eq(col);
+       });
+       
+       
+       function colContentLeft(col) {
+               return colContentPositions.left(col);
+       }
+       
+       
+       function colContentRight(col) {
+               return colContentPositions.right(col);
+       }
+       
+       
+       
+       
+       function dateCell(date) { // "cell" terminology is now confusing
+               return {
+                       row: Math.floor(dayDiff(date, t.visStart) / 7),
+                       col: dayOfWeekCol(date.getDay())
+               };
+       }
+       
+       
+       function cellDate(cell) {
+               var d = colDate(cell.col);
+               var slotIndex = cell.row;
+               if (opt('allDaySlot')) {
+                       slotIndex--;
+               }
+               if (slotIndex >= 0) {
+                       addMinutes(d, minMinute + slotIndex * opt('slotMinutes'));
+               }
+               return d;
+       }
+       
+       
+       function colDate(col) { // returns dates with 00:00:00
+               return addDays(cloneDate(t.visStart), col*dis+dit);
+       }
+       
+       
+       function cellIsAllDay(cell) {
+               return opt('allDaySlot') && !cell.row;
+       }
+       
+       
+       function dayOfWeekCol(dayOfWeek) {
+               return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt)*dis+dit;
+       }
+       
+       
+       
+       
+       // get the Y coordinate of the given time on the given day (both Date objects)
+       function timePosition(day, time) { // both date objects. day holds 00:00 of current day
+               day = cloneDate(day, true);
+               if (time < addMinutes(cloneDate(day), minMinute)) {
+                       return 0;
+               }
+               if (time >= addMinutes(cloneDate(day), maxMinute)) {
+                       return slotTable.height();
+               }
+               var slotMinutes = opt('slotMinutes'),
+                       minutes = time.getHours()*60 + time.getMinutes() - minMinute,
+                       slotI = Math.floor(minutes / slotMinutes),
+                       slotTop = slotTopCache[slotI];
+               if (slotTop === undefined) {
+                       slotTop = slotTopCache[slotI] = slotTable.find('tr:eq(' + slotI + ') td div')[0].offsetTop; //.position().top; // need this optimization???
+               }
+               return Math.max(0, Math.round(
+                       slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes)
+               ));
+       }
+       
+       
+       function allDayBounds() {
+               return {
+                       left: axisWidth,
+                       right: viewWidth - gutterWidth
+               }
+       }
+       
+       
+       function getAllDayRow(index) {
+               return allDayRow;
+       }
+       
+       
+       function defaultEventEnd(event) {
+               var start = cloneDate(event.start);
+               if (event.allDay) {
+                       return start;
+               }
+               return addMinutes(start, opt('defaultEventMinutes'));
+       }
+       
+       
+       
+       /* Selection
+       ---------------------------------------------------------------------------------*/
+       
+       
+       function defaultSelectionEnd(startDate, allDay) {
+               if (allDay) {
+                       return cloneDate(startDate);
+               }
+               return addMinutes(cloneDate(startDate), opt('slotMinutes'));
+       }
+       
+       
+       function renderSelection(startDate, endDate, allDay) { // only for all-day
+               if (allDay) {
+                       if (opt('allDaySlot')) {
+                               renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true);
+                       }
+               }else{
+                       renderSlotSelection(startDate, endDate);
+               }
+       }
+       
+       
+       function renderSlotSelection(startDate, endDate) {
+               var helperOption = opt('selectHelper');
+               coordinateGrid.build();
+               if (helperOption) {
+                       var col = dayDiff(startDate, t.visStart) * dis + dit;
+                       if (col >= 0 && col < colCnt) { // only works when times are on same day
+                               var rect = coordinateGrid.rect(0, col, 0, col, slotContent); // only for horizontal coords
+                               var top = timePosition(startDate, startDate);
+                               var bottom = timePosition(startDate, endDate);
+                               if (bottom > top) { // protect against selections that are entirely before or after visible range
+                                       rect.top = top;
+                                       rect.height = bottom - top;
+                                       rect.left += 2;
+                                       rect.width -= 5;
+                                       if ($.isFunction(helperOption)) {
+                                               var helperRes = helperOption(startDate, endDate);
+                                               if (helperRes) {
+                                                       rect.position = 'absolute';
+                                                       rect.zIndex = 8;
+                                                       selectionHelper = $(helperRes)
+                                                               .css(rect)
+                                                               .appendTo(slotContent);
+                                               }
+                                       }else{
+                                               rect.isStart = true; // conside rect a "seg" now
+                                               rect.isEnd = true;   //
+                                               selectionHelper = $(slotSegHtml(
+                                                       {
+                                                               title: '',
+                                                               start: startDate,
+                                                               end: endDate,
+                                                               className: ['fc-select-helper'],
+                                                               editable: false
+                                                       },
+                                                       rect
+                                               ));
+                                               selectionHelper.css('opacity', opt('dragOpacity'));
+                                       }
+                                       if (selectionHelper) {
+                                               slotBind(selectionHelper);
+                                               slotContent.append(selectionHelper);
+                                               setOuterWidth(selectionHelper, rect.width, true); // needs to be after appended
+                                               setOuterHeight(selectionHelper, rect.height, true);
+                                       }
+                               }
+                       }
+               }else{
+                       renderSlotOverlay(startDate, endDate);
+               }
+       }
+       
+       
+       function clearSelection() {
+               clearOverlays();
+               if (selectionHelper) {
+                       selectionHelper.remove();
+                       selectionHelper = null;
+               }
+       }
+       
+       
+       function slotSelectionMousedown(ev) {
+               if (ev.which == 1 && opt('selectable')) { // ev.which==1 means left mouse button
+                       unselect(ev);
+                       var dates;
+                       hoverListener.start(function(cell, origCell) {
+                               clearSelection();
+                               if (cell && cell.col == origCell.col && !cellIsAllDay(cell)) {
+                                       var d1 = cellDate(origCell);
+                                       var d2 = cellDate(cell);
+                                       dates = [
+                                               d1,
+                                               addMinutes(cloneDate(d1), opt('slotMinutes')),
+                                               d2,
+                                               addMinutes(cloneDate(d2), opt('slotMinutes'))
+                                       ].sort(cmp);
+                                       renderSlotSelection(dates[0], dates[3]);
+                               }else{
+                                       dates = null;
+                               }
+                       }, ev);
+                       $(document).one('mouseup', function(ev) {
+                               hoverListener.stop();
+                               if (dates) {
+                                       if (+dates[0] == +dates[1]) {
+                                               reportDayClick(dates[0], false, ev);
+                                       }
+                                       reportSelection(dates[0], dates[3], false, ev);
+                               }
+                       });
+               }
+       }
+       
+       
+       function reportDayClick(date, allDay, ev) {
+               trigger('dayClick', dayBodyCells[dayOfWeekCol(date.getDay())], date, allDay, ev);
+       }
+       
+       
+       
+       /* External Dragging
+       --------------------------------------------------------------------------------*/
+       
+       
+       function dragStart(_dragElement, ev, ui) {
+               hoverListener.start(function(cell) {
+                       clearOverlays();
+                       if (cell) {
+                               if (cellIsAllDay(cell)) {
+                                       renderCellOverlay(cell.row, cell.col, cell.row, cell.col);
+                               }else{
+                                       var d1 = cellDate(cell);
+                                       var d2 = addMinutes(cloneDate(d1), opt('defaultEventMinutes'));
+                                       renderSlotOverlay(d1, d2);
+                               }
+                       }
+               }, ev);
+       }
+       
+       
+       function dragStop(_dragElement, ev, ui) {
+               var cell = hoverListener.stop();
+               clearOverlays();
+               if (cell) {
+                       trigger('drop', _dragElement, cellDate(cell), cellIsAllDay(cell), ev, ui);
+               }
+       }
+
+
+}
+
+function AgendaEventRenderer() {
+       var t = this;
+       
+       
+       // exports
+       t.renderEvents = renderEvents;
+       t.compileDaySegs = compileDaySegs; // for DayEventRenderer
+       t.clearEvents = clearEvents;
+       t.slotSegHtml = slotSegHtml;
+       t.bindDaySeg = bindDaySeg;
+       
+       
+       // imports
+       DayEventRenderer.call(t);
+       var opt = t.opt;
+       var trigger = t.trigger;
+       //var setOverflowHidden = t.setOverflowHidden;
+       var isEventDraggable = t.isEventDraggable;
+       var isEventResizable = t.isEventResizable;
+       var eventEnd = t.eventEnd;
+       var reportEvents = t.reportEvents;
+       var reportEventClear = t.reportEventClear;
+       var eventElementHandlers = t.eventElementHandlers;
+       var setHeight = t.setHeight;
+       var getDaySegmentContainer = t.getDaySegmentContainer;
+       var getSlotSegmentContainer = t.getSlotSegmentContainer;
+       var getHoverListener = t.getHoverListener;
+       var getMaxMinute = t.getMaxMinute;
+       var getMinMinute = t.getMinMinute;
+       var timePosition = t.timePosition;
+       var colContentLeft = t.colContentLeft;
+       var colContentRight = t.colContentRight;
+       var renderDaySegs = t.renderDaySegs;
+       var resizableDayEvent = t.resizableDayEvent; // TODO: streamline binding architecture
+       var getColCnt = t.getColCnt;
+       var getColWidth = t.getColWidth;
+       var getSlotHeight = t.getSlotHeight;
+       var getBodyContent = t.getBodyContent;
+       var reportEventElement = t.reportEventElement;
+       var showEvents = t.showEvents;
+       var hideEvents = t.hideEvents;
+       var eventDrop = t.eventDrop;
+       var eventResize = t.eventResize;
+       var renderDayOverlay = t.renderDayOverlay;
+       var clearOverlays = t.clearOverlays;
+       var calendar = t.calendar;
+       var formatDate = calendar.formatDate;
+       var formatDates = calendar.formatDates;
+       
+       
+       
+       /* Rendering
+       ----------------------------------------------------------------------------*/
+       
+
+       function renderEvents(events, modifiedEventId) {
+               reportEvents(events);
+               var i, len=events.length,
+                       dayEvents=[],
+                       slotEvents=[];
+               for (i=0; i<len; i++) {
+                       if (events[i].allDay) {
+                               dayEvents.push(events[i]);
+                       }else{
+                               slotEvents.push(events[i]);
+                       }
+               }
+               if (opt('allDaySlot')) {
+                       renderDaySegs(compileDaySegs(dayEvents), modifiedEventId);
+                       setHeight(); // no params means set to viewHeight
+               }
+               renderSlotSegs(compileSlotSegs(slotEvents), modifiedEventId);
+       }
+       
+       
+       function clearEvents() {
+               reportEventClear();
+               getDaySegmentContainer().empty();
+               getSlotSegmentContainer().empty();
+       }
+       
+       
+       function compileDaySegs(events) {
+               var levels = stackSegs(sliceSegs(events, $.map(events, exclEndDay), t.visStart, t.visEnd)),
+                       i, levelCnt=levels.length, level,
+                       j, seg,
+                       segs=[];
+               for (i=0; i<levelCnt; i++) {
+                       level = levels[i];
+                       for (j=0; j<level.length; j++) {
+                               seg = level[j];
+                               seg.row = 0;
+                               seg.level = i; // not needed anymore
+                               segs.push(seg);
+                       }
+               }
+               return segs;
+       }
+       
+       
+       function compileSlotSegs(events) {
+               var colCnt = getColCnt(),
+                       minMinute = getMinMinute(),
+                       maxMinute = getMaxMinute(),
+                       d = addMinutes(cloneDate(t.visStart), minMinute),
+                       visEventEnds = $.map(events, slotEventEnd),
+                       i, col,
+                       j, level,
+                       k, seg,
+                       segs=[];
+               for (i=0; i<colCnt; i++) {
+                       col = stackSegs(sliceSegs(events, visEventEnds, d, addMinutes(cloneDate(d), maxMinute-minMinute)));
+                       countForwardSegs(col);
+                       for (j=0; j<col.length; j++) {
+                               level = col[j];
+                               for (k=0; k<level.length; k++) {
+                                       seg = level[k];
+                                       seg.col = i;
+                                       seg.level = j;
+                                       segs.push(seg);
+                               }
+                       }
+                       addDays(d, 1, true);
+               }
+               return segs;
+       }
+       
+       
+       function slotEventEnd(event) {
+               if (event.end) {
+                       return cloneDate(event.end);
+               }else{
+                       return addMinutes(cloneDate(event.start), opt('defaultEventMinutes'));
+               }
+       }
+       
+       
+       // renders events in the 'time slots' at the bottom
+       
+       function renderSlotSegs(segs, modifiedEventId) {
+       
+               var i, segCnt=segs.length, seg,
+                       event,
+                       classes,
+                       top, bottom,
+                       colI, levelI, forward,
+                       leftmost,
+                       availWidth,
+                       outerWidth,
+                       left,
+                       html='',
+                       eventElements,
+                       eventElement,
+                       triggerRes,
+                       vsideCache={},
+                       hsideCache={},
+                       key, val,
+                       contentElement,
+                       height,
+                       slotSegmentContainer = getSlotSegmentContainer(),
+                       rtl, dis, dit,
+                       colCnt = getColCnt();
+                       
+               if (rtl = opt('isRTL')) {
+                       dis = -1;
+                       dit = colCnt - 1;
+               }else{
+                       dis = 1;
+                       dit = 0;
+               }
+                       
+               // calculate position/dimensions, create html
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       event = seg.event;
+                       top = timePosition(seg.start, seg.start);
+                       bottom = timePosition(seg.start, seg.end);
+                       colI = seg.col;
+                       levelI = seg.level;
+                       forward = seg.forward || 0;
+                       leftmost = colContentLeft(colI*dis + dit);
+                       availWidth = colContentRight(colI*dis + dit) - leftmost;
+                       availWidth = Math.min(availWidth-6, availWidth*.95); // TODO: move this to CSS
+                       if (levelI) {
+                               // indented and thin
+                               outerWidth = availWidth / (levelI + forward + 1);
+                       }else{
+                               if (forward) {
+                                       // moderately wide, aligned left still
+                                       outerWidth = ((availWidth / (forward + 1)) - (12/2)) * 2; // 12 is the predicted width of resizer =
+                               }else{
+                                       // can be entire width, aligned left
+                                       outerWidth = availWidth;
+                               }
+                       }
+                       left = leftmost +                                  // leftmost possible
+                               (availWidth / (levelI + forward + 1) * levelI) // indentation
+                               * dis + (rtl ? availWidth - outerWidth : 0);   // rtl
+                       seg.top = top;
+                       seg.left = left;
+                       seg.outerWidth = outerWidth;
+                       seg.outerHeight = bottom - top;
+                       html += slotSegHtml(event, seg);
+               }
+               slotSegmentContainer[0].innerHTML = html; // faster than html()
+               eventElements = slotSegmentContainer.children();
+               
+               // retrieve elements, run through eventRender callback, bind event handlers
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       event = seg.event;
+                       eventElement = $(eventElements[i]); // faster than eq()
+                       triggerRes = trigger('eventRender', event, event, eventElement);
+                       if (triggerRes === false) {
+                               eventElement.remove();
+                       }else{
+                               if (triggerRes && triggerRes !== true) {
+                                       eventElement.remove();
+                                       eventElement = $(triggerRes)
+                                               .css({
+                                                       position: 'absolute',
+                                                       top: seg.top,
+                                                       left: seg.left
+                                               })
+                                               .appendTo(slotSegmentContainer);
+                               }
+                               seg.element = eventElement;
+                               if (event._id === modifiedEventId) {
+                                       bindSlotSeg(event, eventElement, seg);
+                               }else{
+                                       eventElement[0]._fci = i; // for lazySegBind
+                               }
+                               reportEventElement(event, eventElement);
+                       }
+               }
+               
+               lazySegBind(slotSegmentContainer, segs, bindSlotSeg);
+               
+               // record event sides and title positions
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       if (eventElement = seg.element) {
+                               val = vsideCache[key = seg.key = cssKey(eventElement[0])];
+                               seg.vsides = val === undefined ? (vsideCache[key] = vsides(eventElement, true)) : val;
+                               val = hsideCache[key];
+                               seg.hsides = val === undefined ? (hsideCache[key] = hsides(eventElement, true)) : val;
+                               contentElement = eventElement.find('div.fc-event-content');
+                               if (contentElement.length) {
+                                       seg.contentTop = contentElement[0].offsetTop;
+                               }
+                       }
+               }
+               
+               // set all positions/dimensions at once
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       if (eventElement = seg.element) {
+                               eventElement[0].style.width = Math.max(0, seg.outerWidth - seg.hsides) + 'px';
+                               height = Math.max(0, seg.outerHeight - seg.vsides);
+                               eventElement[0].style.height = height + 'px';
+                               event = seg.event;
+                               if (seg.contentTop !== undefined && height - seg.contentTop < 10) {
+                                       // not enough room for title, put it in the time header
+                                       eventElement.find('div.fc-event-time')
+                                               .text(formatDate(event.start, opt('timeFormat')) + ' - ' + event.title);
+                                       eventElement.find('div.fc-event-title')
+                                               .remove();
+                               }
+                               trigger('eventAfterRender', event, event, eventElement);
+                       }
+               }
+                                       
+       }
+       
+       
+       function slotSegHtml(event, seg) {
+               var html = "<";
+               var url = event.url;
+               var skinCss = getSkinCss(event, opt);
+               var skinCssAttr = (skinCss ? " style='" + skinCss + "'" : '');
+               var classes = ['fc-event', 'fc-event-skin', 'fc-event-vert'];
+               if (isEventDraggable(event)) {
+                       classes.push('fc-event-draggable');
+               }
+               if (seg.isStart) {
+                       classes.push('fc-corner-top');
+               }
+               if (seg.isEnd) {
+                       classes.push('fc-corner-bottom');
+               }
+               classes = classes.concat(event.className);
+               if (event.source) {
+                       classes = classes.concat(event.source.className || []);
+               }
+               if (url) {
+                       html += "a href='" + htmlEscape(event.url) + "'";
+               }else{
+                       html += "div";
+               }
+               html +=
+                       " class='" + classes.join(' ') + "'" +
+                       " style='position:absolute;z-index:8;top:" + seg.top + "px;left:" + seg.left + "px;" + skinCss + "'" +
+                       ">" +
+                       "<div class='fc-event-inner fc-event-skin'" + skinCssAttr + ">" +
+                       "<div class='fc-event-head fc-event-skin'" + skinCssAttr + ">" +
+                       "<div class='fc-event-time'>" +
+                       htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
+                       "</div>" +
+                       "</div>" +
+                       "<div class='fc-event-content'>" +
+                       "<div class='fc-event-title'>" +
+                       htmlEscape(event.title) +
+                       "</div>" +
+                       "</div>" +
+                       "<div class='fc-event-bg'></div>" +
+                       "</div>"; // close inner
+               if (seg.isEnd && isEventResizable(event)) {
+                       html +=
+                               "<div class='ui-resizable-handle ui-resizable-s'>=</div>";
+               }
+               html +=
+                       "</" + (url ? "a" : "div") + ">";
+               return html;
+       }
+       
+       
+       function bindDaySeg(event, eventElement, seg) {
+               if (isEventDraggable(event)) {
+                       draggableDayEvent(event, eventElement, seg.isStart);
+               }
+               if (seg.isEnd && isEventResizable(event)) {
+                       resizableDayEvent(event, eventElement, seg);
+               }
+               eventElementHandlers(event, eventElement);
+                       // needs to be after, because resizableDayEvent might stopImmediatePropagation on click
+       }
+       
+       
+       function bindSlotSeg(event, eventElement, seg) {
+               var timeElement = eventElement.find('div.fc-event-time');
+               if (isEventDraggable(event)) {
+                       draggableSlotEvent(event, eventElement, timeElement);
+               }
+               if (seg.isEnd && isEventResizable(event)) {
+                       resizableSlotEvent(event, eventElement, timeElement);
+               }
+               eventElementHandlers(event, eventElement);
+       }
+       
+       
+       
+       /* Dragging
+       -----------------------------------------------------------------------------------*/
+       
+       
+       // when event starts out FULL-DAY
+       
+       function draggableDayEvent(event, eventElement, isStart) {
+               var origWidth;
+               var revert;
+               var allDay=true;
+               var dayDelta;
+               var dis = opt('isRTL') ? -1 : 1;
+               var hoverListener = getHoverListener();
+               var colWidth = getColWidth();
+               var slotHeight = getSlotHeight();
+               var minMinute = getMinMinute();
+               eventElement.draggable({
+                       zIndex: 9,
+                       opacity: opt('dragOpacity', 'month'), // use whatever the month view was using
+                       revertDuration: opt('dragRevertDuration'),
+                       start: function(ev, ui) {
+                               trigger('eventDragStart', eventElement, event, ev, ui);
+                               hideEvents(event, eventElement);
+                               origWidth = eventElement.width();
+                               hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
+                                       clearOverlays();
+                                       if (cell) {
+                                               //setOverflowHidden(true);
+                                               revert = false;
+                                               dayDelta = colDelta * dis;
+                                               if (!cell.row) {
+                                                       // on full-days
+                                                       renderDayOverlay(
+                                                               addDays(cloneDate(event.start), dayDelta),
+                                                               addDays(exclEndDay(event), dayDelta)
+                                                       );
+                                                       resetElement();
+                                               }else{
+                                                       // mouse is over bottom slots
+                                                       if (isStart) {
+                                                               if (allDay) {
+                                                                       // convert event to temporary slot-event
+                                                                       eventElement.width(colWidth - 10); // don't use entire width
+                                                                       setOuterHeight(
+                                                                               eventElement,
+                                                                               slotHeight * Math.round(
+                                                                                       (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes'))
+                                                                                       / opt('slotMinutes')
+                                                                               )
+                                                                       );
+                                                                       eventElement.draggable('option', 'grid', [colWidth, 1]);
+                                                                       allDay = false;
+                                                               }
+                                                       }else{
+                                                               revert = true;
+                                                       }
+                                               }
+                                               revert = revert || (allDay && !dayDelta);
+                                       }else{
+                                               resetElement();
+                                               //setOverflowHidden(false);
+                                               revert = true;
+                                       }
+                                       eventElement.draggable('option', 'revert', revert);
+                               }, ev, 'drag');
+                       },
+                       stop: function(ev, ui) {
+                               hoverListener.stop();
+                               clearOverlays();
+                               trigger('eventDragStop', eventElement, event, ev, ui);
+                               if (revert) {
+                                       // hasn't moved or is out of bounds (draggable has already reverted)
+                                       resetElement();
+                                       eventElement.css('filter', ''); // clear IE opacity side-effects
+                                       showEvents(event, eventElement);
+                               }else{
+                                       // changed!
+                                       var minuteDelta = 0;
+                                       if (!allDay) {
+                                               minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight)
+                                                       * opt('slotMinutes')
+                                                       + minMinute
+                                                       - (event.start.getHours() * 60 + event.start.getMinutes());
+                                       }
+                                       eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui);
+                               }
+                               //setOverflowHidden(false);
+                       }
+               });
+               function resetElement() {
+                       if (!allDay) {
+                               eventElement
+                                       .width(origWidth)
+                                       .height('')
+                                       .draggable('option', 'grid', null);
+                               allDay = true;
+                       }
+               }
+       }
+       
+       
+       // when event starts out IN TIMESLOTS
+       
+       function draggableSlotEvent(event, eventElement, timeElement) {
+               var origPosition;
+               var allDay=false;
+               var dayDelta;
+               var minuteDelta;
+               var prevMinuteDelta;
+               var dis = opt('isRTL') ? -1 : 1;
+               var hoverListener = getHoverListener();
+               var colCnt = getColCnt();
+               var colWidth = getColWidth();
+               var slotHeight = getSlotHeight();
+               eventElement.draggable({
+                       zIndex: 9,
+                       scroll: false,
+                       grid: [colWidth, slotHeight],
+                       axis: colCnt==1 ? 'y' : false,
+                       opacity: opt('dragOpacity'),
+                       revertDuration: opt('dragRevertDuration'),
+                       start: function(ev, ui) {
+                               trigger('eventDragStart', eventElement, event, ev, ui);
+                               hideEvents(event, eventElement);
+                               origPosition = eventElement.position();
+                               minuteDelta = prevMinuteDelta = 0;
+                               hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
+                                       eventElement.draggable('option', 'revert', !cell);
+                                       clearOverlays();
+                                       if (cell) {
+                                               dayDelta = colDelta * dis;
+                                               if (opt('allDaySlot') && !cell.row) {
+                                                       // over full days
+                                                       if (!allDay) {
+                                                               // convert to temporary all-day event
+                                                               allDay = true;
+                                                               timeElement.hide();
+                                                               eventElement.draggable('option', 'grid', null);
+                                                       }
+                                                       renderDayOverlay(
+                                                               addDays(cloneDate(event.start), dayDelta),
+                                                               addDays(exclEndDay(event), dayDelta)
+                                                       );
+                                               }else{
+                                                       // on slots
+                                                       resetElement();
+                                               }
+                                       }
+                               }, ev, 'drag');
+                       },
+                       drag: function(ev, ui) {
+                               minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes');
+                               if (minuteDelta != prevMinuteDelta) {
+                                       if (!allDay) {
+                                               updateTimeText(minuteDelta);
+                                       }
+                                       prevMinuteDelta = minuteDelta;
+                               }
+                       },
+                       stop: function(ev, ui) {
+                               var cell = hoverListener.stop();
+                               clearOverlays();
+                               trigger('eventDragStop', eventElement, event, ev, ui);
+                               if (cell && (dayDelta || minuteDelta || allDay)) {
+                                       // changed!
+                                       eventDrop(this, event, dayDelta, allDay ? 0 : minuteDelta, allDay, ev, ui);
+                               }else{
+                                       // either no change or out-of-bounds (draggable has already reverted)
+                                       resetElement();
+                                       eventElement.css('filter', ''); // clear IE opacity side-effects
+                                       eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position
+                                       updateTimeText(0);
+                                       showEvents(event, eventElement);
+                               }
+                       }
+               });
+               function updateTimeText(minuteDelta) {
+                       var newStart = addMinutes(cloneDate(event.start), minuteDelta);
+                       var newEnd;
+                       if (event.end) {
+                               newEnd = addMinutes(cloneDate(event.end), minuteDelta);
+                       }
+                       timeElement.text(formatDates(newStart, newEnd, opt('timeFormat')));
+               }
+               function resetElement() {
+                       // convert back to original slot-event
+                       if (allDay) {
+                               timeElement.css('display', ''); // show() was causing display=inline
+                               eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
+                               allDay = false;
+                       }
+               }
+       }
+       
+       
+       
+       /* Resizing
+       --------------------------------------------------------------------------------------*/
+       
+       
+       function resizableSlotEvent(event, eventElement, timeElement) {
+               var slotDelta, prevSlotDelta;
+               var slotHeight = getSlotHeight();
+               eventElement.resizable({
+                       handles: {
+                               s: 'div.ui-resizable-s'
+                       },
+                       grid: slotHeight,
+                       start: function(ev, ui) {
+                               slotDelta = prevSlotDelta = 0;
+                               hideEvents(event, eventElement);
+                               eventElement.css('z-index', 9);
+                               trigger('eventResizeStart', this, event, ev, ui);
+                       },
+                       resize: function(ev, ui) {
+                               // don't rely on ui.size.height, doesn't take grid into account
+                               slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
+                               if (slotDelta != prevSlotDelta) {
+                                       timeElement.text(
+                                               formatDates(
+                                                       event.start,
+                                                       (!slotDelta && !event.end) ? null : // no change, so don't display time range
+                                                               addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta),
+                                                       opt('timeFormat')
+                                               )
+                                       );
+                                       prevSlotDelta = slotDelta;
+                               }
+                       },
+                       stop: function(ev, ui) {
+                               trigger('eventResizeStop', this, event, ev, ui);
+                               if (slotDelta) {
+                                       eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui);
+                               }else{
+                                       eventElement.css('z-index', 8);
+                                       showEvents(event, eventElement);
+                                       // BUG: if event was really short, need to put title back in span
+                               }
+                       }
+               });
+       }
+       
+
+}
+
+
+function countForwardSegs(levels) {
+       var i, j, k, level, segForward, segBack;
+       for (i=levels.length-1; i>0; i--) {
+               level = levels[i];
+               for (j=0; j<level.length; j++) {
+                       segForward = level[j];
+                       for (k=0; k<levels[i-1].length; k++) {
+                               segBack = levels[i-1][k];
+                               if (segsCollide(segForward, segBack)) {
+                                       segBack.forward = Math.max(segBack.forward||0, (segForward.forward||0)+1);
+                               }
+                       }
+               }
+       }
+}
+
+
+
+
+function View(element, calendar, viewName) {
+       var t = this;
+       
+       
+       // exports
+       t.element = element;
+       t.calendar = calendar;
+       t.name = viewName;
+       t.opt = opt;
+       t.trigger = trigger;
+       //t.setOverflowHidden = setOverflowHidden;
+       t.isEventDraggable = isEventDraggable;
+       t.isEventResizable = isEventResizable;
+       t.reportEvents = reportEvents;
+       t.eventEnd = eventEnd;
+       t.reportEventElement = reportEventElement;
+       t.reportEventClear = reportEventClear;
+       t.eventElementHandlers = eventElementHandlers;
+       t.showEvents = showEvents;
+       t.hideEvents = hideEvents;
+       t.eventDrop = eventDrop;
+       t.eventResize = eventResize;
+       // t.title
+       // t.start, t.end
+       // t.visStart, t.visEnd
+       
+       
+       // imports
+       var defaultEventEnd = t.defaultEventEnd;
+       var normalizeEvent = calendar.normalizeEvent; // in EventManager
+       var reportEventChange = calendar.reportEventChange;
+       
+       
+       // locals
+       var eventsByID = {};
+       var eventElements = [];
+       var eventElementsByID = {};
+       var options = calendar.options;
+       
+       
+       
+       function opt(name, viewNameOverride) {
+               var v = options[name];
+               if (typeof v == 'object') {
+                       return smartProperty(v, viewNameOverride || viewName);
+               }
+               return v;
+       }
+
+       
+       function trigger(name, thisObj) {
+               return calendar.trigger.apply(
+                       calendar,
+                       [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t])
+               );
+       }
+       
+       
+       /*
+       function setOverflowHidden(bool) {
+               element.css('overflow', bool ? 'hidden' : '');
+       }
+       */
+       
+       
+       function isEventDraggable(event) {
+               return isEventEditable(event) && !opt('disableDragging');
+       }
+       
+       
+       function isEventResizable(event) { // but also need to make sure the seg.isEnd == true
+               return isEventEditable(event) && !opt('disableResizing');
+       }
+       
+       
+       function isEventEditable(event) {
+               return firstDefined(event.editable, (event.source || {}).editable, opt('editable'));
+       }
+       
+       
+       
+       /* Event Data
+       ------------------------------------------------------------------------------*/
+       
+       
+       // report when view receives new events
+       function reportEvents(events) { // events are already normalized at this point
+               eventsByID = {};
+               var i, len=events.length, event;
+               for (i=0; i<len; i++) {
+                       event = events[i];
+                       if (eventsByID[event._id]) {
+                               eventsByID[event._id].push(event);
+                       }else{
+                               eventsByID[event._id] = [event];
+                       }
+               }
+       }
+       
+       
+       // returns a Date object for an event's end
+       function eventEnd(event) {
+               return event.end ? cloneDate(event.end) : defaultEventEnd(event);
+       }
+       
+       
+       
+       /* Event Elements
+       ------------------------------------------------------------------------------*/
+       
+       
+       // report when view creates an element for an event
+       function reportEventElement(event, element) {
+               eventElements.push(element);
+               if (eventElementsByID[event._id]) {
+                       eventElementsByID[event._id].push(element);
+               }else{
+                       eventElementsByID[event._id] = [element];
+               }
+       }
+       
+       
+       function reportEventClear() {
+               eventElements = [];
+               eventElementsByID = {};
+       }
+       
+       
+       // attaches eventClick, eventMouseover, eventMouseout
+       function eventElementHandlers(event, eventElement) {
+               eventElement
+                       .click(function(ev) {
+                               if (!eventElement.hasClass('ui-draggable-dragging') &&
+                                       !eventElement.hasClass('ui-resizable-resizing')) {
+                                               return trigger('eventClick', this, event, ev);
+                                       }
+                       })
+                       .hover(
+                               function(ev) {
+                                       trigger('eventMouseover', this, event, ev);
+                               },
+                               function(ev) {
+                                       trigger('eventMouseout', this, event, ev);
+                               }
+                       );
+               // TODO: don't fire eventMouseover/eventMouseout *while* dragging is occuring (on subject element)
+               // TODO: same for resizing
+       }
+       
+       
+       function showEvents(event, exceptElement) {
+               eachEventElement(event, exceptElement, 'show');
+       }
+       
+       
+       function hideEvents(event, exceptElement) {
+               eachEventElement(event, exceptElement, 'hide');
+       }
+       
+       
+       function eachEventElement(event, exceptElement, funcName) {
+               var elements = eventElementsByID[event._id],
+                       i, len = elements.length;
+               for (i=0; i<len; i++) {
+                       if (!exceptElement || elements[i][0] != exceptElement[0]) {
+                               elements[i][funcName]();
+                       }
+               }
+       }
+       
+       
+       
+       /* Event Modification Reporting
+       ---------------------------------------------------------------------------------*/
+       
+       
+       function eventDrop(e, event, dayDelta, minuteDelta, allDay, ev, ui) {
+               var oldAllDay = event.allDay;
+               var eventId = event._id;
+               moveEvents(eventsByID[eventId], dayDelta, minuteDelta, allDay);
+               trigger(
+                       'eventDrop',
+                       e,
+                       event,
+                       dayDelta,
+                       minuteDelta,
+                       allDay,
+                       function() {
+                               // TODO: investigate cases where this inverse technique might not work
+                               moveEvents(eventsByID[eventId], -dayDelta, -minuteDelta, oldAllDay);
+                               reportEventChange(eventId);
+                       },
+                       ev,
+                       ui
+               );
+               reportEventChange(eventId);
+       }
+       
+       
+       function eventResize(e, event, dayDelta, minuteDelta, ev, ui) {
+               var eventId = event._id;
+               elongateEvents(eventsByID[eventId], dayDelta, minuteDelta);
+               trigger(
+                       'eventResize',
+                       e,
+                       event,
+                       dayDelta,
+                       minuteDelta,
+                       function() {
+                               // TODO: investigate cases where this inverse technique might not work
+                               elongateEvents(eventsByID[eventId], -dayDelta, -minuteDelta);
+                               reportEventChange(eventId);
+                       },
+                       ev,
+                       ui
+               );
+               reportEventChange(eventId);
+       }
+       
+       
+       
+       /* Event Modification Math
+       ---------------------------------------------------------------------------------*/
+       
+       
+       function moveEvents(events, dayDelta, minuteDelta, allDay) {
+               minuteDelta = minuteDelta || 0;
+               for (var e, len=events.length, i=0; i<len; i++) {
+                       e = events[i];
+                       if (allDay !== undefined) {
+                               e.allDay = allDay;
+                       }
+                       addMinutes(addDays(e.start, dayDelta, true), minuteDelta);
+                       if (e.end) {
+                               e.end = addMinutes(addDays(e.end, dayDelta, true), minuteDelta);
+                       }
+                       normalizeEvent(e, options);
+               }
+       }
+       
+       
+       function elongateEvents(events, dayDelta, minuteDelta) {
+               minuteDelta = minuteDelta || 0;
+               for (var e, len=events.length, i=0; i<len; i++) {
+                       e = events[i];
+                       e.end = addMinutes(addDays(eventEnd(e), dayDelta, true), minuteDelta);
+                       normalizeEvent(e, options);
+               }
+       }
+       
+
+}
+
+function DayEventRenderer() {
+       var t = this;
+
+       
+       // exports
+       t.renderDaySegs = renderDaySegs;
+       t.resizableDayEvent = resizableDayEvent;
+       
+       
+       // imports
+       var opt = t.opt;
+       var trigger = t.trigger;
+       var isEventDraggable = t.isEventDraggable;
+       var isEventResizable = t.isEventResizable;
+       var eventEnd = t.eventEnd;
+       var reportEventElement = t.reportEventElement;
+       var showEvents = t.showEvents;
+       var hideEvents = t.hideEvents;
+       var eventResize = t.eventResize;
+       var getRowCnt = t.getRowCnt;
+       var getColCnt = t.getColCnt;
+       var getColWidth = t.getColWidth;
+       var allDayRow = t.allDayRow;
+       var allDayBounds = t.allDayBounds;
+       var colContentLeft = t.colContentLeft;
+       var colContentRight = t.colContentRight;
+       var dayOfWeekCol = t.dayOfWeekCol;
+       var dateCell = t.dateCell;
+       var compileDaySegs = t.compileDaySegs;
+       var getDaySegmentContainer = t.getDaySegmentContainer;
+       var bindDaySeg = t.bindDaySeg; //TODO: streamline this
+       var formatDates = t.calendar.formatDates;
+       var renderDayOverlay = t.renderDayOverlay;
+       var clearOverlays = t.clearOverlays;
+       var clearSelection = t.clearSelection;
+       
+       
+       
+       /* Rendering
+       -----------------------------------------------------------------------------*/
+       
+       
+       function renderDaySegs(segs, modifiedEventId) {
+               var segmentContainer = getDaySegmentContainer();
+               var rowDivs;
+               var rowCnt = getRowCnt();
+               var colCnt = getColCnt();
+               var i = 0;
+               var rowI;
+               var levelI;
+               var colHeights;
+               var j;
+               var segCnt = segs.length;
+               var seg;
+               var top;
+               var k;
+               segmentContainer[0].innerHTML = daySegHTML(segs); // faster than .html()
+               daySegElementResolve(segs, segmentContainer.children());
+               daySegElementReport(segs);
+               daySegHandlers(segs, segmentContainer, modifiedEventId);
+               daySegCalcHSides(segs);
+               daySegSetWidths(segs);
+               daySegCalcHeights(segs);
+               rowDivs = getRowDivs();
+               // set row heights, calculate event tops (in relation to row top)
+               for (rowI=0; rowI<rowCnt; rowI++) {
+                       levelI = 0;
+                       colHeights = [];
+                       for (j=0; j<colCnt; j++) {
+                               colHeights[j] = 0;
+                       }
+                       while (i<segCnt && (seg = segs[i]).row == rowI) {
+                               // loop through segs in a row
+                               top = arrayMax(colHeights.slice(seg.startCol, seg.endCol));
+                               seg.top = top;
+                               top += seg.outerHeight;
+                               for (k=seg.startCol; k<seg.endCol; k++) {
+                                       colHeights[k] = top;
+                               }
+                               i++;
+                       }
+                       rowDivs[rowI].height(arrayMax(colHeights));
+               }
+               daySegSetTops(segs, getRowTops(rowDivs));
+       }
+       
+       
+       function renderTempDaySegs(segs, adjustRow, adjustTop) {
+               var tempContainer = $("<div/>");
+               var elements;
+               var segmentContainer = getDaySegmentContainer();
+               var i;
+               var segCnt = segs.length;
+               var element;
+               tempContainer[0].innerHTML = daySegHTML(segs); // faster than .html()
+               elements = tempContainer.children();
+               segmentContainer.append(elements);
+               daySegElementResolve(segs, elements);
+               daySegCalcHSides(segs);
+               daySegSetWidths(segs);
+               daySegCalcHeights(segs);
+               daySegSetTops(segs, getRowTops(getRowDivs()));
+               elements = [];
+               for (i=0; i<segCnt; i++) {
+                       element = segs[i].element;
+                       if (element) {
+                               if (segs[i].row === adjustRow) {
+                                       element.css('top', adjustTop);
+                               }
+                               elements.push(element[0]);
+                       }
+               }
+               return $(elements);
+       }
+       
+       
+       function daySegHTML(segs) { // also sets seg.left and seg.outerWidth
+               var rtl = opt('isRTL');
+               var i;
+               var segCnt=segs.length;
+               var seg;
+               var event;
+               var url;
+               var classes;
+               var bounds = allDayBounds();
+               var minLeft = bounds.left;
+               var maxLeft = bounds.right;
+               var leftCol;
+               var rightCol;
+               var left;
+               var right;
+               var skinCss;
+               var html = '';
+               // calculate desired position/dimensions, create html
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       event = seg.event;
+                       classes = ['fc-event', 'fc-event-skin', 'fc-event-hori'];
+                       if (isEventDraggable(event)) {
+                               classes.push('fc-event-draggable');
+                       }
+                       if (rtl) {
+                               if (seg.isStart) {
+                                       classes.push('fc-corner-right');
+                               }
+                               if (seg.isEnd) {
+                                       classes.push('fc-corner-left');
+                               }
+                               leftCol = dayOfWeekCol(seg.end.getDay()-1);
+                               rightCol = dayOfWeekCol(seg.start.getDay());
+                               left = seg.isEnd ? colContentLeft(leftCol) : minLeft;
+                               right = seg.isStart ? colContentRight(rightCol) : maxLeft;
+                       }else{
+                               if (seg.isStart) {
+                                       classes.push('fc-corner-left');
+                               }
+                               if (seg.isEnd) {
+                                       classes.push('fc-corner-right');
+                               }
+                               leftCol = dayOfWeekCol(seg.start.getDay());
+                               rightCol = dayOfWeekCol(seg.end.getDay()-1);
+                               left = seg.isStart ? colContentLeft(leftCol) : minLeft;
+                               right = seg.isEnd ? colContentRight(rightCol) : maxLeft;
+                       }
+                       classes = classes.concat(event.className);
+                       if (event.source) {
+                               classes = classes.concat(event.source.className || []);
+                       }
+                       url = event.url;
+                       skinCss = getSkinCss(event, opt);
+                       if (url) {
+                               html += "<a href='" + htmlEscape(url) + "'";
+                       }else{
+                               html += "<div";
+                       }
+                       html +=
+                               " class='" + classes.join(' ') + "'" +
+                               " style='position:absolute;z-index:8;left:"+left+"px;" + skinCss + "'" +
+                               ">" +
+                               "<div" +
+                               " class='fc-event-inner fc-event-skin'" +
+                               (skinCss ? " style='" + skinCss + "'" : '') +
+                               ">";
+                       if (!event.allDay && seg.isStart) {
+                               html +=
+                                       "<span class='fc-event-time'>" +
+                                       htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
+                                       "</span>";
+                       }
+                       html +=
+                               "<span class='fc-event-title'>" + htmlEscape(event.title) + "</span>" +
+                               "</div>";
+                       if (seg.isEnd && isEventResizable(event)) {
+                               html +=
+                                       "<div class='ui-resizable-handle ui-resizable-" + (rtl ? 'w' : 'e') + "'>" +
+                                       "&nbsp;&nbsp;&nbsp;" + // makes hit area a lot better for IE6/7
+                                       "</div>";
+                       }
+                       html +=
+                               "</" + (url ? "a" : "div" ) + ">";
+                       seg.left = left;
+                       seg.outerWidth = right - left;
+                       seg.startCol = leftCol;
+                       seg.endCol = rightCol + 1; // needs to be exclusive
+               }
+               return html;
+       }
+       
+       
+       function daySegElementResolve(segs, elements) { // sets seg.element
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var event;
+               var element;
+               var triggerRes;
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       event = seg.event;
+                       element = $(elements[i]); // faster than .eq()
+                       triggerRes = trigger('eventRender', event, event, element);
+                       if (triggerRes === false) {
+                               element.remove();
+                       }else{
+                               if (triggerRes && triggerRes !== true) {
+                                       triggerRes = $(triggerRes)
+                                               .css({
+                                                       position: 'absolute',
+                                                       left: seg.left
+                                               });
+                                       element.replaceWith(triggerRes);
+                                       element = triggerRes;
+                               }
+                               seg.element = element;
+                       }
+               }
+       }
+       
+       
+       function daySegElementReport(segs) {
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var element;
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       element = seg.element;
+                       if (element) {
+                               reportEventElement(seg.event, element);
+                       }
+               }
+       }
+       
+       
+       function daySegHandlers(segs, segmentContainer, modifiedEventId) {
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var element;
+               var event;
+               // retrieve elements, run through eventRender callback, bind handlers
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       element = seg.element;
+                       if (element) {
+                               event = seg.event;
+                               if (event._id === modifiedEventId) {
+                                       bindDaySeg(event, element, seg);
+                               }else{
+                                       element[0]._fci = i; // for lazySegBind
+                               }
+                       }
+               }
+               lazySegBind(segmentContainer, segs, bindDaySeg);
+       }
+       
+       
+       function daySegCalcHSides(segs) { // also sets seg.key
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var element;
+               var key, val;
+               var hsideCache = {};
+               // record event horizontal sides
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       element = seg.element;
+                       if (element) {
+                               key = seg.key = cssKey(element[0]);
+                               val = hsideCache[key];
+                               if (val === undefined) {
+                                       val = hsideCache[key] = hsides(element, true);
+                               }
+                               seg.hsides = val;
+                       }
+               }
+       }
+       
+       
+       function daySegSetWidths(segs) {
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var element;
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       element = seg.element;
+                       if (element) {
+                               element[0].style.width = Math.max(0, seg.outerWidth - seg.hsides) + 'px';
+                       }
+               }
+       }
+       
+       
+       function daySegCalcHeights(segs) {
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var element;
+               var key, val;
+               var vmarginCache = {};
+               // record event heights
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       element = seg.element;
+                       if (element) {
+                               key = seg.key; // created in daySegCalcHSides
+                               val = vmarginCache[key];
+                               if (val === undefined) {
+                                       val = vmarginCache[key] = vmargins(element);
+                               }
+                               seg.outerHeight = element[0].offsetHeight + val;
+                       }
+               }
+       }
+       
+       
+       function getRowDivs() {
+               var i;
+               var rowCnt = getRowCnt();
+               var rowDivs = [];
+               for (i=0; i<rowCnt; i++) {
+                       rowDivs[i] = allDayRow(i)
+                               .find('td:first div.fc-day-content > div'); // optimal selector?
+               }
+               return rowDivs;
+       }
+       
+       
+       function getRowTops(rowDivs) {
+               var i;
+               var rowCnt = rowDivs.length;
+               var tops = [];
+               for (i=0; i<rowCnt; i++) {
+                       tops[i] = rowDivs[i][0].offsetTop; // !!?? but this means the element needs position:relative if in a table cell!!!!
+               }
+               return tops;
+       }
+       
+       
+       function daySegSetTops(segs, rowTops) { // also triggers eventAfterRender
+               var i;
+               var segCnt = segs.length;
+               var seg;
+               var element;
+               var event;
+               for (i=0; i<segCnt; i++) {
+                       seg = segs[i];
+                       element = seg.element;
+                       if (element) {
+                               element[0].style.top = rowTops[seg.row] + (seg.top||0) + 'px';
+                               event = seg.event;
+                               trigger('eventAfterRender', event, event, element);
+                       }
+               }
+       }
+       
+       
+       
+       /* Resizing
+       -----------------------------------------------------------------------------------*/
+       
+       
+       function resizableDayEvent(event, element, seg) {
+               var rtl = opt('isRTL');
+               var direction = rtl ? 'w' : 'e';
+               var handle = element.find('div.ui-resizable-' + direction);
+               var isResizing = false;
+               
+               // TODO: look into using jquery-ui mouse widget for this stuff
+               disableTextSelection(element); // prevent native <a> selection for IE
+               element
+                       .mousedown(function(ev) { // prevent native <a> selection for others
+                               ev.preventDefault();
+                       })
+                       .click(function(ev) {
+                               if (isResizing) {
+                                       ev.preventDefault(); // prevent link from being visited (only method that worked in IE6)
+                                       ev.stopImmediatePropagation(); // prevent fullcalendar eventClick handler from being called
+                                                                      // (eventElementHandlers needs to be bound after resizableDayEvent)
+                               }
+                       });
+               
+               handle.mousedown(function(ev) {
+                       if (ev.which != 1) {
+                               return; // needs to be left mouse button
+                       }
+                       isResizing = true;
+                       var hoverListener = t.getHoverListener();
+                       var rowCnt = getRowCnt();
+                       var colCnt = getColCnt();
+                       var dis = rtl ? -1 : 1;
+                       var dit = rtl ? colCnt-1 : 0;
+                       var elementTop = element.css('top');
+                       var dayDelta;
+                       var helpers;
+                       var eventCopy = $.extend({}, event);
+                       var minCell = dateCell(event.start);
+                       clearSelection();
+                       $('body')
+                               .css('cursor', direction + '-resize')
+                               .one('mouseup', mouseup);
+                       trigger('eventResizeStart', this, event, ev);
+                       hoverListener.start(function(cell, origCell) {
+                               if (cell) {
+                                       var r = Math.max(minCell.row, cell.row);
+                                       var c = cell.col;
+                                       if (rowCnt == 1) {
+                                               r = 0; // hack for all-day area in agenda views
+                                       }
+                                       if (r == minCell.row) {
+                                               if (rtl) {
+                                                       c = Math.min(minCell.col, c);
+                                               }else{
+                                                       c = Math.max(minCell.col, c);
+                                               }
+                                       }
+                                       dayDelta = (r*7 + c*dis+dit) - (origCell.row*7 + origCell.col*dis+dit);
+                                       var newEnd = addDays(eventEnd(event), dayDelta, true);
+                                       if (dayDelta) {
+                                               eventCopy.end = newEnd;
+                                               var oldHelpers = helpers;
+                                               helpers = renderTempDaySegs(compileDaySegs([eventCopy]), seg.row, elementTop);
+                                               helpers.find('*').css('cursor', direction + '-resize');
+                                               if (oldHelpers) {
+                                                       oldHelpers.remove();
+                                               }
+                                               hideEvents(event);
+                                       }else{
+                                               if (helpers) {
+                                                       showEvents(event);
+                                                       helpers.remove();
+                                                       helpers = null;
+                                               }
+                                       }
+                                       clearOverlays();
+                                       renderDayOverlay(event.start, addDays(cloneDate(newEnd), 1)); // coordinate grid already rebuild at hoverListener.start
+                               }
+                       }, ev);
+                       
+                       function mouseup(ev) {
+                               trigger('eventResizeStop', this, event, ev);
+                               $('body').css('cursor', '');
+                               hoverListener.stop();
+                               clearOverlays();
+                               if (dayDelta) {
+                                       eventResize(this, event, dayDelta, 0, ev);
+                                       // event redraw will clear helpers
+                               }
+                               // otherwise, the drag handler already restored the old events
+                               
+                               setTimeout(function() { // make this happen after the element's click event
+                                       isResizing = false;
+                               },0);
+                       }
+                       
+               });
+       }
+       
+
+}
+
+//BUG: unselect needs to be triggered when events are dragged+dropped
+
+function SelectionManager() {
+       var t = this;
+       
+       
+       // exports
+       t.select = select;
+       t.unselect = unselect;
+       t.reportSelection = reportSelection;
+       t.daySelectionMousedown = daySelectionMousedown;
+       
+       
+       // imports
+       var opt = t.opt;
+       var trigger = t.trigger;
+       var defaultSelectionEnd = t.defaultSelectionEnd;
+       var renderSelection = t.renderSelection;
+       var clearSelection = t.clearSelection;
+       
+       
+       // locals
+       var selected = false;
+
+
+
+       // unselectAuto
+       if (opt('selectable') && opt('unselectAuto')) {
+               $(document).mousedown(function(ev) {
+                       var ignore = opt('unselectCancel');
+                       if (ignore) {
+                               if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match
+                                       return;
+                               }
+                       }
+                       unselect(ev);
+               });
+       }
+       
+
+       function select(startDate, endDate, allDay) {
+               unselect();
+               if (!endDate) {
+                       endDate = defaultSelectionEnd(startDate, allDay);
+               }
+               renderSelection(startDate, endDate, allDay);
+               reportSelection(startDate, endDate, allDay);
+       }
+       
+       
+       function unselect(ev) {
+               if (selected) {
+                       selected = false;
+                       clearSelection();
+                       trigger('unselect', null, ev);
+               }
+       }
+       
+       
+       function reportSelection(startDate, endDate, allDay, ev) {
+               selected = true;
+               trigger('select', null, startDate, endDate, allDay, ev);
+       }
+       
+       
+       function daySelectionMousedown(ev) { // not really a generic manager method, oh well
+               var cellDate = t.cellDate;
+               var cellIsAllDay = t.cellIsAllDay;
+               var hoverListener = t.getHoverListener();
+               var reportDayClick = t.reportDayClick; // this is hacky and sort of weird
+               if (ev.which == 1 && opt('selectable')) { // which==1 means left mouse button
+                       unselect(ev);
+                       var _mousedownElement = this;
+                       var dates;
+                       hoverListener.start(function(cell, origCell) { // TODO: maybe put cellDate/cellIsAllDay info in cell
+                               clearSelection();
+                               if (cell && cellIsAllDay(cell)) {
+                                       dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp);
+                                       renderSelection(dates[0], dates[1], true);
+                               }else{
+                                       dates = null;
+                               }
+                       }, ev);
+                       $(document).one('mouseup', function(ev) {
+                               hoverListener.stop();
+                               if (dates) {
+                                       if (+dates[0] == +dates[1]) {
+                                               reportDayClick(dates[0], true, ev);
+                                       }
+                                       reportSelection(dates[0], dates[1], true, ev);
+                               }
+                       });
+               }
+       }
+
+
+}
+function OverlayManager() {
+       var t = this;
+       
+       
+       // exports
+       t.renderOverlay = renderOverlay;
+       t.clearOverlays = clearOverlays;
+       
+       
+       // locals
+       var usedOverlays = [];
+       var unusedOverlays = [];
+       
+       
+       function renderOverlay(rect, parent) {
+               var e = unusedOverlays.shift();
+               if (!e) {
+                       e = $("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>");
+               }
+               if (e[0].parentNode != parent[0]) {
+                       e.appendTo(parent);
+               }
+               usedOverlays.push(e.css(rect).show());
+               return e;
+       }
+       
+
+       function clearOverlays() {
+               var e;
+               while (e = usedOverlays.shift()) {
+                       unusedOverlays.push(e.hide().unbind());
+               }
+       }
+
+
+}
+
+function CoordinateGrid(buildFunc) {
+
+       var t = this;
+       var rows;
+       var cols;
+       
+       
+       t.build = function() {
+               rows = [];
+               cols = [];
+               buildFunc(rows, cols);
+       };
+       
+       
+       t.cell = function(x, y) {
+               var rowCnt = rows.length;
+               var colCnt = cols.length;
+               var i, r=-1, c=-1;
+               for (i=0; i<rowCnt; i++) {
+                       if (y >= rows[i][0] && y < rows[i][1]) {
+                               r = i;
+                               break;
+                       }
+               }
+               for (i=0; i<colCnt; i++) {
+                       if (x >= cols[i][0] && x < cols[i][1]) {
+                               c = i;
+                               break;
+                       }
+               }
+               return (r>=0 && c>=0) ? { row:r, col:c } : null;
+       };
+       
+       
+       t.rect = function(row0, col0, row1, col1, originElement) { // row1,col1 is inclusive
+               var origin = originElement.offset();
+               return {
+                       top: rows[row0][0] - origin.top,
+                       left: cols[col0][0] - origin.left,
+                       width: cols[col1][1] - cols[col0][0],
+                       height: rows[row1][1] - rows[row0][0]
+               };
+       };
+
+}
+
+function HoverListener(coordinateGrid) {
+
+
+       var t = this;
+       var bindType;
+       var change;
+       var firstCell;
+       var cell;
+       
+       
+       t.start = function(_change, ev, _bindType) {
+               change = _change;
+               firstCell = cell = null;
+               coordinateGrid.build();
+               mouse(ev);
+               bindType = _bindType || 'mousemove';
+               $(document).bind(bindType, mouse);
+       };
+       
+       
+       function mouse(ev) {
+               _fixUIEvent(ev); // see below
+               var newCell = coordinateGrid.cell(ev.pageX, ev.pageY);
+               if (!newCell != !cell || newCell && (newCell.row != cell.row || newCell.col != cell.col)) {
+                       if (newCell) {
+                               if (!firstCell) {
+                                       firstCell = newCell;
+                               }
+                               change(newCell, firstCell, newCell.row-firstCell.row, newCell.col-firstCell.col);
+                       }else{
+                               change(newCell, firstCell);
+                       }
+                       cell = newCell;
+               }
+       }
+       
+       
+       t.stop = function() {
+               $(document).unbind(bindType, mouse);
+               return cell;
+       };
+       
+       
+}
+
+
+
+// this fix was only necessary for jQuery UI 1.8.16 (and jQuery 1.7 or 1.7.1)
+// upgrading to jQuery UI 1.8.17 (and using either jQuery 1.7 or 1.7.1) fixed the problem
+// but keep this in here for 1.8.16 users
+// and maybe remove it down the line
+
+function _fixUIEvent(event) { // for issue 1168
+       if (event.pageX === undefined) {
+               event.pageX = event.originalEvent.pageX;
+               event.pageY = event.originalEvent.pageY;
+       }
+}
+function HorizontalPositionCache(getElement) {
+
+       var t = this,
+               elements = {},
+               lefts = {},
+               rights = {};
+               
+       function e(i) {
+               return elements[i] = elements[i] || getElement(i);
+       }
+       
+       t.left = function(i) {
+               return lefts[i] = lefts[i] === undefined ? e(i).position().left : lefts[i];
+       };
+       
+       t.right = function(i) {
+               return rights[i] = rights[i] === undefined ? t.left(i) + e(i).width() : rights[i];
+       };
+       
+       t.clear = function() {
+               elements = {};
+               lefts = {};
+               rights = {};
+       };
+       
+}
+\r
+})(jQuery);
diff --git a/library/fullcalendar/fullcalendar.min.js b/library/fullcalendar/fullcalendar.min.js
new file mode 100644 (file)
index 0000000..df37bdf
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+
+ FullCalendar v1.5.3
+ http://arshaw.com/fullcalendar/
+
+ Use fullcalendar.css for basic styling.
+ For event drag & drop, requires jQuery UI draggable.
+ For event resizing, requires jQuery UI resizable.
+
+ Copyright (c) 2011 Adam Shaw
+ Dual licensed under the MIT and GPL licenses, located in
+ MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+
+ Date: Mon Feb 6 22:40:40 2012 -0800
+
+*/
+(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("<div class='fc-content' style='position:relative'/>").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
+E.remove();a.removeClass("fc fc-rtl ui-widget")}function j(){return i.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function y(k){if(!n||k!=n.name){F++;pa();var D=n,Z;if(D){(D.beforeHide||xb)();Za(E,E.height());D.element.hide()}else Za(E,1);E.css("overflow","hidden");if(n=Y[k])n.element.show();else n=Y[k]=new Ja[k](Z=s=m("<div class='fc-view fc-view-"+k+"' style='position:absolute'/>").appendTo(E),X);D&&C.deactivateButton(D.name);C.activateButton(k);S();E.css("overflow","");D&&
+Za(E,1);Z||(n.afterShow||xb)();F--}}function S(k){if(j()){F++;pa();o===ma&&u();var D=false;if(!n.start||k||r<n.start||r>=n.end){n.render(r,k||0);fa(true);D=true}else if(n.sizeDirty){n.clearEvents();fa();D=true}else if(n.eventsDirty){n.clearEvents();D=true}n.sizeDirty=false;n.eventsDirty=false;ga(D);W=a.outerWidth();C.updateTitle(n.title);k=new Date;k>=n.start&&k<n.end?C.disableButton("today"):C.enableButton("today");F--;n.trigger("viewDisplay",i)}}function Q(){q();if(j()){u();fa();pa();n.clearEvents();
+n.renderEvents(J);n.sizeDirty=false}}function q(){m.each(Y,function(k,D){D.sizeDirty=true})}function u(){o=b.contentHeight?b.contentHeight:b.height?b.height-(P?P.height():0)-Sa(E):Math.round(E.width()/Math.max(b.aspectRatio,0.5))}function fa(k){F++;n.setHeight(o,k);if(s){s.css("position","relative");s=null}n.setWidth(E.width(),k);F--}function oa(){if(!F)if(n.start){var k=++v;setTimeout(function(){if(k==v&&!F&&j())if(W!=(W=a.outerWidth())){F++;Q();n.trigger("windowResize",i);F--}},200)}else g()}function ga(k){if(!b.lazyFetching||
+ya(n.visStart,n.visEnd))ra();else k&&da()}function ra(){K(n.visStart,n.visEnd)}function sa(k){J=k;da()}function ha(k){da(k)}function da(k){na();if(j()){n.clearEvents();n.renderEvents(J,k);n.eventsDirty=false}}function na(){m.each(Y,function(k,D){D.eventsDirty=true})}function ua(k,D,Z){n.select(k,D,Z===ma?true:Z)}function pa(){n&&n.unselect()}function U(){S(-1)}function ca(){S(1)}function ka(){gb(r,-1);S()}function qa(){gb(r,1);S()}function G(){r=new Date;S()}function p(k,D,Z){if(k instanceof Date)r=
+N(k);else yb(r,k,D,Z);S()}function L(k,D,Z){k!==ma&&gb(r,k);D!==ma&&hb(r,D);Z!==ma&&ba(r,Z);S()}function c(){return N(r)}function z(){return n}function H(k,D){if(D===ma)return b[k];if(k=="height"||k=="contentHeight"||k=="aspectRatio"){b[k]=D;Q()}}function T(k,D){if(b[k])return b[k].apply(D||i,Array.prototype.slice.call(arguments,2))}var X=this;X.options=b;X.render=d;X.destroy=l;X.refetchEvents=ra;X.reportEvents=sa;X.reportEventChange=ha;X.rerenderEvents=da;X.changeView=y;X.select=ua;X.unselect=pa;
+X.prev=U;X.next=ca;X.prevYear=ka;X.nextYear=qa;X.today=G;X.gotoDate=p;X.incrementDate=L;X.formatDate=function(k,D){return Oa(k,D,b)};X.formatDates=function(k,D,Z){return ib(k,D,Z,b)};X.getDate=c;X.getView=z;X.option=H;X.trigger=T;$b.call(X,b,e);var ya=X.isFetchNeeded,K=X.fetchEvents,i=a[0],C,P,E,B,n,Y={},W,o,s,v=0,F=0,r=new Date,J=[],M;yb(r,b.year,b.month,b.date);b.droppable&&m(document).bind("dragstart",function(k,D){var Z=k.target,ja=m(Z);if(!ja.parents(".fc").length){var ia=b.dropAccept;if(m.isFunction(ia)?
+ia.call(Z,ja):ja.is(ia)){M=Z;n.dragStart(M,k,D)}}}).bind("dragstop",function(k,D){if(M){n.dragStop(M,k,D);M=null}})}function Zb(a,b){function e(){q=b.theme?"ui":"fc";if(b.header)return Q=m("<table class='fc-header' style='width:100%'/>").append(m("<tr/>").append(f("left")).append(f("center")).append(f("right")))}function d(){Q.remove()}function f(u){var fa=m("<td class='fc-header-"+u+"'/>");(u=b.header[u])&&m.each(u.split(" "),function(oa){oa>0&&fa.append("<span class='fc-header-space'/>");var ga;
+m.each(this.split(","),function(ra,sa){if(sa=="title"){fa.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>");ga&&ga.addClass(q+"-corner-right");ga=null}else{var ha;if(a[sa])ha=a[sa];else if(Ja[sa])ha=function(){na.removeClass(q+"-state-hover");a.changeView(sa)};if(ha){ra=b.theme?jb(b.buttonIcons,sa):null;var da=jb(b.buttonText,sa),na=m("<span class='fc-button fc-button-"+sa+" "+q+"-state-default'><span class='fc-button-inner'><span class='fc-button-content'>"+(ra?"<span class='fc-icon-wrap'><span class='ui-icon ui-icon-"+
+ra+"'/></span>":da)+"</span><span class='fc-button-effect'><span></span></span></span></span>");if(na){na.click(function(){na.hasClass(q+"-state-disabled")||ha()}).mousedown(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-down")}).mouseup(function(){na.removeClass(q+"-state-down")}).hover(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-hover")},function(){na.removeClass(q+"-state-hover").removeClass(q+"-state-down")}).appendTo(fa);
+ga||na.addClass(q+"-corner-left");ga=na}}}});ga&&ga.addClass(q+"-corner-right")});return fa}function g(u){Q.find("h2").html(u)}function l(u){Q.find("span.fc-button-"+u).addClass(q+"-state-active")}function j(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-active")}function t(u){Q.find("span.fc-button-"+u).addClass(q+"-state-disabled")}function y(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-disabled")}var S=this;S.render=e;S.destroy=d;S.updateTitle=g;S.activateButton=l;S.deactivateButton=
+j;S.disableButton=t;S.enableButton=y;var Q=m([]),q}function $b(a,b){function e(c,z){return!ca||c<ca||z>ka}function d(c,z){ca=c;ka=z;L=[];c=++qa;G=z=U.length;for(var H=0;H<z;H++)f(U[H],c)}function f(c,z){g(c,function(H){if(z==qa){if(H){for(var T=0;T<H.length;T++){H[T].source=c;oa(H[T])}L=L.concat(H)}G--;G||ua(L)}})}function g(c,z){var H,T=Aa.sourceFetchers,X;for(H=0;H<T.length;H++){X=T[H](c,ca,ka,z);if(X===true)return;else if(typeof X=="object"){g(X,z);return}}if(H=c.events)if(m.isFunction(H)){u();
+H(N(ca),N(ka),function(C){z(C);fa()})}else m.isArray(H)?z(H):z();else if(c.url){var ya=c.success,K=c.error,i=c.complete;H=m.extend({},c.data||{});T=Ta(c.startParam,a.startParam);X=Ta(c.endParam,a.endParam);if(T)H[T]=Math.round(+ca/1E3);if(X)H[X]=Math.round(+ka/1E3);u();m.ajax(m.extend({},ac,c,{data:H,success:function(C){C=C||[];var P=$a(ya,this,arguments);if(m.isArray(P))C=P;z(C)},error:function(){$a(K,this,arguments);z()},complete:function(){$a(i,this,arguments);fa()}}))}else z()}function l(c){if(c=
+j(c)){G++;f(c,qa)}}function j(c){if(m.isFunction(c)||m.isArray(c))c={events:c};else if(typeof c=="string")c={url:c};if(typeof c=="object"){ga(c);U.push(c);return c}}function t(c){U=m.grep(U,function(z){return!ra(z,c)});L=m.grep(L,function(z){return!ra(z.source,c)});ua(L)}function y(c){var z,H=L.length,T,X=na().defaultEventEnd,ya=c.start-c._start,K=c.end?c.end-(c._end||X(c)):0;for(z=0;z<H;z++){T=L[z];if(T._id==c._id&&T!=c){T.start=new Date(+T.start+ya);T.end=c.end?T.end?new Date(+T.end+K):new Date(+X(T)+
+K):null;T.title=c.title;T.url=c.url;T.allDay=c.allDay;T.className=c.className;T.editable=c.editable;T.color=c.color;T.backgroudColor=c.backgroudColor;T.borderColor=c.borderColor;T.textColor=c.textColor;oa(T)}}oa(c);ua(L)}function S(c,z){oa(c);if(!c.source){if(z){pa.events.push(c);c.source=pa}L.push(c)}ua(L)}function Q(c){if(c){if(!m.isFunction(c)){var z=c+"";c=function(T){return T._id==z}}L=m.grep(L,c,true);for(H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=m.grep(U[H].events,c,true)}else{L=
+[];for(var H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=[]}ua(L)}function q(c){if(m.isFunction(c))return m.grep(L,c);else if(c){c+="";return m.grep(L,function(z){return z._id==c})}return L}function u(){p++||da("loading",null,true)}function fa(){--p||da("loading",null,false)}function oa(c){var z=c.source||{},H=Ta(z.ignoreTimezone,a.ignoreTimezone);c._id=c._id||(c.id===ma?"_fc"+bc++:c.id+"");if(c.date){if(!c.start)c.start=c.date;delete c.date}c._start=N(c.start=kb(c.start,H));c.end=kb(c.end,
+H);if(c.end&&c.end<=c.start)c.end=null;c._end=c.end?N(c.end):null;if(c.allDay===ma)c.allDay=Ta(z.allDayDefault,a.allDayDefault);if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[]}function ga(c){if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[];for(var z=Aa.sourceNormalizers,H=0;H<z.length;H++)z[H](c)}function ra(c,z){return c&&z&&sa(c)==sa(z)}function sa(c){return(typeof c=="object"?c.events||
+c.url:"")||c}var ha=this;ha.isFetchNeeded=e;ha.fetchEvents=d;ha.addEventSource=l;ha.removeEventSource=t;ha.updateEvent=y;ha.renderEvent=S;ha.removeEvents=Q;ha.clientEvents=q;ha.normalizeEvent=oa;var da=ha.trigger,na=ha.getView,ua=ha.reportEvents,pa={events:[]},U=[pa],ca,ka,qa=0,G=0,p=0,L=[];for(ha=0;ha<b.length;ha++)j(b[ha])}function gb(a,b,e){a.setFullYear(a.getFullYear()+b);e||Ka(a);return a}function hb(a,b,e){if(+a){b=a.getMonth()+b;var d=N(a);d.setDate(1);d.setMonth(b);a.setMonth(b);for(e||Ka(a);a.getMonth()!=
+d.getMonth();)a.setDate(a.getDate()+(a<d?1:-1))}return a}function ba(a,b,e){if(+a){b=a.getDate()+b;var d=N(a);d.setHours(9);d.setDate(b);a.setDate(b);e||Ka(a);lb(a,d)}return a}function lb(a,b){if(+a)for(;a.getDate()!=b.getDate();)a.setTime(+a+(a<b?1:-1)*cc)}function xa(a,b){a.setMinutes(a.getMinutes()+b);return a}function Ka(a){a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a}function N(a,b){if(b)return Ka(new Date(+a));return new Date(+a)}function zb(){var a=0,b;do b=new Date(1970,
+a++,1);while(b.getHours());return b}function Fa(a,b,e){for(b=b||1;!a.getDay()||e&&a.getDay()==1||!e&&a.getDay()==6;)ba(a,b);return a}function Ca(a,b){return Math.round((N(a,true)-N(b,true))/Ab)}function yb(a,b,e,d){if(b!==ma&&b!=a.getFullYear()){a.setDate(1);a.setMonth(0);a.setFullYear(b)}if(e!==ma&&e!=a.getMonth()){a.setDate(1);a.setMonth(e)}d!==ma&&a.setDate(d)}function kb(a,b){if(typeof a=="object")return a;if(typeof a=="number")return new Date(a*1E3);if(typeof a=="string"){if(a.match(/^\d+(\.\d+)?$/))return new Date(parseFloat(a)*
+1E3);if(b===ma)b=true;return Bb(a,b)||(a?new Date(a):null)}return null}function Bb(a,b){a=a.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);if(!a)return null;var e=new Date(a[1],0,1);if(b||!a[13]){b=new Date(a[1],0,1,9,0);if(a[3]){e.setMonth(a[3]-1);b.setMonth(a[3]-1)}if(a[5]){e.setDate(a[5]);b.setDate(a[5])}lb(e,b);a[7]&&e.setHours(a[7]);a[8]&&e.setMinutes(a[8]);a[10]&&e.setSeconds(a[10]);a[12]&&e.setMilliseconds(Number("0."+
+a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHours(a[7]||0,a[8]||0,a[10]||0,a[12]?Number("0."+a[12])*1E3:0);if(a[14]){b=Number(a[16])*60+(a[18]?Number(a[18]):0);b*=a[15]=="-"?1:-1;e=new Date(+e+b*60*1E3)}}return e}function mb(a){if(typeof a=="number")return a*60;if(typeof a=="object")return a.getHours()*60+a.getMinutes();if(a=a.match(/(\d+)(?::(\d+))?\s*(\w+)?/)){var b=parseInt(a[1],10);if(a[3]){b%=12;if(a[3].toLowerCase().charAt(0)=="p")b+=12}return b*60+(a[2]?parseInt(a[2],
+10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;l<j;l++){t=e.charAt(l);if(t=="'")for(y=l+1;y<j;y++){if(e.charAt(y)=="'"){if(f){Q+=y==l+1?"'":e.substring(l+1,y);l=y}break}}else if(t=="(")for(y=l+1;y<j;y++){if(e.charAt(y)==")"){l=Oa(f,e.substring(l+1,y),d);if(parseInt(l.replace(/\D/,""),10))Q+=l;l=y;break}}else if(t=="[")for(y=l+1;y<j;y++){if(e.charAt(y)=="]"){t=e.substring(l+1,y);l=Oa(f,t,d);if(l!=Oa(g,t,d))Q+=l;l=y;break}}else if(t==
+"{"){f=b;g=a}else if(t=="}"){f=a;g=b}else{for(y=j;y>l;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.start<b.end}function nb(a,b,e,d){var f=[],g,l=a.length,j,t,y,S,Q;for(g=0;g<l;g++){j=a[g];t=j.start;
+y=b[g];if(y>e&&t<d){if(t<e){t=N(e);S=false}else{t=t;S=true}if(y>d){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e<d;e++){f=a[e];for(g=0;;){l=false;if(b[g])for(j=0;j<b[g].length;j++)if(Cb(b[g][j],f)){l=true;break}if(l)g++;else break}if(b[g])b[g].push(f);else b[g]=[f]}return b}function Db(a,b,e){a.unbind("mouseover").mouseover(function(d){for(var f=d.target,g;f!=this;){g=f;f=f.parentNode}if((f=
+g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.curCSS(a[0],"paddingLeft",true))||0)+(parseFloat(m.curCSS(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.curCSS(a[0],
+"marginLeft",true))||0)+(parseFloat(m.curCSS(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.curCSS(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.curCSS(a[0],"paddingTop",true))||0)+(parseFloat(m.curCSS(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.curCSS(a[0],"marginTop",true))||0)+(parseFloat(m.curCSS(a[0],"marginBottom",true))||0)}
+function kc(a){return(parseFloat(m.curCSS(a[0],"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==
+ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
+function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
+[a];if(a){var d,f;for(d=0;d<a.length;d++)f=a[d].apply(b,e)||f;return f}}function Ta(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==ma)return arguments[a]}function mc(a,b){function e(j,t){if(t){hb(j,t);j.setDate(1)}j=N(j,true);j.setDate(1);t=hb(N(j),1);var y=N(j),S=N(t),Q=f("firstDay"),q=f("weekends")?0:1;if(q){Fa(y);Fa(S,-1,true)}ba(y,-((y.getDay()-Math.max(Q,q)+7)%7));ba(S,(7-S.getDay()+Math.max(Q,q))%7);Q=Math.round((S-y)/(Ab*7));if(f("weekMode")=="fixed"){ba(S,(6-Q)*7);Q=6}d.title=l(j,
+f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(6,Q,q?5:7,true)}var d=this;d.render=e;sb.call(d,a,b,"month");var f=d.opt,g=d.renderBasic,l=b.formatDate}function nc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(1,1,Q?7:5,false)}var d=this;d.render=e;sb.call(d,a,b,"basicWeek");var f=d.opt,g=d.renderBasic,
+l=b.formatDates}function oc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}d.title=l(j,f("titleFormat"));d.start=d.visStart=N(j,true);d.end=d.visEnd=ba(N(d.start),1);g(1,1,1,false)}var d=this;d.render=e;sb.call(d,a,b,"basicDay");var f=d.opt,g=d.renderBasic,l=b.formatDate}function sb(a,b,e){function d(w,I,R,V){v=I;F=R;f();(I=!C)?g(w,V):z();l(I)}function f(){if(k=L("isRTL")){D=-1;Z=F-1}else{D=1;Z=0}ja=L("firstDay");ia=L("weekends")?0:1;la=L("theme")?"ui":"fc";$=L("columnFormat")}function g(w,
+I){var R,V=la+"-widget-header",ea=la+"-widget-content",aa;R="<table class='fc-border-separate' style='width:100%' cellspacing='0'><thead><tr>";for(aa=0;aa<F;aa++)R+="<th class='fc- "+V+"'/>";R+="</tr></thead><tbody>";for(aa=0;aa<w;aa++){R+="<tr class='fc-week"+aa+"'>";for(V=0;V<F;V++)R+="<td class='fc- "+ea+" fc-day"+(aa*F+V)+"'><div>"+(I?"<div class='fc-day-number'/>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";R+="</tr>"}R+="</tbody></table>";w=
+m(R).appendTo(a);K=w.find("thead");i=K.find("th");C=w.find("tbody");P=C.find("tr");E=C.find("td");B=E.filter(":first-child");n=P.eq(0).find("div.fc-day-content div");ab(K.add(K.find("tr")));ab(P);P.eq(0).addClass("fc-first");y(E);Y=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(a)}function l(w){var I=w||v==1,R=p.start.getMonth(),V=Ka(new Date),ea,aa,va;I&&i.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);ea.html(ya(aa,$));rb(ea,aa)});E.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);aa.getMonth()==
+R?ea.removeClass("fc-other-month"):ea.addClass("fc-other-month");+aa==+V?ea.addClass(la+"-state-highlight fc-today"):ea.removeClass(la+"-state-highlight fc-today");ea.find("div.fc-day-number").text(aa.getDate());I&&rb(ea,aa)});P.each(function(wa,Ga){va=m(Ga);if(wa<v){va.show();wa==v-1?va.addClass("fc-last"):va.removeClass("fc-last")}else va.hide()})}function j(w){o=w;w=o-K.height();var I,R,V;if(L("weekMode")=="variable")I=R=Math.floor(w/(v==1?2:6));else{I=Math.floor(w/v);R=w-I*(v-1)}B.each(function(ea,
+aa){if(ea<v){V=m(aa);Za(V.find("> div"),(ea==v-1?R:I)-Sa(V))}})}function t(w){W=w;M.clear();s=Math.floor(W/F);Va(i.slice(0,-1),s)}function y(w){w.click(S).mousedown(X)}function S(w){if(!L("selectable")){var I=parseInt(this.className.match(/fc\-day(\d+)/)[1]);I=ca(I);c("dayClick",this,I,true,w)}}function Q(w,I,R){R&&r.build();R=N(p.visStart);for(var V=ba(N(R),F),ea=0;ea<v;ea++){var aa=new Date(Math.max(R,w)),va=new Date(Math.min(V,I));if(aa<va){var wa;if(k){wa=Ca(va,R)*D+Z+1;aa=Ca(aa,R)*D+Z+1}else{wa=
+Ca(aa,R);aa=Ca(va,R)}y(q(ea,wa,ea,aa-1))}ba(R,7);ba(V,7)}}function q(w,I,R,V){w=r.rect(w,I,R,V,a);return H(w,a)}function u(w){return N(w)}function fa(w,I){Q(w,ba(N(I),1),true)}function oa(){T()}function ga(w,I,R){var V=ua(w);c("dayClick",E[V.row*F+V.col],w,I,R)}function ra(w,I){J.start(function(R){T();R&&q(R.row,R.col,R.row,R.col)},I)}function sa(w,I,R){var V=J.stop();T();if(V){V=pa(V);c("drop",w,V,true,I,R)}}function ha(w){return N(w.start)}function da(w){return M.left(w)}function na(w){return M.right(w)}
+function ua(w){return{row:Math.floor(Ca(w,p.visStart)/7),col:ka(w.getDay())}}function pa(w){return U(w.row,w.col)}function U(w,I){return ba(N(p.visStart),w*7+I*D+Z)}function ca(w){return U(Math.floor(w/F),w%F)}function ka(w){return(w-Math.max(ja,ia)+F)%F*D+Z}function qa(w){return P.eq(w)}function G(){return{left:0,right:W}}var p=this;p.renderBasic=d;p.setHeight=j;p.setWidth=t;p.renderDayOverlay=Q;p.defaultSelectionEnd=u;p.renderSelection=fa;p.clearSelection=oa;p.reportDayClick=ga;p.dragStart=ra;p.dragStop=
+sa;p.defaultEventEnd=ha;p.getHoverListener=function(){return J};p.colContentLeft=da;p.colContentRight=na;p.dayOfWeekCol=ka;p.dateCell=ua;p.cellDate=pa;p.cellIsAllDay=function(){return true};p.allDayRow=qa;p.allDayBounds=G;p.getRowCnt=function(){return v};p.getColCnt=function(){return F};p.getColWidth=function(){return s};p.getDaySegmentContainer=function(){return Y};Kb.call(p,a,b,e);Lb.call(p);Mb.call(p);pc.call(p);var L=p.opt,c=p.trigger,z=p.clearEvents,H=p.renderOverlay,T=p.clearOverlays,X=p.daySelectionMousedown,
+ya=b.formatDate,K,i,C,P,E,B,n,Y,W,o,s,v,F,r,J,M,k,D,Z,ja,ia,la,$;qb(a.addClass("fc-grid"));r=new Nb(function(w,I){var R,V,ea;i.each(function(aa,va){R=m(va);V=R.offset().left;if(aa)ea[1]=V;ea=[V];I[aa]=ea});ea[1]=V+R.outerWidth();P.each(function(aa,va){if(aa<v){R=m(va);V=R.offset().top;if(aa)ea[1]=V;ea=[V];w[aa]=ea}});ea[1]=V+R.outerHeight()});J=new Ob(r);M=new Pb(function(w){return n.eq(w)})}function pc(){function a(U,ca){S(U);ua(e(U),ca)}function b(){Q();ga().empty()}function e(U){var ca=da(),ka=
+na(),qa=N(g.visStart);ka=ba(N(qa),ka);var G=m.map(U,Ua),p,L,c,z,H,T,X=[];for(p=0;p<ca;p++){L=ob(nb(U,G,qa,ka));for(c=0;c<L.length;c++){z=L[c];for(H=0;H<z.length;H++){T=z[H];T.row=p;T.level=c;X.push(T)}}ba(qa,7);ba(ka,7)}return X}function d(U,ca,ka){t(U)&&f(U,ca);ka.isEnd&&y(U)&&pa(U,ca,ka);q(U,ca)}function f(U,ca){var ka=ra(),qa;ca.draggable({zIndex:9,delay:50,opacity:l("dragOpacity"),revertDuration:l("dragRevertDuration"),start:function(G,p){j("eventDragStart",ca,U,G,p);fa(U,ca);ka.start(function(L,
+c,z,H){ca.draggable("option","revert",!L||!z&&!H);ha();if(L){qa=z*7+H*(l("isRTL")?-1:1);sa(ba(N(U.start),qa),ba(Ua(U),qa))}else qa=0},G,"drag")},stop:function(G,p){ka.stop();ha();j("eventDragStop",ca,U,G,p);if(qa)oa(this,U,qa,0,U.allDay,G,p);else{ca.css("filter","");u(U,ca)}}})}var g=this;g.renderEvents=a;g.compileDaySegs=e;g.clearEvents=b;g.bindDaySeg=d;Qb.call(g);var l=g.opt,j=g.trigger,t=g.isEventDraggable,y=g.isEventResizable,S=g.reportEvents,Q=g.reportEventClear,q=g.eventElementHandlers,u=g.showEvents,
+fa=g.hideEvents,oa=g.eventDrop,ga=g.getDaySegmentContainer,ra=g.getHoverListener,sa=g.renderDayOverlay,ha=g.clearOverlays,da=g.getRowCnt,na=g.getColCnt,ua=g.renderDaySegs,pa=g.resizableDayEvent}function qc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(Q?7:5)}var d=this;d.render=e;Rb.call(d,a,b,"agendaWeek");
+var f=d.opt,g=d.renderAgenda,l=b.formatDates}function rc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}t=N(j,true);var y=ba(N(t),1);d.title=l(j,f("titleFormat"));d.start=d.visStart=t;d.end=d.visEnd=y;g(1)}var d=this;d.render=e;Rb.call(d,a,b,"agendaDay");var f=d.opt,g=d.renderAgenda,l=b.formatDate}function Rb(a,b,e){function d(h){Ba=h;f();v?P():g();l()}function f(){Wa=i("theme")?"ui":"fc";Sb=i("weekends")?0:1;Tb=i("firstDay");if(Ub=i("isRTL")){Ha=-1;Ia=Ba-1}else{Ha=1;Ia=0}La=mb(i("minTime"));
+bb=mb(i("maxTime"));Vb=i("columnFormat")}function g(){var h=Wa+"-widget-header",O=Wa+"-widget-content",x,A,ta,za,Da,Ea=i("slotMinutes")%15==0;x="<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'><thead><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<th class='fc- fc-col"+A+" "+h+"'/>";x+="<th class='fc-agenda-gutter "+h+"'>&nbsp;</th></tr></thead><tbody><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<td class='fc- fc-col"+
+A+" "+O+"'><div><div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";x+="<td class='fc-agenda-gutter "+O+"'>&nbsp;</td></tr></tbody></table>";v=m(x).appendTo(a);F=v.find("thead");r=F.find("th").slice(1,-1);J=v.find("tbody");M=J.find("td").slice(0,-1);k=M.find("div.fc-day-content div");D=M.eq(0);Z=D.find("> div");ab(F.add(F.find("tr")));ab(J.add(J.find("tr")));aa=F.find("th:first");va=v.find(".fc-agenda-gutter");ja=m("<div style='position:absolute;z-index:2;left:0;width:100%'/>").appendTo(a);
+if(i("allDaySlot")){ia=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(ja);x="<table style='width:100%' class='fc-agenda-allday' cellspacing='0'><tr><th class='"+h+" fc-agenda-axis'>"+i("allDayText")+"</th><td><div class='fc-day-content'><div style='position:relative'/></div></td><th class='"+h+" fc-agenda-gutter'>&nbsp;</th></tr></table>";la=m(x).appendTo(ja);$=la.find("tr");q($.find("td"));aa=aa.add(la.find("th:first"));va=va.add(la.find("th.fc-agenda-gutter"));ja.append("<div class='fc-agenda-divider "+
+h+"'><div class='fc-agenda-divider-inner'/></div>")}else ia=m([]);w=m("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>").appendTo(ja);I=m("<div style='position:relative;width:100%;overflow:hidden'/>").appendTo(w);R=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(I);x="<table class='fc-agenda-slots' style='width:100%' cellspacing='0'><tbody>";ta=zb();za=xa(N(ta),bb);xa(ta,La);for(A=tb=0;ta<za;A++){Da=ta.getMinutes();x+="<tr class='fc-slot"+A+" "+
+(!Da?"":"fc-minor")+"'><th class='fc-agenda-axis "+h+"'>"+(!Ea||!Da?s(ta,i("axisFormat")):"&nbsp;")+"</th><td class='"+O+"'><div style='position:relative'>&nbsp;</div></td></tr>";xa(ta,i("slotMinutes"));tb++}x+="</tbody></table>";V=m(x).appendTo(I);ea=V.find("div:first");u(V.find("td"));aa=aa.add(V.find("th:first"))}function l(){var h,O,x,A,ta=Ka(new Date);for(h=0;h<Ba;h++){A=ua(h);O=r.eq(h);O.html(s(A,Vb));x=M.eq(h);+A==+ta?x.addClass(Wa+"-state-highlight fc-today"):x.removeClass(Wa+"-state-highlight fc-today");
+rb(O.add(x),A)}}function j(h,O){if(h===ma)h=Wb;Wb=h;ub={};var x=J.position().top,A=w.position().top;h=Math.min(h-x,V.height()+A+1);Z.height(h-Sa(D));ja.css("top",x);w.height(h-A-1);Xa=ea.height()+1;O&&y()}function t(h){Ga=h;cb.clear();Ma=0;Va(aa.width("").each(function(O,x){Ma=Math.max(Ma,m(x).outerWidth())}),Ma);h=w[0].clientWidth;if(vb=w.width()-h){Va(va,vb);va.show().prev().removeClass("fc-last")}else va.hide().prev().addClass("fc-last");db=Math.floor((h-Ma)/Ba);Va(r.slice(0,-1),db)}function y(){function h(){w.scrollTop(A)}
+var O=zb(),x=N(O);x.setHours(i("firstHour"));var A=ca(O,x)+1;h();setTimeout(h,0)}function S(){Xb=w.scrollTop()}function Q(){w.scrollTop(Xb)}function q(h){h.click(fa).mousedown(W)}function u(h){h.click(fa).mousedown(H)}function fa(h){if(!i("selectable")){var O=Math.min(Ba-1,Math.floor((h.pageX-v.offset().left-Ma)/db)),x=ua(O),A=this.parentNode.className.match(/fc-slot(\d+)/);if(A){A=parseInt(A[1])*i("slotMinutes");var ta=Math.floor(A/60);x.setHours(ta);x.setMinutes(A%60+La);C("dayClick",M[O],x,false,
+h)}else C("dayClick",M[O],x,true,h)}}function oa(h,O,x){x&&Na.build();var A=N(K.visStart);if(Ub){x=Ca(O,A)*Ha+Ia+1;h=Ca(h,A)*Ha+Ia+1}else{x=Ca(h,A);h=Ca(O,A)}x=Math.max(0,x);h=Math.min(Ba,h);x<h&&q(ga(0,x,0,h-1))}function ga(h,O,x,A){h=Na.rect(h,O,x,A,ja);return E(h,ja)}function ra(h,O){for(var x=N(K.visStart),A=ba(N(x),1),ta=0;ta<Ba;ta++){var za=new Date(Math.max(x,h)),Da=new Date(Math.min(A,O));if(za<Da){var Ea=ta*Ha+Ia;Ea=Na.rect(0,Ea,0,Ea,I);za=ca(x,za);Da=ca(x,Da);Ea.top=za;Ea.height=Da-za;u(E(Ea,
+I))}ba(x,1);ba(A,1)}}function sa(h){return cb.left(h)}function ha(h){return cb.right(h)}function da(h){return{row:Math.floor(Ca(h,K.visStart)/7),col:U(h.getDay())}}function na(h){var O=ua(h.col);h=h.row;i("allDaySlot")&&h--;h>=0&&xa(O,La+h*i("slotMinutes"));return O}function ua(h){return ba(N(K.visStart),h*Ha+Ia)}function pa(h){return i("allDaySlot")&&!h.row}function U(h){return(h-Math.max(Tb,Sb)+Ba)%Ba*Ha+Ia}function ca(h,O){h=N(h,true);if(O<xa(N(h),La))return 0;if(O>=xa(N(h),bb))return V.height();
+h=i("slotMinutes");O=O.getHours()*60+O.getMinutes()-La;var x=Math.floor(O/h),A=ub[x];if(A===ma)A=ub[x]=V.find("tr:eq("+x+") td div")[0].offsetTop;return Math.max(0,Math.round(A-1+Xa*(O%h/h)))}function ka(){return{left:Ma,right:Ga-vb}}function qa(){return $}function G(h){var O=N(h.start);if(h.allDay)return O;return xa(O,i("defaultEventMinutes"))}function p(h,O){if(O)return N(h);return xa(N(h),i("slotMinutes"))}function L(h,O,x){if(x)i("allDaySlot")&&oa(h,ba(N(O),1),true);else c(h,O)}function c(h,O){var x=
+i("selectHelper");Na.build();if(x){var A=Ca(h,K.visStart)*Ha+Ia;if(A>=0&&A<Ba){A=Na.rect(0,A,0,A,I);var ta=ca(h,h),za=ca(h,O);if(za>ta){A.top=ta;A.height=za-ta;A.left+=2;A.width-=5;if(m.isFunction(x)){if(h=x(h,O)){A.position="absolute";A.zIndex=8;wa=m(h).css(A).appendTo(I)}}else{A.isStart=true;A.isEnd=true;wa=m(o({title:"",start:h,end:O,className:["fc-select-helper"],editable:false},A));wa.css("opacity",i("dragOpacity"))}if(wa){u(wa);I.append(wa);Va(wa,A.width,true);Eb(wa,A.height,true)}}}}else ra(h,
+O)}function z(){B();if(wa){wa.remove();wa=null}}function H(h){if(h.which==1&&i("selectable")){Y(h);var O;Ra.start(function(x,A){z();if(x&&x.col==A.col&&!pa(x)){A=na(A);x=na(x);O=[A,xa(N(A),i("slotMinutes")),x,xa(N(x),i("slotMinutes"))].sort(Gb);c(O[0],O[3])}else O=null},h);m(document).one("mouseup",function(x){Ra.stop();if(O){+O[0]==+O[1]&&T(O[0],false,x);n(O[0],O[3],false,x)}})}}function T(h,O,x){C("dayClick",M[U(h.getDay())],h,O,x)}function X(h,O){Ra.start(function(x){B();if(x)if(pa(x))ga(x.row,
+x.col,x.row,x.col);else{x=na(x);var A=xa(N(x),i("defaultEventMinutes"));ra(x,A)}},O)}function ya(h,O,x){var A=Ra.stop();B();A&&C("drop",h,na(A),pa(A),O,x)}var K=this;K.renderAgenda=d;K.setWidth=t;K.setHeight=j;K.beforeHide=S;K.afterShow=Q;K.defaultEventEnd=G;K.timePosition=ca;K.dayOfWeekCol=U;K.dateCell=da;K.cellDate=na;K.cellIsAllDay=pa;K.allDayRow=qa;K.allDayBounds=ka;K.getHoverListener=function(){return Ra};K.colContentLeft=sa;K.colContentRight=ha;K.getDaySegmentContainer=function(){return ia};
+K.getSlotSegmentContainer=function(){return R};K.getMinMinute=function(){return La};K.getMaxMinute=function(){return bb};K.getBodyContent=function(){return I};K.getRowCnt=function(){return 1};K.getColCnt=function(){return Ba};K.getColWidth=function(){return db};K.getSlotHeight=function(){return Xa};K.defaultSelectionEnd=p;K.renderDayOverlay=oa;K.renderSelection=L;K.clearSelection=z;K.reportDayClick=T;K.dragStart=X;K.dragStop=ya;Kb.call(K,a,b,e);Lb.call(K);Mb.call(K);sc.call(K);var i=K.opt,C=K.trigger,
+P=K.clearEvents,E=K.renderOverlay,B=K.clearOverlays,n=K.reportSelection,Y=K.unselect,W=K.daySelectionMousedown,o=K.slotSegHtml,s=b.formatDate,v,F,r,J,M,k,D,Z,ja,ia,la,$,w,I,R,V,ea,aa,va,wa,Ga,Wb,Ma,db,vb,Xa,Xb,Ba,tb,Na,Ra,cb,ub={},Wa,Tb,Sb,Ub,Ha,Ia,La,bb,Vb;qb(a.addClass("fc-agenda"));Na=new Nb(function(h,O){function x(eb){return Math.max(Ea,Math.min(tc,eb))}var A,ta,za;r.each(function(eb,uc){A=m(uc);ta=A.offset().left;if(eb)za[1]=ta;za=[ta];O[eb]=za});za[1]=ta+A.outerWidth();if(i("allDaySlot")){A=
+$;ta=A.offset().top;h[0]=[ta,ta+A.outerHeight()]}for(var Da=I.offset().top,Ea=w.offset().top,tc=Ea+w.outerHeight(),fb=0;fb<tb;fb++)h.push([x(Da+Xa*fb),x(Da+Xa*(fb+1))])});Ra=new Ob(Na);cb=new Pb(function(h){return k.eq(h)})}function sc(){function a(o,s){sa(o);var v,F=o.length,r=[],J=[];for(v=0;v<F;v++)o[v].allDay?r.push(o[v]):J.push(o[v]);if(u("allDaySlot")){L(e(r),s);na()}g(d(J),s)}function b(){ha();ua().empty();pa().empty()}function e(o){o=ob(nb(o,m.map(o,Ua),q.visStart,q.visEnd));var s,v=o.length,
+F,r,J,M=[];for(s=0;s<v;s++){F=o[s];for(r=0;r<F.length;r++){J=F[r];J.row=0;J.level=s;M.push(J)}}return M}function d(o){var s=z(),v=ka(),F=ca(),r=xa(N(q.visStart),v),J=m.map(o,f),M,k,D,Z,ja,ia,la=[];for(M=0;M<s;M++){k=ob(nb(o,J,r,xa(N(r),F-v)));vc(k);for(D=0;D<k.length;D++){Z=k[D];for(ja=0;ja<Z.length;ja++){ia=Z[ja];ia.col=M;ia.level=D;la.push(ia)}}ba(r,1,true)}return la}function f(o){return o.end?N(o.end):xa(N(o.start),u("defaultEventMinutes"))}function g(o,s){var v,F=o.length,r,J,M,k,D,Z,ja,ia,la,
+$="",w,I,R={},V={},ea=pa(),aa;v=z();if(w=u("isRTL")){I=-1;aa=v-1}else{I=1;aa=0}for(v=0;v<F;v++){r=o[v];J=r.event;M=qa(r.start,r.start);k=qa(r.start,r.end);D=r.col;Z=r.level;ja=r.forward||0;ia=G(D*I+aa);la=p(D*I+aa)-ia;la=Math.min(la-6,la*0.95);D=Z?la/(Z+ja+1):ja?(la/(ja+1)-6)*2:la;Z=ia+la/(Z+ja+1)*Z*I+(w?la-D:0);r.top=M;r.left=Z;r.outerWidth=D;r.outerHeight=k-M;$+=l(J,r)}ea[0].innerHTML=$;w=ea.children();for(v=0;v<F;v++){r=o[v];J=r.event;$=m(w[v]);I=fa("eventRender",J,J,$);if(I===false)$.remove();
+else{if(I&&I!==true){$.remove();$=m(I).css({position:"absolute",top:r.top,left:r.left}).appendTo(ea)}r.element=$;if(J._id===s)t(J,$,r);else $[0]._fci=v;ya(J,$)}}Db(ea,o,t);for(v=0;v<F;v++){r=o[v];if($=r.element){J=R[s=r.key=Ib($[0])];r.vsides=J===ma?(R[s]=Sa($,true)):J;J=V[s];r.hsides=J===ma?(V[s]=pb($,true)):J;s=$.find("div.fc-event-content");if(s.length)r.contentTop=s[0].offsetTop}}for(v=0;v<F;v++){r=o[v];if($=r.element){$[0].style.width=Math.max(0,r.outerWidth-r.hsides)+"px";R=Math.max(0,r.outerHeight-
+r.vsides);$[0].style.height=R+"px";J=r.event;if(r.contentTop!==ma&&R-r.contentTop<10){$.find("div.fc-event-time").text(Y(J.start,u("timeFormat"))+" - "+J.title);$.find("div.fc-event-title").remove()}fa("eventAfterRender",J,J,$)}}}function l(o,s){var v="<",F=o.url,r=Jb(o,u),J=r?" style='"+r+"'":"",M=["fc-event","fc-event-skin","fc-event-vert"];oa(o)&&M.push("fc-event-draggable");s.isStart&&M.push("fc-corner-top");s.isEnd&&M.push("fc-corner-bottom");M=M.concat(o.className);if(o.source)M=M.concat(o.source.className||
+[]);v+=F?"a href='"+Qa(o.url)+"'":"div";v+=" class='"+M.join(" ")+"' style='position:absolute;z-index:8;top:"+s.top+"px;left:"+s.left+"px;"+r+"'><div class='fc-event-inner fc-event-skin'"+J+"><div class='fc-event-head fc-event-skin'"+J+"><div class='fc-event-time'>"+Qa(W(o.start,o.end,u("timeFormat")))+"</div></div><div class='fc-event-content'><div class='fc-event-title'>"+Qa(o.title)+"</div></div><div class='fc-event-bg'></div></div>";if(s.isEnd&&ga(o))v+="<div class='ui-resizable-handle ui-resizable-s'>=</div>";
+v+="</"+(F?"a":"div")+">";return v}function j(o,s,v){oa(o)&&y(o,s,v.isStart);v.isEnd&&ga(o)&&c(o,s,v);da(o,s)}function t(o,s,v){var F=s.find("div.fc-event-time");oa(o)&&S(o,s,F);v.isEnd&&ga(o)&&Q(o,s,F);da(o,s)}function y(o,s,v){function F(){if(!M){s.width(r).height("").draggable("option","grid",null);M=true}}var r,J,M=true,k,D=u("isRTL")?-1:1,Z=U(),ja=H(),ia=T(),la=ka();s.draggable({zIndex:9,opacity:u("dragOpacity","month"),revertDuration:u("dragRevertDuration"),start:function($,w){fa("eventDragStart",
+s,o,$,w);i(o,s);r=s.width();Z.start(function(I,R,V,ea){B();if(I){J=false;k=ea*D;if(I.row)if(v){if(M){s.width(ja-10);Eb(s,ia*Math.round((o.end?(o.end-o.start)/wc:u("defaultEventMinutes"))/u("slotMinutes")));s.draggable("option","grid",[ja,1]);M=false}}else J=true;else{E(ba(N(o.start),k),ba(Ua(o),k));F()}J=J||M&&!k}else{F();J=true}s.draggable("option","revert",J)},$,"drag")},stop:function($,w){Z.stop();B();fa("eventDragStop",s,o,$,w);if(J){F();s.css("filter","");K(o,s)}else{var I=0;M||(I=Math.round((s.offset().top-
+X().offset().top)/ia)*u("slotMinutes")+la-(o.start.getHours()*60+o.start.getMinutes()));C(this,o,k,I,M,$,w)}}})}function S(o,s,v){function F(I){var R=xa(N(o.start),I),V;if(o.end)V=xa(N(o.end),I);v.text(W(R,V,u("timeFormat")))}function r(){if(M){v.css("display","");s.draggable("option","grid",[$,w]);M=false}}var J,M=false,k,D,Z,ja=u("isRTL")?-1:1,ia=U(),la=z(),$=H(),w=T();s.draggable({zIndex:9,scroll:false,grid:[$,w],axis:la==1?"y":false,opacity:u("dragOpacity"),revertDuration:u("dragRevertDuration"),
+start:function(I,R){fa("eventDragStart",s,o,I,R);i(o,s);J=s.position();D=Z=0;ia.start(function(V,ea,aa,va){s.draggable("option","revert",!V);B();if(V){k=va*ja;if(u("allDaySlot")&&!V.row){if(!M){M=true;v.hide();s.draggable("option","grid",null)}E(ba(N(o.start),k),ba(Ua(o),k))}else r()}},I,"drag")},drag:function(I,R){D=Math.round((R.position.top-J.top)/w)*u("slotMinutes");if(D!=Z){M||F(D);Z=D}},stop:function(I,R){var V=ia.stop();B();fa("eventDragStop",s,o,I,R);if(V&&(k||D||M))C(this,o,k,M?0:D,M,I,R);
+else{r();s.css("filter","");s.css(J);F(0);K(o,s)}}})}function Q(o,s,v){var F,r,J=T();s.resizable({handles:{s:"div.ui-resizable-s"},grid:J,start:function(M,k){F=r=0;i(o,s);s.css("z-index",9);fa("eventResizeStart",this,o,M,k)},resize:function(M,k){F=Math.round((Math.max(J,s.height())-k.originalSize.height)/J);if(F!=r){v.text(W(o.start,!F&&!o.end?null:xa(ra(o),u("slotMinutes")*F),u("timeFormat")));r=F}},stop:function(M,k){fa("eventResizeStop",this,o,M,k);if(F)P(this,o,0,u("slotMinutes")*F,M,k);else{s.css("z-index",
+8);K(o,s)}}})}var q=this;q.renderEvents=a;q.compileDaySegs=e;q.clearEvents=b;q.slotSegHtml=l;q.bindDaySeg=j;Qb.call(q);var u=q.opt,fa=q.trigger,oa=q.isEventDraggable,ga=q.isEventResizable,ra=q.eventEnd,sa=q.reportEvents,ha=q.reportEventClear,da=q.eventElementHandlers,na=q.setHeight,ua=q.getDaySegmentContainer,pa=q.getSlotSegmentContainer,U=q.getHoverListener,ca=q.getMaxMinute,ka=q.getMinMinute,qa=q.timePosition,G=q.colContentLeft,p=q.colContentRight,L=q.renderDaySegs,c=q.resizableDayEvent,z=q.getColCnt,
+H=q.getColWidth,T=q.getSlotHeight,X=q.getBodyContent,ya=q.reportEventElement,K=q.showEvents,i=q.hideEvents,C=q.eventDrop,P=q.eventResize,E=q.renderDayOverlay,B=q.clearOverlays,n=q.calendar,Y=n.formatDate,W=n.formatDates}function vc(a){var b,e,d,f,g,l;for(b=a.length-1;b>0;b--){f=a[b];for(e=0;e<f.length;e++){g=f[e];for(d=0;d<a[b-1].length;d++){l=a[b-1][d];if(Cb(g,l))l.forward=Math.max(l.forward||0,(g.forward||0)+1)}}}}function Kb(a,b,e){function d(G,p){G=qa[G];if(typeof G=="object")return jb(G,p||e);
+return G}function f(G,p){return b.trigger.apply(b,[G,p||da].concat(Array.prototype.slice.call(arguments,2),[da]))}function g(G){return j(G)&&!d("disableDragging")}function l(G){return j(G)&&!d("disableResizing")}function j(G){return Ta(G.editable,(G.source||{}).editable,d("editable"))}function t(G){U={};var p,L=G.length,c;for(p=0;p<L;p++){c=G[p];if(U[c._id])U[c._id].push(c);else U[c._id]=[c]}}function y(G){return G.end?N(G.end):na(G)}function S(G,p){ca.push(p);if(ka[G._id])ka[G._id].push(p);else ka[G._id]=
+[p]}function Q(){ca=[];ka={}}function q(G,p){p.click(function(L){if(!p.hasClass("ui-draggable-dragging")&&!p.hasClass("ui-resizable-resizing"))return f("eventClick",this,G,L)}).hover(function(L){f("eventMouseover",this,G,L)},function(L){f("eventMouseout",this,G,L)})}function u(G,p){oa(G,p,"show")}function fa(G,p){oa(G,p,"hide")}function oa(G,p,L){G=ka[G._id];var c,z=G.length;for(c=0;c<z;c++)if(!p||G[c][0]!=p[0])G[c][L]()}function ga(G,p,L,c,z,H,T){var X=p.allDay,ya=p._id;sa(U[ya],L,c,z);f("eventDrop",
+G,p,L,c,z,function(){sa(U[ya],-L,-c,X);pa(ya)},H,T);pa(ya)}function ra(G,p,L,c,z,H){var T=p._id;ha(U[T],L,c);f("eventResize",G,p,L,c,function(){ha(U[T],-L,-c);pa(T)},z,H);pa(T)}function sa(G,p,L,c){L=L||0;for(var z,H=G.length,T=0;T<H;T++){z=G[T];if(c!==ma)z.allDay=c;xa(ba(z.start,p,true),L);if(z.end)z.end=xa(ba(z.end,p,true),L);ua(z,qa)}}function ha(G,p,L){L=L||0;for(var c,z=G.length,H=0;H<z;H++){c=G[H];c.end=xa(ba(y(c),p,true),L);ua(c,qa)}}var da=this;da.element=a;da.calendar=b;da.name=e;da.opt=
+d;da.trigger=f;da.isEventDraggable=g;da.isEventResizable=l;da.reportEvents=t;da.eventEnd=y;da.reportEventElement=S;da.reportEventClear=Q;da.eventElementHandlers=q;da.showEvents=u;da.hideEvents=fa;da.eventDrop=ga;da.eventResize=ra;var na=da.defaultEventEnd,ua=b.normalizeEvent,pa=b.reportEventChange,U={},ca=[],ka={},qa=b.options}function Qb(){function a(i,C){var P=z(),E=pa(),B=U(),n=0,Y,W,o=i.length,s,v;P[0].innerHTML=e(i);d(i,P.children());f(i);g(i,P,C);l(i);j(i);t(i);C=y();for(P=0;P<E;P++){Y=[];for(W=
+0;W<B;W++)Y[W]=0;for(;n<o&&(s=i[n]).row==P;){W=Hb(Y.slice(s.startCol,s.endCol));s.top=W;W+=s.outerHeight;for(v=s.startCol;v<s.endCol;v++)Y[v]=W;n++}C[P].height(Hb(Y))}Q(i,S(C))}function b(i,C,P){var E=m("<div/>"),B=z(),n=i.length,Y;E[0].innerHTML=e(i);E=E.children();B.append(E);d(i,E);l(i);j(i);t(i);Q(i,S(y()));E=[];for(B=0;B<n;B++)if(Y=i[B].element){i[B].row===C&&Y.css("top",P);E.push(Y[0])}return m(E)}function e(i){var C=fa("isRTL"),P,E=i.length,B,n,Y,W;P=ka();var o=P.left,s=P.right,v,F,r,J,M,k=
+"";for(P=0;P<E;P++){B=i[P];n=B.event;W=["fc-event","fc-event-skin","fc-event-hori"];ga(n)&&W.push("fc-event-draggable");if(C){B.isStart&&W.push("fc-corner-right");B.isEnd&&W.push("fc-corner-left");v=p(B.end.getDay()-1);F=p(B.start.getDay());r=B.isEnd?qa(v):o;J=B.isStart?G(F):s}else{B.isStart&&W.push("fc-corner-left");B.isEnd&&W.push("fc-corner-right");v=p(B.start.getDay());F=p(B.end.getDay()-1);r=B.isStart?qa(v):o;J=B.isEnd?G(F):s}W=W.concat(n.className);if(n.source)W=W.concat(n.source.className||
+[]);Y=n.url;M=Jb(n,fa);k+=Y?"<a href='"+Qa(Y)+"'":"<div";k+=" class='"+W.join(" ")+"' style='position:absolute;z-index:8;left:"+r+"px;"+M+"'><div class='fc-event-inner fc-event-skin'"+(M?" style='"+M+"'":"")+">";if(!n.allDay&&B.isStart)k+="<span class='fc-event-time'>"+Qa(T(n.start,n.end,fa("timeFormat")))+"</span>";k+="<span class='fc-event-title'>"+Qa(n.title)+"</span></div>";if(B.isEnd&&ra(n))k+="<div class='ui-resizable-handle ui-resizable-"+(C?"w":"e")+"'>&nbsp;&nbsp;&nbsp;</div>";k+="</"+(Y?
+"a":"div")+">";B.left=r;B.outerWidth=J-r;B.startCol=v;B.endCol=F+1}return k}function d(i,C){var P,E=i.length,B,n,Y;for(P=0;P<E;P++){B=i[P];n=B.event;Y=m(C[P]);n=oa("eventRender",n,n,Y);if(n===false)Y.remove();else{if(n&&n!==true){n=m(n).css({position:"absolute",left:B.left});Y.replaceWith(n);Y=n}B.element=Y}}}function f(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];(B=E.element)&&ha(E.event,B)}}function g(i,C,P){var E,B=i.length,n,Y,W;for(E=0;E<B;E++){n=i[E];if(Y=n.element){W=n.event;if(W._id===
+P)H(W,Y,n);else Y[0]._fci=E}}Db(C,i,H)}function l(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key=Ib(B[0]);Y=W[n];if(Y===ma)Y=W[n]=pb(B,true);E.hsides=Y}}}function j(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];if(B=E.element)B[0].style.width=Math.max(0,E.outerWidth-E.hsides)+"px"}}function t(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key;Y=W[n];if(Y===ma)Y=W[n]=Fb(B);E.outerHeight=B[0].offsetHeight+Y}}}function y(){var i,C=pa(),
+P=[];for(i=0;i<C;i++)P[i]=ca(i).find("td:first div.fc-day-content > div");return P}function S(i){var C,P=i.length,E=[];for(C=0;C<P;C++)E[C]=i[C][0].offsetTop;return E}function Q(i,C){var P,E=i.length,B,n;for(P=0;P<E;P++){B=i[P];if(n=B.element){n[0].style.top=C[B.row]+(B.top||0)+"px";B=B.event;oa("eventAfterRender",B,B,n)}}}function q(i,C,P){var E=fa("isRTL"),B=E?"w":"e",n=C.find("div.ui-resizable-"+B),Y=false;qb(C);C.mousedown(function(W){W.preventDefault()}).click(function(W){if(Y){W.preventDefault();
+W.stopImmediatePropagation()}});n.mousedown(function(W){function o(ia){oa("eventResizeStop",this,i,ia);m("body").css("cursor","");s.stop();ya();k&&ua(this,i,k,0,ia);setTimeout(function(){Y=false},0)}if(W.which==1){Y=true;var s=u.getHoverListener(),v=pa(),F=U(),r=E?-1:1,J=E?F-1:0,M=C.css("top"),k,D,Z=m.extend({},i),ja=L(i.start);K();m("body").css("cursor",B+"-resize").one("mouseup",o);oa("eventResizeStart",this,i,W);s.start(function(ia,la){if(ia){var $=Math.max(ja.row,ia.row);ia=ia.col;if(v==1)$=0;
+if($==ja.row)ia=E?Math.min(ja.col,ia):Math.max(ja.col,ia);k=$*7+ia*r+J-(la.row*7+la.col*r+J);la=ba(sa(i),k,true);if(k){Z.end=la;$=D;D=b(c([Z]),P.row,M);D.find("*").css("cursor",B+"-resize");$&&$.remove();na(i)}else if(D){da(i);D.remove();D=null}ya();X(i.start,ba(N(la),1))}},W)}})}var u=this;u.renderDaySegs=a;u.resizableDayEvent=q;var fa=u.opt,oa=u.trigger,ga=u.isEventDraggable,ra=u.isEventResizable,sa=u.eventEnd,ha=u.reportEventElement,da=u.showEvents,na=u.hideEvents,ua=u.eventResize,pa=u.getRowCnt,
+U=u.getColCnt,ca=u.allDayRow,ka=u.allDayBounds,qa=u.colContentLeft,G=u.colContentRight,p=u.dayOfWeekCol,L=u.dateCell,c=u.compileDaySegs,z=u.getDaySegmentContainer,H=u.bindDaySeg,T=u.calendar.formatDates,X=u.renderDayOverlay,ya=u.clearOverlays,K=u.clearSelection}function Mb(){function a(Q,q,u){b();q||(q=j(Q,u));t(Q,q,u);e(Q,q,u)}function b(Q){if(S){S=false;y();l("unselect",null,Q)}}function e(Q,q,u,fa){S=true;l("select",null,Q,q,u,fa)}function d(Q){var q=f.cellDate,u=f.cellIsAllDay,fa=f.getHoverListener(),
+oa=f.reportDayClick;if(Q.which==1&&g("selectable")){b(Q);var ga;fa.start(function(ra,sa){y();if(ra&&u(ra)){ga=[q(sa),q(ra)].sort(Gb);t(ga[0],ga[1],true)}else ga=null},Q);m(document).one("mouseup",function(ra){fa.stop();if(ga){+ga[0]==+ga[1]&&oa(ga[0],true,ra);e(ga[0],ga[1],true,ra)}})}}var f=this;f.select=a;f.unselect=b;f.reportSelection=e;f.daySelectionMousedown=d;var g=f.opt,l=f.trigger,j=f.defaultSelectionEnd,t=f.renderSelection,y=f.clearSelection,S=false;g("selectable")&&g("unselectAuto")&&m(document).mousedown(function(Q){var q=
+g("unselectCancel");if(q)if(m(Q.target).parents(q).length)return;b(Q)})}function Lb(){function a(g,l){var j=f.shift();j||(j=m("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>"));j[0].parentNode!=l[0]&&j.appendTo(l);d.push(j.css(g).show());return j}function b(){for(var g;g=d.shift();)f.push(g.hide().unbind())}var e=this;e.renderOverlay=a;e.clearOverlays=b;var d=[],f=[]}function Nb(a){var b=this,e,d;b.build=function(){e=[];d=[];a(e,d)};b.cell=function(f,g){var l=e.length,j=d.length,
+t,y=-1,S=-1;for(t=0;t<l;t++)if(g>=e[t][0]&&g<e[t][1]){y=t;break}for(t=0;t<j;t++)if(f>=d[t][0]&&f<d[t][1]){S=t;break}return y>=0&&S>=0?{row:y,col:S}:null};b.rect=function(f,g,l,j,t){t=t.offset();return{top:e[f][0]-t.top,left:d[g][0]-t.left,width:d[j][1]-d[g][0],height:e[l][1]-e[f][0]}}}function Ob(a){function b(j){xc(j);j=a.cell(j.pageX,j.pageY);if(!j!=!l||j&&(j.row!=l.row||j.col!=l.col)){if(j){g||(g=j);f(j,g,j.row-g.row,j.col-g.col)}else f(j,g);l=j}}var e=this,d,f,g,l;e.start=function(j,t,y){f=j;
+g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
+header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan",
+"Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:"&nbsp;&#9668;&nbsp;",next:"&nbsp;&#9658;&nbsp;",prevYear:"&nbsp;&lt;&lt;&nbsp;",nextYear:"&nbsp;&gt;&gt;&nbsp;",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
+{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"&nbsp;&#9658;&nbsp;",next:"&nbsp;&#9668;&nbsp;",prevYear:"&nbsp;&gt;&gt;&nbsp;",nextYear:"&nbsp;&lt;&lt;&nbsp;"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
+b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
+Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
+ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
+12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Oa(a,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}};Aa.applyAll=$a;Ja.month=mc;Ja.basicWeek=nc;Ja.basicDay=oc;wb({weekMode:"fixed"});Ja.agendaWeek=qc;Ja.agendaDay=rc;wb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,
+maxTime:24})})(jQuery);
diff --git a/library/fullcalendar/fullcalendar.print.css b/library/fullcalendar/fullcalendar.print.css
new file mode 100644 (file)
index 0000000..e11c181
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * FullCalendar v1.5.3 Print Stylesheet
+ *
+ * Include this stylesheet on your page to get a more printer-friendly calendar.
+ * When including this stylesheet, use the media='print' attribute of the <link> tag.
+ * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+ /* Events
+-----------------------------------------------------*/
+.fc-event-skin {
+       background: none !important;
+       color: #000 !important;
+       }
+       
+/* horizontal events */
+       
+.fc-event-hori {
+       border-width: 0 0 1px 0 !important;
+       border-bottom-style: dotted !important;
+       border-bottom-color: #000 !important;
+       padding: 1px 0 0 0 !important;
+       }
+       
+.fc-event-hori .fc-event-inner {
+       border-width: 0 !important;
+       padding: 0 1px !important;
+       }
+       
+/* vertical events */
+       
+.fc-event-vert {
+       border-width: 0 0 0 1px !important;
+       border-left-style: dotted !important;
+       border-left-color: #000 !important;
+       padding: 0 1px 0 0 !important;
+       }
+       
+.fc-event-vert .fc-event-inner {
+       border-width: 0 !important;
+       padding: 1px 0 !important;
+       }
+       
+.fc-event-bg {
+       display: none !important;
+       }
+       
+.fc-event .ui-resizable-handle {
+       display: none !important;
+       }
+       
+       
diff --git a/library/fullcalendar/gcal.js b/library/fullcalendar/gcal.js
new file mode 100644 (file)
index 0000000..e9bbe26
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * FullCalendar v1.5.3 Google Calendar Plugin
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+(function($) {
+
+
+var fc = $.fullCalendar;
+var formatDate = fc.formatDate;
+var parseISO8601 = fc.parseISO8601;
+var addDays = fc.addDays;
+var applyAll = fc.applyAll;
+
+
+fc.sourceNormalizers.push(function(sourceOptions) {
+       if (sourceOptions.dataType == 'gcal' ||
+               sourceOptions.dataType === undefined &&
+               (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) {
+                       sourceOptions.dataType = 'gcal';
+                       if (sourceOptions.editable === undefined) {
+                               sourceOptions.editable = false;
+                       }
+               }
+});
+
+
+fc.sourceFetchers.push(function(sourceOptions, start, end) {
+       if (sourceOptions.dataType == 'gcal') {
+               return transformOptions(sourceOptions, start, end);
+       }
+});
+
+
+function transformOptions(sourceOptions, start, end) {
+
+       var success = sourceOptions.success;
+       var data = $.extend({}, sourceOptions.data || {}, {
+               'start-min': formatDate(start, 'u'),
+               'start-max': formatDate(end, 'u'),
+               'singleevents': true,
+               'max-results': 9999
+       });
+       
+       var ctz = sourceOptions.currentTimezone;
+       if (ctz) {
+               data.ctz = ctz = ctz.replace(' ', '_');
+       }
+
+       return $.extend({}, sourceOptions, {
+               url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?',
+               dataType: 'jsonp',
+               data: data,
+               startParam: false,
+               endParam: false,
+               success: function(data) {
+                       var events = [];
+                       if (data.feed.entry) {
+                               $.each(data.feed.entry, function(i, entry) {
+                                       var startStr = entry['gd$when'][0]['startTime'];
+                                       var start = parseISO8601(startStr, true);
+                                       var end = parseISO8601(entry['gd$when'][0]['endTime'], true);
+                                       var allDay = startStr.indexOf('T') == -1;
+                                       var url;
+                                       $.each(entry.link, function(i, link) {
+                                               if (link.type == 'text/html') {
+                                                       url = link.href;
+                                                       if (ctz) {
+                                                               url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
+                                                       }
+                                               }
+                                       });
+                                       if (allDay) {
+                                               addDays(end, -1); // make inclusive
+                                       }
+                                       events.push({
+                                               id: entry['gCal$uid']['value'],
+                                               title: entry['title']['$t'],
+                                               url: url,
+                                               start: start,
+                                               end: end,
+                                               allDay: allDay,
+                                               location: entry['gd$where'][0]['valueString'],
+                                               description: entry['content']['$t']
+                                       });
+                               });
+                       }
+                       var args = [events].concat(Array.prototype.slice.call(arguments, 1));
+                       var res = applyAll(success, this, args);
+                       if ($.isArray(res)) {
+                               return res;
+                       }
+                       return events;
+               }
+       });
+       
+}
+
+
+// legacy
+fc.gcalFeed = function(url, sourceOptions) {
+       return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' });
+};
+
+
+})(jQuery);
index 51432c3f5372392d6404fd05ec379dc2db8f85f6..cae1f755ff0fa56c75c98f77cf95a11ba2814403 100755 (executable)
@@ -153,7 +153,7 @@ class Slinky {
        public function set_service_from_url( $url = false ) {
                if ( !$url )
                        $url = $this->url;
-               
+
                $host = parse_url( $url, PHP_URL_HOST );
                switch ( str_replace( 'www.', '', $host ) ) {
                        case 'bit.ly':
@@ -181,6 +181,11 @@ class Slinky {
                                        $this->service = new Slinky_Fongs();
                                        break;
                                }
+                       case $this->get( 'yourls-url' ):
+                               if ( class_exists( 'Slinky_YourLS' ) ) {
+                                       $this->service = new Slinky_YourLS();
+                                       break;
+                               }
                        case 'micurl.com':
                                if ( class_exists( 'Slinky_Micurl' ) ) {
                                        $this->service = new Slinky_Micurl();
@@ -574,6 +579,31 @@ class Slinky_Fongs extends Slinky_Service {
        }
 }
 
+// yourls
+class Slinky_YourLS extends Slinky_Service {
+       function url_is_short( $url ) {
+       return stristr( $url, 'shit.li/' );
+    }
+    
+       function url_is_long( $url ) {
+       return !stristr( $url, 'shit.li/' );
+    }
+    
+       function make_short( $url ) {
+               echo $this->get( 'username' );
+               $use_ssl = $this->get( 'ssl' );
+               if ( $use_ssl )
+                       $use_ssl  = 's';
+               else
+                       $use_ssl = '';
+               $result = $this->url_get( 'http'. $use_ssl . '://' . $this->get( 'yourls-url' ) . '/yourls-api.php?username=' . $this->get( 'username' )  . '&password=' . $this->get( 'password' ) . '&action=shorturl&format=simple&url=' . urlencode( $url ) );
+               if ( 1 != $result && 2 != $result )
+                       return $result;
+               else
+                       return $url;
+       }
+}
+
 // Micu.rl
 class Slinky_Micurl extends Slinky_Service {
        function url_is_short( $url ) {
diff --git a/library/spam/README b/library/spam/README
new file mode 100644 (file)
index 0000000..a0d67fc
--- /dev/null
@@ -0,0 +1,12 @@
+B8 for Friendica
+
+B8 is an excellent bayesian spam implementation for PHP. However when evaluating it for use in Friendica there were a few shortcomings. B8's primary audience is guestbooks and blogs - single user situations. 
+
+Friendica is a multi-user distributed social environment. So the first thing we need to add to b8 is a concept of user ID. 
+
+Second we don't want to use a second stored set of DB login credentials so we're going to implemetn Friendica's MySQL driver and use our existing connection and credentials.
+
+The third requirement is that the B8 processing model is to load a set of word/data sets from the DB, perform processing (which may change the value of the data) and then store the results back to the DB. We're in a highly dynamic environment with lots of sometimes concurrent message processing. So the plan is to alter the storage architecture to read data in, do processing, and then apply a somewhat atomic change operation where the changes are performed in a single query using the current data in storage rather than something passed through outside processing and where the data may be outdated come time to store it.
+
+In accordance with the LGPL of the B8 package these changes are available in source form at http://github.com/friendica/friendica in the directory library/spam
+  
\ No newline at end of file
diff --git a/library/spam/b8/b8.php b/library/spam/b8/b8.php
new file mode 100644 (file)
index 0000000..28a3dd2
--- /dev/null
@@ -0,0 +1,503 @@
+<?php
+
+#   Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   b8 - A Bayesian spam filter written in PHP 5
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port)
+ */
+
+class b8
+{
+
+       public $config = array(
+               'min_size'      => 3,
+               'max_size'      => 30,
+               'allow_numbers' => FALSE,
+               'lexer'         => 'default',
+               'degenerator'   => 'default',
+               'storage'       => 'dba',
+               'use_relevant'  => 15,
+               'min_dev'       => 0.2,
+               'rob_s'         => 0.3,
+               'rob_x'         => 0.5
+       );
+
+       private $_lexer      = NULL;
+       private $_database   = NULL;
+       private $_token_data = NULL;
+
+       const SPAM    = 'spam';
+       const HAM     = 'ham';
+       const LEARN   = 'learn';
+       const UNLEARN = 'unlearn';
+
+       const STARTUP_FAIL_DATABASE = 'STARTUP_FAIL_DATABASE';
+       const STARTUP_FAIL_LEXER    = 'STARTUP_FAIL_LEXER';
+       const TRAINER_CATEGORY_FAIL = 'TRAINER_CATEGORY_FAIL';
+
+       /**
+        * Constructs b8
+        *
+        * @access public
+        * @return void
+        */
+
+       function __construct($config = array(), $database_config)
+       {
+
+               # Validate config data
+
+               if(count($config) > 0) {
+
+                       foreach ($config as $name=>$value) {
+
+                               switch($name) {
+
+                                       case 'min_dev':
+                                       case 'rob_s':
+                                       case 'rob_x':
+                                               $this->config[$name] = (float) $value;
+                                               break;
+
+                                       case 'min_size':
+                                       case 'max_size':
+                                       case 'use_relevant':
+                                               $this->config[$name] = (int) $value;
+                                               break;
+
+                                       case 'allow_numbers':
+                                               $this->config[$name] = (bool) $value;
+                                               break;
+
+                                       case 'lexer':
+                                               $value = (string) strtolower($value);
+                                               $this->config[$name] = is_file(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . "lexer_" . $value . '.php') === TRUE ? $value : 'default';
+                                               break;
+
+                                       case 'storage':
+                                               $this->config[$name] = (string) $value;
+                                               break;
+
+                               }
+
+                       }
+
+               }
+
+               # Setup the database backend
+
+               # Get the basic storage class used by all backends
+               if($this->load_class('b8_storage_base', dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_base.php') === FALSE)
+                       return;
+
+               # Get the degenerator we need
+               if($this->load_class('b8_degenerator_' . $this->config['degenerator'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'degenerator' . DIRECTORY_SEPARATOR . 'degenerator_' . $this->config['degenerator'] . '.php') === FALSE)
+                       return;
+
+               # Get the actual storage backend we need
+               if($this->load_class('b8_storage_' . $this->config['storage'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_' . $this->config['storage'] . '.php') === FALSE)
+                       return;
+
+               # Setup the backend
+               $class = 'b8_storage_' . $this->config['storage'];
+               $this->_database = new $class(
+                       $database_config,
+                       $this->config['degenerator'], date('ymd')
+               );
+
+               # Setup the lexer class
+
+               if($this->load_class('b8_lexer_' . $this->config['lexer'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . 'lexer_' . $this->config['lexer'] . '.php') === FALSE)
+                       return;
+
+               $class = 'b8_lexer_' . $this->config['lexer'];
+               $this->_lexer = new $class(
+                       array(
+                               'min_size' => $this->config['min_size'],
+                               'max_size' => $this->config['max_size'],
+                               'allow_numbers' => $this->config['allow_numbers']
+                       )
+               );
+
+       }
+
+       /**
+        * Load a class file if a class has not been defined yet.
+        *
+        * @access public
+        * @return boolean Returns TRUE if everything is okay, otherwise FALSE.
+        */
+
+       public function load_class($class_name, $class_file)
+       {
+
+               if(class_exists($class_name, FALSE) === FALSE) {
+
+                       $included = require_once $class_file;
+
+                       if($included === FALSE or class_exists($class_name, FALSE) === FALSE)
+                               return FALSE;
+
+               }
+
+               return TRUE;
+
+       }
+
+       /**
+        * Validates the class has all it needs to work.
+        *
+        * @access public
+        * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+        */
+
+       public function validate()
+       {
+
+               if($this->_database === NULL)
+                       return self::STARTUP_FAIL_DATABASE;
+
+               # Connect the database backend if we aren't connected yet
+
+               elseif($this->_database->connected === FALSE) {
+
+                       $connection = $this->_database->connect();
+
+                       if($connection !== TRUE)
+                               return $connection;
+
+               }
+
+               if($this->_lexer === NULL)
+                       return self::STARTUP_FAIL_LEXER;
+
+               return TRUE;
+
+       }
+
+       /**
+        * Classifies a text
+        *
+        * @access public
+        * @package default
+        * @param string $text
+        * @return float The rating between 0 (ham) and 1 (spam)
+        */
+
+       public function classify($uid,$text)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # Get the internal database variables, containing the number of ham and
+               # spam texts so the spam probability can be calculated in relation to them
+               $internals = $this->_database->get_internals($uid);
+
+               # Calculate the spamminess of all tokens
+
+               # Get all tokens we want to rate
+
+               $tokens = $this->_lexer->get_tokens($text);
+
+               # Check if the lexer failed
+               # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+               if(!is_array($tokens))
+                       return $tokens;
+
+               # Fetch all availible data for the token set from the database
+               $this->_token_data = $this->_database->get(array_keys($tokens),$uid);
+
+               # Calculate the spamminess and importance for each token (or a degenerated form of it)
+
+               $word_count = array();
+               $rating     = array();
+               $importance = array();
+
+               foreach($tokens as $word => $count) {
+
+                       $word_count[$word] = $count;
+
+                       # Although we only call this function only here ... let's do the
+                       # calculation stuff in a function to make this a bit less confusing ;-)
+                       $rating[$word] = $this->_get_probability($word, $internals['texts_ham'], $internals['texts_spam']);
+
+                       $importance[$word] = abs(0.5 - $rating[$word]);
+
+               }
+
+               # Order by importance
+               arsort($importance);
+               reset($importance);
+
+               # Get the most interesting tokens (use all if we have less than the given number)
+
+               $relevant = array();
+
+               for($i = 0; $i < $this->config['use_relevant']; $i++) {
+
+                       if($tmp = each($importance)) {
+
+                               # Important tokens remain
+
+                               # If the token's rating is relevant enough, use it
+
+                               if(abs(0.5 - $rating[$tmp['key']]) > $this->config['min_dev']) {
+
+                                       # Tokens that appear more than once also count more than once
+
+                                       for($x = 0, $l = $word_count[$tmp['key']]; $x < $l; $x++)
+                                               array_push($relevant, $rating[$tmp['key']]);
+
+                               }
+
+                       }
+
+                       else {
+                               # We have less than words to use, so we already
+                               # use what we have and can break here
+                               break;
+                       }
+
+               }
+
+               # Calculate the spamminess of the text (thanks to Mr. Robinson ;-)
+               # We set both hamminess and Spamminess to 1 for the first multiplying
+               $hamminess  = 1;
+               $spamminess = 1;
+
+               # Consider all relevant ratings
+               foreach($relevant as $value) {
+                       $hamminess  *= (1.0 - $value);
+                       $spamminess *= $value;
+               }
+
+               # If no token was good for calculation, we really don't know how
+               # to rate this text; so we assume a spam and ham probability of 0.5
+
+               if($hamminess === 1 and $spamminess === 1) {
+                       $hamminess = 0.5;
+                       $spamminess = 0.5;
+                       $n = 1;
+               }
+               else {
+                       # Get the number of relevant ratings
+                       $n = count($relevant);
+               }
+
+               # Calculate the combined rating
+
+               # The actual hamminess and spamminess
+               $hamminess  = 1 - pow($hamminess,  (1 / $n));
+               $spamminess = 1 - pow($spamminess, (1 / $n));
+
+               # Calculate the combined indicator
+               $probability = ($hamminess - $spamminess) / ($hamminess + $spamminess);
+
+               # We want a value between 0 and 1, not between -1 and +1, so ...
+               $probability = (1 + $probability) / 2;
+
+               # Alea iacta est
+               return $probability;
+
+       }
+
+       /**
+        * Calculate the spamminess of a single token also considering "degenerated" versions
+        *
+        * @access private
+        * @param string $word
+        * @param string $texts_ham
+        * @param string $texts_spam
+        * @return void
+        */
+
+       private function _get_probability($word, $texts_ham, $texts_spam)
+       {
+
+               # Let's see what we have!
+
+               if(isset($this->_token_data['tokens'][$word]) === TRUE) {
+                       # The token was in the database, so we can use it's data as-is
+                       # and calculate the spamminess of this token directly
+                       return $this->_calc_probability($this->_token_data['tokens'][$word], $texts_ham, $texts_spam);
+               }
+
+               # Damn. The token was not found, so do we have at least similar words?
+
+               if(isset($this->_token_data['degenerates'][$word]) === TRUE) {
+
+                       # We found similar words, so calculate the spamminess for each one
+                       # and choose the most important one for the further calculation
+
+                       # The default rating is 0.5 simply saying nothing
+                       $rating = 0.5;
+
+                       foreach($this->_token_data['degenerates'][$word] as $degenerate => $count) {
+
+                               # Calculate the rating of the current degenerated token
+                               $rating_tmp = $this->_calc_probability($count, $texts_ham, $texts_spam);
+
+                               # Is it more important than the rating of another degenerated version?
+                               if(abs(0.5 - $rating_tmp) > abs(0.5 - $rating))
+                                       $rating = $rating_tmp;
+
+                       }
+
+                       return $rating;
+
+               }
+
+               else {
+                       # The token is really unknown, so choose the default rating
+                       # for completely unknown tokens. This strips down to the
+                       # robX parameter so we can cheap out the freaky math ;-)
+                       return $this->config['rob_x'];
+               }
+
+       }
+
+       /**
+        * Do the actual spamminess calculation of a single token
+        *
+        * @access private
+        * @param array $data
+        * @param string $texts_ham
+        * @param string $texts_spam
+        * @return void
+        */
+
+       private function _calc_probability($data, $texts_ham, $texts_spam)
+       {
+
+               # Calculate the basic probability by Mr. Graham
+
+               # But: consider the number of ham and spam texts saved instead of the
+               # number of entries where the token appeared to calculate a relative
+               # spamminess because we count tokens appearing multiple times not just
+               # once but as often as they appear in the learned texts
+
+               $rel_ham = $data['count_ham'];
+               $rel_spam = $data['count_spam'];
+
+               if($texts_ham > 0)
+                       $rel_ham = $data['count_ham'] / $texts_ham;
+
+               if($texts_spam > 0)
+                       $rel_spam = $data['count_spam'] / $texts_spam;
+
+               $rating = $rel_spam / ($rel_ham + $rel_spam);
+
+               # Calculate the better probability proposed by Mr. Robinson
+               $all = $data['count_ham'] + $data['count_spam'];
+               return (($this->config['rob_s'] * $this->config['rob_x']) + ($all * $rating)) / ($this->config['rob_s'] + $all);
+
+       }
+
+       /**
+        * Check the validity of the category of a request
+        *
+        * @access private
+        * @param string $category
+        * @return void
+        */
+
+       private function _check_category($category)
+       {
+               return $category === self::HAM or $category === self::SPAM;
+       }
+
+       /**
+        * Learn a reference text
+        *
+        * @access public
+        * @param string $text
+        * @param const $category Either b8::SPAM or b8::HAM
+        * @return void
+        */
+
+       public function learn($text, $category, $uid)
+       {
+               return $this->_process_text($text, $category, self::LEARN, $uid);
+       }
+
+       /**
+        * Unlearn a reference text
+        *
+        * @access public
+        * @param string $text
+        * @param const $category Either b8::SPAM or b8::HAM
+        * @return void
+        */
+
+       public function unlearn($text, $category, $uid)
+       {
+               return $this->_process_text($text, $category, self::UNLEARN, $uid);
+       }
+
+       /**
+        * Does the actual interaction with the storage backend for learning or unlearning texts
+        *
+        * @access private
+        * @param string $text
+        * @param const $category Either b8::SPAM or b8::HAM
+        * @param const $action Either b8::LEARN or b8::UNLEARN
+        * @return void
+        */
+
+       private function _process_text($text, $category, $action, $uid = 0)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # Look if the request is okay
+               if($this->_check_category($category) === FALSE)
+                       return self::TRAINER_CATEGORY_FAIL;
+
+               # Get all tokens from $text
+
+               $tokens = $this->_lexer->get_tokens($text);
+
+               # Check if the lexer failed
+               # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+               if(!is_array($tokens))
+                       return $tokens;
+
+               # Pass the tokens and what to do with it to the storage backend
+               return $this->_database->process_text($tokens, $category, $action, $uid);
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/b8.php.ORIG b/library/spam/b8/b8.php.ORIG
new file mode 100644 (file)
index 0000000..ea1e15f
--- /dev/null
@@ -0,0 +1,503 @@
+<?php
+
+#   Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   b8 - A Bayesian spam filter written in PHP 5
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port)
+ */
+
+class b8
+{
+
+       public $config = array(
+               'min_size'      => 3,
+               'max_size'      => 30,
+               'allow_numbers' => FALSE,
+               'lexer'         => 'default',
+               'degenerator'   => 'default',
+               'storage'       => 'dba',
+               'use_relevant'  => 15,
+               'min_dev'       => 0.2,
+               'rob_s'         => 0.3,
+               'rob_x'         => 0.5
+       );
+
+       private $_lexer      = NULL;
+       private $_database   = NULL;
+       private $_token_data = NULL;
+
+       const SPAM    = 'spam';
+       const HAM     = 'ham';
+       const LEARN   = 'learn';
+       const UNLEARN = 'unlearn';
+
+       const STARTUP_FAIL_DATABASE = 'STARTUP_FAIL_DATABASE';
+       const STARTUP_FAIL_LEXER    = 'STARTUP_FAIL_LEXER';
+       const TRAINER_CATEGORY_FAIL = 'TRAINER_CATEGORY_FAIL';
+
+       /**
+        * Constructs b8
+        *
+        * @access public
+        * @return void
+        */
+
+       function __construct($config = array(), $database_config)
+       {
+
+               # Validate config data
+
+               if(count($config) > 0) {
+
+                       foreach ($config as $name=>$value) {
+
+                               switch($name) {
+
+                                       case 'min_dev':
+                                       case 'rob_s':
+                                       case 'rob_x':
+                                               $this->config[$name] = (float) $value;
+                                               break;
+
+                                       case 'min_size':
+                                       case 'max_size':
+                                       case 'use_relevant':
+                                               $this->config[$name] = (int) $value;
+                                               break;
+
+                                       case 'allow_numbers':
+                                               $this->config[$name] = (bool) $value;
+                                               break;
+
+                                       case 'lexer':
+                                               $value = (string) strtolower($value);
+                                               $this->config[$name] = is_file(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . "lexer_" . $value . '.php') === TRUE ? $value : 'default';
+                                               break;
+
+                                       case 'storage':
+                                               $this->config[$name] = (string) $value;
+                                               break;
+
+                               }
+
+                       }
+
+               }
+
+               # Setup the database backend
+
+               # Get the basic storage class used by all backends
+               if($this->load_class('b8_storage_base', dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_base.php') === FALSE)
+                       return;
+
+               # Get the degenerator we need
+               if($this->load_class('b8_degenerator_' . $this->config['degenerator'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'degenerator' . DIRECTORY_SEPARATOR . 'degenerator_' . $this->config['degenerator'] . '.php') === FALSE)
+                       return;
+
+               # Get the actual storage backend we need
+               if($this->load_class('b8_storage_' . $this->config['storage'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_' . $this->config['storage'] . '.php') === FALSE)
+                       return;
+
+               # Setup the backend
+               $class = 'b8_storage_' . $this->config['storage'];
+               $this->_database = new $class(
+                       $database_config,
+                       $this->config['degenerator'], date('ymd')
+               );
+
+               # Setup the lexer class
+
+               if($this->load_class('b8_lexer_' . $this->config['lexer'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . 'lexer_' . $this->config['lexer'] . '.php') === FALSE)
+                       return;
+
+               $class = 'b8_lexer_' . $this->config['lexer'];
+               $this->_lexer = new $class(
+                       array(
+                               'min_size' => $this->config['min_size'],
+                               'max_size' => $this->config['max_size'],
+                               'allow_numbers' => $this->config['allow_numbers']
+                       )
+               );
+
+       }
+
+       /**
+        * Load a class file if a class has not been defined yet.
+        *
+        * @access public
+        * @return boolean Returns TRUE if everything is okay, otherwise FALSE.
+        */
+
+       public function load_class($class_name, $class_file)
+       {
+
+               if(class_exists($class_name, FALSE) === FALSE) {
+
+                       $included = require_once $class_file;
+
+                       if($included === FALSE or class_exists($class_name, FALSE) === FALSE)
+                               return FALSE;
+
+               }
+
+               return TRUE;
+
+       }
+
+       /**
+        * Validates the class has all it needs to work.
+        *
+        * @access public
+        * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+        */
+
+       public function validate()
+       {
+
+               if($this->_database === NULL)
+                       return self::STARTUP_FAIL_DATABASE;
+
+               # Connect the database backend if we aren't connected yet
+
+               elseif($this->_database->connected === FALSE) {
+
+                       $connection = $this->_database->connect();
+
+                       if($connection !== TRUE)
+                               return $connection;
+
+               }
+
+               if($this->_lexer === NULL)
+                       return self::STARTUP_FAIL_LEXER;
+
+               return TRUE;
+
+       }
+
+       /**
+        * Classifies a text
+        *
+        * @access public
+        * @package default
+        * @param string $text
+        * @return float The rating between 0 (ham) and 1 (spam)
+        */
+
+       public function classify($text)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # Get the internal database variables, containing the number of ham and
+               # spam texts so the spam probability can be calculated in relation to them
+               $internals = $this->_database->get_internals();
+
+               # Calculate the spamminess of all tokens
+
+               # Get all tokens we want to rate
+
+               $tokens = $this->_lexer->get_tokens($text);
+
+               # Check if the lexer failed
+               # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+               if(!is_array($tokens))
+                       return $tokens;
+
+               # Fetch all availible data for the token set from the database
+               $this->_token_data = $this->_database->get(array_keys($tokens));
+
+               # Calculate the spamminess and importance for each token (or a degenerated form of it)
+
+               $word_count = array();
+               $rating     = array();
+               $importance = array();
+
+               foreach($tokens as $word => $count) {
+
+                       $word_count[$word] = $count;
+
+                       # Although we only call this function only here ... let's do the
+                       # calculation stuff in a function to make this a bit less confusing ;-)
+                       $rating[$word] = $this->_get_probability($word, $internals['texts_ham'], $internals['texts_spam']);
+
+                       $importance[$word] = abs(0.5 - $rating[$word]);
+
+               }
+
+               # Order by importance
+               arsort($importance);
+               reset($importance);
+
+               # Get the most interesting tokens (use all if we have less than the given number)
+
+               $relevant = array();
+
+               for($i = 0; $i < $this->config['use_relevant']; $i++) {
+
+                       if($tmp = each($importance)) {
+
+                               # Important tokens remain
+
+                               # If the token's rating is relevant enough, use it
+
+                               if(abs(0.5 - $rating[$tmp['key']]) > $this->config['min_dev']) {
+
+                                       # Tokens that appear more than once also count more than once
+
+                                       for($x = 0, $l = $word_count[$tmp['key']]; $x < $l; $x++)
+                                               array_push($relevant, $rating[$tmp['key']]);
+
+                               }
+
+                       }
+
+                       else {
+                               # We have less than words to use, so we already
+                               # use what we have and can break here
+                               break;
+                       }
+
+               }
+
+               # Calculate the spamminess of the text (thanks to Mr. Robinson ;-)
+               # We set both hamminess and Spamminess to 1 for the first multiplying
+               $hamminess  = 1;
+               $spamminess = 1;
+
+               # Consider all relevant ratings
+               foreach($relevant as $value) {
+                       $hamminess  *= (1.0 - $value);
+                       $spamminess *= $value;
+               }
+
+               # If no token was good for calculation, we really don't know how
+               # to rate this text; so we assume a spam and ham probability of 0.5
+
+               if($hamminess === 1 and $spamminess === 1) {
+                       $hamminess = 0.5;
+                       $spamminess = 0.5;
+                       $n = 1;
+               }
+               else {
+                       # Get the number of relevant ratings
+                       $n = count($relevant);
+               }
+
+               # Calculate the combined rating
+
+               # The actual hamminess and spamminess
+               $hamminess  = 1 - pow($hamminess,  (1 / $n));
+               $spamminess = 1 - pow($spamminess, (1 / $n));
+
+               # Calculate the combined indicator
+               $probability = ($hamminess - $spamminess) / ($hamminess + $spamminess);
+
+               # We want a value between 0 and 1, not between -1 and +1, so ...
+               $probability = (1 + $probability) / 2;
+
+               # Alea iacta est
+               return $probability;
+
+       }
+
+       /**
+        * Calculate the spamminess of a single token also considering "degenerated" versions
+        *
+        * @access private
+        * @param string $word
+        * @param string $texts_ham
+        * @param string $texts_spam
+        * @return void
+        */
+
+       private function _get_probability($word, $texts_ham, $texts_spam)
+       {
+
+               # Let's see what we have!
+
+               if(isset($this->_token_data['tokens'][$word]) === TRUE) {
+                       # The token was in the database, so we can use it's data as-is
+                       # and calculate the spamminess of this token directly
+                       return $this->_calc_probability($this->_token_data['tokens'][$word], $texts_ham, $texts_spam);
+               }
+
+               # Damn. The token was not found, so do we have at least similar words?
+
+               if(isset($this->_token_data['degenerates'][$word]) === TRUE) {
+
+                       # We found similar words, so calculate the spamminess for each one
+                       # and choose the most important one for the further calculation
+
+                       # The default rating is 0.5 simply saying nothing
+                       $rating = 0.5;
+
+                       foreach($this->_token_data['degenerates'][$word] as $degenerate => $count) {
+
+                               # Calculate the rating of the current degenerated token
+                               $rating_tmp = $this->_calc_probability($count, $texts_ham, $texts_spam);
+
+                               # Is it more important than the rating of another degenerated version?
+                               if(abs(0.5 - $rating_tmp) > abs(0.5 - $rating))
+                                       $rating = $rating_tmp;
+
+                       }
+
+                       return $rating;
+
+               }
+
+               else {
+                       # The token is really unknown, so choose the default rating
+                       # for completely unknown tokens. This strips down to the
+                       # robX parameter so we can cheap out the freaky math ;-)
+                       return $this->config['rob_x'];
+               }
+
+       }
+
+       /**
+        * Do the actual spamminess calculation of a single token
+        *
+        * @access private
+        * @param array $data
+        * @param string $texts_ham
+        * @param string $texts_spam
+        * @return void
+        */
+
+       private function _calc_probability($data, $texts_ham, $texts_spam)
+       {
+
+               # Calculate the basic probability by Mr. Graham
+
+               # But: consider the number of ham and spam texts saved instead of the
+               # number of entries where the token appeared to calculate a relative
+               # spamminess because we count tokens appearing multiple times not just
+               # once but as often as they appear in the learned texts
+
+               $rel_ham = $data['count_ham'];
+               $rel_spam = $data['count_spam'];
+
+               if($texts_ham > 0)
+                       $rel_ham = $data['count_ham'] / $texts_ham;
+
+               if($texts_spam > 0)
+                       $rel_spam = $data['count_spam'] / $texts_spam;
+
+               $rating = $rel_spam / ($rel_ham + $rel_spam);
+
+               # Calculate the better probability proposed by Mr. Robinson
+               $all = $data['count_ham'] + $data['count_spam'];
+               return (($this->config['rob_s'] * $this->config['rob_x']) + ($all * $rating)) / ($this->config['rob_s'] + $all);
+
+       }
+
+       /**
+        * Check the validity of the category of a request
+        *
+        * @access private
+        * @param string $category
+        * @return void
+        */
+
+       private function _check_category($category)
+       {
+               return $category === self::HAM or $category === self::SPAM;
+       }
+
+       /**
+        * Learn a reference text
+        *
+        * @access public
+        * @param string $text
+        * @param const $category Either b8::SPAM or b8::HAM
+        * @return void
+        */
+
+       public function learn($text, $category)
+       {
+               return $this->_process_text($text, $category, self::LEARN);
+       }
+
+       /**
+        * Unlearn a reference text
+        *
+        * @access public
+        * @param string $text
+        * @param const $category Either b8::SPAM or b8::HAM
+        * @return void
+        */
+
+       public function unlearn($text, $category)
+       {
+               return $this->_process_text($text, $category, self::UNLEARN);
+       }
+
+       /**
+        * Does the actual interaction with the storage backend for learning or unlearning texts
+        *
+        * @access private
+        * @param string $text
+        * @param const $category Either b8::SPAM or b8::HAM
+        * @param const $action Either b8::LEARN or b8::UNLEARN
+        * @return void
+        */
+
+       private function _process_text($text, $category, $action)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # Look if the request is okay
+               if($this->_check_category($category) === FALSE)
+                       return self::TRAINER_CATEGORY_FAIL;
+
+               # Get all tokens from $text
+
+               $tokens = $this->_lexer->get_tokens($text);
+
+               # Check if the lexer failed
+               # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+               if(!is_array($tokens))
+                       return $tokens;
+
+               # Pass the tokens and what to do with it to the storage backend
+               return $this->_database->process_text($tokens, $category, $action);
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/degenerator/degenerator_default.php b/library/spam/b8/degenerator/degenerator_default.php
new file mode 100644 (file)
index 0000000..4ff6d88
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+
+#   Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+class b8_degenerator_default
+{
+
+       public $degenerates = array();
+
+       /**
+        * Generates a list of "degenerated" words for a list of words.
+        *
+        * @access public
+        * @param array $tokens
+        * @return array An array containing an array of degenerated tokens for each token
+        */
+
+       public function degenerate(array $words)
+       {
+
+               $degenerates = array();
+
+               foreach($words as $word)
+                       $degenerates[$word] = $this->_degenerate_word($word);
+
+               return $degenerates;
+
+       }
+
+       /**
+        * If the original word is not found in the database then
+        * we build "degenerated" versions of the word to lookup.
+        *
+        * @access private
+        * @param string $word
+        * @return array An array of degenerated words
+        */
+
+       protected function _degenerate_word($word)
+       {
+
+               # Check for any stored words so the process doesn't have to repeat
+               if(isset($this->degenerates[$word]) === TRUE)
+                       return $this->degenerates[$word];
+
+               $degenerate = array();
+
+               # Add different version of upper and lower case and ucfirst
+               array_push($degenerate, strtolower($word));
+               array_push($degenerate, strtoupper($word));
+               array_push($degenerate, ucfirst($word));
+
+               # Degenerate all versions
+
+               foreach($degenerate as $alt_word) {
+
+                       # Look for stuff like !!! and ???
+
+                       if(preg_match('/[!?]$/', $alt_word) > 0) {
+
+                               # Add versions with different !s and ?s
+
+                               if(preg_match('/[!?]{2,}$/', $alt_word) > 0) {
+                                       $tmp = preg_replace('/([!?])+$/', '$1', $alt_word);
+                                       array_push($degenerate, $tmp);
+                               }
+
+                               $tmp = preg_replace('/([!?])+$/', '', $alt_word);
+                               array_push($degenerate, $tmp);
+
+                       }
+
+                       # Look for ... at the end of the word
+
+                       $alt_word_int = $alt_word;
+
+                       while(preg_match('/[\.]$/', $alt_word_int) > 0) {
+                               $alt_word_int = substr($alt_word_int, 0, strlen($alt_word_int) - 1);
+                               array_push($degenerate, $alt_word_int);
+                       }
+
+               }
+
+               # Some degenerates are the same as the original word. These don't have
+               # to be fetched, so we create a new array with only new tokens
+
+               $real_degenerate = array();
+
+               foreach($degenerate as $deg_word) {
+                       if($word != $deg_word)
+                               array_push($real_degenerate, $deg_word);
+               }
+
+               # Store the list of degenerates for the token
+               $this->degenerates[$word] = $real_degenerate;
+
+               return $real_degenerate;
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/lexer/lexer_default.php b/library/spam/b8/lexer/lexer_default.php
new file mode 100644 (file)
index 0000000..7b5ca22
--- /dev/null
@@ -0,0 +1,205 @@
+<?php
+
+#   Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port)
+ */
+
+class b8_lexer_default
+{
+
+       const LEXER_TEXT_NOT_STRING = 'LEXER_TEXT_NOT_STRING';
+       const LEXER_TEXT_EMPTY      = 'LEXER_TEXT_EMPTY';
+
+       public $config = NULL;
+
+       # The regular expressions we use to split the text to tokens
+
+       public $regexp = array(
+               'ip'        => '/([A-Za-z0-9\_\-\.]+)/',
+               'raw_split' => '/[\s,\.\/"\:;\|<>\-_\[\]{}\+=\)\(\*\&\^%]+/',
+               'html'      => '/(<.+?>)/',
+               'tagname'   => '/(.+?)\s/',
+               'numbers'   => '/^[0-9]+$/'
+       );
+
+       /**
+        * Constructs the lexer.
+        *
+        * @access public
+        * @return void
+        */
+
+       function __construct($config)
+       {
+               $this->config = $config;
+       }
+
+       /**
+        * Generates the tokens required for the bayesian filter.
+        *
+        * @access public
+        * @param string $text
+        * @return array Returns the list of tokens
+        */
+
+       public function get_tokens($text)
+       {
+
+               # Check that we actually have a string ...
+               if(is_string($text) === FALSE)
+                       return self::LEXER_TEXT_NOT_STRING;
+
+               # ... and that it's not empty
+               if(empty($text) === TRUE)
+                       return self::LEXER_TEXT_EMPTY;
+
+               # Re-convert the text to the original characters coded in UTF-8, as
+               # they have been coded in html entities during the post process
+               $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
+
+               $tokens = array();
+
+               # Find URLs and IP addresses
+
+               preg_match_all($this->regexp['ip'], $text, $raw_tokens);
+
+               foreach($raw_tokens[1] as $word) {
+
+                       # Check for a dot
+                       if(strpos($word, '.') === FALSE)
+                               continue;
+
+                       # Check that the word is valid, min and max sizes, etc.
+                       if($this->_is_valid($word) === FALSE)
+                               continue;
+
+                       if(isset($tokens[$word]) === FALSE)
+                               $tokens[$word] = 1;
+                       else
+                               $tokens[$word] += 1;
+
+                       # Delete the word from the text so it doesn't get re-added.
+                       $text = str_replace($word, '', $text);
+
+                       # Also process the parts of the URLs
+                       $url_parts = preg_split($this->regexp['raw_split'], $word);
+
+                       foreach($url_parts as $word) {
+
+                               # Again validate the part
+
+                               if($this->_is_valid($word) === FALSE)
+                                       continue;
+
+                               if(isset($tokens[$word]) === FALSE)
+                                       $tokens[$word] = 1;
+                               else
+                                       $tokens[$word] += 1;
+
+                       }
+
+               }
+
+               # Split the remaining text
+
+               $raw_tokens = preg_split($this->regexp['raw_split'], $text);
+
+               foreach($raw_tokens as $word) {
+
+                       # Again validate the part
+
+                       if($this->_is_valid($word) === FALSE)
+                               continue;
+
+                       if(isset($tokens[$word]) === FALSE)
+                               $tokens[$word] = 1;
+                       else
+                               $tokens[$word] += 1;
+
+               }
+
+               # Process the HTML
+
+               preg_match_all($this->regexp['html'], $text, $raw_tokens);
+
+               foreach($raw_tokens[1] as $word) {
+
+                       # Again validate the part
+
+                       if($this->_is_valid($word) === FALSE)
+                               continue;
+
+                       # If the tag has parameters, just use the tag itself
+
+                       if(strpos($word, ' ') !== FALSE) {
+                               preg_match($this->regexp['tagname'], $word, $tmp);
+                               $word = "{$tmp[1]}...>";
+                       }
+
+                       if(isset($tokens[$word]) === FALSE)
+                               $tokens[$word] = 1;
+                       else
+                               $tokens[$word] += 1;
+
+               }
+
+               # Return a list of all found tokens
+               return $tokens;
+
+       }
+
+       /**
+        * Validates a token.
+        *
+        * @access private
+        * @param string $token The token string.
+        * @return boolean Returns TRUE if the token is valid, otherwise returns FALSE
+        */
+
+       private function _is_valid($token)
+       {
+
+               # Validate the size of the token
+
+               $len = strlen($token);
+
+               if($len < $this->config['min_size'] or $len > $this->config['max_size'])
+                       return FALSE;
+
+               # We may want to exclude pure numbers
+               if($this->config['allow_numbers'] === FALSE) {
+                       if(preg_match($this->regexp['numbers'], $token) > 0)
+                               return FALSE;
+               }
+
+               # Token is okay
+               return TRUE;
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/storage/storage_base.php b/library/spam/b8/storage/storage_base.php
new file mode 100644 (file)
index 0000000..6b181ee
--- /dev/null
@@ -0,0 +1,396 @@
+<?php
+
+#   Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Functions used by all storage backends
+ * Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+abstract class b8_storage_base
+{
+
+       public $connected            = FALSE;
+
+       protected $_degenerator      = NULL;
+
+       const INTERNALS_TEXTS_HAM    = 'bayes*texts.ham';
+       const INTERNALS_TEXTS_SPAM   = 'bayes*texts.spam';
+       const INTERNALS_DBVERSION    = 'bayes*dbversion';
+
+       const BACKEND_NOT_CONNECTED  = 'BACKEND_NOT_CONNECTED';
+       const DATABASE_WRONG_VERSION = 'DATABASE_WRONG_VERSION';
+       const DATABASE_NOT_B8        = 'DATABASE_NOT_B8';
+
+       /**
+        * Validates the class has all it needs to work.
+        *
+        * @access protected
+        * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+        */
+
+       protected function validate()
+       {
+
+               # We set up the degenerator here, as we would have to duplicate code if it
+               # was done in the constructor of the respective storage backend.
+               $class = 'b8_degenerator_' . $this->b8_config['degenerator'];
+               $this->_degenerator = new $class();
+
+               if($this->connected !== TRUE)
+                       return self::BACKEND_NOT_CONNECTED;
+
+               return TRUE;
+
+       }
+
+       /**
+        * Checks if a b8 database is used and if it's version is okay
+        *
+        * @access protected
+        * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+        */
+
+       protected function check_database($uid)
+       {
+
+               $internals = $this->get_internals($uid);
+
+               if(isset($internals['dbversion'])) {
+                       if($internals['dbversion'] == "2") {
+                               return TRUE;
+                       }
+                       else {
+                               $this->connected = FALSE;
+                               return self::DATABASE_WRONG_VERSION;
+                       }
+               }
+               else {
+                       $this->connected = FALSE;
+                       return self::DATABASE_NOT_B8;
+               }
+
+       }
+
+       /**
+        * Parses the "count" data of a token.
+        *
+        * @access private
+        * @param string $data
+        * @return array Returns an array of the parsed data: array(count_ham, count_spam, lastseen).
+        */
+
+       private function _parse_count($data)
+       {
+
+               list($count_ham, $count_spam, $lastseen) = explode(' ', $data);
+
+               $count_ham  = (int) $count_ham;
+               $count_spam = (int) $count_spam;
+
+               return array(
+                       'count_ham'  => $count_ham,
+                       'count_spam' => $count_spam
+               );
+
+       }
+
+       /**
+        * Get the database's internal variables.
+        *
+        * @access public
+        * @return array Returns an array of all internals.
+        */
+
+       public function get_internals($uid)
+       {
+
+               $internals = $this->_get_query(
+                       array(
+                               self::INTERNALS_TEXTS_HAM,
+                               self::INTERNALS_TEXTS_SPAM,
+                               self::INTERNALS_DBVERSION
+                       ),
+                       $uid
+               );
+
+               return array(
+                       'texts_ham'  => (int) $internals[self::INTERNALS_TEXTS_HAM],
+                       'texts_spam' => (int) $internals[self::INTERNALS_TEXTS_SPAM],
+                       'dbversion'  => (int) $internals[self::INTERNALS_DBVERSION]
+               );
+
+       }
+
+       /**
+        * Get all data about a list of tags from the database.
+        *
+        * @access public
+        * @param array $tokens
+        * @return mixed Returns FALSE on failure, otherwise returns array of returned data in the format array('tokens' => array(token => count), 'degenerates' => array(token => array(degenerate => count))).
+        */
+
+       public function get($tokens, $uid)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # First we see what we have in the database.
+               $token_data = $this->_get_query($tokens, $uid);
+
+               # Check if we have to degenerate some tokens
+
+               $missing_tokens = array();
+
+               foreach($tokens as $token) {
+                       if(!isset($token_data[$token]))
+                               $missing_tokens[] = $token;
+               }
+
+               if(count($missing_tokens) > 0) {
+
+                       # We have to degenerate some tokens
+                       $degenerates_list = array();
+
+                       # Generate a list of degenerated tokens for the missing tokens ...
+                       $degenerates = $this->_degenerator->degenerate($missing_tokens);
+
+                       # ... and look them up
+
+                       foreach($degenerates as $token => $token_degenerates)
+                               $degenerates_list = array_merge($degenerates_list, $token_degenerates);
+
+                       $token_data = array_merge($token_data, $this->_get_query($degenerates_list));
+
+               }
+
+               # Here, we have all availible data in $token_data.
+
+               $return_data_tokens = array();
+               $return_data_degenerates = array();
+
+               foreach($tokens as $token) {
+
+                       if(isset($token_data[$token]) === TRUE) {
+
+                               # The token was found in the database
+
+                               # Add the data ...
+                               $return_data_tokens[$token] = $this->_parse_count($token_data[$token]);
+
+                               # ... and update it's lastseen parameter
+                               $this->_update($token, "{$return_data_tokens[$token]['count_ham']} {$return_data_tokens[$token]['count_spam']} " . $this->b8_config['today'], $uid );
+
+                       }
+
+                       else {
+
+                               # The token was not found, so we look if we
+                               # can return data for degenerated tokens
+
+                               # Check all degenerated forms of the token
+
+                               foreach($this->_degenerator->degenerates[$token] as $degenerate) {
+
+                                       if(isset($token_data[$degenerate]) === TRUE) {
+
+                                               # A degeneration of the token way found in the database
+
+                                               # Add the data ...
+                                               $return_data_degenerates[$token][$degenerate] = $this->_parse_count($token_data[$degenerate]);
+
+                                               # ... and update it's lastseen parameter
+                                               $this->_update($degenerate, "{$return_data_degenerates[$token][$degenerate]['count_ham']} {$return_data_degenerates[$token][$degenerate]['count_spam']} " . $this->b8_config['today'], $uid);
+
+                                       }
+
+                               }
+
+                       }
+
+               }
+
+               # Now, all token data directly found in the database is in $return_data_tokens
+               # and all data for degenerated versions is in $return_data_degenerates
+
+               # First, we commit the changes to the lastseen parameters
+               $this->_commit();
+
+               # Then, we return what we have
+               return array(
+                       'tokens'      => $return_data_tokens,
+                       'degenerates' => $return_data_degenerates
+               );
+
+       }
+
+       /**
+        * Stores or deletes a list of tokens from the given category.
+        *
+        * @access public
+        * @param array $tokens
+        * @param const $category Either b8::HAM or b8::SPAM
+        * @param const $action Either b8::LEARN or b8::UNLEARN
+        * @return void
+        */
+
+       public function process_text($tokens, $category, $action, $uid)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # No matter what we do, we first have to check what data we have.
+
+               # First get the internals, including the ham texts and spam texts counter
+               $internals = $this->get_internals($uid);
+
+               # Then, fetch all data for all tokens we have (and update their lastseen parameters)
+               $token_data = $this->_get_query(array_keys($tokens), $uid);
+
+               # Process all tokens to learn/unlearn
+
+               foreach($tokens as $token => $count) {
+
+                       if(isset($token_data[$token])) {
+
+                               # We already have this token, so update it's data
+
+                               # Get the existing data
+                               list($count_ham, $count_spam, $lastseen) = explode(' ', $token_data[$token]);
+                               $count_ham  = (int) $count_ham;
+                               $count_spam = (int) $count_spam;
+
+                               # Increase or decrease the right counter
+
+                               if($action === b8::LEARN) {
+                                       if($category === b8::HAM)
+                                               $count_ham += $count;
+                                       elseif($category === b8::SPAM)
+                                               $count_spam += $count;
+                               }
+
+                               elseif($action == b8::UNLEARN) {
+                                       if($category === b8::HAM)
+                                               $count_ham -= $count;
+                                       elseif($category === b8::SPAM)
+                                               $count_spam -= $count;
+                               }
+
+                               # We don't want to have negative values
+
+                               if($count_ham < 0)
+                                       $count_ham = 0;
+
+                               if($count_spam < 0)
+                                       $count_spam = 0;
+
+                               # Now let's see if we have to update or delete the token
+                               if($count_ham !== 0 or $count_spam !== 0)
+                                       $this->_update($token, "$count_ham $count_spam " . $this->b8_config['today'], $uid);
+                               else
+                                       $this->_del($token, $uid);
+
+                       }
+
+                       else {
+
+                               # We don't have the token. If we unlearn a text, we can't delete it
+                               # as we don't have it anyway, so just do something if we learn a text
+
+                               if($action === b8::LEARN) {
+
+                                       if($category === b8::HAM)
+                                               $data = '1 0 ';
+                                       elseif($category === b8::SPAM)
+                                               $data = '0 1 ';
+
+                                       $data .= $this->b8_config['today'];
+
+                                       $this->_put($token, $data, $uid);
+
+                               }
+
+                       }
+
+               }
+
+               # Now, all token have been processed, so let's update the right text
+
+               if($action === b8::LEARN) {
+
+                       if($category === b8::HAM) {
+                               $internals['texts_ham']++;
+                               $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham'], $uid);
+                       }
+
+                       elseif($category === b8::SPAM) {
+                               $internals['texts_spam']++;
+                               $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam'], $uid);
+                       }
+
+               }
+
+               elseif($action == b8::UNLEARN) {
+
+                       if($category === b8::HAM) {
+
+                               $internals['texts_ham']--;
+
+                               if($internals['texts_ham'] < 0)
+                                       $internals['texts_ham'] = 0;
+
+                               $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham'], $uid);
+
+                       }
+
+                       elseif($category === b8::SPAM) {
+
+                               $internals['texts_spam']--;
+
+                               if($internals['texts_spam'] < 0)
+                                       $internals['texts_spam'] = 0;
+
+                               $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam'], $uid);
+
+                       }
+
+               }
+
+               # We're done and can commit all changes to the database now
+               $this->_commit($uid);
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/storage/storage_base.php.ORIG b/library/spam/b8/storage/storage_base.php.ORIG
new file mode 100644 (file)
index 0000000..01f5a69
--- /dev/null
@@ -0,0 +1,395 @@
+<?php
+
+#   Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Functions used by all storage backends
+ * Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+abstract class b8_storage_base
+{
+
+       public $connected            = FALSE;
+
+       protected $_degenerator      = NULL;
+
+       const INTERNALS_TEXTS_HAM    = 'bayes*texts.ham';
+       const INTERNALS_TEXTS_SPAM   = 'bayes*texts.spam';
+       const INTERNALS_DBVERSION    = 'bayes*dbversion';
+
+       const BACKEND_NOT_CONNECTED  = 'BACKEND_NOT_CONNECTED';
+       const DATABASE_WRONG_VERSION = 'DATABASE_WRONG_VERSION';
+       const DATABASE_NOT_B8        = 'DATABASE_NOT_B8';
+
+       /**
+        * Validates the class has all it needs to work.
+        *
+        * @access protected
+        * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+        */
+
+       protected function validate()
+       {
+
+               # We set up the degenerator here, as we would have to duplicate code if it
+               # was done in the constructor of the respective storage backend.
+               $class = 'b8_degenerator_' . $this->b8_config['degenerator'];
+               $this->_degenerator = new $class();
+
+               if($this->connected !== TRUE)
+                       return self::BACKEND_NOT_CONNECTED;
+
+               return TRUE;
+
+       }
+
+       /**
+        * Checks if a b8 database is used and if it's version is okay
+        *
+        * @access protected
+        * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+        */
+
+       protected function check_database()
+       {
+
+               $internals = $this->get_internals();
+
+               if(isset($internals['dbversion'])) {
+                       if($internals['dbversion'] == "2") {
+                               return TRUE;
+                       }
+                       else {
+                               $this->connected = FALSE;
+                               return self::DATABASE_WRONG_VERSION;
+                       }
+               }
+               else {
+                       $this->connected = FALSE;
+                       return self::DATABASE_NOT_B8;
+               }
+
+       }
+
+       /**
+        * Parses the "count" data of a token.
+        *
+        * @access private
+        * @param string $data
+        * @return array Returns an array of the parsed data: array(count_ham, count_spam, lastseen).
+        */
+
+       private function _parse_count($data)
+       {
+
+               list($count_ham, $count_spam, $lastseen) = explode(' ', $data);
+
+               $count_ham  = (int) $count_ham;
+               $count_spam = (int) $count_spam;
+
+               return array(
+                       'count_ham'  => $count_ham,
+                       'count_spam' => $count_spam
+               );
+
+       }
+
+       /**
+        * Get the database's internal variables.
+        *
+        * @access public
+        * @return array Returns an array of all internals.
+        */
+
+       public function get_internals()
+       {
+
+               $internals = $this->_get_query(
+                       array(
+                               self::INTERNALS_TEXTS_HAM,
+                               self::INTERNALS_TEXTS_SPAM,
+                               self::INTERNALS_DBVERSION
+                       )
+               );
+
+               return array(
+                       'texts_ham'  => (int) $internals[self::INTERNALS_TEXTS_HAM],
+                       'texts_spam' => (int) $internals[self::INTERNALS_TEXTS_SPAM],
+                       'dbversion'  => (int) $internals[self::INTERNALS_DBVERSION]
+               );
+
+       }
+
+       /**
+        * Get all data about a list of tags from the database.
+        *
+        * @access public
+        * @param array $tokens
+        * @return mixed Returns FALSE on failure, otherwise returns array of returned data in the format array('tokens' => array(token => count), 'degenerates' => array(token => array(degenerate => count))).
+        */
+
+       public function get($tokens)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # First we see what we have in the database.
+               $token_data = $this->_get_query($tokens);
+
+               # Check if we have to degenerate some tokens
+
+               $missing_tokens = array();
+
+               foreach($tokens as $token) {
+                       if(!isset($token_data[$token]))
+                               $missing_tokens[] = $token;
+               }
+
+               if(count($missing_tokens) > 0) {
+
+                       # We have to degenerate some tokens
+                       $degenerates_list = array();
+
+                       # Generate a list of degenerated tokens for the missing tokens ...
+                       $degenerates = $this->_degenerator->degenerate($missing_tokens);
+
+                       # ... and look them up
+
+                       foreach($degenerates as $token => $token_degenerates)
+                               $degenerates_list = array_merge($degenerates_list, $token_degenerates);
+
+                       $token_data = array_merge($token_data, $this->_get_query($degenerates_list));
+
+               }
+
+               # Here, we have all availible data in $token_data.
+
+               $return_data_tokens = array();
+               $return_data_degenerates = array();
+
+               foreach($tokens as $token) {
+
+                       if(isset($token_data[$token]) === TRUE) {
+
+                               # The token was found in the database
+
+                               # Add the data ...
+                               $return_data_tokens[$token] = $this->_parse_count($token_data[$token]);
+
+                               # ... and update it's lastseen parameter
+                               $this->_update($token, "{$return_data_tokens[$token]['count_ham']} {$return_data_tokens[$token]['count_spam']} " . $this->b8_config['today']);
+
+                       }
+
+                       else {
+
+                               # The token was not found, so we look if we
+                               # can return data for degenerated tokens
+
+                               # Check all degenerated forms of the token
+
+                               foreach($this->_degenerator->degenerates[$token] as $degenerate) {
+
+                                       if(isset($token_data[$degenerate]) === TRUE) {
+
+                                               # A degeneration of the token way found in the database
+
+                                               # Add the data ...
+                                               $return_data_degenerates[$token][$degenerate] = $this->_parse_count($token_data[$degenerate]);
+
+                                               # ... and update it's lastseen parameter
+                                               $this->_update($degenerate, "{$return_data_degenerates[$token][$degenerate]['count_ham']} {$return_data_degenerates[$token][$degenerate]['count_spam']} " . $this->b8_config['today']);
+
+                                       }
+
+                               }
+
+                       }
+
+               }
+
+               # Now, all token data directly found in the database is in $return_data_tokens
+               # and all data for degenerated versions is in $return_data_degenerates
+
+               # First, we commit the changes to the lastseen parameters
+               $this->_commit();
+
+               # Then, we return what we have
+               return array(
+                       'tokens'      => $return_data_tokens,
+                       'degenerates' => $return_data_degenerates
+               );
+
+       }
+
+       /**
+        * Stores or deletes a list of tokens from the given category.
+        *
+        * @access public
+        * @param array $tokens
+        * @param const $category Either b8::HAM or b8::SPAM
+        * @param const $action Either b8::LEARN or b8::UNLEARN
+        * @return void
+        */
+
+       public function process_text($tokens, $category, $action)
+       {
+
+               # Validate the startup
+
+               $started_up = $this->validate();
+
+               if($started_up !== TRUE)
+                       return $started_up;
+
+               # No matter what we do, we first have to check what data we have.
+
+               # First get the internals, including the ham texts and spam texts counter
+               $internals = $this->get_internals();
+
+               # Then, fetch all data for all tokens we have (and update their lastseen parameters)
+               $token_data = $this->_get_query(array_keys($tokens));
+
+               # Process all tokens to learn/unlearn
+
+               foreach($tokens as $token => $count) {
+
+                       if(isset($token_data[$token])) {
+
+                               # We already have this token, so update it's data
+
+                               # Get the existing data
+                               list($count_ham, $count_spam, $lastseen) = explode(' ', $token_data[$token]);
+                               $count_ham  = (int) $count_ham;
+                               $count_spam = (int) $count_spam;
+
+                               # Increase or decrease the right counter
+
+                               if($action === b8::LEARN) {
+                                       if($category === b8::HAM)
+                                               $count_ham += $count;
+                                       elseif($category === b8::SPAM)
+                                               $count_spam += $count;
+                               }
+
+                               elseif($action == b8::UNLEARN) {
+                                       if($category === b8::HAM)
+                                               $count_ham -= $count;
+                                       elseif($category === b8::SPAM)
+                                               $count_spam -= $count;
+                               }
+
+                               # We don't want to have negative values
+
+                               if($count_ham < 0)
+                                       $count_ham = 0;
+
+                               if($count_spam < 0)
+                                       $count_spam = 0;
+
+                               # Now let's see if we have to update or delete the token
+                               if($count_ham !== 0 or $count_spam !== 0)
+                                       $this->_update($token, "$count_ham $count_spam " . $this->b8_config['today']);
+                               else
+                                       $this->_del($token);
+
+                       }
+
+                       else {
+
+                               # We don't have the token. If we unlearn a text, we can't delete it
+                               # as we don't have it anyway, so just do something if we learn a text
+
+                               if($action === b8::LEARN) {
+
+                                       if($category === b8::HAM)
+                                               $data = '1 0 ';
+                                       elseif($category === b8::SPAM)
+                                               $data = '0 1 ';
+
+                                       $data .= $this->b8_config['today'];
+
+                                       $this->_put($token, $data);
+
+                               }
+
+                       }
+
+               }
+
+               # Now, all token have been processed, so let's update the right text
+
+               if($action === b8::LEARN) {
+
+                       if($category === b8::HAM) {
+                               $internals['texts_ham']++;
+                               $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham']);
+                       }
+
+                       elseif($category === b8::SPAM) {
+                               $internals['texts_spam']++;
+                               $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam']);
+                       }
+
+               }
+
+               elseif($action == b8::UNLEARN) {
+
+                       if($category === b8::HAM) {
+
+                               $internals['texts_ham']--;
+
+                               if($internals['texts_ham'] < 0)
+                                       $internals['texts_ham'] = 0;
+
+                               $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham']);
+
+                       }
+
+                       elseif($category === b8::SPAM) {
+
+                               $internals['texts_spam']--;
+
+                               if($internals['texts_spam'] < 0)
+                                       $internals['texts_spam'] = 0;
+
+                               $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam']);
+
+                       }
+
+               }
+
+               # We're done and can commit all changes to the database now
+               $this->_commit();
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/storage/storage_dba.php b/library/spam/b8/storage/storage_dba.php
new file mode 100644 (file)
index 0000000..04618b2
--- /dev/null
@@ -0,0 +1,198 @@
+<?php
+
+#   Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * The DBA (Berkeley DB) abstraction layer for communicating with the database.
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+class b8_storage_dba extends b8_storage_base
+{
+
+       public $config = array(
+               'database'    => 'wordlist.db',
+               'handler'     => 'db4',
+       );
+
+       public $b8_config = array(
+               'degenerator' => NULL,
+               'today'       => NULL
+       );
+
+       private $_db          = NULL;
+
+       const DATABASE_CONNECTION_FAIL = 'DATABASE_CONNECTION_FAIL';
+
+       /**
+        * Constructs the database layer.
+        *
+        * @access public
+        * @param string $config
+        */
+
+       function __construct($config, $degenerator, $today)
+       {
+
+               # Pass some variables of the main b8 config to this class
+               $this->b8_config['degenerator'] = $degenerator;
+               $this->b8_config['today']       = $today;
+
+               # Validate the config items
+               if(count($config) > 0) {
+                       foreach ($config as $name => $value) {
+                               $this->config[$name] = (string) $value;
+                       }
+               }
+
+       }
+
+       /**
+        * Closes the database connection.
+        *
+        * @access public
+        * @return void
+        */
+
+       function __destruct()
+       {
+               if($this->_db !== NULL) {
+                       dba_close($this->_db);
+                       $this->connected = FALSE;
+               }
+       }
+
+       /**
+        * Connect to the database and do some checks.
+        *
+        * @access public
+        * @return mixed Returns TRUE on a successful database connection, otherwise returns a constant from b8.
+        */
+
+       public function connect()
+       {
+
+               # Have we already connected?
+               if($this->_db !== NULL)
+                       return TRUE;
+
+               # Open the database connection
+               $this->_db = dba_open(dirname(__FILE__) . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . $this->config['database'], "w", $this->config['handler']);
+
+               if($this->_db === FALSE) {
+                       $this->connected = FALSE;
+                       $this->_db = NULL;
+                       return self::DATABASE_CONNECTION_FAIL;
+               }
+
+               # Everything is okay and connected
+
+               $this->connected = TRUE;
+
+               # Let's see if this is a b8 database and the version is okay
+               return $this->check_database();
+
+       }
+
+       /**
+        * Does the actual interaction with the database when fetching data.
+        *
+        * @access protected
+        * @param array $tokens
+        * @return mixed Returns an array of the returned data in the format array(token => data) or an empty array if there was no data.
+        */
+
+       protected function _get_query($tokens)
+       {
+
+               $data = array();
+
+               foreach ($tokens as $token) {
+
+                       $count = dba_fetch($token, $this->_db);
+
+                       if($count !== FALSE)
+                               $data[$token] = $count;
+
+               }
+
+               return $data;
+
+       }
+
+       /**
+        * Store a token to the database.
+        *
+        * @access protected
+        * @param string $token
+        * @param string $count
+        * @return bool TRUE on success or FALSE on failure
+        */
+
+       protected function _put($token, $count) {
+               return dba_insert($token, $count, $this->_db);
+       }
+
+       /**
+        * Update an existing token.
+        *
+        * @access protected
+        * @param string $token
+        * @param string $count
+        * @return bool TRUE on success or FALSE on failure
+        */
+
+       protected function _update($token, $count)
+       {
+               return dba_replace($token, $count, $this->_db);
+       }
+
+       /**
+        * Remove a token from the database.
+        *
+        * @access protected
+        * @param string $token
+        * @return bool TRUE on success or FALSE on failure
+        */
+
+       protected function _del($token)
+       {
+               return dba_delete($token, $this->_db);
+       }
+
+       /**
+        * Does nothing :-D
+        *
+        * @access protected
+        * @return void
+        */
+
+       protected function _commit()
+       {
+               # We just need this function because the (My)SQL backend(s) need it.
+               return;
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/storage/storage_frndc.php b/library/spam/b8/storage/storage_frndc.php
new file mode 100644 (file)
index 0000000..2b9374f
--- /dev/null
@@ -0,0 +1,344 @@
+<?php
+
+#   Copyright (C) 2006-2011 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * The MySQL abstraction layer for communicating with the database.
+ * Copyright (C) 2009 Oliver Lillie (aka buggedcom)
+ * Copyright (C) 2010-2011 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port and optimizations)
+ * @author Tobias Leupold
+ */
+
+class b8_storage_frndc extends b8_storage_base
+{
+
+       public $config = array(
+               'database'        => 'b8_wordlist',
+               'table_name'      => 'b8_wordlist',
+               'host'            => 'localhost',
+               'user'            => FALSE,
+               'pass'            => FALSE,
+               'connection'      => NULL
+       );
+
+       public $b8_config = array(
+               'degenerator'     => NULL,
+               'today'           => NULL
+       );
+
+       private $_connection                   = NULL;
+       private $_deletes                      = array();
+       private $_puts                         = array();
+       private $_updates                      = array();
+       private $uid                           = 0;
+
+       const DATABASE_CONNECTION_FAIL         = 'DATABASE_CONNECTION_FAIL';
+       const DATABASE_CONNECTION_ERROR        = 'DATABASE_CONNECTION_ERROR';
+       const DATABASE_CONNECTION_BAD_RESOURCE = 'DATABASE_CONNECTION_BAD_RESOURCE';
+       const DATABASE_SELECT_ERROR            = 'DATABASE_SELECT_ERROR';
+       const DATABASE_TABLE_ACCESS_FAIL       = 'DATABASE_TABLE_ACCESS_FAIL';
+       const DATABASE_WRONG_VERSION           = 'DATABASE_WRONG_VERSION';
+
+       /**
+        * Constructs the database layer.
+        *
+        * @access public
+        * @param string $config
+        */
+
+       function __construct($config, $degenerator, $today)
+       {
+
+               # Pass some variables of the main b8 config to this class
+               $this->b8_config['degenerator'] = $degenerator;
+               $this->b8_config['today']       = $today;
+
+               # Validate the config items
+
+               if(count($config) > 0) {
+
+                       foreach ($config as $name => $value) {
+
+                               switch($name) {
+
+                                       case 'table_name':
+                                       case 'host':
+                                       case 'user':
+                                       case 'pass':
+                                       case 'database':
+                                               $this->config[$name] = (string) $value;
+                                               break;
+
+                                       case 'connection':
+
+                                               if($value !== NULL) {
+
+                                                       if(is_resource($value) === TRUE) {
+                                                               $resource_type = get_resource_type($value);
+                                                               $this->config['connection'] = $resource_type !== 'mysql link' && $resource_type !== 'mysql link persistent' ? FALSE : $value;
+                                                       }
+
+                                                       else
+                                                               $this->config['connection'] = FALSE;
+
+                                               }
+
+                                               break;
+
+                               }
+
+                       }
+
+               }
+
+       }
+
+       /**
+        * Closes the database connection.
+        *
+        * @access public
+        * @return void
+        */
+
+       function __destruct()
+       {
+
+               if($this->_connection === NULL)
+                       return;
+
+               # Commit any changes before closing
+               $this->_commit();
+
+               # Just close the connection if no link-resource was passed and b8 created it's own connection
+               if($this->config['connection'] === NULL)
+                       mysql_close($this->_connection);
+
+               $this->connected = FALSE;
+
+       }
+
+       /**
+        * Connect to the database and do some checks.
+        *
+        * @access public
+        * @return mixed Returns TRUE on a successful database connection, otherwise returns a constant from b8.
+        */
+
+       public function connect()
+       {
+
+               return TRUE;
+
+               # Are we already connected?
+               if($this->connected === TRUE)
+                       return TRUE;
+
+               # Are we using an existing passed resource?
+               if($this->config['connection'] === FALSE) {
+                       # ... yes we are, but the connection is not a resource, so return an error
+                       $this->connected = FALSE;
+                       return self::DATABASE_CONNECTION_BAD_RESOURCE;
+               }
+
+               elseif($this->config['connection'] === NULL) {
+
+                       # ... no we aren't so we have to connect.
+
+                       if($this->_connection = mysql_connect($this->config['host'], $this->config['user'], $this->config['pass'])) {
+                               if(mysql_select_db($this->config['database'], $this->_connection) === FALSE) {
+                                       $this->connected = FALSE;
+                                       return self::DATABASE_SELECT_ERROR . ": " . mysql_error();
+                               }
+                       }
+                       else {
+                               $this->connected = FALSE;
+                               return self::DATABASE_CONNECTION_ERROR;
+                       }
+
+               }
+
+               else {
+                       # ... yes we are
+                       $this->_connection = $this->config['connection'];
+               }
+
+               # Just in case ...
+               if($this->_connection === NULL) {
+                       $this->connected = FALSE;
+                       return self::DATABASE_CONNECTION_FAIL;
+               }
+
+               # Check to see if the wordlist table exists
+               if(mysql_query('DESCRIBE ' . $this->config['table_name'], $this->_connection) === FALSE) {
+                       $this->connected = FALSE;
+                       return self::DATABASE_TABLE_ACCESS_FAIL . ": " . mysql_error();
+               }
+
+               # Everything is okay and connected
+               $this->connected = TRUE;
+
+               # Let's see if this is a b8 database and the version is okay
+               return $this->check_database();
+
+       }
+
+       /**
+        * Does the actual interaction with the database when fetching data.
+        *
+        * @access protected
+        * @param array $tokens
+        * @return mixed Returns an array of the returned data in the format array(token => data) or an empty array if there was no data.
+        */
+
+       protected function _get_query($tokens, $uid)
+       {
+
+               # Construct the query ...
+
+               if(count($tokens) > 0) {
+
+                       $where = array();
+
+                       foreach ($tokens as $token) {
+                               $token = dbesc($token);
+                               array_push($where, $token);
+                       }
+
+                       $where = 'token IN ("' . implode('", "', $where) . '")';
+               }
+
+               else {
+                       $token = dbesc($token);
+                       $where = 'token = "' . $token . '"';
+               }
+
+               # ... and fetch the data
+
+               $result = q('
+                       SELECT token, count
+                       FROM ' . $this->config['table_name'] . '
+                       WHERE ' . $where . ' AND uid = ' . $uid );
+
+               return $result;
+
+       }
+
+       /**
+        * Store a token to the database.
+        *
+        * @access protected
+        * @param string $token
+        * @param string $count
+        * @return void
+        */
+
+       protected function _put($token, $count, $uid) {
+               $token = dbesc($token);
+               $count = dbesc($count);
+               $uid = dbesc($uid);
+               array_push($this->_puts, '("' . $token . '", "' . $count . '", '"' . $uid .'")');
+       }
+
+       /**
+        * Update an existing token.
+        *
+        * @access protected
+        * @param string $token
+        * @param string $count
+        * @return void
+        */
+
+       protected function _update($token, $count, $uid)
+       {
+               $token = dbesc($token);
+               $count = dbesc($count);
+               $uid = dbesc($uid);
+               array_push($this->_puts, '("' . $token . '", "' . $count . '", '"' . $uid .'")');
+       }
+
+       /**
+        * Remove a token from the database.
+        *
+        * @access protected
+        * @param string $token
+        * @return void
+        */
+
+       protected function _del($token, $uid)
+       {
+               $token = dbesc($token);
+               $uid = dbesc($uid);
+               $this->uid = $uid;
+               array_push($this->_deletes, $token);
+       }
+
+       /**
+        * Commits any modification queries.
+        *
+        * @access protected
+        * @return void
+        */
+
+       protected function _commit($uid)
+       {
+
+               if(count($this->_deletes) > 0) {
+
+                       $result = q('
+                               DELETE FROM ' . $this->config['table_name'] . '
+                               WHERE token IN ("' . implode('", "', $this->_deletes) . '") AND uid = ' . $this->uid);
+
+                       $this->_deletes = array();
+
+               }
+
+               if(count($this->_puts) > 0) {
+
+                       $result = q('
+                               INSERT INTO ' . $this->config['table_name'] . '(token, count, uid)
+                               VALUES ' . implode(', ', $this->_puts));
+
+                       $this->_puts = array();
+
+               }
+
+               if(count($this->_updates) > 0) {
+
+                       // this still needs work
+                       $result = q("select * from " . $this->config['table_name'] . ' where token = ';
+
+                       
+                       $result = q('
+                               INSERT INTO ' . $this->config['table_name'] . '(token, count, uid)
+                               VALUES ' . implode(', ', $this->_updates) . ', ' . $uid . '
+                               ON DUPLICATE KEY UPDATE ' . $this->config['table_name'] . '.count = VALUES(count);', $this->_connection);
+
+                       $this->_updates = array();
+
+               }
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/b8/storage/storage_mysql.php b/library/spam/b8/storage/storage_mysql.php
new file mode 100644 (file)
index 0000000..0225363
--- /dev/null
@@ -0,0 +1,351 @@
+<?php
+
+#   Copyright (C) 2006-2011 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * The MySQL abstraction layer for communicating with the database.
+ * Copyright (C) 2009 Oliver Lillie (aka buggedcom)
+ * Copyright (C) 2010-2011 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port and optimizations)
+ * @author Tobias Leupold
+ */
+
+class b8_storage_mysql extends b8_storage_base
+{
+
+       public $config = array(
+               'database'        => 'b8_wordlist',
+               'table_name'      => 'b8_wordlist',
+               'host'            => 'localhost',
+               'user'            => FALSE,
+               'pass'            => FALSE,
+               'connection'      => NULL
+       );
+
+       public $b8_config = array(
+               'degenerator'     => NULL,
+               'today'           => NULL
+       );
+
+       private $_connection                   = NULL;
+       private $_deletes                      = array();
+       private $_puts                         = array();
+       private $_updates                      = array();
+
+       const DATABASE_CONNECTION_FAIL         = 'DATABASE_CONNECTION_FAIL';
+       const DATABASE_CONNECTION_ERROR        = 'DATABASE_CONNECTION_ERROR';
+       const DATABASE_CONNECTION_BAD_RESOURCE = 'DATABASE_CONNECTION_BAD_RESOURCE';
+       const DATABASE_SELECT_ERROR            = 'DATABASE_SELECT_ERROR';
+       const DATABASE_TABLE_ACCESS_FAIL       = 'DATABASE_TABLE_ACCESS_FAIL';
+       const DATABASE_WRONG_VERSION           = 'DATABASE_WRONG_VERSION';
+
+       /**
+        * Constructs the database layer.
+        *
+        * @access public
+        * @param string $config
+        */
+
+       function __construct($config, $degenerator, $today)
+       {
+
+               # Pass some variables of the main b8 config to this class
+               $this->b8_config['degenerator'] = $degenerator;
+               $this->b8_config['today']       = $today;
+
+               # Validate the config items
+
+               if(count($config) > 0) {
+
+                       foreach ($config as $name => $value) {
+
+                               switch($name) {
+
+                                       case 'table_name':
+                                       case 'host':
+                                       case 'user':
+                                       case 'pass':
+                                       case 'database':
+                                               $this->config[$name] = (string) $value;
+                                               break;
+
+                                       case 'connection':
+
+                                               if($value !== NULL) {
+
+                                                       if(is_resource($value) === TRUE) {
+                                                               $resource_type = get_resource_type($value);
+                                                               $this->config['connection'] = $resource_type !== 'mysql link' && $resource_type !== 'mysql link persistent' ? FALSE : $value;
+                                                       }
+
+                                                       else
+                                                               $this->config['connection'] = FALSE;
+
+                                               }
+
+                                               break;
+
+                               }
+
+                       }
+
+               }
+
+       }
+
+       /**
+        * Closes the database connection.
+        *
+        * @access public
+        * @return void
+        */
+
+       function __destruct()
+       {
+
+               if($this->_connection === NULL)
+                       return;
+
+               # Commit any changes before closing
+               $this->_commit();
+
+               # Just close the connection if no link-resource was passed and b8 created it's own connection
+               if($this->config['connection'] === NULL)
+                       mysql_close($this->_connection);
+
+               $this->connected = FALSE;
+
+       }
+
+       /**
+        * Connect to the database and do some checks.
+        *
+        * @access public
+        * @return mixed Returns TRUE on a successful database connection, otherwise returns a constant from b8.
+        */
+
+       public function connect()
+       {
+
+               # Are we already connected?
+               if($this->connected === TRUE)
+                       return TRUE;
+
+               # Are we using an existing passed resource?
+               if($this->config['connection'] === FALSE) {
+                       # ... yes we are, but the connection is not a resource, so return an error
+                       $this->connected = FALSE;
+                       return self::DATABASE_CONNECTION_BAD_RESOURCE;
+               }
+
+               elseif($this->config['connection'] === NULL) {
+
+                       # ... no we aren't so we have to connect.
+
+                       if($this->_connection = mysql_connect($this->config['host'], $this->config['user'], $this->config['pass'])) {
+                               if(mysql_select_db($this->config['database'], $this->_connection) === FALSE) {
+                                       $this->connected = FALSE;
+                                       return self::DATABASE_SELECT_ERROR . ": " . mysql_error();
+                               }
+                       }
+                       else {
+                               $this->connected = FALSE;
+                               return self::DATABASE_CONNECTION_ERROR;
+                       }
+
+               }
+
+               else {
+                       # ... yes we are
+                       $this->_connection = $this->config['connection'];
+               }
+
+               # Just in case ...
+               if($this->_connection === NULL) {
+                       $this->connected = FALSE;
+                       return self::DATABASE_CONNECTION_FAIL;
+               }
+
+               # Check to see if the wordlist table exists
+               if(mysql_query('DESCRIBE ' . $this->config['table_name'], $this->_connection) === FALSE) {
+                       $this->connected = FALSE;
+                       return self::DATABASE_TABLE_ACCESS_FAIL . ": " . mysql_error();
+               }
+
+               # Everything is okay and connected
+               $this->connected = TRUE;
+
+               # Let's see if this is a b8 database and the version is okay
+               return $this->check_database();
+
+       }
+
+       /**
+        * Does the actual interaction with the database when fetching data.
+        *
+        * @access protected
+        * @param array $tokens
+        * @return mixed Returns an array of the returned data in the format array(token => data) or an empty array if there was no data.
+        */
+
+       protected function _get_query($tokens)
+       {
+
+               # Construct the query ...
+
+               if(count($tokens) > 0) {
+
+                       $where = array();
+
+                       foreach ($tokens as $token) {
+                               $token = mysql_real_escape_string($token, $this->_connection);
+                               array_push($where, $token);
+                       }
+
+                       $where = 'token IN ("' . implode('", "', $where) . '")';
+               }
+
+               else {
+                       $token = mysql_real_escape_string($token, $this->_connection);
+                       $where = 'token = "' . $token . '"';
+               }
+
+               # ... and fetch the data
+
+               $result = mysql_query('
+                       SELECT token, count
+                       FROM ' . $this->config['table_name'] . '
+                       WHERE ' . $where . ';
+               ', $this->_connection);
+
+               $data = array();
+
+               while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
+                       $data[$row['token']] = $row['count'];
+
+               mysql_free_result($result);
+
+               return $data;
+
+       }
+
+       /**
+        * Store a token to the database.
+        *
+        * @access protected
+        * @param string $token
+        * @param string $count
+        * @return void
+        */
+
+       protected function _put($token, $count) {
+               $token = mysql_real_escape_string($token, $this->_connection);
+               $count = mysql_real_escape_string($count, $this->_connection);;
+               array_push($this->_puts, '("' . $token . '", "' . $count . '")');
+       }
+
+       /**
+        * Update an existing token.
+        *
+        * @access protected
+        * @param string $token
+        * @param string $count
+        * @return void
+        */
+
+       protected function _update($token, $count)
+       {
+               $token = mysql_real_escape_string($token, $this->_connection);
+               $count = mysql_real_escape_string($count, $this->_connection);
+               array_push($this->_updates, '("' . $token . '", "' . $count . '")');
+       }
+
+       /**
+        * Remove a token from the database.
+        *
+        * @access protected
+        * @param string $token
+        * @return void
+        */
+
+       protected function _del($token)
+       {
+               $token = mysql_real_escape_string($token, $this->_connection);
+               array_push($this->_deletes, $token);
+       }
+
+       /**
+        * Commits any modification queries.
+        *
+        * @access protected
+        * @return void
+        */
+
+       protected function _commit()
+       {
+
+               if(count($this->_deletes) > 0) {
+
+                       $result = mysql_query('
+                               DELETE FROM ' . $this->config['table_name'] . '
+                               WHERE token IN ("' . implode('", "', $this->_deletes) . '");
+                       ', $this->_connection);
+
+                       if(is_resource($result) === TRUE)
+                               mysql_free_result($result);
+
+                       $this->_deletes = array();
+
+               }
+
+               if(count($this->_puts) > 0) {
+
+                       $result = mysql_query('
+                               INSERT INTO ' . $this->config['table_name'] . '(token, count)
+                               VALUES ' . implode(', ', $this->_puts) . ';', $this->_connection);
+
+                       if(is_resource($result) === TRUE)
+                               mysql_free_result($result);
+
+                       $this->_puts = array();
+
+               }
+
+               if(count($this->_updates) > 0) {
+
+                       $result = mysql_query('
+                               INSERT INTO ' . $this->config['table_name'] . '(token, count)
+                               VALUES ' . implode(', ', $this->_updates) . '
+                               ON DUPLICATE KEY UPDATE ' . $this->config['table_name'] . '.count = VALUES(count);', $this->_connection);
+
+                       if(is_resource($result) === TRUE)
+                               mysql_free_result($result);
+
+                       $this->_updates = array();
+
+               }
+
+       }
+
+}
+
+?>
\ No newline at end of file
diff --git a/library/spam/doc/COPYING b/library/spam/doc/COPYING
new file mode 100644 (file)
index 0000000..8add30a
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/library/spam/doc/ChangeLog b/library/spam/doc/ChangeLog
new file mode 100644 (file)
index 0000000..78a4fc7
--- /dev/null
@@ -0,0 +1,179 @@
+2010-12-30 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.5.1
+
+       * Bigger changes:
+               - Fixed some issues with the scope of variables leading to problems when multiple instances of b8 are created. Thanks to Mike Creuzer for the bug report :-)
+               - Centralized the loading of class definition files in the b8 constructor and created a function to handle the inclusion.
+
+       * b8.php: Return a lexer error code instead of a rating if the lexer failed. The lexer never returned FALSE but b8 checked only for this value to validate the lexer didn't fail. Thanks to Matt Friedman for the bug report :-)
+
+       * lexer/lexer_default.php: A bit of code cleanup: less useless nesting.
+
+       * doc/readme.*: Updated the documentation, added a FAQ.
+
+2010-06-27 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.5-r1
+
+       * doc/readme.*: Updated the documentation; forgot the newly introduced b8::HAM and b8::SPAM variables. Added some additional information about the storage model.
+
+2010-06-02 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.5
+
+       * 100.000 Changes (new major release!), at a glance:
+               - No PHP 4 compatibility anymore. Much cleaner code base with less hacks.
+               - Completely reworked storage model. The SQL performance increased dramatically, the Berkeley DB performance remains as fast as it always has been.
+               - Better lexer which can also handle non-latin1 texts in a nice way, so that e. g. Cyrillic or Chinese texts can be classified more performant.
+               - No config files anymore, multiple instances of b8 can be now created in the same script with different configuration, databases and no problems.
+               - No spooky administration interface anymore that needs an SQL database, even if Berkeley DB is used (anybody who actually used this?! I never did ;-).
+               - No "install" scripts and routines and a less end-user compatible documentation. Anybody integrating b8 in his homepage won't be an end-user, will he?
+
+2009-02-03 Oliver Lillie (aka buggedcom)
+
+       * Revision: 221 (the original PHP 5 port)
+
+       * Rewrote Tobias' original class for optimisation and PHP 5 functionality.
+
+       * Improved database mysql query useage by over ~820%
+
+       * Class is faster, ~20%.
+
+       * Slight increase in memory usage, but it's small and given the advantages of the speed increase and query reduction it's worth it.
+
+       * Removed install code from mysql class and added a sql file. Anyone who wants to use this is generally going to be more advanced anyway and see the sql to install.
+
+2009-02-03 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.4.4 -- changed the license type from GPL to LGPL
+
+2008-06-27 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.4.3 -- no bugs found ... so let's make a release with only small changes ;-)
+
+       * b8.php: Removed debugging messages that were commented out anyway
+
+       * storage/storage_mysql.php: Made it possible to pass both a MySQL-link resource and a table name to b8. This makes b8 useable in the Redaxo CMS (and probably others)
+
+       * doc/readme.htm: Updated documentation accordingly
+
+2008-02-17 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.4.2
+
+       * interface/backup.php: the bayes*dbversion tag is now written to a database emptied by drop(), so that it will be useable without an error message even if no backup is recovered afterwards.
+
+       * doc/readme.htm: added a security note to the configuration section (htaccess should be used to avoid everybody to be able to see the configuration)
+
+2007-09-17 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.4.1
+
+       * storage/storage_mysql.php: fixed b8 crashing when getting passed a persistent MySQL resource link. Thanks to Paul Chapman for the bug report :-)
+
+2007-06-08 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.4
+
+       * Let's go the whole hog. b8's class is now "b8" and no more "bayes", and all internal variables have now according names.
+
+       * Reworked the whole (surprisingly crappy) implementation of b8. No more global() calls, everything happens inside the classes now. Made that whole stuff really object oriented (as good as possible with PHP's poor OOP model ;-).
+
+       * No more PHP code in the configuration files.
+
+       * Created an extra lexer class. This is now also configurable.
+
+       * Storage classes now can create their own databases when this is requested by the configuration.
+
+       * MySQL calls are no random shots anymore: either, a MySQL-link resource is passed to b8 on startup which will be used for the queries, or the class sets up it's own link. Same for SQLite.
+
+       * The interface now uses a separate storage backend capable of SQL. In this way, we _really_ can query the database for e. g. an ordered list of tokens. After doing what we wanted with this work database, the b8 database can be synced with it.
+
+       * Added a lot of verbose error handling.
+
+       * Fixed a dumb error: all tokens from a text were used for the spamminess calculation, because two for() loops both used $i as their counter. D'oh!!! Now, the filter's performance is way better.
+
+       * Catched on the way how that whole math stuff works a little more ;-) Now, the calculation of the single probabilities proposed by Mr. Robinson does a little more the stuff it was intended to do, because ...
+
+       * Made some calculation constants parameters: the number of tokens to use, the default rating for unknown tokens and Gary Robinson's s constant.
+
+       * Introduced an optional minimum deviation that a token's rating must have to be considered in the spamminess calculation.
+
+       * The default extreme ratings for tokens only in ham or spam are now optional. One can also choose to calculate all ratings by Mr. Robinson's method.
+
+       * Noticed that text primary keys are not case sensitive by default in MySQL, which has a noticeable impact on the filter's performance. Informed the MySQL users about that.
+
+       * The whole code sucks much less ;-) b8 should be way more user friendly now.
+
+       * Re-wrote the whole documentation.
+
+       * Fixed the ChangeLog :-)
+
+2007-02-08 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.3.3 again ;-)
+
+       * bayes-php is now b8. See http://www.nasauber.de/blog/text.php?text=58 for details :-) Thanks to Tobias Lang (http://langt.net/) for this cool new name!
+
+2007-01-05 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.3.3
+
+       * Renamed the internal BerkeleyDB handle from "$db" to the less general name "$bayes_php_db" due to an collision with phpwcms's (http://www.phpwcms.de/) global $db variable and potentially other php programs.
+
+       * Commented out Laurent Goussard's SQLite storage class by default, as it's try { } catch { } calls break PHP 4
+
+2006-09-03 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.3.2
+
+       * Laurent Goussard (loranger@free.fr) contributed an SQLite storage class(which needs PHP 5).
+
+       * I finally added my eMail address to the sources ;-)
+
+2006-07-24 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.3.1
+
+       * Fixed a problem in the unlearn() function: If a text was unlearned that wasn't learned before (accidentaly), it could happen that the count parameter for this text was smaller than 0, breaking the spamminess calulation
+
+2006-07-02 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.3
+
+       * Improved the get_tokens() function; the filter should now be a lot more performant, especially with short texts
+
+       * Added the "lastseen" parameter for each token to make the database maintainable (outdated tokens can be deleted)
+
+       * Added a real database maintainance interface
+
+2006-06-12 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.2.1
+
+       * Fixed a problem in get_tokens() (if it was called more than once, tokens were counted more often than they appeared in the text)
+
+       * Slightly enhanced the default index.php interface: after learning a text as Ham or Spam, the rating before and after it is displayed to inform the user about it
+
+2006-05-21 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.2
+
+       * Comments now in English (to pretend international success of bayes-php ;-)
+
+       * Recommendations of Paul Graham's article "Better Bayesian Filtering" ( http://www.paulgraham.com/better.html ) are now considered: Tokens that only appear in Ham or Spam and not in the other category are rated with 0.9998 or 0.0002 if they were less than 10 times in Ham or Spam and with 0.9999 or 0.0001 if they appeared more that 10 times. This should allow the filter to differentiate spam texts more sharp from ham texts. Also, token "degeneration" as described in the article is performed for unknown tokens to estimate their spamminess.
+
+       * The database connect is now swapped in a separate configuration file, so only this file has to be preserved if bayes-php is updated and only this file has to be changed to configure the script.
+
+2006-03-29 Tobias Leupold <tobias.leupold@web.de>
+
+       * Release: Version 0.1.1
+
+       * get_tokens() beachtet jetzt auch HTML-Tags und Wörter mit Akzenten und Apostrophen
+
+       * Verschiedene Kleinigkeiten "sauber" gemacht :-)
+
+2006-03-05 Tobias Leupold <tobias.leupold@web.de>
+
+       * Added 2007-06-08: Initial release (Version 0.1)
diff --git a/library/spam/doc/readme.htm b/library/spam/doc/readme.htm
new file mode 100644 (file)
index 0000000..727d5ae
--- /dev/null
@@ -0,0 +1,707 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" />
+<title>b8: readme</title>
+<meta name="author" content="Tobias Leupold" />
+<meta name="date" content="2010-12-23" />
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: left }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="b8-readme">
+<h1 class="title">b8: readme</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Tobias Leupold</td></tr>
+<tr class="field"><th class="docinfo-name">Homepage:</th><td class="field-body"><a class="reference external" href="http://nasauber.de/">http://nasauber.de/</a></td>
+</tr>
+<tr><th class="docinfo-name">Contact:</th>
+<td><a class="first last reference external" href="mailto:tobias.leupold&#64;web.de">tobias.leupold&#64;web.de</a></td></tr>
+<tr><th class="docinfo-name">Date:</th>
+<td>2010-12-23</td></tr>
+</tbody>
+</table>
+<div class="contents topic" id="table-of-contents">
+<p class="topic-title first">Table of Contents</p>
+<ul class="auto-toc simple">
+<li><a class="reference internal" href="#description-of-b8" id="id18">1&nbsp;&nbsp;&nbsp;Description of b8</a><ul class="auto-toc">
+<li><a class="reference internal" href="#what-is-b8" id="id19">1.1&nbsp;&nbsp;&nbsp;What is b8?</a></li>
+<li><a class="reference internal" href="#how-does-it-work" id="id20">1.2&nbsp;&nbsp;&nbsp;How does it work?</a></li>
+<li><a class="reference internal" href="#what-do-i-need-for-it" id="id21">1.3&nbsp;&nbsp;&nbsp;What do I need for it?</a></li>
+<li><a class="reference internal" href="#what-s-different" id="id22">1.4&nbsp;&nbsp;&nbsp;What's different?</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#update-from-prior-versions" id="id23">2&nbsp;&nbsp;&nbsp;Update from prior versions</a><ul class="auto-toc">
+<li><a class="reference internal" href="#update-from-bayes-php-version-0-2-1-or-earlier" id="id24">2.1&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.2.1 or earlier</a></li>
+<li><a class="reference internal" href="#update-from-bayes-php-version-0-3-or-later" id="id25">2.2&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.3 or later</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#installation" id="id26">3&nbsp;&nbsp;&nbsp;Installation</a></li>
+<li><a class="reference internal" href="#configuration" id="id27">4&nbsp;&nbsp;&nbsp;Configuration</a><ul class="auto-toc">
+<li><a class="reference internal" href="#b8-s-base-configuration" id="id28">4.1&nbsp;&nbsp;&nbsp;b8's base configuration</a></li>
+<li><a class="reference internal" href="#configuration-of-the-storage-backend" id="id29">4.2&nbsp;&nbsp;&nbsp;Configuration of the storage backend</a><ul class="auto-toc">
+<li><a class="reference internal" href="#settings-for-the-berkeley-db-dba-backend" id="id30">4.2.1&nbsp;&nbsp;&nbsp;Settings for the Berkeley DB (DBA) backend</a></li>
+<li><a class="reference internal" href="#settings-for-the-mysql-backend" id="id31">4.2.2&nbsp;&nbsp;&nbsp;Settings for the MySQL backend</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#using-b8" id="id32">5&nbsp;&nbsp;&nbsp;Using b8</a><ul class="auto-toc">
+<li><a class="reference internal" href="#setting-up-a-new-database" id="id33">5.1&nbsp;&nbsp;&nbsp;Setting up a new database</a><ul class="auto-toc">
+<li><a class="reference internal" href="#setting-up-a-new-berkeley-db" id="id34">5.1.1&nbsp;&nbsp;&nbsp;Setting up a new Berkeley DB</a></li>
+<li><a class="reference internal" href="#setting-up-a-new-mysql-table" id="id35">5.1.2&nbsp;&nbsp;&nbsp;Setting up a new MySQL table</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#using-b8-in-your-scripts" id="id36">5.2&nbsp;&nbsp;&nbsp;Using b8 in your scripts</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#tips-on-operation" id="id37">6&nbsp;&nbsp;&nbsp;Tips on operation</a></li>
+<li><a class="reference internal" href="#closing" id="id38">7&nbsp;&nbsp;&nbsp;Closing</a></li>
+<li><a class="reference internal" href="#references" id="id39">8&nbsp;&nbsp;&nbsp;References</a></li>
+<li><a class="reference internal" href="#appendix" id="id40">9&nbsp;&nbsp;&nbsp;Appendix</a><ul class="auto-toc">
+<li><a class="reference internal" href="#faq" id="id41">9.1&nbsp;&nbsp;&nbsp;FAQ</a><ul class="auto-toc">
+<li><a class="reference internal" href="#what-about-more-than-two-categories" id="id42">9.1.1&nbsp;&nbsp;&nbsp;What about more than two categories?</a></li>
+<li><a class="reference internal" href="#what-about-a-list-with-words-to-ignore" id="id43">9.1.2&nbsp;&nbsp;&nbsp;What about a list with words to ignore?</a></li>
+<li><a class="reference internal" href="#why-is-it-called-b8" id="id44">9.1.3&nbsp;&nbsp;&nbsp;Why is it called &quot;b8&quot;?</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#about-the-database" id="id45">9.2&nbsp;&nbsp;&nbsp;About the database</a><ul class="auto-toc">
+<li><a class="reference internal" href="#the-database-layout" id="id46">9.2.1&nbsp;&nbsp;&nbsp;The database layout</a></li>
+<li><a class="reference internal" href="#the-lastseen-parameter" id="id47">9.2.2&nbsp;&nbsp;&nbsp;The &quot;lastseen&quot; parameter</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="description-of-b8">
+<h1><a class="toc-backref" href="#id18">1&nbsp;&nbsp;&nbsp;Description of b8</a></h1>
+<div class="section" id="what-is-b8">
+<h2><a class="toc-backref" href="#id19">1.1&nbsp;&nbsp;&nbsp;What is b8?</a></h2>
+<p>b8 is a spam filter implemented in <a class="reference external" href="http://www.php.net/">PHP</a>. It is intended to keep your weblog or guestbook spam-free. The filter can be used anywhere in your PHP code and tells you whether a text is spam or not, using statistical text analysis. See <a class="reference internal" href="#how-does-it-work">How does it work?</a> for details about this. To be able to do this, b8 first has to learn some spam and some ham example texts to decide what's good and what's not. If it makes mistakes classifying unknown texts, they can be corrected and b8 learns from the corrections, getting better with each learned text.</p>
+<p>At the moment of this writing, b8 has classified 14411 guestbook entries and weblog comments on my homepage since december 2006. 131 were ham. 39 spam texts (0.27 %) have been rated as ham (false negatives), with not even one false positive (ham message classified as spam). This results in a sensitivity of 99.73 % (the probability that a spam text will actually be rated as spam) and a specifity of 100 % (the probability that a ham text will actually be rated as ham) for me. I hope, you'll get the same good results :-)</p>
+<p>Basically, b8 is a statistical (&quot;Bayesian&quot;<a class="footnote-reference" href="#id2" id="id1">[1]</a>) spam filter like <a class="reference external" href="http://bogofilter.sourceforge.net/">Bogofilter</a> or <a class="reference external" href="http://spambayes.sourceforge.net/">SpamBayes</a>, but it is not intended to classify e-mails. When I started to write b8, I didn't find a good PHP spam filter (or any spam filter that wasn't just some example code how one <em>could</em> implement a Bayesian spam filter in PHP) that was intended to filter weblog or guestbook entries. That's why I had to write my own ;-) <br />
+Caused by it's purpose, the way b8 works is slightly different from most of the Bayesian email spam filters out there. See <a class="reference internal" href="#what-s-different">What's different?</a> if you're interested in the details.</p>
+<table class="docutils footnote" frame="void" id="id2" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>A mathematician told me that the math in b8 actually does not use Bayes' theorem but some derived algorithms that are just related to it. So â€¦ let's simply believe that and stop claiming b8 was a <em>Bayesian</em> spam filter ;-)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="how-does-it-work">
+<h2><a class="toc-backref" href="#id20">1.2&nbsp;&nbsp;&nbsp;How does it work?</a></h2>
+<p>b8  basically uses the math and technique described in Paul Graham's article &quot;A Plan For Spam&quot; <a class="footnote-reference" href="#planforspam" id="id3">[2]</a> to distinguish ham and spam. The improvements proposed in Graham's article &quot;Better Bayesian Filtering&quot; <a class="footnote-reference" href="#betterbayesian" id="id4">[3]</a> and Gary Robinson's article &quot;Spam Detection&quot; <a class="footnote-reference" href="#spamdetection" id="id5">[4]</a> have also been considered. See also the article &quot;A Statistical Approach to the Spam Problem&quot; <a class="footnote-reference" href="#statisticalapproach" id="id6">[5]</a>.</p>
+<p>b8 cuts the text to classify to pieces, extracting stuff like e-mail addresses, links and HTML tags. For each such token, it calculates a single probability for a text containing it being spam, based on what the filter has learned so far. When the token was not seen before, b8 tries to find similar ones using the &quot;degeneration&quot; described in <a class="footnote-reference" href="#betterbayesian" id="id7">[3]</a> and uses the most relevant value found. If really nothing is found, b8 assumes a default rating for this token for the further calculations. <br />
+Then, b8 takes the most relevant values (which have a rating far from 0.5, which would mean we don't know what it is) and calculates the probability that the whole text is spam by the inverse chi-square function described in <a class="footnote-reference" href="#spamdetection" id="id8">[4]</a>.
+There are some parameters that can be set which influence the filter's behaviour (see below).</p>
+<p>In short words: you give b8 a text and it returns a value between 0 and 1, saying it's ham when it's near 0 and saying it's spam when it's near 1.</p>
+</div>
+<div class="section" id="what-do-i-need-for-it">
+<h2><a class="toc-backref" href="#id21">1.3&nbsp;&nbsp;&nbsp;What do I need for it?</a></h2>
+<p>Not much! You just need PHP 5 on the server where b8 will be used (b8 version 0.5 finally dropped PHP 4 compatibility â€“ thankfully ;-) and a proper storage possibility for the wordlists. I strongly recommend using <a class="reference external" href="http://www.oracle.com/database/berkeley-db/index.html">Berkeley DB</a>. See below how you can check if you can use it and why you should use it. If the server's PHP wasn't compiled with Berkeley DB support, a <a class="reference external" href="http://mysql.com/">MySQL</a> table can be used alternatively.</p>
+</div>
+<div class="section" id="what-s-different">
+<h2><a class="toc-backref" href="#id22">1.4&nbsp;&nbsp;&nbsp;What's different?</a></h2>
+<p>b8 is designed to classify weblog or guestbook entries, not e-mails. For this reason, it uses a slightly different technique than most of the other statistical spam filters out there use.</p>
+<p>My experience was that spam entries on my weblog or guestbook were often quite short, sometimes just something like &quot;123abc&quot; as text and a link to a suspect homepage. Some spam bots don't even made a difference between e. g. the &quot;name&quot; and &quot;text&quot; fields and posted their text as email address, for example. Considering this, b8 just takes one string to classify, making no difference between &quot;headers&quot; and &quot;text&quot;. <br />
+The other thing is that most statistical spam filters count one token one time, no matter how often it appears in the text (as Graham describes it in <a class="footnote-reference" href="#planforspam" id="id9">[2]</a>). b8 does count how often a token was seen and learns or considers this. Additionally, the number of learned ham and spam texts are saved and used as the calculation base for the single probabilities. Why this? Because a text containing one link (no matter where it points to, just indicated by a &quot;http://&quot; or a &quot;www.&quot;) might not be spam, but a text containing 20 links might be.</p>
+<p>This means that b8 might be good for classifying weblog or guestbook entries (I really think it is ;-) â€“ but very likely, it will work quite poor when being used for something else (like classifying e-mails). But as said above, for this task, there are a lot of very good filters out there to choose from.</p>
+</div>
+</div>
+<div class="section" id="update-from-prior-versions">
+<h1><a class="toc-backref" href="#id23">2&nbsp;&nbsp;&nbsp;Update from prior versions</a></h1>
+<p>If this is a new b8 installation, read on at the <a class="reference internal" href="#installation">Installation</a> section!</p>
+<div class="section" id="update-from-bayes-php-version-0-2-1-or-earlier">
+<h2><a class="toc-backref" href="#id24">2.1&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.2.1 or earlier</a></h2>
+<p>Please first follow the database update instructions of the bayes-php-0.3 release if you update from a version prior to bayes-php-0.3 and then read the following paragraph about updating from a version &lt;0.3.3.</p>
+</div>
+<div class="section" id="update-from-bayes-php-version-0-3-or-later">
+<h2><a class="toc-backref" href="#id25">2.2&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.3 or later</a></h2>
+<dl class="docutils">
+<dt><strong>You use Berkeley DB?</strong></dt>
+<dd>Everything's fine, you can simply continue using your database.</dd>
+<dt><strong>You use MySQL?</strong></dt>
+<dd>The <tt class="docutils literal">CREATE</tt> statement of b8's wordlist has changed. The best is probably to create a dump via your favorite administration tool or script, create the new table and re-insert all data. The layout is still the same: there's one &quot;token&quot; column and one &quot;data&quot; column. Having done that, you can keep using your data.</dd>
+<dt><strong>You use SQLite?</strong></dt>
+<dd>Sorry, at the moment, there's no SQLite backend for b8. But we're working on it :-)</dd>
+</dl>
+<p>The configuration model of b8 has changed.  Please read through the <a class="reference internal" href="#configuration">Configuration</a> section and update your configuration accordingly.</p>
+<p>b8's lexer has been partially re-written. It should now be able to handle all kind of non-latin-1 input, like cyrillic, chinese or japanese texts. Caused by this fact, much more tokens will be recognized when classifying such texts. Therefore, you could get different results in b8's ratings, even if the same database is used and although the math is still the same.</p>
+<p>b8 0.5 introduced two constants that can be used in the <tt class="docutils literal">learn()</tt> and <tt class="docutils literal">unlearn()</tt> functions: <tt class="docutils literal"><span class="pre">b8::HAM</span></tt> and <tt class="docutils literal"><span class="pre">b8::SPAM</span></tt>. The literal values &quot;ham&quot; and &quot;spam&quot; can still be used anyway.</p>
+</div>
+</div>
+<div class="section" id="installation">
+<h1><a class="toc-backref" href="#id26">3&nbsp;&nbsp;&nbsp;Installation</a></h1>
+<p>Installing b8 on your server is quite easy. You just have to provide the needed files. To do this, you could just upload the whole <tt class="docutils literal">b8</tt> subdirectory to the base directory of your homepage. It contains the filter itself and all needed backend classes. The other directories (<tt class="docutils literal">doc</tt>, <tt class="docutils literal">example</tt> and <tt class="docutils literal">install</tt>) are not used by b8.</p>
+<p>That's it ;-)</p>
+</div>
+<div class="section" id="configuration">
+<h1><a class="toc-backref" href="#id27">4&nbsp;&nbsp;&nbsp;Configuration</a></h1>
+<p>The configuration is passed as arrays when instantiating a new b8 object. Two arrays can be passed to b8, one containing b8's base configuration and some settings for the lexer (which should be common for all lexer classes, in case some other lexer than the default one will be written one day) and one for the storage backend. <br />
+You can have a look at <tt class="docutils literal">example/index.php</tt> to see how this can be done. <a class="reference internal" href="#using-b8-in-your-scripts">Using b8 in your scripts</a> also shows example code showing how b8 can be included in a PHP script.</p>
+<p>Not all values have to be set. When some values are missing, the default ones will be used. If you do use the default settings, you don't have to pass them to b8.</p>
+<div class="section" id="b8-s-base-configuration">
+<h2><a class="toc-backref" href="#id28">4.1&nbsp;&nbsp;&nbsp;b8's base configuration</a></h2>
+<p>All these values can be set in the &quot;config_b8&quot; array (the first parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the first argument.</p>
+<p>These are some basic settings telling b8 which backend classes to use:</p>
+<blockquote>
+<dl class="docutils">
+<dt><strong>storage</strong></dt>
+<dd><p class="first">This defines which storage backend will be used to save b8's wordlist. Currently, two backends are available: <a class="reference external" href="http://www.oracle.com/database/berkeley-db/index.html">Berkeley DB</a> (<tt class="docutils literal">dba</tt>) and <a class="reference external" href="http://mysql.com/">MySQL</a> (<tt class="docutils literal">mysql</tt>). At the moment, b8 does not support <a class="reference external" href="http://sqlite.org/">SQLite</a> (as the previous version did), but it will be (hopefully) re-added in one of the next releases. The default is <tt class="docutils literal">dba</tt> (string).</p>
+<dl class="docutils">
+<dt><em>Berkeley DB</em></dt>
+<dd>This is the preferred storage backend. It was the original backend for the filter and remains the most performant. b8's storage model is optimized for this database, as it is really fast and fits perfectly to what the filter needs to do the job. All content is saved in a single file, you don't need special user rights or a database server. <br />
+If you don't know whether your server's PHP can use a Berkeley DB, simply run the script <tt class="docutils literal">install/setup_berkeleydb.php</tt>. If it shows a Berkeley DB handler, please use this backend.</dd>
+<dt><em>MySQL</em></dt>
+<dd>As some webspace hosters don't allow using a Berkeley DB (but please be sure to check if you can use it!), but most do provide a MySQL server, using a MySQL table for the wordlist is provided as an alternative storage method. As said above, b8 was always intended to use a Berkeley DB. It doesn't use or need SQL to query the database. So, very likely, this will work less performant, produce a lot of unnecessary overhead and waste computing power. But it will do fine anyway!</dd>
+</dl>
+<p class="last">See <a class="reference internal" href="#configuration-of-the-storage-backend">Configuration of the storage backend</a> for the settings of the chosen backend.</p>
+</dd>
+<dt><strong>degenerator</strong></dt>
+<dd>The degenerator class to be used. See <a class="reference internal" href="#how-does-it-work">How does it work?</a> and <a class="footnote-reference" href="#betterbayesian" id="id12">[3]</a> if you're interested in what &quot;degeneration&quot; is. Defaults to <tt class="docutils literal">default</tt> (string). At the moment, only one degenerator exists, so you probably don't want to change this unless you have written your own degenerator.</dd>
+<dt><strong>lexer</strong></dt>
+<dd><p class="first">The lexer class to be used. Defaults to <tt class="docutils literal">default</tt> (string). At the moment, only one lexer exists, so you probably don't want to change this unless you have written your own lexer.</p>
+<p>The behaviour of the lexer can be additionally configured with the following variables:</p>
+<blockquote class="last">
+<dl class="docutils">
+<dt><strong>min_size</strong></dt>
+<dd>The minimal length for a token to be considered when calculating the rating of a text. Defaults to <tt class="docutils literal">3</tt> (integer).</dd>
+<dt><strong>max_size</strong></dt>
+<dd>The maximal length for a token to be considered when calculating the rating of a text. Defaults to <tt class="docutils literal">30</tt> (integer).</dd>
+<dt><strong>allow_numbers</strong></dt>
+<dd>Should pure numbers also be considered? Defaults to <tt class="docutils literal">FALSE</tt> (boolean).</dd>
+</dl>
+</blockquote>
+</dd>
+</dl>
+</blockquote>
+<p>The following settings influence the mathematical internals of b8. If you want to experiment, feel free to play around with them; but be warned: wrong settings of these values will result in poor performance or could even &quot;short-circuit&quot; the filter. <br />
+Leave these values as they are unless you know what you are doing!</p>
+<p>The &quot;Statistical discussion about b8&quot; <a class="footnote-reference" href="#b8statistic" id="id13">[6]</a> shows why the default values are the default ones.</p>
+<blockquote>
+<dl class="docutils">
+<dt><strong>use_relevant</strong></dt>
+<dd>This tells b8 how many tokens should be used when calculating the spamminess of a text. The default setting is <tt class="docutils literal">15</tt> (integer). This seems to be a quite reasonable value. When using to many tokens, the filter will fail on texts filled with useless stuff or with passages from a newspaper, etc. not being very spammish. <br />
+The tokens counted multiple times (see above) are added in addition to this value. They don't replace other ratings.</dd>
+<dt><strong>min_dev</strong></dt>
+<dd>This defines a minimum deviation from 0.5 that a token's rating must have to be considered when calculating the spamminess. Tokens with a rating closer to 0.5 than this value will simply be skipped. <br />
+If you don't want to use this feature, set this to <tt class="docutils literal">0</tt>. Defaults to <tt class="docutils literal">0.2</tt> (float). Read <a class="footnote-reference" href="#b8statistic" id="id14">[6]</a> before increasing this.</dd>
+<dt><strong>rob_x</strong></dt>
+<dd>This is Gary Robinson's <em>x</em> constant (cf. <a class="footnote-reference" href="#spamdetection" id="id15">[4]</a>). A completely unknown token will be rated with the value of <tt class="docutils literal">rob_x</tt>. The default <tt class="docutils literal">0.5</tt> (float) seems to be quite reasonable, as we can't say if a token that also can't be rated by degeneration is good or bad. <br />
+If you receive much more spam than ham or vice versa, you could change this setting accordingly.</dd>
+<dt><strong>rob_s</strong></dt>
+<dd>This is Gary Robinson's <em>s</em> constant. This is essentially the probability that the <em>rob_x</em> value is correct for a completely unknown token. It will also shift the probability of rarely seen tokens towards this value. The default is <tt class="docutils literal">0.3</tt> (float) <br />
+See <a class="footnote-reference" href="#spamdetection" id="id16">[4]</a> for a closer description of the <em>s</em> constant and read <a class="footnote-reference" href="#b8statistic" id="id17">[6]</a> for specific information about this constant in b8's algorithms.</dd>
+</dl>
+</blockquote>
+</div>
+<div class="section" id="configuration-of-the-storage-backend">
+<h2><a class="toc-backref" href="#id29">4.2&nbsp;&nbsp;&nbsp;Configuration of the storage backend</a></h2>
+<p>All the following values can be set in the &quot;config_database&quot; array (the second parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the second argument.</p>
+<div class="section" id="settings-for-the-berkeley-db-dba-backend">
+<h3><a class="toc-backref" href="#id30">4.2.1&nbsp;&nbsp;&nbsp;Settings for the Berkeley DB (DBA) backend</a></h3>
+<dl class="docutils">
+<dt><strong>database</strong></dt>
+<dd>The filename of the database file, relative to the location of <tt class="docutils literal">b8.php</tt>. Defaults to <tt class="docutils literal">wordlist.db</tt> (string).</dd>
+<dt><strong>handler</strong></dt>
+<dd>The DBA handler to use (cf. <a class="reference external" href="http://php.net/manual/en/dba.requirements.php">the PHP documentation</a> and <a class="reference internal" href="#setting-up-a-new-berkeley-db">Setting up a new Berkeley DB</a>). Defaults to <tt class="docutils literal">db4</tt> (string).</dd>
+</dl>
+</div>
+<div class="section" id="settings-for-the-mysql-backend">
+<h3><a class="toc-backref" href="#id31">4.2.2&nbsp;&nbsp;&nbsp;Settings for the MySQL backend</a></h3>
+<dl class="docutils">
+<dt><strong>database</strong></dt>
+<dd>The database containing b8's wordlist table. Defaults to <tt class="docutils literal">b8_wordlist</tt> (string).</dd>
+<dt><strong>table_name</strong></dt>
+<dd>The table containing b8's wordlist. Defaults to <tt class="docutils literal">b8_wordlist</tt> (string).</dd>
+<dt><strong>host</strong></dt>
+<dd>The host of the MySQL server. Defaults to <tt class="docutils literal">localhost</tt> (string).</dd>
+<dt><strong>user</strong></dt>
+<dd>The user name used to open the database connection. Defaults to <tt class="docutils literal">FALSE</tt> (boolean).</dd>
+<dt><strong>pass</strong></dt>
+<dd>The password required to open the database connection. Defaults to <tt class="docutils literal">FALSE</tt> (boolean).</dd>
+<dt><strong>connection</strong></dt>
+<dd>An existing MySQL link-resource that can be used by b8. Defaults to <tt class="docutils literal">NULL</tt> (NULL).</dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" id="using-b8">
+<h1><a class="toc-backref" href="#id32">5&nbsp;&nbsp;&nbsp;Using b8</a></h1>
+<p>Now, that everything is configured, you can start to use b8. A sample script that shows what can be done with the filter exists in <tt class="docutils literal">example/index.php</tt>. The best thing for testing how all this works is to use this script before using b8 in your own scripts.</p>
+<p>Before you can start, you have to setup a database so that b8 can store a wordlist.</p>
+<div class="section" id="setting-up-a-new-database">
+<h2><a class="toc-backref" href="#id33">5.1&nbsp;&nbsp;&nbsp;Setting up a new database</a></h2>
+<div class="section" id="setting-up-a-new-berkeley-db">
+<h3><a class="toc-backref" href="#id34">5.1.1&nbsp;&nbsp;&nbsp;Setting up a new Berkeley DB</a></h3>
+<p>I wrote a script to setup a new Berkeley DB for b8. It is located in <tt class="docutils literal">install/setup_berkeleydb.php</tt>. Just run this script on your server and be sure that the directory containing it has the proper access rights set so that the server's HTTP server user or PHP user can create a new file in it (probably <tt class="docutils literal">0777</tt>). The script is quite self-explaining, just run it.</p>
+<p>Of course, you can also create a Berkeley DB by hand. In this case, you just have to insert three keys:</p>
+<pre class="literal-block">
+bayes*dbversion  =&gt; 2
+bayes*texts.ham  =&gt; 0
+bayes*texts.spam =&gt; 0
+</pre>
+<p>Be sure to set the right DBA handler in the storage backend configuration if it's not <tt class="docutils literal">db4</tt>.</p>
+</div>
+<div class="section" id="setting-up-a-new-mysql-table">
+<h3><a class="toc-backref" href="#id35">5.1.2&nbsp;&nbsp;&nbsp;Setting up a new MySQL table</a></h3>
+<p>The SQL file <tt class="docutils literal">install/setup_mysql.sql</tt> contains both the create statement for the wordlist table of b8 and the <tt class="docutils literal">INSERT</tt> statements for adding the necessary internal variables.</p>
+<p>Simply change the table name according to your needs (or leave it as it is ;-) and run the SQL to setup a b8 wordlist MySQL table.</p>
+</div>
+</div>
+<div class="section" id="using-b8-in-your-scripts">
+<h2><a class="toc-backref" href="#id36">5.2&nbsp;&nbsp;&nbsp;Using b8 in your scripts</a></h2>
+<p>Just have a look at the example script located in <tt class="docutils literal">example/index.php</tt> to see how you can include b8 in your scripts. Essentially, this strips down to:</p>
+<pre class="literal-block">
+# Include the b8 code
+require &quot;{$_SERVER['DOCUMENT_ROOT']}/b8/b8.php&quot;;
+
+# Do some configuration
+
+$config_b8 = array(
+        'some_key' =&gt; 'some_value',
+        'foo' =&gt; 'bar'
+);
+
+$config_database = array(
+        'some_key' =&gt; 'some_value',
+        'foo' =&gt; 'bar'
+);
+
+# Create a new b8 instance
+$b8 = new b8($config_b8, $config_database);
+</pre>
+<p>b8 provides three functions in an object oriented way (called e. g. via <tt class="docutils literal"><span class="pre">$b8-&gt;classify($text)</span></tt>):</p>
+<dl class="docutils">
+<dt><strong>learn($text, $category)</strong></dt>
+<dd>This saves the reference text <tt class="docutils literal">$text</tt> (string) in the category <tt class="docutils literal">$category</tt> (b8 constant). <br />
+b8 0.5 introduced two constants that can be used as <tt class="docutils literal">$category</tt>: <tt class="docutils literal"><span class="pre">b8::HAM</span></tt> and <tt class="docutils literal"><span class="pre">b8::SPAM</span></tt>. To be downward compatible with older versions of b8, the literal values &quot;ham&quot; and &quot;spam&quot; (case-sensitive strings) can still be used here.</dd>
+<dt><strong>unlearn($text, $category)</strong></dt>
+<dd>This function just exists to delete a text from a category in which is has been stored accidentally before. It deletes the reference text <tt class="docutils literal">$text</tt> (string) from the category <tt class="docutils literal">$category</tt> (either the constants <tt class="docutils literal"><span class="pre">b8::HAM</span></tt> or <tt class="docutils literal"><span class="pre">b8::SPAM</span></tt> or the literal case-sensitive strings &quot;ham&quot; or &quot;spam&quot; â€“ cf. above). <br />
+<strong>Don't delete a spam text from ham after saving it in spam or vice versa, as long you don't have stored it accidentally in the wrong category before!</strong> This will not improve performance, quite the opposite: it will actually break the filter after a time, as the counter for saved ham or spam texts will reach 0, although you have ham or spam tokens stored: the filter will try to remove texts from the ham or spam data which have never been stored there, decrease the counter for tokens which are found just skip the non-existing words.</dd>
+<dt><strong>classify($text)</strong></dt>
+<dd>This function takes the text <tt class="docutils literal">$text</tt> (string), calculates it's probability for being spam it and returns a value between 0 and 1 (float). <br />
+A value close to 0 says the text is more likely ham and a value close to 1 says the text is more likely spam. What to do with this value is <em>your</em> business ;-) See also <a class="reference internal" href="#tips-on-operation">Tips on operation</a> below.</dd>
+</dl>
+</div>
+</div>
+<div class="section" id="tips-on-operation">
+<h1><a class="toc-backref" href="#id37">6&nbsp;&nbsp;&nbsp;Tips on operation</a></h1>
+<p>Before b8 can decide whether a text is spam or ham, you have to tell it what you consider as spam or ham. At least one learned spam or one learned ham text is needed to calculate anything. To get good ratings, you need both learned ham and learned spam texts, the more the better. <br />
+What's considered as &quot;ham&quot; or &quot;spam&quot; can be very different, depending on the operation site. On my homepage, practically each and every text posted in English or using cyrillic letters is spam. On an English or Russian homepage, this will be not the case. So I think it's not really meaningful to provide some &quot;spam data&quot; to start. Just train b8 with &quot;your&quot; spam and ham.</p>
+<p>For the practical use, I advise to give the filter all data availible. E. g. name, email address, homepage, IP address und of course the text itself should be stored in a variable (e. g. separated with an <tt class="docutils literal">\n</tt> or just a space or tab after each block) and then be classified. The learning should also be done with all data availible. <br />
+Saving the IP address is probably only meaningful for spam entries, because spammers often use the same IP address multiple times. In principle, you can leave out the IP of ham entries.</p>
+<p>You can use b8 e. g. in a guestbook script and let it classify the text before saving it. Everyone has to decide which rating is necessary to classify a text as &quot;spam&quot;, but a rating of &gt;= 0.8 seems to be reasonable for me. If one expects the spam to be in another language that the ham entries or the spams are very short normally, one could also think about a limit of 0.7. <br />
+The email filters out there mostly use &gt; 0.9 or even &gt; 0.99; but keep in mind that they have way more data to analyze in most of the cases. A guestbook entry may be quite short, especially when it's spam.</p>
+<p>In my opinion, a autolearn function is very handy. I save spam messages with a rating higher than 0.7 but less than 0.9 automatically as spam. I don't do this with ham messages in an automated way to prevent the filter from saving a false negative as ham and then classifying and learning all the spam as ham when I'm on holidays ;-)</p>
+</div>
+<div class="section" id="closing">
+<h1><a class="toc-backref" href="#id38">7&nbsp;&nbsp;&nbsp;Closing</a></h1>
+<p>So â€¦ that's it. Thanks for using b8! If you find a bug or have an idea how to make b8 better, let me know. I'm also always looking forward to get e-mails from people using b8 on their homepages :-)</p>
+</div>
+<div class="section" id="references">
+<h1><a class="toc-backref" href="#id39">8&nbsp;&nbsp;&nbsp;References</a></h1>
+<table class="docutils footnote" frame="void" id="planforspam" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[2]</td><td><em>(<a class="fn-backref" href="#id3">1</a>, <a class="fn-backref" href="#id9">2</a>)</em> Paul Graham, <em>A Plan For Spam</em> (<a class="reference external" href="http://paulgraham.com/spam.html">http://paulgraham.com/spam.html</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="betterbayesian" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[3]</td><td><em>(<a class="fn-backref" href="#id4">1</a>, <a class="fn-backref" href="#id7">2</a>, <a class="fn-backref" href="#id12">3</a>)</em> Paul Graham, <em>Better Bayesian Filtering</em> (<a class="reference external" href="http://paulgraham.com/better.html">http://paulgraham.com/better.html</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="spamdetection" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[4]</td><td><em>(<a class="fn-backref" href="#id5">1</a>, <a class="fn-backref" href="#id8">2</a>, <a class="fn-backref" href="#id15">3</a>, <a class="fn-backref" href="#id16">4</a>)</em> Gary Robinson, <em>Spam Detection</em> (<a class="reference external" href="http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html">http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="statisticalapproach" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id6">[5]</a></td><td><em>A Statistical Approach to the Spam Problem</em> (<a class="reference external" href="http://linuxjournal.com/article/6467">http://linuxjournal.com/article/6467</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="b8statistic" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[6]</td><td><em>(<a class="fn-backref" href="#id13">1</a>, <a class="fn-backref" href="#id14">2</a>, <a class="fn-backref" href="#id17">3</a>)</em> Tobias Leupold, <em>Statistical discussion about b8</em> (<a class="reference external" href="http://nasauber.de/opensource/b8/discussion/">http://nasauber.de/opensource/b8/discussion/</a>)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="appendix">
+<h1><a class="toc-backref" href="#id40">9&nbsp;&nbsp;&nbsp;Appendix</a></h1>
+<div class="section" id="faq">
+<h2><a class="toc-backref" href="#id41">9.1&nbsp;&nbsp;&nbsp;FAQ</a></h2>
+<div class="section" id="what-about-more-than-two-categories">
+<h3><a class="toc-backref" href="#id42">9.1.1&nbsp;&nbsp;&nbsp;What about more than two categories?</a></h3>
+<p>I wrote b8 with the <a class="reference external" href="http://en.wikipedia.org/wiki/KISS_principle">KISS principle</a> in mind. For the &quot;end-user&quot;, we have a class with almost no setup to do that can do three things: classify a text, learn a text and un-learn a text. Normally, there's no need to un-learn a text, so essentially, there are only two functions we need. <br />
+This simplicity is only possible because b8 only knows two categories (normally &quot;Ham&quot; and &quot;Spam&quot; or some other category pair) and tells you, in one float number between 0 and 1, if a given texts rather fits in the first or the second category. If we would support multiple categories, more work would have to be done and things would become more complicated. One would have to setup the categories, have another database layout (perhaps making it mandatory to have SQL) and one float number would not be sufficient to describe b8's output, so more code would be needed â€“ even outside of b8.</p>
+<p>All the code, the database layout and particularly the math is intended to do exactly one thing: distinguish between two categories. I think it would be a lot of work to change b8 so that it would support more than two categories. Probably, this is possible to do, but don't ask me in which way we would have to change the math to get multiple-category support â€“ I'm a dentist, not a mathematician ;-) <br />
+Apart from this I do believe that most people using b8 don't want or need multiple categories. They just want to know if a text is spam or not, don't they? I do, at least ;-)</p>
+<p>But let's think about the multiple-category thing. How would we calculate a rating for more than two categories? If we had a third one, let's call it &quot;<a class="reference external" href="http://en.wikipedia.org/wiki/Treet">Treet</a>&quot;, how would we calculate a rating? We could calculate three different ratings. One for &quot;Ham&quot;, one for &quot;Spam&quot; and one for &quot;Treet&quot; and choose the highest one to tell the user what category fits best for the text. This could be done by using a small wrapper script using three instances of b8 as-is and three different databases, each containing texts being &quot;Ham&quot;, &quot;Spam&quot;, &quot;Treet&quot; and the respective counterparts. <br />
+But here's the problem: if we have &quot;Ham&quot; and &quot;Spam&quot;, &quot;Spam&quot; is the counterpart of &quot;Ham&quot;. But what's the counterpart of &quot;Spam&quot; if we have more than one additional category? Where do the &quot;Non-Ham&quot;, &quot;Non-Spam&quot; and &quot;Non-Treet&quot; texts come from?</p>
+<p>Another approach, a direct calculation of more than two probabilities (the &quot;Ham&quot; probability is simply 1 minus the &quot;Spam&quot; probability, so we actually get two probabilities with the return value of b8) out of one database would require big changes in b8's structure and math.</p>
+<p>There's a project called <a class="reference external" href="http://xhtml.net/scripts/PHPNaiveBayesianFilter">PHPNaiveBayesianFilter</a> which supports multiple categories by default. The author calls his software &quot;Version 1.0&quot;, but I think this is the very first release, not a stable or mature one. The most recent change of that release dates back to 2003 according to the &quot;changed&quot; date of the files inside the zip archive, so probably, this project is dead or has never been alive and under active development at all. <br />
+Actually, I played around with that code but the results weren't really good, so I decided to write my own spam filter from scratch back in early 2006 ;-)</p>
+<p>All in all, there seems to be no easy way to implement multiple (meaning more than two) categories using b8's current code base and probably, b8 will never support more than two categories. Perhaps, a fork or a complete re-write would  be better than implementing such a feature. Anyway, I don't close my mind to multiple categories in b8. Feel free to tell me how multiple categories could be implementented in b8 or how a multiple-category version using the same code base (sharing a common abstract class?) could be written.</p>
+</div>
+<div class="section" id="what-about-a-list-with-words-to-ignore">
+<h3><a class="toc-backref" href="#id43">9.1.2&nbsp;&nbsp;&nbsp;What about a list with words to ignore?</a></h3>
+<p>Some people suggested to introduce a list with words that b8 will simply ignore. Like &quot;and&quot;, &quot;or&quot;, &quot;the&quot;, and so on. I don't think this is very meaningful.</p>
+<p>First, it would just work for the particular language that has been stored in the list. Speaking of my homepage, most of my spam is English, almost all my ham is German. So I would have to maintain a list with the probably less interesting words for at least two languages. Additionally, I get spam in Chinese, Japanese and Cyrillic writing or something else I can't read as well. What word should be ignored in those texts?  <br />
+Second, why should we ever exclude words? Who tells us those words are <em>actually</em> meaningless? If a word appears both in ham and spam, it's rating will be near 0.5 and so, it won't be used for the final calculation if a appropriate minimum deviation was set. So b8 will exclude it anyway without any blacklist. And think of this: if we excluded a word of which we only <em>think</em> it doesn't mean anything but it actually does appear more often in ham or spam, the results will get even worse.</p>
+<p>So why should we care about things we do not have to care about? ;-)</p>
+</div>
+<div class="section" id="why-is-it-called-b8">
+<h3><a class="toc-backref" href="#id44">9.1.3&nbsp;&nbsp;&nbsp;Why is it called &quot;b8&quot;?</a></h3>
+<p>The initial name for the filter was (damn creative!) &quot;bayes-php&quot;. There were two main reasons for searching another name: 1. &quot;bayes-php&quot; sucks. 2. the <a class="reference external" href="http://php.net/license/3_01.txt">PHP License</a> says the PHP guys do not like when the name of a script written in PHP contains the word &quot;PHP&quot;. Read the <a class="reference external" href="http://www.php.net/license/index.php#faq-lic">License FAQ</a> for a reasonable argumentation about this.</p>
+<p>Luckily, <a class="reference external" href="http://langt.net/">Tobias Lang</a> proposed the new name &quot;b8&quot;. And these are the reasons why I chose this name:</p>
+<ul class="simple">
+<li>&quot;bayes-php&quot; is a &quot;b&quot; followed by 8 letters.</li>
+<li>&quot;b8&quot; is short and handy. Additionally, there was no program with the name &quot;b8&quot; or &quot;bate&quot;</li>
+<li>The English verb &quot;to bate&quot; means &quot;to decrease&quot; â€“ and that's what b8 does: it decreases the number of spam entries in your weblog or guestbook!</li>
+<li>&quot;b8&quot; just sounds way cooler than &quot;bayes-php&quot; ;-)</li>
+</ul>
+</div>
+</div>
+<div class="section" id="about-the-database">
+<h2><a class="toc-backref" href="#id45">9.2&nbsp;&nbsp;&nbsp;About the database</a></h2>
+<div class="section" id="the-database-layout">
+<h3><a class="toc-backref" href="#id46">9.2.1&nbsp;&nbsp;&nbsp;The database layout</a></h3>
+<p>The database layout is quite simple. It's just key:value for everything stored. There are three &quot;internal&quot; variables stored as normal tokens (but all containing a <tt class="docutils literal">*</tt> which is always used as a split character by the lexer, so we can't get collisions):</p>
+<dl class="docutils">
+<dt><strong>bayes*dbversion</strong></dt>
+<dd>This indicates the database's &quot;version&quot;. The first versions of b8 did not set this. Version &quot;2&quot; indicates that we have a database created by a b8 version already storing <a class="reference internal" href="#the-lastseen-parameter">the &quot;lastseen&quot; parameter</a>.</dd>
+<dt><strong>bayes*texts.ham</strong></dt>
+<dd>The number of ham texts learned.</dd>
+<dt><strong>bayes*texts.spam</strong></dt>
+<dd>The number of spam texts learned.</dd>
+</dl>
+<p>Each &quot;normal&quot; token is stored with it's literal name as the key and it's data as the value. The data consists of the count of the token in all ham and spam texts and the date when the token was used the last time, all in one string and separated by spaces. So we have the following scheme:</p>
+<pre class="literal-block">
+&quot;token&quot; =&gt; &quot;count_ham count_spam lastseen&quot;
+</pre>
+</div>
+<div class="section" id="the-lastseen-parameter">
+<h3><a class="toc-backref" href="#id47">9.2.2&nbsp;&nbsp;&nbsp;The &quot;lastseen&quot; parameter</a></h3>
+<p>Somebody looking at the code might be wondering why b8 stores this &quot;lastseen&quot; parameter. This value is not used for any calculation at the moment. Initially, it was intended to keep the database maintainable in a way that &quot;old&quot; data could be removed. When e. g. a token only appeared once in ham or spam and has not been seen for a year, one could simply delete it from the database. <br />
+I actually never used this feature (does anybody?). So probably, some changes will be done to this one day. Perhaps, I find a way to include this data in the spamminess calculation in a meaningful way, or at least for some statistics. One could also make this optional to keep the calculation effort small if this is needed.</p>
+<p>Feel free to send me any suggestions about this!</p>
+</div>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/library/spam/doc/readme.rst b/library/spam/doc/readme.rst
new file mode 100644 (file)
index 0000000..451b283
--- /dev/null
@@ -0,0 +1,371 @@
+==========
+b8: readme
+==========
+
+:Author: Tobias Leupold
+:Homepage: http://nasauber.de/
+:Contact: tobias.leupold@web.de
+:Date: |date|
+
+.. contents:: Table of Contents
+
+Description of b8
+=================
+
+What is b8?
+-----------
+
+b8 is a spam filter implemented in `PHP <http://www.php.net/>`__. It is intended to keep your weblog or guestbook spam-free. The filter can be used anywhere in your PHP code and tells you whether a text is spam or not, using statistical text analysis. See `How does it work?`_ for details about this. To be able to do this, b8 first has to learn some spam and some ham example texts to decide what's good and what's not. If it makes mistakes classifying unknown texts, they can be corrected and b8 learns from the corrections, getting better with each learned text.
+
+At the moment of this writing, b8 has classified 14411 guestbook entries and weblog comments on my homepage since december 2006. 131 were ham. 39 spam texts (0.27 %) have been rated as ham (false negatives), with not even one false positive (ham message classified as spam). This results in a sensitivity of 99.73 % (the probability that a spam text will actually be rated as spam) and a specifity of 100 % (the probability that a ham text will actually be rated as ham) for me. I hope, you'll get the same good results :-)
+
+Basically, b8 is a statistical ("Bayesian"[#]_) spam filter like `Bogofilter <http://bogofilter.sourceforge.net/>`__ or `SpamBayes <http://spambayes.sourceforge.net/>`__, but it is not intended to classify e-mails. When I started to write b8, I didn't find a good PHP spam filter (or any spam filter that wasn't just some example code how one *could* implement a Bayesian spam filter in PHP) that was intended to filter weblog or guestbook entries. That's why I had to write my own ;-) |br|
+Caused by it's purpose, the way b8 works is slightly different from most of the Bayesian email spam filters out there. See `What's different?`_ if you're interested in the details.
+
+.. [#] A mathematician told me that the math in b8 actually does not use Bayes' theorem but some derived algorithms that are just related to it. So â€¦ let's simply believe that and stop claiming b8 was a *Bayesian* spam filter ;-)
+
+How does it work?
+-----------------
+
+b8  basically uses the math and technique described in Paul Graham's article "A Plan For Spam" [#planforspam]_ to distinguish ham and spam. The improvements proposed in Graham's article "Better Bayesian Filtering" [#betterbayesian]_ and Gary Robinson's article "Spam Detection" [#spamdetection]_ have also been considered. See also the article "A Statistical Approach to the Spam Problem" [#statisticalapproach]_.
+
+b8 cuts the text to classify to pieces, extracting stuff like e-mail addresses, links and HTML tags. For each such token, it calculates a single probability for a text containing it being spam, based on what the filter has learned so far. When the token was not seen before, b8 tries to find similar ones using the "degeneration" described in [#betterbayesian]_ and uses the most relevant value found. If really nothing is found, b8 assumes a default rating for this token for the further calculations. |br|
+Then, b8 takes the most relevant values (which have a rating far from 0.5, which would mean we don't know what it is) and calculates the probability that the whole text is spam by the inverse chi-square function described in [#spamdetection]_.
+There are some parameters that can be set which influence the filter's behaviour (see below).
+
+In short words: you give b8 a text and it returns a value between 0 and 1, saying it's ham when it's near 0 and saying it's spam when it's near 1.
+
+What do I need for it?
+----------------------
+
+Not much! You just need PHP 5 on the server where b8 will be used (b8 version 0.5 finally dropped PHP 4 compatibility â€“ thankfully ;-) and a proper storage possibility for the wordlists. I strongly recommend using `Berkeley DB <http://www.oracle.com/database/berkeley-db/index.html>`_. See below how you can check if you can use it and why you should use it. If the server's PHP wasn't compiled with Berkeley DB support, a `MySQL <http://mysql.com/>`_ table can be used alternatively.
+
+What's different?
+-----------------
+
+b8 is designed to classify weblog or guestbook entries, not e-mails. For this reason, it uses a slightly different technique than most of the other statistical spam filters out there use.
+
+My experience was that spam entries on my weblog or guestbook were often quite short, sometimes just something like "123abc" as text and a link to a suspect homepage. Some spam bots don't even made a difference between e. g. the "name" and "text" fields and posted their text as email address, for example. Considering this, b8 just takes one string to classify, making no difference between "headers" and "text". |br|
+The other thing is that most statistical spam filters count one token one time, no matter how often it appears in the text (as Graham describes it in [#planforspam]_). b8 does count how often a token was seen and learns or considers this. Additionally, the number of learned ham and spam texts are saved and used as the calculation base for the single probabilities. Why this? Because a text containing one link (no matter where it points to, just indicated by a "\h\t\t\p\:\/\/" or a "www.") might not be spam, but a text containing 20 links might be.
+
+This means that b8 might be good for classifying weblog or guestbook entries (I really think it is ;-) â€“ but very likely, it will work quite poor when being used for something else (like classifying e-mails). But as said above, for this task, there are a lot of very good filters out there to choose from.
+
+Update from prior versions
+==========================
+
+If this is a new b8 installation, read on at the `Installation`_ section!
+
+Update from bayes-php version 0.2.1 or earlier
+----------------------------------------------
+
+Please first follow the database update instructions of the bayes-php-0.3 release if you update from a version prior to bayes-php-0.3 and then read the following paragraph about updating from a version <0.3.3.
+
+Update from bayes-php version 0.3 or later
+------------------------------------------
+
+**You use Berkeley DB?**
+       Everything's fine, you can simply continue using your database.
+
+**You use MySQL?**
+       The ``CREATE`` statement of b8's wordlist has changed. The best is probably to create a dump via your favorite administration tool or script, create the new table and re-insert all data. The layout is still the same: there's one "token" column and one "data" column. Having done that, you can keep using your data.
+
+**You use SQLite?**
+       Sorry, at the moment, there's no SQLite backend for b8. But we're working on it :-)
+
+The configuration model of b8 has changed.  Please read through the `Configuration`_ section and update your configuration accordingly.
+
+b8's lexer has been partially re-written. It should now be able to handle all kind of non-latin-1 input, like cyrillic, chinese or japanese texts. Caused by this fact, much more tokens will be recognized when classifying such texts. Therefore, you could get different results in b8's ratings, even if the same database is used and although the math is still the same.
+
+b8 0.5 introduced two constants that can be used in the ``learn()`` and ``unlearn()`` functions: ``b8::HAM`` and ``b8::SPAM``. The literal values "ham" and "spam" can still be used anyway.
+
+Installation
+============
+
+Installing b8 on your server is quite easy. You just have to provide the needed files. To do this, you could just upload the whole ``b8`` subdirectory to the base directory of your homepage. It contains the filter itself and all needed backend classes. The other directories (``doc``, ``example`` and ``install``) are not used by b8.
+
+That's it ;-)
+
+Configuration
+=============
+
+The configuration is passed as arrays when instantiating a new b8 object. Two arrays can be passed to b8, one containing b8's base configuration and some settings for the lexer (which should be common for all lexer classes, in case some other lexer than the default one will be written one day) and one for the storage backend. |br|
+You can have a look at ``example/index.php`` to see how this can be done. `Using b8 in your scripts`_ also shows example code showing how b8 can be included in a PHP script.
+
+Not all values have to be set. When some values are missing, the default ones will be used. If you do use the default settings, you don't have to pass them to b8.
+
+b8's base configuration
+-----------------------
+
+All these values can be set in the "config_b8" array (the first parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the first argument.
+
+These are some basic settings telling b8 which backend classes to use:
+
+       **storage**
+               This defines which storage backend will be used to save b8's wordlist. Currently, two backends are available: `Berkeley DB <http://www.oracle.com/database/berkeley-db/index.html>`_ (``dba``) and `MySQL <http://mysql.com/>`_ (``mysql``). At the moment, b8 does not support `SQLite <http://sqlite.org/>`_ (as the previous version did), but it will be (hopefully) re-added in one of the next releases. The default is ``dba`` (string).
+
+               *Berkeley DB*
+                       This is the preferred storage backend. It was the original backend for the filter and remains the most performant. b8's storage model is optimized for this database, as it is really fast and fits perfectly to what the filter needs to do the job. All content is saved in a single file, you don't need special user rights or a database server. |br|
+                       If you don't know whether your server's PHP can use a Berkeley DB, simply run the script ``install/setup_berkeleydb.php``. If it shows a Berkeley DB handler, please use this backend.
+
+               *MySQL*
+                       As some webspace hosters don't allow using a Berkeley DB (but please be sure to check if you can use it!), but most do provide a MySQL server, using a MySQL table for the wordlist is provided as an alternative storage method. As said above, b8 was always intended to use a Berkeley DB. It doesn't use or need SQL to query the database. So, very likely, this will work less performant, produce a lot of unnecessary overhead and waste computing power. But it will do fine anyway!
+
+               See `Configuration of the storage backend`_ for the settings of the chosen backend.
+
+       **degenerator**
+               The degenerator class to be used. See `How does it work?`_ and [#betterbayesian]_ if you're interested in what "degeneration" is. Defaults to ``default`` (string). At the moment, only one degenerator exists, so you probably don't want to change this unless you have written your own degenerator.
+
+       **lexer**
+               The lexer class to be used. Defaults to ``default`` (string). At the moment, only one lexer exists, so you probably don't want to change this unless you have written your own lexer.
+
+               The behaviour of the lexer can be additionally configured with the following variables:
+
+                       **min_size**
+                               The minimal length for a token to be considered when calculating the rating of a text. Defaults to ``3`` (integer).
+
+                       **max_size**
+                               The maximal length for a token to be considered when calculating the rating of a text. Defaults to ``30`` (integer).
+
+                       **allow_numbers**
+                               Should pure numbers also be considered? Defaults to ``FALSE`` (boolean).
+
+The following settings influence the mathematical internals of b8. If you want to experiment, feel free to play around with them; but be warned: wrong settings of these values will result in poor performance or could even "short-circuit" the filter. |br|
+Leave these values as they are unless you know what you are doing!
+
+The "Statistical discussion about b8" [#b8statistic]_ shows why the default values are the default ones.
+
+       **use_relevant**
+               This tells b8 how many tokens should be used when calculating the spamminess of a text. The default setting is ``15`` (integer). This seems to be a quite reasonable value. When using to many tokens, the filter will fail on texts filled with useless stuff or with passages from a newspaper, etc. not being very spammish. |br|
+               The tokens counted multiple times (see above) are added in addition to this value. They don't replace other ratings.
+
+       **min_dev**
+               This defines a minimum deviation from 0.5 that a token's rating must have to be considered when calculating the spamminess. Tokens with a rating closer to 0.5 than this value will simply be skipped. |br|
+               If you don't want to use this feature, set this to ``0``. Defaults to ``0.2`` (float). Read [#b8statistic]_ before increasing this.
+
+       **rob_x**
+               This is Gary Robinson's *x* constant (cf. [#spamdetection]_). A completely unknown token will be rated with the value of ``rob_x``. The default ``0.5`` (float) seems to be quite reasonable, as we can't say if a token that also can't be rated by degeneration is good or bad. |br|
+               If you receive much more spam than ham or vice versa, you could change this setting accordingly.
+
+       **rob_s**
+               This is Gary Robinson's *s* constant. This is essentially the probability that the *rob_x* value is correct for a completely unknown token. It will also shift the probability of rarely seen tokens towards this value. The default is ``0.3`` (float) |br|
+               See [#spamdetection]_ for a closer description of the *s* constant and read [#b8statistic]_ for specific information about this constant in b8's algorithms.
+
+Configuration of the storage backend
+------------------------------------
+
+All the following values can be set in the "config_database" array (the second parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the second argument.
+
+Settings for the Berkeley DB (DBA) backend
+``````````````````````````````````````````
+**database**
+       The filename of the database file, relative to the location of ``b8.php``. Defaults to ``wordlist.db`` (string).
+
+**handler**
+       The DBA handler to use (cf. `the PHP documentation <http://php.net/manual/en/dba.requirements.php>`_ and `Setting up a new Berkeley DB`_). Defaults to ``db4`` (string).
+
+Settings for the MySQL backend
+``````````````````````````````
+
+**database**
+       The database containing b8's wordlist table. Defaults to ``b8_wordlist`` (string).
+
+**table_name**
+       The table containing b8's wordlist. Defaults to ``b8_wordlist`` (string).
+
+**host**
+       The host of the MySQL server. Defaults to ``localhost`` (string).
+
+**user**
+       The user name used to open the database connection. Defaults to ``FALSE`` (boolean).
+
+**pass**
+       The password required to open the database connection. Defaults to ``FALSE`` (boolean).
+
+**connection**
+       An existing MySQL link-resource that can be used by b8. Defaults to ``NULL`` (NULL).
+
+Using b8
+========
+
+Now, that everything is configured, you can start to use b8. A sample script that shows what can be done with the filter exists in ``example/index.php``. The best thing for testing how all this works is to use this script before using b8 in your own scripts.
+
+Before you can start, you have to setup a database so that b8 can store a wordlist.
+
+Setting up a new database
+-------------------------
+
+Setting up a new Berkeley DB
+````````````````````````````
+
+I wrote a script to setup a new Berkeley DB for b8. It is located in ``install/setup_berkeleydb.php``. Just run this script on your server and be sure that the directory containing it has the proper access rights set so that the server's HTTP server user or PHP user can create a new file in it (probably ``0777``). The script is quite self-explaining, just run it.
+
+Of course, you can also create a Berkeley DB by hand. In this case, you just have to insert three keys:
+
+::
+
+       bayes*dbversion  => 2
+       bayes*texts.ham  => 0
+       bayes*texts.spam => 0
+
+Be sure to set the right DBA handler in the storage backend configuration if it's not ``db4``.
+
+Setting up a new MySQL table
+````````````````````````````
+
+The SQL file ``install/setup_mysql.sql`` contains both the create statement for the wordlist table of b8 and the ``INSERT`` statements for adding the necessary internal variables.
+
+Simply change the table name according to your needs (or leave it as it is ;-) and run the SQL to setup a b8 wordlist MySQL table.
+
+Using b8 in your scripts
+------------------------
+
+Just have a look at the example script located in ``example/index.php`` to see how you can include b8 in your scripts. Essentially, this strips down to:
+
+::
+
+       # Include the b8 code
+       require "{$_SERVER['DOCUMENT_ROOT']}/b8/b8.php";
+
+       # Do some configuration
+
+       $config_b8 = array(
+               'some_key' => 'some_value',
+               'foo' => 'bar'
+       );
+
+       $config_database = array(
+               'some_key' => 'some_value',
+               'foo' => 'bar'
+       );
+
+       # Create a new b8 instance
+       $b8 = new b8($config_b8, $config_database);
+
+b8 provides three functions in an object oriented way (called e. g. via ``$b8->classify($text)``):
+
+**learn($text, $category)**
+       This saves the reference text ``$text`` (string) in the category ``$category`` (b8 constant). |br|
+       b8 0.5 introduced two constants that can be used as ``$category``: ``b8::HAM`` and ``b8::SPAM``. To be downward compatible with older versions of b8, the literal values "ham" and "spam" (case-sensitive strings) can still be used here.
+
+**unlearn($text, $category)**
+       This function just exists to delete a text from a category in which is has been stored accidentally before. It deletes the reference text ``$text`` (string) from the category ``$category`` (either the constants ``b8::HAM`` or ``b8::SPAM`` or the literal case-sensitive strings "ham" or "spam" â€“ cf. above). |br|
+       **Don't delete a spam text from ham after saving it in spam or vice versa, as long you don't have stored it accidentally in the wrong category before!** This will not improve performance, quite the opposite: it will actually break the filter after a time, as the counter for saved ham or spam texts will reach 0, although you have ham or spam tokens stored: the filter will try to remove texts from the ham or spam data which have never been stored there, decrease the counter for tokens which are found just skip the non-existing words.
+
+**classify($text)**
+       This function takes the text ``$text`` (string), calculates it's probability for being spam it and returns a value between 0 and 1 (float). |br|
+       A value close to 0 says the text is more likely ham and a value close to 1 says the text is more likely spam. What to do with this value is *your* business ;-) See also `Tips on operation`_ below.
+
+Tips on operation
+=================
+
+Before b8 can decide whether a text is spam or ham, you have to tell it what you consider as spam or ham. At least one learned spam or one learned ham text is needed to calculate anything. To get good ratings, you need both learned ham and learned spam texts, the more the better. |br|
+What's considered as "ham" or "spam" can be very different, depending on the operation site. On my homepage, practically each and every text posted in English or using cyrillic letters is spam. On an English or Russian homepage, this will be not the case. So I think it's not really meaningful to provide some "spam data" to start. Just train b8 with "your" spam and ham.
+
+For the practical use, I advise to give the filter all data availible. E. g. name, email address, homepage, IP address und of course the text itself should be stored in a variable (e. g. separated with an ``\n`` or just a space or tab after each block) and then be classified. The learning should also be done with all data availible. |br|
+Saving the IP address is probably only meaningful for spam entries, because spammers often use the same IP address multiple times. In principle, you can leave out the IP of ham entries.
+
+You can use b8 e. g. in a guestbook script and let it classify the text before saving it. Everyone has to decide which rating is necessary to classify a text as "spam", but a rating of >= 0.8 seems to be reasonable for me. If one expects the spam to be in another language that the ham entries or the spams are very short normally, one could also think about a limit of 0.7. |br|
+The email filters out there mostly use > 0.9 or even > 0.99; but keep in mind that they have way more data to analyze in most of the cases. A guestbook entry may be quite short, especially when it's spam.
+
+In my opinion, a autolearn function is very handy. I save spam messages with a rating higher than 0.7 but less than 0.9 automatically as spam. I don't do this with ham messages in an automated way to prevent the filter from saving a false negative as ham and then classifying and learning all the spam as ham when I'm on holidays ;-)
+
+Closing
+=======
+
+So â€¦ that's it. Thanks for using b8! If you find a bug or have an idea how to make b8 better, let me know. I'm also always looking forward to get e-mails from people using b8 on their homepages :-)
+
+References
+==========
+
+.. [#planforspam] Paul Graham, *A Plan For Spam* (http://paulgraham.com/spam.html)
+.. [#betterbayesian] Paul Graham, *Better Bayesian Filtering* (http://paulgraham.com/better.html)
+.. [#spamdetection] Gary Robinson, *Spam Detection* (http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html)
+.. [#statisticalapproach] *A Statistical Approach to the Spam Problem* (http://linuxjournal.com/article/6467)
+.. [#b8statistic] Tobias Leupold, *Statistical discussion about b8* (http://nasauber.de/opensource/b8/discussion/)
+
+Appendix
+========
+
+FAQ
+---
+
+What about more than two categories?
+````````````````````````````````````
+
+I wrote b8 with the `KISS principle <http://en.wikipedia.org/wiki/KISS_principle>`__ in mind. For the "end-user", we have a class with almost no setup to do that can do three things: classify a text, learn a text and un-learn a text. Normally, there's no need to un-learn a text, so essentially, there are only two functions we need. |br|
+This simplicity is only possible because b8 only knows two categories (normally "Ham" and "Spam" or some other category pair) and tells you, in one float number between 0 and 1, if a given texts rather fits in the first or the second category. If we would support multiple categories, more work would have to be done and things would become more complicated. One would have to setup the categories, have another database layout (perhaps making it mandatory to have SQL) and one float number would not be sufficient to describe b8's output, so more code would be needed â€“ even outside of b8.
+
+All the code, the database layout and particularly the math is intended to do exactly one thing: distinguish between two categories. I think it would be a lot of work to change b8 so that it would support more than two categories. Probably, this is possible to do, but don't ask me in which way we would have to change the math to get multiple-category support â€“ I'm a dentist, not a mathematician ;-) |br|
+Apart from this I do believe that most people using b8 don't want or need multiple categories. They just want to know if a text is spam or not, don't they? I do, at least ;-)
+
+But let's think about the multiple-category thing. How would we calculate a rating for more than two categories? If we had a third one, let's call it "`Treet <http://en.wikipedia.org/wiki/Treet>`__", how would we calculate a rating? We could calculate three different ratings. One for "Ham", one for "Spam" and one for "Treet" and choose the highest one to tell the user what category fits best for the text. This could be done by using a small wrapper script using three instances of b8 as-is and three different databases, each containing texts being "Ham", "Spam", "Treet" and the respective counterparts. |br|
+But here's the problem: if we have "Ham" and "Spam", "Spam" is the counterpart of "Ham". But what's the counterpart of "Spam" if we have more than one additional category? Where do the "Non-Ham", "Non-Spam" and "Non-Treet" texts come from?
+
+Another approach, a direct calculation of more than two probabilities (the "Ham" probability is simply 1 minus the "Spam" probability, so we actually get two probabilities with the return value of b8) out of one database would require big changes in b8's structure and math.
+
+There's a project called `PHPNaiveBayesianFilter <http://xhtml.net/scripts/PHPNaiveBayesianFilter>`__ which supports multiple categories by default. The author calls his software "Version 1.0", but I think this is the very first release, not a stable or mature one. The most recent change of that release dates back to 2003 according to the "changed" date of the files inside the zip archive, so probably, this project is dead or has never been alive and under active development at all. |br|
+Actually, I played around with that code but the results weren't really good, so I decided to write my own spam filter from scratch back in early 2006 ;-)
+
+All in all, there seems to be no easy way to implement multiple (meaning more than two) categories using b8's current code base and probably, b8 will never support more than two categories. Perhaps, a fork or a complete re-write would  be better than implementing such a feature. Anyway, I don't close my mind to multiple categories in b8. Feel free to tell me how multiple categories could be implementented in b8 or how a multiple-category version using the same code base (sharing a common abstract class?) could be written.
+
+What about a list with words to ignore?
+```````````````````````````````````````
+
+Some people suggested to introduce a list with words that b8 will simply ignore. Like "and", "or", "the", and so on. I don't think this is very meaningful.
+
+First, it would just work for the particular language that has been stored in the list. Speaking of my homepage, most of my spam is English, almost all my ham is German. So I would have to maintain a list with the probably less interesting words for at least two languages. Additionally, I get spam in Chinese, Japanese and Cyrillic writing or something else I can't read as well. What word should be ignored in those texts?  |br|
+Second, why should we ever exclude words? Who tells us those words are *actually* meaningless? If a word appears both in ham and spam, it's rating will be near 0.5 and so, it won't be used for the final calculation if a appropriate minimum deviation was set. So b8 will exclude it anyway without any blacklist. And think of this: if we excluded a word of which we only *think* it doesn't mean anything but it actually does appear more often in ham or spam, the results will get even worse.
+
+So why should we care about things we do not have to care about? ;-)
+
+
+Why is it called "b8"?
+``````````````````````
+
+The initial name for the filter was (damn creative!) "bayes-php". There were two main reasons for searching another name: 1. "bayes-php" sucks. 2. the `PHP License <http://php.net/license/3_01.txt>`_ says the PHP guys do not like when the name of a script written in PHP contains the word "PHP". Read the `License FAQ <http://www.php.net/license/index.php#faq-lic>`_ for a reasonable argumentation about this.
+
+Luckily, `Tobias Lang <http://langt.net/>`_ proposed the new name "b8". And these are the reasons why I chose this name:
+
+- "bayes-php" is a "b" followed by 8 letters.
+- "b8" is short and handy. Additionally, there was no program with the name "b8" or "bate"
+- The English verb "to bate" means "to decrease" â€“ and that's what b8 does: it decreases the number of spam entries in your weblog or guestbook!
+- "b8" just sounds way cooler than "bayes-php" ;-)
+
+About the database
+------------------
+
+The database layout
+```````````````````
+
+The database layout is quite simple. It's just key:value for everything stored. There are three "internal" variables stored as normal tokens (but all containing a ``*`` which is always used as a split character by the lexer, so we can't get collisions):
+
+**bayes*dbversion**
+       This indicates the database's "version". The first versions of b8 did not set this. Version "2" indicates that we have a database created by a b8 version already storing `the "lastseen" parameter`_.
+
+**bayes*texts.ham**
+       The number of ham texts learned.
+
+**bayes*texts.spam**
+       The number of spam texts learned.
+
+Each "normal" token is stored with it's literal name as the key and it's data as the value. The data consists of the count of the token in all ham and spam texts and the date when the token was used the last time, all in one string and separated by spaces. So we have the following scheme:
+
+::
+
+       "token" => "count_ham count_spam lastseen"
+
+The "lastseen" parameter
+````````````````````````
+
+Somebody looking at the code might be wondering why b8 stores this "lastseen" parameter. This value is not used for any calculation at the moment. Initially, it was intended to keep the database maintainable in a way that "old" data could be removed. When e. g. a token only appeared once in ham or spam and has not been seen for a year, one could simply delete it from the database. |br|
+I actually never used this feature (does anybody?). So probably, some changes will be done to this one day. Perhaps, I find a way to include this data in the spamminess calculation in a meaningful way, or at least for some statistics. One could also make this optional to keep the calculation effort small if this is needed.
+
+Feel free to send me any suggestions about this!
+
+.. |br| raw:: html
+
+   <br />
+
+.. section-numbering::
+
+.. |date| date::
diff --git a/library/spam/example/index.php b/library/spam/example/index.php
new file mode 100644 (file)
index 0000000..6d3c142
--- /dev/null
@@ -0,0 +1,241 @@
+<?php
+
+#   Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+
+### This is an example script demonstrating how b8 can be used. ###
+
+#/*
+
+# Use this code block if you want to use Berkeley DB.
+
+# The database filename is interpreted relative to the b8.php script location.
+
+$config_b8 = array(
+       'storage' => 'dba'
+);
+
+$config_database = array(
+       'database' => 'wordlist.db',
+       'handler'  => 'db4'
+);
+
+#*/
+
+/*
+
+# Use this code block if you want to use MySQL.
+
+# An existing link resource can be passed to b8 by setting
+# $config_database['connection'] to this link resource.
+# Be sure to set your database access data otherwise!
+
+$config_b8 = array(
+       'storage' => 'mysql'
+);
+
+$config_database = array(
+       'database'   => 'test',
+       'table_name' => 'b8_wordlist',
+       'host'       => 'localhost',
+       'user'       => '',
+       'pass'       => ''
+);
+
+*/
+
+# To be able to calculate the time the classification took
+
+$time_start = NULL;
+
+function microtimeFloat()
+{
+       list($usec, $sec) = explode(" ", microtime());
+       return ((float) $usec + (float) $sec);
+}
+
+# Output a nicely colored rating
+
+function formatRating($rating)
+{
+
+       if($rating === FALSE)
+               return "<span style=\"color:red\">could not calculate spaminess</span>";
+
+       $red   = floor(255 * $rating);
+       $green = floor(255 * (1 - $rating));
+
+       return "<span style=\"color:rgb($red, $green, 0);\"><b>" . sprintf("%5f", $rating) . "</b></span>";
+
+}
+
+echo <<<END
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+
+<title>example b8 interface</title>
+
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+
+<meta name="dc.creator" content="Tobias Leupold" />
+<meta name="dc.rights" content="Copyright (c) by Tobias Leupold" />
+
+</head>
+
+<body>
+
+<div>
+
+<h1>example b8 interface</h1>
+
+
+END;
+
+$postedText = "";
+
+if(isset($_POST['action']) and $_POST['text'] ==  "")
+       echo "<p style=\"color:red;\"><b>Please type in a text!</b></p>\n\n";
+
+elseif(isset($_POST['action']) and $_POST['text'] !=  "") {
+
+       $time_start = microtimeFloat();
+
+       # Include the b8 code
+       require dirname(__FILE__) . "/../b8/b8.php";
+
+       # Create a new b8 instance
+       $b8 = new b8($config_b8, $config_database);
+
+       # Check if everything worked smoothly
+
+       $started_up = $b8->validate();
+
+       if($started_up !== TRUE) {
+               echo "<b>example:</b> Could not initialize b8. error code: $started_up";
+               exit;
+       }
+
+       $text = stripslashes($_POST['text']);
+       $postedText = htmlentities($text, ENT_QUOTES, 'UTF-8');
+
+       switch($_POST['action']) {
+
+               case "Classify":
+                       echo "<p><b>Spaminess: " . formatRating($b8->classify($text)) . "</b></p>\n";
+                       break;
+
+               case "Save as Spam":
+
+                       $ratingBefore = $b8->classify($text);
+                       $b8->learn($text, b8::SPAM);
+                       $ratingAfter = $b8->classify($text);
+
+                       echo "<p>Saved the text as Spam</p>\n\n";
+
+                       echo "<div><table>\n";
+                       echo "<tr><td>Classification before learning:</td><td>" . formatRating($ratingBefore) . "</td></tr>\n";
+                       echo "<tr><td>Classification after learning:</td><td>"  . formatRating($ratingAfter)  . "</td></tr>\n";
+                       echo "</table></div>\n\n";
+
+                       break;
+
+               case "Save as Ham":
+
+                       $ratingBefore = $b8->classify($text);
+                       $b8->learn($text, b8::HAM);
+                       $ratingAfter = $b8->classify($text);
+
+                       echo "<p>Saved the text as Ham</p>\n\n";
+
+                       echo "<div><table>\n";
+                       echo "<tr><td>Classification before learning:</td><td>" . formatRating($ratingBefore) . "</td></tr>\n";
+                       echo "<tr><td>Classification after learning:</td><td>"  . formatRating($ratingAfter)  . "</td></tr>\n";
+                       echo "</table></div>\n\n";
+
+                       break;
+
+               case "Delete from Spam":
+                       $b8->unlearn($text, b8::SPAM);
+                       echo "<p style=\"color:green\">Deleted the text from Spam</p>\n\n";
+                       break;
+
+               case "Delete from Ham":
+                       $b8->unlearn($text, b8::HAM);
+                       echo "<p style=\"color:green\">Deleted the text from Ham</p>\n\n";
+                       break;
+
+       }
+
+       $mem_used      = round(memory_get_usage() / 1048576, 5);
+       $peak_mem_used = round(memory_get_peak_usage() / 1048576, 5);
+       $time_taken    = round(microtimeFloat() - $time_start, 5);
+
+}
+
+echo <<<END
+<div>
+<form action="{$_SERVER['PHP_SELF']}" method="post">
+<div>
+<textarea name="text" cols="50" rows="16">$postedText</textarea>
+</div>
+<table>
+<tr>
+<td><input type="submit" name="action" value="Classify" /></td>
+</tr>
+<tr>
+<td><input type="submit" name="action" value="Save as Spam" /></td>
+<td><input type="submit" name="action" value="Save as Ham" /></td>
+</tr>
+<tr>
+<td><input type="submit" name="action" value="Delete from Spam" /></td>
+<td><input type="submit" name="action" value="Delete from Ham" /></td>
+</tr>
+</table>
+</form>
+</div>
+
+</div>
+
+END;
+
+if($time_start !== NULL) {
+
+echo <<<END
+<div>
+<table border="0">
+<tr><td>Memory used:     </td><td>$mem_used&thinsp;MB</td></tr>
+<tr><td>Peak memory used:</td><td>$peak_mem_used&thinsp;MB</td></tr>
+<tr><td>Time taken:      </td><td>$time_taken&thinsp;sec</td></tr>
+</table>
+</div>
+
+END;
+
+}
+
+?>
+
+</body>
+
+</html>
diff --git a/library/spam/install/setup_berkeleydb.php b/library/spam/install/setup_berkeleydb.php
new file mode 100644 (file)
index 0000000..81e1d5a
--- /dev/null
@@ -0,0 +1,240 @@
+<?php
+
+#   Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+#
+#   This file is part of the b8 package
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Lesser General Public License as published by
+#   the Free Software Foundation in version 2.1 of the License.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+#   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+#   License for more details.
+#
+#   You should have received a copy of the GNU Lesser General Public License
+#   along with this program; if not, write to the Free Software Foundation,
+#   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+echo <<<END
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+   "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+
+<title>b8 Berkeley DB setup</title>
+
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+
+<meta name="dc.creator" content="Tobias Leupold" />
+<meta name="dc.rights" content="Copyright (c) by Tobias Leupold" />
+
+</head>
+
+<body>
+
+<div>
+
+<h1>b8 Berkeley DB setup</h1>
+
+
+END;
+
+$failed = FALSE;
+
+if(isset($_POST['handler'])) {
+
+       $dbfile = $_POST['dbfile'];
+       $dbfile_directory = $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']);
+
+       echo "<h2>Creating database</h2>\n\n";
+
+       echo "<p>\n";
+
+       echo "Checking database file name &hellip; ";
+
+       if($dbfile == "") {
+               echo "<span style=\"color:red;\">Please provide the name of the database file!</span><br />\n";
+               $failed = TRUE;
+       }
+       else
+               echo "$dbfile<br />\n";
+
+       if(!$failed) {
+
+               echo "Touching/Creating " . htmlentities($dbfile) . " &hellip; ";
+
+               if(touch($dbfile) === FALSE) {
+                       echo "<span style=\"color:red;\">Failed to touch the database file. Please check the given filename and/or fix the permissions of $dbfile_directory.</span><br />\n";
+                       $failed = TRUE;
+               }
+               else
+                       echo "done<br />\n";
+
+       }
+
+       if(!$failed) {
+
+               echo "Setting file permissions to 0666 &hellip ";
+
+               if(chmod($dbfile, 0666) === FALSE) {
+                       echo "<span style=\"color:red;\">Failed to change the permissions of $dbfile_directory/$dbfile. Please adjust them manually.</span><br />\n";
+                       $failed = TRUE;
+               }
+               else
+                       echo "done<br />\n";
+
+       }
+
+       if(!$failed) {
+
+               echo "Checking if the given file is empty &hellip ";
+
+               if(filesize($dbfile) > 0) {
+                       echo "<span style=\"color:red;\">$dbfile_directory/$dbfile is not empty. Can't create a new database. Please delete/empty this file or give another filename.</span><br />\n";
+                       $failed = TRUE;
+               }
+               else
+                       echo "it is<br />\n";
+
+       }
+
+       if(!$failed) {
+
+               echo "Connecting to $dbfile &hellip; ";
+
+               $db = dba_open($dbfile, "c", $_POST['handler']);
+
+               if($db === FALSE) {
+                       echo "<span style=\"color:red;\">Could not connect to the database!</span><br />\n";
+                       $failed = TRUE;
+               }
+               else
+                       echo "done<br />\n";
+
+       }
+
+       if(!$failed) {
+
+               echo "Storing necessary internal variables &hellip ";
+
+               $internals = array(
+                       "bayes*dbversion" => "2",
+                       "bayes*texts.ham" => "0",
+                       "bayes*texts.spam" => "0"
+               );
+
+               foreach($internals as $key => $value) {
+                       if(dba_insert($key, $value, $db) === FALSE) {
+                               echo "<span style=\"color:red;\">Failed to insert data!</span><br />\n";
+                               $failed = TRUE;
+                               break;
+                       }
+               }
+
+               if(!$failed)
+                       echo "done<br />\n";
+
+       }
+
+       if(!$failed) {
+
+               echo "Trying to read data from the database &hellip ";
+
+               $dbversion = dba_fetch("bayes*dbversion", $db);
+
+               if($dbversion != "2") {
+                       echo "<span style=\"color:red;\">Failed to read data!</span><br />\n";
+                       $failed = TRUE;
+               }
+               else
+                       echo "success<br />\n";
+       }
+
+       if(!$failed) {
+
+               dba_close($db);
+
+               echo "</p>\n\n";
+               echo "<p style=\"color:green;\">Successfully created a new b8 database!</p>\n\n";
+               echo "<table>\n";
+               echo "<tr><td>Filename:</td><td>$dbfile_directory/$dbfile</td></tr>\n";
+               echo "<tr><td>DBA handler:</td><td>{$_POST['handler']}</td><tr>\n";
+               echo "</table>\n\n";
+               echo "<p>Move this file to it's destination directory (default: the base directory of b8) to use it with b8. Be sure to use the right DBA handler in b8's configuration.";
+
+       }
+
+       echo "</p>\n\n";
+
+}
+
+if($failed === TRUE or !isset($_POST['handler'])) {
+
+echo <<<END
+<form action="{$_SERVER['PHP_SELF']}" method="post">
+
+<h2>DBA Handler</h2>
+
+<p>
+The following table shows all available DBA handlers. Please choose the "Berkeley DB" one.
+</p>
+
+<table>
+<tr><td></td><td><b>Handler</b></td><td><b>Description</b></td></tr>
+
+END;
+
+foreach(dba_handlers(TRUE) as $name => $version) {
+
+       $checked = "";
+
+       if(!isset($_POST['handler'])) {
+               if(strpos($version, "Berkeley") !== FALSE )
+                       $checked = " checked=\"checked\"";
+       }
+       else {
+               if($_POST['handler'] == $name)
+                       $checked = " checked=\"checked\"";
+       }
+
+       echo "<tr><td><input type=\"radio\" name=\"handler\" value=\"$name\"$checked /></td><td>$name</td><td>$version</td></tr>\n";
+
+}
+
+echo <<<END
+</table>
+
+<h2>Database file</h2>
+
+<p>
+Please the name of the desired database file. It will be created in the directory where this script is located.
+</p>
+
+<p>
+<input type="text" name="dbfile" value="wordlist.db" />
+</p>
+
+<p>
+<input type="submit" value="Create the database" />
+</p>
+
+</form>
+
+
+END;
+
+}
+
+?>
+
+</div>
+
+</body>
+
+</html>
diff --git a/library/spam/install/setup_mysql.sql b/library/spam/install/setup_mysql.sql
new file mode 100644 (file)
index 0000000..ac43274
--- /dev/null
@@ -0,0 +1,27 @@
+
+--   Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+--
+--   This file is part of the b8 package
+--
+--   This program is free software; you can redistribute it and/or modify it
+--   under the terms of the GNU Lesser General Public License as published by
+--   the Free Software Foundation in version 2.1 of the License.
+--
+--   This program is distributed in the hope that it will be useful, but
+--   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+--   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+--   License for more details.
+--
+--   You should have received a copy of the GNU Lesser General Public License
+--   along with this program; if not, write to the Free Software Foundation,
+--   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+CREATE TABLE `b8_wordlist` (
+  `token` varchar(255) character set utf8 collate utf8_bin NOT NULL,
+  `count` varchar(255) default NULL,
+  PRIMARY KEY  (`token`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+INSERT INTO `b8_wordlist` VALUES ('bayes*dbversion', '2');
+INSERT INTO `b8_wordlist` VALUES ('bayes*texts.ham', '0');
+INSERT INTO `b8_wordlist` VALUES ('bayes*texts.spam', '0');
index b8a3abb314a9e482d989a58079ae25ead1f7ab85..e5f716b297e6cb58e494c2d29b9c341e4939041f 100755 (executable)
                        rep(/<u>/gi,"[u]");\r
                        rep(/<blockquote[^>]*>/gi,"[quote]");\r
                        rep(/<\/blockquote>/gi,"[/quote]");\r
+                       rep(/<hr \/>/gi,"[hr]");\r
                        rep(/<br \/>/gi,"\n\n");\r
                        rep(/<br\/>/gi,"\n\n");\r
                        rep(/<br>/gi,"\n");\r
                        rep(/\[\/i\]/gi,"</em>");\r
                        rep(/\[u\]/gi,"<u>");\r
                        rep(/\[\/u\]/gi,"</u>");\r
+                       rep(/\[hr\]/gi,"<hr />");
                        rep(/\[bookmark=([^\]]+)\](.*?)\[\/bookmark\]/gi,"<a class=\"bookmark\" href=\"$1\">$2</a>");\r
                        rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");\r
                        rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");\r
index e444040973a996812daa8e65d8de834b043b5285..028ed8624d86e353f8fd7d99b00a64e366c3fc06 100755 (executable)
@@ -9,6 +9,10 @@ function admin_post(&$a){
        if(!is_site_admin()) {
                return;
        }
+
+
+       if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
+               return;
        
        // urls
        if ($a->argc > 1){
@@ -50,6 +54,9 @@ function admin_content(&$a) {
                return login(false);
        }
 
+       if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
+               return;
+
        /**
         * Side bar links
         */
@@ -628,23 +635,36 @@ function admin_page_logs(&$a){
        $t = get_markup_template("admin_logs.tpl");
 
        $f = get_config('system','logfile');
-       $size = filesize($f);
-       if($size > 5000000 || $size < 0)
-               $size = 5000000;
 
        $data = '';
-       $fp = fopen($f,'r');
-       if($fp) {
-               $seek = fseek($fp,0-$size,SEEK_END);
-               if($seek === 0) {
-                       fgets($fp); // throw away the first partial line
-                       $data = escape_tags(fread($fp,$size));
-                       while(! feof($fp))
-                               $data .= escape_tags(fread($fp,4096));
-               }
-               fclose($fp);
-       }
 
+       if(!file_exists($f)) {
+               $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is 
+readable.");
+       }
+       else {
+               $fp = fopen($f, 'r');
+               if(!$fp) {
+                       $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
+               }
+               else {
+                       $fstat = fstat($fp);
+                       $size = $fstat['size'];
+                       if($size != 0)
+                       {
+                               if($size > 5000000 || $size < 0)
+                                       $size = 5000000;
+                               $seek = fseek($fp,0-$size,SEEK_END);
+                               if($seek === 0) {
+                                       fgets($fp); // throw away the first partial line
+                                       $data = escape_tags(fread($fp,$size));
+                                       while(! feof($fp))
+                                               $data .= escape_tags(fread($fp,4096));
+                               }
+                       }
+                       fclose($fp);
+               }
+       }                       
 
        return replace_macros($t, array(
                '$title' => t('Administration'),
index d578b469f8c1393183a9c703cda6cb3dfa90fa85..a9899994202848cf1c015555f6f472db173fd3ea 100755 (executable)
@@ -80,12 +80,10 @@ function community_content(&$a, $update = 0) {
 
        // we behave the same in message lists as the search module
 
-       $o .= conversation($a,$r,'community',false);
+       $o .= conversation($a,$r,'community',$update);
 
        $o .= paginate($a);
 
-//     $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
-
        return $o;
 }
 
index 51c6920d348db5c2f93a8cc7069d2381d5843319..418cddf17a830018276702bed045ba05306b96f6 100755 (executable)
@@ -42,6 +42,7 @@ function contacts_init(&$a) {
 
        $a->page['aside'] .= findpeople_widget();
 
+       $a->page['aside'] .= networks_widget('contacts',$_GET['nets']);
 }
 
 function contacts_post(&$a) {
@@ -99,6 +100,14 @@ function contacts_post(&$a) {
                info( t('Contact updated.') . EOL);
        else
                notice( t('Failed to update contact record.') . EOL);
+
+       $r = q("select * from contact where id = %d and uid = %d limit 1",
+               intval($contact_id),
+               intval(local_user())
+       );
+       if($r && count($r))
+               $a->data['contact'] = $r[0];
+
        return;
 
 }
@@ -111,7 +120,6 @@ function contacts_content(&$a) {
        $o = '';
        nav_set_selected('contacts');
 
-       $_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
 
        if(! local_user()) {
                notice( t('Permission denied.') . EOL);
@@ -211,7 +219,10 @@ function contacts_content(&$a) {
 
                        contact_remove($orig_record[0]['id']);
                        info( t('Contact has been removed.') . EOL );
-                       goaway($a->get_baseurl() . '/contacts');
+                       if(x($_SESSION,'return_url'))
+                               goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
+                       else
+                               goaway($a->get_baseurl() . '/contacts');
                        return; // NOTREACHED
                }
        }
@@ -354,32 +365,82 @@ function contacts_content(&$a) {
 
        }
 
+       $blocked = false;
+       $hidden = false;
+       $ignored = false;
+       $all = false;
+
+       $_SESSION['return_url'] = $a->query_string;
 
-       if(($a->argc == 2) && ($a->argv[1] === 'all'))
+       if(($a->argc == 2) && ($a->argv[1] === 'all')) {
                $sql_extra = '';
+               $all = true;
+       }
+       elseif(($a->argc == 2) && ($a->argv[1] === 'blocked')) {
+               $sql_extra = " AND `blocked` = 1 ";
+               $blocked = true;
+       }
+       elseif(($a->argc == 2) && ($a->argv[1] === 'hidden')) {
+               $sql_extra = " AND `hidden` = 1 ";
+               $hidden = true;
+       }
+       elseif(($a->argc == 2) && ($a->argv[1] === 'ignored')) {
+               $sql_extra = " AND `readonly` = 1 ";
+               $ignored = true;
+       }
        else
                $sql_extra = " AND `blocked` = 0 ";
 
        $search = ((x($_GET,'search')) ? notags(trim($_GET['search'])) : '');
+       $nets = ((x($_GET,'nets')) ? notags(trim($_GET['nets'])) : '');
+
+       $tabs = array(
+               array(
+                       'label' => t('All Contacts'),
+                       'url'   => $a->get_baseurl() . '/contacts/all', 
+                       'sel'   => ($all) ? 'active' : '',
+               ),
+               array(
+                       'label' => t('Unblocked Contacts'),
+                       'url'   => $a->get_baseurl() . '/contacts',
+                       'sel'   => ((! $all) && (! $blocked) && (! $hidden) && (! $search) && (! $nets) && (! $ignored)) ? 'active' : '',
+               ),
+
+               array(
+                       'label' => t('Blocked Contacts'),
+                       'url'   => $a->get_baseurl() . '/contacts/blocked',
+                       'sel'   => ($blocked) ? 'active' : '',
+               ),
+
+               array(
+                       'label' => t('Ignored Contacts'),
+                       'url'   => $a->get_baseurl() . '/contacts/ignored',
+                       'sel'   => ($ignored) ? 'active' : '',
+               ),
+
+               array(
+                       'label' => t('Hidden Contacts'),
+                       'url'   => $a->get_baseurl() . '/contacts/hidden',
+                       'sel'   => ($hidden) ? 'active' : '',
+               ),
+
+       );
+
+       $tab_tpl = get_markup_template('common_tabs.tpl');
+       $t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
 
-       $tpl = get_markup_template("contacts-top.tpl");
-       $o .= replace_macros($tpl,array(
-               '$header' => t('Contacts'),
-               '$hide_url' => ((strlen($sql_extra)) ? 'contacts/all' : 'contacts' ),
-               '$hide_text' => ((strlen($sql_extra)) ? t('Show Blocked Connections') : t('Hide Blocked Connections')),
-               '$search' => $search,
-               '$desc' => t('Search your contacts'),
-               '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
-               '$submit' => t('Find'),
-               '$cmd' => $a->cmd
 
 
-       )); 
 
-       if($search)
+       if($search) {
+               $search_hdr = $search;
                $search = dbesc($search.'*');
+       }
        $sql_extra .= ((strlen($search)) ? " AND MATCH `name` AGAINST ('$search' IN BOOLEAN MODE) " : "");
 
+       if($nets)
+               $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
        $sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : ''); 
 
        
@@ -389,6 +450,21 @@ function contacts_content(&$a) {
        if(count($r))
                $a->set_pager_total($r[0]['total']);
 
+
+       $tpl = get_markup_template("contacts-top.tpl");
+       $o .= replace_macros($tpl,array(
+               '$header' => t('Contacts') . (($nets) ? ' - ' . network_to_name($nets) : ''),
+               '$tabs' => $t,
+               '$total' => $r[0]['total'],
+               '$search' => $search_hdr,
+               '$desc' => t('Search your contacts'),
+               '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
+               '$submit' => t('Find'),
+               '$cmd' => $a->cmd
+
+
+       )); 
+
        $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `pending` = 0 $sql_extra $sql_extra2 ORDER BY `name` ASC LIMIT %d , %d ",
                intval($_SESSION['uid']),
                intval($a->pager['start']),
index 89b09ef77e8aa8d55418fc36383bd5128ab143ba..abacd9906c62c160f8b7d090a30f342855485b05 100755 (executable)
@@ -72,6 +72,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
                        $intro_id  = $handsfree['intro_id'];
                        $duplex    = $handsfree['duplex'];
                        $hidden    = ((array_key_exists('hidden',$handsfree)) ? intval($handsfree['hidden']) : 0 );
+                       $activity  = ((array_key_exists('activity',$handsfree)) ? intval($handsfree['activity']) : 0 );
                }
                else {
                        $dfrn_id  = ((x($_POST,'dfrn_id'))    ? notags(trim($_POST['dfrn_id'])) : "");
@@ -79,6 +80,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
                        $duplex   = ((x($_POST,'duplex'))     ? intval($_POST['duplex'])        : 0 );
                        $cid      = ((x($_POST,'contact_id')) ? intval($_POST['contact_id'])    : 0 );
                        $hidden   = ((x($_POST,'hidden'))     ? intval($_POST['hidden'])        : 0 );
+                       $activity = ((x($_POST,'activity'))   ? intval($_POST['activity'])      : 0 );
                }
 
                /**
@@ -370,6 +372,9 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
                        if($network === NETWORK_DIASPORA) {
                                if($duplex)
                                        $new_relation = CONTACT_IS_FRIEND;
+                               else
+                                       $new_relation = CONTACT_IS_SHARING;
+
                                if($new_relation != CONTACT_IS_FOLLOWER)
                                        $writable = 1;
                        }
@@ -425,64 +430,65 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
                else
                        $contact = null;
 
-               // Send a new friend post if we are allowed to...
-
-               $r = q("SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
-                       intval($uid)
-               );
-               if((count($r)) && (! $hidden) && ($r[0]['hide-friends'] == 0) && (is_array($contact)) &&  isset($new_relation) && ($new_relation == CONTACT_IS_FRIEND)) {
+               if(isset($new_relation) && $new_relation == CONTACT_IS_FRIEND) {
 
-                       if($r[0]['network'] === NETWORK_DIASPORA) {
+                       if(($contact) && ($contact['network'] === NETWORK_DIASPORA)) {
                                require_once('include/diaspora.php');
                                $ret = diaspora_share($user[0],$r[0]);
                                logger('mod_follow: diaspora_share returns: ' . $ret);
                        }
 
-                       require_once('include/items.php');
+                       // Send a new friend post if we are allowed to...
 
-                       $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
+                       $r = q("SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
                                intval($uid)
                        );
+                       if((count($r)) && ($activity) && (! $hidden)) {
 
-                       if(count($self)) {
-
-                               $arr = array();
-                               $arr['uri'] = $arr['parent-uri'] = item_new_uri($a->get_hostname(), $uid); 
-                               $arr['uid'] = $uid;
-                               $arr['contact-id'] = $self[0]['id'];
-                               $arr['wall'] = 1;
-                               $arr['type'] = 'wall';
-                               $arr['gravity'] = 0;
-                               $arr['origin'] = 1;
-                               $arr['author-name'] = $arr['owner-name'] = $self[0]['name'];
-                               $arr['author-link'] = $arr['owner-link'] = $self[0]['url'];
-                               $arr['author-avatar'] = $arr['owner-avatar'] = $self[0]['thumb'];
-                               $arr['verb'] = ACTIVITY_FRIEND;
-                               $arr['object-type'] = ACTIVITY_OBJ_PERSON;
-                               
-                               $A = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url]';
-                               $B = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
-                               $BPhoto = '[url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]';
-                               $arr['body'] =  sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$BPhoto;
-
-                               $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $contact['name'] . '</title>'
-                                       . '<id>' . $contact['url'] . '/' . $contact['name'] . '</id>';
-                               $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $contact['url'] . '" />' . "\n");
-                               $arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $contact['thumb'] . '" />' . "\n");
-                               $arr['object'] .= '</link></object>' . "\n";
-                               $arr['last-child'] = 1;
-
-                               $arr['allow_cid'] = $user[0]['allow_cid'];
-                               $arr['allow_gid'] = $user[0]['allow_gid'];
-                               $arr['deny_cid']  = $user[0]['deny_cid'];
-                               $arr['deny_gid']  = $user[0]['deny_gid'];
-
-                               $i = item_store($arr);
-                               if($i)
-                               proc_run('php',"include/notifier.php","activity","$i");
+                               require_once('include/items.php');
 
-                       }
+                               $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
+                                       intval($uid)
+                               );
 
+                               if(count($self)) {
+
+                                       $arr = array();
+                                       $arr['uri'] = $arr['parent-uri'] = item_new_uri($a->get_hostname(), $uid); 
+                                       $arr['uid'] = $uid;
+                                       $arr['contact-id'] = $self[0]['id'];
+                                       $arr['wall'] = 1;
+                                       $arr['type'] = 'wall';
+                                       $arr['gravity'] = 0;
+                                       $arr['origin'] = 1;
+                                       $arr['author-name'] = $arr['owner-name'] = $self[0]['name'];
+                                       $arr['author-link'] = $arr['owner-link'] = $self[0]['url'];
+                                       $arr['author-avatar'] = $arr['owner-avatar'] = $self[0]['thumb'];
+                                       $arr['verb'] = ACTIVITY_FRIEND;
+                                       $arr['object-type'] = ACTIVITY_OBJ_PERSON;
+                               
+                                       $A = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url]';
+                                       $B = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
+                                       $BPhoto = '[url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]';
+                                       $arr['body'] =  sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$BPhoto;
+
+                                       $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $contact['name'] . '</title>'
+                                               . '<id>' . $contact['url'] . '/' . $contact['name'] . '</id>';
+                                       $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $contact['url'] . '" />' . "\n");
+                                       $arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $contact['thumb'] . '" />' . "\n");
+                                       $arr['object'] .= '</link></object>' . "\n";
+                                       $arr['last-child'] = 1;
+
+                                       $arr['allow_cid'] = $user[0]['allow_cid'];
+                                       $arr['allow_gid'] = $user[0]['allow_gid'];
+                                       $arr['deny_cid']  = $user[0]['deny_cid'];
+                                       $arr['deny_gid']  = $user[0]['deny_gid'];
+
+                                       $i = item_store($arr);
+                                       if($i)
+                                       proc_run('php',"include/notifier.php","activity","$i");
+                               }
+                       }
                }
                // Let's send our user to the contact editor in case they want to
                // do anything special with this new friend.
index 09f198b81465dc33a4cf3a87161b4bfd9734c114..b12e0713285a2b59ebe595558a8a69e1f9a4e6a9 100755 (executable)
@@ -86,6 +86,7 @@ function dfrn_poll_init(&$a) {
                                        $_SESSION['authenticated'] = 1;
                                        $_SESSION['visitor_id'] = $r[0]['id'];
                                        $_SESSION['visitor_home'] = $r[0]['url'];
+                                       $_SESSION['visitor_handle'] = $r[0]['addr'];
                                        $_SESSION['visitor_visiting'] = $r[0]['uid'];
                                        info( sprintf(t('%s welcomes %s'), $r[0]['username'] , $r[0]['name']) . EOL);
                                        // Visitors get 1 day session.
index aa14bc473dddd54b1ba40267b53e6ba42e0a52b6..ceec83e90b25a7202a6955c3bd7736de721f4401 100755 (executable)
@@ -577,6 +577,7 @@ function dfrn_request_content(&$a) {
                                                'language'     => $r[0]['language'],
                                                'to_name'      => $r[0]['username'],
                                                'to_email'     => $r[0]['email'],
+                                               'uid'          => $r[0]['uid'],
                                                'link'             => $a->get_baseurl() . '/notifications/intros',
                                                'source_name'  => ((strlen(stripslashes($r[0]['name']))) ? stripslashes($r[0]['name']) : t('[Name Withheld]')),
                                                'source_link'  => $r[0]['url'],
index 5f00b4f5a4a9ced5703cf8f26cd22cdb9f82390d..962188945fd1c8bebfdb6975a1fa26c2eb10d440 100755 (executable)
@@ -26,6 +26,8 @@ function directory_post(&$a) {
 function directory_content(&$a) {
 
        $everything = (($a->argc > 1 && $a->argv[1] === 'all' && is_site_admin()) ? true : false);
+       if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
+               $everything = false;
 
        if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
                notice( t('Public access denied.') . EOL);
index 02f080a790587c1ffc36deeb03abd762511854b4..d96be4333bebc2ac4af56d47da159c07bf29e967 100755 (executable)
@@ -11,6 +11,7 @@ function display_content(&$a) {
        require_once("include/bbcode.php");
        require_once('include/security.php');
        require_once('include/conversation.php');
+       require_once('include/acl_selectors.php');
 
 
        $o = '<div id="live-display"></div>' . "\r\n";
@@ -66,6 +67,23 @@ function display_content(&$a) {
                notice( t('Access to this profile has been restricted.') . EOL);
                return;
        }
+       
+       if ($is_owner)
+               $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
+
+               $x = array(
+                       'is_owner' => true,
+                       'allow_location' => $a->user['allow_location'],
+                       'default_location' => $a->user['default_location'],
+                       'nickname' => $a->user['nickname'],
+                       'lockstate' => ((($group) || (is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'),
+                       'acl' => populate_acl((($group || $cid) ? $def_acl : $a->user), $celeb),
+                       'bang' => (($group || $cid) ? '!' : ''),
+                       'visitor' => 'block',
+                       'profile_uid' => local_user()
+               );      
+               $o .= status_editor($a,$x,0,true);
+
 
        $sql_extra = permissions_sql($a->profile['uid'],$remote_contact,$groups);
 
index bceb9250a2d44f83abe547db4f4294ed6656860e..778ac3dccd5e8343bdab20315c151dc723a8c5c2 100755 (executable)
@@ -28,6 +28,10 @@ function editpost_content(&$a) {
                return;
        }
 
+       $plaintext = false;
+       if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+               $plaintext = true;
+
 
        $o .= '<h2>' . t('Edit post') . '</h2>';
 
@@ -35,6 +39,7 @@ function editpost_content(&$a) {
        
        $a->page['htmlhead'] .= replace_macros($tpl, array(
                '$baseurl' => $a->get_baseurl(),
+               '$editselect' =>  (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
                '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
                '$geotag' => $geotag,
                '$nickname' => $a->user['nickname']
@@ -108,11 +113,14 @@ function editpost_content(&$a) {
                '$emailcc' => t('CC: email addresses'),
                '$public' => t('Public post'),
                '$jotnets' => $jotnets,
+               '$title' => $itm[0]['title'],
+               '$placeholdertitle' => t('Set title'),
                '$emtitle' => t('Example: bob@example.com, mary@example.com'),
                '$lockstate' => $lockstate,
                '$acl' => '', // populate_acl((($group) ? $group_acl : $a->user), $celeb),
                '$bang' => (($group) ? '!' : ''),
                '$profile_uid' => $_SESSION['uid'],
+               '$preview' => t('Preview'),
                '$jotplugins' => $jotplugins,
        ));
 
index 5da8f17fc2f5dea40da16f1608892632d2e2fed3..0906d16c2ee21687c32bc5d3e7553df82c0ba9d2 100755 (executable)
@@ -1,5 +1,6 @@
 <?php
 
+require_once('include/bbcode.php');
 require_once('include/datetime.php');
 require_once('include/event.php');
 require_once('include/items.php');
@@ -110,11 +111,14 @@ function events_content(&$a) {
                return;
        }
 
+
+       $htpl = get_markup_template('event_head.tpl');
+       $a->page['htmlhead'] .= replace_macros($htpl,array('$baseurl' => $a->get_baseurl()));
+
        $o ="";
        // tabs
-       $o .= profile_tabs($a, True);   
+       $tabs = profile_tabs($a, True); 
 
-       $o .= '<h2>' . t('Events') . '</h2>';
 
 
        $mode = 'view';
@@ -138,6 +142,8 @@ function events_content(&$a) {
        }
 
        if($mode == 'view') {
+               
+               
            $thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
        $thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
                if(! $y)
@@ -167,11 +173,16 @@ function events_content(&$a) {
                        $prevmonth = 12;
                        $prevyear --;
                }
-
                        
                $dim    = get_dim($y,$m);
                $start  = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
                $finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
+
+
+               if ($a->argv[1] === 'json'){
+                       if (x($_GET,'start'))   $start = date("Y-m-d h:i:s", $_GET['start']);
+                       if (x($_GET,'end'))     $finish = date("Y-m-d h:i:s", $_GET['end']);
+               }
        
                $start  = datetime_convert('UTC','UTC',$start);
                $finish = datetime_convert('UTC','UTC',$finish);
@@ -180,17 +191,26 @@ function events_content(&$a) {
                $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
 
 
-               $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
-                       `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` 
-                       WHERE `event`.`uid` = %d
-                       AND (( `adjust` = 0 AND `start` >= '%s' AND `start` <= '%s' ) 
-                       OR  (  `adjust` = 1 AND `start` >= '%s' AND `start` <= '%s' )) ",
-                       intval(local_user()),
-                       dbesc($start),
-                       dbesc($finish),
-                       dbesc($adjust_start),
-                       dbesc($adjust_finish)
-               );
+               if (x($_GET,'id')){
+                       $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
+                               `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` 
+                               WHERE `event`.`uid` = %d AND `event`.`id` = %d",
+                               intval(local_user()),
+                               intval($_GET['id'])
+                       );
+               } else {
+                       $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
+                               `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` 
+                               WHERE `event`.`uid` = %d
+                               AND (( `adjust` = 0 AND `start` >= '%s' AND `start` <= '%s' ) 
+                               OR  (  `adjust` = 1 AND `start` >= '%s' AND `start` <= '%s' )) ",
+                               intval(local_user()),
+                               dbesc($start),
+                               dbesc($finish),
+                               dbesc($adjust_start),
+                               dbesc($adjust_finish)
+                       );
+               }
 
                $links = array();
 
@@ -204,17 +224,7 @@ function events_content(&$a) {
                }
 
 
-               $o .= '<div id="new-event-link"><a href="' . $a->get_baseurl() . '/events/new' . '" >' . t('Create New Event') . '</a></div>';
-               $o .= '<div id="event-calendar-wrapper">';
-
-               $o .= '<a href="' . $a->get_baseurl() . '/events/' . $prevyear . '/' . $prevmonth . '" class="prevcal"><div id="event-calendar-prev" class="icon prev" title="' . t('Previous') . '"></div></a>';
-               $o .= cal($y,$m,$links, ' eventcal');
-
-               $o .= '<a href="' . $a->get_baseurl() . '/events/' . $nextyear . '/' . $nextmonth . '" class="nextcal"><div id="event-calendar-next" class="icon next" title="' . t('Next') . '"></div></a>';
-               $o .= '</div>';
-               $o .= '<div class="event-calendar-end"></div>';
-
-
+               $events=array();
 
                $last_date = '';
                $fmt = t('l, F j');
@@ -222,25 +232,82 @@ function events_content(&$a) {
                if(count($r)) {
                        $r = sort_by_date($r);
                        foreach($r as $rr) {
+                               
+                               
                                $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
                                $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
                                $d = day_translate($d);
-                               if($d !== $last_date)
-                                       $o .= '<hr /><a name="link-' . $j . '" ><div class="event-list-date">' . $d . '</div></a>';
-                               $last_date = $d;
-                               if($rr['author-name']) {
-                                       $o .= '<a href="' . $rr['author-link'] . '" ><img src="' . $rr['author-avatar'] . '" height="32" width="32" />' . $rr['author-name'] . '</a>';
+                               
+                               $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
+                               if ($rr['nofinish']){
+                                       $end = null;
+                               } else {
+                                       $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
                                }
-                               $o .= format_event_html($rr);
-                               $o .= ((! $rr['cid']) ? '<a href="' . $a->get_baseurl() . '/events/event/' . $rr['id'] . '" title="' . t('Edit event') . '" class="edit-event-link icon pencil"></a>' : '');
-                               if($rr['plink'])
-                                       $o .= '<a href="' . $rr['plink'] . '" title="' . t('link to source') . '" target="external-link" class="plink-event-link icon remote-link"></a></div>';
+                               
+                               
+                               $is_first = ($d !== $last_date);
+                                       
+                               $last_date = $d;
+                               $edit = ((! $rr['cid']) ? array($a->get_baseurl().'/events/event/'.$rr['id'],t('Edit event'),'','') : null);
+
+                               list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
+                               $title = strip_tags($title);
+                               $html = format_event_html($rr);
+                               $rr['desc'] = bbcode($rr['desc']);
+                               $rr['location'] = bbcode($rr['location']);
+                               $events[] = array(
+                                       'id'=>$rr['id'],
+                                       'start'=> $start,
+                                       'end' => $end,
+                                       'allDay' => false,
+                                       'title' => $title,
+                                       
+                                       'j' => $j,
+                                       'd' => $d,
+                                       'edit' => $edit,
+                                       'is_first'=>$is_first,
+                                       'item'=>$rr,
+                                       'html'=>$html,
+                                       'plink' => array($rr['plink'],t('link to source'),'',''),
+                               );
 
-                               $o .= '<div class="clear"></div>';
 
                        }
                }
+                
+               if ($a->argv[1] === 'json'){
+                       echo json_encode($events); killme();
+               }
+               
+               // links: array('href', 'text', 'extra css classes', 'title')
+               if (x($_GET,'id')){
+                       $tpl =  get_markup_template("event.tpl");
+               } else {
+                       if (get_config('experimentals','new_calendar')==1){
+                               $tpl = get_markup_template("events-js.tpl");
+                       } else {
+                               $tpl = get_markup_template("events.tpl");
+                       }
+               }
+               $o = replace_macros($tpl, array(
+                       '$baseurl'      => $a->get_baseurl(),
+                       '$tabs'         => $tabs,
+                       '$title'        => t('Events'),
+                       '$new_event'=> array($a->get_baseurl().'/events/new',t('Create New Event'),'',''),
+                       '$previus'      => array($a->get_baseurl()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
+                       '$next'         => array($a->get_baseurl()."/events/$nextyear/$nextmonth",t('Next'),'',''),
+                       '$calendar' => cal($y,$m,$links, ' eventcal'),
+                       
+                       '$events'       => $events,
+                       
+                       
+               ));
+               
+               if (x($_GET,'id')){ echo $o; killme(); }
+               
                return $o;
+               
        }
 
        if($mode === 'edit' && $event_id) {
@@ -271,8 +338,7 @@ function events_content(&$a) {
                if($cid)
                        $sh_checked .= ' disabled="disabled" ';
 
-               $htpl = get_markup_template('event_head.tpl');
-               $a->page['htmlhead'] .= replace_macros($htpl,array('$baseurl' => $a->get_baseurl()));
+
 
                $tpl = get_markup_template('event_form.tpl');
 
@@ -311,8 +377,9 @@ function events_content(&$a) {
                        '$eid' => $eid, 
                        '$cid' => $cid,
                        '$uri' => $uri,
-                       '$e_text' => t('Event details'),
-                       '$e_desc' => sprintf( t('Format is %s %s. Starting date and Description are required.'),$dateformat,$timeformat),
+                       '$title' => t('Event details'),
+                       '$desc' => sprintf( t('Format is %s %s. Starting date and Description are required.'),$dateformat,$timeformat),
+                       
                        '$s_text' => t('Event Starts:') . ' <span class="required">*</span> ',
                        '$s_dsel' => datesel($f,'start',$syear+5,$syear,false,$syear,$smonth,$sday),
                        '$s_tsel' => timesel('start',$shour,$sminute),
index f7820fc80474680e6036874b587f93ec49883d6b..003d81c6ab90f1612fc63dc7d1003c4f62bd4ed1 100755 (executable)
@@ -186,8 +186,8 @@ function install_content(&$a) {
 
                        check_keys($checks);
                        
-                       if(x($_POST,'phppath'))
-                               $phpath = notags(trim($_POST['phppath']));
+                       if(x($_POST,'phpath'))
+                               $phpath = notags(trim($_POST['phpath']));
 
                        check_php($phpath, $checks);
 
@@ -210,6 +210,7 @@ function install_content(&$a) {
                                '$next' => t('Next'),
                                '$reload' => t('Check again'),
                                '$phpath' => $phpath,
+                               '$baseurl' => $a->get_baseurl(),
                        ));
                        return $o;
                }; break;
@@ -220,7 +221,7 @@ function install_content(&$a) {
                        $dbuser = notags(trim($_POST['dbuser']));
                        $dbpass = notags(trim($_POST['dbpass']));
                        $dbdata = notags(trim($_POST['dbdata']));
-                       $phpath = notags(trim($_POST['phppath']));
+                       $phpath = notags(trim($_POST['phpath']));
                        
 
                        $tpl = get_markup_template('install_db.tpl');
@@ -258,7 +259,7 @@ function install_content(&$a) {
                        $dbuser = notags(trim($_POST['dbuser']));
                        $dbpass = notags(trim($_POST['dbpass']));
                        $dbdata = notags(trim($_POST['dbdata']));
-                       $phpath = notags(trim($_POST['phppath']));
+                       $phpath = notags(trim($_POST['phpath']));
                        
                        $adminmail = notags(trim($_POST['adminmail']));
                        $timezone = ((x($_POST,'timezone')) ? ($_POST['timezone']) : 'America/Los_Angeles');
@@ -322,7 +323,7 @@ function check_php(&$phpath, &$checks) {
                $help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
                $tpl = get_markup_template('field_input.tpl');
                $help .= replace_macros($tpl, array(
-                       '$field' => array('phppath', t('PHP executable path'), $phpath, t('Enter full path to php executable')),
+                       '$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable')),
                ));
                $phpath="";
        }
index ed3d7749c6c6b812b5b12a5272ae7c53fcaef9c4..3035989f36ef8c36dc8ba1108c541ddd4af75085 100755 (executable)
@@ -4,7 +4,7 @@
  *
  * This is the POST destination for most all locally posted
  * text stuff. This function handles status, wall-to-wall status, 
- * local comments, and remote coments that are posted on this site 
+ * local comments, and remote coments that are posted on this site 
  * (as opposed to being delivered in a feed).
  * Also processed here are posts and comments coming through the 
  * statusnet/twitter API. 
@@ -17,6 +17,7 @@
 
 require_once('include/crypto.php');
 require_once('include/enotify.php');
+require_once('include/email.php');
 
 function item_post(&$a) {
 
@@ -42,6 +43,7 @@ function item_post(&$a) {
 
        $api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
        $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
+       $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
 
        /**
         * Is this a reply to something?
@@ -56,8 +58,6 @@ function item_post(&$a) {
        $parid = 0;
        $r = false;
 
-       $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
-
        if($parent || $parent_uri) {
 
                if(! x($_REQUEST,'type'))
@@ -110,8 +110,6 @@ function item_post(&$a) {
 
        if($parent) logger('mod_post: parent=' . $parent);
 
-
-
        $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
        $post_id     = ((x($_REQUEST,'post_id'))     ? intval($_REQUEST['post_id'])     : 0);
        $app         = ((x($_REQUEST,'source'))      ? strip_tags($_REQUEST['source'])  : '');
@@ -606,6 +604,7 @@ function item_post(&$a) {
        $datarray['thr-parent']    = $thr_parent;
        $datarray['postopts']      = '';
        $datarray['origin']        = $origin;
+       $datarray['moderated']     = $allow_moderated;
 
        /**
         * These fields are for the convenience of plugins...
@@ -635,9 +634,24 @@ function item_post(&$a) {
 
        call_hooks('post_local',$datarray);
 
+       if(x($datarray,'cancel')) {
+               logger('mod_item: post cancelled by plugin.');
+               if($return_path) {
+                       goaway($a->get_baseurl() . "/" . $return_path);
+               }
+
+               $json = array('cancel' => 1);
+               if(x($_REQUEST,'jsreload') && strlen($_REQUEST['jsreload']))
+                       $json['reload'] = $a->get_baseurl() . '/' . $_REQUEST['jsreload'];
+
+               echo json_encode($json);
+               killme();
+       }
+
 
        if($orig_post) {
-               $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+               $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                       dbesc($title),
                        dbesc($body),
                        dbesc(datetime_convert()),
                        intval($post_id),
@@ -657,8 +671,8 @@ function item_post(&$a) {
 
        $r = q("INSERT INTO `item` (`guid`, `uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, 
                `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `commented`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`, 
-               `tag`, `inform`, `verb`, `postopts`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark`,`origin` )
-               VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d )",
+               `tag`, `inform`, `verb`, `postopts`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark`,`origin`, `moderated` )
+               VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d )",
                dbesc($datarray['guid']),
                intval($datarray['uid']),
                dbesc($datarray['type']),
@@ -695,7 +709,8 @@ function item_post(&$a) {
                intval($datarray['pubmail']),
                dbesc($datarray['attach']),
                intval($datarray['bookmark']),
-               intval($datarray['origin'])
+               intval($datarray['origin']),
+               intval($datarry['moderated'])
        );
 
        $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
@@ -731,6 +746,7 @@ function item_post(&$a) {
                                        'language'     => $user['language'],
                                        'to_name'      => $user['username'],
                                        'to_email'     => $user['email'],
+                                       'uid'          => $user['uid'],
                                        'item'         => $datarray,
                                        'link'             => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id,
                                        'source_name'  => $datarray['author-name'],
@@ -773,6 +789,7 @@ function item_post(&$a) {
                                        'language'     => $user['language'],
                                        'to_name'      => $user['username'],
                                        'to_email'     => $user['email'],
+                                       'uid'          => $user['uid'],
                                        'item'         => $datarray,
                                        'link'             => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id,
                                        'source_name'  => $datarray['author-name'],
@@ -840,8 +857,8 @@ function item_post(&$a) {
                                $disclaimer .= sprintf( t('You may visit them online at %s'), $a->get_baseurl() . '/profile/' . $a->user['nickname']) . EOL;
                                $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . EOL; 
 
-                               $subject  = '[Friendica]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']);
-                               $headers  = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n";
+                               $subject  = email_header_encode('[Friendica]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']),'UTF-8');
+                               $headers  = 'From: ' . email_header_encode($a->user['username'],'UTF-8') . ' <' . $a->user['email'] . '>' . "\n";
                                $headers .= 'MIME-Version: 1.0' . "\n";
                                $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
                                $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
index 271a1236d9f2a5b30e882dabfb718de172d4eca4..03a671b6157d51dc7939dfbfa024eb6ca9bf7fe2 100755 (executable)
@@ -56,7 +56,9 @@ function saved_searches($search) {
                . ((x($_GET,'star')) ? '?star=' . $_GET['star'] : '')
                . ((x($_GET,'bmark')) ? '?bmark=' . $_GET['bmark'] : '')
                . ((x($_GET,'conv')) ? '?conv=' . $_GET['conv'] : '')
-               . ((x($_GET,'nets')) ? '?nets=' . $_GET['nets'] : '');
+               . ((x($_GET,'nets')) ? '?nets=' . $_GET['nets'] : '')
+               . ((x($_GET,'cmin')) ? '?cmin=' . $_GET['cmin'] : '')
+               . ((x($_GET,'cmax')) ? '?cmax=' . $_GET['cmax'] : '');
        
        $o = '';
 
@@ -113,6 +115,7 @@ function network_content(&$a, $update = 0) {
        $all_active = '';
        $search_active = '';
        $conv_active = '';
+       $spam_active = '';
 
        if(($a->argc > 1 && $a->argv[1] === 'new') 
                || ($a->argc > 2 && $a->argv[2] === 'new')) {
@@ -135,12 +138,17 @@ function network_content(&$a, $update = 0) {
                $conv_active = 'active';
        }
 
+       if($_GET['spam']) {
+               $spam_active = 'active';
+       }
+
        
        if (($new_active == '') 
                && ($starred_active == '') 
                && ($bookmarked_active == '')
                && ($conv_active == '')
-               && ($search_active == '')) {
+               && ($search_active == '')
+               && ($spam_active == '')) {
                        $all_active = 'active';
        }
 
@@ -151,9 +159,7 @@ function network_content(&$a, $update = 0) {
                $all_active = '';
                $postord_active = 'active';
        }
-                        
-
-       
+                               
        // tabs
        $tabs = array(
                array(
@@ -187,6 +193,13 @@ function network_content(&$a, $update = 0) {
                        'url'=>$a->get_baseurl() . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '&bmark=1',
                        'sel'=>$bookmarked_active,
                ),      
+//             array(
+//                     'label' => t('Spam'),
+//                     'url'=>$a->get_baseurl() . '/network?f=&spam=1'
+//                     'sel'=> $spam_active,
+//             ),      
+
+
        );
        $tpl = get_markup_template('common_tabs.tpl');
        $o .= replace_macros($tpl, array('$tabs'=>$tabs));
@@ -209,7 +222,10 @@ function network_content(&$a, $update = 0) {
        $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment');
        $liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0);
        $conv = ((x($_GET,'conv')) ? intval($_GET['conv']) : 0);
+       $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0);
        $nets = ((x($_GET,'nets')) ? $_GET['nets'] : '');
+       $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0);
+       $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
 
        if(($a->argc > 2) && $a->argv[2] === 'new')
                $nouveau = true;
@@ -271,11 +287,7 @@ function network_content(&$a, $update = 0) {
 
        $sql_nets = (($nets) ? sprintf(" and `contact`.`network` = '%s' ", dbesc($nets)) : '');
 
-       // We'll need the following line if starred/bookmarks are allowed in comments in the future
-       //      $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` $sql_options ) ";
-
-       // Otherwise, this is a bit faster:
-       $sql_extra = $sql_options;
+       $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` $sql_options ) ";
 
        if($group) {
                $r = q("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
@@ -337,14 +349,18 @@ function network_content(&$a, $update = 0) {
                $o .= "<script> var profile_uid = " . $_SESSION['uid'] 
                        . "; var netargs = '" . substr($a->cmd,8)
                        . '?f='
-                       . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
+                       . ((x($_GET,'cid'))    ? '&cid='    . $_GET['cid']    : '')
                        . ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '') 
-                       . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '') 
-                       . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '') 
-                       . ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '') 
-                       . ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '') 
-                       . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '') 
-                       . ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '') 
+                       . ((x($_GET,'star'))   ? '&star='   . $_GET['star']   : '') 
+                       . ((x($_GET,'order'))  ? '&order='  . $_GET['order']  : '') 
+                       . ((x($_GET,'bmark'))  ? '&bmark='  . $_GET['bmark']  : '') 
+                       . ((x($_GET,'liked'))  ? '&liked='  . $_GET['liked']  : '') 
+                       . ((x($_GET,'conv'))   ? '&conv='   . $_GET['conv']   : '') 
+                       . ((x($_GET,'spam'))   ? '&spam='   . $_GET['spam']   : '') 
+                       . ((x($_GET,'nets'))   ? '&nets='   . $_GET['nets']   : '') 
+                       . ((x($_GET,'cmin'))   ? '&cmin='   . $_GET['cmin']   : '') 
+                       . ((x($_GET,'cmax'))   ? '&cmax='   . $_GET['cmax']   : '') 
+
                        . "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
        }
 
index 60ca49757d9fb6041ca900bbe2eaef2b4cf17c45..2ecc8902471e407714b356731c6c91a7b74979c5 100755 (executable)
@@ -9,35 +9,39 @@ function newmember_content(&$a) {
 
        $o .= '<div style="font-size: 120%;">';
 
-       $o .= t('We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page.');
+       $o .= t('We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear.');
 
        $o .= '<ul>';
 
-       $o .= '<li>' . '<a href="settings">' . t('On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This will be useful in making friends.') . '</a></li>' . EOL; 
+       $o .= '<li>' . '<a target="newmember" href="settings">' . t('On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web.') . '</a></li>' . EOL; 
 
-       $o .= '<li>' . '<a href="settings">' . t('Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="settings">' . t('Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you.') . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="profile_photo">' . t('Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not.') . '</a></li>' . EOL;  
+       $o .= '<li>' . '<a target="newmember" href="profile_photo">' . t('Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not.') . '</a></li>' . EOL;  
 
        if(in_array('facebook', $a->plugins))
-               $o .= '<li>' . '<a href="facebook">' . t("Authorise the Facebook Connector if you currently have a Facebook account and we will \x28optionally\x29 import all your Facebook friends and conversations.") . '</a></li>' . EOL;
+               $o .= '<li>' . '<a target="newmember" href="facebook">' . t("Authorise the Facebook Connector if you currently have a Facebook account and we will \x28optionally\x29 import all your Facebook friends and conversations.") . '</a></li>' . EOL;
+       else
+               $o .= '<li>' . '<a target="newmember" href="help/Installing-Connectors">' . t("<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web.") . '</a></li>' . EOL;
 
     $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
        
        if(! $mail_disabled)
-               $o .= '<li>' . '<a href="settings/connectors">' .  t('Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX') . '</a></li>' . EOL;
+               $o .= '<li>' . '<a target="newmember" href="settings/connectors">' .  t('Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX') . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="profiles">' . t('Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="profiles">' . t('Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors.') . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="profiles">' . t('Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="profiles">' . t('Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships.') . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="contacts">' . t('Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="contacts">' . t('Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog.') . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="directory">' . t('The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="directory">' . t('The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested.') . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="contacts">' . t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="contacts">' . t("On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours.") . '</a></li>' . EOL;
 
-       $o .= '<li>' . '<a href="help">' . t('Our <strong>help</strong> pages may be consulted for detail on other program features and resources.') . '</a></li>' . EOL;
+       $o .= '<li>' . '<a target="newmember" href="contacts">' . t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '</a></li>' . EOL;
+
+       $o .= '<li>' . '<a target="newmember" href="help">' . t('Our <strong>help</strong> pages may be consulted for detail on other program features and resources.') . '</a></li>' . EOL;
 
        $o .= '</div>';
 
index 82d450a880dbc0db272a32dabce63385ea898249..635639d892b7be550561806a4fce4175205971ca 100755 (executable)
@@ -142,6 +142,8 @@ function notifications_content(&$a) {
                                                '$fullname' => $rr['fname'],
                                                '$url' => $rr['furl'],
                                                '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
+                                               '$activity' => array('activity', t('Post a new friend activity'), 1, t('if applicable')),
+
                                                '$knowyou' => $knowyou,
                                                '$approve' => t('Approve'),
                                                '$note' => $rr['note'],
@@ -187,6 +189,7 @@ function notifications_content(&$a) {
                                        '$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/default-profile.jpg"),
                                        '$fullname' => $rr['name'],
                                        '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
+                                       '$activity' => array('activity', t('Post a new friend activity'), 1, t('if applicable')),
                                        '$url' => $rr['url'],
                                        '$knowyou' => $knowyou,
                                        '$approve' => t('Approve'),
index 25995813a3316c26546eb3bc42b80c6485ae239c..236625f68a662ac23b1631b659bfb7e15f875f1e 100755 (executable)
@@ -2,11 +2,26 @@
 require_once("include/oembed.php");
 
 function oembed_content(&$a){
+       // logger('mod_oembed ' . $a->query_string, LOGGER_ALL);
+
+       if ($a->argv[1]=='b2h'){
+               $url = array( "", trim(hex2bin($_REQUEST['url'])));
+               echo oembed_replacecb($url);
+               killme();
+       }
+       
+       if ($a->argv[1]=='h2b'){
+               $text = trim(hex2bin($_REQUEST['text']));
+               echo oembed_html2bbcode($text);
+               killme();
+       }
+       
        if ($a->argc == 2){
                echo "<html><body>";
                $url = base64url_decode($a->argv[1]);
                $j = oembed_fetch_url($url);
                echo $j->html;
+//             logger('mod-oembed ' . $j->html, LOGGER_ALL);
                echo "</body></html>";
        }
        killme();
index 53dce6446a2cbdaf722eb194f4390762e6c04c1e..bbb436e7021ab3f0ad8088fedfde4772e46b0891 100755 (executable)
@@ -11,8 +11,6 @@ function oexchange_init(&$a) {
                killme();
        }
 
-               
-
 
 }
 
@@ -28,14 +26,14 @@ function oexchange_content(&$a) {
                return;
        }
 
-       $url = (((x($_GET,'url')) && strlen($_GET['url'])) 
-               ? urlencode(notags(trim($_GET['url']))) : '');
-       $title = (((x($_GET,'title')) && strlen($_GET['title'])) 
-               ? '&title=' . urlencode(notags(trim($_GET['title']))) : '');
-       $description = (((x($_GET,'description')) && strlen($_GET['description'])) 
-               ? '&description=' . urlencode(notags(trim($_GET['description']))) : '');
-       $tags = (((x($_GET,'tags')) && strlen($_GET['tags'])) 
-               ? '&tags=' . urlencode(notags(trim($_GET['tags']))) : '');
+       $url = (((x($_REQUEST,'url')) && strlen($_REQUEST['url'])) 
+               ? urlencode(notags(trim($_REQUEST['url']))) : '');
+       $title = (((x($_REQUEST,'title')) && strlen($_REQUEST['title'])) 
+               ? '&title=' . urlencode(notags(trim($_REQUEST['title']))) : '');
+       $description = (((x($_REQUEST,'description')) && strlen($_REQUEST['description'])) 
+               ? '&description=' . urlencode(notags(trim($_REQUEST['description']))) : '');
+       $tags = (((x($_REQUEST,'tags')) && strlen($_REQUEST['tags'])) 
+               ? '&tags=' . urlencode(notags(trim($_REQUEST['tags']))) : '');
 
        $s = fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
 
@@ -51,7 +49,7 @@ function oexchange_content(&$a) {
        $post['body'] = html2bbcode($s);
        $post['type'] = 'wall';
 
-       $_POST = $post;
+       $_REQUEST = $post;
        require_once('mod/item.php');
        item_post($a);
 
index 2df9de4763c77afe1bc55932b87284c8343f995a..e0b378f685448a2ac95142bf25649e733e267319 100755 (executable)
@@ -12,6 +12,13 @@ function parse_url_content(&$a) {
        $text = null;
        $str_tags = '';
 
+       $textmode = false;
+       if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+               $textmode = true;
+
+       if($textmode)
+       $br = (($textmode) ? "\n" : '<br /?');
+
        if(x($_GET,'binurl'))
                $url = trim(hex2bin($_GET['binurl']));
        else
@@ -27,14 +34,17 @@ function parse_url_content(&$a) {
                $arr_tags = str_getcsv($_GET['tags']);
                if(count($arr_tags)) {
                        array_walk($arr_tags,'arr_add_hashes');
-                       $str_tags = '<br />' . implode(' ',$arr_tags) . '<br />';               
+                       $str_tags = $br . implode(' ',$arr_tags) . $br;
                }
        }
 
        logger('parse_url: ' . $url);
 
 
-       $template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
+       if($textmode)
+               $template = $br . '[bookmark=%s]%s[/bookmark]%s' . $br;
+       else
+               $template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
 
 
        $arr = array('url' => $url, 'text' => '');
@@ -49,7 +59,11 @@ function parse_url_content(&$a) {
 
        if($url && $title && $text) {
 
-               $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+               if($textmode)
+                       $text = $br . $br . '[quote]' . $text . '[/quote]' . $br;
+               else
+                       $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+
                $title = str_replace(array("\r","\n"),array('',''),$title);
 
                $result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
@@ -208,10 +222,17 @@ function parse_url_content(&$a) {
                                                                $ph->scaleImage(300);
                                                                $new_width = $ph->getWidth();
                                                                $new_height = $ph->getHeight();
-                                                               $image = '<br /><br /><img height="' . $new_height . '" width="' . $new_width . '" src="' .$image . '" alt="photo" />';
+                                                               if($textmode)
+                                                                       $image = $br . $br . '[img=' . $new_width . 'x' . $new_height . ']' . $image . '[/img]';
+                                                               else
+                                                                       $image = '<br /><br /><img height="' . $new_height . '" width="' . $new_width . '" src="' .$image . '" alt="photo" />';
+                                                       }
+                                                       else {
+                                                               if($textmode) 
+                                                                       $image = $br . $br . '[img]' . $image . '[/img]';
+                                                               else
+                                                                       $image = '<br /><br /><img src="' . $image . '" alt="photo" />';
                                                        }
-                                                       else
-                                                               $image = '<br /><br /><img src="' . $image . '" alt="photo" />';
                                                }
                                                else
                                                        $image = '';
@@ -223,11 +244,14 @@ function parse_url_content(&$a) {
        }
 
        if(strlen($text)) {
-               $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+               if($textmode)
+                       $text = $br .$br . '[quote]' . $text . '[/quote]' . $br ;
+               else
+                       $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
        }
 
        if($image) {
-               $text = $image . '<br />' . $text;
+               $text = $image . $br . $text;
        }
        $title = str_replace(array("\r","\n"),array('',''),$title);
 
index 5d89db93e7ab1c0153557e7155be0fe6fe051197..eba9874a8605d0015954b0b8dbe797ae8e04f5fe 100755 (executable)
@@ -128,7 +128,7 @@ function profile_content(&$a, $update = 0) {
                }
 
                if(x($_SESSION,'new_member') && $_SESSION['new_member'] && $is_owner)
-                       $o .= '<a href="newmember">' . t('Tips for New Members') . '</a>' . EOL;
+                       $o .= '<a href="newmember" id="newmember-tips" style="font-size: 1.2em;"><b>' . t('Tips for New Members') . '</b></a>' . EOL;
 
                $commpage = (($a->profile['page-flags'] == PAGE_COMMUNITY) ? true : false);
                $commvisitor = (($commpage && $remote_contact == true) ? true : false);
index eb9702b0415a31525b5d0e68f691f68f0c207a1a..9223e5483c0c5b816485e8c7dd62ac88402bf3ca 100755 (executable)
@@ -2,44 +2,59 @@
 
 function redir_init(&$a) {
 
-       if((! local_user()) || (! ($a->argc == 2)) || (! intval($a->argv[1])))
-               goaway(z_root());
-       $cid = $a->argv[1];
        $url = ((x($_GET,'url')) ? $_GET['url'] : '');
 
-       $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-               intval($cid),
-               intval(local_user())
-       );
+       // traditional DFRN
 
-       if((! count($r)) || ($r[0]['network'] !== 'dfrn'))
-               goaway(z_root());
+       if(local_user() && $a->argc == 2 && intval($a->argv[1])) {
 
-       $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
+               $cid = $a->argv[1];
 
-       if($r[0]['duplex'] && $r[0]['issued-id']) {
-               $orig_id = $r[0]['issued-id'];
-               $dfrn_id = '1:' . $orig_id;
+               $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                       intval($cid),
+                       intval(local_user())
+               );
+
+               if((! count($r)) || ($r[0]['network'] !== NETWORK_DFRN))
+                       goaway(z_root());
+
+               $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
+
+               if($r[0]['duplex'] && $r[0]['issued-id']) {
+                       $orig_id = $r[0]['issued-id'];
+                       $dfrn_id = '1:' . $orig_id;
+               }
+               if($r[0]['duplex'] && $r[0]['dfrn-id']) {
+                       $orig_id = $r[0]['dfrn-id'];
+                       $dfrn_id = '0:' . $orig_id;
+               }
+
+               $sec = random_string();
+
+               q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
+                       VALUES( %d, %s, '%s', '%s', %d )",
+                       intval(local_user()),
+                       intval($cid),
+                       dbesc($dfrn_id),
+                       dbesc($sec),
+                       intval(time() + 45)
+               );
+
+               logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG); 
+               $dest = (($url) ? '&destination_url=' . $url : '');
+               goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id 
+                       . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest );
        }
-       if($r[0]['duplex'] && $r[0]['dfrn-id']) {
-               $orig_id = $r[0]['dfrn-id'];
-               $dfrn_id = '0:' . $orig_id;
+
+       if(local_user())
+               $handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3);
+       if(remote_user())
+               $handle = $_SESSION['handle'];
+
+       if($url) {
+               $url = str_replace('{zid}','&zid=' . $handle,$url);
+               goaway($url);
        }
 
-       $sec = random_string();
-
-       q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
-               VALUES( %d, %s, '%s', '%s', %d )",
-               intval(local_user()),
-               intval($cid),
-               dbesc($dfrn_id),
-               dbesc($sec),
-               intval(time() + 45)
-       );
-
-       logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG); 
-       $dest = (($url) ? '&destination_url=' . $url : '');
-       goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id 
-               . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest );
-       
+       goaway(z_root());
 }
index 89f561642af36a329c8908372fafafaec72d163c..388b3e250767c31d6f0761acb65701d1550f657a 100755 (executable)
@@ -278,8 +278,8 @@ function register_post(&$a) {
                        return;
                }
                $r = q("INSERT INTO `contact` ( `uid`, `created`, `self`, `name`, `nick`, `photo`, `thumb`, `micro`, `blocked`, `pending`, `url`, `nurl`,
-                       `request`, `notify`, `poll`, `confirm`, `poco`, `name-date`, `uri-date`, `avatar-date` )
-                       VALUES ( %d, '%s', 1, '%s', '%s', '%s', '%s', '%s', 0, 0, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+                       `request`, `notify`, `poll`, `confirm`, `poco`, `name-date`, `uri-date`, `avatar-date`, `closeness` )
+                       VALUES ( %d, '%s', 1, '%s', '%s', '%s', '%s', '%s', 0, 0, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 0 ) ",
                        intval($newuid),
                        datetime_convert(),
                        dbesc($username),
index 76ea4062ede8becd5789b1b54a8f3324ce4148ee..17e728ba2d16266531c791316710e0403aae068d 100755 (executable)
@@ -107,7 +107,7 @@ function regmod_content(&$a) {
                return $o;
        }
 
-       if(!is_site_admin()) {
+       if((!is_site_admin()) || (x($_SESSION,'submanage') && intval($_SESSION['submanage']))) {
                notice( t('Permission denied.') . EOL);
                return '';
        }
index c61d5c227a66f10f63a7a96d40941f74d860892f..57a4e6db03e9967028e37f1cc541b2406c78fcac 100755 (executable)
@@ -734,8 +734,11 @@ function settings_content(&$a) {
        if($files) {
                foreach($files as $file) {
                        $f = basename($file);
-                       $theme_name = ((file_exists($file . '/experimental')) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
-                       $themes[$f]=$theme_name;
+                       $is_experimental = file_exists($file . '/experimental');
+                       if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){ 
+                               $theme_name = (($is_experimental) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
+                               $themes[$f]=$theme_name;
+                       }
                }
        }
        $theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
@@ -757,7 +760,7 @@ function settings_content(&$a) {
        $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
 
        $expire_arr = array(
-               'days' => array('expire',  t("Automatically expire posts after days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
+               'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
                'advanced' => t('Advanced expiration settings'),
                'label' => t('Advanced Expiration'),
                'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
@@ -818,6 +821,7 @@ function settings_content(&$a) {
                '$notify4'      => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
                '$notify5'      => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
                '$notify6'  => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),          
+               '$notify7'  => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),         
                
                
                '$h_advn' => t('Advanced Page Settings'),
diff --git a/mod/smilies.php b/mod/smilies.php
new file mode 100755 (executable)
index 0000000..c47f95d
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+
+function smilies_content(&$a) { return smilies('',true); }
index a66ed0d059c6d36970d0f77ff2796541e68a301a..ecf4752915f22a85abee826d9534122433a38fcb 100755 (executable)
@@ -61,8 +61,6 @@ function wall_attach_post(&$a) {
 
        $filedata = @file_get_contents($src);
        $mimetype = z_mime_content_type($filename);
-       if(((! strlen($mimetype)) || ($mimetype === 'application/octet-stream')) && function_exists('mime_content_type'))
-               $mimetype = mime_content_type($filename);
        $hash = random_string();
        $created = datetime_convert();
        $r = q("INSERT INTO `attach` ( `uid`, `hash`, `filename`, `filetype`, `filesize`, `data`, `created`, `edited`, `allow_cid`, `allow_gid`,`deny_cid`, `deny_gid` )
index b34f2cf6b09e9339828a205fd60e2807e9cfb668..278c2135476648cc2723ac64f7420877cc45fb24 100755 (executable)
@@ -100,7 +100,11 @@ function wall_upload_post(&$a) {
        }
 
        $basename = basename($filename);
-       echo  '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />";
+
+       if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+               echo  "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]\n\n";
+       else
+               echo  '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />";
 
        killme();
        // NOTREACHED
index d961f293278466b33fe0d3af424aded8da78e816..24138450aa30130c388e7dc858cc1128053e2781 100755 (executable)
@@ -1,6 +1,6 @@
 <?php
 
-define( 'UPDATE_VERSION' , 1118 );
+define( 'UPDATE_VERSION' , 1122 );
 
 /**
  *
@@ -1012,3 +1012,56 @@ INDEX ( `mid` )
 
 }
 
+function update_1118() {
+       // rolled forward
+}
+
+function update_1119() {
+q("ALTER TABLE `contact` ADD `closeness` TINYINT( 2 ) NOT NULL DEFAULT '99' AFTER `reason` , ADD INDEX (`closeness`) ");
+q("update contact set closeness = 0 where self = 1");
+q("ALTER TABLE `item` ADD `spam` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` , ADD INDEX (`spam`) ");
+}
+
+
+function update_1120() {
+
+       // item table update from 1119 did not get into database.sql file.
+       // might be missing on new installs. We'll check.
+
+       $r = q("describe item");
+       if($r && count($r)) {
+               foreach($r as $rr)
+                       if($rr['Field'] == 'spam')
+                               return;
+       }
+       q("ALTER TABLE `item` ADD `spam` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` , ADD INDEX (`spam`) ");
+
+}
+
+function update_1121() {
+       q("CREATE TABLE IF NOT EXISTS `poll_result` (
+       `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+       `poll_id` INT NOT NULL ,
+       `choice` INT NOT NULL ,
+       INDEX ( `poll_id` ),
+       INDEX ( `choice` )
+       ) ENGINE = MYISAM ");
+
+       q("CREATE TABLE IF NOT EXISTS `poll` (
+       `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+       `uid` INT NOT NULL ,
+       `q0` MEDIUMTEXT NOT NULL ,
+       `q1` MEDIUMTEXT NOT NULL ,
+       `q2` MEDIUMTEXT NOT NULL ,
+       `q3` MEDIUMTEXT NOT NULL ,
+       `q4` MEDIUMTEXT NOT NULL ,
+       `q5` MEDIUMTEXT NOT NULL ,
+       `q6` MEDIUMTEXT NOT NULL ,
+       `q7` MEDIUMTEXT NOT NULL ,
+       `q8` MEDIUMTEXT NOT NULL ,
+       `q9` MEDIUMTEXT NOT NULL ,
+       INDEX ( `uid` )
+       ) ENGINE = MYISAM ");
+
+}
+
diff --git a/util/fpostit/README b/util/fpostit/README
new file mode 100644 (file)
index 0000000..39b7c57
--- /dev/null
@@ -0,0 +1,8 @@
+fpostit
+
+original author: Devlon Duthied
+
+see his blog posting:
+http://blog.duthied.com/2011/09/13/node-agnostic-friendika-bookmarklet/
+
+original published at github https://github.com/duthied/Friendika-Bookmarklet
diff --git a/util/fpostit/fpostit.js b/util/fpostit/fpostit.js
new file mode 100644 (file)
index 0000000..a6c75ab
--- /dev/null
@@ -0,0 +1,11 @@
+javascript: (function() {
+    the_url = 'http://testbubble.com/fpostit.php?url=' + encodeURIComponent(window.location.href) + '&title=' + encodeURIComponent(document.title) + '&text=' + encodeURIComponent('' (window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : document.selection.createRange().text));
+    a_funct = function() {
+        if (!window.open(the_url, 'fpostit', 'location=yes,links=no,scrollbars=no,toolbar=no,width=600,height=300')) location.href = the_url;
+    };
+    if (/Firefox/.test(navigator.userAgent)) {
+        setTimeout(a_funct, 0)
+    } else {
+        a_funct()
+    }
+})()
\ No newline at end of file
diff --git a/util/fpostit/fpostit.php b/util/fpostit/fpostit.php
new file mode 100644 (file)
index 0000000..491d81f
--- /dev/null
@@ -0,0 +1,129 @@
+<?php
+
+if (($_POST["friendika_acct_name"] != '') && ($_POST["friendika_password"] != '')) {
+       setcookie("username", $_POST["friendika_acct_name"], time()+60*60*24*300);
+       setcookie("password", $_POST["friendika_password"], time()+60*60*24*300);
+}
+
+?>
+<html>
+<head>
+       <style>
+               body {
+                       font-family: arial, Helvetica,sans-serif;
+                       margin: 0px;
+               }
+               .wrap1 {
+                       padding: 2px 5px;
+                       background-color: #729FCF;
+                       margin-bottom: 10px;
+               }
+               .wrap2 {
+                       margin-left: 10px;
+                       font-size: 12px;
+               }
+               .logo {
+                       margin-left: 3px;
+                       margin-right: 5px;
+                       float: left;
+               }
+               h2 {
+                       color: #ffffff;
+               }
+               .error {
+                       background-color: #FFFF66;
+                       font-size: 12px;
+                       margin-left: 10px;
+               }
+       </style>
+</head>
+
+<body>
+<?php
+
+if (isset($_GET['title'])) {
+       $title = $_GET['title'];
+}
+if (isset($_GET['text'])) {
+       $text = $_GET['text'];
+}
+if (isset($_GET['url'])) {
+       $url = $_GET['url'];
+}
+
+if ((isset($title)) && (isset($text)) && (isset($url))) {
+       $content = "$title\nsource:$url\n\n$text";
+} else {
+       $content = $_POST['content'];
+}
+
+if (isset($_POST['submit'])) {
+       
+       if (($_POST["friendika_acct_name"] != '') && ($_POST["friendika_password"] != '')) {
+               $acctname = $_POST["friendika_acct_name"];
+               $tmp_account_array = explode("@", $acctname);
+               if (isset($tmp_account_array[1])) {
+                       $username = $tmp_account_array[0];
+                       $hostname = $tmp_account_array[1];
+               }
+               $password = $_POST["friendika_password"];
+               $content = $_POST["content"];
+
+               $url = "http://" . $hostname . '/api/statuses/update';
+               $data = array('status' => $content);
+               
+               // echo "posting to: $url<br/>";
+
+               $c = curl_init();
+               curl_setopt($c, CURLOPT_URL, $url); 
+               curl_setopt($c, CURLOPT_USERPWD, "$username:$password");
+               curl_setopt($c, CURLOPT_POSTFIELDS, $data); 
+               curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
+               curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
+               $c_result = curl_exec($c); 
+               if(curl_errno($c)){ 
+                       $error = curl_error($c);
+                       showForm($error, $content);
+               }
+               
+               curl_close($c);
+               if (!isset($error)) {
+                       echo '<script language="javascript" type="text/javascript">window.close();</script>';
+               }
+               
+       } else {
+               $error = "Missing account name and/or password...try again please";
+               showForm($error, $content);
+       }
+       
+} else {
+       showForm(null, $content);
+}
+
+function showForm($error, $content) {
+       $username_cookie = $_COOKIE['username'];
+       $password_cookie = $_COOKIE['password'];
+       
+       echo <<<EOF
+       <div class='wrap1'>
+               <h2><img class='logo' src='friendika-32.png' align='middle';/>
+               Friendika Bookmarklet</h2>
+       </div>
+
+       <div class="wrap2">
+               <form method="post" action="{$_SERVER['PHP_SELF']}">
+                       Enter the email address of the Friendika Account that you want to cross-post to:(example: user@friendika.org)<br /><br />
+                       Account ID: <input type="text" name="friendika_acct_name" value="{$username_cookie}" size="50"/><br />
+                       Password: <input type="password" name="friendika_password" value="{$password_cookie}" size="50"/><br />
+                       <textarea name="content" id="content" rows="6" cols="70">{$content}</textarea><br />
+                       <input type="submit" value="PostIt!" name="submit" />&nbsp;&nbsp;<span class='error'>$error</span>
+               </form>
+               <p></p>
+       </div>
+EOF;
+       
+}
+?>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/util/fpostit/friendika-32.png b/util/fpostit/friendika-32.png
new file mode 100644 (file)
index 0000000..61764bf
Binary files /dev/null and b/util/fpostit/friendika-32.png differ
index f553041b2b6061aa84112379befd91259a6475c8..6e1652b393e14c1739f0d62c43725a398777d3d6 100755 (executable)
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: 2.3.1221\n"
+"Project-Id-Version: 2.3.1250\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-01-10 08:21-0800\n"
+"POT-Creation-Date: 2012-02-12 17:14-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,1894 +17,2287 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 #"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: ../../mod/allfriends.php:9 ../../mod/follow.php:8
-#: ../../mod/contacts.php:117 ../../mod/settings.php:43
-#: ../../mod/settings.php:48 ../../mod/settings.php:403
-#: ../../mod/crepair.php:113 ../../mod/notifications.php:62
-#: ../../mod/message.php:9 ../../mod/message.php:46
-#: ../../mod/wall_upload.php:42 ../../mod/wall_attach.php:43
+#: ../../mod/oexchange.php:27
+msgid "Post successful."
+msgstr ""
+
+#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
+#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
+msgid "[Embedded content - reload page to view]"
+msgstr ""
+
+#: ../../mod/crepair.php:102
+msgid "Contact settings applied."
+msgstr ""
+
+#: ../../mod/crepair.php:104
+msgid "Contact update failed."
+msgstr ""
+
+#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:43
+#: ../../mod/fsuggest.php:78 ../../mod/events.php:109 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/photos.php:129 ../../mod/photos.php:865
+#: ../../mod/editpost.php:10 ../../mod/install.php:171
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:125
+#: ../../mod/settings.php:49 ../../mod/settings.php:404
+#: ../../mod/settings.php:409 ../../mod/manage.php:86 ../../mod/network.php:6
+#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
+#: ../../mod/viewcontacts.php:21 ../../mod/register.php:36
+#: ../../mod/regmod.php:111 ../../mod/item.php:123 ../../mod/item.php:139
 #: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:137
 #: ../../mod/profile_photo.php:148 ../../mod/profile_photo.php:159
-#: ../../mod/manage.php:75 ../../mod/common.php:9 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:229 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/register.php:36 ../../mod/fsuggest.php:78
-#: ../../mod/editpost.php:10 ../../mod/regmod.php:111
-#: ../../mod/install.php:171 ../../mod/suggest.php:28
-#: ../../mod/display.php:111 ../../mod/notes.php:20
-#: ../../mod/dfrn_confirm.php:53 ../../mod/item.php:118
-#: ../../mod/photos.php:125 ../../mod/photos.php:860 ../../mod/network.php:6
-#: ../../mod/api.php:26 ../../mod/api.php:31 ../../mod/attach.php:33
-#: ../../mod/viewcontacts.php:21 ../../mod/group.php:19
-#: ../../mod/events.php:109 ../../index.php:288 ../../include/items.php:2867
-#: ../../addon/facebook/facebook.php:331
+#: ../../mod/message.php:9 ../../mod/message.php:46 ../../mod/allfriends.php:9
+#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8 ../../mod/common.php:9
+#: ../../mod/display.php:112 ../../mod/profiles.php:7
+#: ../../mod/profiles.php:229 ../../mod/delegate.php:6
+#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
+#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:331
+#: ../../include/items.php:2907 ../../index.php:288
 msgid "Permission denied."
 msgstr ""
 
-#: ../../mod/allfriends.php:34
+#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
+#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr ""
+
+#: ../../mod/crepair.php:135
+msgid "Repair Contact Settings"
+msgstr ""
+
+#: ../../mod/crepair.php:137
+msgid ""
+"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
+"information your communications with this contact may stop working."
+msgstr ""
+
+#: ../../mod/crepair.php:138
+msgid ""
+"Please use your browser 'Back' button <strong>now</strong> if you are "
+"uncertain what to do on this page."
+msgstr ""
+
+#: ../../mod/crepair.php:144
+msgid "Return to contact editor"
+msgstr ""
+
+#: ../../mod/crepair.php:148 ../../mod/settings.php:455
+#: ../../mod/settings.php:481 ../../mod/admin.php:464 ../../mod/admin.php:473
+msgid "Name"
+msgstr ""
+
+#: ../../mod/crepair.php:149
+msgid "Account Nickname"
+msgstr ""
+
+#: ../../mod/crepair.php:150
+msgid "@Tagname - overrides Name/Nickname"
+msgstr ""
+
+#: ../../mod/crepair.php:151
+msgid "Account URL"
+msgstr ""
+
+#: ../../mod/crepair.php:152
+msgid "Friend Request URL"
+msgstr ""
+
+#: ../../mod/crepair.php:153
+msgid "Friend Confirm URL"
+msgstr ""
+
+#: ../../mod/crepair.php:154
+msgid "Notification Endpoint URL"
+msgstr ""
+
+#: ../../mod/crepair.php:155
+msgid "Poll/Feed URL"
+msgstr ""
+
+#: ../../mod/crepair.php:156
+msgid "New photo from this URL"
+msgstr ""
+
+#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
+#: ../../mod/events.php:333 ../../mod/photos.php:900 ../../mod/photos.php:958
+#: ../../mod/photos.php:1182 ../../mod/photos.php:1222
+#: ../../mod/photos.php:1262 ../../mod/photos.php:1293
+#: ../../mod/install.php:251 ../../mod/install.php:289
+#: ../../mod/localtime.php:45 ../../mod/contacts.php:319
+#: ../../mod/settings.php:453 ../../mod/settings.php:592
+#: ../../mod/settings.php:773 ../../mod/manage.php:109 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/admin.php:296 ../../mod/admin.php:461
+#: ../../mod/admin.php:587 ../../mod/admin.php:652 ../../mod/profiles.php:375
+#: ../../mod/invite.php:106 ../../addon/facebook/facebook.php:410
+#: ../../addon/yourls/yourls.php:76 ../../addon/nsfw/nsfw.php:57
+#: ../../addon/uhremotestorage/uhremotestorage.php:89
+#: ../../addon/randplace/randplace.php:179 ../../addon/drpost/drpost.php:110
+#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
+#: ../../addon/impressum/impressum.php:69 ../../addon/blockem/blockem.php:57
+#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:94
+#: ../../addon/pageheader/pageheader.php:52
+#: ../../addon/statusnet/statusnet.php:280
+#: ../../addon/statusnet/statusnet.php:294
+#: ../../addon/statusnet/statusnet.php:320
+#: ../../addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:349
+#: ../../addon/statusnet/statusnet.php:495 ../../addon/tumblr/tumblr.php:90
+#: ../../addon/numfriends/numfriends.php:85 ../../addon/wppost/wppost.php:102
+#: ../../addon/piwik/piwik.php:81 ../../addon/twitter/twitter.php:180
+#: ../../addon/twitter/twitter.php:203 ../../addon/twitter/twitter.php:315
+#: ../../addon/posterous/posterous.php:90 ../../include/conversation.php:515
+msgid "Submit"
+msgstr ""
+
+#: ../../mod/help.php:30
+msgid "Help:"
+msgstr ""
+
+#: ../../mod/help.php:34 ../../include/nav.php:82
+msgid "Help"
+msgstr ""
+
+#: ../../mod/help.php:38 ../../index.php:221
+msgid "Not Found"
+msgstr ""
+
+#: ../../mod/help.php:41 ../../index.php:224
+msgid "Page not found."
+msgstr ""
+
+#: ../../mod/wall_attach.php:57
 #, php-format
-msgid "Friends of %s"
+msgid "File exceeds size limit of %d"
 msgstr ""
 
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
+#: ../../mod/wall_attach.php:85 ../../mod/wall_attach.php:96
+msgid "File upload failed."
 msgstr ""
 
-#: ../../mod/update_profile.php:41 ../../mod/update_network.php:22
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-msgid "[Embedded content - reload page to view]"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
 msgstr ""
 
-#: ../../mod/directory.php:31 ../../mod/dfrn_request.php:624
-#: ../../mod/community.php:16 ../../mod/display.php:7 ../../mod/search.php:71
-#: ../../mod/photos.php:754 ../../mod/viewcontacts.php:16
-msgid "Public access denied."
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
 msgstr ""
 
-#: ../../mod/directory.php:49
-msgid "Global Directory"
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
 msgstr ""
 
-#: ../../mod/directory.php:55
-msgid "Normal site view"
+#: ../../mod/events.php:61
+msgid "Event description and start time are required."
 msgstr ""
 
-#: ../../mod/directory.php:57
-msgid "Admin - View all site entries"
+#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1345
+msgid "Events"
 msgstr ""
 
-#: ../../mod/directory.php:63
-msgid "Find on this site"
+#: ../../mod/events.php:207
+msgid "Create New Event"
 msgstr ""
 
-#: ../../mod/directory.php:65 ../../mod/contacts.php:372
-msgid "Finding: "
+#: ../../mod/events.php:210
+msgid "Previous"
 msgstr ""
 
-#: ../../mod/directory.php:66
-msgid "Site Directory"
+#: ../../mod/events.php:213 ../../mod/install.php:210
+msgid "Next"
 msgstr ""
 
-#: ../../mod/directory.php:67 ../../mod/contacts.php:373
-#: ../../include/contact_widgets.php:34
-msgid "Find"
+#: ../../mod/events.php:220
+msgid "l, F j"
 msgstr ""
 
-#: ../../mod/directory.php:122 ../../mod/profiles.php:426
-msgid "Age: "
+#: ../../mod/events.php:235
+msgid "Edit event"
 msgstr ""
 
-#: ../../mod/directory.php:125
-msgid "Gender: "
+#: ../../mod/events.php:237 ../../include/text.php:883
+msgid "link to source"
 msgstr ""
 
-#: ../../mod/directory.php:151
-msgid "No entries (some entries may be hidden)."
+#: ../../mod/events.php:305
+msgid "hour:minute"
 msgstr ""
 
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
-#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:115
-#: ../../include/items.php:2779
-msgid "Item not found."
+#: ../../mod/events.php:314
+msgid "Event details"
 msgstr ""
 
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
 msgstr ""
 
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
+#: ../../mod/events.php:316
+msgid "Event Starts:"
 msgstr ""
 
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
 msgstr ""
 
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page."
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
 msgstr ""
 
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Settings</em> page -  change your initial password. Also make a "
-"note of your Identity Address. This will be useful in making friends."
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
 msgstr ""
 
-#: ../../mod/newmember.php:18
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished "
-"directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
+#: ../../mod/events.php:326
+msgid "Description:"
 msgstr ""
 
-#: ../../mod/newmember.php:20
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make "
-"friends than people who do not."
+#: ../../mod/events.php:328 ../../include/event.php:37
+#: ../../include/bb2diaspora.php:271 ../../boot.php:976
+msgid "Location:"
 msgstr ""
 
-#: ../../mod/newmember.php:23
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
+#: ../../mod/events.php:330
+msgid "Share this event"
 msgstr ""
 
-#: ../../mod/newmember.php:28
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
+#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
+#: ../../mod/dfrn_request.php:685 ../../mod/settings.php:454
+#: ../../mod/settings.php:480 ../../addon/js_upload/js_upload.php:45
+msgid "Cancel"
 msgstr ""
 
-#: ../../mod/newmember.php:30
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown "
-"visitors."
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
 msgstr ""
 
-#: ../../mod/newmember.php:32
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
 msgstr ""
 
-#: ../../mod/newmember.php:34
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr ""
+
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
+msgstr ""
+
+#: ../../mod/dfrn_poll.php:91 ../../mod/dfrn_poll.php:517
+#, php-format
+msgid "%s welcomes %s"
+msgstr ""
+
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr ""
+
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr ""
+
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr ""
+
+#: ../../mod/api.php:104
 msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
 msgstr ""
 
-#: ../../mod/newmember.php:36
+#: ../../mod/api.php:105 ../../mod/dfrn_request.php:675
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:524
+#: ../../mod/profiles.php:357
+msgid "Yes"
+msgstr ""
+
+#: ../../mod/api.php:106 ../../mod/dfrn_request.php:676
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:525
+#: ../../mod/profiles.php:358
+msgid "No"
+msgstr ""
+
+#: ../../mod/photos.php:42
+msgid "Photo Albums"
+msgstr ""
+
+#: ../../mod/photos.php:50 ../../mod/photos.php:150 ../../mod/photos.php:879
+#: ../../mod/photos.php:950 ../../mod/photos.php:965 ../../mod/photos.php:1371
+#: ../../mod/photos.php:1383 ../../addon/communityhome/communityhome.php:110
+msgid "Contact Photos"
+msgstr ""
+
+#: ../../mod/photos.php:57 ../../mod/photos.php:975 ../../mod/photos.php:1413
+msgid "Upload New Photos"
+msgstr ""
+
+#: ../../mod/photos.php:68 ../../mod/settings.php:11
+msgid "everybody"
+msgstr ""
+
+#: ../../mod/photos.php:139
+msgid "Contact information unavailable"
+msgstr ""
+
+#: ../../mod/photos.php:150 ../../mod/photos.php:597 ../../mod/photos.php:950
+#: ../../mod/photos.php:965 ../../mod/register.php:327
+#: ../../mod/register.php:334 ../../mod/register.php:341
+#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
+#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
+#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
+#: ../../addon/communityhome/communityhome.php:111
+msgid "Profile Photos"
+msgstr ""
+
+#: ../../mod/photos.php:160
+msgid "Album not found."
+msgstr ""
+
+#: ../../mod/photos.php:178 ../../mod/photos.php:959
+msgid "Delete Album"
+msgstr ""
+
+#: ../../mod/photos.php:241 ../../mod/photos.php:1183
+msgid "Delete Photo"
+msgstr ""
+
+#: ../../mod/photos.php:528
+msgid "was tagged in a"
+msgstr ""
+
+#: ../../mod/photos.php:528 ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/communityhome/communityhome.php:163
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:31
+#: ../../include/conversation.php:104
+msgid "photo"
+msgstr ""
+
+#: ../../mod/photos.php:528
+msgid "by"
+msgstr ""
+
+#: ../../mod/photos.php:631 ../../addon/js_upload/js_upload.php:312
+msgid "Image exceeds size limit of "
+msgstr ""
+
+#: ../../mod/photos.php:639
+msgid "Image file is empty."
+msgstr ""
+
+#: ../../mod/photos.php:653 ../../mod/profile_photo.php:122
+#: ../../mod/wall_upload.php:65
+msgid "Unable to process image."
+msgstr ""
+
+#: ../../mod/photos.php:673 ../../mod/profile_photo.php:251
+#: ../../mod/wall_upload.php:84
+msgid "Image upload failed."
+msgstr ""
+
+#: ../../mod/photos.php:759 ../../mod/community.php:16
+#: ../../mod/dfrn_request.php:624 ../../mod/viewcontacts.php:16
+#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:31
+msgid "Public access denied."
+msgstr ""
+
+#: ../../mod/photos.php:769
+msgid "No photos selected"
+msgstr ""
+
+#: ../../mod/photos.php:846
+msgid "Access to this item is restricted."
+msgstr ""
+
+#: ../../mod/photos.php:907
+msgid "Upload Photos"
+msgstr ""
+
+#: ../../mod/photos.php:910 ../../mod/photos.php:954
+msgid "New album name: "
+msgstr ""
+
+#: ../../mod/photos.php:911
+msgid "or existing album name: "
+msgstr ""
+
+#: ../../mod/photos.php:912
+msgid "Do not show a status post for this upload"
+msgstr ""
+
+#: ../../mod/photos.php:914 ../../mod/photos.php:1178
+msgid "Permissions"
+msgstr ""
+
+#: ../../mod/photos.php:969
+msgid "Edit Album"
+msgstr ""
+
+#: ../../mod/photos.php:984 ../../mod/photos.php:1396
+msgid "View Photo"
+msgstr ""
+
+#: ../../mod/photos.php:1019
+msgid "Permission denied. Access to this item may be restricted."
+msgstr ""
+
+#: ../../mod/photos.php:1021
+msgid "Photo not available"
+msgstr ""
+
+#: ../../mod/photos.php:1071
+msgid "View photo"
+msgstr ""
+
+#: ../../mod/photos.php:1071
+msgid "Edit photo"
+msgstr ""
+
+#: ../../mod/photos.php:1072
+msgid "Use as profile photo"
+msgstr ""
+
+#: ../../mod/photos.php:1078 ../../include/conversation.php:450
+msgid "Private Message"
+msgstr ""
+
+#: ../../mod/photos.php:1089
+msgid "View Full Size"
+msgstr ""
+
+#: ../../mod/photos.php:1157
+msgid "Tags: "
+msgstr ""
+
+#: ../../mod/photos.php:1160
+msgid "[Remove any tag]"
+msgstr ""
+
+#: ../../mod/photos.php:1171
+msgid "New album name"
+msgstr ""
+
+#: ../../mod/photos.php:1174
+msgid "Caption"
+msgstr ""
+
+#: ../../mod/photos.php:1176
+msgid "Add a Tag"
+msgstr ""
+
+#: ../../mod/photos.php:1180
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr ""
+
+#: ../../mod/photos.php:1200 ../../include/conversation.php:497
+msgid "I like this (toggle)"
+msgstr ""
+
+#: ../../mod/photos.php:1201 ../../include/conversation.php:498
+msgid "I don't like this (toggle)"
+msgstr ""
+
+#: ../../mod/photos.php:1202 ../../include/conversation.php:889
+msgid "Share"
+msgstr ""
+
+#: ../../mod/photos.php:1203 ../../mod/editpost.php:100
+#: ../../mod/message.php:155 ../../mod/message.php:296
+#: ../../include/conversation.php:321 ../../include/conversation.php:652
+#: ../../include/conversation.php:906
+msgid "Please wait"
+msgstr ""
+
+#: ../../mod/photos.php:1219 ../../mod/photos.php:1259
+#: ../../mod/photos.php:1290 ../../include/conversation.php:512
+msgid "This is you"
+msgstr ""
+
+#: ../../mod/photos.php:1221 ../../mod/photos.php:1261
+#: ../../mod/photos.php:1292 ../../include/conversation.php:514
+#: ../../boot.php:443
+msgid "Comment"
+msgstr ""
+
+#: ../../mod/photos.php:1223 ../../mod/editpost.php:119
+#: ../../include/conversation.php:516 ../../include/conversation.php:924
+msgid "Preview"
+msgstr ""
+
+#: ../../mod/photos.php:1320 ../../mod/settings.php:513
+#: ../../mod/group.php:154 ../../mod/admin.php:468
+#: ../../include/conversation.php:280 ../../include/conversation.php:536
+msgid "Delete"
+msgstr ""
+
+#: ../../mod/photos.php:1402
+msgid "View Album"
+msgstr ""
+
+#: ../../mod/photos.php:1411
+msgid "Recent Photos"
+msgstr ""
+
+#: ../../mod/community.php:21
+msgid "Not available."
+msgstr ""
+
+#: ../../mod/community.php:30 ../../include/nav.php:97
+msgid "Community"
+msgstr ""
+
+#: ../../mod/community.php:60 ../../mod/search.php:118
+msgid "No results."
+msgstr ""
+
+#: ../../mod/friendica.php:43
+msgid "This is Friendica, version"
+msgstr ""
+
+#: ../../mod/friendica.php:44
+msgid "running at web location"
+msgstr ""
+
+#: ../../mod/friendica.php:46
 msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
+"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
+"more about the Friendica project."
 msgstr ""
 
-#: ../../mod/newmember.php:38
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with "
-"each group privately on your Network page."
+#: ../../mod/friendica.php:48
+msgid "Bug reports and issues: please visit"
 msgstr ""
 
-#: ../../mod/newmember.php:40
+#: ../../mod/friendica.php:49
 msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program "
-"features and resources."
+"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
+"dot com"
 msgstr ""
 
-#: ../../mod/follow.php:20 ../../mod/dfrn_request.php:370
-msgid "Disallowed profile URL."
+#: ../../mod/friendica.php:54
+msgid "Installed plugins/addons/apps"
 msgstr ""
 
-#: ../../mod/follow.php:27
-msgid "Connect URL missing."
+#: ../../mod/friendica.php:62
+msgid "No installed plugins/addons/apps"
 msgstr ""
 
-#: ../../mod/follow.php:47
-msgid ""
-"This site is not configured to allow communications with other networks."
+#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
+msgid "Item not found"
 msgstr ""
 
-#: ../../mod/follow.php:48 ../../mod/follow.php:58
-msgid "No compatible communication protocols or feeds were discovered."
+#: ../../mod/editpost.php:32
+msgid "Edit post"
 msgstr ""
 
-#: ../../mod/follow.php:56
-msgid "The profile address specified does not provide adequate information."
+#: ../../mod/editpost.php:76 ../../include/conversation.php:875
+msgid "Post to Email"
 msgstr ""
 
-#: ../../mod/follow.php:60
-msgid "An author or name was not found."
+#: ../../mod/editpost.php:91 ../../mod/settings.php:512
+#: ../../include/conversation.php:523
+msgid "Edit"
 msgstr ""
 
-#: ../../mod/follow.php:62
-msgid "No browser URL could be matched to this address."
+#: ../../mod/editpost.php:92 ../../mod/message.php:153
+#: ../../mod/message.php:294 ../../include/conversation.php:890
+msgid "Upload photo"
 msgstr ""
 
-#: ../../mod/follow.php:69
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
+#: ../../mod/editpost.php:93 ../../include/conversation.php:892
+msgid "Attach file"
 msgstr ""
 
-#: ../../mod/follow.php:74
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
+#: ../../mod/editpost.php:94 ../../mod/message.php:154
+#: ../../mod/message.php:295 ../../include/conversation.php:894
+msgid "Insert web link"
 msgstr ""
 
-#: ../../mod/follow.php:144
-msgid "Unable to retrieve contact information."
+#: ../../mod/editpost.php:95
+msgid "Insert YouTube video"
 msgstr ""
 
-#: ../../mod/follow.php:190
-msgid "following"
+#: ../../mod/editpost.php:96
+msgid "Insert Vorbis [.ogg] video"
 msgstr ""
 
-#: ../../mod/dirfind.php:23
-msgid "People Search"
+#: ../../mod/editpost.php:97
+msgid "Insert Vorbis [.ogg] audio"
 msgstr ""
 
-#: ../../mod/dirfind.php:57 ../../mod/match.php:65
-msgid "No matches"
+#: ../../mod/editpost.php:98 ../../include/conversation.php:900
+msgid "Set your location"
 msgstr ""
 
-#: ../../mod/contacts.php:62 ../../mod/contacts.php:135
-msgid "Could not access contact record."
+#: ../../mod/editpost.php:99 ../../include/conversation.php:902
+msgid "Clear browser location"
 msgstr ""
 
-#: ../../mod/contacts.php:76
-msgid "Could not locate selected profile."
+#: ../../mod/editpost.php:101 ../../include/conversation.php:907
+msgid "Permission settings"
 msgstr ""
 
-#: ../../mod/contacts.php:99
-msgid "Contact updated."
+#: ../../mod/editpost.php:109 ../../include/conversation.php:916
+msgid "CC: email addresses"
 msgstr ""
 
-#: ../../mod/contacts.php:101 ../../mod/dfrn_request.php:439
-msgid "Failed to update contact record."
+#: ../../mod/editpost.php:110 ../../include/conversation.php:917
+msgid "Public post"
 msgstr ""
 
-#: ../../mod/contacts.php:157
-msgid "Contact has been blocked"
+#: ../../mod/editpost.php:113 ../../include/conversation.php:905
+msgid "Set title"
 msgstr ""
 
-#: ../../mod/contacts.php:157
-msgid "Contact has been unblocked"
+#: ../../mod/editpost.php:114 ../../include/conversation.php:919
+msgid "Example: bob@example.com, mary@example.com"
 msgstr ""
 
-#: ../../mod/contacts.php:171
-msgid "Contact has been ignored"
+#: ../../mod/dfrn_request.php:92
+msgid "This introduction has already been accepted."
 msgstr ""
 
-#: ../../mod/contacts.php:171
-msgid "Contact has been unignored"
+#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
+msgid "Profile location is not valid or does not contain profile information."
 msgstr ""
 
-#: ../../mod/contacts.php:192
-msgid "stopped following"
+#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
+msgid "Warning: profile location has no identifiable owner name."
 msgstr ""
 
-#: ../../mod/contacts.php:213
-msgid "Contact has been removed."
+#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
+msgid "Warning: profile location has no profile photo."
 msgstr ""
 
-#: ../../mod/contacts.php:234
+#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
 #, php-format
-msgid "You are mutual friends with %s"
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/dfrn_request.php:167
+msgid "Introduction complete."
 msgstr ""
 
-#: ../../mod/contacts.php:238
-#, php-format
-msgid "You are sharing with %s"
+#: ../../mod/dfrn_request.php:191
+msgid "Unrecoverable protocol error."
+msgstr ""
+
+#: ../../mod/dfrn_request.php:219
+msgid "Profile unavailable."
 msgstr ""
 
-#: ../../mod/contacts.php:243
+#: ../../mod/dfrn_request.php:244
 #, php-format
-msgid "%s is sharing with you"
+msgid "%s has received too many connection requests today."
 msgstr ""
 
-#: ../../mod/contacts.php:260
-msgid "Private communications are not available for this contact."
+#: ../../mod/dfrn_request.php:245
+msgid "Spam protection measures have been invoked."
 msgstr ""
 
-#: ../../mod/contacts.php:263
-msgid "Never"
+#: ../../mod/dfrn_request.php:246
+msgid "Friends are advised to please try again in 24 hours."
 msgstr ""
 
-#: ../../mod/contacts.php:267
-msgid "(Update was successful)"
+#: ../../mod/dfrn_request.php:306
+msgid "Invalid locator"
 msgstr ""
 
-#: ../../mod/contacts.php:267
-msgid "(Update was not successful)"
+#: ../../mod/dfrn_request.php:326
+msgid "Unable to resolve your name at the provided location."
 msgstr ""
 
-#: ../../mod/contacts.php:269
-msgid "Suggest friends"
+#: ../../mod/dfrn_request.php:339
+msgid "You have already introduced yourself here."
 msgstr ""
 
-#: ../../mod/contacts.php:273
+#: ../../mod/dfrn_request.php:343
 #, php-format
-msgid "Network type: %s"
+msgid "Apparently you are already friends with %s."
 msgstr ""
 
-#: ../../mod/contacts.php:276
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/dfrn_request.php:364
+msgid "Invalid profile URL."
+msgstr ""
 
-#: ../../mod/contacts.php:281
-msgid "View all contacts"
+#: ../../mod/dfrn_request.php:370 ../../mod/follow.php:20
+msgid "Disallowed profile URL."
 msgstr ""
 
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
-#: ../../mod/admin.php:470
-msgid "Unblock"
+#: ../../mod/dfrn_request.php:439 ../../mod/contacts.php:102
+msgid "Failed to update contact record."
 msgstr ""
 
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
-#: ../../mod/admin.php:469
-msgid "Block"
+#: ../../mod/dfrn_request.php:460
+msgid "Your introduction has been sent."
 msgstr ""
 
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-msgid "Unignore"
+#: ../../mod/dfrn_request.php:513
+msgid "Please login to confirm introduction."
 msgstr ""
 
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-#: ../../mod/notifications.php:47 ../../mod/notifications.php:149
-#: ../../mod/notifications.php:194
-msgid "Ignore"
+#: ../../mod/dfrn_request.php:527
+msgid ""
+"Incorrect identity currently logged in. Please login to <strong>this</"
+"strong> profile."
 msgstr ""
 
-#: ../../mod/contacts.php:296
-msgid "Repair"
+#: ../../mod/dfrn_request.php:539
+#, php-format
+msgid "Welcome home %s."
 msgstr ""
 
-#: ../../mod/contacts.php:306
-msgid "Contact Editor"
+#: ../../mod/dfrn_request.php:540
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
 msgstr ""
 
-#: ../../mod/contacts.php:308 ../../mod/settings.php:447
-#: ../../mod/settings.php:586 ../../mod/settings.php:767
-#: ../../mod/crepair.php:162 ../../mod/manage.php:106
-#: ../../mod/profiles.php:375 ../../mod/localtime.php:45
-#: ../../mod/invite.php:106 ../../mod/fsuggest.php:107
-#: ../../mod/install.php:250 ../../mod/install.php:288 ../../mod/admin.php:296
-#: ../../mod/admin.php:461 ../../mod/admin.php:587 ../../mod/admin.php:652
-#: ../../mod/photos.php:888 ../../mod/photos.php:946 ../../mod/photos.php:1165
-#: ../../mod/photos.php:1205 ../../mod/photos.php:1245
-#: ../../mod/photos.php:1276 ../../mod/group.php:84 ../../mod/group.php:167
-#: ../../mod/events.php:333 ../../include/conversation.php:488
-#: ../../addon/facebook/facebook.php:410 ../../addon/wppost/wppost.php:101
-#: ../../addon/uhremotestorage/uhremotestorage.php:58
-#: ../../addon/tumblr/tumblr.php:89 ../../addon/oembed/oembed.php:41
-#: ../../addon/posterous/posterous.php:89
-#: ../../addon/statusnet/statusnet.php:282
-#: ../../addon/statusnet/statusnet.php:296
-#: ../../addon/statusnet/statusnet.php:322
-#: ../../addon/statusnet/statusnet.php:329
-#: ../../addon/statusnet/statusnet.php:351
-#: ../../addon/statusnet/statusnet.php:486 ../../addon/twitter/twitter.php:179
-#: ../../addon/twitter/twitter.php:202 ../../addon/twitter/twitter.php:299
-#: ../../addon/impressum/impressum.php:69 ../../addon/piwik/piwik.php:81
-#: ../../addon/pageheader/pageheader.php:52
-#: ../../addon/randplace/randplace.php:178 ../../addon/blockem/blockem.php:53
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Submit"
+#: ../../mod/dfrn_request.php:541
+msgid "Confirm"
 msgstr ""
 
-#: ../../mod/contacts.php:309
-msgid "Profile Visibility"
+#: ../../mod/dfrn_request.php:581 ../../include/items.php:2443
+msgid "[Name Withheld]"
 msgstr ""
 
-#: ../../mod/contacts.php:310
+#: ../../mod/dfrn_request.php:665
 #, php-format
 msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
+"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
+"your Diaspora search bar."
 msgstr ""
 
-#: ../../mod/contacts.php:311
-msgid "Contact Information / Notes"
+#: ../../mod/dfrn_request.php:668
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"social networks:"
 msgstr ""
 
-#: ../../mod/contacts.php:312
-msgid "Edit contact notes"
+#: ../../mod/dfrn_request.php:671
+msgid "Friend/Connection Request"
 msgstr ""
 
-#: ../../mod/contacts.php:317 ../../mod/contacts.php:433
-#: ../../mod/viewcontacts.php:61
+#: ../../mod/dfrn_request.php:672
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
+msgstr ""
+
+#: ../../mod/dfrn_request.php:673
+msgid "Please answer the following:"
+msgstr ""
+
+#: ../../mod/dfrn_request.php:674
 #, php-format
-msgid "Visit %s's profile [%s]"
+msgid "Does %s know you?"
 msgstr ""
 
-#: ../../mod/contacts.php:318
-msgid "Block/Unblock contact"
+#: ../../mod/dfrn_request.php:677
+msgid "Add a personal note:"
 msgstr ""
 
-#: ../../mod/contacts.php:319
-msgid "Ignore contact"
+#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
+msgid "Friendica"
 msgstr ""
 
-#: ../../mod/contacts.php:320
-msgid "Repair URL settings"
+#: ../../mod/dfrn_request.php:680
+msgid "StatusNet/Federated Social Web"
 msgstr ""
 
-#: ../../mod/contacts.php:321
-msgid "View conversations"
+#: ../../mod/dfrn_request.php:681 ../../mod/settings.php:548
+#: ../../include/contact_selectors.php:80
+msgid "Diaspora"
 msgstr ""
 
-#: ../../mod/contacts.php:323
-msgid "Delete contact"
+#: ../../mod/dfrn_request.php:682
+msgid "- please share from your own site as noted above"
 msgstr ""
 
-#: ../../mod/contacts.php:327
-msgid "Last update:"
+#: ../../mod/dfrn_request.php:683
+msgid "Your Identity Address:"
 msgstr ""
 
-#: ../../mod/contacts.php:328
-msgid "Update public posts"
+#: ../../mod/dfrn_request.php:684
+msgid "Submit Request"
 msgstr ""
 
-#: ../../mod/contacts.php:330 ../../mod/admin.php:701
-msgid "Update now"
+#: ../../mod/install.php:111
+msgid "Friendica Social Communications Server - Setup"
 msgstr ""
 
-#: ../../mod/contacts.php:337
-msgid "Currently blocked"
+#: ../../mod/install.php:117 ../../mod/install.php:157
+#: ../../mod/install.php:230
+msgid "Database connection"
 msgstr ""
 
-#: ../../mod/contacts.php:338
-msgid "Currently ignored"
+#: ../../mod/install.php:124
+msgid "Could not connect to database."
 msgstr ""
 
-#: ../../mod/contacts.php:339 ../../mod/notifications.php:144
-#: ../../mod/notifications.php:189
-msgid "Hide this contact from others"
+#: ../../mod/install.php:128
+msgid "Could not create table."
 msgstr ""
 
-#: ../../mod/contacts.php:339
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
+#: ../../mod/install.php:133
+msgid "Your Friendica site database has been installed."
 msgstr ""
 
-#: ../../mod/contacts.php:367 ../../include/nav.php:130
-msgid "Contacts"
+#: ../../mod/install.php:134
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
 msgstr ""
 
-#: ../../mod/contacts.php:369
-msgid "Show Blocked Connections"
+#: ../../mod/install.php:135 ../../mod/install.php:151
+#: ../../mod/install.php:209
+msgid "Please see the file \"INSTALL.txt\"."
 msgstr ""
 
-#: ../../mod/contacts.php:369
-msgid "Hide Blocked Connections"
+#: ../../mod/install.php:137
+msgid "Proceed to registration"
 msgstr ""
 
-#: ../../mod/contacts.php:371
-msgid "Search your contacts"
+#: ../../mod/install.php:143
+msgid "Proceed with Installation"
 msgstr ""
 
-#: ../../mod/contacts.php:409
-msgid "Mutual Friendship"
+#: ../../mod/install.php:150
+msgid ""
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
 msgstr ""
 
-#: ../../mod/contacts.php:413
-msgid "is a fan of yours"
+#: ../../mod/install.php:158
+msgid "Database import failed."
 msgstr ""
 
-#: ../../mod/contacts.php:417
-msgid "you are a fan of"
+#: ../../mod/install.php:206
+msgid "System check"
 msgstr ""
 
-#: ../../mod/contacts.php:434 ../../include/Contact.php:129
-#: ../../include/conversation.php:727
-msgid "Edit contact"
+#: ../../mod/install.php:211
+msgid "Check again"
 msgstr ""
 
-#: ../../mod/settings.php:11 ../../mod/photos.php:64
-msgid "everybody"
+#: ../../mod/install.php:231
+msgid ""
+"In order to install Friendica we need to know how to connect to your "
+"database."
 msgstr ""
 
-#: ../../mod/settings.php:69
-msgid "Missing some important data!"
+#: ../../mod/install.php:232
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
 msgstr ""
 
-#: ../../mod/settings.php:72 ../../mod/settings.php:473 ../../mod/admin.php:62
-msgid "Update"
+#: ../../mod/install.php:233
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
 msgstr ""
 
-#: ../../mod/settings.php:167
-msgid "Failed to connect with email account using the settings provided."
+#: ../../mod/install.php:237
+msgid "Database Server Name"
 msgstr ""
 
-#: ../../mod/settings.php:172
-msgid "Email settings updated."
+#: ../../mod/install.php:238
+msgid "Database Login Name"
 msgstr ""
 
-#: ../../mod/settings.php:190
-msgid "Passwords do not match. Password unchanged."
+#: ../../mod/install.php:239
+msgid "Database Login Password"
 msgstr ""
 
-#: ../../mod/settings.php:195
-msgid "Empty passwords are not allowed. Password unchanged."
+#: ../../mod/install.php:240
+msgid "Database Name"
 msgstr ""
 
-#: ../../mod/settings.php:206
-msgid "Password changed."
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid "Site administrator email address"
 msgstr ""
 
-#: ../../mod/settings.php:208
-msgid "Password update failed. Please try again."
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
 msgstr ""
 
-#: ../../mod/settings.php:272
-msgid " Please use a shorter name."
+#: ../../mod/install.php:245 ../../mod/install.php:283
+msgid "Please select a default timezone for your website"
 msgstr ""
 
-#: ../../mod/settings.php:274
-msgid " Name too short."
+#: ../../mod/install.php:270
+msgid "Site settings"
 msgstr ""
 
-#: ../../mod/settings.php:280
-msgid " Not valid email."
+#: ../../mod/install.php:323
+msgid "Could not find a command line version of PHP in the web server PATH."
 msgstr ""
 
-#: ../../mod/settings.php:282
-msgid " Cannot change to that email."
+#: ../../mod/install.php:326
+msgid "PHP executable path"
 msgstr ""
 
-#: ../../mod/settings.php:350 ../../addon/facebook/facebook.php:320
-#: ../../addon/twitter/twitter.php:294 ../../addon/impressum/impressum.php:64
-#: ../../addon/piwik/piwik.php:94
-msgid "Settings updated."
+#: ../../mod/install.php:326
+msgid "Enter full path to php executable"
 msgstr ""
 
-#: ../../mod/settings.php:409 ../../include/nav.php:128
-msgid "Account settings"
+#: ../../mod/install.php:331
+msgid "Command line PHP"
 msgstr ""
 
-#: ../../mod/settings.php:414
-msgid "Connector settings"
+#: ../../mod/install.php:340
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
 msgstr ""
 
-#: ../../mod/settings.php:419
-msgid "Plugin settings"
+#: ../../mod/install.php:341
+msgid "This is required for message delivery to work."
 msgstr ""
 
-#: ../../mod/settings.php:424
-msgid "Connections"
+#: ../../mod/install.php:343
+msgid "PHP \"register_argc_argv\""
 msgstr ""
 
-#: ../../mod/settings.php:429
-msgid "Export personal data"
+#: ../../mod/install.php:364
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
 msgstr ""
 
-#: ../../mod/settings.php:446 ../../mod/settings.php:472
-#: ../../mod/settings.php:505
-msgid "Add application"
+#: ../../mod/install.php:365
+msgid ""
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
 msgstr ""
 
-#: ../../mod/settings.php:448 ../../mod/settings.php:474
-#: ../../mod/dfrn_request.php:685 ../../mod/tagrm.php:11
-#: ../../mod/tagrm.php:94 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
+#: ../../mod/install.php:367
+msgid "Generate encryption keys"
 msgstr ""
 
-#: ../../mod/settings.php:449 ../../mod/settings.php:475
-#: ../../mod/crepair.php:144 ../../mod/admin.php:464 ../../mod/admin.php:473
-msgid "Name"
+#: ../../mod/install.php:374
+msgid "libCurl PHP module"
 msgstr ""
 
-#: ../../mod/settings.php:450 ../../mod/settings.php:476
-#: ../../addon/statusnet/statusnet.php:480
-msgid "Consumer Key"
+#: ../../mod/install.php:375
+msgid "GD graphics PHP module"
 msgstr ""
 
-#: ../../mod/settings.php:451 ../../mod/settings.php:477
-#: ../../addon/statusnet/statusnet.php:479
-msgid "Consumer Secret"
+#: ../../mod/install.php:376
+msgid "OpenSSL PHP module"
 msgstr ""
 
-#: ../../mod/settings.php:452 ../../mod/settings.php:478
-msgid "Redirect"
+#: ../../mod/install.php:377
+msgid "mysqli PHP module"
 msgstr ""
 
-#: ../../mod/settings.php:453 ../../mod/settings.php:479
-msgid "Icon url"
+#: ../../mod/install.php:378
+msgid "mb_string PHP module"
 msgstr ""
 
-#: ../../mod/settings.php:464
-msgid "You can't edit this application."
+#: ../../mod/install.php:383 ../../mod/install.php:385
+msgid "Apace mod_rewrite module"
 msgstr ""
 
-#: ../../mod/settings.php:504
-msgid "Connected Apps"
+#: ../../mod/install.php:383
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
 msgstr ""
 
-#: ../../mod/settings.php:506 ../../mod/editpost.php:90
-#: ../../include/conversation.php:496
-msgid "Edit"
+#: ../../mod/install.php:390
+msgid "Error: libCURL PHP module required but not installed."
 msgstr ""
 
-#: ../../mod/settings.php:507 ../../mod/admin.php:468
-#: ../../mod/photos.php:1303 ../../mod/group.php:154
-#: ../../include/conversation.php:253 ../../include/conversation.php:509
-msgid "Delete"
+#: ../../mod/install.php:394
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
 msgstr ""
 
-#: ../../mod/settings.php:508
-msgid "Client key starts with"
+#: ../../mod/install.php:398
+msgid "Error: openssl PHP module required but not installed."
 msgstr ""
 
-#: ../../mod/settings.php:509
-msgid "No name"
+#: ../../mod/install.php:402
+msgid "Error: mysqli PHP module required but not installed."
 msgstr ""
 
-#: ../../mod/settings.php:510
-msgid "Remove authorization"
+#: ../../mod/install.php:406
+msgid "Error: mb_string PHP module required but not installed."
 msgstr ""
 
-#: ../../mod/settings.php:522
-msgid "No Plugin settings configured"
+#: ../../mod/install.php:423
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\" "
+"in the top folder of your web server and it is unable to do so."
 msgstr ""
 
-#: ../../mod/settings.php:529 ../../addon/widgets/widgets.php:122
-msgid "Plugin Settings"
+#: ../../mod/install.php:424
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
 msgstr ""
 
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
+#: ../../mod/install.php:425
+msgid ""
+"Please check with your site documentation or support people to see if this "
+"situation can be corrected."
 msgstr ""
 
-#: ../../mod/settings.php:542 ../../mod/dfrn_request.php:681
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
+#: ../../mod/install.php:426
+msgid ""
+"If not, you may be required to perform a manual installation. Please see the "
+"file \"INSTALL.txt\" for instructions."
 msgstr ""
 
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-msgid "enabled"
+#: ../../mod/install.php:429
+msgid ".htconfig.php is writable"
 msgstr ""
 
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-msgid "disabled"
+#: ../../mod/install.php:436
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
 msgstr ""
 
-#: ../../mod/settings.php:543
-msgid "StatusNet"
+#: ../../mod/install.php:461
+msgid "Errors encountered creating database tables."
 msgstr ""
 
-#: ../../mod/settings.php:569
-msgid "Connector Settings"
+#: ../../mod/localtime.php:12 ../../include/event.php:11
+#: ../../include/bb2diaspora.php:249
+msgid "l F d, Y \\@ g:i A"
 msgstr ""
 
-#: ../../mod/settings.php:575
-msgid "Email/Mailbox Setup"
+#: ../../mod/localtime.php:24
+msgid "Time Conversion"
 msgstr ""
 
-#: ../../mod/settings.php:576
+#: ../../mod/localtime.php:26
 msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
+"Friendika provides this service for sharing events with other networks and "
+"friends in unknown timezones."
 msgstr ""
 
-#: ../../mod/settings.php:577
-msgid "Last successful email check:"
+#: ../../mod/localtime.php:30
+#, php-format
+msgid "UTC time: %s"
 msgstr ""
 
-#: ../../mod/settings.php:578
-msgid "Email access is disabled on this site."
+#: ../../mod/localtime.php:33
+#, php-format
+msgid "Current timezone: %s"
 msgstr ""
 
-#: ../../mod/settings.php:579
-msgid "IMAP server name:"
+#: ../../mod/localtime.php:36
+#, php-format
+msgid "Converted localtime: %s"
 msgstr ""
 
-#: ../../mod/settings.php:580
-msgid "IMAP port:"
+#: ../../mod/localtime.php:41
+msgid "Please select your timezone:"
 msgstr ""
 
-#: ../../mod/settings.php:581
-msgid "Security:"
+#: ../../mod/match.php:12
+msgid "Profile Match"
 msgstr ""
 
-#: ../../mod/settings.php:581
-msgid "None"
+#: ../../mod/match.php:20
+msgid "No keywords to match. Please add keywords to your default profile."
 msgstr ""
 
-#: ../../mod/settings.php:582
-msgid "Email login name:"
+#: ../../mod/match.php:57
+msgid "is interested in:"
 msgstr ""
 
-#: ../../mod/settings.php:583
-msgid "Email password:"
+#: ../../mod/match.php:58 ../../mod/suggest.php:59
+#: ../../include/contact_widgets.php:9 ../../boot.php:926
+msgid "Connect"
 msgstr ""
 
-#: ../../mod/settings.php:584
-msgid "Reply-to address:"
+#: ../../mod/match.php:65 ../../mod/dirfind.php:57
+msgid "No matches"
 msgstr ""
 
-#: ../../mod/settings.php:585
-msgid "Send public posts to all email contacts:"
+#: ../../mod/lockview.php:39
+msgid "Remote privacy information not available."
 msgstr ""
 
-#: ../../mod/settings.php:642 ../../mod/admin.php:126 ../../mod/admin.php:443
-msgid "Normal Account"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
 msgstr ""
 
-#: ../../mod/settings.php:643
-msgid "This account is a normal personal profile"
+#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#, php-format
+msgid "Welcome to %s"
 msgstr ""
 
-#: ../../mod/settings.php:646 ../../mod/admin.php:127 ../../mod/admin.php:444
-msgid "Soapbox Account"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
 msgstr ""
 
-#: ../../mod/settings.php:647
-msgid "Automatically approve all connection/friend requests as read-only fans"
+#: ../../mod/notifications.php:35 ../../mod/notifications.php:152
+#: ../../mod/notifications.php:198
+msgid "Discard"
 msgstr ""
 
-#: ../../mod/settings.php:650 ../../mod/admin.php:128 ../../mod/admin.php:445
-msgid "Community/Celebrity Account"
+#: ../../mod/notifications.php:47 ../../mod/notifications.php:151
+#: ../../mod/notifications.php:197 ../../mod/contacts.php:302
+#: ../../mod/contacts.php:345
+msgid "Ignore"
 msgstr ""
 
-#: ../../mod/settings.php:651
-msgid "Automatically approve all connection/friend requests as read-write fans"
+#: ../../mod/notifications.php:71 ../../include/nav.php:109
+msgid "Network"
 msgstr ""
 
-#: ../../mod/settings.php:654 ../../mod/admin.php:129 ../../mod/admin.php:446
-msgid "Automatic Friend Account"
+#: ../../mod/notifications.php:76 ../../mod/network.php:177
+msgid "Personal"
 msgstr ""
 
-#: ../../mod/settings.php:655
-msgid "Automatically approve all connection/friend requests as friends"
+#: ../../mod/notifications.php:81 ../../include/nav.php:73
+#: ../../include/nav.php:111
+msgid "Home"
 msgstr ""
 
-#: ../../mod/settings.php:665
-msgid "OpenID:"
+#: ../../mod/notifications.php:86 ../../include/nav.php:117
+msgid "Introductions"
 msgstr ""
 
-#: ../../mod/settings.php:665
-msgid "(Optional) Allow this OpenID to login to this account."
+#: ../../mod/notifications.php:91 ../../mod/message.php:76
+#: ../../include/nav.php:123
+msgid "Messages"
 msgstr ""
 
-#: ../../mod/settings.php:675
-msgid "Publish your default profile in your local site directory?"
+#: ../../mod/notifications.php:110
+msgid "Show Ignored Requests"
 msgstr ""
 
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:676
-#: ../../mod/profiles.php:358 ../../mod/register.php:525 ../../mod/api.php:106
-msgid "No"
+#: ../../mod/notifications.php:110
+msgid "Hide Ignored Requests"
 msgstr ""
 
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:675
-#: ../../mod/profiles.php:357 ../../mod/register.php:524 ../../mod/api.php:105
-msgid "Yes"
+#: ../../mod/notifications.php:136 ../../mod/notifications.php:182
+msgid "Notification type: "
 msgstr ""
 
-#: ../../mod/settings.php:681
-msgid "Publish your default profile in the global social directory?"
+#: ../../mod/notifications.php:137
+msgid "Friend Suggestion"
 msgstr ""
 
-#: ../../mod/settings.php:689
-msgid "Hide your contact/friend list from viewers of your default profile?"
+#: ../../mod/notifications.php:139
+#, php-format
+msgid "suggested by %s"
 msgstr ""
 
-#: ../../mod/settings.php:693
-msgid "Hide your profile details from unknown viewers?"
+#: ../../mod/notifications.php:144 ../../mod/notifications.php:191
+#: ../../mod/contacts.php:350
+msgid "Hide this contact from others"
 msgstr ""
 
-#: ../../mod/settings.php:698
-msgid "Allow friends to post to your profile page?"
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "Post a new friend activity"
 msgstr ""
 
-#: ../../mod/settings.php:704
-msgid "Allow friends to tag your posts?"
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "if applicable"
 msgstr ""
 
-#: ../../mod/settings.php:710
-msgid "Allow us to suggest you as a potential friend to new members?"
+#: ../../mod/notifications.php:148 ../../mod/notifications.php:195
+#: ../../mod/admin.php:466
+msgid "Approve"
 msgstr ""
 
-#: ../../mod/settings.php:719
-msgid "Profile is <strong>not published</strong>."
+#: ../../mod/notifications.php:168
+msgid "Claims to be known to you: "
 msgstr ""
 
-#: ../../mod/settings.php:738 ../../mod/profile_photo.php:206
-msgid "or"
+#: ../../mod/notifications.php:168
+msgid "yes"
 msgstr ""
 
-#: ../../mod/settings.php:743
-msgid "Your Identity Address is"
+#: ../../mod/notifications.php:168
+msgid "no"
 msgstr ""
 
-#: ../../mod/settings.php:754
-msgid "Automatically expire posts after days:"
+#: ../../mod/notifications.php:175
+msgid "Approve as: "
 msgstr ""
 
-#: ../../mod/settings.php:754
-msgid "If empty, posts will not expire. Expired posts will be deleted"
+#: ../../mod/notifications.php:176
+msgid "Friend"
 msgstr ""
 
-#: ../../mod/settings.php:755
-msgid "Advanced expiration settings"
+#: ../../mod/notifications.php:177
+msgid "Sharer"
 msgstr ""
 
-#: ../../mod/settings.php:756
-msgid "Advanced Expiration"
+#: ../../mod/notifications.php:177
+msgid "Fan/Admirer"
 msgstr ""
 
-#: ../../mod/settings.php:757
-msgid "Expire posts:"
+#: ../../mod/notifications.php:183
+msgid "Friend/Connect Request"
 msgstr ""
 
-#: ../../mod/settings.php:758
-msgid "Expire personal notes:"
+#: ../../mod/notifications.php:183
+msgid "New Follower"
 msgstr ""
 
-#: ../../mod/settings.php:759
-msgid "Expire starred posts:"
+#: ../../mod/notifications.php:204
+msgid "No introductions."
 msgstr ""
 
-#: ../../mod/settings.php:760
-msgid "Expire photos:"
+#: ../../mod/notifications.php:207 ../../mod/notifications.php:293
+#: ../../mod/notifications.php:388 ../../mod/notifications.php:469
+#: ../../include/nav.php:118
+msgid "Notifications"
 msgstr ""
 
-#: ../../mod/settings.php:765
-msgid "Account Settings"
+#: ../../mod/notifications.php:244 ../../mod/notifications.php:339
+#: ../../mod/notifications.php:426
+#, php-format
+msgid "%s liked %s's post"
 msgstr ""
 
-#: ../../mod/settings.php:773
-msgid "Password Settings"
+#: ../../mod/notifications.php:253 ../../mod/notifications.php:348
+#: ../../mod/notifications.php:435
+#, php-format
+msgid "%s disliked %s's post"
 msgstr ""
 
-#: ../../mod/settings.php:774
-msgid "New Password:"
+#: ../../mod/notifications.php:267 ../../mod/notifications.php:362
+#: ../../mod/notifications.php:449
+#, php-format
+msgid "%s is now friends with %s"
 msgstr ""
 
-#: ../../mod/settings.php:775
-msgid "Confirm:"
+#: ../../mod/notifications.php:274 ../../mod/notifications.php:369
+#, php-format
+msgid "%s created a new post"
 msgstr ""
 
-#: ../../mod/settings.php:775
-msgid "Leave password fields blank unless changing"
+#: ../../mod/notifications.php:275 ../../mod/notifications.php:370
+#: ../../mod/notifications.php:458
+#, php-format
+msgid "%s commented on %s's post"
 msgstr ""
 
-#: ../../mod/settings.php:779
-msgid "Basic Settings"
+#: ../../mod/notifications.php:289
+msgid "No more network notifications."
 msgstr ""
 
-#: ../../mod/settings.php:780 ../../include/profile_advanced.php:15
-msgid "Full Name:"
+#: ../../mod/notifications.php:384
+msgid "No more personal notifications."
 msgstr ""
 
-#: ../../mod/settings.php:781
-msgid "Email Address:"
+#: ../../mod/notifications.php:465
+msgid "No more home notifications."
 msgstr ""
 
-#: ../../mod/settings.php:782
-msgid "Your Timezone:"
+#: ../../mod/contacts.php:63 ../../mod/contacts.php:143
+msgid "Could not access contact record."
 msgstr ""
 
-#: ../../mod/settings.php:783
-msgid "Default Post Location:"
+#: ../../mod/contacts.php:77
+msgid "Could not locate selected profile."
 msgstr ""
 
-#: ../../mod/settings.php:784
-msgid "Use Browser Location:"
+#: ../../mod/contacts.php:100
+msgid "Contact updated."
 msgstr ""
 
-#: ../../mod/settings.php:785
-msgid "Display Theme:"
+#: ../../mod/contacts.php:165
+msgid "Contact has been blocked"
 msgstr ""
 
-#: ../../mod/settings.php:786
-msgid "Update browser every xx seconds"
+#: ../../mod/contacts.php:165
+msgid "Contact has been unblocked"
 msgstr ""
 
-#: ../../mod/settings.php:786
-msgid "Minimum of 10 seconds, no maximum"
+#: ../../mod/contacts.php:179
+msgid "Contact has been ignored"
 msgstr ""
 
-#: ../../mod/settings.php:788
-msgid "Security and Privacy Settings"
+#: ../../mod/contacts.php:179
+msgid "Contact has been unignored"
 msgstr ""
 
-#: ../../mod/settings.php:790
-msgid "Maximum Friend Requests/Day:"
+#: ../../mod/contacts.php:200
+msgid "stopped following"
 msgstr ""
 
-#: ../../mod/settings.php:790
-msgid "(to prevent spam abuse)"
+#: ../../mod/contacts.php:221
+msgid "Contact has been removed."
 msgstr ""
 
-#: ../../mod/settings.php:791
-msgid "Default Post Permissions"
+#: ../../mod/contacts.php:245
+#, php-format
+msgid "You are mutual friends with %s"
 msgstr ""
 
-#: ../../mod/settings.php:792
-msgid "(click to open/close)"
+#: ../../mod/contacts.php:249
+#, php-format
+msgid "You are sharing with %s"
 msgstr ""
 
-#: ../../mod/settings.php:807
-msgid "Notification Settings"
+#: ../../mod/contacts.php:254
+#, php-format
+msgid "%s is sharing with you"
 msgstr ""
 
-#: ../../mod/settings.php:808
-msgid "Send a notification email when:"
+#: ../../mod/contacts.php:271
+msgid "Private communications are not available for this contact."
 msgstr ""
 
-#: ../../mod/settings.php:809
-msgid "You receive an introduction"
+#: ../../mod/contacts.php:274
+msgid "Never"
 msgstr ""
 
-#: ../../mod/settings.php:810
-msgid "Your introductions are confirmed"
+#: ../../mod/contacts.php:278
+msgid "(Update was successful)"
 msgstr ""
 
-#: ../../mod/settings.php:811
-msgid "Someone writes on your profile wall"
+#: ../../mod/contacts.php:278
+msgid "(Update was not successful)"
 msgstr ""
 
-#: ../../mod/settings.php:812
-msgid "Someone writes a followup comment"
+#: ../../mod/contacts.php:280
+msgid "Suggest friends"
 msgstr ""
 
-#: ../../mod/settings.php:813
-msgid "You receive a private message"
+#: ../../mod/contacts.php:284
+#, php-format
+msgid "Network type: %s"
 msgstr ""
 
-#: ../../mod/settings.php:814
-msgid "You receive a friend suggestion"
+#: ../../mod/contacts.php:287
+#, php-format
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/contacts.php:292
+msgid "View all contacts"
 msgstr ""
 
-#: ../../mod/settings.php:817
-msgid "Advanced Page Settings"
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
+#: ../../mod/admin.php:470
+msgid "Unblock"
 msgstr ""
 
-#: ../../mod/crepair.php:100
-msgid "Contact settings applied."
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
+#: ../../mod/admin.php:469
+msgid "Block"
 msgstr ""
 
-#: ../../mod/crepair.php:102
-msgid "Contact update failed."
+#: ../../mod/contacts.php:302 ../../mod/contacts.php:345
+msgid "Unignore"
 msgstr ""
 
-#: ../../mod/crepair.php:127 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:116
-msgid "Contact not found."
+#: ../../mod/contacts.php:307
+msgid "Repair"
 msgstr ""
 
-#: ../../mod/crepair.php:133
-msgid "Repair Contact Settings"
+#: ../../mod/contacts.php:317
+msgid "Contact Editor"
 msgstr ""
 
-#: ../../mod/crepair.php:135
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
-"information your communications with this contact may stop working."
+#: ../../mod/contacts.php:320
+msgid "Profile Visibility"
 msgstr ""
 
-#: ../../mod/crepair.php:136
+#: ../../mod/contacts.php:321
+#, php-format
 msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
 msgstr ""
 
-#: ../../mod/crepair.php:145
-msgid "Account Nickname"
+#: ../../mod/contacts.php:322
+msgid "Contact Information / Notes"
 msgstr ""
 
-#: ../../mod/crepair.php:146
-msgid "@Tagname - overrides Name/Nickname"
+#: ../../mod/contacts.php:323
+msgid "Edit contact notes"
 msgstr ""
 
-#: ../../mod/crepair.php:147
-msgid "Account URL"
+#: ../../mod/contacts.php:328 ../../mod/contacts.php:458
+#: ../../mod/viewcontacts.php:61
+#, php-format
+msgid "Visit %s's profile [%s]"
 msgstr ""
 
-#: ../../mod/crepair.php:148
-msgid "Friend Request URL"
+#: ../../mod/contacts.php:329
+msgid "Block/Unblock contact"
 msgstr ""
 
-#: ../../mod/crepair.php:149
-msgid "Friend Confirm URL"
+#: ../../mod/contacts.php:330
+msgid "Ignore contact"
 msgstr ""
 
-#: ../../mod/crepair.php:150
-msgid "Notification Endpoint URL"
+#: ../../mod/contacts.php:331
+msgid "Repair URL settings"
 msgstr ""
 
-#: ../../mod/crepair.php:151
-msgid "Poll/Feed URL"
+#: ../../mod/contacts.php:332
+msgid "View conversations"
 msgstr ""
 
-#: ../../mod/crepair.php:152
-msgid "New photo from this URL"
+#: ../../mod/contacts.php:334
+msgid "Delete contact"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:92
-msgid "This introduction has already been accepted."
+#: ../../mod/contacts.php:338
+msgid "Last update:"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
-msgid "Profile location is not valid or does not contain profile information."
+#: ../../mod/contacts.php:339
+msgid "Update public posts"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
-msgid "Warning: profile location has no identifiable owner name."
+#: ../../mod/contacts.php:341 ../../mod/admin.php:701
+msgid "Update now"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
-msgid "Warning: profile location has no profile photo."
+#: ../../mod/contacts.php:348
+msgid "Currently blocked"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/contacts.php:349
+msgid "Currently ignored"
+msgstr ""
 
-#: ../../mod/dfrn_request.php:167
-msgid "Introduction complete."
+#: ../../mod/contacts.php:350
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:191
-msgid "Unrecoverable protocol error."
+#: ../../mod/contacts.php:387 ../../include/nav.php:131
+msgid "Contacts"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:219
-msgid "Profile unavailable."
+#: ../../mod/contacts.php:389
+msgid "Show Unblocked Contacts"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:244
-#, php-format
-msgid "%s has received too many connection requests today."
+#: ../../mod/contacts.php:389
+msgid "Show Blocked Contacts"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:245
-msgid "Spam protection measures have been invoked."
+#: ../../mod/contacts.php:391
+msgid "Show All Contacts"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:246
-msgid "Friends are advised to please try again in 24 hours."
+#: ../../mod/contacts.php:393
+msgid "Search your contacts"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:306
-msgid "Invalid locator"
+#: ../../mod/contacts.php:394 ../../mod/directory.php:65
+msgid "Finding: "
 msgstr ""
 
-#: ../../mod/dfrn_request.php:326
-msgid "Unable to resolve your name at the provided location."
+#: ../../mod/contacts.php:395 ../../mod/directory.php:67
+#: ../../include/contact_widgets.php:34
+msgid "Find"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:339
-msgid "You have already introduced yourself here."
+#: ../../mod/contacts.php:434
+msgid "Mutual Friendship"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:343
-#, php-format
-msgid "Apparently you are already friends with %s."
+#: ../../mod/contacts.php:438
+msgid "is a fan of yours"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:364
-msgid "Invalid profile URL."
+#: ../../mod/contacts.php:442
+msgid "you are a fan of"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:460
-msgid "Your introduction has been sent."
+#: ../../mod/contacts.php:459 ../../include/Contact.php:135
+#: ../../include/conversation.php:748
+msgid "Edit contact"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:513
-msgid "Please login to confirm introduction."
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
 msgstr ""
 
-#: ../../mod/dfrn_request.php:527
-msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+#: ../../mod/lostpass.php:31
+msgid "Password reset request issued. Check your email."
 msgstr ""
 
-#: ../../mod/dfrn_request.php:539
+#: ../../mod/lostpass.php:42
 #, php-format
-msgid "Welcome home %s."
+msgid "Password reset requested at %s"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:540
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
+#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
+#: ../../mod/register.php:380 ../../mod/register.php:434
+#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:716
+#: ../../include/items.php:2452
+msgid "Administrator"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:541
-msgid "Confirm"
+#: ../../mod/lostpass.php:64
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
 msgstr ""
 
-#: ../../mod/dfrn_request.php:581 ../../include/items.php:2406
-msgid "[Name Withheld]"
+#: ../../mod/lostpass.php:82 ../../boot.php:719
+msgid "Password Reset"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:665
-#, php-format
-msgid ""
-"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
-"your Diaspora search bar."
+#: ../../mod/lostpass.php:83
+msgid "Your password has been reset as requested."
 msgstr ""
 
-#: ../../mod/dfrn_request.php:668
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"social networks:"
+#: ../../mod/lostpass.php:84
+msgid "Your new password is"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:671
-msgid "Friend/Connection Request"
+#: ../../mod/lostpass.php:85
+msgid "Save or copy your new password - and then"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:672
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../mod/lostpass.php:86
+msgid "click here to login"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:673
-msgid "Please answer the following:"
+#: ../../mod/lostpass.php:87
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
 msgstr ""
 
-#: ../../mod/dfrn_request.php:674
-#, php-format
-msgid "Does %s know you?"
+#: ../../mod/lostpass.php:118
+msgid "Forgot your Password?"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:677
-msgid "Add a personal note:"
+#: ../../mod/lostpass.php:119
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
 msgstr ""
 
-#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
-msgid "Friendica"
+#: ../../mod/lostpass.php:120
+msgid "Nickname or Email: "
 msgstr ""
 
-#: ../../mod/dfrn_request.php:680
-msgid "StatusNet/Federated Social Web"
+#: ../../mod/lostpass.php:121
+msgid "Reset"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:682
-msgid "- please share from your own site as noted above"
+#: ../../mod/settings.php:70
+msgid "Missing some important data!"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:683
-msgid "Your Identity Address:"
+#: ../../mod/settings.php:73 ../../mod/settings.php:479 ../../mod/admin.php:62
+msgid "Update"
 msgstr ""
 
-#: ../../mod/dfrn_request.php:684
-msgid "Submit Request"
+#: ../../mod/settings.php:168
+msgid "Failed to connect with email account using the settings provided."
 msgstr ""
 
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
+#: ../../mod/settings.php:173
+msgid "Email settings updated."
 msgstr ""
 
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:150
-#: ../../mod/notifications.php:195
-msgid "Discard"
+#: ../../mod/settings.php:191
+msgid "Passwords do not match. Password unchanged."
 msgstr ""
 
-#: ../../mod/notifications.php:71 ../../include/nav.php:109
-msgid "Network"
+#: ../../mod/settings.php:196
+msgid "Empty passwords are not allowed. Password unchanged."
 msgstr ""
 
-#: ../../mod/notifications.php:76 ../../mod/network.php:169
-msgid "Personal"
+#: ../../mod/settings.php:207
+msgid "Password changed."
 msgstr ""
 
-#: ../../mod/notifications.php:81 ../../include/nav.php:73
-#: ../../include/nav.php:111
-msgid "Home"
+#: ../../mod/settings.php:209
+msgid "Password update failed. Please try again."
 msgstr ""
 
-#: ../../mod/notifications.php:86 ../../include/nav.php:117
-msgid "Introductions"
+#: ../../mod/settings.php:273
+msgid " Please use a shorter name."
 msgstr ""
 
-#: ../../mod/notifications.php:91 ../../mod/message.php:76
-#: ../../include/nav.php:122
-msgid "Messages"
+#: ../../mod/settings.php:275
+msgid " Name too short."
 msgstr ""
 
-#: ../../mod/notifications.php:110
-msgid "Show Ignored Requests"
+#: ../../mod/settings.php:281
+msgid " Not valid email."
 msgstr ""
 
-#: ../../mod/notifications.php:110
-msgid "Hide Ignored Requests"
+#: ../../mod/settings.php:283
+msgid " Cannot change to that email."
 msgstr ""
 
-#: ../../mod/notifications.php:136 ../../mod/notifications.php:180
-msgid "Notification type: "
+#: ../../mod/settings.php:351 ../../addon/facebook/facebook.php:320
+#: ../../addon/impressum/impressum.php:64 ../../addon/piwik/piwik.php:94
+#: ../../addon/twitter/twitter.php:310
+msgid "Settings updated."
 msgstr ""
 
-#: ../../mod/notifications.php:137
-msgid "Friend Suggestion"
+#: ../../mod/settings.php:415 ../../include/nav.php:129
+msgid "Account settings"
 msgstr ""
 
-#: ../../mod/notifications.php:139
-#, php-format
-msgid "suggested by %s"
+#: ../../mod/settings.php:420
+msgid "Connector settings"
 msgstr ""
 
-#: ../../mod/notifications.php:146 ../../mod/notifications.php:192
-#: ../../mod/admin.php:466
-msgid "Approve"
+#: ../../mod/settings.php:425
+msgid "Plugin settings"
 msgstr ""
 
-#: ../../mod/notifications.php:166
-msgid "Claims to be known to you: "
+#: ../../mod/settings.php:430
+msgid "Connections"
 msgstr ""
 
-#: ../../mod/notifications.php:166
-msgid "yes"
+#: ../../mod/settings.php:435
+msgid "Export personal data"
 msgstr ""
 
-#: ../../mod/notifications.php:166
-msgid "no"
+#: ../../mod/settings.php:452 ../../mod/settings.php:478
+#: ../../mod/settings.php:511
+msgid "Add application"
 msgstr ""
 
-#: ../../mod/notifications.php:173
-msgid "Approve as: "
+#: ../../mod/settings.php:456 ../../mod/settings.php:482
+#: ../../addon/statusnet/statusnet.php:489
+msgid "Consumer Key"
 msgstr ""
 
-#: ../../mod/notifications.php:174
-msgid "Friend"
+#: ../../mod/settings.php:457 ../../mod/settings.php:483
+#: ../../addon/statusnet/statusnet.php:488
+msgid "Consumer Secret"
 msgstr ""
 
-#: ../../mod/notifications.php:175
-msgid "Sharer"
+#: ../../mod/settings.php:458 ../../mod/settings.php:484
+msgid "Redirect"
 msgstr ""
 
-#: ../../mod/notifications.php:175
-msgid "Fan/Admirer"
+#: ../../mod/settings.php:459 ../../mod/settings.php:485
+msgid "Icon url"
 msgstr ""
 
-#: ../../mod/notifications.php:181
-msgid "Friend/Connect Request"
+#: ../../mod/settings.php:470
+msgid "You can't edit this application."
 msgstr ""
 
-#: ../../mod/notifications.php:181
-msgid "New Follower"
+#: ../../mod/settings.php:510
+msgid "Connected Apps"
 msgstr ""
 
-#: ../../mod/notifications.php:201
-msgid "No introductions."
+#: ../../mod/settings.php:514
+msgid "Client key starts with"
 msgstr ""
 
-#: ../../mod/notifications.php:204 ../../mod/notifications.php:290
-#: ../../mod/notifications.php:385 ../../mod/notifications.php:466
-#: ../../include/nav.php:118
-msgid "Notifications"
+#: ../../mod/settings.php:515
+msgid "No name"
 msgstr ""
 
-#: ../../mod/notifications.php:241 ../../mod/notifications.php:336
-#: ../../mod/notifications.php:423
-#, php-format
-msgid "%s liked %s's post"
+#: ../../mod/settings.php:516
+msgid "Remove authorization"
 msgstr ""
 
-#: ../../mod/notifications.php:250 ../../mod/notifications.php:345
-#: ../../mod/notifications.php:432
-#, php-format
-msgid "%s disliked %s's post"
+#: ../../mod/settings.php:528
+msgid "No Plugin settings configured"
 msgstr ""
 
-#: ../../mod/notifications.php:264 ../../mod/notifications.php:359
-#: ../../mod/notifications.php:446
-#, php-format
-msgid "%s is now friends with %s"
+#: ../../mod/settings.php:535 ../../addon/widgets/widgets.php:122
+msgid "Plugin Settings"
 msgstr ""
 
-#: ../../mod/notifications.php:271 ../../mod/notifications.php:366
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
 #, php-format
-msgid "%s created a new post"
+msgid "Built-in support for %s connectivity is %s"
 msgstr ""
 
-#: ../../mod/notifications.php:272 ../../mod/notifications.php:367
-#: ../../mod/notifications.php:455
-#, php-format
-msgid "%s commented on %s's post"
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+msgid "enabled"
 msgstr ""
 
-#: ../../mod/notifications.php:286
-msgid "No more network notifications."
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+msgid "disabled"
 msgstr ""
 
-#: ../../mod/notifications.php:381
-msgid "No more personal notifications."
+#: ../../mod/settings.php:549
+msgid "StatusNet"
 msgstr ""
 
-#: ../../mod/notifications.php:462
-msgid "No more home notifications."
+#: ../../mod/settings.php:575
+msgid "Connector Settings"
 msgstr ""
 
-#: ../../mod/message.php:23
-msgid "No recipient selected."
+#: ../../mod/settings.php:581
+msgid "Email/Mailbox Setup"
 msgstr ""
 
-#: ../../mod/message.php:26
-msgid "Unable to locate contact information."
+#: ../../mod/settings.php:582
+msgid ""
+"If you wish to communicate with email contacts using this service "
+"(optional), please specify how to connect to your mailbox."
 msgstr ""
 
-#: ../../mod/message.php:29
-msgid "Message could not be sent."
+#: ../../mod/settings.php:583
+msgid "Last successful email check:"
 msgstr ""
 
-#: ../../mod/message.php:32
-msgid "Message collection failure."
+#: ../../mod/settings.php:584
+msgid "Email access is disabled on this site."
 msgstr ""
 
-#: ../../mod/message.php:35
-msgid "Message sent."
+#: ../../mod/settings.php:585
+msgid "IMAP server name:"
 msgstr ""
 
-#: ../../mod/message.php:55
-msgid "Inbox"
+#: ../../mod/settings.php:586
+msgid "IMAP port:"
 msgstr ""
 
-#: ../../mod/message.php:60
-msgid "Outbox"
+#: ../../mod/settings.php:587
+msgid "Security:"
 msgstr ""
 
-#: ../../mod/message.php:65
-msgid "New Message"
+#: ../../mod/settings.php:587
+msgid "None"
 msgstr ""
 
-#: ../../mod/message.php:91
-msgid "Message deleted."
+#: ../../mod/settings.php:588
+msgid "Email login name:"
 msgstr ""
 
-#: ../../mod/message.php:121
-msgid "Conversation removed."
+#: ../../mod/settings.php:589
+msgid "Email password:"
 msgstr ""
 
-#: ../../mod/message.php:137 ../../include/conversation.php:815
-msgid "Please enter a link URL:"
+#: ../../mod/settings.php:590
+msgid "Reply-to address:"
 msgstr ""
 
-#: ../../mod/message.php:145
-msgid "Send Private Message"
+#: ../../mod/settings.php:591
+msgid "Send public posts to all email contacts:"
 msgstr ""
 
-#: ../../mod/message.php:146 ../../mod/message.php:287
-msgid "To:"
+#: ../../mod/settings.php:648 ../../mod/admin.php:126 ../../mod/admin.php:443
+msgid "Normal Account"
 msgstr ""
 
-#: ../../mod/message.php:147 ../../mod/message.php:288
-msgid "Subject:"
+#: ../../mod/settings.php:649
+msgid "This account is a normal personal profile"
 msgstr ""
 
-#: ../../mod/message.php:150 ../../mod/message.php:291
-#: ../../mod/invite.php:101
-msgid "Your message:"
+#: ../../mod/settings.php:652 ../../mod/admin.php:127 ../../mod/admin.php:444
+msgid "Soapbox Account"
 msgstr ""
 
-#: ../../mod/message.php:153 ../../mod/message.php:294
-#: ../../mod/editpost.php:91 ../../include/conversation.php:863
-msgid "Upload photo"
+#: ../../mod/settings.php:653
+msgid "Automatically approve all connection/friend requests as read-only fans"
 msgstr ""
 
-#: ../../mod/message.php:154 ../../mod/message.php:295
-#: ../../mod/editpost.php:93 ../../include/conversation.php:867
-msgid "Insert web link"
+#: ../../mod/settings.php:656 ../../mod/admin.php:128 ../../mod/admin.php:445
+msgid "Community/Celebrity Account"
 msgstr ""
 
-#: ../../mod/message.php:155 ../../mod/message.php:296
-#: ../../mod/editpost.php:99 ../../mod/photos.php:1186
-#: ../../include/conversation.php:294 ../../include/conversation.php:631
-#: ../../include/conversation.php:879
-msgid "Please wait"
+#: ../../mod/settings.php:657
+msgid "Automatically approve all connection/friend requests as read-write fans"
 msgstr ""
 
-#: ../../mod/message.php:188
-msgid "No messages."
+#: ../../mod/settings.php:660 ../../mod/admin.php:129 ../../mod/admin.php:446
+msgid "Automatic Friend Account"
 msgstr ""
 
-#: ../../mod/message.php:201
-msgid "Delete conversation"
+#: ../../mod/settings.php:661
+msgid "Automatically approve all connection/friend requests as friends"
 msgstr ""
 
-#: ../../mod/message.php:204
-msgid "D, d M Y - g:i A"
+#: ../../mod/settings.php:671
+msgid "OpenID:"
 msgstr ""
 
-#: ../../mod/message.php:239
-msgid "Message not available."
+#: ../../mod/settings.php:671
+msgid "(Optional) Allow this OpenID to login to this account."
 msgstr ""
 
-#: ../../mod/message.php:276
-msgid "Delete message"
+#: ../../mod/settings.php:681
+msgid "Publish your default profile in your local site directory?"
 msgstr ""
 
-#: ../../mod/message.php:286
-msgid "Send Reply"
+#: ../../mod/settings.php:687
+msgid "Publish your default profile in the global social directory?"
 msgstr ""
 
-#: ../../mod/wall_upload.php:56 ../../mod/profile_photo.php:113
-#, php-format
-msgid "Image exceeds size limit of %d"
+#: ../../mod/settings.php:695
+msgid "Hide your contact/friend list from viewers of your default profile?"
 msgstr ""
 
-#: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:122
-#: ../../mod/photos.php:649
-msgid "Unable to process image."
+#: ../../mod/settings.php:699
+msgid "Hide your profile details from unknown viewers?"
 msgstr ""
 
-#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
-#: ../../mod/wall_upload.php:97 ../../mod/item.php:318
-#: ../../include/message.php:143
-msgid "Wall Photos"
+#: ../../mod/settings.php:704
+msgid "Allow friends to post to your profile page?"
 msgstr ""
 
-#: ../../mod/wall_upload.php:84 ../../mod/profile_photo.php:251
-#: ../../mod/photos.php:669
-msgid "Image upload failed."
+#: ../../mod/settings.php:710
+msgid "Allow friends to tag your posts?"
 msgstr ""
 
-#: ../../mod/wall_attach.php:57
-#, php-format
-msgid "File exceeds size limit of %d"
+#: ../../mod/settings.php:716
+msgid "Allow us to suggest you as a potential friend to new members?"
 msgstr ""
 
-#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
-msgid "File upload failed."
+#: ../../mod/settings.php:725
+msgid "Profile is <strong>not published</strong>."
 msgstr ""
 
-#: ../../mod/profile_photo.php:28
-msgid "Image uploaded but image cropping failed."
+#: ../../mod/settings.php:744 ../../mod/profile_photo.php:206
+msgid "or"
 msgstr ""
 
-#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
-#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
-#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
-#: ../../mod/register.php:327 ../../mod/register.php:334
-#: ../../mod/register.php:341 ../../mod/photos.php:146
-#: ../../mod/photos.php:593 ../../mod/photos.php:938 ../../mod/photos.php:953
-#: ../../addon/communityhome/communityhome.php:111
-msgid "Profile Photos"
+#: ../../mod/settings.php:749
+msgid "Your Identity Address is"
 msgstr ""
 
-#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
-#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
-#, php-format
-msgid "Image size reduction [%s] failed."
+#: ../../mod/settings.php:760
+msgid "Automatically expire posts after this many days:"
 msgstr ""
 
-#: ../../mod/profile_photo.php:89
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+#: ../../mod/settings.php:760
+msgid "If empty, posts will not expire. Expired posts will be deleted"
 msgstr ""
 
-#: ../../mod/profile_photo.php:99
-msgid "Unable to process image"
+#: ../../mod/settings.php:761
+msgid "Advanced expiration settings"
 msgstr ""
 
-#: ../../mod/profile_photo.php:203
-msgid "Upload File:"
+#: ../../mod/settings.php:762
+msgid "Advanced Expiration"
 msgstr ""
 
-#: ../../mod/profile_photo.php:204
-msgid "Upload Profile Photo"
+#: ../../mod/settings.php:763
+msgid "Expire posts:"
 msgstr ""
 
-#: ../../mod/profile_photo.php:205
-msgid "Upload"
+#: ../../mod/settings.php:764
+msgid "Expire personal notes:"
 msgstr ""
 
-#: ../../mod/profile_photo.php:206
-msgid "skip this step"
+#: ../../mod/settings.php:765
+msgid "Expire starred posts:"
 msgstr ""
 
-#: ../../mod/profile_photo.php:206
-msgid "select a photo from your photo albums"
+#: ../../mod/settings.php:766
+msgid "Expire photos:"
 msgstr ""
 
-#: ../../mod/profile_photo.php:219
-msgid "Crop Image"
+#: ../../mod/settings.php:771
+msgid "Account Settings"
 msgstr ""
 
-#: ../../mod/profile_photo.php:220
-msgid "Please adjust the image cropping for optimum viewing."
+#: ../../mod/settings.php:779
+msgid "Password Settings"
 msgstr ""
 
-#: ../../mod/profile_photo.php:221
-msgid "Done Editing"
+#: ../../mod/settings.php:780
+msgid "New Password:"
 msgstr ""
 
-#: ../../mod/profile_photo.php:249
-msgid "Image uploaded successfully."
+#: ../../mod/settings.php:781
+msgid "Confirm:"
 msgstr ""
 
-#: ../../mod/manage.php:37
-#, php-format
-msgid "Welcome back %s"
+#: ../../mod/settings.php:781
+msgid "Leave password fields blank unless changing"
 msgstr ""
 
-#: ../../mod/manage.php:87
-msgid "Manage Identities and/or Pages"
+#: ../../mod/settings.php:785
+msgid "Basic Settings"
 msgstr ""
 
-#: ../../mod/manage.php:90
-msgid ""
-"(Toggle between different identities or community/group pages which share "
-"your account details.)"
+#: ../../mod/settings.php:786 ../../include/profile_advanced.php:15
+msgid "Full Name:"
 msgstr ""
 
-#: ../../mod/manage.php:92
-msgid "Select an identity to manage: "
+#: ../../mod/settings.php:787
+msgid "Email Address:"
 msgstr ""
 
-#: ../../mod/tagger.php:70 ../../mod/like.php:127 ../../mod/photos.php:524
-#: ../../include/conversation.php:31 ../../include/conversation.php:104
-#: ../../include/diaspora.php:1554
-#: ../../addon/communityhome/communityhome.php:163
-msgid "photo"
+#: ../../mod/settings.php:788
+msgid "Your Timezone:"
 msgstr ""
 
-#: ../../mod/tagger.php:70 ../../mod/like.php:127
-#: ../../include/conversation.php:26 ../../include/conversation.php:35
-#: ../../include/conversation.php:99 ../../include/conversation.php:108
-#: ../../include/diaspora.php:1554 ../../addon/facebook/facebook.php:1084
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-msgid "status"
+#: ../../mod/settings.php:789
+msgid "Default Post Location:"
 msgstr ""
 
-#: ../../mod/tagger.php:103 ../../include/conversation.php:116
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+#: ../../mod/settings.php:790
+msgid "Use Browser Location:"
 msgstr ""
 
-#: ../../mod/common.php:34
-msgid "Common Friends"
+#: ../../mod/settings.php:791
+msgid "Display Theme:"
 msgstr ""
 
-#: ../../mod/common.php:42
-msgid "No friends in common."
+#: ../../mod/settings.php:792
+msgid "Update browser every xx seconds"
 msgstr ""
 
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
-#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
+#: ../../mod/settings.php:792
+msgid "Minimum of 10 seconds, no maximum"
 msgstr ""
 
-#: ../../mod/profiles.php:28
-msgid "Profile Name is required."
+#: ../../mod/settings.php:794
+msgid "Security and Privacy Settings"
 msgstr ""
 
-#: ../../mod/profiles.php:198
-msgid "Profile updated."
+#: ../../mod/settings.php:796
+msgid "Maximum Friend Requests/Day:"
 msgstr ""
 
-#: ../../mod/profiles.php:256
-msgid "Profile deleted."
+#: ../../mod/settings.php:796
+msgid "(to prevent spam abuse)"
 msgstr ""
 
-#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
-msgid "Profile-"
+#: ../../mod/settings.php:797
+msgid "Default Post Permissions"
 msgstr ""
 
-#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
-msgid "New profile created."
+#: ../../mod/settings.php:798
+msgid "(click to open/close)"
 msgstr ""
 
-#: ../../mod/profiles.php:309
-msgid "Profile unavailable to clone."
+#: ../../mod/settings.php:813
+msgid "Notification Settings"
 msgstr ""
 
-#: ../../mod/profiles.php:356
-msgid "Hide your contact/friend list from viewers of this profile?"
+#: ../../mod/settings.php:814
+msgid "Send a notification email when:"
 msgstr ""
 
-#: ../../mod/profiles.php:374
-msgid "Edit Profile Details"
+#: ../../mod/settings.php:815
+msgid "You receive an introduction"
 msgstr ""
 
-#: ../../mod/profiles.php:376
-msgid "View this profile"
+#: ../../mod/settings.php:816
+msgid "Your introductions are confirmed"
 msgstr ""
 
-#: ../../mod/profiles.php:377
-msgid "Create a new profile using these settings"
+#: ../../mod/settings.php:817
+msgid "Someone writes on your profile wall"
 msgstr ""
 
-#: ../../mod/profiles.php:378
-msgid "Clone this profile"
+#: ../../mod/settings.php:818
+msgid "Someone writes a followup comment"
 msgstr ""
 
-#: ../../mod/profiles.php:379
-msgid "Delete this profile"
+#: ../../mod/settings.php:819
+msgid "You receive a private message"
 msgstr ""
 
-#: ../../mod/profiles.php:380
-msgid "Profile Name:"
+#: ../../mod/settings.php:820
+msgid "You receive a friend suggestion"
 msgstr ""
 
-#: ../../mod/profiles.php:381
-msgid "Your Full Name:"
+#: ../../mod/settings.php:821
+msgid "You are tagged in a post"
 msgstr ""
 
-#: ../../mod/profiles.php:382
-msgid "Title/Description:"
+#: ../../mod/settings.php:824
+msgid "Advanced Page Settings"
 msgstr ""
 
-#: ../../mod/profiles.php:383
-msgid "Your Gender:"
+#: ../../mod/manage.php:90
+msgid "Manage Identities and/or Pages"
 msgstr ""
 
-#: ../../mod/profiles.php:384
-#, php-format
-msgid "Birthday (%s):"
+#: ../../mod/manage.php:93
+msgid ""
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
 msgstr ""
 
-#: ../../mod/profiles.php:385
-msgid "Street Address:"
+#: ../../mod/manage.php:95
+msgid "Select an identity to manage: "
 msgstr ""
 
-#: ../../mod/profiles.php:386
-msgid "Locality/City:"
+#: ../../mod/network.php:43
+msgid "Search Results For:"
 msgstr ""
 
-#: ../../mod/profiles.php:387
-msgid "Postal/Zip Code:"
+#: ../../mod/network.php:77 ../../mod/search.php:16
+msgid "Remove term"
 msgstr ""
 
-#: ../../mod/profiles.php:388
-msgid "Country:"
+#: ../../mod/network.php:86 ../../mod/search.php:13
+msgid "Saved Searches"
 msgstr ""
 
-#: ../../mod/profiles.php:389
-msgid "Region/State:"
+#: ../../mod/network.php:87 ../../include/group.php:216
+msgid "add"
 msgstr ""
 
-#: ../../mod/profiles.php:390
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+#: ../../mod/network.php:166
+msgid "Commented Order"
 msgstr ""
 
-#: ../../mod/profiles.php:391
-msgid "Who: (if applicable)"
+#: ../../mod/network.php:171
+msgid "Posted Order"
 msgstr ""
 
-#: ../../mod/profiles.php:392
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/network.php:182
+msgid "New"
 msgstr ""
 
-#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
-msgid "Sexual Preference:"
+#: ../../mod/network.php:187
+msgid "Starred"
 msgstr ""
 
-#: ../../mod/profiles.php:394
-msgid "Homepage URL:"
+#: ../../mod/network.php:192
+msgid "Bookmarks"
 msgstr ""
 
-#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:47
-msgid "Political Views:"
+#: ../../mod/network.php:250
+#, php-format
+msgid "Warning: This group contains %s member from an insecure network."
+msgid_plural ""
+"Warning: This group contains %s members from an insecure network."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/network.php:253
+msgid "Private messages to this group are at risk of public disclosure."
 msgstr ""
 
-#: ../../mod/profiles.php:396
-msgid "Religious Views:"
+#: ../../mod/network.php:304
+msgid "No such group"
 msgstr ""
 
-#: ../../mod/profiles.php:397
-msgid "Public Keywords:"
+#: ../../mod/network.php:315
+msgid "Group is empty"
 msgstr ""
 
-#: ../../mod/profiles.php:398
-msgid "Private Keywords:"
+#: ../../mod/network.php:319
+msgid "Group: "
 msgstr ""
 
-#: ../../mod/profiles.php:399
-msgid "Example: fishing photography software"
+#: ../../mod/network.php:329
+msgid "Contact: "
 msgstr ""
 
-#: ../../mod/profiles.php:400
-msgid "(Used for suggesting potential friends, can be seen by others)"
+#: ../../mod/network.php:331
+msgid "Private messages to this person are at risk of public disclosure."
 msgstr ""
 
-#: ../../mod/profiles.php:401
-msgid "(Used for searching profiles, never shown to others)"
+#: ../../mod/network.php:336
+msgid "Invalid contact."
 msgstr ""
 
-#: ../../mod/profiles.php:402
-msgid "Tell us about yourself..."
+#: ../../mod/notes.php:44 ../../boot.php:1350
+msgid "Personal Notes"
 msgstr ""
 
-#: ../../mod/profiles.php:403
-msgid "Hobbies/Interests"
+#: ../../mod/notes.php:63 ../../include/text.php:639
+msgid "Save"
 msgstr ""
 
-#: ../../mod/profiles.php:404
-msgid "Contact information and Social Networks"
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendica"
 msgstr ""
 
-#: ../../mod/profiles.php:405
-msgid "Musical interests"
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
 msgstr ""
 
-#: ../../mod/profiles.php:406
-msgid "Books, literature"
+#: ../../mod/newmember.php:12
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
 msgstr ""
 
-#: ../../mod/profiles.php:407
-msgid "Television"
+#: ../../mod/newmember.php:16
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
 msgstr ""
 
-#: ../../mod/profiles.php:408
-msgid "Film/dance/culture/entertainment"
+#: ../../mod/newmember.php:18
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished "
+"directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
 msgstr ""
 
-#: ../../mod/profiles.php:409
-msgid "Love/romance"
+#: ../../mod/newmember.php:20
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make "
+"friends than people who do not."
 msgstr ""
 
-#: ../../mod/profiles.php:410
-msgid "Work/employment"
+#: ../../mod/newmember.php:23
+msgid ""
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
 msgstr ""
 
-#: ../../mod/profiles.php:411
-msgid "School/education"
+#: ../../mod/newmember.php:28
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
 msgstr ""
 
-#: ../../mod/profiles.php:416
+#: ../../mod/newmember.php:30
 msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown "
+"visitors."
 msgstr ""
 
-#: ../../mod/profiles.php:461
-msgid "Edit/Manage Profiles"
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
 msgstr ""
 
-#: ../../mod/profiles.php:462 ../../boot.php:927
-msgid "Change profile photo"
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
 msgstr ""
 
-#: ../../mod/profiles.php:463 ../../boot.php:928
-msgid "Create New Profile"
+#: ../../mod/newmember.php:36
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
 msgstr ""
 
-#: ../../mod/profiles.php:473 ../../boot.php:938
-msgid "Profile Image"
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with "
+"each group privately on your Network page."
 msgstr ""
 
-#: ../../mod/profiles.php:475 ../../boot.php:941
-msgid "visible to everybody"
+#: ../../mod/newmember.php:40
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program "
+"features and resources."
 msgstr ""
 
-#: ../../mod/profiles.php:476 ../../boot.php:942
-msgid "Edit visibility"
+#: ../../mod/attach.php:8
+msgid "Item not available."
 msgstr ""
 
-#: ../../mod/openid.php:63 ../../mod/openid.php:123 ../../include/auth.php:122
-#: ../../include/auth.php:147 ../../include/auth.php:201
-msgid "Login failed."
+#: ../../mod/attach.php:20
+msgid "Item was not found."
 msgstr ""
 
-#: ../../mod/openid.php:79 ../../include/auth.php:217
-msgid "Welcome "
+#: ../../mod/group.php:27
+msgid "Group created."
 msgstr ""
 
-#: ../../mod/openid.php:80 ../../include/auth.php:218
-msgid "Please upload a profile photo."
+#: ../../mod/group.php:33
+msgid "Could not create group."
 msgstr ""
 
-#: ../../mod/openid.php:83 ../../include/auth.php:221
-msgid "Welcome back "
+#: ../../mod/group.php:43 ../../mod/group.php:123
+msgid "Group not found."
 msgstr ""
 
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:237
-msgid "l F d, Y \\@ g:i A"
+#: ../../mod/group.php:56
+msgid "Group name changed."
 msgstr ""
 
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
+msgid "Permission denied"
 msgstr ""
 
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
+#: ../../mod/group.php:82
+msgid "Create a group of contacts/friends."
 msgstr ""
 
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
+#: ../../mod/group.php:83 ../../mod/group.php:166
+msgid "Group Name: "
 msgstr ""
 
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
+#: ../../mod/group.php:98
+msgid "Group removed."
 msgstr ""
 
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
+#: ../../mod/group.php:100
+msgid "Unable to remove group."
 msgstr ""
 
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
+#: ../../mod/group.php:164 ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
 msgstr ""
 
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
+#: ../../mod/group.php:165
+msgid "Group Editor"
 msgstr ""
 
-#: ../../mod/invite.php:59
-#, php-format
-msgid "Please join my network on %s"
+#: ../../mod/group.php:179
+msgid "Members"
 msgstr ""
 
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
+#: ../../mod/group.php:194
+msgid "All Contacts"
 msgstr ""
 
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
 msgstr ""
 
-#: ../../mod/invite.php:99
-msgid "Send invitations"
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
 msgstr ""
 
-#: ../../mod/invite.php:100
-msgid "Enter email addresses, one per line:"
+#: ../../mod/profperm.php:103 ../../include/profile_advanced.php:7
+#: ../../include/profile_advanced.php:76 ../../include/nav.php:48
+#: ../../boot.php:1332
+msgid "Profile"
 msgstr ""
 
-#: ../../mod/invite.php:102
-#, php-format
-msgid "Please join my social network on %s"
+#: ../../mod/profperm.php:114
+msgid "Visible To"
 msgstr ""
 
-#: ../../mod/invite.php:103
-msgid "To accept this invitation, please visit:"
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
 msgstr ""
 
-#: ../../mod/invite.php:104
-msgid "You will need to supply this invitation code: $invite_code"
+#: ../../mod/viewcontacts.php:25 ../../include/text.php:578
+msgid "View Contacts"
 msgstr ""
 
-#: ../../mod/invite.php:104
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
+#: ../../mod/viewcontacts.php:40
+msgid "No contacts."
 msgstr ""
 
 #: ../../mod/register.php:62
@@ -1974,13 +2367,6 @@ msgstr ""
 msgid "Registration details for %s"
 msgstr ""
 
-#: ../../mod/register.php:380 ../../mod/register.php:434
-#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:710
-#: ../../include/items.php:2415
-msgid "Administrator"
-msgstr ""
-
 #: ../../mod/register.php:386
 msgid ""
 "Registration successful. Please check your email for further instructions."
@@ -2049,218 +2435,55 @@ msgstr ""
 msgid "Your Email Address: "
 msgstr ""
 
-#: ../../mod/register.php:550
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be '<strong>nickname@$sitename</"
-"strong>'."
-msgstr ""
-
-#: ../../mod/register.php:551
-msgid "Choose a nickname: "
-msgstr ""
-
-#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:684
-msgid "Register"
-msgstr ""
-
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr ""
-
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr ""
-
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr ""
-
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr ""
-
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr ""
-
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr ""
-
-#: ../../mod/ping.php:148
-msgid "{0} wants to be your friend"
-msgstr ""
-
-#: ../../mod/ping.php:153
-msgid "{0} sent you a message"
-msgstr ""
-
-#: ../../mod/ping.php:158
-msgid "{0} requested registration"
-msgstr ""
-
-#: ../../mod/ping.php:164
-#, php-format
-msgid "{0} commented %s's post"
-msgstr ""
-
-#: ../../mod/ping.php:169
-#, php-format
-msgid "{0} liked %s's post"
-msgstr ""
-
-#: ../../mod/ping.php:174
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr ""
-
-#: ../../mod/ping.php:179
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr ""
-
-#: ../../mod/ping.php:184
-msgid "{0} posted"
-msgstr ""
-
-#: ../../mod/ping.php:189
-#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr ""
-
-#: ../../mod/ping.php:195
-msgid "{0} mentioned you in a post"
-msgstr ""
-
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr ""
-
-#: ../../mod/lostpass.php:31
-msgid "Password reset request issued. Check your email."
-msgstr ""
-
-#: ../../mod/lostpass.php:42
-#, php-format
-msgid "Password reset requested at %s"
-msgstr ""
-
-#: ../../mod/lostpass.php:64
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr ""
-
-#: ../../mod/lostpass.php:82 ../../boot.php:714
-msgid "Password Reset"
-msgstr ""
-
-#: ../../mod/lostpass.php:83
-msgid "Your password has been reset as requested."
-msgstr ""
-
-#: ../../mod/lostpass.php:84
-msgid "Your new password is"
-msgstr ""
-
-#: ../../mod/lostpass.php:85
-msgid "Save or copy your new password - and then"
-msgstr ""
-
-#: ../../mod/lostpass.php:86
-msgid "click here to login"
-msgstr ""
-
-#: ../../mod/lostpass.php:87
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr ""
-
-#: ../../mod/lostpass.php:118
-msgid "Forgot your Password?"
-msgstr ""
-
-#: ../../mod/lostpass.php:119
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr ""
-
-#: ../../mod/lostpass.php:120
-msgid "Nickname or Email: "
-msgstr ""
-
-#: ../../mod/lostpass.php:121
-msgid "Reset"
-msgstr ""
-
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr ""
-
-#: ../../mod/editpost.php:32
-msgid "Edit post"
-msgstr ""
-
-#: ../../mod/editpost.php:75 ../../include/conversation.php:848
-msgid "Post to Email"
-msgstr ""
-
-#: ../../mod/editpost.php:92 ../../include/conversation.php:865
-msgid "Attach file"
-msgstr ""
-
-#: ../../mod/editpost.php:94
-msgid "Insert YouTube video"
-msgstr ""
-
-#: ../../mod/editpost.php:95
-msgid "Insert Vorbis [.ogg] video"
-msgstr ""
-
-#: ../../mod/editpost.php:96
-msgid "Insert Vorbis [.ogg] audio"
-msgstr ""
-
-#: ../../mod/editpost.php:97 ../../include/conversation.php:873
-msgid "Set your location"
+#: ../../mod/register.php:550
+msgid ""
+"Choose a profile nickname. This must begin with a text character. Your "
+"profile address on this site will then be '<strong>nickname@$sitename</"
+"strong>'."
 msgstr ""
 
-#: ../../mod/editpost.php:98 ../../include/conversation.php:875
-msgid "Clear browser location"
+#: ../../mod/register.php:551
+msgid "Choose a nickname: "
 msgstr ""
 
-#: ../../mod/editpost.php:100 ../../include/conversation.php:880
-msgid "Permission settings"
+#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:689
+msgid "Register"
 msgstr ""
 
-#: ../../mod/editpost.php:108 ../../include/conversation.php:889
-msgid "CC: email addresses"
+#: ../../mod/dirfind.php:23
+msgid "People Search"
 msgstr ""
 
-#: ../../mod/editpost.php:109 ../../include/conversation.php:890
-msgid "Public post"
+#: ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/facebook/facebook.php:1091
+#: ../../addon/communityhome/communityhome.php:158
+#: ../../addon/communityhome/communityhome.php:167
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:26
+#: ../../include/conversation.php:35 ../../include/conversation.php:99
+#: ../../include/conversation.php:108
+msgid "status"
 msgstr ""
 
-#: ../../mod/editpost.php:111 ../../include/conversation.php:892
-msgid "Example: bob@example.com, mary@example.com"
+#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1095
+#: ../../addon/communityhome/communityhome.php:172
+#: ../../include/diaspora.php:1603 ../../include/conversation.php:43
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
 msgstr ""
 
-#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
-msgid "Remove My Account"
+#: ../../mod/like.php:146 ../../include/conversation.php:46
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
 msgstr ""
 
-#: ../../mod/removeme.php:43
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
+#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
+#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:116
+#: ../../mod/viewd.php:14 ../../include/items.php:2819
+msgid "Item not found."
 msgstr ""
 
-#: ../../mod/removeme.php:44
-msgid "Please enter your password for verification:"
+#: ../../mod/viewsrc.php:7 ../../mod/viewd.php:6
+msgid "Access denied."
 msgstr ""
 
 #: ../../mod/regmod.php:61
@@ -2276,274 +2499,217 @@ msgstr ""
 msgid "Please login."
 msgstr ""
 
-#: ../../mod/install.php:111
-msgid "Friendica Social Communications Server - Setup"
-msgstr ""
-
-#: ../../mod/install.php:117 ../../mod/install.php:157
-#: ../../mod/install.php:229
-msgid "Database connection"
+#: ../../mod/item.php:88
+msgid "Unable to locate original post."
 msgstr ""
 
-#: ../../mod/install.php:124
-msgid "Could not connect to database."
+#: ../../mod/item.php:248
+msgid "Empty post discarded."
 msgstr ""
 
-#: ../../mod/install.php:128
-msgid "Could not create table."
+#: ../../mod/item.php:350 ../../mod/wall_upload.php:81
+#: ../../mod/wall_upload.php:90 ../../mod/wall_upload.php:97
+#: ../../include/message.php:143
+msgid "Wall Photos"
 msgstr ""
 
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
+#: ../../mod/item.php:827
+msgid "System error. Post not saved."
 msgstr ""
 
-#: ../../mod/install.php:134
+#: ../../mod/item.php:852
+#, php-format
 msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
-msgstr ""
-
-#: ../../mod/install.php:135 ../../mod/install.php:151
-#: ../../mod/install.php:209
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr ""
-
-#: ../../mod/install.php:137
-msgid "Proceed to registration"
+"This message was sent to you by %s, a member of the Friendica social network."
 msgstr ""
 
-#: ../../mod/install.php:143
-msgid "Proceed with Installation"
+#: ../../mod/item.php:854
+#, php-format
+msgid "You may visit them online at %s"
 msgstr ""
 
-#: ../../mod/install.php:150
+#: ../../mod/item.php:855
 msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr ""
-
-#: ../../mod/install.php:158
-msgid "Database import failed."
-msgstr ""
-
-#: ../../mod/install.php:206
-msgid "System check"
-msgstr ""
-
-#: ../../mod/install.php:210 ../../mod/events.php:213
-msgid "Next"
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
 msgstr ""
 
-#: ../../mod/install.php:211
-msgid "Check again"
+#: ../../mod/item.php:857
+#, php-format
+msgid "%s posted an update."
 msgstr ""
 
-#: ../../mod/install.php:230
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
+#: ../../mod/profile_photo.php:28
+msgid "Image uploaded but image cropping failed."
 msgstr ""
 
-#: ../../mod/install.php:231
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
+#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
+#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
+#, php-format
+msgid "Image size reduction [%s] failed."
 msgstr ""
 
-#: ../../mod/install.php:232
+#: ../../mod/profile_photo.php:89
 msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr ""
-
-#: ../../mod/install.php:236
-msgid "Database Server Name"
-msgstr ""
-
-#: ../../mod/install.php:237
-msgid "Database Login Name"
-msgstr ""
-
-#: ../../mod/install.php:238
-msgid "Database Login Password"
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
 msgstr ""
 
-#: ../../mod/install.php:239
-msgid "Database Name"
+#: ../../mod/profile_photo.php:99
+msgid "Unable to process image"
 msgstr ""
 
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid "Site administrator email address"
+#: ../../mod/profile_photo.php:113 ../../mod/wall_upload.php:56
+#, php-format
+msgid "Image exceeds size limit of %d"
 msgstr ""
 
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+#: ../../mod/profile_photo.php:203
+msgid "Upload File:"
 msgstr ""
 
-#: ../../mod/install.php:244 ../../mod/install.php:282
-msgid "Please select a default timezone for your website"
+#: ../../mod/profile_photo.php:204
+msgid "Upload Profile Photo"
 msgstr ""
 
-#: ../../mod/install.php:269
-msgid "Site settings"
+#: ../../mod/profile_photo.php:205
+msgid "Upload"
 msgstr ""
 
-#: ../../mod/install.php:322
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: ../../mod/profile_photo.php:206
+msgid "skip this step"
 msgstr ""
 
-#: ../../mod/install.php:325
-msgid "PHP executable path"
+#: ../../mod/profile_photo.php:206
+msgid "select a photo from your photo albums"
 msgstr ""
 
-#: ../../mod/install.php:325
-msgid "Enter full path to php executable"
+#: ../../mod/profile_photo.php:219
+msgid "Crop Image"
 msgstr ""
 
-#: ../../mod/install.php:330
-msgid "Command line PHP"
+#: ../../mod/profile_photo.php:220
+msgid "Please adjust the image cropping for optimum viewing."
 msgstr ""
 
-#: ../../mod/install.php:339
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: ../../mod/profile_photo.php:221
+msgid "Done Editing"
 msgstr ""
 
-#: ../../mod/install.php:340
-msgid "This is required for message delivery to work."
+#: ../../mod/profile_photo.php:249
+msgid "Image uploaded successfully."
 msgstr ""
 
-#: ../../mod/install.php:342
-msgid "PHP \"register_argc_argv\""
+#: ../../mod/hcard.php:10
+msgid "No profile"
 msgstr ""
 
-#: ../../mod/install.php:363
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
+msgid "Remove My Account"
 msgstr ""
 
-#: ../../mod/install.php:364
+#: ../../mod/removeme.php:46
 msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
-msgstr ""
-
-#: ../../mod/install.php:366
-msgid "Generate encryption keys"
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
 msgstr ""
 
-#: ../../mod/install.php:373
-msgid "libCurl PHP module"
+#: ../../mod/removeme.php:47
+msgid "Please enter your password for verification:"
 msgstr ""
 
-#: ../../mod/install.php:374
-msgid "GD graphics PHP module"
+#: ../../mod/message.php:23
+msgid "No recipient selected."
 msgstr ""
 
-#: ../../mod/install.php:375
-msgid "OpenSSL PHP module"
+#: ../../mod/message.php:26
+msgid "Unable to locate contact information."
 msgstr ""
 
-#: ../../mod/install.php:376
-msgid "mysqli PHP module"
+#: ../../mod/message.php:29
+msgid "Message could not be sent."
 msgstr ""
 
-#: ../../mod/install.php:377
-msgid "mb_string PHP module"
+#: ../../mod/message.php:32
+msgid "Message collection failure."
 msgstr ""
 
-#: ../../mod/install.php:382 ../../mod/install.php:384
-msgid "Apace mod_rewrite module"
+#: ../../mod/message.php:35
+msgid "Message sent."
 msgstr ""
 
-#: ../../mod/install.php:382
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: ../../mod/message.php:55
+msgid "Inbox"
 msgstr ""
 
-#: ../../mod/install.php:389
-msgid "Error: libCURL PHP module required but not installed."
+#: ../../mod/message.php:60
+msgid "Outbox"
 msgstr ""
 
-#: ../../mod/install.php:393
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../mod/message.php:65
+msgid "New Message"
 msgstr ""
 
-#: ../../mod/install.php:397
-msgid "Error: openssl PHP module required but not installed."
+#: ../../mod/message.php:91
+msgid "Message deleted."
 msgstr ""
 
-#: ../../mod/install.php:401
-msgid "Error: mysqli PHP module required but not installed."
+#: ../../mod/message.php:121
+msgid "Conversation removed."
 msgstr ""
 
-#: ../../mod/install.php:405
-msgid "Error: mb_string PHP module required but not installed."
+#: ../../mod/message.php:137 ../../include/conversation.php:843
+msgid "Please enter a link URL:"
 msgstr ""
 
-#: ../../mod/install.php:422
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\" "
-"in the top folder of your web server and it is unable to do so."
+#: ../../mod/message.php:145
+msgid "Send Private Message"
 msgstr ""
 
-#: ../../mod/install.php:423
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
+#: ../../mod/message.php:146 ../../mod/message.php:287
+msgid "To:"
 msgstr ""
 
-#: ../../mod/install.php:424
-msgid ""
-"Please check with your site documentation or support people to see if this "
-"situation can be corrected."
+#: ../../mod/message.php:147 ../../mod/message.php:288
+msgid "Subject:"
 msgstr ""
 
-#: ../../mod/install.php:425
-msgid ""
-"If not, you may be required to perform a manual installation. Please see the "
-"file \"INSTALL.txt\" for instructions."
+#: ../../mod/message.php:150 ../../mod/message.php:291
+#: ../../mod/invite.php:101
+msgid "Your message:"
 msgstr ""
 
-#: ../../mod/install.php:428
-msgid ".htconfig.php is writable"
+#: ../../mod/message.php:188
+msgid "No messages."
 msgstr ""
 
-#: ../../mod/install.php:435
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
+#: ../../mod/message.php:201
+msgid "Delete conversation"
 msgstr ""
 
-#: ../../mod/install.php:460
-msgid "Errors encountered creating database tables."
+#: ../../mod/message.php:204
+msgid "D, d M Y - g:i A"
 msgstr ""
 
-#: ../../mod/community.php:21
-msgid "Not available."
+#: ../../mod/message.php:239
+msgid "Message not available."
 msgstr ""
 
-#: ../../mod/community.php:30 ../../include/nav.php:97
-msgid "Community"
+#: ../../mod/message.php:276
+msgid "Delete message"
 msgstr ""
 
-#: ../../mod/community.php:60 ../../mod/search.php:118
-msgid "No results."
+#: ../../mod/message.php:286
+msgid "Send Reply"
 msgstr ""
 
-#: ../../mod/community.php:87
-msgid ""
-"Shared content is covered by the <a href=\"http://creativecommons.org/"
-"licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."
+#: ../../mod/allfriends.php:34
+#, php-format
+msgid "Friends of %s"
 msgstr ""
 
-#: ../../mod/oexchange.php:27
-msgid "Post successful."
+#: ../../mod/allfriends.php:40
+msgid "No friends to display."
 msgstr ""
 
 #: ../../mod/admin.php:59 ../../mod/admin.php:295
@@ -2619,7 +2785,7 @@ msgstr ""
 msgid "Advanced"
 msgstr ""
 
-#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:477
+#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:486
 msgid "Site name"
 msgstr ""
 
@@ -2833,7 +2999,7 @@ msgstr ""
 msgid "Toggle"
 msgstr ""
 
-#: ../../mod/admin.php:551 ../../include/nav.php:128
+#: ../../mod/admin.php:551 ../../include/nav.php:129
 msgid "Settings"
 msgstr ""
 
@@ -2883,1759 +3049,1849 @@ msgstr ""
 msgid "FTP Password"
 msgstr ""
 
-#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
-msgid "Friend Suggestions"
+#: ../../mod/profile.php:15 ../../boot.php:841
+msgid "Requested profile is not available."
 msgstr ""
 
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
+#: ../../mod/profile.php:111 ../../mod/display.php:66
+msgid "Access to this profile has been restricted."
 msgstr ""
 
-#: ../../mod/suggest.php:59 ../../mod/match.php:58
-#: ../../include/contact_widgets.php:9 ../../boot.php:911
-msgid "Connect"
+#: ../../mod/profile.php:131
+msgid "Tips for New Members"
 msgstr ""
 
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
+#: ../../mod/ping.php:148
+msgid "{0} wants to be your friend"
 msgstr ""
 
-#: ../../mod/display.php:66 ../../mod/profile.php:111
-msgid "Access to this profile has been restricted."
+#: ../../mod/ping.php:153
+msgid "{0} sent you a message"
 msgstr ""
 
-#: ../../mod/display.php:108
-msgid "Item has been removed."
+#: ../../mod/ping.php:158
+msgid "{0} requested registration"
 msgstr ""
 
-#: ../../mod/like.php:144 ../../include/conversation.php:43
-#: ../../include/diaspora.php:1570 ../../addon/facebook/facebook.php:1088
-#: ../../addon/communityhome/communityhome.php:172
+#: ../../mod/ping.php:164
 #, php-format
-msgid "%1$s likes %2$s's %3$s"
+msgid "{0} commented %s's post"
 msgstr ""
 
-#: ../../mod/like.php:146 ../../include/conversation.php:46
+#: ../../mod/ping.php:169
 #, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+msgid "{0} liked %s's post"
 msgstr ""
 
-#: ../../mod/match.php:12
-msgid "Profile Match"
+#: ../../mod/ping.php:174
+#, php-format
+msgid "{0} disliked %s's post"
 msgstr ""
 
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
+#: ../../mod/ping.php:179
+#, php-format
+msgid "{0} is now friends with %s"
 msgstr ""
 
-#: ../../mod/match.php:57
-msgid "is interested in:"
+#: ../../mod/ping.php:184
+msgid "{0} posted"
 msgstr ""
 
-#: ../../mod/notes.php:44 ../../boot.php:1335
-msgid "Personal Notes"
+#: ../../mod/ping.php:189
+#, php-format
+msgid "{0} tagged %s's post with #%s"
 msgstr ""
 
-#: ../../mod/notes.php:63 ../../include/text.php:635
-msgid "Save"
+#: ../../mod/ping.php:195
+msgid "{0} mentioned you in a post"
 msgstr ""
 
-#: ../../mod/help.php:30
-msgid "Help:"
+#: ../../mod/openid.php:63 ../../mod/openid.php:77 ../../include/auth.php:90
+#: ../../include/auth.php:115 ../../include/auth.php:169
+msgid "Login failed."
 msgstr ""
 
-#: ../../mod/help.php:34 ../../include/nav.php:82
-msgid "Help"
+#: ../../mod/follow.php:27
+msgid "Connect URL missing."
 msgstr ""
 
-#: ../../mod/help.php:38 ../../index.php:221
-msgid "Not Found"
+#: ../../mod/follow.php:47
+msgid ""
+"This site is not configured to allow communications with other networks."
 msgstr ""
 
-#: ../../mod/help.php:41 ../../index.php:224
-msgid "Page not found."
+#: ../../mod/follow.php:48 ../../mod/follow.php:58
+msgid "No compatible communication protocols or feeds were discovered."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:236
-msgid "Response from remote site was not understood."
+#: ../../mod/follow.php:56
+msgid "The profile address specified does not provide adequate information."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:245
-msgid "Unexpected response from remote site: "
+#: ../../mod/follow.php:60
+msgid "An author or name was not found."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:253
-msgid "Confirmation completed successfully."
+#: ../../mod/follow.php:62
+msgid "No browser URL could be matched to this address."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:255 ../../mod/dfrn_confirm.php:269
-#: ../../mod/dfrn_confirm.php:276
-msgid "Remote site reported: "
+#: ../../mod/follow.php:69
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:267
-msgid "Temporary failure. Please wait and try again."
+#: ../../mod/follow.php:74
+msgid ""
+"Limited profile. This person will be unable to receive direct/personal "
+"notifications from you."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:274
-msgid "Introduction failed or was revoked."
+#: ../../mod/follow.php:144
+msgid "Unable to retrieve contact information."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:416
-msgid "Unable to set contact photo."
+#: ../../mod/follow.php:190
+msgid "following"
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:466 ../../include/conversation.php:79
-#: ../../include/diaspora.php:495
-#, php-format
-msgid "%1$s is now friends with %2$s"
+#: ../../mod/common.php:34
+msgid "Common Friends"
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:537
-#, php-format
-msgid "No user record found for '%s' "
+#: ../../mod/common.php:42
+msgid "No friends in common."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:547
-msgid "Our site encryption key is apparently messed up."
+#: ../../mod/display.php:109
+msgid "Item has been removed."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:558
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: ../../mod/apps.php:4
+msgid "Applications"
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:579
-msgid "Contact record was not found for you on our site."
+#: ../../mod/apps.php:7
+msgid "No installed applications."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:593
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: ../../mod/search.php:83
+msgid "Search This Site"
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:613
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
+#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
+#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
+msgid "Profile not found."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:624
-msgid "Unable to set your contact credentials on our system."
+#: ../../mod/profiles.php:28
+msgid "Profile Name is required."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:678
-msgid "Unable to update your contact profile details on our system"
+#: ../../mod/profiles.php:198
+msgid "Profile updated."
 msgstr ""
 
-#: ../../mod/dfrn_confirm.php:708
-#, php-format
-msgid "Connection accepted at %s"
+#: ../../mod/profiles.php:256
+msgid "Profile deleted."
 msgstr ""
 
-#: ../../mod/profile.php:15 ../../boot.php:836
-msgid "Requested profile is not available."
+#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
+msgid "Profile-"
 msgstr ""
 
-#: ../../mod/profile.php:131
-msgid "Tips for New Members"
+#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
+msgid "New profile created."
 msgstr ""
 
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
+#: ../../mod/profiles.php:309
+msgid "Profile unavailable to clone."
 msgstr ""
 
-#: ../../mod/item.php:206
-msgid "Empty post discarded."
+#: ../../mod/profiles.php:356
+msgid "Hide your contact/friend list from viewers of this profile?"
 msgstr ""
 
-#: ../../mod/item.php:778
-msgid "System error. Post not saved."
+#: ../../mod/profiles.php:374
+msgid "Edit Profile Details"
 msgstr ""
 
-#: ../../mod/item.php:803
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social network."
+#: ../../mod/profiles.php:376
+msgid "View this profile"
 msgstr ""
 
-#: ../../mod/item.php:805
-#, php-format
-msgid "You may visit them online at %s"
+#: ../../mod/profiles.php:377
+msgid "Create a new profile using these settings"
 msgstr ""
 
-#: ../../mod/item.php:806
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
+#: ../../mod/profiles.php:378
+msgid "Clone this profile"
+msgstr ""
+
+#: ../../mod/profiles.php:379
+msgid "Delete this profile"
+msgstr ""
+
+#: ../../mod/profiles.php:380
+msgid "Profile Name:"
+msgstr ""
+
+#: ../../mod/profiles.php:381
+msgid "Your Full Name:"
+msgstr ""
+
+#: ../../mod/profiles.php:382
+msgid "Title/Description:"
+msgstr ""
+
+#: ../../mod/profiles.php:383
+msgid "Your Gender:"
 msgstr ""
 
-#: ../../mod/item.php:808
+#: ../../mod/profiles.php:384
 #, php-format
-msgid "%s posted an update."
+msgid "Birthday (%s):"
 msgstr ""
 
-#: ../../mod/search.php:13 ../../mod/network.php:84
-msgid "Saved Searches"
+#: ../../mod/profiles.php:385
+msgid "Street Address:"
 msgstr ""
 
-#: ../../mod/search.php:16 ../../mod/network.php:75
-msgid "Remove term"
+#: ../../mod/profiles.php:386
+msgid "Locality/City:"
 msgstr ""
 
-#: ../../mod/search.php:83
-msgid "Search This Site"
+#: ../../mod/profiles.php:387
+msgid "Postal/Zip Code:"
 msgstr ""
 
-#: ../../mod/photos.php:42
-msgid "Photo Albums"
+#: ../../mod/profiles.php:388
+msgid "Country:"
 msgstr ""
 
-#: ../../mod/photos.php:50 ../../mod/photos.php:146 ../../mod/photos.php:868
-#: ../../mod/photos.php:938 ../../mod/photos.php:953 ../../mod/photos.php:1354
-#: ../../mod/photos.php:1366 ../../addon/communityhome/communityhome.php:110
-msgid "Contact Photos"
+#: ../../mod/profiles.php:389
+msgid "Region/State:"
 msgstr ""
 
-#: ../../mod/photos.php:135
-msgid "Contact information unavailable"
+#: ../../mod/profiles.php:390
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
 msgstr ""
 
-#: ../../mod/photos.php:156
-msgid "Album not found."
+#: ../../mod/profiles.php:391
+msgid "Who: (if applicable)"
 msgstr ""
 
-#: ../../mod/photos.php:174 ../../mod/photos.php:947
-msgid "Delete Album"
+#: ../../mod/profiles.php:392
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
 msgstr ""
 
-#: ../../mod/photos.php:237 ../../mod/photos.php:1166
-msgid "Delete Photo"
+#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
+msgid "Sexual Preference:"
 msgstr ""
 
-#: ../../mod/photos.php:524
-msgid "was tagged in a"
+#: ../../mod/profiles.php:394
+msgid "Homepage URL:"
 msgstr ""
 
-#: ../../mod/photos.php:524
-msgid "by"
+#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:49
+msgid "Political Views:"
 msgstr ""
 
-#: ../../mod/photos.php:627 ../../addon/js_upload/js_upload.php:312
-msgid "Image exceeds size limit of "
+#: ../../mod/profiles.php:396
+msgid "Religious Views:"
 msgstr ""
 
-#: ../../mod/photos.php:635
-msgid "Image file is empty."
+#: ../../mod/profiles.php:397
+msgid "Public Keywords:"
+msgstr ""
+
+#: ../../mod/profiles.php:398
+msgid "Private Keywords:"
+msgstr ""
+
+#: ../../mod/profiles.php:399
+msgid "Example: fishing photography software"
+msgstr ""
+
+#: ../../mod/profiles.php:400
+msgid "(Used for suggesting potential friends, can be seen by others)"
+msgstr ""
+
+#: ../../mod/profiles.php:401
+msgid "(Used for searching profiles, never shown to others)"
+msgstr ""
+
+#: ../../mod/profiles.php:402
+msgid "Tell us about yourself..."
+msgstr ""
+
+#: ../../mod/profiles.php:403
+msgid "Hobbies/Interests"
 msgstr ""
 
-#: ../../mod/photos.php:764
-msgid "No photos selected"
+#: ../../mod/profiles.php:404
+msgid "Contact information and Social Networks"
 msgstr ""
 
-#: ../../mod/photos.php:841
-msgid "Access to this item is restricted."
+#: ../../mod/profiles.php:405
+msgid "Musical interests"
 msgstr ""
 
-#: ../../mod/photos.php:895
-msgid "Upload Photos"
+#: ../../mod/profiles.php:406
+msgid "Books, literature"
 msgstr ""
 
-#: ../../mod/photos.php:898 ../../mod/photos.php:942
-msgid "New album name: "
+#: ../../mod/profiles.php:407
+msgid "Television"
 msgstr ""
 
-#: ../../mod/photos.php:899
-msgid "or existing album name: "
+#: ../../mod/profiles.php:408
+msgid "Film/dance/culture/entertainment"
 msgstr ""
 
-#: ../../mod/photos.php:900
-msgid "Do not show a status post for this upload"
+#: ../../mod/profiles.php:409
+msgid "Love/romance"
 msgstr ""
 
-#: ../../mod/photos.php:902 ../../mod/photos.php:1161
-msgid "Permissions"
+#: ../../mod/profiles.php:410
+msgid "Work/employment"
 msgstr ""
 
-#: ../../mod/photos.php:957
-msgid "Edit Album"
+#: ../../mod/profiles.php:411
+msgid "School/education"
 msgstr ""
 
-#: ../../mod/photos.php:967 ../../mod/photos.php:1379
-msgid "View Photo"
+#: ../../mod/profiles.php:416
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
 msgstr ""
 
-#: ../../mod/photos.php:1002
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../mod/profiles.php:426 ../../mod/directory.php:122
+msgid "Age: "
 msgstr ""
 
-#: ../../mod/photos.php:1004
-msgid "Photo not available"
+#: ../../mod/profiles.php:461
+msgid "Edit/Manage Profiles"
 msgstr ""
 
-#: ../../mod/photos.php:1054
-msgid "View photo"
+#: ../../mod/profiles.php:462 ../../boot.php:942
+msgid "Change profile photo"
 msgstr ""
 
-#: ../../mod/photos.php:1054
-msgid "Edit photo"
+#: ../../mod/profiles.php:463 ../../boot.php:943
+msgid "Create New Profile"
 msgstr ""
 
-#: ../../mod/photos.php:1055
-msgid "Use as profile photo"
+#: ../../mod/profiles.php:473 ../../boot.php:953
+msgid "Profile Image"
 msgstr ""
 
-#: ../../mod/photos.php:1061 ../../include/conversation.php:423
-msgid "Private Message"
+#: ../../mod/profiles.php:475 ../../boot.php:956
+msgid "visible to everybody"
 msgstr ""
 
-#: ../../mod/photos.php:1072
-msgid "View Full Size"
+#: ../../mod/profiles.php:476 ../../boot.php:957
+msgid "Edit visibility"
 msgstr ""
 
-#: ../../mod/photos.php:1140
-msgid "Tags: "
+#: ../../mod/tagger.php:103 ../../include/conversation.php:116
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
 msgstr ""
 
-#: ../../mod/photos.php:1143
-msgid "[Remove any tag]"
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
 msgstr ""
 
-#: ../../mod/photos.php:1154
-msgid "New album name"
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
 msgstr ""
 
-#: ../../mod/photos.php:1157
-msgid "Caption"
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
 msgstr ""
 
-#: ../../mod/photos.php:1159
-msgid "Add a Tag"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
 msgstr ""
 
-#: ../../mod/photos.php:1163
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
 msgstr ""
 
-#: ../../mod/photos.php:1183 ../../include/conversation.php:470
-msgid "I like this (toggle)"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
 msgstr ""
 
-#: ../../mod/photos.php:1184 ../../include/conversation.php:471
-msgid "I don't like this (toggle)"
+#: ../../mod/delegate.php:131
+msgid "Add"
 msgstr ""
 
-#: ../../mod/photos.php:1185 ../../include/conversation.php:862
-msgid "Share"
+#: ../../mod/delegate.php:132
+msgid "No entries."
 msgstr ""
 
-#: ../../mod/photos.php:1202 ../../mod/photos.php:1242
-#: ../../mod/photos.php:1273 ../../include/conversation.php:485
-msgid "This is you"
+#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
+msgid "Friend Suggestions"
 msgstr ""
 
-#: ../../mod/photos.php:1204 ../../mod/photos.php:1244
-#: ../../mod/photos.php:1275 ../../include/conversation.php:487
-#: ../../boot.php:438
-msgid "Comment"
+#: ../../mod/suggest.php:44
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
 msgstr ""
 
-#: ../../mod/photos.php:1206 ../../include/conversation.php:489
-#: ../../include/conversation.php:897
-msgid "Preview"
+#: ../../mod/suggest.php:61
+msgid "Ignore/Hide"
 msgstr ""
 
-#: ../../mod/photos.php:1385
-msgid "View Album"
+#: ../../mod/directory.php:49
+msgid "Global Directory"
 msgstr ""
 
-#: ../../mod/photos.php:1394
-msgid "Recent Photos"
+#: ../../mod/directory.php:55
+msgid "Normal site view"
 msgstr ""
 
-#: ../../mod/photos.php:1396
-msgid "Upload New Photos"
+#: ../../mod/directory.php:57
+msgid "Admin - View all site entries"
 msgstr ""
 
-#: ../../mod/network.php:43
-msgid "Search Results For:"
+#: ../../mod/directory.php:63
+msgid "Find on this site"
 msgstr ""
 
-#: ../../mod/network.php:85 ../../include/group.php:216
-msgid "add"
+#: ../../mod/directory.php:66
+msgid "Site Directory"
 msgstr ""
 
-#: ../../mod/network.php:158
-msgid "Commented Order"
+#: ../../mod/directory.php:125
+msgid "Gender: "
 msgstr ""
 
-#: ../../mod/network.php:163
-msgid "Posted Order"
+#: ../../mod/directory.php:151
+msgid "No entries (some entries may be hidden)."
 msgstr ""
 
-#: ../../mod/network.php:174
-msgid "New"
+#: ../../mod/invite.php:35
+#, php-format
+msgid "%s : Not a valid email address."
 msgstr ""
 
-#: ../../mod/network.php:179
-msgid "Starred"
+#: ../../mod/invite.php:59
+#, php-format
+msgid "Please join my network on %s"
 msgstr ""
 
-#: ../../mod/network.php:184
-msgid "Bookmarks"
+#: ../../mod/invite.php:69
+#, php-format
+msgid "%s : Message delivery failed."
 msgstr ""
 
-#: ../../mod/network.php:232
+#: ../../mod/invite.php:73
 #, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
+msgid "%d message sent."
+msgid_plural "%d messages sent."
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../../mod/network.php:235
-msgid "Private messages to this group are at risk of public disclosure."
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
 msgstr ""
 
-#: ../../mod/network.php:286
-msgid "No such group"
+#: ../../mod/invite.php:99
+msgid "Send invitations"
 msgstr ""
 
-#: ../../mod/network.php:297
-msgid "Group is empty"
+#: ../../mod/invite.php:100
+msgid "Enter email addresses, one per line:"
 msgstr ""
 
-#: ../../mod/network.php:301
-msgid "Group: "
+#: ../../mod/invite.php:102
+#, php-format
+msgid "Please join my social network on %s"
 msgstr ""
 
-#: ../../mod/network.php:311
-msgid "Contact: "
+#: ../../mod/invite.php:103
+msgid "To accept this invitation, please visit:"
 msgstr ""
 
-#: ../../mod/network.php:313
-msgid "Private messages to this person are at risk of public disclosure."
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
 msgstr ""
 
-#: ../../mod/network.php:318
-msgid "Invalid contact."
+#: ../../mod/invite.php:104
+msgid ""
+"Once you have registered, please connect with me via my profile page at:"
 msgstr ""
 
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
+#: ../../mod/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
 msgstr ""
 
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
+#: ../../mod/dfrn_confirm.php:247
+msgid "Unexpected response from remote site: "
 msgstr ""
 
-#: ../../mod/api.php:89
-msgid "Please login to continue."
+#: ../../mod/dfrn_confirm.php:255
+msgid "Confirmation completed successfully."
 msgstr ""
 
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+#: ../../mod/dfrn_confirm.php:257 ../../mod/dfrn_confirm.php:271
+#: ../../mod/dfrn_confirm.php:278
+msgid "Remote site reported: "
 msgstr ""
 
-#: ../../mod/friendica.php:43
-msgid "This is Friendica, version"
+#: ../../mod/dfrn_confirm.php:269
+msgid "Temporary failure. Please wait and try again."
 msgstr ""
 
-#: ../../mod/friendica.php:44
-msgid "running at web location"
+#: ../../mod/dfrn_confirm.php:276
+msgid "Introduction failed or was revoked."
 msgstr ""
 
-#: ../../mod/friendica.php:46
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
+#: ../../mod/dfrn_confirm.php:421
+msgid "Unable to set contact photo."
 msgstr ""
 
-#: ../../mod/friendica.php:48
-msgid "Bug reports and issues: please visit"
+#: ../../mod/dfrn_confirm.php:473 ../../include/diaspora.php:495
+#: ../../include/conversation.php:79
+#, php-format
+msgid "%1$s is now friends with %2$s"
 msgstr ""
 
-#: ../../mod/friendica.php:49
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
+#: ../../mod/dfrn_confirm.php:543
+#, php-format
+msgid "No user record found for '%s' "
 msgstr ""
 
-#: ../../mod/friendica.php:54
-msgid "Installed plugins/addons/apps"
+#: ../../mod/dfrn_confirm.php:553
+msgid "Our site encryption key is apparently messed up."
 msgstr ""
 
-#: ../../mod/friendica.php:62
-msgid "No installed plugins/addons/apps"
+#: ../../mod/dfrn_confirm.php:564
+msgid "Empty site URL was provided or URL could not be decrypted by us."
 msgstr ""
 
-#: ../../mod/attach.php:8
-msgid "Item not available."
+#: ../../mod/dfrn_confirm.php:585
+msgid "Contact record was not found for you on our site."
 msgstr ""
 
-#: ../../mod/attach.php:20
-msgid "Item was not found."
+#: ../../mod/dfrn_confirm.php:599
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
 msgstr ""
 
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:574
-msgid "View Contacts"
+#: ../../mod/dfrn_confirm.php:619
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
 msgstr ""
 
-#: ../../mod/viewcontacts.php:40
-msgid "No contacts."
+#: ../../mod/dfrn_confirm.php:630
+msgid "Unable to set your contact credentials on our system."
 msgstr ""
 
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
+#: ../../mod/dfrn_confirm.php:684
+msgid "Unable to update your contact profile details on our system"
 msgstr ""
 
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
+#: ../../mod/dfrn_confirm.php:714
+#, php-format
+msgid "Connection accepted at %s"
 msgstr ""
 
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
+#: ../../addon/facebook/facebook.php:337
+msgid "Facebook disabled"
 msgstr ""
 
-#: ../../mod/tagrm.php:93
-msgid "Remove"
+#: ../../addon/facebook/facebook.php:342
+msgid "Updating contacts"
 msgstr ""
 
-#: ../../mod/group.php:27
-msgid "Group created."
+#: ../../addon/facebook/facebook.php:351
+msgid "Facebook API key is missing."
 msgstr ""
 
-#: ../../mod/group.php:33
-msgid "Could not create group."
+#: ../../addon/facebook/facebook.php:358
+msgid "Facebook Connect"
 msgstr ""
 
-#: ../../mod/group.php:43 ../../mod/group.php:123
-msgid "Group not found."
+#: ../../addon/facebook/facebook.php:364
+msgid "Install Facebook connector for this account."
 msgstr ""
 
-#: ../../mod/group.php:56
-msgid "Group name changed."
+#: ../../addon/facebook/facebook.php:371
+msgid "Remove Facebook connector"
 msgstr ""
 
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
-msgid "Permission denied"
+#: ../../addon/facebook/facebook.php:376
+msgid ""
+"Re-authenticate [This is necessary whenever your Facebook password is "
+"changed.]"
 msgstr ""
 
-#: ../../mod/group.php:82
-msgid "Create a group of contacts/friends."
+#: ../../addon/facebook/facebook.php:383
+msgid "Post to Facebook by default"
 msgstr ""
 
-#: ../../mod/group.php:83 ../../mod/group.php:166
-msgid "Group Name: "
+#: ../../addon/facebook/facebook.php:387
+msgid "Link all your Facebook friends and conversations on this website"
 msgstr ""
 
-#: ../../mod/group.php:98
-msgid "Group removed."
+#: ../../addon/facebook/facebook.php:389
+msgid ""
+"Facebook conversations consist of your <em>profile wall</em> and your friend "
+"<em>stream</em>."
 msgstr ""
 
-#: ../../mod/group.php:100
-msgid "Unable to remove group."
+#: ../../addon/facebook/facebook.php:390
+msgid "On this website, your Facebook friend stream is only visible to you."
 msgstr ""
 
-#: ../../mod/group.php:164 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
+#: ../../addon/facebook/facebook.php:391
+msgid ""
+"The following settings determine the privacy of your Facebook profile wall "
+"on this website."
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:395
+msgid ""
+"On this website your Facebook profile wall conversations will only be "
+"visible to you"
 msgstr ""
 
-#: ../../mod/group.php:165
-msgid "Group Editor"
+#: ../../addon/facebook/facebook.php:400
+msgid "Do not import your Facebook profile wall conversations"
 msgstr ""
 
-#: ../../mod/group.php:179
-msgid "Members"
+#: ../../addon/facebook/facebook.php:402
+msgid ""
+"If you choose to link conversations and leave both of these boxes unchecked, "
+"your Facebook profile wall will be merged with your profile wall on this "
+"website and your privacy settings on this website will be used to determine "
+"who may see the conversations."
 msgstr ""
 
-#: ../../mod/group.php:194
-msgid "All Contacts"
+#: ../../addon/facebook/facebook.php:407
+msgid "Comma separated applications to ignore"
 msgstr ""
 
-#: ../../mod/events.php:61
-msgid "Event description and start time are required."
+#: ../../addon/facebook/facebook.php:475
+#: ../../include/contact_selectors.php:81
+msgid "Facebook"
 msgstr ""
 
-#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1330
-msgid "Events"
+#: ../../addon/facebook/facebook.php:476
+msgid "Facebook Connector Settings"
 msgstr ""
 
-#: ../../mod/events.php:207
-msgid "Create New Event"
+#: ../../addon/facebook/facebook.php:490
+msgid "Post to Facebook"
 msgstr ""
 
-#: ../../mod/events.php:210
-msgid "Previous"
+#: ../../addon/facebook/facebook.php:581
+msgid ""
+"Post to Facebook cancelled because of multi-network access permission "
+"conflict."
 msgstr ""
 
-#: ../../mod/events.php:220
-msgid "l, F j"
+#: ../../addon/facebook/facebook.php:650
+msgid "Image: "
 msgstr ""
 
-#: ../../mod/events.php:235
-msgid "Edit event"
+#: ../../addon/facebook/facebook.php:727
+msgid "View on Friendica"
 msgstr ""
 
-#: ../../mod/events.php:237 ../../include/text.php:867
-msgid "link to source"
+#: ../../addon/facebook/facebook.php:751
+msgid "Facebook post failed. Queued for retry."
 msgstr ""
 
-#: ../../mod/events.php:305
-msgid "hour:minute"
+#: ../../addon/facebook/facebook.php:876 ../../addon/facebook/facebook.php:885
+#: ../../include/bb2diaspora.php:113
+msgid "link"
 msgstr ""
 
-#: ../../mod/events.php:314
-msgid "Event details"
-msgstr ""
+#: ../../addon/widgets/widget_like.php:58
+#, php-format
+msgid "%d person likes this"
+msgid_plural "%d people like this"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ../../mod/events.php:315
+#: ../../addon/widgets/widget_like.php:61
 #, php-format
-msgid "Format is %s %s. Starting date and Description are required."
-msgstr ""
+msgid "%d person doesn't like this"
+msgid_plural "%d people don't like this"
+msgstr[0] ""
+msgstr[1] ""
 
-#: ../../mod/events.php:316
-msgid "Event Starts:"
+#: ../../addon/widgets/widgets.php:55
+msgid "Generate new key"
 msgstr ""
 
-#: ../../mod/events.php:319
-msgid "Finish date/time is not known or not relevant"
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets key"
 msgstr ""
 
-#: ../../mod/events.php:321
-msgid "Event Finishes:"
+#: ../../addon/widgets/widgets.php:60
+msgid "Widgets available"
 msgstr ""
 
-#: ../../mod/events.php:324
-msgid "Adjust for viewer timezone"
+#: ../../addon/widgets/widget_friends.php:40
+msgid "Connect on Friendica!"
 msgstr ""
 
-#: ../../mod/events.php:326
-msgid "Description:"
+#: ../../addon/yourls/yourls.php:55
+msgid "YourLS Settings"
 msgstr ""
 
-#: ../../mod/events.php:328 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:259 ../../boot.php:961
-msgid "Location:"
+#: ../../addon/yourls/yourls.php:57
+msgid "URL: http://"
 msgstr ""
 
-#: ../../mod/events.php:330
-msgid "Share this event"
+#: ../../addon/yourls/yourls.php:62
+msgid "Username:"
 msgstr ""
 
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
+#: ../../addon/yourls/yourls.php:67
+msgid "Password:"
 msgstr ""
 
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
+#: ../../addon/yourls/yourls.php:72
+msgid "Use SSL "
 msgstr ""
 
-#: ../../mod/profperm.php:103 ../../include/nav.php:48
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74
-#: ../../boot.php:1317
-msgid "Profile"
+#: ../../addon/yourls/yourls.php:92
+msgid "yourls Settings saved."
 msgstr ""
 
-#: ../../mod/profperm.php:114
-msgid "Visible To"
+#: ../../addon/nsfw/nsfw.php:47
+msgid "\"Not Safe For Work\" Settings"
 msgstr ""
 
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
+#: ../../addon/nsfw/nsfw.php:50
+msgid "Enable NSFW filter"
 msgstr ""
 
-#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
-#, php-format
-msgid "%s welcomes %s"
+#: ../../addon/nsfw/nsfw.php:53
+msgid "Comma separated words to treat as NSFW"
 msgstr ""
 
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
+#: ../../addon/nsfw/nsfw.php:58
+msgid "Use /expression/ to provide regular expressions"
 msgstr ""
 
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
+#: ../../addon/nsfw/nsfw.php:74
+msgid "NSFW Settings saved."
 msgstr ""
 
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#: ../../addon/nsfw/nsfw.php:120
 #, php-format
-msgid "Welcome to %s"
+msgid "%s - Click to open/close"
 msgstr ""
 
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
+#: ../../addon/communityhome/communityhome.php:28
+#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
+#: ../../boot.php:706
+msgid "Login"
 msgstr ""
 
-#: ../../include/datetime.php:121 ../../include/datetime.php:253
-msgid "year"
+#: ../../addon/communityhome/communityhome.php:29
+msgid "OpenID"
 msgstr ""
 
-#: ../../include/datetime.php:126 ../../include/datetime.php:254
-msgid "month"
+#: ../../addon/communityhome/communityhome.php:38
+msgid "Last users"
 msgstr ""
 
-#: ../../include/datetime.php:131 ../../include/datetime.php:256
-msgid "day"
+#: ../../addon/communityhome/communityhome.php:81
+msgid "Most active users"
 msgstr ""
 
-#: ../../include/datetime.php:244
-msgid "never"
+#: ../../addon/communityhome/communityhome.php:98
+msgid "Last photos"
 msgstr ""
 
-#: ../../include/datetime.php:250
-msgid "less than a second ago"
+#: ../../addon/communityhome/communityhome.php:133
+msgid "Last likes"
 msgstr ""
 
-#: ../../include/datetime.php:253
-msgid "years"
+#: ../../addon/communityhome/communityhome.php:155
+#: ../../include/conversation.php:23 ../../include/conversation.php:96
+msgid "event"
 msgstr ""
 
-#: ../../include/datetime.php:254
-msgid "months"
+#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#, php-format
+msgid ""
+"Allow to use your friendica id (%s) to connecto to external unhosted-enabled "
+"storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/"
+"wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
 msgstr ""
 
-#: ../../include/datetime.php:255
-msgid "week"
+#: ../../addon/uhremotestorage/uhremotestorage.php:85
+msgid "Template URL (with {category})"
 msgstr ""
 
-#: ../../include/datetime.php:255
-msgid "weeks"
+#: ../../addon/uhremotestorage/uhremotestorage.php:86
+msgid "OAuth end-point"
 msgstr ""
 
-#: ../../include/datetime.php:256
-msgid "days"
+#: ../../addon/uhremotestorage/uhremotestorage.php:87
+msgid "Api"
 msgstr ""
 
-#: ../../include/datetime.php:257
-msgid "hour"
+#: ../../addon/membersince/membersince.php:18
+msgid "Member since:"
 msgstr ""
 
-#: ../../include/datetime.php:257
-msgid "hours"
+#: ../../addon/tictac/tictac.php:20
+msgid "Three Dimensional Tic-Tac-Toe"
 msgstr ""
 
-#: ../../include/datetime.php:258
-msgid "minute"
+#: ../../addon/tictac/tictac.php:53
+msgid "3D Tic-Tac-Toe"
 msgstr ""
 
-#: ../../include/datetime.php:258
-msgid "minutes"
+#: ../../addon/tictac/tictac.php:58
+msgid "New game"
 msgstr ""
 
-#: ../../include/datetime.php:259
-msgid "second"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game with handicap"
 msgstr ""
 
-#: ../../include/datetime.php:259
-msgid "seconds"
+#: ../../addon/tictac/tictac.php:60
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
 msgstr ""
 
-#: ../../include/datetime.php:266
-msgid " ago"
+#: ../../addon/tictac/tictac.php:61
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
 msgstr ""
 
-#: ../../include/datetime.php:437 ../../include/profile_advanced.php:30
-#: ../../include/items.php:1285
-msgid "Birthday:"
+#: ../../addon/tictac/tictac.php:63
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
 msgstr ""
 
-#: ../../include/dba.php:39
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../addon/tictac/tictac.php:182
+msgid "You go first..."
 msgstr ""
 
-#: ../../include/text.php:232
-msgid "prev"
+#: ../../addon/tictac/tictac.php:187
+msgid "I'm going first this time..."
 msgstr ""
 
-#: ../../include/text.php:234
-msgid "first"
+#: ../../addon/tictac/tictac.php:193
+msgid "You won!"
 msgstr ""
 
-#: ../../include/text.php:263
-msgid "last"
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
+msgid "\"Cat\" game!"
 msgstr ""
 
-#: ../../include/text.php:266
-msgid "next"
+#: ../../addon/tictac/tictac.php:222
+msgid "I won!"
 msgstr ""
 
-#: ../../include/text.php:553
-msgid "No contacts"
+#: ../../addon/randplace/randplace.php:171
+msgid "Randplace Settings"
 msgstr ""
 
-#: ../../include/text.php:562
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../addon/randplace/randplace.php:173
+msgid "Enable Randplace Plugin"
+msgstr ""
 
-#: ../../include/text.php:633 ../../include/nav.php:87
-msgid "Search"
+#: ../../addon/drpost/drpost.php:35
+msgid "Post to Drupal"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Monday"
+#: ../../addon/drpost/drpost.php:72
+msgid "Drupal Post Settings"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Tuesday"
+#: ../../addon/drpost/drpost.php:74
+msgid "Enable Drupal Post Plugin"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Wednesday"
+#: ../../addon/drpost/drpost.php:79
+msgid "Drupal username"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Thursday"
+#: ../../addon/drpost/drpost.php:84
+msgid "Drupal password"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Friday"
+#: ../../addon/drpost/drpost.php:89
+msgid "Post Type - article,page,or blog"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Saturday"
+#: ../../addon/drpost/drpost.php:94
+msgid "Drupal site URL"
 msgstr ""
 
-#: ../../include/text.php:719
-msgid "Sunday"
+#: ../../addon/drpost/drpost.php:99
+msgid "Drupal site uses clean URLS"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "January"
+#: ../../addon/drpost/drpost.php:104
+msgid "Post to Drupal by default"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "February"
+#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:172
+#: ../../addon/posterous/posterous.php:173
+msgid "Post from Friendica"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "March"
+#: ../../addon/geonames/geonames.php:143
+msgid "Geonames settings updated."
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "April"
+#: ../../addon/geonames/geonames.php:179
+msgid "Geonames Settings"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "May"
+#: ../../addon/geonames/geonames.php:181
+msgid "Enable Geonames Plugin"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "June"
+#: ../../addon/js_upload/js_upload.php:43
+msgid "Upload a file"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "July"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Drop files here to upload"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "August"
+#: ../../addon/js_upload/js_upload.php:46
+msgid "Failed"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "September"
+#: ../../addon/js_upload/js_upload.php:294
+msgid "No files were uploaded."
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "October"
+#: ../../addon/js_upload/js_upload.php:300
+msgid "Uploaded file is empty"
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "November"
+#: ../../addon/js_upload/js_upload.php:323
+msgid "File has an invalid extension, it should be one of "
 msgstr ""
 
-#: ../../include/text.php:723
-msgid "December"
+#: ../../addon/js_upload/js_upload.php:334
+msgid "Upload was cancelled, or server error encountered"
 msgstr ""
 
-#: ../../include/text.php:793
-msgid "bytes"
+#: ../../addon/oembed.old/oembed.php:30
+msgid "OEmbed settings updated"
 msgstr ""
 
-#: ../../include/text.php:885
-msgid "Select an alternate language"
+#: ../../addon/oembed.old/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
 msgstr ""
 
-#: ../../include/text.php:897
-msgid "default"
+#: ../../addon/oembed.old/oembed.php:71
+msgid "URL to embed:"
 msgstr ""
 
-#: ../../include/poller.php:459
-msgid "From: "
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
 msgstr ""
 
-#: ../../include/nav.php:44 ../../boot.php:700
-msgid "Logout"
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
 msgstr ""
 
-#: ../../include/nav.php:44
-msgid "End this session"
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
 msgstr ""
 
-#: ../../include/nav.php:47 ../../boot.php:1312
-msgid "Status"
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
 msgstr ""
 
-#: ../../include/nav.php:47 ../../include/nav.php:111
-msgid "Your posts and conversations"
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
 msgstr ""
 
-#: ../../include/nav.php:48
-msgid "Your profile page"
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
 msgstr ""
 
-#: ../../include/nav.php:49 ../../boot.php:1322
-msgid "Photos"
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
 msgstr ""
 
-#: ../../include/nav.php:49
-msgid "Your photos"
+#: ../../addon/buglink/buglink.php:15
+msgid "Report Bug"
 msgstr ""
 
-#: ../../include/nav.php:50
-msgid "Your events"
+#: ../../addon/blockem/blockem.php:51
+msgid "\"Blockem\" Settings"
 msgstr ""
 
-#: ../../include/nav.php:51
-msgid "Personal notes"
+#: ../../addon/blockem/blockem.php:53
+msgid "Comma separated profile URLS to block"
 msgstr ""
 
-#: ../../include/nav.php:51
-msgid "Your personal photos"
+#: ../../addon/blockem/blockem.php:70
+msgid "BLOCKEM Settings saved."
 msgstr ""
 
-#: ../../include/nav.php:62 ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34 ../../boot.php:701
-msgid "Login"
+#: ../../addon/blockem/blockem.php:105
+#, php-format
+msgid "Blocked %s - Click to open/close"
 msgstr ""
 
-#: ../../include/nav.php:62
-msgid "Sign in"
+#: ../../addon/blockem/blockem.php:160
+msgid "Unblock Author"
 msgstr ""
 
-#: ../../include/nav.php:73
-msgid "Home Page"
+#: ../../addon/blockem/blockem.php:162
+msgid "Block Author"
 msgstr ""
 
-#: ../../include/nav.php:77
-msgid "Create an account"
+#: ../../addon/blockem/blockem.php:194
+msgid "blockem settings updated"
 msgstr ""
 
-#: ../../include/nav.php:82
-msgid "Help and documentation"
+#: ../../addon/editplain/editplain.php:46
+msgid "Editplain settings updated."
 msgstr ""
 
-#: ../../include/nav.php:85
-msgid "Apps"
+#: ../../addon/editplain/editplain.php:76
+msgid "Editplain Settings"
 msgstr ""
 
-#: ../../include/nav.php:85
-msgid "Addon applications, utilities, games"
+#: ../../addon/editplain/editplain.php:78
+msgid "Disable richtext status editor"
 msgstr ""
 
-#: ../../include/nav.php:87
-msgid "Search site content"
+#: ../../addon/pageheader/pageheader.php:47
+msgid "\"pageheader\" Settings"
 msgstr ""
 
-#: ../../include/nav.php:97
-msgid "Conversations on this site"
+#: ../../addon/pageheader/pageheader.php:65
+msgid "pageheader Settings saved."
 msgstr ""
 
-#: ../../include/nav.php:99
-msgid "Directory"
+#: ../../addon/viewsrc/viewsrc.php:25
+msgid "View Source"
 msgstr ""
 
-#: ../../include/nav.php:99
-msgid "People directory"
+#: ../../addon/statusnet/statusnet.php:140
+msgid "Post to StatusNet"
 msgstr ""
 
-#: ../../include/nav.php:109
-msgid "Conversations from your friends"
+#: ../../addon/statusnet/statusnet.php:182
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
 msgstr ""
 
-#: ../../include/nav.php:117
-msgid "Friend Requests"
+#: ../../addon/statusnet/statusnet.php:210
+msgid "We could not contact the StatusNet API with the Path you entered."
 msgstr ""
 
-#: ../../include/nav.php:122
-msgid "Private mail"
+#: ../../addon/statusnet/statusnet.php:236
+msgid "StatusNet settings updated."
 msgstr ""
 
-#: ../../include/nav.php:125
-msgid "Manage"
+#: ../../addon/statusnet/statusnet.php:259
+msgid "StatusNet Posting Settings"
 msgstr ""
 
-#: ../../include/nav.php:125
-msgid "Manage other pages"
+#: ../../addon/statusnet/statusnet.php:273
+msgid "Globally Available StatusNet OAuthKeys"
 msgstr ""
 
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Profiles"
+#: ../../addon/statusnet/statusnet.php:274
+msgid ""
+"There are preconfigured OAuth key pairs for some StatusNet servers "
+"available. If you are useing one of them, please use these credentials. If "
+"not feel free to connect to any other StatusNet instance (see below)."
 msgstr ""
 
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Manage/edit profiles"
+#: ../../addon/statusnet/statusnet.php:282
+msgid "Provide your own OAuth Credentials"
 msgstr ""
 
-#: ../../include/nav.php:130
-msgid "Manage/edit friends and contacts"
+#: ../../addon/statusnet/statusnet.php:283
+msgid ""
+"No consumer key pair for StatusNet found. Register your Friendica Account as "
+"an desktop client on your StatusNet account, copy the consumer key pair here "
+"and enter the API base root.<br />Before you register your own OAuth key "
+"pair ask the administrator if there is already a key pair for this Friendica "
+"installation at your favorited StatusNet installation."
 msgstr ""
 
-#: ../../include/nav.php:137
-msgid "Admin"
+#: ../../addon/statusnet/statusnet.php:285
+msgid "OAuth Consumer Key"
 msgstr ""
 
-#: ../../include/nav.php:137
-msgid "Site setup and configuration"
+#: ../../addon/statusnet/statusnet.php:288
+msgid "OAuth Consumer Secret"
 msgstr ""
 
-#: ../../include/nav.php:160
-msgid "Nothing new here"
+#: ../../addon/statusnet/statusnet.php:291
+msgid "Base API Path (remember the trailing /)"
 msgstr ""
 
-#: ../../include/message.php:14
-msgid "[no subject]"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"To connect to your StatusNet account click the button below to get a "
+"security code from StatusNet which you have to copy into the input box below "
+"and submit the form. Only your <strong>public</strong> posts will be posted "
+"to StatusNet."
 msgstr ""
 
-#: ../../include/profile_advanced.php:17 ../../boot.php:963
-msgid "Gender:"
+#: ../../addon/statusnet/statusnet.php:313
+msgid "Log in with StatusNet"
 msgstr ""
 
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
+#: ../../addon/statusnet/statusnet.php:315
+msgid "Copy the security code from StatusNet here"
 msgstr ""
 
-#: ../../include/profile_advanced.php:23
-msgid "j F"
+#: ../../addon/statusnet/statusnet.php:321
+msgid "Cancel Connection Process"
 msgstr ""
 
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
+#: ../../addon/statusnet/statusnet.php:323
+msgid "Current StatusNet API is"
 msgstr ""
 
-#: ../../include/profile_advanced.php:37 ../../boot.php:966
-msgid "Status:"
+#: ../../addon/statusnet/statusnet.php:324
+msgid "Cancel StatusNet Connection"
 msgstr ""
 
-#: ../../include/profile_advanced.php:45 ../../boot.php:968
-msgid "Homepage:"
+#: ../../addon/statusnet/statusnet.php:335 ../../addon/twitter/twitter.php:189
+msgid "Currently connected to: "
 msgstr ""
 
-#: ../../include/profile_advanced.php:49
-msgid "Religion:"
+#: ../../addon/statusnet/statusnet.php:336
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
 msgstr ""
 
-#: ../../include/profile_advanced.php:51
-msgid "About:"
+#: ../../addon/statusnet/statusnet.php:338
+msgid "Allow posting to StatusNet"
 msgstr ""
 
-#: ../../include/profile_advanced.php:53
-msgid "Hobbies/Interests:"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Send public postings to StatusNet by default"
 msgstr ""
 
-#: ../../include/profile_advanced.php:55
-msgid "Contact information and Social Networks:"
+#: ../../addon/statusnet/statusnet.php:346 ../../addon/twitter/twitter.php:200
+msgid "Clear OAuth configuration"
 msgstr ""
 
-#: ../../include/profile_advanced.php:57
-msgid "Musical interests:"
+#: ../../addon/statusnet/statusnet.php:487
+msgid "API URL"
 msgstr ""
 
-#: ../../include/profile_advanced.php:59
-msgid "Books, literature:"
+#: ../../addon/tumblr/tumblr.php:36
+msgid "Post to Tumblr"
 msgstr ""
 
-#: ../../include/profile_advanced.php:61
-msgid "Television:"
+#: ../../addon/tumblr/tumblr.php:67
+msgid "Tumblr Post Settings"
 msgstr ""
 
-#: ../../include/profile_advanced.php:63
-msgid "Film/dance/culture/entertainment:"
+#: ../../addon/tumblr/tumblr.php:69
+msgid "Enable Tumblr Post Plugin"
 msgstr ""
 
-#: ../../include/profile_advanced.php:65
-msgid "Love/Romance:"
+#: ../../addon/tumblr/tumblr.php:74
+msgid "Tumblr login"
 msgstr ""
 
-#: ../../include/profile_advanced.php:67
-msgid "Work/employment:"
+#: ../../addon/tumblr/tumblr.php:79
+msgid "Tumblr password"
 msgstr ""
 
-#: ../../include/profile_advanced.php:69
-msgid "School/education:"
+#: ../../addon/tumblr/tumblr.php:84
+msgid "Post to Tumblr by default"
 msgstr ""
 
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:243
-msgid "Starts:"
+#: ../../addon/numfriends/numfriends.php:46
+msgid "Numfriends settings updated."
 msgstr ""
 
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:251
-msgid "Finishes:"
+#: ../../addon/numfriends/numfriends.php:77
+msgid "Numfriends Settings"
 msgstr ""
 
-#: ../../include/items.php:2413
-msgid "A new person is sharing with you at "
+#: ../../addon/numfriends/numfriends.php:79
+msgid "How many contacts to display on profile sidebar"
 msgstr ""
 
-#: ../../include/items.php:2413
-msgid "You have a new follower at "
+#: ../../addon/wppost/wppost.php:42
+msgid "Post to Wordpress"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Male"
+#: ../../addon/wppost/wppost.php:74
+msgid "WordPress Post Settings"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Female"
+#: ../../addon/wppost/wppost.php:76
+msgid "Enable WordPress Post Plugin"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
+#: ../../addon/wppost/wppost.php:81
+msgid "WordPress username"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress password"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
+#: ../../addon/wppost/wppost.php:91
+msgid "WordPress API URL"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
+#: ../../addon/wppost/wppost.php:96
+msgid "Post to WordPress by default"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
+#: ../../addon/piwik/piwik.php:70
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
+#: ../../addon/piwik/piwik.php:73
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can "
+"set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
+#: ../../addon/piwik/piwik.php:82
+msgid "Piwik Base URL"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
+#: ../../addon/piwik/piwik.php:83
+msgid "Site ID"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
+#: ../../addon/piwik/piwik.php:84
+msgid "Show opt-out cookie link?"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
+#: ../../addon/twitter/twitter.php:78
+msgid "Post to Twitter"
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Other"
+#: ../../addon/twitter/twitter.php:124
+msgid "Twitter settings updated."
 msgstr ""
 
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
+#: ../../addon/twitter/twitter.php:146
+msgid "Twitter Posting Settings"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Males"
+#: ../../addon/twitter/twitter.php:153
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Females"
+#: ../../addon/twitter/twitter.php:172
+msgid ""
+"At this Friendica instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input "
+"box below and submit the form. Only your <strong>public</strong> posts will "
+"be posted to Twitter."
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Gay"
+#: ../../addon/twitter/twitter.php:173
+msgid "Log in with Twitter"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Lesbian"
+#: ../../addon/twitter/twitter.php:175
+msgid "Copy the PIN from Twitter here"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "No Preference"
+#: ../../addon/twitter/twitter.php:190
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for "
+"every posting separately in the posting options when writing the entry."
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Bisexual"
+#: ../../addon/twitter/twitter.php:192
+msgid "Allow posting to Twitter"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Autosexual"
+#: ../../addon/twitter/twitter.php:195
+msgid "Send public postings to Twitter by default"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Abstinent"
+#: ../../addon/twitter/twitter.php:317
+msgid "Consumer key"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Virgin"
+#: ../../addon/twitter/twitter.php:318
+msgid "Consumer secret"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Deviant"
+#: ../../addon/posterous/posterous.php:36
+msgid "Post to Posterous"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Fetish"
+#: ../../addon/posterous/posterous.php:67
+msgid "Posterous Post Settings"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Oodles"
+#: ../../addon/posterous/posterous.php:69
+msgid "Enable Posterous Post Plugin"
 msgstr ""
 
-#: ../../include/profile_selectors.php:19
-msgid "Nonsexual"
+#: ../../addon/posterous/posterous.php:74
+msgid "Posterous login"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Single"
+#: ../../addon/posterous/posterous.php:79
+msgid "Posterous password"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Lonely"
+#: ../../addon/posterous/posterous.php:84
+msgid "Post to Posterous by default"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Available"
+#: ../../include/profile_advanced.php:17 ../../boot.php:978
+msgid "Gender:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Unavailable"
+#: ../../include/profile_advanced.php:22
+msgid "j F, Y"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Dating"
+#: ../../include/profile_advanced.php:23
+msgid "j F"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Unfaithful"
+#: ../../include/profile_advanced.php:30 ../../include/datetime.php:438
+#: ../../include/items.php:1318
+msgid "Birthday:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Sex Addict"
+#: ../../include/profile_advanced.php:34
+msgid "Age:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Friends"
+#: ../../include/profile_advanced.php:37 ../../boot.php:981
+msgid "Status:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Friends/Benefits"
+#: ../../include/profile_advanced.php:45 ../../boot.php:983
+msgid "Homepage:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Casual"
+#: ../../include/profile_advanced.php:47
+msgid "Tags:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Engaged"
+#: ../../include/profile_advanced.php:51
+msgid "Religion:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Married"
+#: ../../include/profile_advanced.php:53
+msgid "About:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Partners"
+#: ../../include/profile_advanced.php:55
+msgid "Hobbies/Interests:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Cohabiting"
+#: ../../include/profile_advanced.php:57
+msgid "Contact information and Social Networks:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Happy"
+#: ../../include/profile_advanced.php:59
+msgid "Musical interests:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Not Looking"
+#: ../../include/profile_advanced.php:61
+msgid "Books, literature:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Swinger"
+#: ../../include/profile_advanced.php:63
+msgid "Television:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Betrayed"
+#: ../../include/profile_advanced.php:65
+msgid "Film/dance/culture/entertainment:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Separated"
+#: ../../include/profile_advanced.php:67
+msgid "Love/Romance:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Unstable"
+#: ../../include/profile_advanced.php:69
+msgid "Work/employment:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Divorced"
+#: ../../include/profile_advanced.php:71
+msgid "School/education:"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Widowed"
+#: ../../include/contact_selectors.php:32
+msgid "Unknown | Not categorised"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Uncertain"
+#: ../../include/contact_selectors.php:33
+msgid "Block immediately"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Complicated"
+#: ../../include/contact_selectors.php:34
+msgid "Shady, spammer, self-marketer"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Don't care"
+#: ../../include/contact_selectors.php:35
+msgid "Known to me, but no opinion"
 msgstr ""
 
-#: ../../include/profile_selectors.php:33
-msgid "Ask me"
+#: ../../include/contact_selectors.php:36
+msgid "OK, probably harmless"
 msgstr ""
 
-#: ../../include/Contact.php:125 ../../include/conversation.php:723
-msgid "View status"
+#: ../../include/contact_selectors.php:37
+msgid "Reputable, has my trust"
 msgstr ""
 
-#: ../../include/Contact.php:126 ../../include/conversation.php:724
-msgid "View profile"
+#: ../../include/contact_selectors.php:56
+msgid "Frequently"
 msgstr ""
 
-#: ../../include/Contact.php:127 ../../include/conversation.php:725
-msgid "View photos"
+#: ../../include/contact_selectors.php:57
+msgid "Hourly"
 msgstr ""
 
-#: ../../include/Contact.php:128 ../../include/Contact.php:141
-#: ../../include/conversation.php:726
-msgid "View recent"
+#: ../../include/contact_selectors.php:58
+msgid "Twice daily"
 msgstr ""
 
-#: ../../include/Contact.php:130 ../../include/Contact.php:141
-#: ../../include/conversation.php:728
-msgid "Send PM"
+#: ../../include/contact_selectors.php:59
+msgid "Daily"
 msgstr ""
 
-#: ../../include/conversation.php:23 ../../include/conversation.php:96
-#: ../../addon/communityhome/communityhome.php:155
-msgid "event"
+#: ../../include/contact_selectors.php:60
+msgid "Weekly"
 msgstr ""
 
-#: ../../include/conversation.php:252 ../../include/conversation.php:508
-msgid "Select"
+#: ../../include/contact_selectors.php:61
+msgid "Monthly"
 msgstr ""
 
-#: ../../include/conversation.php:267 ../../include/conversation.php:602
-#: ../../include/conversation.php:603
-#, php-format
-msgid "View %s's profile @ %s"
+#: ../../include/contact_selectors.php:77
+msgid "OStatus"
 msgstr ""
 
-#: ../../include/conversation.php:276 ../../include/conversation.php:614
-#, php-format
-msgid "%s from %s"
+#: ../../include/contact_selectors.php:78
+msgid "RSS/Atom"
 msgstr ""
 
-#: ../../include/conversation.php:292
-msgid "View in context"
+#: ../../include/contact_selectors.php:82
+msgid "Zot!"
 msgstr ""
 
-#: ../../include/conversation.php:407
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/contact_selectors.php:83
+msgid "LinkedIn"
+msgstr ""
 
-#: ../../include/conversation.php:410 ../../boot.php:439
-msgid "show more"
+#: ../../include/contact_selectors.php:84
+msgid "XMPP/IM"
 msgstr ""
 
-#: ../../include/conversation.php:470
-msgid "like"
+#: ../../include/contact_selectors.php:85
+msgid "MySpace"
 msgstr ""
 
-#: ../../include/conversation.php:471
-msgid "dislike"
+#: ../../include/profile_selectors.php:6
+msgid "Male"
 msgstr ""
 
-#: ../../include/conversation.php:473
-msgid "Share this"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
 msgstr ""
 
-#: ../../include/conversation.php:473
-msgid "share"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
 msgstr ""
 
-#: ../../include/conversation.php:518
-msgid "add star"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
 msgstr ""
 
-#: ../../include/conversation.php:519
-msgid "remove star"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
 msgstr ""
 
-#: ../../include/conversation.php:520
-msgid "toggle star status"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
 msgstr ""
 
-#: ../../include/conversation.php:523
-msgid "starred"
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
 msgstr ""
 
-#: ../../include/conversation.php:524
-msgid "add tag"
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
 msgstr ""
 
-#: ../../include/conversation.php:604
-msgid "to"
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
 msgstr ""
 
-#: ../../include/conversation.php:605
-msgid "Wall-to-Wall"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
 msgstr ""
 
-#: ../../include/conversation.php:606
-msgid "via Wall-To-Wall:"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
 msgstr ""
 
-#: ../../include/conversation.php:648
-msgid "Delete Selected Items"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
 msgstr ""
 
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s likes this."
+#: ../../include/profile_selectors.php:6
+msgid "Other"
 msgstr ""
 
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s doesn't like this."
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
 msgstr ""
 
-#: ../../include/conversation.php:782
-#, php-format
-msgid "<span  %1$s>%2$d people</span> like this."
+#: ../../include/profile_selectors.php:19
+msgid "Males"
 msgstr ""
 
-#: ../../include/conversation.php:784
-#, php-format
-msgid "<span  %1$s>%2$d people</span> don't like this."
+#: ../../include/profile_selectors.php:19
+msgid "Females"
 msgstr ""
 
-#: ../../include/conversation.php:790
-msgid "and"
+#: ../../include/profile_selectors.php:19
+msgid "Gay"
 msgstr ""
 
-#: ../../include/conversation.php:793
-#, php-format
-msgid ", and %d other people"
+#: ../../include/profile_selectors.php:19
+msgid "Lesbian"
 msgstr ""
 
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s like this."
+#: ../../include/profile_selectors.php:19
+msgid "No Preference"
 msgstr ""
 
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s don't like this."
+#: ../../include/profile_selectors.php:19
+msgid "Bisexual"
 msgstr ""
 
-#: ../../include/conversation.php:814
-msgid "Visible to <strong>everybody</strong>"
+#: ../../include/profile_selectors.php:19
+msgid "Autosexual"
 msgstr ""
 
-#: ../../include/conversation.php:816
-msgid "Please enter a video link/URL:"
+#: ../../include/profile_selectors.php:19
+msgid "Abstinent"
 msgstr ""
 
-#: ../../include/conversation.php:817
-msgid "Please enter an audio link/URL:"
+#: ../../include/profile_selectors.php:19
+msgid "Virgin"
 msgstr ""
 
-#: ../../include/conversation.php:818
-msgid "Tag term:"
+#: ../../include/profile_selectors.php:19
+msgid "Deviant"
 msgstr ""
 
-#: ../../include/conversation.php:819
-msgid "Where are you right now?"
+#: ../../include/profile_selectors.php:19
+msgid "Fetish"
 msgstr ""
 
-#: ../../include/conversation.php:820
-msgid "Enter a title for this item"
+#: ../../include/profile_selectors.php:19
+msgid "Oodles"
 msgstr ""
 
-#: ../../include/conversation.php:864
-msgid "upload photo"
+#: ../../include/profile_selectors.php:19
+msgid "Nonsexual"
 msgstr ""
 
-#: ../../include/conversation.php:866
-msgid "attach file"
+#: ../../include/profile_selectors.php:33
+msgid "Single"
 msgstr ""
 
-#: ../../include/conversation.php:868
-msgid "web link"
+#: ../../include/profile_selectors.php:33
+msgid "Lonely"
 msgstr ""
 
-#: ../../include/conversation.php:869
-msgid "Insert video link"
+#: ../../include/profile_selectors.php:33
+msgid "Available"
 msgstr ""
 
-#: ../../include/conversation.php:870
-msgid "video link"
+#: ../../include/profile_selectors.php:33
+msgid "Unavailable"
 msgstr ""
 
-#: ../../include/conversation.php:871
-msgid "Insert audio link"
+#: ../../include/profile_selectors.php:33
+msgid "Dating"
 msgstr ""
 
-#: ../../include/conversation.php:872
-msgid "audio link"
+#: ../../include/profile_selectors.php:33
+msgid "Unfaithful"
 msgstr ""
 
-#: ../../include/conversation.php:874
-msgid "set location"
+#: ../../include/profile_selectors.php:33
+msgid "Sex Addict"
 msgstr ""
 
-#: ../../include/conversation.php:876
-msgid "clear location"
+#: ../../include/profile_selectors.php:33
+msgid "Friends"
 msgstr ""
 
-#: ../../include/conversation.php:878
-msgid "Set title"
+#: ../../include/profile_selectors.php:33
+msgid "Friends/Benefits"
 msgstr ""
 
-#: ../../include/conversation.php:881
-msgid "permissions"
+#: ../../include/profile_selectors.php:33
+msgid "Casual"
 msgstr ""
 
-#: ../../include/notifier.php:628 ../../include/delivery.php:415
-msgid "(no subject)"
+#: ../../include/profile_selectors.php:33
+msgid "Engaged"
 msgstr ""
 
-#: ../../include/notifier.php:635 ../../include/enotify.php:16
-msgid "noreply"
+#: ../../include/profile_selectors.php:33
+msgid "Married"
 msgstr ""
 
-#: ../../include/diaspora.php:570
-msgid "Sharing notification from Diaspora network"
+#: ../../include/profile_selectors.php:33
+msgid "Partners"
 msgstr ""
 
-#: ../../include/diaspora.php:1862
-msgid "Attachments:"
+#: ../../include/profile_selectors.php:33
+msgid "Cohabiting"
 msgstr ""
 
-#: ../../include/diaspora.php:2045
-#, php-format
-msgid "[Relayed] Comment authored by %s from network %s"
+#: ../../include/profile_selectors.php:33
+msgid "Happy"
 msgstr ""
 
-#: ../../include/bb2diaspora.php:53
-msgid "view full size"
+#: ../../include/profile_selectors.php:33
+msgid "Not Looking"
 msgstr ""
 
-#: ../../include/bb2diaspora.php:102 ../../include/bb2diaspora.php:112
-msgid "image/photo"
+#: ../../include/profile_selectors.php:33
+msgid "Swinger"
 msgstr ""
 
-#: ../../include/bb2diaspora.php:102 ../../addon/facebook/facebook.php:869
-#: ../../addon/facebook/facebook.php:878
-msgid "link"
+#: ../../include/profile_selectors.php:33
+msgid "Betrayed"
 msgstr ""
 
-#: ../../include/acl_selectors.php:279
-msgid "Visible to everybody"
+#: ../../include/profile_selectors.php:33
+msgid "Separated"
 msgstr ""
 
-#: ../../include/acl_selectors.php:280
-msgid "show"
+#: ../../include/profile_selectors.php:33
+msgid "Unstable"
 msgstr ""
 
-#: ../../include/acl_selectors.php:281
-msgid "don't show"
+#: ../../include/profile_selectors.php:33
+msgid "Divorced"
 msgstr ""
 
-#: ../../include/enotify.php:8
-msgid "Friendica Notification"
+#: ../../include/profile_selectors.php:33
+msgid "Widowed"
 msgstr ""
 
-#: ../../include/enotify.php:11
-msgid "Thank You,"
+#: ../../include/profile_selectors.php:33
+msgid "Uncertain"
 msgstr ""
 
-#: ../../include/enotify.php:13
-#, php-format
-msgid "%s Administrator"
+#: ../../include/profile_selectors.php:33
+msgid "Complicated"
 msgstr ""
 
-#: ../../include/enotify.php:28
-#, php-format
-msgid "New mail received at %s"
+#: ../../include/profile_selectors.php:33
+msgid "Don't care"
 msgstr ""
 
-#: ../../include/enotify.php:30
-#, php-format
-msgid "%s sent you a new private message at %s."
+#: ../../include/profile_selectors.php:33
+msgid "Ask me"
 msgstr ""
 
-#: ../../include/enotify.php:32
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
+#: ../../include/event.php:17 ../../include/bb2diaspora.php:255
+msgid "Starts:"
 msgstr ""
 
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s commented on an item at %s"
+#: ../../include/event.php:27 ../../include/bb2diaspora.php:263
+msgid "Finishes:"
 msgstr ""
 
-#: ../../include/enotify.php:41
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
+#: ../../include/delivery.php:416 ../../include/notifier.php:629
+msgid "(no subject)"
 msgstr ""
 
-#: ../../include/enotify.php:42 ../../include/enotify.php:51
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
+#: ../../include/delivery.php:423 ../../include/enotify.php:16
+#: ../../include/notifier.php:636
+msgid "noreply"
 msgstr ""
 
-#: ../../include/enotify.php:49
-#, php-format
-msgid "%s posted to your profile wall at %s"
+#: ../../include/text.php:232
+msgid "prev"
 msgstr ""
 
-#: ../../include/enotify.php:58
-#, php-format
-msgid "Introduction received at %s"
+#: ../../include/text.php:234
+msgid "first"
 msgstr ""
 
-#: ../../include/enotify.php:59
-#, php-format
-msgid "You've received an introduction from '%s' at %s"
+#: ../../include/text.php:263
+msgid "last"
 msgstr ""
 
-#: ../../include/enotify.php:60 ../../include/enotify.php:73
-#, php-format
-msgid "You may visit their profile at %s"
+#: ../../include/text.php:266
+msgid "next"
 msgstr ""
 
-#: ../../include/enotify.php:62
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
+#: ../../include/text.php:557
+msgid "No contacts"
 msgstr ""
 
-#: ../../include/enotify.php:69
+#: ../../include/text.php:566
 #, php-format
-msgid "Friend suggestion received at %s"
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/text.php:637 ../../include/nav.php:87
+msgid "Search"
 msgstr ""
 
-#: ../../include/enotify.php:70
-#, php-format
-msgid "You've received a friend suggestion from '%s' at %s"
+#: ../../include/text.php:735
+msgid "Monday"
 msgstr ""
 
-#: ../../include/enotify.php:71
-msgid "Name:"
+#: ../../include/text.php:735
+msgid "Tuesday"
 msgstr ""
 
-#: ../../include/enotify.php:72
-msgid "Photo:"
+#: ../../include/text.php:735
+msgid "Wednesday"
 msgstr ""
 
-#: ../../include/enotify.php:75
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
+#: ../../include/text.php:735
+msgid "Thursday"
 msgstr ""
 
-#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
-msgid "Image/photo"
+#: ../../include/text.php:735
+msgid "Friday"
 msgstr ""
 
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
+#: ../../include/text.php:735
+msgid "Saturday"
 msgstr ""
 
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
+#: ../../include/text.php:735
+msgid "Sunday"
 msgstr ""
 
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
+#: ../../include/text.php:739
+msgid "January"
 msgstr ""
 
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
+#: ../../include/text.php:739
+msgid "February"
 msgstr ""
 
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
+#: ../../include/text.php:739
+msgid "March"
 msgstr ""
 
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
+#: ../../include/text.php:739
+msgid "April"
 msgstr ""
 
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
+#: ../../include/text.php:739
+msgid "May"
 msgstr ""
 
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
+#: ../../include/text.php:739
+msgid "June"
 msgstr ""
 
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
+#: ../../include/text.php:739
+msgid "July"
 msgstr ""
 
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
+#: ../../include/text.php:739
+msgid "August"
 msgstr ""
 
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
+#: ../../include/text.php:739
+msgid "September"
 msgstr ""
 
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
+#: ../../include/text.php:739
+msgid "October"
 msgstr ""
 
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
+#: ../../include/text.php:739
+msgid "November"
 msgstr ""
 
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
+#: ../../include/text.php:739
+msgid "December"
 msgstr ""
 
-#: ../../include/contact_selectors.php:81
-#: ../../addon/facebook/facebook.php:475
-msgid "Facebook"
+#: ../../include/text.php:809
+msgid "bytes"
 msgstr ""
 
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
+#: ../../include/text.php:901
+msgid "Select an alternate language"
 msgstr ""
 
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
+#: ../../include/text.php:913
+msgid "default"
 msgstr ""
 
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
+#: ../../include/diaspora.php:570
+msgid "Sharing notification from Diaspora network"
 msgstr ""
 
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
+#: ../../include/diaspora.php:1895
+msgid "Attachments:"
 msgstr ""
 
-#: ../../include/auth.php:27
-msgid "Logged out."
+#: ../../include/diaspora.php:2078
+#, php-format
+msgid "[Relayed] Comment authored by %s from network %s"
 msgstr ""
 
 #: ../../include/oembed.php:128
@@ -4673,746 +4929,698 @@ msgstr ""
 msgid "Create a new group"
 msgstr ""
 
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr ""
-
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr ""
-
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr ""
-
-#: ../../include/contact_widgets.php:18
-msgid "Invite Friends"
+#: ../../include/nav.php:44 ../../boot.php:705
+msgid "Logout"
 msgstr ""
 
-#: ../../include/contact_widgets.php:24
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../include/contact_widgets.php:30
-msgid "Find People"
+#: ../../include/nav.php:44
+msgid "End this session"
 msgstr ""
 
-#: ../../include/contact_widgets.php:31
-msgid "Enter name or interest"
+#: ../../include/nav.php:47 ../../boot.php:1327
+msgid "Status"
 msgstr ""
 
-#: ../../include/contact_widgets.php:32
-msgid "Connect/Follow"
+#: ../../include/nav.php:47 ../../include/nav.php:111
+msgid "Your posts and conversations"
 msgstr ""
 
-#: ../../include/contact_widgets.php:33
-msgid "Examples: Robert Morgenstein, Fishing"
+#: ../../include/nav.php:48
+msgid "Your profile page"
 msgstr ""
 
-#: ../../include/contact_widgets.php:36
-msgid "Similar Interests"
+#: ../../include/nav.php:49 ../../boot.php:1337
+msgid "Photos"
 msgstr ""
 
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
+#: ../../include/nav.php:49
+msgid "Your photos"
 msgstr ""
 
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
+#: ../../include/nav.php:50
+msgid "Your events"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:337
-msgid "Facebook disabled"
+#: ../../include/nav.php:51
+msgid "Personal notes"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:342
-msgid "Updating contacts"
+#: ../../include/nav.php:51
+msgid "Your personal photos"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:351
-msgid "Facebook API key is missing."
+#: ../../include/nav.php:62
+msgid "Sign in"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:358
-msgid "Facebook Connect"
+#: ../../include/nav.php:73
+msgid "Home Page"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:364
-msgid "Install Facebook connector for this account."
+#: ../../include/nav.php:77
+msgid "Create an account"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:371
-msgid "Remove Facebook connector"
+#: ../../include/nav.php:82
+msgid "Help and documentation"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:376
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
+#: ../../include/nav.php:85
+msgid "Apps"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:383
-msgid "Post to Facebook by default"
+#: ../../include/nav.php:85
+msgid "Addon applications, utilities, games"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:387
-msgid "Link all your Facebook friends and conversations on this website"
+#: ../../include/nav.php:87
+msgid "Search site content"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:389
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend "
-"<em>stream</em>."
+#: ../../include/nav.php:97
+msgid "Conversations on this site"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:390
-msgid "On this website, your Facebook friend stream is only visible to you."
+#: ../../include/nav.php:99
+msgid "Directory"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:391
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
+#: ../../include/nav.php:99
+msgid "People directory"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:395
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
+#: ../../include/nav.php:109
+msgid "Conversations from your friends"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:400
-msgid "Do not import your Facebook profile wall conversations"
+#: ../../include/nav.php:117
+msgid "Friend Requests"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:402
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked, "
-"your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
+#: ../../include/nav.php:119
+msgid "See all notifications"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:407
-msgid "Comma separated applications to ignore"
+#: ../../include/nav.php:123
+msgid "Private mail"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:476
-msgid "Facebook Connector Settings"
+#: ../../include/nav.php:126
+msgid "Manage"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:490
-msgid "Post to Facebook"
+#: ../../include/nav.php:126
+msgid "Manage other pages"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:581
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Profiles"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:644
-msgid "Image: "
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Manage/edit profiles"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:720
-msgid "View on Friendica"
+#: ../../include/nav.php:131
+msgid "Manage/edit friends and contacts"
 msgstr ""
 
-#: ../../addon/facebook/facebook.php:744
-msgid "Facebook post failed. Queued for retry."
+#: ../../include/nav.php:138
+msgid "Admin"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:41
-msgid "Post to Wordpress"
+#: ../../include/nav.php:138
+msgid "Site setup and configuration"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:73
-msgid "WordPress Post Settings"
+#: ../../include/nav.php:161
+msgid "Nothing new here"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:75
-msgid "Enable WordPress Post Plugin"
+#: ../../include/contact_widgets.php:6
+msgid "Add New Contact"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:80
-msgid "WordPress username"
+#: ../../include/contact_widgets.php:7
+msgid "Enter address or web location"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:85
-msgid "WordPress password"
+#: ../../include/contact_widgets.php:8
+msgid "Example: bob@example.com, http://example.com/barbara"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:90
-msgid "WordPress API URL"
+#: ../../include/contact_widgets.php:18
+msgid "Invite Friends"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:95
-msgid "Post to WordPress by default"
+#: ../../include/contact_widgets.php:24
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/contact_widgets.php:30
+msgid "Find People"
 msgstr ""
 
-#: ../../addon/wppost/wppost.php:171 ../../addon/tumblr/tumblr.php:174
-#: ../../addon/posterous/posterous.php:172
-msgid "Post from Friendica"
+#: ../../include/contact_widgets.php:31
+msgid "Enter name or interest"
 msgstr ""
 
-#: ../../addon/uhremotestorage/uhremotestorage.php:56
-#, php-format
-msgid ""
-"Allow to use your friendika id (%s) to connecto to external unhosted-enabled "
-"storage (like ownCloud)"
+#: ../../include/contact_widgets.php:32
+msgid "Connect/Follow"
 msgstr ""
 
-#: ../../addon/uhremotestorage/uhremotestorage.php:57
-msgid "Unhosted DAV storage url"
+#: ../../include/contact_widgets.php:33
+msgid "Examples: Robert Morgenstein, Fishing"
 msgstr ""
 
-#: ../../addon/tumblr/tumblr.php:35
-msgid "Post to Tumblr"
+#: ../../include/contact_widgets.php:36
+msgid "Similar Interests"
 msgstr ""
 
-#: ../../addon/tumblr/tumblr.php:66
-msgid "Tumblr Post Settings"
+#: ../../include/contact_widgets.php:68
+msgid "Networks"
 msgstr ""
 
-#: ../../addon/tumblr/tumblr.php:68
-msgid "Enable Tumblr Post Plugin"
+#: ../../include/contact_widgets.php:71
+msgid "All Networks"
 msgstr ""
 
-#: ../../addon/tumblr/tumblr.php:73
-msgid "Tumblr login"
+#: ../../include/auth.php:29
+msgid "Logged out."
 msgstr ""
 
-#: ../../addon/tumblr/tumblr.php:78
-msgid "Tumblr password"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
 msgstr ""
 
-#: ../../addon/tumblr/tumblr.php:83
-msgid "Post to Tumblr by default"
+#: ../../include/datetime.php:121 ../../include/datetime.php:253
+msgid "year"
 msgstr ""
 
-#: ../../addon/oembed/oembed.php:30
-msgid "OEmbed settings updated"
+#: ../../include/datetime.php:126 ../../include/datetime.php:254
+msgid "month"
 msgstr ""
 
-#: ../../addon/oembed/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
+#: ../../include/datetime.php:131 ../../include/datetime.php:256
+msgid "day"
 msgstr ""
 
-#: ../../addon/oembed/oembed.php:71
-msgid "URL to embed:"
+#: ../../include/datetime.php:244
+msgid "never"
 msgstr ""
 
-#: ../../addon/posterous/posterous.php:35
-msgid "Post to Posterous"
+#: ../../include/datetime.php:250
+msgid "less than a second ago"
 msgstr ""
 
-#: ../../addon/posterous/posterous.php:66
-msgid "Posterous Post Settings"
+#: ../../include/datetime.php:253
+msgid "years"
 msgstr ""
 
-#: ../../addon/posterous/posterous.php:68
-msgid "Enable Posterous Post Plugin"
+#: ../../include/datetime.php:254
+msgid "months"
 msgstr ""
 
-#: ../../addon/posterous/posterous.php:73
-msgid "Posterous login"
+#: ../../include/datetime.php:255
+msgid "week"
 msgstr ""
 
-#: ../../addon/posterous/posterous.php:78
-msgid "Posterous password"
+#: ../../include/datetime.php:255
+msgid "weeks"
 msgstr ""
 
-#: ../../addon/posterous/posterous.php:83
-msgid "Post to Posterous by default"
+#: ../../include/datetime.php:256
+msgid "days"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
+#: ../../include/datetime.php:257
+msgid "hour"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
+#: ../../include/datetime.php:257
+msgid "hours"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
+#: ../../include/datetime.php:258
+msgid "minute"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:294
-msgid "No files were uploaded."
+#: ../../include/datetime.php:258
+msgid "minutes"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:300
-msgid "Uploaded file is empty"
+#: ../../include/datetime.php:259
+msgid "second"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:323
-msgid "File has an invalid extension, it should be one of "
+#: ../../include/datetime.php:259
+msgid "seconds"
 msgstr ""
 
-#: ../../addon/js_upload/js_upload.php:334
-msgid "Upload was cancelled, or server error encountered"
+#: ../../include/datetime.php:267
+#, php-format
+msgid "%1$d %2$s ago"
 msgstr ""
 
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
+#: ../../include/poller.php:459
+msgid "From: "
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:141
-msgid "Post to StatusNet"
+#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
+msgid "Image/photo"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:183
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
+#: ../../include/dba.php:39
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:211
-msgid "We could not contact the StatusNet API with the Path you entered."
+#: ../../include/message.php:14
+msgid "[no subject]"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:238
-msgid "StatusNet settings updated."
+#: ../../include/acl_selectors.php:279
+msgid "Visible to everybody"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:261
-msgid "StatusNet Posting Settings"
+#: ../../include/acl_selectors.php:280
+msgid "show"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:275
-msgid "Globally Available StatusNet OAuthKeys"
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:276
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
+#: ../../include/enotify.php:8
+msgid "Friendica Notification"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:284
-msgid "Provide your own OAuth Credentials"
+#: ../../include/enotify.php:11
+msgid "Thank You,"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:285
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as "
-"an desktop client on your StatusNet account, copy the consumer key pair here "
-"and enter the API base root.<br />Before you register your own OAuth key "
-"pair ask the administrator if there is already a key pair for this Friendica "
-"installation at your favorited StatusNet installation."
+#: ../../include/enotify.php:13
+#, php-format
+msgid "%s Administrator"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:287
-msgid "OAuth Consumer Key"
+#: ../../include/enotify.php:28
+#, php-format
+msgid "New mail received at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:290
-msgid "OAuth Consumer Secret"
+#: ../../include/enotify.php:30
+#, php-format
+msgid "%s sent you a new private message at %s."
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:293
-msgid "Base API Path (remember the trailing /)"
+#: ../../include/enotify.php:32
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:314
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below "
-"and submit the form. Only your <strong>public</strong> posts will be posted "
-"to StatusNet."
+#: ../../include/enotify.php:40
+#, php-format
+msgid "%s commented on an item at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:315
-msgid "Log in with StatusNet"
+#: ../../include/enotify.php:41
+#, php-format
+msgid "%s commented on an item/conversation you have been following."
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:317
-msgid "Copy the security code from StatusNet here"
+#: ../../include/enotify.php:42 ../../include/enotify.php:51
+#: ../../include/enotify.php:60 ../../include/enotify.php:69
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:323
-msgid "Cancel Connection Process"
+#: ../../include/enotify.php:49
+#, php-format
+msgid "%s posted to your profile wall at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:325
-msgid "Current StatusNet API is"
+#: ../../include/enotify.php:58
+#, php-format
+msgid "%s tagged you at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:326
-msgid "Cancel StatusNet Connection"
+#: ../../include/enotify.php:67
+#, php-format
+msgid "%s tagged your post at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:337 ../../addon/twitter/twitter.php:188
-msgid "Currently connected to: "
+#: ../../include/enotify.php:76
+#, php-format
+msgid "Introduction received at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:338
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
+#: ../../include/enotify.php:77
+#, php-format
+msgid "You've received an introduction from '%s' at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:340
-msgid "Allow posting to StatusNet"
+#: ../../include/enotify.php:78 ../../include/enotify.php:91
+#, php-format
+msgid "You may visit their profile at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:343
-msgid "Send public postings to StatusNet by default"
+#: ../../include/enotify.php:80
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:348 ../../addon/twitter/twitter.php:199
-msgid "Clear OAuth configuration"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "Friend suggestion received at %s"
 msgstr ""
 
-#: ../../addon/statusnet/statusnet.php:478
-msgid "API URL"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "You've received a friend suggestion from '%s' at %s"
 msgstr ""
 
-#: ../../addon/widgets/widgets.php:55
-msgid "Generate new key"
+#: ../../include/enotify.php:89
+msgid "Name:"
 msgstr ""
 
-#: ../../addon/widgets/widgets.php:58
-msgid "Widgets key"
+#: ../../include/enotify.php:90
+msgid "Photo:"
 msgstr ""
 
-#: ../../addon/widgets/widgets.php:60
-msgid "Widgets available"
+#: ../../include/enotify.php:93
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
 msgstr ""
 
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
+#: ../../include/items.php:2450
+msgid "A new person is sharing with you at "
 msgstr ""
 
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/items.php:2450
+msgid "You have a new follower at "
+msgstr ""
 
-#: ../../addon/twitter/twitter.php:78
-msgid "Post to Twitter"
+#: ../../include/bb2diaspora.php:64
+msgid "view full size"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:123
-msgid "Twitter settings updated."
+#: ../../include/bb2diaspora.php:113 ../../include/bb2diaspora.php:123
+#: ../../include/bb2diaspora.php:124
+msgid "image/photo"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:145
-msgid "Twitter Posting Settings"
+#: ../../include/security.php:20
+msgid "Welcome "
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:152
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
+#: ../../include/security.php:21
+msgid "Please upload a profile photo."
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:171
-msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input "
-"box below and submit the form. Only your <strong>public</strong> posts will "
-"be posted to Twitter."
+#: ../../include/security.php:24
+msgid "Welcome back "
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:172
-msgid "Log in with Twitter"
+#: ../../include/Contact.php:131 ../../include/conversation.php:744
+msgid "View status"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:174
-msgid "Copy the PIN from Twitter here"
+#: ../../include/Contact.php:132 ../../include/conversation.php:745
+msgid "View profile"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:189
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for "
-"every posting separately in the posting options when writing the entry."
+#: ../../include/Contact.php:133 ../../include/conversation.php:746
+msgid "View photos"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:191
-msgid "Allow posting to Twitter"
+#: ../../include/Contact.php:134 ../../include/Contact.php:147
+#: ../../include/conversation.php:747
+msgid "View recent"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:194
-msgid "Send public postings to Twitter by default"
+#: ../../include/Contact.php:136 ../../include/Contact.php:147
+#: ../../include/conversation.php:749
+msgid "Send PM"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:301
-msgid "Consumer key"
+#: ../../include/conversation.php:141
+msgid "post/item"
 msgstr ""
 
-#: ../../addon/twitter/twitter.php:302
-msgid "Consumer secret"
+#: ../../include/conversation.php:142
+#, php-format
+msgid "%1$s marked %2$s's %3$s as favorite"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:25
-msgid "Impressum"
+#: ../../include/conversation.php:279 ../../include/conversation.php:535
+msgid "Select"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:40
-#: ../../addon/impressum/impressum.php:70
-msgid "Site Owner"
+#: ../../include/conversation.php:294 ../../include/conversation.php:623
+#: ../../include/conversation.php:624
+#, php-format
+msgid "View %s's profile @ %s"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:74
-msgid "Email Address"
+#: ../../include/conversation.php:303 ../../include/conversation.php:635
+#, php-format
+msgid "%s from %s"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:43
-#: ../../addon/impressum/impressum.php:72
-msgid "Postal Address"
+#: ../../include/conversation.php:319
+msgid "View in context"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:49
-msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
+#: ../../include/conversation.php:434
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:437 ../../boot.php:444
+msgid "show more"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:71
-msgid "Site Owners Profile"
+#: ../../include/conversation.php:497
+msgid "like"
 msgstr ""
 
-#: ../../addon/impressum/impressum.php:73
-msgid "Notes"
+#: ../../include/conversation.php:498
+msgid "dislike"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "Share this"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "share"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
+#: ../../include/conversation.php:545
+msgid "add star"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
+#: ../../include/conversation.php:546
+msgid "remove star"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
+#: ../../include/conversation.php:547
+msgid "toggle star status"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:61
-msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
+#: ../../include/conversation.php:550
+msgid "starred"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
+#: ../../include/conversation.php:551
+msgid "add tag"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
+#: ../../include/conversation.php:625
+msgid "to"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
+#: ../../include/conversation.php:626
+msgid "Wall-to-Wall"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
+#: ../../include/conversation.php:627
+msgid "via Wall-To-Wall:"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
+#: ../../include/conversation.php:669
+msgid "Delete Selected Items"
 msgstr ""
 
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s likes this."
 msgstr ""
 
-#: ../../addon/piwik/piwik.php:70
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s doesn't like this."
 msgstr ""
 
-#: ../../addon/piwik/piwik.php:73
+#: ../../include/conversation.php:805
 #, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can "
-"set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
+msgid "<span  %1$s>%2$d people</span> like this."
 msgstr ""
 
-#: ../../addon/piwik/piwik.php:82
-msgid "Piwik Base URL"
+#: ../../include/conversation.php:807
+#, php-format
+msgid "<span  %1$s>%2$d people</span> don't like this."
 msgstr ""
 
-#: ../../addon/piwik/piwik.php:83
-msgid "Site ID"
+#: ../../include/conversation.php:813
+msgid "and"
 msgstr ""
 
-#: ../../addon/piwik/piwik.php:84
-msgid "Show opt-out cookie link?"
+#: ../../include/conversation.php:816
+#, php-format
+msgid ", and %d other people"
 msgstr ""
 
-#: ../../addon/membersince/membersince.php:17
+#: ../../include/conversation.php:817
 #, php-format
-msgid " - Member since: %s"
+msgid "%s like this."
 msgstr ""
 
-#: ../../addon/communityhome/communityhome.php:29
-msgid "OpenID"
+#: ../../include/conversation.php:817
+#, php-format
+msgid "%s don't like this."
 msgstr ""
 
-#: ../../addon/communityhome/communityhome.php:38
-msgid "Last users"
+#: ../../include/conversation.php:842
+msgid "Visible to <strong>everybody</strong>"
 msgstr ""
 
-#: ../../addon/communityhome/communityhome.php:81
-msgid "Most active users"
+#: ../../include/conversation.php:844
+msgid "Please enter a video link/URL:"
 msgstr ""
 
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Last photos"
+#: ../../include/conversation.php:845
+msgid "Please enter an audio link/URL:"
 msgstr ""
 
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Last likes"
+#: ../../include/conversation.php:846
+msgid "Tag term:"
 msgstr ""
 
-#: ../../addon/pageheader/pageheader.php:47
-msgid "\"pageheader\" Settings"
+#: ../../include/conversation.php:847
+msgid "Where are you right now?"
 msgstr ""
 
-#: ../../addon/pageheader/pageheader.php:65
-msgid "pageheader Settings saved."
+#: ../../include/conversation.php:848
+msgid "Enter a title for this item"
 msgstr ""
 
-#: ../../addon/randplace/randplace.php:170
-msgid "Randplace Settings"
+#: ../../include/conversation.php:891
+msgid "upload photo"
 msgstr ""
 
-#: ../../addon/randplace/randplace.php:172
-msgid "Enable Randplace Plugin"
+#: ../../include/conversation.php:893
+msgid "attach file"
 msgstr ""
 
-#: ../../addon/blockem/blockem.php:47
-msgid "\"Blockem\" Settings"
+#: ../../include/conversation.php:895
+msgid "web link"
 msgstr ""
 
-#: ../../addon/blockem/blockem.php:49
-msgid "Comma separated profile URLS to block"
+#: ../../include/conversation.php:896
+msgid "Insert video link"
 msgstr ""
 
-#: ../../addon/blockem/blockem.php:66
-msgid "BLOCKEM Settings saved."
+#: ../../include/conversation.php:897
+msgid "video link"
 msgstr ""
 
-#: ../../addon/blockem/blockem.php:104
-#, php-format
-msgid "Blocked %s - Click to open/close"
+#: ../../include/conversation.php:898
+msgid "Insert audio link"
 msgstr ""
 
-#: ../../addon/nsfw/nsfw.php:47
-msgid "\"Not Safe For Work\" Settings"
+#: ../../include/conversation.php:899
+msgid "audio link"
 msgstr ""
 
-#: ../../addon/nsfw/nsfw.php:49
-msgid "Comma separated words to treat as NSFW"
+#: ../../include/conversation.php:901
+msgid "set location"
 msgstr ""
 
-#: ../../addon/nsfw/nsfw.php:66
-msgid "NSFW Settings saved."
+#: ../../include/conversation.php:903
+msgid "clear location"
 msgstr ""
 
-#: ../../addon/nsfw/nsfw.php:102
-#, php-format
-msgid "%s - Click to open/close"
+#: ../../include/conversation.php:908
+msgid "permissions"
 msgstr ""
 
-#: ../../boot.php:437
+#: ../../boot.php:442
 msgid "Delete this item?"
 msgstr ""
 
-#: ../../boot.php:440
+#: ../../boot.php:445
 msgid "show fewer"
 msgstr ""
 
-#: ../../boot.php:683
+#: ../../boot.php:688
 msgid "Create a New Account"
 msgstr ""
 
-#: ../../boot.php:703
+#: ../../boot.php:708
 msgid "Nickname or Email address: "
 msgstr ""
 
-#: ../../boot.php:704
+#: ../../boot.php:709
 msgid "Password: "
 msgstr ""
 
-#: ../../boot.php:707
+#: ../../boot.php:712
 msgid "Or login using OpenID: "
 msgstr ""
 
-#: ../../boot.php:713
+#: ../../boot.php:718
 msgid "Forgot your password?"
 msgstr ""
 
-#: ../../boot.php:860
+#: ../../boot.php:875
 msgid "Edit profile"
 msgstr ""
 
-#: ../../boot.php:1027 ../../boot.php:1098
+#: ../../boot.php:1042 ../../boot.php:1113
 msgid "g A l F d"
 msgstr ""
 
-#: ../../boot.php:1028 ../../boot.php:1099
+#: ../../boot.php:1043 ../../boot.php:1114
 msgid "F d"
 msgstr ""
 
-#: ../../boot.php:1053
+#: ../../boot.php:1068
 msgid "Birthday Reminders"
 msgstr ""
 
-#: ../../boot.php:1054
+#: ../../boot.php:1069
 msgid "Birthdays this week:"
 msgstr ""
 
-#: ../../boot.php:1077 ../../boot.php:1141
+#: ../../boot.php:1092 ../../boot.php:1156
 msgid "[today]"
 msgstr ""
 
-#: ../../boot.php:1122
+#: ../../boot.php:1137
 msgid "Event Reminders"
 msgstr ""
 
-#: ../../boot.php:1123
+#: ../../boot.php:1138
 msgid "Events this week:"
 msgstr ""
 
-#: ../../boot.php:1135
+#: ../../boot.php:1150
 msgid "[No description]"
 msgstr ""
index a28fc411a549a33cf61938166356de95a9b39a16..c992593f853deff2265bdc4d88d4ce527990bf17 100755 (executable)
                                        <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
                                </div>
                                <div class="comment-edit-photo-end"></div>
+                               {{ if $qcomment }}
+                               {{ for $qcomment as $qc }}                              
+                                       <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+                                       &nbsp;
+                               {{ endfor }}
+                               {{ endif }}
                                <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
 
                                <div class="comment-edit-text-end"></div>
index 4dffda1ce407d918707c2196ed0b628585f0c31d..fca3efd54b4ed573c58fd0b07db7b70f6019f68c 100755 (executable)
@@ -1,4 +1,4 @@
-<h1>$header</h1>
+<h1>$header{{ if $total }} ($total){{ endif }}</h1>
 
 $finding
 
@@ -11,8 +11,8 @@ $finding
 </div>
 <div id="contacts-search-end"></div>
 
+$tabs
+
+
 
 
-<div id="contacts-main" >
-<a href="$hide_url" id="contacts-show-hide-link">$hide_text</a>
-</div>
old mode 100755 (executable)
new mode 100644 (file)
index f1c7c14..861f61b
@@ -13,2003 +13,2301 @@ msgid ""
 msgstr ""
 "Project-Id-Version: friendica\n"
 "Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-01-10 08:21-0800\n"
-"PO-Revision-Date: 2012-01-12 11:08+0000\n"
-"Last-Translator: zottel <transifex@zottel.net>\n"
-"Language-Team: German (http://www.transifex.net/projects/p/friendica/team/de/)\n"
+"POT-Creation-Date: 2012-02-12 17:14-0800\n"
+"PO-Revision-Date: 2012-02-16 10:24+0000\n"
+"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.net/projects/p/friendica/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../../mod/allfriends.php:9 ../../mod/follow.php:8
-#: ../../mod/contacts.php:117 ../../mod/settings.php:43
-#: ../../mod/settings.php:48 ../../mod/settings.php:403
-#: ../../mod/crepair.php:113 ../../mod/notifications.php:62
-#: ../../mod/message.php:9 ../../mod/message.php:46
-#: ../../mod/wall_upload.php:42 ../../mod/wall_attach.php:43
+#: ../../mod/oexchange.php:27
+msgid "Post successful."
+msgstr "Beitrag erfolgreich veröffentlicht."
+
+#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
+#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
+msgid "[Embedded content - reload page to view]"
+msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+
+#: ../../mod/crepair.php:102
+msgid "Contact settings applied."
+msgstr "Einstellungen zum Kontakt angewandt."
+
+#: ../../mod/crepair.php:104
+msgid "Contact update failed."
+msgstr "Konnte den Kontakt nicht aktualisieren."
+
+#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:43
+#: ../../mod/fsuggest.php:78 ../../mod/events.php:109 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/photos.php:129 ../../mod/photos.php:865
+#: ../../mod/editpost.php:10 ../../mod/install.php:171
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:125
+#: ../../mod/settings.php:49 ../../mod/settings.php:404
+#: ../../mod/settings.php:409 ../../mod/manage.php:86 ../../mod/network.php:6
+#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
+#: ../../mod/viewcontacts.php:21 ../../mod/register.php:36
+#: ../../mod/regmod.php:111 ../../mod/item.php:123 ../../mod/item.php:139
 #: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:137
 #: ../../mod/profile_photo.php:148 ../../mod/profile_photo.php:159
-#: ../../mod/manage.php:75 ../../mod/common.php:9 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:229 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/register.php:36 ../../mod/fsuggest.php:78
-#: ../../mod/editpost.php:10 ../../mod/regmod.php:111
-#: ../../mod/install.php:171 ../../mod/suggest.php:28
-#: ../../mod/display.php:111 ../../mod/notes.php:20
-#: ../../mod/dfrn_confirm.php:53 ../../mod/item.php:118
-#: ../../mod/photos.php:125 ../../mod/photos.php:860 ../../mod/network.php:6
-#: ../../mod/api.php:26 ../../mod/api.php:31 ../../mod/attach.php:33
-#: ../../mod/viewcontacts.php:21 ../../mod/group.php:19
-#: ../../mod/events.php:109 ../../index.php:288 ../../include/items.php:2867
-#: ../../addon/facebook/facebook.php:331
+#: ../../mod/message.php:9 ../../mod/message.php:46 ../../mod/allfriends.php:9
+#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8 ../../mod/common.php:9
+#: ../../mod/display.php:112 ../../mod/profiles.php:7
+#: ../../mod/profiles.php:229 ../../mod/delegate.php:6
+#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
+#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:331
+#: ../../include/items.php:2907 ../../index.php:288
 msgid "Permission denied."
 msgstr "Zugriff verweigert."
 
-#: ../../mod/allfriends.php:34
+#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
+#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr "Kontakt nicht gefunden."
+
+#: ../../mod/crepair.php:135
+msgid "Repair Contact Settings"
+msgstr "Kontakt-Einstellungen reparieren"
+
+#: ../../mod/crepair.php:137
+msgid ""
+"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
+" information your communications with this contact may stop working."
+msgstr "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr."
+
+#: ../../mod/crepair.php:138
+msgid ""
+"Please use your browser 'Back' button <strong>now</strong> if you are "
+"uncertain what to do on this page."
+msgstr "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was auf dieser Seite gemacht wird."
+
+#: ../../mod/crepair.php:144
+msgid "Return to contact editor"
+msgstr "Zurück zum Kontakteditor"
+
+#: ../../mod/crepair.php:148 ../../mod/settings.php:455
+#: ../../mod/settings.php:481 ../../mod/admin.php:464 ../../mod/admin.php:473
+msgid "Name"
+msgstr "Name"
+
+#: ../../mod/crepair.php:149
+msgid "Account Nickname"
+msgstr "Account-Spitzname"
+
+#: ../../mod/crepair.php:150
+msgid "@Tagname - overrides Name/Nickname"
+msgstr "@Tagname - Ã¼berschreibt Name/Spitzname"
+
+#: ../../mod/crepair.php:151
+msgid "Account URL"
+msgstr "Account-URL"
+
+#: ../../mod/crepair.php:152
+msgid "Friend Request URL"
+msgstr "URL für Freundschaftsanfragen"
+
+#: ../../mod/crepair.php:153
+msgid "Friend Confirm URL"
+msgstr "URL für Bestätigungen von Freundschaftsanfragen"
+
+#: ../../mod/crepair.php:154
+msgid "Notification Endpoint URL"
+msgstr "URL-Endpunkt für Benachrichtigungen"
+
+#: ../../mod/crepair.php:155
+msgid "Poll/Feed URL"
+msgstr "Pull/Feed-URL"
+
+#: ../../mod/crepair.php:156
+msgid "New photo from this URL"
+msgstr "Neues Foto von dieser URL"
+
+#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
+#: ../../mod/events.php:333 ../../mod/photos.php:900 ../../mod/photos.php:958
+#: ../../mod/photos.php:1182 ../../mod/photos.php:1222
+#: ../../mod/photos.php:1262 ../../mod/photos.php:1293
+#: ../../mod/install.php:251 ../../mod/install.php:289
+#: ../../mod/localtime.php:45 ../../mod/contacts.php:319
+#: ../../mod/settings.php:453 ../../mod/settings.php:592
+#: ../../mod/settings.php:773 ../../mod/manage.php:109 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/admin.php:296 ../../mod/admin.php:461
+#: ../../mod/admin.php:587 ../../mod/admin.php:652 ../../mod/profiles.php:375
+#: ../../mod/invite.php:106 ../../addon/facebook/facebook.php:410
+#: ../../addon/yourls/yourls.php:76 ../../addon/nsfw/nsfw.php:57
+#: ../../addon/uhremotestorage/uhremotestorage.php:89
+#: ../../addon/randplace/randplace.php:179 ../../addon/drpost/drpost.php:110
+#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
+#: ../../addon/impressum/impressum.php:69 ../../addon/blockem/blockem.php:57
+#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:94
+#: ../../addon/pageheader/pageheader.php:52
+#: ../../addon/statusnet/statusnet.php:280
+#: ../../addon/statusnet/statusnet.php:294
+#: ../../addon/statusnet/statusnet.php:320
+#: ../../addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:349
+#: ../../addon/statusnet/statusnet.php:495 ../../addon/tumblr/tumblr.php:90
+#: ../../addon/numfriends/numfriends.php:85 ../../addon/wppost/wppost.php:102
+#: ../../addon/piwik/piwik.php:81 ../../addon/twitter/twitter.php:180
+#: ../../addon/twitter/twitter.php:203 ../../addon/twitter/twitter.php:315
+#: ../../addon/posterous/posterous.php:90 ../../include/conversation.php:515
+msgid "Submit"
+msgstr "Senden"
+
+#: ../../mod/help.php:30
+msgid "Help:"
+msgstr "Hilfe:"
+
+#: ../../mod/help.php:34 ../../include/nav.php:82
+msgid "Help"
+msgstr "Hilfe"
+
+#: ../../mod/help.php:38 ../../index.php:221
+msgid "Not Found"
+msgstr "Nicht gefunden"
+
+#: ../../mod/help.php:41 ../../index.php:224
+msgid "Page not found."
+msgstr "Seite nicht gefunden."
+
+#: ../../mod/wall_attach.php:57
 #, php-format
-msgid "Friends of %s"
-msgstr "Freunde von %s"
+msgid "File exceeds size limit of %d"
+msgstr "Die Datei ist größer als das erlaubte Limit von %d"
 
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Keine Freunde zum Anzeigen."
+#: ../../mod/wall_attach.php:85 ../../mod/wall_attach.php:96
+msgid "File upload failed."
+msgstr "Hochladen der Datei fehlgeschlagen."
 
-#: ../../mod/update_profile.php:41 ../../mod/update_network.php:22
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-msgid "[Embedded content - reload page to view]"
-msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Kontaktvorschlag gesendet."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Kontakte vorschlagen"
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Schlage %s einen Kontakt vor"
+
+#: ../../mod/events.php:61
+msgid "Event description and start time are required."
+msgstr "Ereignis Beschreibung und Startzeit sind erforderlich."
+
+#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1345
+msgid "Events"
+msgstr "Veranstaltungen"
 
-#: ../../mod/directory.php:31 ../../mod/dfrn_request.php:624
-#: ../../mod/community.php:16 ../../mod/display.php:7 ../../mod/search.php:71
-#: ../../mod/photos.php:754 ../../mod/viewcontacts.php:16
+#: ../../mod/events.php:207
+msgid "Create New Event"
+msgstr "Neue Veranstaltung erstellen"
+
+#: ../../mod/events.php:210
+msgid "Previous"
+msgstr "Vorherige"
+
+#: ../../mod/events.php:213 ../../mod/install.php:210
+msgid "Next"
+msgstr "Nächste"
+
+#: ../../mod/events.php:220
+msgid "l, F j"
+msgstr "l, F j"
+
+#: ../../mod/events.php:235
+msgid "Edit event"
+msgstr "Veranstaltung bearbeiten"
+
+#: ../../mod/events.php:237 ../../include/text.php:883
+msgid "link to source"
+msgstr "Link zum Originalbeitrag"
+
+#: ../../mod/events.php:305
+msgid "hour:minute"
+msgstr "Stunde:Minute"
+
+#: ../../mod/events.php:314
+msgid "Event details"
+msgstr "Veranstaltungsdetails"
+
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
+msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+
+#: ../../mod/events.php:316
+msgid "Event Starts:"
+msgstr "Veranstaltungsbeginn:"
+
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
+msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
+msgstr "Veranstaltungsende:"
+
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
+msgstr "An Zeitzone des Betrachters anpassen"
+
+#: ../../mod/events.php:326
+msgid "Description:"
+msgstr "Beschreibung"
+
+#: ../../mod/events.php:328 ../../include/event.php:37
+#: ../../include/bb2diaspora.php:271 ../../boot.php:976
+msgid "Location:"
+msgstr "Ort:"
+
+#: ../../mod/events.php:330
+msgid "Share this event"
+msgstr "Veranstaltung teilen"
+
+#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
+#: ../../mod/dfrn_request.php:685 ../../mod/settings.php:454
+#: ../../mod/settings.php:480 ../../addon/js_upload/js_upload.php:45
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Tag entfernt"
+
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Gegenstands-Tag entfernen"
+
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Wähle ein Tag zum Entfernen aus: "
+
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
+msgstr "Entfernen"
+
+#: ../../mod/dfrn_poll.php:91 ../../mod/dfrn_poll.php:517
+#, php-format
+msgid "%s welcomes %s"
+msgstr "%s heißt %s herzlich willkommen"
+
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Verbindung der Applikation authorisieren"
+
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:"
+
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Bitte melde dich an um fortzufahren."
+
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte sowie die Erstellung neuer Beiträge in deinem Namen gestatten?"
+
+#: ../../mod/api.php:105 ../../mod/dfrn_request.php:675
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:524
+#: ../../mod/profiles.php:357
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../mod/api.php:106 ../../mod/dfrn_request.php:676
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:525
+#: ../../mod/profiles.php:358
+msgid "No"
+msgstr "Nein"
+
+#: ../../mod/photos.php:42
+msgid "Photo Albums"
+msgstr "Fotoalben"
+
+#: ../../mod/photos.php:50 ../../mod/photos.php:150 ../../mod/photos.php:879
+#: ../../mod/photos.php:950 ../../mod/photos.php:965 ../../mod/photos.php:1371
+#: ../../mod/photos.php:1383 ../../addon/communityhome/communityhome.php:110
+msgid "Contact Photos"
+msgstr "Kontaktbilder"
+
+#: ../../mod/photos.php:57 ../../mod/photos.php:975 ../../mod/photos.php:1413
+msgid "Upload New Photos"
+msgstr "Weitere Fotos hochladen"
+
+#: ../../mod/photos.php:68 ../../mod/settings.php:11
+msgid "everybody"
+msgstr "jeder"
+
+#: ../../mod/photos.php:139
+msgid "Contact information unavailable"
+msgstr "Kontaktinformationen nicht verfügbar"
+
+#: ../../mod/photos.php:150 ../../mod/photos.php:597 ../../mod/photos.php:950
+#: ../../mod/photos.php:965 ../../mod/register.php:327
+#: ../../mod/register.php:334 ../../mod/register.php:341
+#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
+#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
+#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
+#: ../../addon/communityhome/communityhome.php:111
+msgid "Profile Photos"
+msgstr "Profilbilder"
+
+#: ../../mod/photos.php:160
+msgid "Album not found."
+msgstr "Album nicht gefunden."
+
+#: ../../mod/photos.php:178 ../../mod/photos.php:959
+msgid "Delete Album"
+msgstr "Album löschen"
+
+#: ../../mod/photos.php:241 ../../mod/photos.php:1183
+msgid "Delete Photo"
+msgstr "Foto löschen"
+
+#: ../../mod/photos.php:528
+msgid "was tagged in a"
+msgstr "wurde getaggt in einem"
+
+#: ../../mod/photos.php:528 ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/communityhome/communityhome.php:163
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:31
+#: ../../include/conversation.php:104
+msgid "photo"
+msgstr "Foto"
+
+#: ../../mod/photos.php:528
+msgid "by"
+msgstr "von"
+
+#: ../../mod/photos.php:631 ../../addon/js_upload/js_upload.php:312
+msgid "Image exceeds size limit of "
+msgstr "Die Bildgröße Ã¼bersteigt das Limit von "
+
+#: ../../mod/photos.php:639
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
+
+#: ../../mod/photos.php:653 ../../mod/profile_photo.php:122
+#: ../../mod/wall_upload.php:65
+msgid "Unable to process image."
+msgstr "Konnte das Bild nicht bearbeiten."
+
+#: ../../mod/photos.php:673 ../../mod/profile_photo.php:251
+#: ../../mod/wall_upload.php:84
+msgid "Image upload failed."
+msgstr "Hochladen des Bildes gescheitert."
+
+#: ../../mod/photos.php:759 ../../mod/community.php:16
+#: ../../mod/dfrn_request.php:624 ../../mod/viewcontacts.php:16
+#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:31
 msgid "Public access denied."
 msgstr "Öffentlicher Zugriff verweigert."
 
-#: ../../mod/directory.php:49
-msgid "Global Directory"
-msgstr "Weltweites Verzeichnis"
+#: ../../mod/photos.php:769
+msgid "No photos selected"
+msgstr "Keine Bilder ausgewählt"
 
-#: ../../mod/directory.php:55
-msgid "Normal site view"
-msgstr "Normale Seitenansicht"
+#: ../../mod/photos.php:846
+msgid "Access to this item is restricted."
+msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
 
-#: ../../mod/directory.php:57
-msgid "Admin - View all site entries"
-msgstr "Admin: Alle Einträge dieses Servers anzeigen"
+#: ../../mod/photos.php:907
+msgid "Upload Photos"
+msgstr "Bilder hochladen"
 
-#: ../../mod/directory.php:63
-msgid "Find on this site"
-msgstr "Auf diesem Server suchen"
+#: ../../mod/photos.php:910 ../../mod/photos.php:954
+msgid "New album name: "
+msgstr "Name des neuen Albums: "
 
-#: ../../mod/directory.php:65 ../../mod/contacts.php:372
-msgid "Finding: "
-msgstr "Funde: "
+#: ../../mod/photos.php:911
+msgid "or existing album name: "
+msgstr "oder existierender Albumname: "
 
-#: ../../mod/directory.php:66
-msgid "Site Directory"
-msgstr "Verzeichnis"
+#: ../../mod/photos.php:912
+msgid "Do not show a status post for this upload"
+msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
 
-#: ../../mod/directory.php:67 ../../mod/contacts.php:373
-#: ../../include/contact_widgets.php:34
-msgid "Find"
-msgstr "Finde"
+#: ../../mod/photos.php:914 ../../mod/photos.php:1178
+msgid "Permissions"
+msgstr "Berechtigungen"
 
-#: ../../mod/directory.php:122 ../../mod/profiles.php:426
-msgid "Age: "
-msgstr "Alter: "
+#: ../../mod/photos.php:969
+msgid "Edit Album"
+msgstr "Album bearbeiten"
 
-#: ../../mod/directory.php:125
-msgid "Gender: "
-msgstr "Geschlecht:"
+#: ../../mod/photos.php:984 ../../mod/photos.php:1396
+msgid "View Photo"
+msgstr "Fotos betrachten"
 
-#: ../../mod/directory.php:151
-msgid "No entries (some entries may be hidden)."
-msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
+#: ../../mod/photos.php:1019
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
 
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
-#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:115
-#: ../../include/items.php:2779
-msgid "Item not found."
-msgstr "Beitrag nicht gefunden."
+#: ../../mod/photos.php:1021
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
 
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Zugriff verweigert."
+#: ../../mod/photos.php:1071
+msgid "View photo"
+msgstr "Fotos ansehen"
 
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Willkommen bei Friendica"
+#: ../../mod/photos.php:1071
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
 
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Checkliste für neue Mitglieder"
+#: ../../mod/photos.php:1072
+msgid "Use as profile photo"
+msgstr "Als Profilbild verwenden"
 
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page."
-msgstr ""
-"Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit "
-"Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an,"
-" um weitere Informationen zu erhalten."
+#: ../../mod/photos.php:1078 ../../include/conversation.php:450
+msgid "Private Message"
+msgstr "Private Nachricht"
 
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Settings</em> page -  change your initial password. Also make a "
-"note of your Identity Address. This will be useful in making friends."
-msgstr ""
-"Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei "
-"dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese "
-"wird benötigt um mit Anderen in Kontakt zu treten."
+#: ../../mod/photos.php:1089
+msgid "View Full Size"
+msgstr "Betrachte Originalgröße"
 
-#: ../../mod/newmember.php:18
+#: ../../mod/photos.php:1157
+msgid "Tags: "
+msgstr "Tags: "
+
+#: ../../mod/photos.php:1160
+msgid "[Remove any tag]"
+msgstr "[Tag entfernen]"
+
+#: ../../mod/photos.php:1171
+msgid "New album name"
+msgstr "Name des neuen Albums"
+
+#: ../../mod/photos.php:1174
+msgid "Caption"
+msgstr "Bildunterschrift"
+
+#: ../../mod/photos.php:1176
+msgid "Add a Tag"
+msgstr "Tag hinzufügen"
+
+#: ../../mod/photos.php:1180
 msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr ""
-"Ãœberprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur "
-"Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn "
-"niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es "
-"veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen "
-"wie man dich findet."
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+
+#: ../../mod/photos.php:1200 ../../include/conversation.php:497
+msgid "I like this (toggle)"
+msgstr "Ich mag das (toggle)"
+
+#: ../../mod/photos.php:1201 ../../include/conversation.php:498
+msgid "I don't like this (toggle)"
+msgstr "Ich mag das nicht (toggle)"
+
+#: ../../mod/photos.php:1202 ../../include/conversation.php:889
+msgid "Share"
+msgstr "Teilen"
+
+#: ../../mod/photos.php:1203 ../../mod/editpost.php:100
+#: ../../mod/message.php:155 ../../mod/message.php:296
+#: ../../include/conversation.php:321 ../../include/conversation.php:652
+#: ../../include/conversation.php:906
+msgid "Please wait"
+msgstr "Bitte warten"
+
+#: ../../mod/photos.php:1219 ../../mod/photos.php:1259
+#: ../../mod/photos.php:1290 ../../include/conversation.php:512
+msgid "This is you"
+msgstr "Das bist du"
+
+#: ../../mod/photos.php:1221 ../../mod/photos.php:1261
+#: ../../mod/photos.php:1292 ../../include/conversation.php:514
+#: ../../boot.php:443
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../../mod/photos.php:1223 ../../mod/editpost.php:119
+#: ../../include/conversation.php:516 ../../include/conversation.php:924
+msgid "Preview"
+msgstr "Vorschau"
+
+#: ../../mod/photos.php:1320 ../../mod/settings.php:513
+#: ../../mod/group.php:154 ../../mod/admin.php:468
+#: ../../include/conversation.php:280 ../../include/conversation.php:536
+msgid "Delete"
+msgstr "Löschen"
 
-#: ../../mod/newmember.php:20
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr ""
-"Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben "
-"gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn "
-"du ein Bild von dir selbst verwendest als wenn du dies nicht tust."
+#: ../../mod/photos.php:1402
+msgid "View Album"
+msgstr "Album betrachten"
 
-#: ../../mod/newmember.php:23
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr ""
-"Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook "
-"Konto hast und (optional) deine Facebook Freunde und Unterhaltungen "
-"importieren willst."
+#: ../../mod/photos.php:1411
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
 
-#: ../../mod/newmember.php:28
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr ""
-"Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite "
-"ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden "
-"und Mailinglisten interagieren willlst."
+#: ../../mod/community.php:21
+msgid "Not available."
+msgstr "Nicht verfügbar."
 
-#: ../../mod/newmember.php:30
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr ""
-"Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. "
-"Ãœberprüfe die Einstellungen zum Verbergen deiner Freundesliste vor "
-"unbekannten Betrachtern des Profils."
+#: ../../mod/community.php:30 ../../include/nav.php:97
+msgid "Community"
+msgstr "Gemeinschaft"
 
-#: ../../mod/newmember.php:32
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr ""
-"Trage ein paar Ã¶ffentliche Stichwörter in dein Standardprofil ein, die deine"
-" Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die"
-" deine Interessen teilen und können dir dann Kontakte vorschlagen."
+#: ../../mod/community.php:60 ../../mod/search.php:118
+msgid "No results."
+msgstr "Keine Ergebnisse."
 
-#: ../../mod/newmember.php:34
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr ""
-"Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten"
-" und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise"
-" gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten "
-"<em>Neuen Kontakt hinzufügen</em> ein."
+#: ../../mod/friendica.php:43
+msgid "This is Friendica, version"
+msgstr "Dies ist Friendica version"
 
-#: ../../mod/newmember.php:36
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr ""
-"Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder "
-"anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder "
-"<em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene "
-"Profiladresse an falls du danach gefragt wirst."
+#: ../../mod/friendica.php:44
+msgid "running at web location"
+msgstr "die unter folgender Webadresse zu finden ist"
 
-#: ../../mod/newmember.php:38
+#: ../../mod/friendica.php:46
 msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr ""
-"Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur "
-"privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit "
-"jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
+"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
+"more about the Friendica project."
+msgstr "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr Ã¼ber das Friendica Projekt zu erfahren."
 
-#: ../../mod/newmember.php:40
+#: ../../mod/friendica.php:48
+msgid "Bug reports and issues: please visit"
+msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+
+#: ../../mod/friendica.php:49
 msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr ""
-"Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere "
-"Einzelheiten zu andern Programm Features zu erhalten."
+"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
+"dot com"
+msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com"
 
-#: ../../mod/follow.php:20 ../../mod/dfrn_request.php:370
-msgid "Disallowed profile URL."
-msgstr "Nicht erlaubte Profil-URL."
+#: ../../mod/friendica.php:54
+msgid "Installed plugins/addons/apps"
+msgstr "Installierte Plugins/Erweiterungen/Apps"
 
-#: ../../mod/follow.php:27
-msgid "Connect URL missing."
-msgstr "Connect-URL fehlt"
+#: ../../mod/friendica.php:62
+msgid "No installed plugins/addons/apps"
+msgstr "Keine Plugins/Erweiterungen/Apps installiert"
 
-#: ../../mod/follow.php:47
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr ""
-"Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen "
-"Netzwerken erfolgen kann."
+#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
+msgid "Item not found"
+msgstr "Beitrag nicht gefunden"
 
-#: ../../mod/follow.php:48 ../../mod/follow.php:58
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr ""
-"Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
+#: ../../mod/editpost.php:32
+msgid "Edit post"
+msgstr "Beitrag bearbeiten"
 
-#: ../../mod/follow.php:56
-msgid "The profile address specified does not provide adequate information."
-msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+#: ../../mod/editpost.php:76 ../../include/conversation.php:875
+msgid "Post to Email"
+msgstr "An E-Mail senden"
 
-#: ../../mod/follow.php:60
-msgid "An author or name was not found."
-msgstr "Es wurde kein Autor oder Name gefunden."
+#: ../../mod/editpost.php:91 ../../mod/settings.php:512
+#: ../../include/conversation.php:523
+msgid "Edit"
+msgstr "Bearbeiten"
 
-#: ../../mod/follow.php:62
-msgid "No browser URL could be matched to this address."
-msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
+#: ../../mod/editpost.php:92 ../../mod/message.php:153
+#: ../../mod/message.php:294 ../../include/conversation.php:890
+msgid "Upload photo"
+msgstr "Foto hochladen"
 
-#: ../../mod/follow.php:69
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr ""
-"Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die "
-"Kommunikation auf dieser Seite ausgeschaltet wurde."
+#: ../../mod/editpost.php:93 ../../include/conversation.php:892
+msgid "Attach file"
+msgstr "Datei anhängen"
 
-#: ../../mod/follow.php:74
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr ""
-"Eingeschränktes Profil. Diese Person wird keine direkten/privaten "
-"Nachrichten von dir erhalten können."
+#: ../../mod/editpost.php:94 ../../mod/message.php:154
+#: ../../mod/message.php:295 ../../include/conversation.php:894
+msgid "Insert web link"
+msgstr "Weblink einfügen"
 
-#: ../../mod/follow.php:144
-msgid "Unable to retrieve contact information."
-msgstr "Konnte die Kontaktinformationen nicht empfangen."
+#: ../../mod/editpost.php:95
+msgid "Insert YouTube video"
+msgstr "YouTube-Video einfügen"
 
-#: ../../mod/follow.php:190
-msgid "following"
-msgstr "folgen"
+#: ../../mod/editpost.php:96
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Vorbis [.ogg] Video einfügen"
 
-#: ../../mod/dirfind.php:23
-msgid "People Search"
-msgstr "Personen Suche"
+#: ../../mod/editpost.php:97
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Vorbis [.ogg] Audio einfügen"
 
-#: ../../mod/dirfind.php:57 ../../mod/match.php:65
-msgid "No matches"
-msgstr "Keine Ãœbereinstimmungen"
+#: ../../mod/editpost.php:98 ../../include/conversation.php:900
+msgid "Set your location"
+msgstr "Deinen Standort festlegen"
 
-#: ../../mod/contacts.php:62 ../../mod/contacts.php:135
-msgid "Could not access contact record."
-msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
+#: ../../mod/editpost.php:99 ../../include/conversation.php:902
+msgid "Clear browser location"
+msgstr "Browser-Standort leeren"
 
-#: ../../mod/contacts.php:76
-msgid "Could not locate selected profile."
-msgstr "Konnte das ausgewählte Profil nicht finden."
+#: ../../mod/editpost.php:101 ../../include/conversation.php:907
+msgid "Permission settings"
+msgstr "Berechtigungseinstellungen"
 
-#: ../../mod/contacts.php:99
-msgid "Contact updated."
-msgstr "Kontakt aktualisiert."
+#: ../../mod/editpost.php:109 ../../include/conversation.php:916
+msgid "CC: email addresses"
+msgstr "Cc:-E-Mail-Addressen"
 
-#: ../../mod/contacts.php:101 ../../mod/dfrn_request.php:439
-msgid "Failed to update contact record."
-msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
+#: ../../mod/editpost.php:110 ../../include/conversation.php:917
+msgid "Public post"
+msgstr "Öffentlicher Beitrag"
 
-#: ../../mod/contacts.php:157
-msgid "Contact has been blocked"
-msgstr "Kontakt wurde blockiert"
+#: ../../mod/editpost.php:113 ../../include/conversation.php:905
+msgid "Set title"
+msgstr "Titel setzen"
 
-#: ../../mod/contacts.php:157
-msgid "Contact has been unblocked"
-msgstr "Kontakt wurde wieder freigegeben"
+#: ../../mod/editpost.php:114 ../../include/conversation.php:919
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Z.B.: bob@example.com, mary@example.com"
 
-#: ../../mod/contacts.php:171
-msgid "Contact has been ignored"
-msgstr "Der Kontakt wurde ignoriert"
+#: ../../mod/dfrn_request.php:92
+msgid "This introduction has already been accepted."
+msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
 
-#: ../../mod/contacts.php:171
-msgid "Contact has been unignored"
-msgstr "Kontakt wurde ignoriert"
+#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung."
 
-#: ../../mod/contacts.php:192
-msgid "stopped following"
-msgstr "wird nicht mehr gefolgt"
+#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden."
 
-#: ../../mod/contacts.php:213
-msgid "Contact has been removed."
-msgstr "Kontakt wurde entfernt."
+#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
+msgid "Warning: profile location has no profile photo."
+msgstr "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden."
 
-#: ../../mod/contacts.php:234
+#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
 #, php-format
-msgid "You are mutual friends with %s"
-msgstr "Du hast mit %s eine beidseitige Freundschaft"
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
+msgstr[1] "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
 
-#: ../../mod/contacts.php:238
-#, php-format
-msgid "You are sharing with %s"
-msgstr "Du teilst mit %s"
+#: ../../mod/dfrn_request.php:167
+msgid "Introduction complete."
+msgstr "Kontaktanfrage abgeschlossen."
 
-#: ../../mod/contacts.php:243
-#, php-format
-msgid "%s is sharing with you"
-msgstr "%s teilt mit Dir"
+#: ../../mod/dfrn_request.php:191
+msgid "Unrecoverable protocol error."
+msgstr "Nicht behebbarer Protokollfehler."
 
-#: ../../mod/contacts.php:260
-msgid "Private communications are not available for this contact."
-msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
+#: ../../mod/dfrn_request.php:219
+msgid "Profile unavailable."
+msgstr "Profil nicht verfügbar."
 
-#: ../../mod/contacts.php:263
-msgid "Never"
-msgstr "Niemals"
+#: ../../mod/dfrn_request.php:244
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s hat heute zu viele Freundschaftsanfragen erhalten."
 
-#: ../../mod/contacts.php:267
-msgid "(Update was successful)"
-msgstr "(Aktualisierung war erfolgreich)"
+#: ../../mod/dfrn_request.php:245
+msgid "Spam protection measures have been invoked."
+msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
 
-#: ../../mod/contacts.php:267
-msgid "(Update was not successful)"
-msgstr "(Aktualisierung war nicht erfolgreich)"
+#: ../../mod/dfrn_request.php:246
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
 
-#: ../../mod/contacts.php:269
-msgid "Suggest friends"
-msgstr "Kontakte vorschlagen"
+#: ../../mod/dfrn_request.php:306
+msgid "Invalid locator"
+msgstr "Ungültiger Locator"
 
-#: ../../mod/contacts.php:273
-#, php-format
-msgid "Network type: %s"
-msgstr "Netzwerk Typ: %s"
+#: ../../mod/dfrn_request.php:326
+msgid "Unable to resolve your name at the provided location."
+msgstr "Konnte deinen Namen an der angegebenen Stelle nicht finden."
+
+#: ../../mod/dfrn_request.php:339
+msgid "You have already introduced yourself here."
+msgstr "Du hast dich hier bereits vorgestellt."
 
-#: ../../mod/contacts.php:276
+#: ../../mod/dfrn_request.php:343
 #, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d gemeinsamer Kontakt"
-msgstr[1] "%d gemeinsame Kontakte"
+msgid "Apparently you are already friends with %s."
+msgstr "Es scheint so, als ob du bereits ein Freund von %s bist."
 
-#: ../../mod/contacts.php:281
-msgid "View all contacts"
-msgstr "Alle Kontakte anzeigen"
+#: ../../mod/dfrn_request.php:364
+msgid "Invalid profile URL."
+msgstr "Ungültige Profil-URL."
 
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
-#: ../../mod/admin.php:470
-msgid "Unblock"
-msgstr "Entsperren"
+#: ../../mod/dfrn_request.php:370 ../../mod/follow.php:20
+msgid "Disallowed profile URL."
+msgstr "Nicht erlaubte Profil-URL."
 
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
-#: ../../mod/admin.php:469
-msgid "Block"
-msgstr "Sperren"
+#: ../../mod/dfrn_request.php:439 ../../mod/contacts.php:102
+msgid "Failed to update contact record."
+msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
 
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-msgid "Unignore"
-msgstr "Ignorieren aufheben"
+#: ../../mod/dfrn_request.php:460
+msgid "Your introduction has been sent."
+msgstr "Deine Kontaktanfrage wurde gesendet."
 
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-#: ../../mod/notifications.php:47 ../../mod/notifications.php:149
-#: ../../mod/notifications.php:194
-msgid "Ignore"
-msgstr "Ignorieren"
+#: ../../mod/dfrn_request.php:513
+msgid "Please login to confirm introduction."
+msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
 
-#: ../../mod/contacts.php:296
-msgid "Repair"
-msgstr "Reparieren"
+#: ../../mod/dfrn_request.php:527
+msgid ""
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr "Incorrect identity currently logged in. Please login to <strong>this</strong> profile."
 
-#: ../../mod/contacts.php:306
-msgid "Contact Editor"
-msgstr "Kontakt Editor"
+#: ../../mod/dfrn_request.php:539
+#, php-format
+msgid "Welcome home %s."
+msgstr "Willkommen zurück %s."
 
-#: ../../mod/contacts.php:308 ../../mod/settings.php:447
-#: ../../mod/settings.php:586 ../../mod/settings.php:767
-#: ../../mod/crepair.php:162 ../../mod/manage.php:106
-#: ../../mod/profiles.php:375 ../../mod/localtime.php:45
-#: ../../mod/invite.php:106 ../../mod/fsuggest.php:107
-#: ../../mod/install.php:250 ../../mod/install.php:288 ../../mod/admin.php:296
-#: ../../mod/admin.php:461 ../../mod/admin.php:587 ../../mod/admin.php:652
-#: ../../mod/photos.php:888 ../../mod/photos.php:946 ../../mod/photos.php:1165
-#: ../../mod/photos.php:1205 ../../mod/photos.php:1245
-#: ../../mod/photos.php:1276 ../../mod/group.php:84 ../../mod/group.php:167
-#: ../../mod/events.php:333 ../../include/conversation.php:488
-#: ../../addon/facebook/facebook.php:410 ../../addon/wppost/wppost.php:101
-#: ../../addon/uhremotestorage/uhremotestorage.php:58
-#: ../../addon/tumblr/tumblr.php:89 ../../addon/oembed/oembed.php:41
-#: ../../addon/posterous/posterous.php:89
-#: ../../addon/statusnet/statusnet.php:282
-#: ../../addon/statusnet/statusnet.php:296
-#: ../../addon/statusnet/statusnet.php:322
-#: ../../addon/statusnet/statusnet.php:329
-#: ../../addon/statusnet/statusnet.php:351
-#: ../../addon/statusnet/statusnet.php:486 ../../addon/twitter/twitter.php:179
-#: ../../addon/twitter/twitter.php:202 ../../addon/twitter/twitter.php:299
-#: ../../addon/impressum/impressum.php:69 ../../addon/piwik/piwik.php:81
-#: ../../addon/pageheader/pageheader.php:52
-#: ../../addon/randplace/randplace.php:178 ../../addon/blockem/blockem.php:53
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Submit"
-msgstr "Senden"
+#: ../../mod/dfrn_request.php:540
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
 
-#: ../../mod/contacts.php:309
-msgid "Profile Visibility"
-msgstr "Profil Anzeige"
+#: ../../mod/dfrn_request.php:541
+msgid "Confirm"
+msgstr "Bestätigen"
 
-#: ../../mod/contacts.php:310
+#: ../../mod/dfrn_request.php:581 ../../include/items.php:2443
+msgid "[Name Withheld]"
+msgstr "[Name Zurückgehalten]"
+
+#: ../../mod/dfrn_request.php:665
 #, php-format
 msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr ""
-"Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein "
-"Profil aufruft."
+"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
+"your Diaspora search bar."
+msgstr "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein."
 
-#: ../../mod/contacts.php:311
-msgid "Contact Information / Notes"
-msgstr "Kontakt Informationen / Notizen"
+#: ../../mod/dfrn_request.php:668
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"social networks:"
+msgstr "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:"
 
-#: ../../mod/contacts.php:312
-msgid "Edit contact notes"
-msgstr "Notizen zum Kontakt bearbiten"
+#: ../../mod/dfrn_request.php:671
+msgid "Friend/Connection Request"
+msgstr "Freundschafts-/Kontaktanfrage"
 
-#: ../../mod/contacts.php:317 ../../mod/contacts.php:433
-#: ../../mod/viewcontacts.php:61
+#: ../../mod/dfrn_request.php:672
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
+msgstr "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+
+#: ../../mod/dfrn_request.php:673
+msgid "Please answer the following:"
+msgstr "Bitte beantworte folgende Fragen:"
+
+#: ../../mod/dfrn_request.php:674
 #, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Besuche %ss Profil [%s]"
+msgid "Does %s know you?"
+msgstr "Kennt %s dich?"
 
-#: ../../mod/contacts.php:318
-msgid "Block/Unblock contact"
-msgstr "Kontakt blockieren/freischalten"
+#: ../../mod/dfrn_request.php:677
+msgid "Add a personal note:"
+msgstr "Eine persönliche Notiz anfügen:"
 
-#: ../../mod/contacts.php:319
-msgid "Ignore contact"
-msgstr "Ignoriere den Kontakt"
+#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
+msgid "Friendica"
+msgstr "Friendica"
 
-#: ../../mod/contacts.php:320
-msgid "Repair URL settings"
-msgstr "URL Einstellungen reparieren"
+#: ../../mod/dfrn_request.php:680
+msgid "StatusNet/Federated Social Web"
+msgstr "StatusNet/Federated Social Web"
 
-#: ../../mod/contacts.php:321
-msgid "View conversations"
-msgstr "Unterhaltungen anzeigen"
+#: ../../mod/dfrn_request.php:681 ../../mod/settings.php:548
+#: ../../include/contact_selectors.php:80
+msgid "Diaspora"
+msgstr "Diaspora"
 
-#: ../../mod/contacts.php:323
-msgid "Delete contact"
-msgstr "Lösche den Kontakt"
+#: ../../mod/dfrn_request.php:682
+msgid "- please share from your own site as noted above"
+msgstr "- bitte fange von Deiner eigenen Seite aus zu teilen an"
 
-#: ../../mod/contacts.php:327
-msgid "Last update:"
-msgstr "letzte Aktualisierung:"
+#: ../../mod/dfrn_request.php:683
+msgid "Your Identity Address:"
+msgstr "Adresse deines Profils:"
 
-#: ../../mod/contacts.php:328
-msgid "Update public posts"
-msgstr "Öffentliche Beiträge aktualisieren"
+#: ../../mod/dfrn_request.php:684
+msgid "Submit Request"
+msgstr "Anfrage abschicken"
 
-#: ../../mod/contacts.php:330 ../../mod/admin.php:701
-msgid "Update now"
-msgstr "Jetzt aktualisieren"
+#: ../../mod/install.php:111
+msgid "Friendica Social Communications Server - Setup"
+msgstr "Friendica-Server für soziale Netzwerke â€“ Setup"
 
-#: ../../mod/contacts.php:337
-msgid "Currently blocked"
-msgstr "Derzeit geblockt"
+#: ../../mod/install.php:117 ../../mod/install.php:157
+#: ../../mod/install.php:230
+msgid "Database connection"
+msgstr "Datenbank-Verbindung"
 
-#: ../../mod/contacts.php:338
-msgid "Currently ignored"
-msgstr "Derzeit ignoriert"
+#: ../../mod/install.php:124
+msgid "Could not connect to database."
+msgstr "Verbindung zur Datenbank gescheitert"
 
-#: ../../mod/contacts.php:339 ../../mod/notifications.php:144
-#: ../../mod/notifications.php:189
-msgid "Hide this contact from others"
-msgstr "Verberge diesen Kontakt vor anderen"
+#: ../../mod/install.php:128
+msgid "Could not create table."
+msgstr "Konnte Tabelle nicht erstellen."
 
-#: ../../mod/contacts.php:339
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr ""
-"Antworten/Likes auf deine Ã¶ffentlichen Beiträge <strong>könnten</strong> "
-"weiterhin sichtbar sein"
+#: ../../mod/install.php:133
+msgid "Your Friendica site database has been installed."
+msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
 
-#: ../../mod/contacts.php:367 ../../include/nav.php:130
-msgid "Contacts"
-msgstr "Kontakte"
+#: ../../mod/install.php:134
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten."
 
-#: ../../mod/contacts.php:369
-msgid "Show Blocked Connections"
-msgstr "Zeige geblockte Verbindungen"
+#: ../../mod/install.php:135 ../../mod/install.php:151
+#: ../../mod/install.php:209
+msgid "Please see the file \"INSTALL.txt\"."
+msgstr "Lies bitte die \"INSTALL.txt\"."
 
-#: ../../mod/contacts.php:369
-msgid "Hide Blocked Connections"
-msgstr "Verstecke geblockte Verbindungen"
+#: ../../mod/install.php:137
+msgid "Proceed to registration"
+msgstr "Mit der Registrierung fortfahren"
 
-#: ../../mod/contacts.php:371
-msgid "Search your contacts"
-msgstr "Suche in deinen Kontakten"
+#: ../../mod/install.php:143
+msgid "Proceed with Installation"
+msgstr "Mit der Installation fortfahren"
 
-#: ../../mod/contacts.php:409
-msgid "Mutual Friendship"
-msgstr "Beidseitige Freundschaft"
+#: ../../mod/install.php:150
+msgid ""
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
+msgstr "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren."
 
-#: ../../mod/contacts.php:413
-msgid "is a fan of yours"
-msgstr "ist ein Fan von dir"
+#: ../../mod/install.php:158
+msgid "Database import failed."
+msgstr "Import der Datenbank schlug fehl."
 
-#: ../../mod/contacts.php:417
-msgid "you are a fan of"
-msgstr "du bist Fan von"
+#: ../../mod/install.php:206
+msgid "System check"
+msgstr "Systemtest"
 
-#: ../../mod/contacts.php:434 ../../include/Contact.php:129
-#: ../../include/conversation.php:727
-msgid "Edit contact"
-msgstr "Kontakt bearbeiten"
+#: ../../mod/install.php:211
+msgid "Check again"
+msgstr "Noch einmal testen"
 
-#: ../../mod/settings.php:11 ../../mod/photos.php:64
-msgid "everybody"
-msgstr "jeder"
+#: ../../mod/install.php:231
+msgid ""
+"In order to install Friendica we need to know how to connect to your "
+"database."
+msgstr "Um Friendica installieren zu können müssen wir wissen wie wir zu deiner Datenbank Kontakt aufnehmen können."
 
-#: ../../mod/settings.php:69
-msgid "Missing some important data!"
-msgstr "Wichtige Daten fehlen!"
+#: ../../mod/install.php:232
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest."
 
-#: ../../mod/settings.php:72 ../../mod/settings.php:473 ../../mod/admin.php:62
-msgid "Update"
-msgstr "Aktualisierungen"
+#: ../../mod/install.php:233
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst."
 
-#: ../../mod/settings.php:167
-msgid "Failed to connect with email account using the settings provided."
-msgstr ""
-"Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen."
+#: ../../mod/install.php:237
+msgid "Database Server Name"
+msgstr "Datenbank-Server"
 
-#: ../../mod/settings.php:172
-msgid "Email settings updated."
-msgstr "EMail Einstellungen bearbeitet."
+#: ../../mod/install.php:238
+msgid "Database Login Name"
+msgstr "Datenbank-Nutzer"
 
-#: ../../mod/settings.php:190
-msgid "Passwords do not match. Password unchanged."
-msgstr ""
-"Die Passwörter stimmen nicht Ã¼berein. Das Passwort bleibt unverändert."
+#: ../../mod/install.php:239
+msgid "Database Login Password"
+msgstr "Datenbank-Passwort"
 
-#: ../../mod/settings.php:195
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
+#: ../../mod/install.php:240
+msgid "Database Name"
+msgstr "Datenbank-Name"
 
-#: ../../mod/settings.php:206
-msgid "Password changed."
-msgstr "Passwort Ã¤ndern."
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid "Site administrator email address"
+msgstr "E-Mail-Adresse des Administrators"
 
-#: ../../mod/settings.php:208
-msgid "Password update failed. Please try again."
-msgstr ""
-"Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse Ã¼bereinstimmen, damit du das Admin-Panel benutzen kannst."
 
-#: ../../mod/settings.php:272
-msgid " Please use a shorter name."
-msgstr " Bitte verwende einen kürzeren Namen."
+#: ../../mod/install.php:245 ../../mod/install.php:283
+msgid "Please select a default timezone for your website"
+msgstr "Bitte wähle die Standardzeitzone deiner Webseite"
 
-#: ../../mod/settings.php:274
-msgid " Name too short."
-msgstr " Name ist zu kurz."
+#: ../../mod/install.php:270
+msgid "Site settings"
+msgstr "Server-Einstellungen"
 
-#: ../../mod/settings.php:280
-msgid " Not valid email."
-msgstr " Keine gültige E-Mail."
+#: ../../mod/install.php:323
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
 
-#: ../../mod/settings.php:282
-msgid " Cannot change to that email."
-msgstr " Cannot change to that email."
+#: ../../mod/install.php:326
+msgid "PHP executable path"
+msgstr "Pfad zu PHP"
 
-#: ../../mod/settings.php:350 ../../addon/facebook/facebook.php:320
-#: ../../addon/twitter/twitter.php:294 ../../addon/impressum/impressum.php:64
-#: ../../addon/piwik/piwik.php:94
-msgid "Settings updated."
-msgstr "Einstellungen aktualisiert."
+#: ../../mod/install.php:326
+msgid "Enter full path to php executable"
+msgstr "Kompletter Pfad zum PHP-Executable"
 
-#: ../../mod/settings.php:409 ../../include/nav.php:128
-msgid "Account settings"
-msgstr "Account Einstellungen"
+#: ../../mod/install.php:331
+msgid "Command line PHP"
+msgstr "Kommadozeilen-PHP"
 
-#: ../../mod/settings.php:414
-msgid "Connector settings"
-msgstr "Connector-Einstellungen"
+#: ../../mod/install.php:340
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert."
 
-#: ../../mod/settings.php:419
-msgid "Plugin settings"
-msgstr "Plugin-Einstellungen"
+#: ../../mod/install.php:341
+msgid "This is required for message delivery to work."
+msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
 
-#: ../../mod/settings.php:424
-msgid "Connections"
-msgstr "Verbindungen"
+#: ../../mod/install.php:343
+msgid "PHP \"register_argc_argv\""
+msgstr "PHP \"register_argc_argv\""
 
-#: ../../mod/settings.php:429
-msgid "Export personal data"
-msgstr "Persönliche Daten exportieren"
+#: ../../mod/install.php:364
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen"
 
-#: ../../mod/settings.php:446 ../../mod/settings.php:472
-#: ../../mod/settings.php:505
-msgid "Add application"
-msgstr "Programm hinzufügen"
+#: ../../mod/install.php:365
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an."
 
-#: ../../mod/settings.php:448 ../../mod/settings.php:474
-#: ../../mod/dfrn_request.php:685 ../../mod/tagrm.php:11
-#: ../../mod/tagrm.php:94 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
-msgstr "Abbrechen"
+#: ../../mod/install.php:367
+msgid "Generate encryption keys"
+msgstr "Schlüssel erzeugen"
 
-#: ../../mod/settings.php:449 ../../mod/settings.php:475
-#: ../../mod/crepair.php:144 ../../mod/admin.php:464 ../../mod/admin.php:473
-msgid "Name"
-msgstr "Name"
+#: ../../mod/install.php:374
+msgid "libCurl PHP module"
+msgstr "PHP: libCurl-Modul"
 
-#: ../../mod/settings.php:450 ../../mod/settings.php:476
-#: ../../addon/statusnet/statusnet.php:480
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../mod/install.php:375
+msgid "GD graphics PHP module"
+msgstr "PHP: GD-Grafikmodul"
 
-#: ../../mod/settings.php:451 ../../mod/settings.php:477
-#: ../../addon/statusnet/statusnet.php:479
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../mod/install.php:376
+msgid "OpenSSL PHP module"
+msgstr "PHP: OpenSSL-Modul"
 
-#: ../../mod/settings.php:452 ../../mod/settings.php:478
-msgid "Redirect"
-msgstr "Umleiten"
+#: ../../mod/install.php:377
+msgid "mysqli PHP module"
+msgstr "PHP: mysqli-Modul"
 
-#: ../../mod/settings.php:453 ../../mod/settings.php:479
-msgid "Icon url"
-msgstr "Icon URL"
+#: ../../mod/install.php:378
+msgid "mb_string PHP module"
+msgstr "PHP: mb_string-Modul"
 
-#: ../../mod/settings.php:464
-msgid "You can't edit this application."
-msgstr "Du kannst dieses Programm nicht bearbeiten."
+#: ../../mod/install.php:383 ../../mod/install.php:385
+msgid "Apace mod_rewrite module"
+msgstr "Apache: mod_rewrite-Modul"
 
-#: ../../mod/settings.php:504
-msgid "Connected Apps"
-msgstr "Verbundene Programme"
+#: ../../mod/install.php:383
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert."
 
-#: ../../mod/settings.php:506 ../../mod/editpost.php:90
-#: ../../include/conversation.php:496
-msgid "Edit"
-msgstr "Bearbeiten"
+#: ../../mod/install.php:390
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
 
-#: ../../mod/settings.php:507 ../../mod/admin.php:468
-#: ../../mod/photos.php:1303 ../../mod/group.php:154
-#: ../../include/conversation.php:253 ../../include/conversation.php:509
-msgid "Delete"
-msgstr "Löschen"
+#: ../../mod/install.php:394
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert."
 
-#: ../../mod/settings.php:508
-msgid "Client key starts with"
-msgstr "Anwender Schlüssel beginnt mit"
+#: ../../mod/install.php:398
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
 
-#: ../../mod/settings.php:509
-msgid "No name"
-msgstr "Kein Name"
+#: ../../mod/install.php:402
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
 
-#: ../../mod/settings.php:510
-msgid "Remove authorization"
-msgstr "Authorisierung entziehen"
+#: ../../mod/install.php:406
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
 
-#: ../../mod/settings.php:522
-msgid "No Plugin settings configured"
-msgstr "Keine Plugin-Einstellungen konfiguriert"
+#: ../../mod/install.php:423
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun."
 
-#: ../../mod/settings.php:529 ../../addon/widgets/widgets.php:122
-msgid "Plugin Settings"
-msgstr "Plugin-Einstellungen"
+#: ../../mod/install.php:424
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
 
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s"
+#: ../../mod/install.php:425
+msgid ""
+"Please check with your site documentation or support people to see if this "
+"situation can be corrected."
+msgstr "Bitte Ã¼berprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben."
 
-#: ../../mod/settings.php:542 ../../mod/dfrn_request.php:681
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../mod/install.php:426
+msgid ""
+"If not, you may be required to perform a manual installation. Please see the"
+" file \"INSTALL.txt\" for instructions."
+msgstr "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\"."
 
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-msgid "enabled"
-msgstr "eingeschaltet"
+#: ../../mod/install.php:429
+msgid ".htconfig.php is writable"
+msgstr "Schreibrechte auf .htconfig.php"
 
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-msgid "disabled"
-msgstr "ausgeschaltet"
+#: ../../mod/install.php:436
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen."
 
-#: ../../mod/settings.php:543
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../mod/install.php:461
+msgid "Errors encountered creating database tables."
+msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
 
-#: ../../mod/settings.php:569
-msgid "Connector Settings"
-msgstr "Verbindungs-Einstellungen"
+#: ../../mod/localtime.php:12 ../../include/event.php:11
+#: ../../include/bb2diaspora.php:249
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
 
-#: ../../mod/settings.php:575
-msgid "Email/Mailbox Setup"
-msgstr "E-Mail/Postfach-Einstellungen"
+#: ../../mod/localtime.php:24
+msgid "Time Conversion"
+msgstr "Zeitumrechnung"
 
-#: ../../mod/settings.php:576
+#: ../../mod/localtime.php:26
 msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr ""
-"Wenn du mit E-Mail-Kontakten Ã¼ber diesen Service kommunizieren möchtest "
-"(optional), gib bitte die Einstellungen für dein Postfach an."
+"Friendika provides this service for sharing events with other networks and "
+"friends in unknown timezones."
+msgstr "Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
 
-#: ../../mod/settings.php:577
-msgid "Last successful email check:"
-msgstr "Letzter erfolgreicher Email Check"
+#: ../../mod/localtime.php:30
+#, php-format
+msgid "UTC time: %s"
+msgstr "UTC Zeit: %s"
 
-#: ../../mod/settings.php:578
-msgid "Email access is disabled on this site."
-msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
+#: ../../mod/localtime.php:33
+#, php-format
+msgid "Current timezone: %s"
+msgstr "Aktuelle Zeitzone: %s"
 
-#: ../../mod/settings.php:579
-msgid "IMAP server name:"
-msgstr "IMAP-Server-Name:"
+#: ../../mod/localtime.php:36
+#, php-format
+msgid "Converted localtime: %s"
+msgstr "Umgerechnete lokale Zeit: %s"
 
-#: ../../mod/settings.php:580
-msgid "IMAP port:"
-msgstr "IMAP-Port:"
+#: ../../mod/localtime.php:41
+msgid "Please select your timezone:"
+msgstr "Bitte wähle deine Zeitzone."
 
-#: ../../mod/settings.php:581
-msgid "Security:"
-msgstr "Sicherheit:"
+#: ../../mod/match.php:12
+msgid "Profile Match"
+msgstr "Profilübereinstimmungen"
 
-#: ../../mod/settings.php:581
-msgid "None"
-msgstr "Keine"
+#: ../../mod/match.php:20
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu."
 
-#: ../../mod/settings.php:582
-msgid "Email login name:"
-msgstr "E-Mail-Login-Name:"
+#: ../../mod/match.php:57
+msgid "is interested in:"
+msgstr "ist interessiert an:"
 
-#: ../../mod/settings.php:583
-msgid "Email password:"
-msgstr "E-Mail-Passwort:"
+#: ../../mod/match.php:58 ../../mod/suggest.php:59
+#: ../../include/contact_widgets.php:9 ../../boot.php:926
+msgid "Connect"
+msgstr "Verbinden"
 
-#: ../../mod/settings.php:584
-msgid "Reply-to address:"
-msgstr "Reply-to Adresse:"
+#: ../../mod/match.php:65 ../../mod/dirfind.php:57
+msgid "No matches"
+msgstr "Keine Ãœbereinstimmungen"
 
-#: ../../mod/settings.php:585
-msgid "Send public posts to all email contacts:"
-msgstr "Sende Ã¶ffentliche Beiträge an alle E-Mail-Kontakte:"
+#: ../../mod/lockview.php:39
+msgid "Remote privacy information not available."
+msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
 
-#: ../../mod/settings.php:642 ../../mod/admin.php:126 ../../mod/admin.php:443
-msgid "Normal Account"
-msgstr "Normaler Account"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
+msgstr "Sichtbar für:"
 
-#: ../../mod/settings.php:643
-msgid "This account is a normal personal profile"
-msgstr "Dieser Account ist ein normales persönliches Profil"
+#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#, php-format
+msgid "Welcome to %s"
+msgstr "Willkommen zu %s"
 
-#: ../../mod/settings.php:646 ../../mod/admin.php:127 ../../mod/admin.php:444
-msgid "Soapbox Account"
-msgstr "Sandkasten-Account"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Invalid request identifier."
 
-#: ../../mod/settings.php:647
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert"
+#: ../../mod/notifications.php:35 ../../mod/notifications.php:152
+#: ../../mod/notifications.php:198
+msgid "Discard"
+msgstr "Verwerfen"
 
-#: ../../mod/settings.php:650 ../../mod/admin.php:128 ../../mod/admin.php:445
-msgid "Community/Celebrity Account"
-msgstr "Gemeinschafts/Promi-Account"
+#: ../../mod/notifications.php:47 ../../mod/notifications.php:151
+#: ../../mod/notifications.php:197 ../../mod/contacts.php:302
+#: ../../mod/contacts.php:345
+msgid "Ignore"
+msgstr "Ignorieren"
 
-#: ../../mod/settings.php:651
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr ""
-"Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans "
-"akzeptiert"
+#: ../../mod/notifications.php:71 ../../include/nav.php:109
+msgid "Network"
+msgstr "Netzwerk"
 
-#: ../../mod/settings.php:654 ../../mod/admin.php:129 ../../mod/admin.php:446
-msgid "Automatic Friend Account"
-msgstr "Automatischer Freundesaccount"
+#: ../../mod/notifications.php:76 ../../mod/network.php:177
+msgid "Personal"
+msgstr "Persönlich"
 
-#: ../../mod/settings.php:655
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "Freundschaftsanfragen werden automatisch als Freund akzeptiert"
+#: ../../mod/notifications.php:81 ../../include/nav.php:73
+#: ../../include/nav.php:111
+msgid "Home"
+msgstr "Pinnwand"
 
-#: ../../mod/settings.php:665
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../mod/notifications.php:86 ../../include/nav.php:117
+msgid "Introductions"
+msgstr "Kontaktanfragen"
 
-#: ../../mod/settings.php:665
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr ""
-"(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID."
+#: ../../mod/notifications.php:91 ../../mod/message.php:76
+#: ../../include/nav.php:123
+msgid "Messages"
+msgstr "Nachrichten"
 
-#: ../../mod/settings.php:675
-msgid "Publish your default profile in your local site directory?"
-msgstr "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?"
+#: ../../mod/notifications.php:110
+msgid "Show Ignored Requests"
+msgstr "Zeige ignorierte Anfragen"
+
+#: ../../mod/notifications.php:110
+msgid "Hide Ignored Requests"
+msgstr "Verberge ignorierte Anfragen"
 
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:676
-#: ../../mod/profiles.php:358 ../../mod/register.php:525 ../../mod/api.php:106
-msgid "No"
-msgstr "Nein"
+#: ../../mod/notifications.php:136 ../../mod/notifications.php:182
+msgid "Notification type: "
+msgstr "Benachrichtigungstyp: "
 
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:675
-#: ../../mod/profiles.php:357 ../../mod/register.php:524 ../../mod/api.php:105
-msgid "Yes"
-msgstr "Ja"
+#: ../../mod/notifications.php:137
+msgid "Friend Suggestion"
+msgstr "Kontaktvorschlag"
 
-#: ../../mod/settings.php:681
-msgid "Publish your default profile in the global social directory?"
-msgstr "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?"
+#: ../../mod/notifications.php:139
+#, php-format
+msgid "suggested by %s"
+msgstr "vorgeschlagen von %s"
 
-#: ../../mod/settings.php:689
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?"
+#: ../../mod/notifications.php:144 ../../mod/notifications.php:191
+#: ../../mod/contacts.php:350
+msgid "Hide this contact from others"
+msgstr "Verberge diesen Kontakt vor anderen"
 
-#: ../../mod/settings.php:693
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "Post a new friend activity"
+msgstr "Neue-Kontakt Nachricht senden"
 
-#: ../../mod/settings.php:698
-msgid "Allow friends to post to your profile page?"
-msgstr "Deinen Kontakten erlauben, auf deine Pinnwand zu schreiben?"
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "if applicable"
+msgstr "falls anwendbar"
 
-#: ../../mod/settings.php:704
-msgid "Allow friends to tag your posts?"
-msgstr ""
-"Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?"
+#: ../../mod/notifications.php:148 ../../mod/notifications.php:195
+#: ../../mod/admin.php:466
+msgid "Approve"
+msgstr "Genehmigen"
 
-#: ../../mod/settings.php:710
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr ""
-"Erlaube uns dich als potentiellen Kontakt für neue Mitglieder vorzuschlagen?"
+#: ../../mod/notifications.php:168
+msgid "Claims to be known to you: "
+msgstr "Behauptet dich zu kennen: "
 
-#: ../../mod/settings.php:719
-msgid "Profile is <strong>not published</strong>."
-msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
+#: ../../mod/notifications.php:168
+msgid "yes"
+msgstr "ja"
 
-#: ../../mod/settings.php:738 ../../mod/profile_photo.php:206
-msgid "or"
-msgstr "oder"
+#: ../../mod/notifications.php:168
+msgid "no"
+msgstr "nein"
 
-#: ../../mod/settings.php:743
-msgid "Your Identity Address is"
-msgstr "Die Adresse deines Profils lautet:"
+#: ../../mod/notifications.php:175
+msgid "Approve as: "
+msgstr "Genehmigen als: "
 
-#: ../../mod/settings.php:754
-msgid "Automatically expire posts after days:"
-msgstr "Beiträge verfallen automatisch nach Tagen:"
+#: ../../mod/notifications.php:176
+msgid "Friend"
+msgstr "Freund"
 
-#: ../../mod/settings.php:754
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr ""
-"Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden "
-"gelöscht."
+#: ../../mod/notifications.php:177
+msgid "Sharer"
+msgstr "Teilenden"
 
-#: ../../mod/settings.php:755
-msgid "Advanced expiration settings"
-msgstr "Erweiterte Verfallseinstellungen"
+#: ../../mod/notifications.php:177
+msgid "Fan/Admirer"
+msgstr "Fan/Verehrer"
 
-#: ../../mod/settings.php:756
-msgid "Advanced Expiration"
-msgstr "Erweitertes Verfallen"
+#: ../../mod/notifications.php:183
+msgid "Friend/Connect Request"
+msgstr "Kontakt-/Freundschaftsanfrage"
 
-#: ../../mod/settings.php:757
-msgid "Expire posts:"
-msgstr "Beiträge verfallen lassen:"
+#: ../../mod/notifications.php:183
+msgid "New Follower"
+msgstr "Neuer Bewunderer"
 
-#: ../../mod/settings.php:758
-msgid "Expire personal notes:"
-msgstr "Persönliche Notizen verfallen lassen:"
+#: ../../mod/notifications.php:204
+msgid "No introductions."
+msgstr "Keine Kontaktanfragen."
 
-#: ../../mod/settings.php:759
-msgid "Expire starred posts:"
-msgstr "Markierte Beiträge verfallen lassen:"
+#: ../../mod/notifications.php:207 ../../mod/notifications.php:293
+#: ../../mod/notifications.php:388 ../../mod/notifications.php:469
+#: ../../include/nav.php:118
+msgid "Notifications"
+msgstr "Benachrichtigungen"
 
-#: ../../mod/settings.php:760
-msgid "Expire photos:"
-msgstr "Fotos verfallen lassen:"
+#: ../../mod/notifications.php:244 ../../mod/notifications.php:339
+#: ../../mod/notifications.php:426
+#, php-format
+msgid "%s liked %s's post"
+msgstr "%s mag %ss Beitrag"
 
-#: ../../mod/settings.php:765
-msgid "Account Settings"
-msgstr "Account-Einstellungen"
+#: ../../mod/notifications.php:253 ../../mod/notifications.php:348
+#: ../../mod/notifications.php:435
+#, php-format
+msgid "%s disliked %s's post"
+msgstr "%s mag %ss Beitrag nicht"
 
-#: ../../mod/settings.php:773
-msgid "Password Settings"
-msgstr "Passwort-Einstellungen"
+#: ../../mod/notifications.php:267 ../../mod/notifications.php:362
+#: ../../mod/notifications.php:449
+#, php-format
+msgid "%s is now friends with %s"
+msgstr "%s ist jetzt mit %s befreundet"
 
-#: ../../mod/settings.php:774
-msgid "New Password:"
-msgstr "Neues Passwort:"
+#: ../../mod/notifications.php:274 ../../mod/notifications.php:369
+#, php-format
+msgid "%s created a new post"
+msgstr "%s hat einen neuen Beitrag erstellt"
 
-#: ../../mod/settings.php:775
-msgid "Confirm:"
-msgstr "Bestätigen:"
+#: ../../mod/notifications.php:275 ../../mod/notifications.php:370
+#: ../../mod/notifications.php:458
+#, php-format
+msgid "%s commented on %s's post"
+msgstr "%s hat %ss Beitrag kommentiert"
 
-#: ../../mod/settings.php:775
-msgid "Leave password fields blank unless changing"
-msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort Ã¤ndern"
+#: ../../mod/notifications.php:289
+msgid "No more network notifications."
+msgstr "Keine weiteren Netzwerk-Benachrichtigungen."
 
-#: ../../mod/settings.php:779
-msgid "Basic Settings"
-msgstr "Grundeinstellungen"
+#: ../../mod/notifications.php:384
+msgid "No more personal notifications."
+msgstr "Keine weiteren persönlichen Benachrichtigungen"
 
-#: ../../mod/settings.php:780 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Kompletter Name:"
+#: ../../mod/notifications.php:465
+msgid "No more home notifications."
+msgstr "Keine weiteren Pinnwand-Benachrichtigungen"
 
-#: ../../mod/settings.php:781
-msgid "Email Address:"
-msgstr "Emailadresse:"
+#: ../../mod/contacts.php:63 ../../mod/contacts.php:143
+msgid "Could not access contact record."
+msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
 
-#: ../../mod/settings.php:782
-msgid "Your Timezone:"
-msgstr "Deine Zeitzone:"
+#: ../../mod/contacts.php:77
+msgid "Could not locate selected profile."
+msgstr "Konnte das ausgewählte Profil nicht finden."
 
-#: ../../mod/settings.php:783
-msgid "Default Post Location:"
-msgstr "Standardstandort:"
+#: ../../mod/contacts.php:100
+msgid "Contact updated."
+msgstr "Kontakt aktualisiert."
 
-#: ../../mod/settings.php:784
-msgid "Use Browser Location:"
-msgstr "Verwende den Standort des Browsers:"
+#: ../../mod/contacts.php:165
+msgid "Contact has been blocked"
+msgstr "Kontakt wurde blockiert"
 
-#: ../../mod/settings.php:785
-msgid "Display Theme:"
-msgstr "Theme:"
+#: ../../mod/contacts.php:165
+msgid "Contact has been unblocked"
+msgstr "Kontakt wurde wieder freigegeben"
 
-#: ../../mod/settings.php:786
-msgid "Update browser every xx seconds"
-msgstr "Browser alle xx Sekunden aktualisieren"
+#: ../../mod/contacts.php:179
+msgid "Contact has been ignored"
+msgstr "Der Kontakt wurde ignoriert"
 
-#: ../../mod/settings.php:786
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimal 10 Sekunden, kein Maximum"
+#: ../../mod/contacts.php:179
+msgid "Contact has been unignored"
+msgstr "Kontakt wurde ignoriert"
 
-#: ../../mod/settings.php:788
-msgid "Security and Privacy Settings"
-msgstr "Sicherheits- und Privatsphäre-Einstellungen"
+#: ../../mod/contacts.php:200
+msgid "stopped following"
+msgstr "wird nicht mehr gefolgt"
 
-#: ../../mod/settings.php:790
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
+#: ../../mod/contacts.php:221
+msgid "Contact has been removed."
+msgstr "Kontakt wurde entfernt."
 
-#: ../../mod/settings.php:790
-msgid "(to prevent spam abuse)"
-msgstr "(um SPAM zu vermeiden)"
+#: ../../mod/contacts.php:245
+#, php-format
+msgid "You are mutual friends with %s"
+msgstr "Du hast mit %s eine beidseitige Freundschaft"
 
-#: ../../mod/settings.php:791
-msgid "Default Post Permissions"
-msgstr "Standard-Zugriffsrechte für Beiträge"
+#: ../../mod/contacts.php:249
+#, php-format
+msgid "You are sharing with %s"
+msgstr "Du teilst mit %s"
 
-#: ../../mod/settings.php:792
-msgid "(click to open/close)"
-msgstr "(klicke zum Ã¶ffnen/schließen)"
+#: ../../mod/contacts.php:254
+#, php-format
+msgid "%s is sharing with you"
+msgstr "%s teilt mit Dir"
 
-#: ../../mod/settings.php:807
-msgid "Notification Settings"
-msgstr "Benachrichtigungseinstellungen"
+#: ../../mod/contacts.php:271
+msgid "Private communications are not available for this contact."
+msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
 
-#: ../../mod/settings.php:808
-msgid "Send a notification email when:"
-msgstr "Benachrichtigungs-E-Mail senden wenn:"
+#: ../../mod/contacts.php:274
+msgid "Never"
+msgstr "Niemals"
 
-#: ../../mod/settings.php:809
-msgid "You receive an introduction"
-msgstr "Du eine Kontaktanfrage erhältst"
+#: ../../mod/contacts.php:278
+msgid "(Update was successful)"
+msgstr "(Aktualisierung war erfolgreich)"
 
-#: ../../mod/settings.php:810
-msgid "Your introductions are confirmed"
-msgstr "Eine deiner Kontaktanfragen akzeptiert wurde"
+#: ../../mod/contacts.php:278
+msgid "(Update was not successful)"
+msgstr "(Aktualisierung war nicht erfolgreich)"
 
-#: ../../mod/settings.php:811
-msgid "Someone writes on your profile wall"
-msgstr "Jemand etwas auf deine Pinnwand schreibt"
+#: ../../mod/contacts.php:280
+msgid "Suggest friends"
+msgstr "Kontakte vorschlagen"
 
-#: ../../mod/settings.php:812
-msgid "Someone writes a followup comment"
-msgstr "Jemand auch einen Kommentar verfasst"
+#: ../../mod/contacts.php:284
+#, php-format
+msgid "Network type: %s"
+msgstr "Netzwerk Typ: %s"
 
-#: ../../mod/settings.php:813
-msgid "You receive a private message"
-msgstr "Du eine private Nachricht erhältst"
+#: ../../mod/contacts.php:287
+#, php-format
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] "%d gemeinsamer Kontakt"
+msgstr[1] "%d gemeinsame Kontakte"
 
-#: ../../mod/settings.php:814
-msgid "You receive a friend suggestion"
-msgstr "Du eine Empfehlung erhältst"
+#: ../../mod/contacts.php:292
+msgid "View all contacts"
+msgstr "Alle Kontakte anzeigen"
 
-#: ../../mod/settings.php:817
-msgid "Advanced Page Settings"
-msgstr "Erweiterte Seiten-Einstellungen"
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
+#: ../../mod/admin.php:470
+msgid "Unblock"
+msgstr "Entsperren"
 
-#: ../../mod/crepair.php:100
-msgid "Contact settings applied."
-msgstr "Einstellungen zum Kontakt angewandt."
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
+#: ../../mod/admin.php:469
+msgid "Block"
+msgstr "Sperren"
 
-#: ../../mod/crepair.php:102
-msgid "Contact update failed."
-msgstr "Konnte den Kontakt nicht aktualisieren."
+#: ../../mod/contacts.php:302 ../../mod/contacts.php:345
+msgid "Unignore"
+msgstr "Ignorieren aufheben"
 
-#: ../../mod/crepair.php:127 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:116
-msgid "Contact not found."
-msgstr "Kontakt nicht gefunden."
+#: ../../mod/contacts.php:307
+msgid "Repair"
+msgstr "Reparieren"
 
-#: ../../mod/crepair.php:133
-msgid "Repair Contact Settings"
-msgstr "Kontakt-Einstellungen reparieren"
+#: ../../mod/contacts.php:317
+msgid "Contact Editor"
+msgstr "Kontakt Editor"
 
-#: ../../mod/crepair.php:135
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr ""
-"<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas "
-"falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. "
-"nicht mehr."
+#: ../../mod/contacts.php:320
+msgid "Profile Visibility"
+msgstr "Profil Anzeige"
 
-#: ../../mod/crepair.php:136
+#: ../../mod/contacts.php:321
+#, php-format
 msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr ""
-"Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn "
-"du dir unsicher bist, was auf dieser Seite gemacht wird."
-
-#: ../../mod/crepair.php:145
-msgid "Account Nickname"
-msgstr "Account-Spitzname"
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft."
 
-#: ../../mod/crepair.php:146
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@Tagname - Ã¼berschreibt Name/Spitzname"
+#: ../../mod/contacts.php:322
+msgid "Contact Information / Notes"
+msgstr "Kontakt Informationen / Notizen"
 
-#: ../../mod/crepair.php:147
-msgid "Account URL"
-msgstr "Account-URL"
+#: ../../mod/contacts.php:323
+msgid "Edit contact notes"
+msgstr "Notizen zum Kontakt bearbiten"
 
-#: ../../mod/crepair.php:148
-msgid "Friend Request URL"
-msgstr "URL für Freundschaftsanfragen"
+#: ../../mod/contacts.php:328 ../../mod/contacts.php:458
+#: ../../mod/viewcontacts.php:61
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Besuche %ss Profil [%s]"
 
-#: ../../mod/crepair.php:149
-msgid "Friend Confirm URL"
-msgstr "URL für Bestätigungen von Freundschaftsanfragen"
+#: ../../mod/contacts.php:329
+msgid "Block/Unblock contact"
+msgstr "Kontakt blockieren/freischalten"
 
-#: ../../mod/crepair.php:150
-msgid "Notification Endpoint URL"
-msgstr "URL-Endpunkt für Benachrichtigungen"
+#: ../../mod/contacts.php:330
+msgid "Ignore contact"
+msgstr "Ignoriere den Kontakt"
 
-#: ../../mod/crepair.php:151
-msgid "Poll/Feed URL"
-msgstr "Pull/Feed-URL"
+#: ../../mod/contacts.php:331
+msgid "Repair URL settings"
+msgstr "URL Einstellungen reparieren"
 
-#: ../../mod/crepair.php:152
-msgid "New photo from this URL"
-msgstr "Neues Foto von dieser URL"
+#: ../../mod/contacts.php:332
+msgid "View conversations"
+msgstr "Unterhaltungen anzeigen"
 
-#: ../../mod/dfrn_request.php:92
-msgid "This introduction has already been accepted."
-msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
+#: ../../mod/contacts.php:334
+msgid "Delete contact"
+msgstr "Lösche den Kontakt"
 
-#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
-msgid "Profile location is not valid or does not contain profile information."
-msgstr ""
-"Profiladresse ist ungültig oder stellt einige Profildaten nicht zur "
-"Verfügung."
+#: ../../mod/contacts.php:338
+msgid "Last update:"
+msgstr "letzte Aktualisierung:"
 
-#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
-msgid "Warning: profile location has no identifiable owner name."
-msgstr ""
-"Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse"
-" gefunden werden."
+#: ../../mod/contacts.php:339
+msgid "Update public posts"
+msgstr "Öffentliche Beiträge aktualisieren"
 
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
-msgid "Warning: profile location has no profile photo."
-msgstr ""
-"Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse "
-"gefunden werden."
+#: ../../mod/contacts.php:341 ../../mod/admin.php:701
+msgid "Update now"
+msgstr "Jetzt aktualisieren"
 
-#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-"%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
-msgstr[1] ""
-"%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
+#: ../../mod/contacts.php:348
+msgid "Currently blocked"
+msgstr "Derzeit geblockt"
 
-#: ../../mod/dfrn_request.php:167
-msgid "Introduction complete."
-msgstr "Kontaktanfrage abgeschlossen."
+#: ../../mod/contacts.php:349
+msgid "Currently ignored"
+msgstr "Derzeit ignoriert"
 
-#: ../../mod/dfrn_request.php:191
-msgid "Unrecoverable protocol error."
-msgstr "Nicht behebbarer Protokollfehler."
+#: ../../mod/contacts.php:350
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Antworten/Likes auf deine Ã¶ffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein"
 
-#: ../../mod/dfrn_request.php:219
-msgid "Profile unavailable."
-msgstr "Profil nicht verfügbar."
+#: ../../mod/contacts.php:387 ../../include/nav.php:131
+msgid "Contacts"
+msgstr "Kontakte"
 
-#: ../../mod/dfrn_request.php:244
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s hat heute zu viele Freundschaftsanfragen erhalten."
+#: ../../mod/contacts.php:389
+msgid "Show Unblocked Contacts"
+msgstr "Nicht geblockte Kontakte anzeigen"
 
-#: ../../mod/dfrn_request.php:245
-msgid "Spam protection measures have been invoked."
-msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
+#: ../../mod/contacts.php:389
+msgid "Show Blocked Contacts"
+msgstr "Blockierte Kontakte anzeigen"
 
-#: ../../mod/dfrn_request.php:246
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
+#: ../../mod/contacts.php:391
+msgid "Show All Contacts"
+msgstr "Alle Kontakte anzeigen"
 
-#: ../../mod/dfrn_request.php:306
-msgid "Invalid locator"
-msgstr "Ungültiger Locator"
+#: ../../mod/contacts.php:393
+msgid "Search your contacts"
+msgstr "Suche in deinen Kontakten"
 
-#: ../../mod/dfrn_request.php:326
-msgid "Unable to resolve your name at the provided location."
-msgstr "Konnte deinen Namen an der angegebenen Stelle nicht finden."
+#: ../../mod/contacts.php:394 ../../mod/directory.php:65
+msgid "Finding: "
+msgstr "Funde: "
 
-#: ../../mod/dfrn_request.php:339
-msgid "You have already introduced yourself here."
-msgstr "Du hast dich hier bereits vorgestellt."
+#: ../../mod/contacts.php:395 ../../mod/directory.php:67
+#: ../../include/contact_widgets.php:34
+msgid "Find"
+msgstr "Finde"
 
-#: ../../mod/dfrn_request.php:343
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Es scheint so, als ob du bereits ein Freund von %s bist."
+#: ../../mod/contacts.php:434
+msgid "Mutual Friendship"
+msgstr "Beidseitige Freundschaft"
 
-#: ../../mod/dfrn_request.php:364
-msgid "Invalid profile URL."
-msgstr "Ungültige Profil-URL."
+#: ../../mod/contacts.php:438
+msgid "is a fan of yours"
+msgstr "ist ein Fan von dir"
 
-#: ../../mod/dfrn_request.php:460
-msgid "Your introduction has been sent."
-msgstr "Deine Kontaktanfrage wurde gesendet."
+#: ../../mod/contacts.php:442
+msgid "you are a fan of"
+msgstr "du bist Fan von"
 
-#: ../../mod/dfrn_request.php:513
-msgid "Please login to confirm introduction."
-msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
+#: ../../mod/contacts.php:459 ../../include/Contact.php:135
+#: ../../include/conversation.php:748
+msgid "Edit contact"
+msgstr "Kontakt bearbeiten"
 
-#: ../../mod/dfrn_request.php:527
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
+msgstr "Kein gültiger Account gefunden."
 
-#: ../../mod/dfrn_request.php:539
-#, php-format
-msgid "Welcome home %s."
-msgstr "Willkommen zurück %s."
+#: ../../mod/lostpass.php:31
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts eingeleitet. Bitte Ã¼berprüfe deine E-Mail."
 
-#: ../../mod/dfrn_request.php:540
+#: ../../mod/lostpass.php:42
 #, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
-
-#: ../../mod/dfrn_request.php:541
-msgid "Confirm"
-msgstr "Bestätigen"
+msgid "Password reset requested at %s"
+msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
 
-#: ../../mod/dfrn_request.php:581 ../../include/items.php:2406
-msgid "[Name Withheld]"
-msgstr "[Name Zurückgehalten]"
+#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
+#: ../../mod/register.php:380 ../../mod/register.php:434
+#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:716
+#: ../../include/items.php:2452
+msgid "Administrator"
+msgstr "Administrator"
 
-#: ../../mod/dfrn_request.php:665
-#, php-format
+#: ../../mod/lostpass.php:64
 msgid ""
-"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
-"your Diaspora search bar."
-msgstr ""
-"Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen "
-"\"%s\" in der Diaspora-Suchleiste ein."
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits Ã¤hnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
 
-#: ../../mod/dfrn_request.php:668
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"social networks:"
-msgstr ""
-"Bitte gib die Adresse deines Profils in einem der unterstützten sozialen "
-"Netzwerke an:"
+#: ../../mod/lostpass.php:82 ../../boot.php:719
+msgid "Password Reset"
+msgstr "Passwort zurücksetzen"
 
-#: ../../mod/dfrn_request.php:671
-msgid "Friend/Connection Request"
-msgstr "Freundschafts-/Kontaktanfrage"
+#: ../../mod/lostpass.php:83
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
 
-#: ../../mod/dfrn_request.php:672
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr ""
-"Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../mod/lostpass.php:84
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
 
-#: ../../mod/dfrn_request.php:673
-msgid "Please answer the following:"
-msgstr "Bitte beantworte folgende Fragen:"
+#: ../../mod/lostpass.php:85
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere dein neues Passwort - und dann"
 
-#: ../../mod/dfrn_request.php:674
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kennt %s dich?"
+#: ../../mod/lostpass.php:86
+msgid "click here to login"
+msgstr "hier klicken, um dich anzumelden"
 
-#: ../../mod/dfrn_request.php:677
-msgid "Add a personal note:"
-msgstr "Eine persönliche Notiz anfügen:"
+#: ../../mod/lostpass.php:87
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Du kannst das Passwort in den <em>Einstellungen</em> Ã¤ndern sobald du dich erfolgreich angemeldet hast."
 
-#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../mod/lostpass.php:118
+msgid "Forgot your Password?"
+msgstr "Hast du dein Passwort vergessen?"
 
-#: ../../mod/dfrn_request.php:680
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../mod/lostpass.php:119
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
 
-#: ../../mod/dfrn_request.php:682
-msgid "- please share from your own site as noted above"
-msgstr "- bitte fange von Deiner eigenen Seite aus zu teilen an"
+#: ../../mod/lostpass.php:120
+msgid "Nickname or Email: "
+msgstr "Spitzname oder Email:"
 
-#: ../../mod/dfrn_request.php:683
-msgid "Your Identity Address:"
-msgstr "Adresse deines Profils:"
+#: ../../mod/lostpass.php:121
+msgid "Reset"
+msgstr "Zurücksetzen"
 
-#: ../../mod/dfrn_request.php:684
-msgid "Submit Request"
-msgstr "Anfrage abschicken"
+#: ../../mod/settings.php:70
+msgid "Missing some important data!"
+msgstr "Wichtige Daten fehlen!"
 
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Invalid request identifier."
+#: ../../mod/settings.php:73 ../../mod/settings.php:479 ../../mod/admin.php:62
+msgid "Update"
+msgstr "Aktualisierungen"
 
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:150
-#: ../../mod/notifications.php:195
-msgid "Discard"
-msgstr "Verwerfen"
+#: ../../mod/settings.php:168
+msgid "Failed to connect with email account using the settings provided."
+msgstr "Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen."
 
-#: ../../mod/notifications.php:71 ../../include/nav.php:109
-msgid "Network"
-msgstr "Netzwerk"
+#: ../../mod/settings.php:173
+msgid "Email settings updated."
+msgstr "EMail Einstellungen bearbeitet."
 
-#: ../../mod/notifications.php:76 ../../mod/network.php:169
-msgid "Personal"
-msgstr "Persönlich"
+#: ../../mod/settings.php:191
+msgid "Passwords do not match. Password unchanged."
+msgstr "Die Passwörter stimmen nicht Ã¼berein. Das Passwort bleibt unverändert."
+
+#: ../../mod/settings.php:196
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
 
-#: ../../mod/notifications.php:81 ../../include/nav.php:73
-#: ../../include/nav.php:111
-msgid "Home"
-msgstr "Pinnwand"
+#: ../../mod/settings.php:207
+msgid "Password changed."
+msgstr "Passwort Ã¤ndern."
 
-#: ../../mod/notifications.php:86 ../../include/nav.php:117
-msgid "Introductions"
-msgstr "Kontaktanfragen"
+#: ../../mod/settings.php:209
+msgid "Password update failed. Please try again."
+msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
 
-#: ../../mod/notifications.php:91 ../../mod/message.php:76
-#: ../../include/nav.php:122
-msgid "Messages"
-msgstr "Nachrichten"
+#: ../../mod/settings.php:273
+msgid " Please use a shorter name."
+msgstr " Bitte verwende einen kürzeren Namen."
 
-#: ../../mod/notifications.php:110
-msgid "Show Ignored Requests"
-msgstr "Zeige ignorierte Anfragen"
+#: ../../mod/settings.php:275
+msgid " Name too short."
+msgstr " Name ist zu kurz."
 
-#: ../../mod/notifications.php:110
-msgid "Hide Ignored Requests"
-msgstr "Verberge ignorierte Anfragen"
+#: ../../mod/settings.php:281
+msgid " Not valid email."
+msgstr " Keine gültige E-Mail."
 
-#: ../../mod/notifications.php:136 ../../mod/notifications.php:180
-msgid "Notification type: "
-msgstr "Benachrichtigungstyp: "
+#: ../../mod/settings.php:283
+msgid " Cannot change to that email."
+msgstr " Cannot change to that email."
 
-#: ../../mod/notifications.php:137
-msgid "Friend Suggestion"
-msgstr "Kontaktvorschlag"
+#: ../../mod/settings.php:351 ../../addon/facebook/facebook.php:320
+#: ../../addon/impressum/impressum.php:64 ../../addon/piwik/piwik.php:94
+#: ../../addon/twitter/twitter.php:310
+msgid "Settings updated."
+msgstr "Einstellungen aktualisiert."
 
-#: ../../mod/notifications.php:139
-#, php-format
-msgid "suggested by %s"
-msgstr "vorgeschlagen von %s"
+#: ../../mod/settings.php:415 ../../include/nav.php:129
+msgid "Account settings"
+msgstr "Account Einstellungen"
 
-#: ../../mod/notifications.php:146 ../../mod/notifications.php:192
-#: ../../mod/admin.php:466
-msgid "Approve"
-msgstr "Genehmigen"
+#: ../../mod/settings.php:420
+msgid "Connector settings"
+msgstr "Connector-Einstellungen"
 
-#: ../../mod/notifications.php:166
-msgid "Claims to be known to you: "
-msgstr "Behauptet dich zu kennen: "
+#: ../../mod/settings.php:425
+msgid "Plugin settings"
+msgstr "Plugin-Einstellungen"
 
-#: ../../mod/notifications.php:166
-msgid "yes"
-msgstr "ja"
+#: ../../mod/settings.php:430
+msgid "Connections"
+msgstr "Verbindungen"
 
-#: ../../mod/notifications.php:166
-msgid "no"
-msgstr "nein"
+#: ../../mod/settings.php:435
+msgid "Export personal data"
+msgstr "Persönliche Daten exportieren"
 
-#: ../../mod/notifications.php:173
-msgid "Approve as: "
-msgstr "Genehmigen als: "
+#: ../../mod/settings.php:452 ../../mod/settings.php:478
+#: ../../mod/settings.php:511
+msgid "Add application"
+msgstr "Programm hinzufügen"
 
-#: ../../mod/notifications.php:174
-msgid "Friend"
-msgstr "Freund"
+#: ../../mod/settings.php:456 ../../mod/settings.php:482
+#: ../../addon/statusnet/statusnet.php:489
+msgid "Consumer Key"
+msgstr "Consumer Key"
 
-#: ../../mod/notifications.php:175
-msgid "Sharer"
-msgstr "Teilenden"
+#: ../../mod/settings.php:457 ../../mod/settings.php:483
+#: ../../addon/statusnet/statusnet.php:488
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
 
-#: ../../mod/notifications.php:175
-msgid "Fan/Admirer"
-msgstr "Fan/Verehrer"
+#: ../../mod/settings.php:458 ../../mod/settings.php:484
+msgid "Redirect"
+msgstr "Umleiten"
 
-#: ../../mod/notifications.php:181
-msgid "Friend/Connect Request"
-msgstr "Kontakt-/Freundschaftsanfrage"
+#: ../../mod/settings.php:459 ../../mod/settings.php:485
+msgid "Icon url"
+msgstr "Icon URL"
 
-#: ../../mod/notifications.php:181
-msgid "New Follower"
-msgstr "Neuer Bewunderer"
+#: ../../mod/settings.php:470
+msgid "You can't edit this application."
+msgstr "Du kannst dieses Programm nicht bearbeiten."
 
-#: ../../mod/notifications.php:201
-msgid "No introductions."
-msgstr "Keine Kontaktanfragen."
+#: ../../mod/settings.php:510
+msgid "Connected Apps"
+msgstr "Verbundene Programme"
 
-#: ../../mod/notifications.php:204 ../../mod/notifications.php:290
-#: ../../mod/notifications.php:385 ../../mod/notifications.php:466
-#: ../../include/nav.php:118
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: ../../mod/settings.php:514
+msgid "Client key starts with"
+msgstr "Anwender Schlüssel beginnt mit"
 
-#: ../../mod/notifications.php:241 ../../mod/notifications.php:336
-#: ../../mod/notifications.php:423
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s mag %ss Beitrag"
+#: ../../mod/settings.php:515
+msgid "No name"
+msgstr "Kein Name"
 
-#: ../../mod/notifications.php:250 ../../mod/notifications.php:345
-#: ../../mod/notifications.php:432
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s mag %ss Beitrag nicht"
+#: ../../mod/settings.php:516
+msgid "Remove authorization"
+msgstr "Authorisierung entziehen"
 
-#: ../../mod/notifications.php:264 ../../mod/notifications.php:359
-#: ../../mod/notifications.php:446
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s ist jetzt mit %s befreundet"
+#: ../../mod/settings.php:528
+msgid "No Plugin settings configured"
+msgstr "Keine Plugin-Einstellungen konfiguriert"
 
-#: ../../mod/notifications.php:271 ../../mod/notifications.php:366
-#, php-format
-msgid "%s created a new post"
-msgstr "%s hat einen neuen Beitrag erstellt"
+#: ../../mod/settings.php:535 ../../addon/widgets/widgets.php:122
+msgid "Plugin Settings"
+msgstr "Plugin-Einstellungen"
 
-#: ../../mod/notifications.php:272 ../../mod/notifications.php:367
-#: ../../mod/notifications.php:455
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
 #, php-format
-msgid "%s commented on %s's post"
-msgstr "%s hat %ss Beitrag kommentiert"
+msgid "Built-in support for %s connectivity is %s"
+msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s"
 
-#: ../../mod/notifications.php:286
-msgid "No more network notifications."
-msgstr "Keine weiteren Netzwerk-Benachrichtigungen."
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+msgid "enabled"
+msgstr "eingeschaltet"
 
-#: ../../mod/notifications.php:381
-msgid "No more personal notifications."
-msgstr "Keine weiteren persönlichen Benachrichtigungen"
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+msgid "disabled"
+msgstr "ausgeschaltet"
 
-#: ../../mod/notifications.php:462
-msgid "No more home notifications."
-msgstr "Keine weiteren Pinnwand-Benachrichtigungen"
+#: ../../mod/settings.php:549
+msgid "StatusNet"
+msgstr "StatusNet"
 
-#: ../../mod/message.php:23
-msgid "No recipient selected."
-msgstr "Kein Empfänger gewählt."
+#: ../../mod/settings.php:575
+msgid "Connector Settings"
+msgstr "Verbindungs-Einstellungen"
 
-#: ../../mod/message.php:26
-msgid "Unable to locate contact information."
-msgstr "Konnte die Kontaktinformationen nicht finden."
+#: ../../mod/settings.php:581
+msgid "Email/Mailbox Setup"
+msgstr "E-Mail/Postfach-Einstellungen"
 
-#: ../../mod/message.php:29
-msgid "Message could not be sent."
-msgstr "Nachricht konnte nicht gesendet werden."
+#: ../../mod/settings.php:582
+msgid ""
+"If you wish to communicate with email contacts using this service "
+"(optional), please specify how to connect to your mailbox."
+msgstr "Wenn du mit E-Mail-Kontakten Ã¼ber diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an."
 
-#: ../../mod/message.php:32
-msgid "Message collection failure."
-msgstr "Konnte Nachrichten nicht abrufen."
+#: ../../mod/settings.php:583
+msgid "Last successful email check:"
+msgstr "Letzter erfolgreicher Email Check"
 
-#: ../../mod/message.php:35
-msgid "Message sent."
-msgstr "Nachricht gesendet."
+#: ../../mod/settings.php:584
+msgid "Email access is disabled on this site."
+msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
 
-#: ../../mod/message.php:55
-msgid "Inbox"
-msgstr "Eingang"
+#: ../../mod/settings.php:585
+msgid "IMAP server name:"
+msgstr "IMAP-Server-Name:"
 
-#: ../../mod/message.php:60
-msgid "Outbox"
-msgstr "Ausgang"
+#: ../../mod/settings.php:586
+msgid "IMAP port:"
+msgstr "IMAP-Port:"
 
-#: ../../mod/message.php:65
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: ../../mod/settings.php:587
+msgid "Security:"
+msgstr "Sicherheit:"
 
-#: ../../mod/message.php:91
-msgid "Message deleted."
-msgstr "Nachricht gelöscht."
+#: ../../mod/settings.php:587
+msgid "None"
+msgstr "Keine"
 
-#: ../../mod/message.php:121
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
+#: ../../mod/settings.php:588
+msgid "Email login name:"
+msgstr "E-Mail-Login-Name:"
 
-#: ../../mod/message.php:137 ../../include/conversation.php:815
-msgid "Please enter a link URL:"
-msgstr "Bitte gib die URL des Links ein:"
+#: ../../mod/settings.php:589
+msgid "Email password:"
+msgstr "E-Mail-Passwort:"
 
-#: ../../mod/message.php:145
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
+#: ../../mod/settings.php:590
+msgid "Reply-to address:"
+msgstr "Reply-to Adresse:"
 
-#: ../../mod/message.php:146 ../../mod/message.php:287
-msgid "To:"
-msgstr "An:"
+#: ../../mod/settings.php:591
+msgid "Send public posts to all email contacts:"
+msgstr "Sende Ã¶ffentliche Beiträge an alle E-Mail-Kontakte:"
 
-#: ../../mod/message.php:147 ../../mod/message.php:288
-msgid "Subject:"
-msgstr "Betreff:"
+#: ../../mod/settings.php:648 ../../mod/admin.php:126 ../../mod/admin.php:443
+msgid "Normal Account"
+msgstr "Normaler Account"
 
-#: ../../mod/message.php:150 ../../mod/message.php:291
-#: ../../mod/invite.php:101
-msgid "Your message:"
-msgstr "Deine Nachricht:"
+#: ../../mod/settings.php:649
+msgid "This account is a normal personal profile"
+msgstr "Dieser Account ist ein normales persönliches Profil"
 
-#: ../../mod/message.php:153 ../../mod/message.php:294
-#: ../../mod/editpost.php:91 ../../include/conversation.php:863
-msgid "Upload photo"
-msgstr "Foto hochladen"
+#: ../../mod/settings.php:652 ../../mod/admin.php:127 ../../mod/admin.php:444
+msgid "Soapbox Account"
+msgstr "Sandkasten-Account"
 
-#: ../../mod/message.php:154 ../../mod/message.php:295
-#: ../../mod/editpost.php:93 ../../include/conversation.php:867
-msgid "Insert web link"
-msgstr "Weblink einfügen"
+#: ../../mod/settings.php:653
+msgid "Automatically approve all connection/friend requests as read-only fans"
+msgstr "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert"
 
-#: ../../mod/message.php:155 ../../mod/message.php:296
-#: ../../mod/editpost.php:99 ../../mod/photos.php:1186
-#: ../../include/conversation.php:294 ../../include/conversation.php:631
-#: ../../include/conversation.php:879
-msgid "Please wait"
-msgstr "Bitte warten"
+#: ../../mod/settings.php:656 ../../mod/admin.php:128 ../../mod/admin.php:445
+msgid "Community/Celebrity Account"
+msgstr "Gemeinschafts/Promi-Account"
 
-#: ../../mod/message.php:188
-msgid "No messages."
-msgstr "Keine Nachrichten."
+#: ../../mod/settings.php:657
+msgid ""
+"Automatically approve all connection/friend requests as read-write fans"
+msgstr "Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert"
 
-#: ../../mod/message.php:201
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
+#: ../../mod/settings.php:660 ../../mod/admin.php:129 ../../mod/admin.php:446
+msgid "Automatic Friend Account"
+msgstr "Automatischer Freundesaccount"
 
-#: ../../mod/message.php:204
-msgid "D, d M Y - g:i A"
-msgstr "D, d. M Y - g:i A"
+#: ../../mod/settings.php:661
+msgid "Automatically approve all connection/friend requests as friends"
+msgstr "Freundschaftsanfragen werden automatisch als Freund akzeptiert"
 
-#: ../../mod/message.php:239
-msgid "Message not available."
-msgstr "Nachricht nicht verfügbar."
+#: ../../mod/settings.php:671
+msgid "OpenID:"
+msgstr "OpenID:"
 
-#: ../../mod/message.php:276
-msgid "Delete message"
-msgstr "Nachricht löschen"
+#: ../../mod/settings.php:671
+msgid "(Optional) Allow this OpenID to login to this account."
+msgstr "(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID."
 
-#: ../../mod/message.php:286
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: ../../mod/settings.php:681
+msgid "Publish your default profile in your local site directory?"
+msgstr "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?"
+
+#: ../../mod/settings.php:687
+msgid "Publish your default profile in the global social directory?"
+msgstr "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?"
 
-#: ../../mod/wall_upload.php:56 ../../mod/profile_photo.php:113
-#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "Bildgröße Ã¼berschreitet das Limit von %d"
+#: ../../mod/settings.php:695
+msgid "Hide your contact/friend list from viewers of your default profile?"
+msgstr "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?"
 
-#: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:122
-#: ../../mod/photos.php:649
-msgid "Unable to process image."
-msgstr "Konnte das Bild nicht bearbeiten."
+#: ../../mod/settings.php:699
+msgid "Hide your profile details from unknown viewers?"
+msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
 
-#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
-#: ../../mod/wall_upload.php:97 ../../mod/item.php:318
-#: ../../include/message.php:143
-msgid "Wall Photos"
-msgstr "Pinnwand-Bilder"
+#: ../../mod/settings.php:704
+msgid "Allow friends to post to your profile page?"
+msgstr "Deinen Kontakten erlauben, auf deine Pinnwand zu schreiben?"
 
-#: ../../mod/wall_upload.php:84 ../../mod/profile_photo.php:251
-#: ../../mod/photos.php:669
-msgid "Image upload failed."
-msgstr "Hochladen des Bildes gescheitert."
+#: ../../mod/settings.php:710
+msgid "Allow friends to tag your posts?"
+msgstr "Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?"
 
-#: ../../mod/wall_attach.php:57
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Die Datei ist größer als das erlaubte Limit von %d"
+#: ../../mod/settings.php:716
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Erlaube uns dich als potentiellen Kontakt für neue Mitglieder vorzuschlagen?"
 
-#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
-msgid "File upload failed."
-msgstr "Hochladen der Datei fehlgeschlagen."
+#: ../../mod/settings.php:725
+msgid "Profile is <strong>not published</strong>."
+msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
 
-#: ../../mod/profile_photo.php:28
-msgid "Image uploaded but image cropping failed."
-msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
+#: ../../mod/settings.php:744 ../../mod/profile_photo.php:206
+msgid "or"
+msgstr "oder"
 
-#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
-#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
-#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
-#: ../../mod/register.php:327 ../../mod/register.php:334
-#: ../../mod/register.php:341 ../../mod/photos.php:146
-#: ../../mod/photos.php:593 ../../mod/photos.php:938 ../../mod/photos.php:953
-#: ../../addon/communityhome/communityhome.php:111
-msgid "Profile Photos"
-msgstr "Profilbilder"
+#: ../../mod/settings.php:749
+msgid "Your Identity Address is"
+msgstr "Die Adresse deines Profils lautet:"
 
-#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
-#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Verkleinern der Bildgröße von [%s] ist gescheitert."
+#: ../../mod/settings.php:760
+msgid "Automatically expire posts after this many days:"
+msgstr "Beiträge verfallen automatisch nach dieser Anzahl von Tagen"
 
-#: ../../mod/profile_photo.php:89
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr ""
-"Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto "
-"nicht gleich angezeigt wird."
+#: ../../mod/settings.php:760
+msgid "If empty, posts will not expire. Expired posts will be deleted"
+msgstr "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht."
 
-#: ../../mod/profile_photo.php:99
-msgid "Unable to process image"
-msgstr "Bild konnte nicht verarbeitet werden"
+#: ../../mod/settings.php:761
+msgid "Advanced expiration settings"
+msgstr "Erweiterte Verfallseinstellungen"
 
-#: ../../mod/profile_photo.php:203
-msgid "Upload File:"
-msgstr "Datei hochladen:"
+#: ../../mod/settings.php:762
+msgid "Advanced Expiration"
+msgstr "Erweitertes Verfallen"
 
-#: ../../mod/profile_photo.php:204
-msgid "Upload Profile Photo"
-msgstr "Profilbild hochladen"
+#: ../../mod/settings.php:763
+msgid "Expire posts:"
+msgstr "Beiträge verfallen lassen:"
 
-#: ../../mod/profile_photo.php:205
-msgid "Upload"
-msgstr "Hochladen"
+#: ../../mod/settings.php:764
+msgid "Expire personal notes:"
+msgstr "Persönliche Notizen verfallen lassen:"
 
-#: ../../mod/profile_photo.php:206
-msgid "skip this step"
-msgstr "diesen Schritt Ã¼berspringen"
+#: ../../mod/settings.php:765
+msgid "Expire starred posts:"
+msgstr "Markierte Beiträge verfallen lassen:"
 
-#: ../../mod/profile_photo.php:206
-msgid "select a photo from your photo albums"
-msgstr "wähle ein Foto von deinen Fotoalben"
+#: ../../mod/settings.php:766
+msgid "Expire photos:"
+msgstr "Fotos verfallen lassen:"
 
-#: ../../mod/profile_photo.php:219
-msgid "Crop Image"
-msgstr "Bild zurechtschneiden"
+#: ../../mod/settings.php:771
+msgid "Account Settings"
+msgstr "Account-Einstellungen"
 
-#: ../../mod/profile_photo.php:220
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr ""
-"Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden"
-" kann."
+#: ../../mod/settings.php:779
+msgid "Password Settings"
+msgstr "Passwort-Einstellungen"
 
-#: ../../mod/profile_photo.php:221
-msgid "Done Editing"
-msgstr "Bearbeitung abgeschlossen"
+#: ../../mod/settings.php:780
+msgid "New Password:"
+msgstr "Neues Passwort:"
 
-#: ../../mod/profile_photo.php:249
-msgid "Image uploaded successfully."
-msgstr "Bild erfolgreich auf den Server geladen."
+#: ../../mod/settings.php:781
+msgid "Confirm:"
+msgstr "Bestätigen:"
 
-#: ../../mod/manage.php:37
-#, php-format
-msgid "Welcome back %s"
-msgstr "Willkommen zurück %s"
+#: ../../mod/settings.php:781
+msgid "Leave password fields blank unless changing"
+msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort Ã¤ndern"
 
-#: ../../mod/manage.php:87
-msgid "Manage Identities and/or Pages"
-msgstr "Verwalte Identitäten und/oder Seiten"
+#: ../../mod/settings.php:785
+msgid "Basic Settings"
+msgstr "Grundeinstellungen"
 
-#: ../../mod/manage.php:90
-msgid ""
-"(Toggle between different identities or community/group pages which share "
-"your account details.)"
-msgstr ""
-"(Wähle zwischen verschiedenen Identitäten oder Gemeinschafts/Gruppen-Seiten,"
-" die deine Accountdetails teilen.)"
+#: ../../mod/settings.php:786 ../../include/profile_advanced.php:15
+msgid "Full Name:"
+msgstr "Kompletter Name:"
 
-#: ../../mod/manage.php:92
-msgid "Select an identity to manage: "
-msgstr "Wähle eine Identität zum Verwalten: "
+#: ../../mod/settings.php:787
+msgid "Email Address:"
+msgstr "Emailadresse:"
 
-#: ../../mod/tagger.php:70 ../../mod/like.php:127 ../../mod/photos.php:524
-#: ../../include/conversation.php:31 ../../include/conversation.php:104
-#: ../../include/diaspora.php:1554
-#: ../../addon/communityhome/communityhome.php:163
-msgid "photo"
-msgstr "Foto"
+#: ../../mod/settings.php:788
+msgid "Your Timezone:"
+msgstr "Deine Zeitzone:"
 
-#: ../../mod/tagger.php:70 ../../mod/like.php:127
-#: ../../include/conversation.php:26 ../../include/conversation.php:35
-#: ../../include/conversation.php:99 ../../include/conversation.php:108
-#: ../../include/diaspora.php:1554 ../../addon/facebook/facebook.php:1084
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-msgid "status"
-msgstr "Status"
+#: ../../mod/settings.php:789
+msgid "Default Post Location:"
+msgstr "Standardstandort:"
 
-#: ../../mod/tagger.php:103 ../../include/conversation.php:116
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
+#: ../../mod/settings.php:790
+msgid "Use Browser Location:"
+msgstr "Verwende den Standort des Browsers:"
 
-#: ../../mod/common.php:34
-msgid "Common Friends"
-msgstr "Gemeinsame Freunde"
+#: ../../mod/settings.php:791
+msgid "Display Theme:"
+msgstr "Theme:"
 
-#: ../../mod/common.php:42
-msgid "No friends in common."
-msgstr "Keine gemeinsamen Freunde."
+#: ../../mod/settings.php:792
+msgid "Update browser every xx seconds"
+msgstr "Browser alle xx Sekunden aktualisieren"
 
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
-#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profil nicht gefunden."
+#: ../../mod/settings.php:792
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimal 10 Sekunden, kein Maximum"
 
-#: ../../mod/profiles.php:28
-msgid "Profile Name is required."
-msgstr "Profilname ist erforderlich."
+#: ../../mod/settings.php:794
+msgid "Security and Privacy Settings"
+msgstr "Sicherheits- und Privatsphäre-Einstellungen"
 
-#: ../../mod/profiles.php:198
-msgid "Profile updated."
-msgstr "Profil aktualisiert."
+#: ../../mod/settings.php:796
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
 
-#: ../../mod/profiles.php:256
-msgid "Profile deleted."
-msgstr "Profil gelöscht."
+#: ../../mod/settings.php:796
+msgid "(to prevent spam abuse)"
+msgstr "(um SPAM zu vermeiden)"
 
-#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
-msgid "Profile-"
-msgstr "Profil-"
+#: ../../mod/settings.php:797
+msgid "Default Post Permissions"
+msgstr "Standard-Zugriffsrechte für Beiträge"
 
-#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
-msgid "New profile created."
-msgstr "Neues Profil angelegt."
+#: ../../mod/settings.php:798
+msgid "(click to open/close)"
+msgstr "(klicke zum Ã¶ffnen/schließen)"
 
-#: ../../mod/profiles.php:309
-msgid "Profile unavailable to clone."
-msgstr "Profil nicht zum Duplizieren verfügbar."
+#: ../../mod/settings.php:813
+msgid "Notification Settings"
+msgstr "Benachrichtigungseinstellungen"
 
-#: ../../mod/profiles.php:356
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
+#: ../../mod/settings.php:814
+msgid "Send a notification email when:"
+msgstr "Benachrichtigungs-E-Mail senden wenn:"
 
-#: ../../mod/profiles.php:374
-msgid "Edit Profile Details"
-msgstr "Profil bearbeiten"
+#: ../../mod/settings.php:815
+msgid "You receive an introduction"
+msgstr "Du eine Kontaktanfrage erhältst"
 
-#: ../../mod/profiles.php:376
-msgid "View this profile"
-msgstr "Dieses Profil anzeigen"
+#: ../../mod/settings.php:816
+msgid "Your introductions are confirmed"
+msgstr "Eine deiner Kontaktanfragen akzeptiert wurde"
 
-#: ../../mod/profiles.php:377
-msgid "Create a new profile using these settings"
-msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
+#: ../../mod/settings.php:817
+msgid "Someone writes on your profile wall"
+msgstr "Jemand etwas auf deine Pinnwand schreibt"
 
-#: ../../mod/profiles.php:378
-msgid "Clone this profile"
-msgstr "Dieses Profil duplizieren"
+#: ../../mod/settings.php:818
+msgid "Someone writes a followup comment"
+msgstr "Jemand auch einen Kommentar verfasst"
 
-#: ../../mod/profiles.php:379
-msgid "Delete this profile"
-msgstr "Dieses Profil löschen"
+#: ../../mod/settings.php:819
+msgid "You receive a private message"
+msgstr "Du eine private Nachricht erhältst"
 
-#: ../../mod/profiles.php:380
-msgid "Profile Name:"
-msgstr "Profilname:"
+#: ../../mod/settings.php:820
+msgid "You receive a friend suggestion"
+msgstr "Du eine Empfehlung erhältst"
 
-#: ../../mod/profiles.php:381
-msgid "Your Full Name:"
-msgstr "Dein kompletter Name:"
+#: ../../mod/settings.php:821
+msgid "You are tagged in a post"
+msgstr "Du wurdest in einem Beitrag erwähnt"
 
-#: ../../mod/profiles.php:382
-msgid "Title/Description:"
-msgstr "Titel/Beschreibung:"
+#: ../../mod/settings.php:824
+msgid "Advanced Page Settings"
+msgstr "Erweiterte Seiten-Einstellungen"
 
-#: ../../mod/profiles.php:383
-msgid "Your Gender:"
-msgstr "Dein Geschlecht:"
+#: ../../mod/manage.php:90
+msgid "Manage Identities and/or Pages"
+msgstr "Verwalte Identitäten und/oder Seiten"
 
-#: ../../mod/profiles.php:384
-#, php-format
-msgid "Birthday (%s):"
-msgstr "Geburtstag (%s):"
+#: ../../mod/manage.php:93
+msgid ""
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
+msgstr "Wechsle zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppen Seiten die deine Zugangsdetails teilen oder zu denen du \"Manage\" Befugnisse bekommen hast."
 
-#: ../../mod/profiles.php:385
-msgid "Street Address:"
-msgstr "Adresse:"
+#: ../../mod/manage.php:95
+msgid "Select an identity to manage: "
+msgstr "Wähle eine Identität zum Verwalten: "
 
-#: ../../mod/profiles.php:386
-msgid "Locality/City:"
-msgstr "Wohnort/Stadt:"
+#: ../../mod/network.php:43
+msgid "Search Results For:"
+msgstr "Suchergebnisse für:"
 
-#: ../../mod/profiles.php:387
-msgid "Postal/Zip Code:"
-msgstr "Postleitzahl:"
+#: ../../mod/network.php:77 ../../mod/search.php:16
+msgid "Remove term"
+msgstr "Begriff entfernen"
 
-#: ../../mod/profiles.php:388
-msgid "Country:"
-msgstr "Land:"
+#: ../../mod/network.php:86 ../../mod/search.php:13
+msgid "Saved Searches"
+msgstr "Gespeicherte Suchen"
 
-#: ../../mod/profiles.php:389
-msgid "Region/State:"
-msgstr "Region/Bundesstaat:"
+#: ../../mod/network.php:87 ../../include/group.php:216
+msgid "add"
+msgstr "hinzufügen"
 
-#: ../../mod/profiles.php:390
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+#: ../../mod/network.php:166
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
 
-#: ../../mod/profiles.php:391
-msgid "Who: (if applicable)"
-msgstr "Wer: (falls anwendbar)"
+#: ../../mod/network.php:171
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
 
-#: ../../mod/profiles.php:392
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/network.php:182
+msgid "New"
+msgstr "Neue"
 
-#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
-msgid "Sexual Preference:"
-msgstr "Sexuelle Vorlieben:"
+#: ../../mod/network.php:187
+msgid "Starred"
+msgstr "Markierte"
 
-#: ../../mod/profiles.php:394
-msgid "Homepage URL:"
-msgstr "Adresse der Homepage:"
+#: ../../mod/network.php:192
+msgid "Bookmarks"
+msgstr "Lesezeichen"
 
-#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:47
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
+#: ../../mod/network.php:250
+#, php-format
+msgid "Warning: This group contains %s member from an insecure network."
+msgid_plural ""
+"Warning: This group contains %s members from an insecure network."
+msgstr[0] "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk."
+msgstr[1] "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
 
-#: ../../mod/profiles.php:396
-msgid "Religious Views:"
-msgstr "Religiöse Ansichten:"
+#: ../../mod/network.php:253
+msgid "Private messages to this group are at risk of public disclosure."
+msgstr "Private Nachrichten an diese Gruppe könnten an die Ã–ffentlichkeit geraten."
 
-#: ../../mod/profiles.php:397
-msgid "Public Keywords:"
-msgstr "Öffentliche Schlüsselwörter:"
+#: ../../mod/network.php:304
+msgid "No such group"
+msgstr "Es gibt keine solche Gruppe"
 
-#: ../../mod/profiles.php:398
-msgid "Private Keywords:"
-msgstr "Private Schlüsselwörter:"
+#: ../../mod/network.php:315
+msgid "Group is empty"
+msgstr "Gruppe ist leer"
 
-#: ../../mod/profiles.php:399
-msgid "Example: fishing photography software"
-msgstr "Beispiel: Fischen Fotografie Software"
+#: ../../mod/network.php:319
+msgid "Group: "
+msgstr "Gruppe: "
 
-#: ../../mod/profiles.php:400
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr ""
-"(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden "
-"eingesehen werden)"
+#: ../../mod/network.php:329
+msgid "Contact: "
+msgstr "Kontakt: "
 
-#: ../../mod/profiles.php:401
-msgid "(Used for searching profiles, never shown to others)"
-msgstr ""
-"(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
+#: ../../mod/network.php:331
+msgid "Private messages to this person are at risk of public disclosure."
+msgstr "Private Nachrichten an diese Person könnten an die Ã–ffentlichkeit gelangen."
 
-#: ../../mod/profiles.php:402
-msgid "Tell us about yourself..."
-msgstr "Erzähle uns ein bisschen von dir â€¦"
+#: ../../mod/network.php:336
+msgid "Invalid contact."
+msgstr "Ungültiger Kontakt."
 
-#: ../../mod/profiles.php:403
-msgid "Hobbies/Interests"
-msgstr "Hobbies/Interessen"
+#: ../../mod/notes.php:44 ../../boot.php:1350
+msgid "Personal Notes"
+msgstr "Persönliche Notizen"
 
-#: ../../mod/profiles.php:404
-msgid "Contact information and Social Networks"
-msgstr "Kontaktinformationen und Soziale Netzwerke"
+#: ../../mod/notes.php:63 ../../include/text.php:639
+msgid "Save"
+msgstr "Speichern"
 
-#: ../../mod/profiles.php:405
-msgid "Musical interests"
-msgstr "Musikalische Interessen"
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendica"
+msgstr "Willkommen bei Friendica"
 
-#: ../../mod/profiles.php:406
-msgid "Books, literature"
-msgstr "Literatur/Bücher"
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
+msgstr "Checkliste für neue Mitglieder"
 
-#: ../../mod/profiles.php:407
-msgid "Television"
-msgstr "Fernsehen"
+#: ../../mod/newmember.php:12
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
+msgstr "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten."
 
-#: ../../mod/profiles.php:408
-msgid "Film/dance/culture/entertainment"
-msgstr "Filme/Tänze/Kultur/Unterhaltung"
+#: ../../mod/newmember.php:16
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
+msgstr "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten."
 
-#: ../../mod/profiles.php:409
-msgid "Love/romance"
-msgstr "Liebesleben"
+#: ../../mod/newmember.php:18
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr "Ãœberprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet."
 
-#: ../../mod/profiles.php:410
-msgid "Work/employment"
-msgstr "Arbeit/Beschäftigung"
+#: ../../mod/newmember.php:20
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust."
 
-#: ../../mod/profiles.php:411
-msgid "School/education"
-msgstr "Schule/Ausbildung"
+#: ../../mod/newmember.php:23
+msgid ""
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
+msgstr "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst."
 
-#: ../../mod/profiles.php:416
+#: ../../mod/newmember.php:28
 msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr ""
-"Dies ist dein <strong>öffentliches</strong> Profil.<br />Es "
-"<strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
+msgstr "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst."
 
-#: ../../mod/profiles.php:461
-msgid "Edit/Manage Profiles"
-msgstr "Verwalte/Editiere Profile"
+#: ../../mod/newmember.php:30
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Ãœberprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils."
 
-#: ../../mod/profiles.php:462 ../../boot.php:927
-msgid "Change profile photo"
-msgstr "Profilbild Ã¤ndern"
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr "Trage ein paar Ã¶ffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen."
 
-#: ../../mod/profiles.php:463 ../../boot.php:928
-msgid "Create New Profile"
-msgstr "Neues Profil anlegen"
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
+msgstr "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein."
 
-#: ../../mod/profiles.php:473 ../../boot.php:938
-msgid "Profile Image"
-msgstr "Profilbild"
+#: ../../mod/newmember.php:36
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr "Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst."
 
-#: ../../mod/profiles.php:475 ../../boot.php:941
-msgid "visible to everybody"
-msgstr "sichtbar für jeden"
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
 
-#: ../../mod/profiles.php:476 ../../boot.php:942
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
+#: ../../mod/newmember.php:40
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten."
 
-#: ../../mod/openid.php:63 ../../mod/openid.php:123 ../../include/auth.php:122
-#: ../../include/auth.php:147 ../../include/auth.php:201
-msgid "Login failed."
-msgstr "Annmeldung fehlgeschlagen."
+#: ../../mod/attach.php:8
+msgid "Item not available."
+msgstr "Beitrag nicht verfügbar."
 
-#: ../../mod/openid.php:79 ../../include/auth.php:217
-msgid "Welcome "
-msgstr "Willkommen "
+#: ../../mod/attach.php:20
+msgid "Item was not found."
+msgstr "Beitrag konnte nicht gefunden werden."
 
-#: ../../mod/openid.php:80 ../../include/auth.php:218
-msgid "Please upload a profile photo."
-msgstr "Bitte lade ein Profilbild hoch."
+#: ../../mod/group.php:27
+msgid "Group created."
+msgstr "Gruppe erstellt."
 
-#: ../../mod/openid.php:83 ../../include/auth.php:221
-msgid "Welcome back "
-msgstr "Willkommen zurück "
+#: ../../mod/group.php:33
+msgid "Could not create group."
+msgstr "Konnte die Gruppe nicht erstellen."
 
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:237
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: ../../mod/group.php:43 ../../mod/group.php:123
+msgid "Group not found."
+msgstr "Gruppe nicht gefunden."
 
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Zeitumrechnung"
+#: ../../mod/group.php:56
+msgid "Group name changed."
+msgstr "Gruppenname geändert."
 
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr ""
-"Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten "
-"zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
+msgid "Permission denied"
+msgstr "Zugriff verweigert"
 
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC Zeit: %s"
+#: ../../mod/group.php:82
+msgid "Create a group of contacts/friends."
+msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
 
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Aktuelle Zeitzone: %s"
+#: ../../mod/group.php:83 ../../mod/group.php:166
+msgid "Group Name: "
+msgstr "Gruppenname:"
 
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Umgerechnete lokale Zeit: %s"
+#: ../../mod/group.php:98
+msgid "Group removed."
+msgstr "Gruppe entfernt."
 
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Bitte wähle deine Zeitzone."
+#: ../../mod/group.php:100
+msgid "Unable to remove group."
+msgstr "Konnte die Gruppe nicht entfernen."
 
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Keine gültige Email Adresse."
+#: ../../mod/group.php:164 ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
+msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
 
-#: ../../mod/invite.php:59
-#, php-format
-msgid "Please join my network on %s"
-msgstr "Bitte trete meinem Netzwerk auf %s bei"
+#: ../../mod/group.php:165
+msgid "Group Editor"
+msgstr "Gruppeneditor"
 
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
+#: ../../mod/group.php:179
+msgid "Members"
+msgstr "Mitglieder"
 
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Nachricht gesendet."
-msgstr[1] "%d Nachrichten gesendet."
+#: ../../mod/group.php:194
+msgid "All Contacts"
+msgstr "Alle Kontakte"
 
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Du hast keine weiteren Einladungen"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Bezeichner"
 
-#: ../../mod/invite.php:99
-msgid "Send invitations"
-msgstr "Einladungen senden"
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
+msgstr "Editor für die Profil-Sichtbarkeit"
 
-#: ../../mod/invite.php:100
-msgid "Enter email addresses, one per line:"
-msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
+#: ../../mod/profperm.php:103 ../../include/profile_advanced.php:7
+#: ../../include/profile_advanced.php:76 ../../include/nav.php:48
+#: ../../boot.php:1332
+msgid "Profile"
+msgstr "Profil"
 
-#: ../../mod/invite.php:102
-#, php-format
-msgid "Please join my social network on %s"
-msgstr "Bitte trete meinem Sozialen Netzwerk auf %s bei"
+#: ../../mod/profperm.php:114
+msgid "Visible To"
+msgstr "Sichtbar für"
 
-#: ../../mod/invite.php:103
-msgid "To accept this invitation, please visit:"
-msgstr "Um diese Einladung anzunehmen besuche bitte:"
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
+msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
 
-#: ../../mod/invite.php:104
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Du benötigst den folgenden Einladungs Code: $invite_code"
+#: ../../mod/viewcontacts.php:25 ../../include/text.php:578
+msgid "View Contacts"
+msgstr "Kontakte anzeigen"
 
-#: ../../mod/invite.php:104
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr ""
-"Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:"
+#: ../../mod/viewcontacts.php:40
+msgid "No contacts."
+msgstr "Keine Kontakte."
 
 #: ../../mod/register.php:62
 msgid "An invitation is required."
@@ -2053,348 +2351,149 @@ msgstr "Konnte diese E-Mail-Adresse nicht verwenden."
 
 #: ../../mod/register.php:145
 msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr ""
-"Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" "
-"und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
-
-#: ../../mod/register.php:151 ../../mod/register.php:252
-msgid "Nickname is already registered. Please choose another."
-msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
-
-#: ../../mod/register.php:170
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "SERIOUS ERROR: Generation of security keys failed."
-
-#: ../../mod/register.php:238
-msgid "An error occurred during registration. Please try again."
-msgstr ""
-"Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch "
-"einmal."
-
-#: ../../mod/register.php:274
-msgid "An error occurred creating your default profile. Please try again."
-msgstr ""
-"Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte "
-"versuche es noch einmal."
-
-#: ../../mod/register.php:378 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
-msgstr "Details der Registration von %s"
-
-#: ../../mod/register.php:380 ../../mod/register.php:434
-#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:710
-#: ../../include/items.php:2415
-msgid "Administrator"
-msgstr "Administrator"
-
-#: ../../mod/register.php:386
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr ""
-"Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an "
-"dich gesendet."
-
-#: ../../mod/register.php:390
-msgid "Failed to send email message. Here is the message that failed."
-msgstr ""
-"Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht "
-"gesendet werden konnte."
-
-#: ../../mod/register.php:395
-msgid "Your registration can not be processed."
-msgstr "Deine Registrierung konnte nicht verarbeitet werden."
-
-#: ../../mod/register.php:432
-#, php-format
-msgid "Registration request at %s"
-msgstr "Registrierungsanfrage auf %s"
-
-#: ../../mod/register.php:441
-msgid "Your registration is pending approval by the site owner."
-msgstr ""
-"Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
-
-#: ../../mod/register.php:479
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr ""
-"Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde "
-"überschritten. Bitte versuche es morgen noch einmal."
-
-#: ../../mod/register.php:505
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr ""
-"Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem"
-" du deine OpenID angibst und 'Registrieren' klickst."
-
-#: ../../mod/register.php:506
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr ""
-"Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und "
-"fülle die restlichen Felder aus."
-
-#: ../../mod/register.php:507
-msgid "Your OpenID (optional): "
-msgstr "Deine OpenID (optional): "
-
-#: ../../mod/register.php:521
-msgid "Include your profile in member directory?"
-msgstr "Soll dein Profil im Nutzerverzeichnis angezeigt werden?"
-
-#: ../../mod/register.php:536
-msgid "Membership on this site is by invitation only."
-msgstr ""
-"Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-
-#: ../../mod/register.php:537
-msgid "Your invitation ID: "
-msgstr "ID deiner Einladung: "
-
-#: ../../mod/register.php:540 ../../mod/admin.php:297
-msgid "Registration"
-msgstr "Registrierung"
-
-#: ../../mod/register.php:548
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Vollständiger Name (z.B. Max Mustermann): "
-
-#: ../../mod/register.php:549
-msgid "Your Email Address: "
-msgstr "Deine E-Mail-Adresse: "
-
-#: ../../mod/register.php:550
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr ""
-"Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben "
-"beginnen. Die Adresse deines Profils auf dieser Seite wird "
-"'<strong>spitzname@$sitename</strong>' sein."
-
-#: ../../mod/register.php:551
-msgid "Choose a nickname: "
-msgstr "Spitznamen wählen: "
-
-#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:684
-msgid "Register"
-msgstr "Registrieren"
-
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Anwendungen"
-
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Keine Applikationen installiert."
-
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Kein Profil"
-
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Kontaktvorschlag gesendet."
-
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Kontakte vorschlagen"
-
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Schlage %s einen Kontakt vor"
-
-#: ../../mod/ping.php:148
-msgid "{0} wants to be your friend"
-msgstr "{0} möchte mit dir in Kontakt treten"
-
-#: ../../mod/ping.php:153
-msgid "{0} sent you a message"
-msgstr "{0} hat dir eine Nachricht geschickt"
-
-#: ../../mod/ping.php:158
-msgid "{0} requested registration"
-msgstr "{0} möchte sich registrieren"
-
-#: ../../mod/ping.php:164
-#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} kommentierte einen Beitrag von %s"
-
-#: ../../mod/ping.php:169
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} mag %ss Beitrag"
-
-#: ../../mod/ping.php:174
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} mag %ss Beitrag nicht"
-
-#: ../../mod/ping.php:179
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} ist jetzt mit %s befreundet"
-
-#: ../../mod/ping.php:184
-msgid "{0} posted"
-msgstr "{0} hat etwas veröffentlicht"
-
-#: ../../mod/ping.php:189
-#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen"
+"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
+"must also begin with a letter."
+msgstr "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
 
-#: ../../mod/ping.php:195
-msgid "{0} mentioned you in a post"
-msgstr "{0} hat dich in einem Beitrag erwähnt"
+#: ../../mod/register.php:151 ../../mod/register.php:252
+msgid "Nickname is already registered. Please choose another."
+msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
 
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Kein gültiger Account gefunden."
+#: ../../mod/register.php:170
+msgid "SERIOUS ERROR: Generation of security keys failed."
+msgstr "SERIOUS ERROR: Generation of security keys failed."
 
-#: ../../mod/lostpass.php:31
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Bitte Ã¼berprüfe deine E-Mail."
+#: ../../mod/register.php:238
+msgid "An error occurred during registration. Please try again."
+msgstr "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
 
-#: ../../mod/lostpass.php:42
+#: ../../mod/register.php:274
+msgid "An error occurred creating your default profile. Please try again."
+msgstr "Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
+
+#: ../../mod/register.php:378 ../../mod/regmod.php:52
 #, php-format
-msgid "Password reset requested at %s"
-msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
+msgid "Registration details for %s"
+msgstr "Details der Registration von %s"
 
-#: ../../mod/lostpass.php:64
+#: ../../mod/register.php:386
 msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr ""
-"Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits Ã¤hnliche"
-" Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
-
-#: ../../mod/lostpass.php:82 ../../boot.php:714
-msgid "Password Reset"
-msgstr "Passwort zurücksetzen"
+"Registration successful. Please check your email for further instructions."
+msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet."
 
-#: ../../mod/lostpass.php:83
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
+#: ../../mod/register.php:390
+msgid "Failed to send email message. Here is the message that failed."
+msgstr "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte."
 
-#: ../../mod/lostpass.php:84
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
+#: ../../mod/register.php:395
+msgid "Your registration can not be processed."
+msgstr "Deine Registrierung konnte nicht verarbeitet werden."
 
-#: ../../mod/lostpass.php:85
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere dein neues Passwort - und dann"
+#: ../../mod/register.php:432
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registrierungsanfrage auf %s"
 
-#: ../../mod/lostpass.php:86
-msgid "click here to login"
-msgstr "hier klicken, um dich anzumelden"
+#: ../../mod/register.php:441
+msgid "Your registration is pending approval by the site owner."
+msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
 
-#: ../../mod/lostpass.php:87
+#: ../../mod/register.php:479
 msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr ""
-"Du kannst das Passwort in den <em>Einstellungen</em> Ã¤ndern sobald du dich "
-"erfolgreich angemeldet hast."
-
-#: ../../mod/lostpass.php:118
-msgid "Forgot your Password?"
-msgstr "Hast du dein Passwort vergessen?"
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde Ã¼berschritten. Bitte versuche es morgen noch einmal."
 
-#: ../../mod/lostpass.php:119
+#: ../../mod/register.php:505
 msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr ""
-"Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir "
-"dann weitere Informationen per Mail zugesendet."
-
-#: ../../mod/lostpass.php:120
-msgid "Nickname or Email: "
-msgstr "Spitzname oder Email:"
+"You may (optionally) fill in this form via OpenID by supplying your OpenID "
+"and clicking 'Register'."
+msgstr "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst."
 
-#: ../../mod/lostpass.php:121
-msgid "Reset"
-msgstr "Zurücksetzen"
+#: ../../mod/register.php:506
+msgid ""
+"If you are not familiar with OpenID, please leave that field blank and fill "
+"in the rest of the items."
+msgstr "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus."
 
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Beitrag nicht gefunden"
+#: ../../mod/register.php:507
+msgid "Your OpenID (optional): "
+msgstr "Deine OpenID (optional): "
 
-#: ../../mod/editpost.php:32
-msgid "Edit post"
-msgstr "Beitrag bearbeiten"
+#: ../../mod/register.php:521
+msgid "Include your profile in member directory?"
+msgstr "Soll dein Profil im Nutzerverzeichnis angezeigt werden?"
 
-#: ../../mod/editpost.php:75 ../../include/conversation.php:848
-msgid "Post to Email"
-msgstr "An E-Mail senden"
+#: ../../mod/register.php:536
+msgid "Membership on this site is by invitation only."
+msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
 
-#: ../../mod/editpost.php:92 ../../include/conversation.php:865
-msgid "Attach file"
-msgstr "Datei anhängen"
+#: ../../mod/register.php:537
+msgid "Your invitation ID: "
+msgstr "ID deiner Einladung: "
 
-#: ../../mod/editpost.php:94
-msgid "Insert YouTube video"
-msgstr "YouTube-Video einfügen"
+#: ../../mod/register.php:540 ../../mod/admin.php:297
+msgid "Registration"
+msgstr "Registrierung"
 
-#: ../../mod/editpost.php:95
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Vorbis [.ogg] Video einfügen"
+#: ../../mod/register.php:548
+msgid "Your Full Name (e.g. Joe Smith): "
+msgstr "Vollständiger Name (z.B. Max Mustermann): "
 
-#: ../../mod/editpost.php:96
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Vorbis [.ogg] Audio einfügen"
+#: ../../mod/register.php:549
+msgid "Your Email Address: "
+msgstr "Deine E-Mail-Adresse: "
 
-#: ../../mod/editpost.php:97 ../../include/conversation.php:873
-msgid "Set your location"
-msgstr "Deinen Standort festlegen"
+#: ../../mod/register.php:550
+msgid ""
+"Choose a profile nickname. This must begin with a text character. Your "
+"profile address on this site will then be "
+"'<strong>nickname@$sitename</strong>'."
+msgstr "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@$sitename</strong>' sein."
 
-#: ../../mod/editpost.php:98 ../../include/conversation.php:875
-msgid "Clear browser location"
-msgstr "Browser-Standort leeren"
+#: ../../mod/register.php:551
+msgid "Choose a nickname: "
+msgstr "Spitznamen wählen: "
 
-#: ../../mod/editpost.php:100 ../../include/conversation.php:880
-msgid "Permission settings"
-msgstr "Berechtigungseinstellungen"
+#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:689
+msgid "Register"
+msgstr "Registrieren"
 
-#: ../../mod/editpost.php:108 ../../include/conversation.php:889
-msgid "CC: email addresses"
-msgstr "Cc:-E-Mail-Addressen"
+#: ../../mod/dirfind.php:23
+msgid "People Search"
+msgstr "Personen Suche"
 
-#: ../../mod/editpost.php:109 ../../include/conversation.php:890
-msgid "Public post"
-msgstr "Öffentlicher Beitrag"
+#: ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/facebook/facebook.php:1091
+#: ../../addon/communityhome/communityhome.php:158
+#: ../../addon/communityhome/communityhome.php:167
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:26
+#: ../../include/conversation.php:35 ../../include/conversation.php:99
+#: ../../include/conversation.php:108
+msgid "status"
+msgstr "Status"
 
-#: ../../mod/editpost.php:111 ../../include/conversation.php:892
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Z.B.: bob@example.com, mary@example.com"
+#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1095
+#: ../../addon/communityhome/communityhome.php:172
+#: ../../include/diaspora.php:1603 ../../include/conversation.php:43
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s mag %2$ss %3$s"
 
-#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
-msgid "Remove My Account"
-msgstr "Account löschen"
+#: ../../mod/like.php:146 ../../include/conversation.php:46
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s mag %2$ss %3$s nicht"
 
-#: ../../mod/removeme.php:43
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr ""
-"Dies wird deinen Account endgültig löschen. Es gibt keine Möglichkeit, ihn "
-"wiederherzustellen."
+#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
+#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:116
+#: ../../mod/viewd.php:14 ../../include/items.php:2819
+msgid "Item not found."
+msgstr "Beitrag nicht gefunden."
 
-#: ../../mod/removeme.php:44
-msgid "Please enter your password for verification:"
-msgstr "Bitte gib dein Passwort zur Verifikation ein:"
+#: ../../mod/viewsrc.php:7 ../../mod/viewd.php:6
+msgid "Access denied."
+msgstr "Zugriff verweigert."
 
 #: ../../mod/regmod.php:61
 msgid "Account approved."
@@ -2409,317 +2508,219 @@ msgstr "Registrierung für %s wurde zurückgezogen"
 msgid "Please login."
 msgstr "Bitte melde dich an."
 
-#: ../../mod/install.php:111
-msgid "Friendica Social Communications Server - Setup"
-msgstr "Friendica-Server für soziale Netzwerke â€“ Setup"
-
-#: ../../mod/install.php:117 ../../mod/install.php:157
-#: ../../mod/install.php:229
-msgid "Database connection"
-msgstr "Datenbank-Verbindung"
-
-#: ../../mod/install.php:124
-msgid "Could not connect to database."
-msgstr "Verbindung zur Datenbank gescheitert"
-
-#: ../../mod/install.php:128
-msgid "Could not create table."
-msgstr "Konnte Tabelle nicht erstellen."
-
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
-
-#: ../../mod/install.php:134
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr ""
-"WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten."
-
-#: ../../mod/install.php:135 ../../mod/install.php:151
-#: ../../mod/install.php:209
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Lies bitte die \"INSTALL.txt\"."
-
-#: ../../mod/install.php:137
-msgid "Proceed to registration"
-msgstr "Mit der Registrierung fortfahren"
-
-#: ../../mod/install.php:143
-msgid "Proceed with Installation"
-msgstr "Mit der Installation fortfahren"
-
-#: ../../mod/install.php:150
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr ""
-"Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin "
-"oder mysql importieren."
-
-#: ../../mod/install.php:158
-msgid "Database import failed."
-msgstr "Import der Datenbank schlug fehl."
+#: ../../mod/item.php:88
+msgid "Unable to locate original post."
+msgstr "Konnte den Originalbeitrag nicht finden."
 
-#: ../../mod/install.php:206
-msgid "System check"
-msgstr "Systemtest"
+#: ../../mod/item.php:248
+msgid "Empty post discarded."
+msgstr "Leerer Beitrag wurde verworfen."
 
-#: ../../mod/install.php:210 ../../mod/events.php:213
-msgid "Next"
-msgstr "Nächste"
+#: ../../mod/item.php:350 ../../mod/wall_upload.php:81
+#: ../../mod/wall_upload.php:90 ../../mod/wall_upload.php:97
+#: ../../include/message.php:143
+msgid "Wall Photos"
+msgstr "Pinnwand-Bilder"
 
-#: ../../mod/install.php:211
-msgid "Check again"
-msgstr "Noch einmal testen"
+#: ../../mod/item.php:827
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
 
-#: ../../mod/install.php:230
+#: ../../mod/item.php:852
+#, php-format
 msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr ""
-"Um Friendica installieren zu können müssen wir wissen wie wir zu deiner "
-"Datenbank Kontakt aufnehmen können."
+"This message was sent to you by %s, a member of the Friendica social "
+"network."
+msgstr "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica."
 
-#: ../../mod/install.php:231
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr ""
-"Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, "
-"falls du Fragen zu diesen Einstellungen haben solltest."
+#: ../../mod/item.php:854
+#, php-format
+msgid "You may visit them online at %s"
+msgstr "Du kannst sie online unter %s besuchen"
 
-#: ../../mod/install.php:232
+#: ../../mod/item.php:855
 msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr ""
-"Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies "
-"noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation "
-"fortfährst."
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
+msgstr "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest."
 
-#: ../../mod/install.php:236
-msgid "Database Server Name"
-msgstr "Datenbank-Server"
+#: ../../mod/item.php:857
+#, php-format
+msgid "%s posted an update."
+msgstr "%s hat ein Update veröffentlicht."
 
-#: ../../mod/install.php:237
-msgid "Database Login Name"
-msgstr "Datenbank-Nutzer"
+#: ../../mod/profile_photo.php:28
+msgid "Image uploaded but image cropping failed."
+msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
 
-#: ../../mod/install.php:238
-msgid "Database Login Password"
-msgstr "Datenbank-Passwort"
+#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
+#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Verkleinern der Bildgröße von [%s] ist gescheitert."
 
-#: ../../mod/install.php:239
-msgid "Database Name"
-msgstr "Datenbank-Name"
+#: ../../mod/profile_photo.php:89
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird."
 
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid "Site administrator email address"
-msgstr "E-Mail-Adresse des Administrators"
+#: ../../mod/profile_photo.php:99
+msgid "Unable to process image"
+msgstr "Bild konnte nicht verarbeitet werden"
 
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr ""
-"Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit "
-"dieser Adresse Ã¼bereinstimmen, damit du das Admin-Panel benutzen kannst."
+#: ../../mod/profile_photo.php:113 ../../mod/wall_upload.php:56
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "Bildgröße Ã¼berschreitet das Limit von %d"
 
-#: ../../mod/install.php:244 ../../mod/install.php:282
-msgid "Please select a default timezone for your website"
-msgstr "Bitte wähle die Standardzeitzone deiner Webseite"
+#: ../../mod/profile_photo.php:203
+msgid "Upload File:"
+msgstr "Datei hochladen:"
 
-#: ../../mod/install.php:269
-msgid "Site settings"
-msgstr "Server-Einstellungen"
+#: ../../mod/profile_photo.php:204
+msgid "Upload Profile Photo"
+msgstr "Profilbild hochladen"
 
-#: ../../mod/install.php:322
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr ""
-"Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
+#: ../../mod/profile_photo.php:205
+msgid "Upload"
+msgstr "Hochladen"
 
-#: ../../mod/install.php:325
-msgid "PHP executable path"
-msgstr "Pfad zu PHP"
+#: ../../mod/profile_photo.php:206
+msgid "skip this step"
+msgstr "diesen Schritt Ã¼berspringen"
 
-#: ../../mod/install.php:325
-msgid "Enter full path to php executable"
-msgstr "Kompletter Pfad zum PHP-Executable"
+#: ../../mod/profile_photo.php:206
+msgid "select a photo from your photo albums"
+msgstr "wähle ein Foto von deinen Fotoalben"
 
-#: ../../mod/install.php:330
-msgid "Command line PHP"
-msgstr "Kommadozeilen-PHP"
+#: ../../mod/profile_photo.php:219
+msgid "Crop Image"
+msgstr "Bild zurechtschneiden"
 
-#: ../../mod/install.php:339
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr ""
-"Die Kommandozeilenversion von PHP auf deinem System hat "
-"\"register_argc_argv\" nicht aktiviert."
+#: ../../mod/profile_photo.php:220
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann."
 
-#: ../../mod/install.php:340
-msgid "This is required for message delivery to work."
-msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
+#: ../../mod/profile_photo.php:221
+msgid "Done Editing"
+msgstr "Bearbeitung abgeschlossen"
 
-#: ../../mod/install.php:342
-msgid "PHP \"register_argc_argv\""
-msgstr "PHP \"register_argc_argv\""
+#: ../../mod/profile_photo.php:249
+msgid "Image uploaded successfully."
+msgstr "Bild erfolgreich auf den Server geladen."
 
-#: ../../mod/install.php:363
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr ""
-"Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der"
-" Lage, Verschlüsselungsschlüssel zu erzeugen"
+#: ../../mod/hcard.php:10
+msgid "No profile"
+msgstr "Kein Profil"
 
-#: ../../mod/install.php:364
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr ""
-"Wenn der Server unter Windows läuft, schau dir bitte "
-"\"http://www.php.net/manual/en/openssl.installation.php\" an."
+#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
+msgid "Remove My Account"
+msgstr "Account löschen"
 
-#: ../../mod/install.php:366
-msgid "Generate encryption keys"
-msgstr "Schlüssel erzeugen"
+#: ../../mod/removeme.php:46
+msgid ""
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
+msgstr "Dies wird deinen Account endgültig löschen. Es gibt keine Möglichkeit, ihn wiederherzustellen."
 
-#: ../../mod/install.php:373
-msgid "libCurl PHP module"
-msgstr "PHP: libCurl-Modul"
+#: ../../mod/removeme.php:47
+msgid "Please enter your password for verification:"
+msgstr "Bitte gib dein Passwort zur Verifikation ein:"
 
-#: ../../mod/install.php:374
-msgid "GD graphics PHP module"
-msgstr "PHP: GD-Grafikmodul"
+#: ../../mod/message.php:23
+msgid "No recipient selected."
+msgstr "Kein Empfänger gewählt."
 
-#: ../../mod/install.php:375
-msgid "OpenSSL PHP module"
-msgstr "PHP: OpenSSL-Modul"
+#: ../../mod/message.php:26
+msgid "Unable to locate contact information."
+msgstr "Konnte die Kontaktinformationen nicht finden."
 
-#: ../../mod/install.php:376
-msgid "mysqli PHP module"
-msgstr "PHP: mysqli-Modul"
+#: ../../mod/message.php:29
+msgid "Message could not be sent."
+msgstr "Nachricht konnte nicht gesendet werden."
 
-#: ../../mod/install.php:377
-msgid "mb_string PHP module"
-msgstr "PHP: mb_string-Modul"
+#: ../../mod/message.php:32
+msgid "Message collection failure."
+msgstr "Konnte Nachrichten nicht abrufen."
 
-#: ../../mod/install.php:382 ../../mod/install.php:384
-msgid "Apace mod_rewrite module"
-msgstr "Apache: mod_rewrite-Modul"
+#: ../../mod/message.php:35
+msgid "Message sent."
+msgstr "Nachricht gesendet."
 
-#: ../../mod/install.php:382
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr ""
-"Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht "
-"installiert."
+#: ../../mod/message.php:55
+msgid "Inbox"
+msgstr "Eingang"
 
-#: ../../mod/install.php:389
-msgid "Error: libCURL PHP module required but not installed."
-msgstr ""
-"Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
+#: ../../mod/message.php:60
+msgid "Outbox"
+msgstr "Ausgang"
 
-#: ../../mod/install.php:393
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr ""
-"Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht "
-"installiert."
+#: ../../mod/message.php:65
+msgid "New Message"
+msgstr "Neue Nachricht"
 
-#: ../../mod/install.php:397
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
+#: ../../mod/message.php:91
+msgid "Message deleted."
+msgstr "Nachricht gelöscht."
 
-#: ../../mod/install.php:401
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
+#: ../../mod/message.php:121
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
 
-#: ../../mod/install.php:405
-msgid "Error: mb_string PHP module required but not installed."
-msgstr ""
-"Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
+#: ../../mod/message.php:137 ../../include/conversation.php:843
+msgid "Please enter a link URL:"
+msgstr "Bitte gib die URL des Links ein:"
 
-#: ../../mod/install.php:422
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr ""
-"Der Installationswizard muss in der Lage sein, eine Datei im "
-"Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht "
-"in der Lage, dies zu tun."
+#: ../../mod/message.php:145
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
 
-#: ../../mod/install.php:423
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr ""
-"In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der "
-"Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
+#: ../../mod/message.php:146 ../../mod/message.php:287
+msgid "To:"
+msgstr "An:"
 
-#: ../../mod/install.php:424
-msgid ""
-"Please check with your site documentation or support people to see if this "
-"situation can be corrected."
-msgstr ""
-"Bitte Ã¼berprüfe die Einstellungen und frage im Zweifelsfall dein Support "
-"Team, um diese Situation zu beheben."
+#: ../../mod/message.php:147 ../../mod/message.php:288
+msgid "Subject:"
+msgstr "Betreff:"
 
-#: ../../mod/install.php:425
-msgid ""
-"If not, you may be required to perform a manual installation. Please see the"
-" file \"INSTALL.txt\" for instructions."
-msgstr ""
-"Sollte dies nicht möglich sein, musst du die Installation manuell "
-"durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\"."
+#: ../../mod/message.php:150 ../../mod/message.php:291
+#: ../../mod/invite.php:101
+msgid "Your message:"
+msgstr "Deine Nachricht:"
 
-#: ../../mod/install.php:428
-msgid ".htconfig.php is writable"
-msgstr "Schreibrechte auf .htconfig.php"
+#: ../../mod/message.php:188
+msgid "No messages."
+msgstr "Keine Nachrichten."
 
-#: ../../mod/install.php:435
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr ""
-"Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. "
-"Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner "
-"Friendica-Installation zu erzeugen."
+#: ../../mod/message.php:201
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
 
-#: ../../mod/install.php:460
-msgid "Errors encountered creating database tables."
-msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
+#: ../../mod/message.php:204
+msgid "D, d M Y - g:i A"
+msgstr "D, d. M Y - g:i A"
 
-#: ../../mod/community.php:21
-msgid "Not available."
-msgstr "Nicht verfügbar."
+#: ../../mod/message.php:239
+msgid "Message not available."
+msgstr "Nachricht nicht verfügbar."
 
-#: ../../mod/community.php:30 ../../include/nav.php:97
-msgid "Community"
-msgstr "Gemeinschaft"
+#: ../../mod/message.php:276
+msgid "Delete message"
+msgstr "Nachricht löschen"
 
-#: ../../mod/community.php:60 ../../mod/search.php:118
-msgid "No results."
-msgstr "Keine Ergebnisse."
+#: ../../mod/message.php:286
+msgid "Send Reply"
+msgstr "Antwort senden"
 
-#: ../../mod/community.php:87
-msgid ""
-"Shared content is covered by the <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> license."
-msgstr ""
-"Geteilte Inhalte innerhalb des Friendica-Netzwerks sind unter der <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> verfügbar."
+#: ../../mod/allfriends.php:34
+#, php-format
+msgid "Friends of %s"
+msgstr "Freunde von %s"
 
-#: ../../mod/oexchange.php:27
-msgid "Post successful."
-msgstr "Beitrag erfolgreich veröffentlicht."
+#: ../../mod/allfriends.php:40
+msgid "No friends to display."
+msgstr "Keine Freunde zum Anzeigen."
 
 #: ../../mod/admin.php:59 ../../mod/admin.php:295
 msgid "Site"
@@ -2794,7 +2795,7 @@ msgstr "Regeln"
 msgid "Advanced"
 msgstr "Erweitert"
 
-#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:477
+#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:486
 msgid "Site name"
 msgstr "Seitenname"
 
@@ -2830,9 +2831,7 @@ msgstr "Accounts gelten nach x Tagen als unbenutzt"
 msgid ""
 "Will not waste system resources polling external sites for abandonded "
 "accounts. Enter 0 for no time limit."
-msgstr ""
-"Verschwende keine System-Ressourcen fürs Pollen externer Seiten, wenn "
-"Accounts nicht mehr benutzt werden. 0 eingeben für kein Limit."
+msgstr "Verschwende keine System-Ressourcen fürs Pollen externer Seiten, wenn Accounts nicht mehr benutzt werden. 0 eingeben für kein Limit."
 
 #: ../../mod/admin.php:314
 msgid "Allowed friend domains"
@@ -2980,18 +2979,13 @@ msgstr "Nutzerkonto"
 msgid ""
 "Selected users will be deleted!\\n\\nEverything these users had posted on "
 "this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-"Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer "
-"auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist "
-"du sicher?"
+msgstr "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist du sicher?"
 
 #: ../../mod/admin.php:476
 msgid ""
 "The user {0} will be deleted!\\n\\nEverything this user has posted on this "
 "site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-"Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite "
-"veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?"
+msgstr "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?"
 
 #: ../../mod/admin.php:512
 #, php-format
@@ -3015,7 +3009,7 @@ msgstr "Einschalten"
 msgid "Toggle"
 msgstr "Umschalten"
 
-#: ../../mod/admin.php:551 ../../include/nav.php:128
+#: ../../mod/admin.php:551 ../../include/nav.php:129
 msgid "Settings"
 msgstr "Einstellungen"
 
@@ -3039,9 +3033,7 @@ msgstr "Protokolldatei"
 msgid ""
 "Must be writable by web server. Relative to your Friendica top-level "
 "directory."
-msgstr ""
-"Webserver muss Schreibrechte besitzen. Relativ zum Friendica-"
-"Installationsverzeichnis."
+msgstr "Webserver muss Schreibrechte besitzen. Relativ zum Friendica-Installationsverzeichnis."
 
 #: ../../mod/admin.php:661
 msgid "Log level"
@@ -3055,1071 +3047,1355 @@ msgstr "Schließen"
 msgid "FTP Host"
 msgstr "FTP Host"
 
-#: ../../mod/admin.php:709
-msgid "FTP Path"
-msgstr "FTP Pfad"
+#: ../../mod/admin.php:709
+msgid "FTP Path"
+msgstr "FTP Pfad"
+
+#: ../../mod/admin.php:710
+msgid "FTP User"
+msgstr "FTP Nutzername"
+
+#: ../../mod/admin.php:711
+msgid "FTP Password"
+msgstr "FTP Passwort"
+
+#: ../../mod/profile.php:15 ../../boot.php:841
+msgid "Requested profile is not available."
+msgstr "Profil nicht vorhanden."
+
+#: ../../mod/profile.php:111 ../../mod/display.php:66
+msgid "Access to this profile has been restricted."
+msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+
+#: ../../mod/profile.php:131
+msgid "Tips for New Members"
+msgstr "Tipps für neue Nutzer"
+
+#: ../../mod/ping.php:148
+msgid "{0} wants to be your friend"
+msgstr "{0} möchte mit dir in Kontakt treten"
+
+#: ../../mod/ping.php:153
+msgid "{0} sent you a message"
+msgstr "{0} hat dir eine Nachricht geschickt"
+
+#: ../../mod/ping.php:158
+msgid "{0} requested registration"
+msgstr "{0} möchte sich registrieren"
+
+#: ../../mod/ping.php:164
+#, php-format
+msgid "{0} commented %s's post"
+msgstr "{0} kommentierte einen Beitrag von %s"
+
+#: ../../mod/ping.php:169
+#, php-format
+msgid "{0} liked %s's post"
+msgstr "{0} mag %ss Beitrag"
+
+#: ../../mod/ping.php:174
+#, php-format
+msgid "{0} disliked %s's post"
+msgstr "{0} mag %ss Beitrag nicht"
+
+#: ../../mod/ping.php:179
+#, php-format
+msgid "{0} is now friends with %s"
+msgstr "{0} ist jetzt mit %s befreundet"
+
+#: ../../mod/ping.php:184
+msgid "{0} posted"
+msgstr "{0} hat etwas veröffentlicht"
+
+#: ../../mod/ping.php:189
+#, php-format
+msgid "{0} tagged %s's post with #%s"
+msgstr "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen"
+
+#: ../../mod/ping.php:195
+msgid "{0} mentioned you in a post"
+msgstr "{0} hat dich in einem Beitrag erwähnt"
+
+#: ../../mod/openid.php:63 ../../mod/openid.php:77 ../../include/auth.php:90
+#: ../../include/auth.php:115 ../../include/auth.php:169
+msgid "Login failed."
+msgstr "Annmeldung fehlgeschlagen."
+
+#: ../../mod/follow.php:27
+msgid "Connect URL missing."
+msgstr "Connect-URL fehlt"
+
+#: ../../mod/follow.php:47
+msgid ""
+"This site is not configured to allow communications with other networks."
+msgstr "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann."
+
+#: ../../mod/follow.php:48 ../../mod/follow.php:58
+msgid "No compatible communication protocols or feeds were discovered."
+msgstr "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
+
+#: ../../mod/follow.php:56
+msgid "The profile address specified does not provide adequate information."
+msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+
+#: ../../mod/follow.php:60
+msgid "An author or name was not found."
+msgstr "Es wurde kein Autor oder Name gefunden."
+
+#: ../../mod/follow.php:62
+msgid "No browser URL could be matched to this address."
+msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
+
+#: ../../mod/follow.php:69
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
+msgstr "Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde."
+
+#: ../../mod/follow.php:74
+msgid ""
+"Limited profile. This person will be unable to receive direct/personal "
+"notifications from you."
+msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können."
+
+#: ../../mod/follow.php:144
+msgid "Unable to retrieve contact information."
+msgstr "Konnte die Kontaktinformationen nicht empfangen."
+
+#: ../../mod/follow.php:190
+msgid "following"
+msgstr "folgen"
+
+#: ../../mod/common.php:34
+msgid "Common Friends"
+msgstr "Gemeinsame Freunde"
+
+#: ../../mod/common.php:42
+msgid "No friends in common."
+msgstr "Keine gemeinsamen Freunde."
+
+#: ../../mod/display.php:109
+msgid "Item has been removed."
+msgstr "Eintrag wurde entfernt."
+
+#: ../../mod/apps.php:4
+msgid "Applications"
+msgstr "Anwendungen"
+
+#: ../../mod/apps.php:7
+msgid "No installed applications."
+msgstr "Keine Applikationen installiert."
+
+#: ../../mod/search.php:83
+msgid "Search This Site"
+msgstr "Diese Seite durchsuchen"
+
+#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
+#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
+
+#: ../../mod/profiles.php:28
+msgid "Profile Name is required."
+msgstr "Profilname ist erforderlich."
+
+#: ../../mod/profiles.php:198
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
+
+#: ../../mod/profiles.php:256
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
+
+#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
+msgid "Profile-"
+msgstr "Profil-"
+
+#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
+msgid "New profile created."
+msgstr "Neues Profil angelegt."
+
+#: ../../mod/profiles.php:309
+msgid "Profile unavailable to clone."
+msgstr "Profil nicht zum Duplizieren verfügbar."
+
+#: ../../mod/profiles.php:356
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
+
+#: ../../mod/profiles.php:374
+msgid "Edit Profile Details"
+msgstr "Profil bearbeiten"
+
+#: ../../mod/profiles.php:376
+msgid "View this profile"
+msgstr "Dieses Profil anzeigen"
+
+#: ../../mod/profiles.php:377
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
+
+#: ../../mod/profiles.php:378
+msgid "Clone this profile"
+msgstr "Dieses Profil duplizieren"
+
+#: ../../mod/profiles.php:379
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
+
+#: ../../mod/profiles.php:380
+msgid "Profile Name:"
+msgstr "Profilname:"
+
+#: ../../mod/profiles.php:381
+msgid "Your Full Name:"
+msgstr "Dein kompletter Name:"
+
+#: ../../mod/profiles.php:382
+msgid "Title/Description:"
+msgstr "Titel/Beschreibung:"
+
+#: ../../mod/profiles.php:383
+msgid "Your Gender:"
+msgstr "Dein Geschlecht:"
+
+#: ../../mod/profiles.php:384
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Geburtstag (%s):"
+
+#: ../../mod/profiles.php:385
+msgid "Street Address:"
+msgstr "Adresse:"
+
+#: ../../mod/profiles.php:386
+msgid "Locality/City:"
+msgstr "Wohnort/Stadt:"
+
+#: ../../mod/profiles.php:387
+msgid "Postal/Zip Code:"
+msgstr "Postleitzahl:"
+
+#: ../../mod/profiles.php:388
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../mod/profiles.php:389
+msgid "Region/State:"
+msgstr "Region/Bundesstaat:"
+
+#: ../../mod/profiles.php:390
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+
+#: ../../mod/profiles.php:391
+msgid "Who: (if applicable)"
+msgstr "Wer: (falls anwendbar)"
+
+#: ../../mod/profiles.php:392
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+
+#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
+msgid "Sexual Preference:"
+msgstr "Sexuelle Vorlieben:"
+
+#: ../../mod/profiles.php:394
+msgid "Homepage URL:"
+msgstr "Adresse der Homepage:"
+
+#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:49
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
+
+#: ../../mod/profiles.php:396
+msgid "Religious Views:"
+msgstr "Religiöse Ansichten:"
+
+#: ../../mod/profiles.php:397
+msgid "Public Keywords:"
+msgstr "Öffentliche Schlüsselwörter:"
 
-#: ../../mod/admin.php:710
-msgid "FTP User"
-msgstr "FTP Nutzername"
+#: ../../mod/profiles.php:398
+msgid "Private Keywords:"
+msgstr "Private Schlüsselwörter:"
 
-#: ../../mod/admin.php:711
-msgid "FTP Password"
-msgstr "FTP Passwort"
+#: ../../mod/profiles.php:399
+msgid "Example: fishing photography software"
+msgstr "Beispiel: Fischen Fotografie Software"
 
-#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
-msgid "Friend Suggestions"
-msgstr "Kontaktvorschläge"
+#: ../../mod/profiles.php:400
+msgid "(Used for suggesting potential friends, can be seen by others)"
+msgstr "(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)"
 
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr ""
-"Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es "
-"bitte in 24 Stunden noch einmal."
+#: ../../mod/profiles.php:401
+msgid "(Used for searching profiles, never shown to others)"
+msgstr "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
 
-#: ../../mod/suggest.php:59 ../../mod/match.php:58
-#: ../../include/contact_widgets.php:9 ../../boot.php:911
-msgid "Connect"
-msgstr "Verbinden"
+#: ../../mod/profiles.php:402
+msgid "Tell us about yourself..."
+msgstr "Erzähle uns ein bisschen von dir â€¦"
 
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Ignorieren/Verbergen"
+#: ../../mod/profiles.php:403
+msgid "Hobbies/Interests"
+msgstr "Hobbies/Interessen"
 
-#: ../../mod/display.php:66 ../../mod/profile.php:111
-msgid "Access to this profile has been restricted."
-msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+#: ../../mod/profiles.php:404
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformationen und Soziale Netzwerke"
 
-#: ../../mod/display.php:108
-msgid "Item has been removed."
-msgstr "Eintrag wurde entfernt."
+#: ../../mod/profiles.php:405
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
 
-#: ../../mod/like.php:144 ../../include/conversation.php:43
-#: ../../include/diaspora.php:1570 ../../addon/facebook/facebook.php:1088
-#: ../../addon/communityhome/communityhome.php:172
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s"
+#: ../../mod/profiles.php:406
+msgid "Books, literature"
+msgstr "Literatur/Bücher"
 
-#: ../../mod/like.php:146 ../../include/conversation.php:46
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s nicht"
+#: ../../mod/profiles.php:407
+msgid "Television"
+msgstr "Fernsehen"
 
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profilübereinstimmungen"
+#: ../../mod/profiles.php:408
+msgid "Film/dance/culture/entertainment"
+msgstr "Filme/Tänze/Kultur/Unterhaltung"
 
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr ""
-"Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige "
-"Schlüsselwörter zu deinem Standardprofil hinzu."
+#: ../../mod/profiles.php:409
+msgid "Love/romance"
+msgstr "Liebesleben"
 
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr "ist interessiert an:"
+#: ../../mod/profiles.php:410
+msgid "Work/employment"
+msgstr "Arbeit/Beschäftigung"
 
-#: ../../mod/notes.php:44 ../../boot.php:1335
-msgid "Personal Notes"
-msgstr "Persönliche Notizen"
+#: ../../mod/profiles.php:411
+msgid "School/education"
+msgstr "Schule/Ausbildung"
 
-#: ../../mod/notes.php:63 ../../include/text.php:635
-msgid "Save"
-msgstr "Speichern"
+#: ../../mod/profiles.php:416
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
 
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Hilfe:"
+#: ../../mod/profiles.php:426 ../../mod/directory.php:122
+msgid "Age: "
+msgstr "Alter: "
 
-#: ../../mod/help.php:34 ../../include/nav.php:82
-msgid "Help"
-msgstr "Hilfe"
+#: ../../mod/profiles.php:461
+msgid "Edit/Manage Profiles"
+msgstr "Verwalte/Editiere Profile"
 
-#: ../../mod/help.php:38 ../../index.php:221
-msgid "Not Found"
-msgstr "Nicht gefunden"
+#: ../../mod/profiles.php:462 ../../boot.php:942
+msgid "Change profile photo"
+msgstr "Profilbild Ã¤ndern"
 
-#: ../../mod/help.php:41 ../../index.php:224
-msgid "Page not found."
-msgstr "Seite nicht gefunden."
+#: ../../mod/profiles.php:463 ../../boot.php:943
+msgid "Create New Profile"
+msgstr "Neues Profil anlegen"
 
-#: ../../mod/dfrn_confirm.php:236
-msgid "Response from remote site was not understood."
-msgstr "Antwort der entfernten Gegenstelle unverständlich."
+#: ../../mod/profiles.php:473 ../../boot.php:953
+msgid "Profile Image"
+msgstr "Profilbild"
 
-#: ../../mod/dfrn_confirm.php:245
-msgid "Unexpected response from remote site: "
-msgstr "Unerwartete Antwort der Gegenstelle: "
+#: ../../mod/profiles.php:475 ../../boot.php:956
+msgid "visible to everybody"
+msgstr "sichtbar für jeden"
 
-#: ../../mod/dfrn_confirm.php:253
-msgid "Confirmation completed successfully."
-msgstr "Bestätigung erfolgreich abgeschlossen."
+#: ../../mod/profiles.php:476 ../../boot.php:957
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
 
-#: ../../mod/dfrn_confirm.php:255 ../../mod/dfrn_confirm.php:269
-#: ../../mod/dfrn_confirm.php:276
-msgid "Remote site reported: "
-msgstr "Entfernte Seite meldet: "
+#: ../../mod/tagger.php:103 ../../include/conversation.php:116
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
 
-#: ../../mod/dfrn_confirm.php:267
-msgid "Temporary failure. Please wait and try again."
-msgstr ""
-"Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch "
-"einmal."
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Keine potentiellen Bevollmächtigte für die Seite gefunden."
 
-#: ../../mod/dfrn_confirm.php:274
-msgid "Introduction failed or was revoked."
-msgstr "Kontaktanfrage schlug fehl oder wurde zurück gezogen."
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Delegiere das Management für die Seite"
 
-#: ../../mod/dfrn_confirm.php:416
-msgid "Unable to set contact photo."
-msgstr "Konnte das Bild des Kontakts nicht speichern."
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Bevollmächtigte sind in der Lage alle Aspekte dieses Accounts/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Accounts. Bitte gib Niemandem eine Bevollmächtigung für deinen privaten Account dem du nicht absolut vertraust."
 
-#: ../../mod/dfrn_confirm.php:466 ../../include/conversation.php:79
-#: ../../include/diaspora.php:495
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s ist nun mit %2$s befreundet"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Vorhandene Seiten Manager"
 
-#: ../../mod/dfrn_confirm.php:537
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Für '%s' wurde kein Nutzer gefunden"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Vorhandene Bevollmächtigte für die Seite"
 
-#: ../../mod/dfrn_confirm.php:547
-msgid "Our site encryption key is apparently messed up."
-msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch."
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Potentielle Bevollmächtigte"
 
-#: ../../mod/dfrn_confirm.php:558
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr ""
-"Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt "
-"werden."
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Hinzufügen"
 
-#: ../../mod/dfrn_confirm.php:579
-msgid "Contact record was not found for you on our site."
-msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Keine Einträge"
 
-#: ../../mod/dfrn_confirm.php:593
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr ""
-"Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
+#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
+msgid "Friend Suggestions"
+msgstr "Kontaktvorschläge"
 
-#: ../../mod/dfrn_confirm.php:613
+#: ../../mod/suggest.php:44
 msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr ""
-"Die ID die uns dein System angeboten hat ist hier bereits vergeben. Bitte "
-"versuche es noch einmal."
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal."
 
-#: ../../mod/dfrn_confirm.php:624
-msgid "Unable to set your contact credentials on our system."
-msgstr ""
-"Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
+#: ../../mod/suggest.php:61
+msgid "Ignore/Hide"
+msgstr "Ignorieren/Verbergen"
 
-#: ../../mod/dfrn_confirm.php:678
-msgid "Unable to update your contact profile details on our system"
-msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
+#: ../../mod/directory.php:49
+msgid "Global Directory"
+msgstr "Weltweites Verzeichnis"
 
-#: ../../mod/dfrn_confirm.php:708
-#, php-format
-msgid "Connection accepted at %s"
-msgstr "Auf %s wurde die Verbindung akzeptiert"
+#: ../../mod/directory.php:55
+msgid "Normal site view"
+msgstr "Normale Seitenansicht"
 
-#: ../../mod/profile.php:15 ../../boot.php:836
-msgid "Requested profile is not available."
-msgstr "Profil nicht vorhanden."
+#: ../../mod/directory.php:57
+msgid "Admin - View all site entries"
+msgstr "Admin: Alle Einträge dieses Servers anzeigen"
 
-#: ../../mod/profile.php:131
-msgid "Tips for New Members"
-msgstr "Tipps für neue Nutzer"
+#: ../../mod/directory.php:63
+msgid "Find on this site"
+msgstr "Auf diesem Server suchen"
 
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
-msgstr "Konnte den Originalbeitrag nicht finden."
+#: ../../mod/directory.php:66
+msgid "Site Directory"
+msgstr "Verzeichnis"
 
-#: ../../mod/item.php:206
-msgid "Empty post discarded."
-msgstr "Leerer Beitrag wurde verworfen."
+#: ../../mod/directory.php:125
+msgid "Gender: "
+msgstr "Geschlecht:"
 
-#: ../../mod/item.php:778
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
+#: ../../mod/directory.php:151
+msgid "No entries (some entries may be hidden)."
+msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
 
-#: ../../mod/item.php:803
+#: ../../mod/invite.php:35
 #, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr ""
-"Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen "
-"Netzwerks Friendica."
+msgid "%s : Not a valid email address."
+msgstr "%s: Keine gültige Email Adresse."
 
-#: ../../mod/item.php:805
+#: ../../mod/invite.php:59
 #, php-format
-msgid "You may visit them online at %s"
-msgstr "Du kannst sie online unter %s besuchen"
-
-#: ../../mod/item.php:806
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr ""
-"Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den "
-"Autor, indem du auf diese Nachricht antwortest."
+msgid "Please join my network on %s"
+msgstr "Bitte trete meinem Netzwerk auf %s bei"
 
-#: ../../mod/item.php:808
+#: ../../mod/invite.php:69
 #, php-format
-msgid "%s posted an update."
-msgstr "%s hat ein Update veröffentlicht."
+msgid "%s : Message delivery failed."
+msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
 
-#: ../../mod/search.php:13 ../../mod/network.php:84
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchen"
+#: ../../mod/invite.php:73
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Nachricht gesendet."
+msgstr[1] "%d Nachrichten gesendet."
 
-#: ../../mod/search.php:16 ../../mod/network.php:75
-msgid "Remove term"
-msgstr "Begriff entfernen"
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren Einladungen"
 
-#: ../../mod/search.php:83
-msgid "Search This Site"
-msgstr "Diese Seite durchsuchen"
+#: ../../mod/invite.php:99
+msgid "Send invitations"
+msgstr "Einladungen senden"
 
-#: ../../mod/photos.php:42
-msgid "Photo Albums"
-msgstr "Fotoalben"
+#: ../../mod/invite.php:100
+msgid "Enter email addresses, one per line:"
+msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
 
-#: ../../mod/photos.php:50 ../../mod/photos.php:146 ../../mod/photos.php:868
-#: ../../mod/photos.php:938 ../../mod/photos.php:953 ../../mod/photos.php:1354
-#: ../../mod/photos.php:1366 ../../addon/communityhome/communityhome.php:110
-msgid "Contact Photos"
-msgstr "Kontaktbilder"
+#: ../../mod/invite.php:102
+#, php-format
+msgid "Please join my social network on %s"
+msgstr "Bitte trete meinem Sozialen Netzwerk auf %s bei"
 
-#: ../../mod/photos.php:135
-msgid "Contact information unavailable"
-msgstr "Kontaktinformationen nicht verfügbar"
+#: ../../mod/invite.php:103
+msgid "To accept this invitation, please visit:"
+msgstr "Um diese Einladung anzunehmen besuche bitte:"
 
-#: ../../mod/photos.php:156
-msgid "Album not found."
-msgstr "Album nicht gefunden."
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du benötigst den folgenden Einladungs Code: $invite_code"
 
-#: ../../mod/photos.php:174 ../../mod/photos.php:947
-msgid "Delete Album"
-msgstr "Album löschen"
+#: ../../mod/invite.php:104
+msgid ""
+"Once you have registered, please connect with me via my profile page at:"
+msgstr "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:"
 
-#: ../../mod/photos.php:237 ../../mod/photos.php:1166
-msgid "Delete Photo"
-msgstr "Foto löschen"
+#: ../../mod/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
+msgstr "Antwort der entfernten Gegenstelle unverständlich."
 
-#: ../../mod/photos.php:524
-msgid "was tagged in a"
-msgstr "wurde getaggt in einem"
+#: ../../mod/dfrn_confirm.php:247
+msgid "Unexpected response from remote site: "
+msgstr "Unerwartete Antwort der Gegenstelle: "
 
-#: ../../mod/photos.php:524
-msgid "by"
-msgstr "von"
+#: ../../mod/dfrn_confirm.php:255
+msgid "Confirmation completed successfully."
+msgstr "Bestätigung erfolgreich abgeschlossen."
 
-#: ../../mod/photos.php:627 ../../addon/js_upload/js_upload.php:312
-msgid "Image exceeds size limit of "
-msgstr "Die Bildgröße Ã¼bersteigt das Limit von "
+#: ../../mod/dfrn_confirm.php:257 ../../mod/dfrn_confirm.php:271
+#: ../../mod/dfrn_confirm.php:278
+msgid "Remote site reported: "
+msgstr "Entfernte Seite meldet: "
 
-#: ../../mod/photos.php:635
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../mod/dfrn_confirm.php:269
+msgid "Temporary failure. Please wait and try again."
+msgstr "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal."
 
-#: ../../mod/photos.php:764
-msgid "No photos selected"
-msgstr "Keine Bilder ausgewählt"
+#: ../../mod/dfrn_confirm.php:276
+msgid "Introduction failed or was revoked."
+msgstr "Kontaktanfrage schlug fehl oder wurde zurück gezogen."
 
-#: ../../mod/photos.php:841
-msgid "Access to this item is restricted."
-msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
+#: ../../mod/dfrn_confirm.php:421
+msgid "Unable to set contact photo."
+msgstr "Konnte das Bild des Kontakts nicht speichern."
 
-#: ../../mod/photos.php:895
-msgid "Upload Photos"
-msgstr "Bilder hochladen"
+#: ../../mod/dfrn_confirm.php:473 ../../include/diaspora.php:495
+#: ../../include/conversation.php:79
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s ist nun mit %2$s befreundet"
 
-#: ../../mod/photos.php:898 ../../mod/photos.php:942
-msgid "New album name: "
-msgstr "Name des neuen Albums: "
+#: ../../mod/dfrn_confirm.php:543
+#, php-format
+msgid "No user record found for '%s' "
+msgstr "Für '%s' wurde kein Nutzer gefunden"
 
-#: ../../mod/photos.php:899
-msgid "or existing album name: "
-msgstr "oder existierender Albumname: "
+#: ../../mod/dfrn_confirm.php:553
+msgid "Our site encryption key is apparently messed up."
+msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch."
 
-#: ../../mod/photos.php:900
-msgid "Do not show a status post for this upload"
-msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
+#: ../../mod/dfrn_confirm.php:564
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden."
 
-#: ../../mod/photos.php:902 ../../mod/photos.php:1161
-msgid "Permissions"
-msgstr "Berechtigungen"
+#: ../../mod/dfrn_confirm.php:585
+msgid "Contact record was not found for you on our site."
+msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
 
-#: ../../mod/photos.php:957
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: ../../mod/dfrn_confirm.php:599
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
 
-#: ../../mod/photos.php:967 ../../mod/photos.php:1379
-msgid "View Photo"
-msgstr "Fotos betrachten"
+#: ../../mod/dfrn_confirm.php:619
+msgid ""
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
+msgstr "Die ID die uns dein System angeboten hat ist hier bereits vergeben. Bitte versuche es noch einmal."
 
-#: ../../mod/photos.php:1002
-msgid "Permission denied. Access to this item may be restricted."
-msgstr ""
-"Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
+#: ../../mod/dfrn_confirm.php:630
+msgid "Unable to set your contact credentials on our system."
+msgstr "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
 
-#: ../../mod/photos.php:1004
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: ../../mod/dfrn_confirm.php:684
+msgid "Unable to update your contact profile details on our system"
+msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
 
-#: ../../mod/photos.php:1054
-msgid "View photo"
-msgstr "Fotos ansehen"
+#: ../../mod/dfrn_confirm.php:714
+#, php-format
+msgid "Connection accepted at %s"
+msgstr "Auf %s wurde die Verbindung akzeptiert"
 
-#: ../../mod/photos.php:1054
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: ../../addon/facebook/facebook.php:337
+msgid "Facebook disabled"
+msgstr "Facebook deaktiviert"
 
-#: ../../mod/photos.php:1055
-msgid "Use as profile photo"
-msgstr "Als Profilbild verwenden"
+#: ../../addon/facebook/facebook.php:342
+msgid "Updating contacts"
+msgstr "Aktualisiere Kontakte"
 
-#: ../../mod/photos.php:1061 ../../include/conversation.php:423
-msgid "Private Message"
-msgstr "Private Nachricht"
+#: ../../addon/facebook/facebook.php:351
+msgid "Facebook API key is missing."
+msgstr "Facebook-API-Schlüssel nicht gefunden"
 
-#: ../../mod/photos.php:1072
-msgid "View Full Size"
-msgstr "Betrachte Originalgröße"
+#: ../../addon/facebook/facebook.php:358
+msgid "Facebook Connect"
+msgstr "Mit Facebook verbinden"
 
-#: ../../mod/photos.php:1140
-msgid "Tags: "
-msgstr "Tags: "
+#: ../../addon/facebook/facebook.php:364
+msgid "Install Facebook connector for this account."
+msgstr "Facebook-Connector für diesen Account installieren."
 
-#: ../../mod/photos.php:1143
-msgid "[Remove any tag]"
-msgstr "[Tag entfernen]"
+#: ../../addon/facebook/facebook.php:371
+msgid "Remove Facebook connector"
+msgstr "Facebook-Connector entfernen"
 
-#: ../../mod/photos.php:1154
-msgid "New album name"
-msgstr "Name des neuen Albums"
+#: ../../addon/facebook/facebook.php:376
+msgid ""
+"Re-authenticate [This is necessary whenever your Facebook password is "
+"changed.]"
+msgstr "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]"
 
-#: ../../mod/photos.php:1157
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: ../../addon/facebook/facebook.php:383
+msgid "Post to Facebook by default"
+msgstr "Veröffentliche standardmäßig bei Facebook"
 
-#: ../../mod/photos.php:1159
-msgid "Add a Tag"
-msgstr "Tag hinzufügen"
+#: ../../addon/facebook/facebook.php:387
+msgid "Link all your Facebook friends and conversations on this website"
+msgstr "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren"
 
-#: ../../mod/photos.php:1163
+#: ../../addon/facebook/facebook.php:389
 msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr ""
-"Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-
-#: ../../mod/photos.php:1183 ../../include/conversation.php:470
-msgid "I like this (toggle)"
-msgstr "Ich mag das (toggle)"
+"Facebook conversations consist of your <em>profile wall</em> and your friend"
+" <em>stream</em>."
+msgstr "Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>"
 
-#: ../../mod/photos.php:1184 ../../include/conversation.php:471
-msgid "I don't like this (toggle)"
-msgstr "Ich mag das nicht (toggle)"
+#: ../../addon/facebook/facebook.php:390
+msgid "On this website, your Facebook friend stream is only visible to you."
+msgstr "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen."
 
-#: ../../mod/photos.php:1185 ../../include/conversation.php:862
-msgid "Share"
-msgstr "Teilen"
+#: ../../addon/facebook/facebook.php:391
+msgid ""
+"The following settings determine the privacy of your Facebook profile wall "
+"on this website."
+msgstr "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen."
 
-#: ../../mod/photos.php:1202 ../../mod/photos.php:1242
-#: ../../mod/photos.php:1273 ../../include/conversation.php:485
-msgid "This is you"
-msgstr "Das bist du"
+#: ../../addon/facebook/facebook.php:395
+msgid ""
+"On this website your Facebook profile wall conversations will only be "
+"visible to you"
+msgstr "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen"
 
-#: ../../mod/photos.php:1204 ../../mod/photos.php:1244
-#: ../../mod/photos.php:1275 ../../include/conversation.php:487
-#: ../../boot.php:438
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../addon/facebook/facebook.php:400
+msgid "Do not import your Facebook profile wall conversations"
+msgstr "Facebook-Pinnwand nicht importieren"
 
-#: ../../mod/photos.php:1206 ../../include/conversation.php:489
-#: ../../include/conversation.php:897
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../addon/facebook/facebook.php:402
+msgid ""
+"If you choose to link conversations and leave both of these boxes unchecked,"
+" your Facebook profile wall will be merged with your profile wall on this "
+"website and your privacy settings on this website will be used to determine "
+"who may see the conversations."
+msgstr "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann."
 
-#: ../../mod/photos.php:1385
-msgid "View Album"
-msgstr "Album betrachten"
+#: ../../addon/facebook/facebook.php:407
+msgid "Comma separated applications to ignore"
+msgstr "Komma separierte Liste von Anwendungen die ignoriert werden sollen"
 
-#: ../../mod/photos.php:1394
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../addon/facebook/facebook.php:475
+#: ../../include/contact_selectors.php:81
+msgid "Facebook"
+msgstr "Facebook"
 
-#: ../../mod/photos.php:1396
-msgid "Upload New Photos"
-msgstr "Weitere Fotos hochladen"
+#: ../../addon/facebook/facebook.php:476
+msgid "Facebook Connector Settings"
+msgstr "Facebook-Verbindungseinstellungen"
 
-#: ../../mod/network.php:43
-msgid "Search Results For:"
-msgstr "Suchergebnisse für:"
+#: ../../addon/facebook/facebook.php:490
+msgid "Post to Facebook"
+msgstr "Bei Facebook veröffentlichen"
 
-#: ../../mod/network.php:85 ../../include/group.php:216
-msgid "add"
-msgstr "hinzufügen"
+#: ../../addon/facebook/facebook.php:581
+msgid ""
+"Post to Facebook cancelled because of multi-network access permission "
+"conflict."
+msgstr "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen."
 
-#: ../../mod/network.php:158
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: ../../addon/facebook/facebook.php:650
+msgid "Image: "
+msgstr "Bild: "
 
-#: ../../mod/network.php:163
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: ../../addon/facebook/facebook.php:727
+msgid "View on Friendica"
+msgstr "In Friendica betrachten"
 
-#: ../../mod/network.php:174
-msgid "New"
-msgstr "Neue"
+#: ../../addon/facebook/facebook.php:751
+msgid "Facebook post failed. Queued for retry."
+msgstr "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
 
-#: ../../mod/network.php:179
-msgid "Starred"
-msgstr "Markierte"
+#: ../../addon/facebook/facebook.php:876 ../../addon/facebook/facebook.php:885
+#: ../../include/bb2diaspora.php:113
+msgid "link"
+msgstr "Verweis"
 
-#: ../../mod/network.php:184
-msgid "Bookmarks"
-msgstr "Lesezeichen"
+#: ../../addon/widgets/widget_like.php:58
+#, php-format
+msgid "%d person likes this"
+msgid_plural "%d people like this"
+msgstr[0] "%d Person mag das"
+msgstr[1] "%d Leuten mögen das"
 
-#: ../../mod/network.php:232
+#: ../../addon/widgets/widget_like.php:61
 #, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] ""
-"Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk."
-msgstr[1] ""
-"Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
+msgid "%d person doesn't like this"
+msgid_plural "%d people don't like this"
+msgstr[0] " %d Person mag das nicht"
+msgstr[1] "%d Leute mögen das nicht"
 
-#: ../../mod/network.php:235
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr ""
-"Private Nachrichten an diese Gruppe könnten an die Ã–ffentlichkeit geraten."
+#: ../../addon/widgets/widgets.php:55
+msgid "Generate new key"
+msgstr "Neuen Schlüssel erstellen"
 
-#: ../../mod/network.php:286
-msgid "No such group"
-msgstr "Es gibt keine solche Gruppe"
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets key"
+msgstr "Widgets Schlüssel"
 
-#: ../../mod/network.php:297
-msgid "Group is empty"
-msgstr "Gruppe ist leer"
+#: ../../addon/widgets/widgets.php:60
+msgid "Widgets available"
+msgstr "Verfügbare Widgets"
 
-#: ../../mod/network.php:301
-msgid "Group: "
-msgstr "Gruppe: "
+#: ../../addon/widgets/widget_friends.php:40
+msgid "Connect on Friendica!"
+msgstr "In Friendica verbinden!"
+
+#: ../../addon/yourls/yourls.php:55
+msgid "YourLS Settings"
+msgstr "YourLS Einstellungen"
 
-#: ../../mod/network.php:311
-msgid "Contact: "
-msgstr "Kontakt: "
+#: ../../addon/yourls/yourls.php:57
+msgid "URL: http://"
+msgstr "URL: http://"
 
-#: ../../mod/network.php:313
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr ""
-"Private Nachrichten an diese Person könnten an die Ã–ffentlichkeit gelangen."
+#: ../../addon/yourls/yourls.php:62
+msgid "Username:"
+msgstr "Nutzername:"
 
-#: ../../mod/network.php:318
-msgid "Invalid contact."
-msgstr "Ungültiger Kontakt."
+#: ../../addon/yourls/yourls.php:67
+msgid "Password:"
+msgstr "Passwort:"
 
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Verbindung der Applikation authorisieren"
+#: ../../addon/yourls/yourls.php:72
+msgid "Use SSL "
+msgstr "SSL Verwenden "
 
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr ""
-"Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode "
-"ein:"
+#: ../../addon/yourls/yourls.php:92
+msgid "yourls Settings saved."
+msgstr "yourls Einstellungen gespeichert"
 
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "Bitte melde dich an um fortzufahren."
+#: ../../addon/nsfw/nsfw.php:47
+msgid "\"Not Safe For Work\" Settings"
+msgstr "\"Not Safe For Work\"-Einstellungen"
 
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr ""
-"Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte "
-"sowie die Erstellung neuer Beiträge in deinem Namen gestatten?"
+#: ../../addon/nsfw/nsfw.php:50
+msgid "Enable NSFW filter"
+msgstr "NSFW Filter aktivieren"
 
-#: ../../mod/friendica.php:43
-msgid "This is Friendica, version"
-msgstr "Dies ist Friendica version"
+#: ../../addon/nsfw/nsfw.php:53
+msgid "Comma separated words to treat as NSFW"
+msgstr "Wörter, die gefiltert werden sollen (durch Kommas getrennt)"
 
-#: ../../mod/friendica.php:44
-msgid "running at web location"
-msgstr "die unter folgender Webadresse zu finden ist"
+#: ../../addon/nsfw/nsfw.php:58
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Verwende /expression/ um Reguläre Ausdrücke zu verwenden"
 
-#: ../../mod/friendica.php:46
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr ""
-"Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr "
-"über das Friendica Projekt zu erfahren."
+#: ../../addon/nsfw/nsfw.php:74
+msgid "NSFW Settings saved."
+msgstr "NSFW-Einstellungen gespeichert"
 
-#: ../../mod/friendica.php:48
-msgid "Bug reports and issues: please visit"
-msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+#: ../../addon/nsfw/nsfw.php:120
+#, php-format
+msgid "%s - Click to open/close"
+msgstr "%s â€“ Zum Ã–ffnen/Schließen klicken"
 
-#: ../../mod/friendica.php:49
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com"
+#: ../../addon/communityhome/communityhome.php:28
+#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
+#: ../../boot.php:706
+msgid "Login"
+msgstr "Anmeldung"
 
-#: ../../mod/friendica.php:54
-msgid "Installed plugins/addons/apps"
-msgstr "Installierte Plugins/Erweiterungen/Apps"
+#: ../../addon/communityhome/communityhome.php:29
+msgid "OpenID"
+msgstr "OpenID"
 
-#: ../../mod/friendica.php:62
-msgid "No installed plugins/addons/apps"
-msgstr "Keine Plugins/Erweiterungen/Apps installiert"
+#: ../../addon/communityhome/communityhome.php:38
+msgid "Last users"
+msgstr "Letzte Nutzer"
 
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Beitrag nicht verfügbar."
+#: ../../addon/communityhome/communityhome.php:81
+msgid "Most active users"
+msgstr "Aktivste Nutzer"
 
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Beitrag konnte nicht gefunden werden."
+#: ../../addon/communityhome/communityhome.php:98
+msgid "Last photos"
+msgstr "Letzte Fotos"
 
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:574
-msgid "View Contacts"
-msgstr "Kontakte anzeigen"
+#: ../../addon/communityhome/communityhome.php:133
+msgid "Last likes"
+msgstr "Zuletzt gemocht"
 
-#: ../../mod/viewcontacts.php:40
-msgid "No contacts."
-msgstr "Keine Kontakte."
+#: ../../addon/communityhome/communityhome.php:155
+#: ../../include/conversation.php:23 ../../include/conversation.php:96
+msgid "event"
+msgstr "Veranstaltung"
 
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Tag entfernt"
+#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#, php-format
+msgid ""
+"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
+" storage (like ownCloud). See <a "
+"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
+" WebFinger</a>"
+msgstr "Ermöglicht es deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
 
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Gegenstands-Tag entfernen"
+#: ../../addon/uhremotestorage/uhremotestorage.php:85
+msgid "Template URL (with {category})"
+msgstr "Vorlagen URL (mit {Kategorie})"
 
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Wähle ein Tag zum Entfernen aus: "
+#: ../../addon/uhremotestorage/uhremotestorage.php:86
+msgid "OAuth end-point"
+msgstr "OAuth end-point"
 
-#: ../../mod/tagrm.php:93
-msgid "Remove"
-msgstr "Entfernen"
+#: ../../addon/uhremotestorage/uhremotestorage.php:87
+msgid "Api"
+msgstr "Api"
 
-#: ../../mod/group.php:27
-msgid "Group created."
-msgstr "Gruppe erstellt."
+#: ../../addon/membersince/membersince.php:18
+msgid "Member since:"
+msgstr "Mitglied seit:"
 
-#: ../../mod/group.php:33
-msgid "Could not create group."
-msgstr "Konnte die Gruppe nicht erstellen."
+#: ../../addon/tictac/tictac.php:20
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Dreidimensionales Tic-Tac-Toe"
 
-#: ../../mod/group.php:43 ../../mod/group.php:123
-msgid "Group not found."
-msgstr "Gruppe nicht gefunden."
+#: ../../addon/tictac/tictac.php:53
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
 
-#: ../../mod/group.php:56
-msgid "Group name changed."
-msgstr "Gruppenname geändert."
+#: ../../addon/tictac/tictac.php:58
+msgid "New game"
+msgstr "Neues Spiel"
 
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
-msgid "Permission denied"
-msgstr "Zugriff verweigert"
+#: ../../addon/tictac/tictac.php:59
+msgid "New game with handicap"
+msgstr "Neues Handicap Spiel"
 
-#: ../../mod/group.php:82
-msgid "Create a group of contacts/friends."
-msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
+#: ../../addon/tictac/tictac.php:60
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt."
 
-#: ../../mod/group.php:83 ../../mod/group.php:166
-msgid "Group Name: "
-msgstr "Gruppenname:"
+#: ../../addon/tictac/tictac.php:61
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
+msgstr "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei Ã¼bereinander oder diagonal auf verschiedenen Ebenen."
 
-#: ../../mod/group.php:98
-msgid "Group removed."
-msgstr "Gruppe entfernt."
+#: ../../addon/tictac/tictac.php:63
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt."
 
-#: ../../mod/group.php:100
-msgid "Unable to remove group."
-msgstr "Konnte die Gruppe nicht entfernen."
+#: ../../addon/tictac/tictac.php:182
+msgid "You go first..."
+msgstr "Du fängst an..."
 
-#: ../../mod/group.php:164 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
+#: ../../addon/tictac/tictac.php:187
+msgid "I'm going first this time..."
+msgstr "Diesmal fange ich an..."
 
-#: ../../mod/group.php:165
-msgid "Group Editor"
-msgstr "Gruppeneditor"
+#: ../../addon/tictac/tictac.php:193
+msgid "You won!"
+msgstr "Du gewinnst!"
 
-#: ../../mod/group.php:179
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
+msgid "\"Cat\" game!"
+msgstr "Unentschieden!"
 
-#: ../../mod/group.php:194
-msgid "All Contacts"
-msgstr "Alle Kontakte"
+#: ../../addon/tictac/tictac.php:222
+msgid "I won!"
+msgstr "Ich gewinne!"
 
-#: ../../mod/events.php:61
-msgid "Event description and start time are required."
-msgstr "Ereignis Beschreibung und Startzeit sind erforderlich."
+#: ../../addon/randplace/randplace.php:171
+msgid "Randplace Settings"
+msgstr "Randplace-Einstellungen"
 
-#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1330
-msgid "Events"
-msgstr "Veranstaltungen"
+#: ../../addon/randplace/randplace.php:173
+msgid "Enable Randplace Plugin"
+msgstr "Randplace-Plugin aktivieren"
 
-#: ../../mod/events.php:207
-msgid "Create New Event"
-msgstr "Neue Veranstaltung erstellen"
+#: ../../addon/drpost/drpost.php:35
+msgid "Post to Drupal"
+msgstr "Bei Drupal veröffentlichen"
 
-#: ../../mod/events.php:210
-msgid "Previous"
-msgstr "Vorherige"
+#: ../../addon/drpost/drpost.php:72
+msgid "Drupal Post Settings"
+msgstr "Drupal-Beitragseinstellungen"
 
-#: ../../mod/events.php:220
-msgid "l, F j"
-msgstr "l, F j"
+#: ../../addon/drpost/drpost.php:74
+msgid "Enable Drupal Post Plugin"
+msgstr "Veröffentlichung bei Drupal erlauben"
 
-#: ../../mod/events.php:235
-msgid "Edit event"
-msgstr "Veranstaltung bearbeiten"
+#: ../../addon/drpost/drpost.php:79
+msgid "Drupal username"
+msgstr "Drupal Nutzername"
 
-#: ../../mod/events.php:237 ../../include/text.php:867
-msgid "link to source"
-msgstr "Link zum Originalbeitrag"
+#: ../../addon/drpost/drpost.php:84
+msgid "Drupal password"
+msgstr "Drupal Passwort"
 
-#: ../../mod/events.php:305
-msgid "hour:minute"
-msgstr "Stunde:Minute"
+#: ../../addon/drpost/drpost.php:89
+msgid "Post Type - article,page,or blog"
+msgstr "Beitragstyp - Artikel, Seite oder Blog"
 
-#: ../../mod/events.php:314
-msgid "Event details"
-msgstr "Veranstaltungsdetails"
+#: ../../addon/drpost/drpost.php:94
+msgid "Drupal site URL"
+msgstr "URL der Drupal Seite"
 
-#: ../../mod/events.php:315
-#, php-format
-msgid "Format is %s %s. Starting date and Description are required."
-msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+#: ../../addon/drpost/drpost.php:99
+msgid "Drupal site uses clean URLS"
+msgstr "Drupal Seite verwendet bereinigte URLs"
 
-#: ../../mod/events.php:316
-msgid "Event Starts:"
-msgstr "Veranstaltungsbeginn:"
+#: ../../addon/drpost/drpost.php:104
+msgid "Post to Drupal by default"
+msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Drupal"
 
-#: ../../mod/events.php:319
-msgid "Finish date/time is not known or not relevant"
-msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:172
+#: ../../addon/posterous/posterous.php:173
+msgid "Post from Friendica"
+msgstr "Beitrag via Friendica"
 
-#: ../../mod/events.php:321
-msgid "Event Finishes:"
-msgstr "Veranstaltungsende:"
+#: ../../addon/geonames/geonames.php:143
+msgid "Geonames settings updated."
+msgstr "Geonames Einstellungen aktualisiert"
 
-#: ../../mod/events.php:324
-msgid "Adjust for viewer timezone"
-msgstr "An Zeitzone des Betrachters anpassen"
+#: ../../addon/geonames/geonames.php:179
+msgid "Geonames Settings"
+msgstr "Geonames Einstellungen"
 
-#: ../../mod/events.php:326
-msgid "Description:"
-msgstr "Beschreibung"
+#: ../../addon/geonames/geonames.php:181
+msgid "Enable Geonames Plugin"
+msgstr "Geonames Plugin aktivieren"
 
-#: ../../mod/events.php:328 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:259 ../../boot.php:961
-msgid "Location:"
-msgstr "Ort:"
+#: ../../addon/js_upload/js_upload.php:43
+msgid "Upload a file"
+msgstr "Datei hochladen"
 
-#: ../../mod/events.php:330
-msgid "Share this event"
-msgstr "Veranstaltung teilen"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Drop files here to upload"
+msgstr "Ziehe die Dateien hierher die du hochladen willst"
 
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Bezeichner"
+#: ../../addon/js_upload/js_upload.php:46
+msgid "Failed"
+msgstr "Fehlgeschlagen"
 
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Editor für die Profil-Sichtbarkeit"
+#: ../../addon/js_upload/js_upload.php:294
+msgid "No files were uploaded."
+msgstr "Keine Dateien hochgeladen."
 
-#: ../../mod/profperm.php:103 ../../include/nav.php:48
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74
-#: ../../boot.php:1317
-msgid "Profile"
-msgstr "Profil"
+#: ../../addon/js_upload/js_upload.php:300
+msgid "Uploaded file is empty"
+msgstr "Hochgeladene Datei ist leer"
 
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Sichtbar für"
+#: ../../addon/js_upload/js_upload.php:323
+msgid "File has an invalid extension, it should be one of "
+msgstr "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein "
 
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
+#: ../../addon/js_upload/js_upload.php:334
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
 
-#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
-#, php-format
-msgid "%s welcomes %s"
-msgstr "%s heißt %s herzlich willkommen"
+#: ../../addon/oembed.old/oembed.php:30
+msgid "OEmbed settings updated"
+msgstr "OEmbed Einstellungen aktualisiert."
 
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
+#: ../../addon/oembed.old/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
+msgstr "OEmbed für Youtube Videos verwenden"
 
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Sichtbar für:"
+#: ../../addon/oembed.old/oembed.php:71
+msgid "URL to embed:"
+msgstr "URL zum Einbetten:"
 
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Willkommen zu %s"
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
+msgstr "Impressum"
 
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Verschiedenes"
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
+msgstr "Betreiber der Seite"
 
-#: ../../include/datetime.php:121 ../../include/datetime.php:253
-msgid "year"
-msgstr "Jahr"
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
+msgstr "Email Adresse"
 
-#: ../../include/datetime.php:126 ../../include/datetime.php:254
-msgid "month"
-msgstr "Monat"
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
+msgstr "Postalische Anschrift"
 
-#: ../../include/datetime.php:131 ../../include/datetime.php:256
-msgid "day"
-msgstr "Tag"
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
+msgstr "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
 
-#: ../../include/datetime.php:244
-msgid "never"
-msgstr "nie"
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
+msgstr "Profil des Seitenbetreibers"
 
-#: ../../include/datetime.php:250
-msgid "less than a second ago"
-msgstr "vor weniger als einer Sekunde"
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
+msgstr "Hinweise"
 
-#: ../../include/datetime.php:253
-msgid "years"
-msgstr "Jahre"
+#: ../../addon/buglink/buglink.php:15
+msgid "Report Bug"
+msgstr "Fehlerreport erstellen"
 
-#: ../../include/datetime.php:254
-msgid "months"
-msgstr "Monate"
+#: ../../addon/blockem/blockem.php:51
+msgid "\"Blockem\" Settings"
+msgstr "\"Blockem\"-Einstellungen"
 
-#: ../../include/datetime.php:255
-msgid "week"
-msgstr "Woche"
+#: ../../addon/blockem/blockem.php:53
+msgid "Comma separated profile URLS to block"
+msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
 
-#: ../../include/datetime.php:255
-msgid "weeks"
-msgstr "Wochen"
+#: ../../addon/blockem/blockem.php:70
+msgid "BLOCKEM Settings saved."
+msgstr "BLOCKEM-Einstellungen gesichert."
 
-#: ../../include/datetime.php:256
-msgid "days"
-msgstr "Tage"
+#: ../../addon/blockem/blockem.php:105
+#, php-format
+msgid "Blocked %s - Click to open/close"
+msgstr "%s blockiert - Zum Ã–ffnen/Schließen klicken"
 
-#: ../../include/datetime.php:257
-msgid "hour"
-msgstr "Stunde"
+#: ../../addon/blockem/blockem.php:160
+msgid "Unblock Author"
+msgstr "Autor freischalten"
 
-#: ../../include/datetime.php:257
-msgid "hours"
-msgstr "Stunden"
+#: ../../addon/blockem/blockem.php:162
+msgid "Block Author"
+msgstr "Autor blockieren"
 
-#: ../../include/datetime.php:258
-msgid "minute"
-msgstr "Minute"
+#: ../../addon/blockem/blockem.php:194
+msgid "blockem settings updated"
+msgstr "blockem Einstellungen aktualisiert"
 
-#: ../../include/datetime.php:258
-msgid "minutes"
-msgstr "Minuten"
+#: ../../addon/editplain/editplain.php:46
+msgid "Editplain settings updated."
+msgstr "Editplain Einstellungen aktualisiert"
 
-#: ../../include/datetime.php:259
-msgid "second"
-msgstr "Sekunde"
+#: ../../addon/editplain/editplain.php:76
+msgid "Editplain Settings"
+msgstr "Editplain Einstellungen"
 
-#: ../../include/datetime.php:259
-msgid "seconds"
-msgstr "Sekunden"
+#: ../../addon/editplain/editplain.php:78
+msgid "Disable richtext status editor"
+msgstr "RichText Editor deaktivieren"
 
-#: ../../include/datetime.php:266
-msgid " ago"
-msgstr " her"
+#: ../../addon/pageheader/pageheader.php:47
+msgid "\"pageheader\" Settings"
+msgstr "\"pageheader\"-Einstellungen"
 
-#: ../../include/datetime.php:437 ../../include/profile_advanced.php:30
-#: ../../include/items.php:1285
-msgid "Birthday:"
-msgstr "Geburtstag:"
+#: ../../addon/pageheader/pageheader.php:65
+msgid "pageheader Settings saved."
+msgstr "pageheader-Einstellungen gespeichert."
 
-#: ../../include/dba.php:39
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr ""
-"Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
+#: ../../addon/viewsrc/viewsrc.php:25
+msgid "View Source"
+msgstr "Quelle ansehen"
 
-#: ../../include/text.php:232
-msgid "prev"
-msgstr "vorige"
+#: ../../addon/statusnet/statusnet.php:140
+msgid "Post to StatusNet"
+msgstr "Bei StatusNet veröffentlichen"
 
-#: ../../include/text.php:234
-msgid "first"
-msgstr "erste"
+#: ../../addon/statusnet/statusnet.php:182
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig."
 
-#: ../../include/text.php:263
-msgid "last"
-msgstr "letzte"
+#: ../../addon/statusnet/statusnet.php:210
+msgid "We could not contact the StatusNet API with the Path you entered."
+msgstr "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."
 
-#: ../../include/text.php:266
-msgid "next"
-msgstr "nächste"
+#: ../../addon/statusnet/statusnet.php:236
+msgid "StatusNet settings updated."
+msgstr "StatusNet Einstellungen aktualisiert."
 
-#: ../../include/text.php:553
-msgid "No contacts"
-msgstr "Keine Kontakte"
+#: ../../addon/statusnet/statusnet.php:259
+msgid "StatusNet Posting Settings"
+msgstr "StatusNet-Beitragseinstellungen"
 
-#: ../../include/text.php:562
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d Kontakt"
-msgstr[1] "%d Kontakte"
+#: ../../addon/statusnet/statusnet.php:273
+msgid "Globally Available StatusNet OAuthKeys"
+msgstr "Verfügbare OAuth Schlüssel für StatusNet"
 
-#: ../../include/text.php:633 ../../include/nav.php:87
-msgid "Search"
-msgstr "Suche"
+#: ../../addon/statusnet/statusnet.php:274
+msgid ""
+"There are preconfigured OAuth key pairs for some StatusNet servers "
+"available. If you are useing one of them, please use these credentials. If "
+"not feel free to connect to any other StatusNet instance (see below)."
+msgstr "Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen."
 
-#: ../../include/text.php:719
-msgid "Monday"
-msgstr "Montag"
+#: ../../addon/statusnet/statusnet.php:282
+msgid "Provide your own OAuth Credentials"
+msgstr "Eigene OAuth Schlüssel eintragen"
 
-#: ../../include/text.php:719
-msgid "Tuesday"
-msgstr "Dienstag"
+#: ../../addon/statusnet/statusnet.php:283
+msgid ""
+"No consumer key pair for StatusNet found. Register your Friendica Account as"
+" an desktop client on your StatusNet account, copy the consumer key pair "
+"here and enter the API base root.<br />Before you register your own OAuth "
+"key pair ask the administrator if there is already a key pair for this "
+"Friendica installation at your favorited StatusNet installation."
+msgstr "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert."
 
-#: ../../include/text.php:719
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: ../../addon/statusnet/statusnet.php:285
+msgid "OAuth Consumer Key"
+msgstr "OAuth Consumer Key"
 
-#: ../../include/text.php:719
-msgid "Thursday"
-msgstr "Donnerstag"
+#: ../../addon/statusnet/statusnet.php:288
+msgid "OAuth Consumer Secret"
+msgstr "OAuth Consumer Secret"
 
-#: ../../include/text.php:719
-msgid "Friday"
-msgstr "Freitag"
+#: ../../addon/statusnet/statusnet.php:291
+msgid "Base API Path (remember the trailing /)"
+msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
 
-#: ../../include/text.php:719
-msgid "Saturday"
-msgstr "Samstag"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"To connect to your StatusNet account click the button below to get a "
+"security code from StatusNet which you have to copy into the input box below"
+" and submit the form. Only your <strong>public</strong> posts will be posted"
+" to StatusNet."
+msgstr "Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet."
 
-#: ../../include/text.php:719
-msgid "Sunday"
-msgstr "Sonntag"
+#: ../../addon/statusnet/statusnet.php:313
+msgid "Log in with StatusNet"
+msgstr "Bei StatusNet anmelden"
 
-#: ../../include/text.php:723
-msgid "January"
-msgstr "Januar"
+#: ../../addon/statusnet/statusnet.php:315
+msgid "Copy the security code from StatusNet here"
+msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
 
-#: ../../include/text.php:723
-msgid "February"
-msgstr "Februar"
+#: ../../addon/statusnet/statusnet.php:321
+msgid "Cancel Connection Process"
+msgstr "Verbindungsprozess abbrechen"
 
-#: ../../include/text.php:723
-msgid "March"
-msgstr "März"
+#: ../../addon/statusnet/statusnet.php:323
+msgid "Current StatusNet API is"
+msgstr "Derzeitige StatusNet-API-URL lautet"
 
-#: ../../include/text.php:723
-msgid "April"
-msgstr "April"
+#: ../../addon/statusnet/statusnet.php:324
+msgid "Cancel StatusNet Connection"
+msgstr "Verbindung zum StatusNet Server abbrechen"
 
-#: ../../include/text.php:723
-msgid "May"
-msgstr "Mai"
+#: ../../addon/statusnet/statusnet.php:335 ../../addon/twitter/twitter.php:189
+msgid "Currently connected to: "
+msgstr "Momentan verbunden mit: "
 
-#: ../../include/text.php:723
-msgid "June"
-msgstr "Juni"
+#: ../../addon/statusnet/statusnet.php:336
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
+msgstr "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
 
-#: ../../include/text.php:723
-msgid "July"
-msgstr "Juli"
+#: ../../addon/statusnet/statusnet.php:338
+msgid "Allow posting to StatusNet"
+msgstr "Veröffentlichung bei StatusNet erlauben"
 
-#: ../../include/text.php:723
-msgid "August"
-msgstr "August"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Send public postings to StatusNet by default"
+msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei StatusNet"
 
-#: ../../include/text.php:723
-msgid "September"
-msgstr "September"
+#: ../../addon/statusnet/statusnet.php:346 ../../addon/twitter/twitter.php:200
+msgid "Clear OAuth configuration"
+msgstr "OAuth-Konfiguration löschen"
 
-#: ../../include/text.php:723
-msgid "October"
-msgstr "Oktober"
+#: ../../addon/statusnet/statusnet.php:487
+msgid "API URL"
+msgstr "API-URL"
 
-#: ../../include/text.php:723
-msgid "November"
-msgstr "November"
+#: ../../addon/tumblr/tumblr.php:36
+msgid "Post to Tumblr"
+msgstr "Bei Tumblr veröffentlichen"
 
-#: ../../include/text.php:723
-msgid "December"
-msgstr "Dezember"
+#: ../../addon/tumblr/tumblr.php:67
+msgid "Tumblr Post Settings"
+msgstr "Tumblr-Beitragseinstellungen"
 
-#: ../../include/text.php:793
-msgid "bytes"
-msgstr "Byte"
+#: ../../addon/tumblr/tumblr.php:69
+msgid "Enable Tumblr Post Plugin"
+msgstr "Tumblr-Plugin aktivieren"
 
-#: ../../include/text.php:885
-msgid "Select an alternate language"
-msgstr "Alternative Sprache auswählen"
+#: ../../addon/tumblr/tumblr.php:74
+msgid "Tumblr login"
+msgstr "Tumblr Login"
 
-#: ../../include/text.php:897
-msgid "default"
-msgstr "standard"
+#: ../../addon/tumblr/tumblr.php:79
+msgid "Tumblr password"
+msgstr "Tumblr Passwort"
 
-#: ../../include/poller.php:459
-msgid "From: "
-msgstr "Von: "
+#: ../../addon/tumblr/tumblr.php:84
+msgid "Post to Tumblr by default"
+msgstr "Standardmäßig bei Tumblr veröffentlichen"
 
-#: ../../include/nav.php:44 ../../boot.php:700
-msgid "Logout"
-msgstr "Abmelden"
+#: ../../addon/numfriends/numfriends.php:46
+msgid "Numfriends settings updated."
+msgstr "Numfriends Einstellungen aktualisiert"
 
-#: ../../include/nav.php:44
-msgid "End this session"
-msgstr "Diese Sitzung beenden"
+#: ../../addon/numfriends/numfriends.php:77
+msgid "Numfriends Settings"
+msgstr "Numfriends Einstellungen"
 
-#: ../../include/nav.php:47 ../../boot.php:1312
-msgid "Status"
-msgstr "Status"
+#: ../../addon/numfriends/numfriends.php:79
+msgid "How many contacts to display on profile sidebar"
+msgstr "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden"
 
-#: ../../include/nav.php:47 ../../include/nav.php:111
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
+#: ../../addon/wppost/wppost.php:42
+msgid "Post to Wordpress"
+msgstr "Bei WordPress veröffentlichen"
 
-#: ../../include/nav.php:48
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: ../../addon/wppost/wppost.php:74
+msgid "WordPress Post Settings"
+msgstr "WordPress-Beitragseinstellungen"
 
-#: ../../include/nav.php:49 ../../boot.php:1322
-msgid "Photos"
-msgstr "Bilder"
+#: ../../addon/wppost/wppost.php:76
+msgid "Enable WordPress Post Plugin"
+msgstr "WordPress-Plugin aktivieren."
 
-#: ../../include/nav.php:49
-msgid "Your photos"
-msgstr "Deine Fotos"
+#: ../../addon/wppost/wppost.php:81
+msgid "WordPress username"
+msgstr "WordPress-Benutzername"
 
-#: ../../include/nav.php:50
-msgid "Your events"
-msgstr "Deine Ereignisse"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress password"
+msgstr "WordPress-Passwort"
 
-#: ../../include/nav.php:51
-msgid "Personal notes"
-msgstr "Persönliche Notizen"
+#: ../../addon/wppost/wppost.php:91
+msgid "WordPress API URL"
+msgstr "WordPress-API-URL"
 
-#: ../../include/nav.php:51
-msgid "Your personal photos"
-msgstr "Deine privaten Fotos"
+#: ../../addon/wppost/wppost.php:96
+msgid "Post to WordPress by default"
+msgstr "Standardmäßig auf WordPress veröffentlichen"
 
-#: ../../include/nav.php:62 ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34 ../../boot.php:701
-msgid "Login"
-msgstr "Anmeldung"
+#: ../../addon/piwik/piwik.php:70
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe."
 
-#: ../../include/nav.php:62
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../addon/piwik/piwik.php:73
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can"
+" set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out)."
 
-#: ../../include/nav.php:73
-msgid "Home Page"
-msgstr "Homepage"
+#: ../../addon/piwik/piwik.php:82
+msgid "Piwik Base URL"
+msgstr "Piwik Basis URL"
 
-#: ../../include/nav.php:77
-msgid "Create an account"
-msgstr "Account erstellen"
+#: ../../addon/piwik/piwik.php:83
+msgid "Site ID"
+msgstr "Seiten ID"
 
-#: ../../include/nav.php:82
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../addon/piwik/piwik.php:84
+msgid "Show opt-out cookie link?"
+msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
 
-#: ../../include/nav.php:85
-msgid "Apps"
-msgstr "Apps"
+#: ../../addon/twitter/twitter.php:78
+msgid "Post to Twitter"
+msgstr "Bei Twitter veröffentlichen"
 
-#: ../../include/nav.php:85
-msgid "Addon applications, utilities, games"
-msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
+#: ../../addon/twitter/twitter.php:124
+msgid "Twitter settings updated."
+msgstr "Twitter Einstellungen aktualisiert."
 
-#: ../../include/nav.php:87
-msgid "Search site content"
-msgstr "Inhalt der Seite durchsuchen"
+#: ../../addon/twitter/twitter.php:146
+msgid "Twitter Posting Settings"
+msgstr "Twitter-Beitragseinstellungen"
 
-#: ../../include/nav.php:97
-msgid "Conversations on this site"
-msgstr "Unterhaltungen auf dieser Seite"
+#: ../../addon/twitter/twitter.php:153
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite."
 
-#: ../../include/nav.php:99
-msgid "Directory"
-msgstr "Verzeichnis"
+#: ../../addon/twitter/twitter.php:172
+msgid ""
+"At this Friendica instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input"
+" box below and submit the form. Only your <strong>public</strong> posts will"
+" be posted to Twitter."
+msgstr "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
 
-#: ../../include/nav.php:99
-msgid "People directory"
-msgstr "Nutzerverzeichnis"
+#: ../../addon/twitter/twitter.php:173
+msgid "Log in with Twitter"
+msgstr "bei Twitter anmelden"
 
-#: ../../include/nav.php:109
-msgid "Conversations from your friends"
-msgstr "Unterhaltungen deiner Kontakte"
+#: ../../addon/twitter/twitter.php:175
+msgid "Copy the PIN from Twitter here"
+msgstr "Kopiere die Twitter-PIN hier her"
 
-#: ../../include/nav.php:117
-msgid "Friend Requests"
-msgstr "Kontaktanfragen"
+#: ../../addon/twitter/twitter.php:190
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for"
+" every posting separately in the posting options when writing the entry."
+msgstr "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
 
-#: ../../include/nav.php:122
-msgid "Private mail"
-msgstr "Private Email"
+#: ../../addon/twitter/twitter.php:192
+msgid "Allow posting to Twitter"
+msgstr "Veröffentlichung bei Twitter erlauben"
 
-#: ../../include/nav.php:125
-msgid "Manage"
-msgstr "Verwalten"
+#: ../../addon/twitter/twitter.php:195
+msgid "Send public postings to Twitter by default"
+msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Twitter"
 
-#: ../../include/nav.php:125
-msgid "Manage other pages"
-msgstr "Andere Seiten verwalten"
+#: ../../addon/twitter/twitter.php:317
+msgid "Consumer key"
+msgstr "Consumer Key"
 
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Profiles"
-msgstr "Profile"
+#: ../../addon/twitter/twitter.php:318
+msgid "Consumer secret"
+msgstr "Consumer Secret"
 
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Manage/edit profiles"
-msgstr "Profile verwalten/editieren"
+#: ../../addon/posterous/posterous.php:36
+msgid "Post to Posterous"
+msgstr "Nach Posterous senden"
 
-#: ../../include/nav.php:130
-msgid "Manage/edit friends and contacts"
-msgstr "Freunde und Kontakte verwalten/editieren"
+#: ../../addon/posterous/posterous.php:67
+msgid "Posterous Post Settings"
+msgstr "Posterous Beitrags-Einstellungen"
 
-#: ../../include/nav.php:137
-msgid "Admin"
-msgstr "Administration"
+#: ../../addon/posterous/posterous.php:69
+msgid "Enable Posterous Post Plugin"
+msgstr "Posterous-Plugin aktivieren"
 
-#: ../../include/nav.php:137
-msgid "Site setup and configuration"
-msgstr "Einstellungen der Seite und Konfiguration"
+#: ../../addon/posterous/posterous.php:74
+msgid "Posterous login"
+msgstr "Posterous-Anmeldename"
 
-#: ../../include/nav.php:160
-msgid "Nothing new here"
-msgstr "Keine Neuigkeiten."
+#: ../../addon/posterous/posterous.php:79
+msgid "Posterous password"
+msgstr "Posterous-Passwort"
 
-#: ../../include/message.php:14
-msgid "[no subject]"
-msgstr "[kein Betreff]"
+#: ../../addon/posterous/posterous.php:84
+msgid "Post to Posterous by default"
+msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Posterous"
 
-#: ../../include/profile_advanced.php:17 ../../boot.php:963
+#: ../../include/profile_advanced.php:17 ../../boot.php:978
 msgid "Gender:"
 msgstr "Geschlecht:"
 
@@ -4131,77 +4407,142 @@ msgstr "j F, Y"
 msgid "j F"
 msgstr "j F"
 
+#: ../../include/profile_advanced.php:30 ../../include/datetime.php:438
+#: ../../include/items.php:1318
+msgid "Birthday:"
+msgstr "Geburtstag:"
+
 #: ../../include/profile_advanced.php:34
 msgid "Age:"
 msgstr "Alter:"
 
-#: ../../include/profile_advanced.php:37 ../../boot.php:966
+#: ../../include/profile_advanced.php:37 ../../boot.php:981
 msgid "Status:"
 msgstr "Status:"
 
-#: ../../include/profile_advanced.php:45 ../../boot.php:968
+#: ../../include/profile_advanced.php:45 ../../boot.php:983
 msgid "Homepage:"
 msgstr "Homepage:"
 
-#: ../../include/profile_advanced.php:49
+#: ../../include/profile_advanced.php:47
+msgid "Tags:"
+msgstr "Tags"
+
+#: ../../include/profile_advanced.php:51
 msgid "Religion:"
 msgstr "Religion:"
 
-#: ../../include/profile_advanced.php:51
+#: ../../include/profile_advanced.php:53
 msgid "About:"
 msgstr "Ãœber:"
 
-#: ../../include/profile_advanced.php:53
+#: ../../include/profile_advanced.php:55
 msgid "Hobbies/Interests:"
 msgstr "Hobbies/Interessen:"
 
-#: ../../include/profile_advanced.php:55
+#: ../../include/profile_advanced.php:57
 msgid "Contact information and Social Networks:"
 msgstr "Kontaktinformationen und Soziale Netzwerke:"
 
-#: ../../include/profile_advanced.php:57
+#: ../../include/profile_advanced.php:59
 msgid "Musical interests:"
 msgstr "Musikalische Interessen:"
 
-#: ../../include/profile_advanced.php:59
+#: ../../include/profile_advanced.php:61
 msgid "Books, literature:"
 msgstr "Literatur/Bücher:"
 
-#: ../../include/profile_advanced.php:61
-msgid "Television:"
-msgstr "Fernsehen:"
+#: ../../include/profile_advanced.php:63
+msgid "Television:"
+msgstr "Fernsehen:"
+
+#: ../../include/profile_advanced.php:65
+msgid "Film/dance/culture/entertainment:"
+msgstr "Filme/Tänze/Kultur/Unterhaltung:"
+
+#: ../../include/profile_advanced.php:67
+msgid "Love/Romance:"
+msgstr "Liebesleben:"
+
+#: ../../include/profile_advanced.php:69
+msgid "Work/employment:"
+msgstr "Arbeit/Beschäftigung:"
+
+#: ../../include/profile_advanced.php:71
+msgid "School/education:"
+msgstr "Schule/Ausbildung:"
+
+#: ../../include/contact_selectors.php:32
+msgid "Unknown | Not categorised"
+msgstr "Unbekannt | Nicht kategorisiert"
+
+#: ../../include/contact_selectors.php:33
+msgid "Block immediately"
+msgstr "Sofort blockieren"
+
+#: ../../include/contact_selectors.php:34
+msgid "Shady, spammer, self-marketer"
+msgstr "Zwielichtig, Spammer, Selbstdarsteller"
+
+#: ../../include/contact_selectors.php:35
+msgid "Known to me, but no opinion"
+msgstr "Ist mir bekannt, hab aber keine Meinung"
+
+#: ../../include/contact_selectors.php:36
+msgid "OK, probably harmless"
+msgstr "OK, wahrscheinlich harmlos"
+
+#: ../../include/contact_selectors.php:37
+msgid "Reputable, has my trust"
+msgstr "Seriös, hat mein Vertrauen"
+
+#: ../../include/contact_selectors.php:56
+msgid "Frequently"
+msgstr "Häufig"
+
+#: ../../include/contact_selectors.php:57
+msgid "Hourly"
+msgstr "Stündlich"
+
+#: ../../include/contact_selectors.php:58
+msgid "Twice daily"
+msgstr "Zweimal Täglich"
+
+#: ../../include/contact_selectors.php:59
+msgid "Daily"
+msgstr "Täglich"
 
-#: ../../include/profile_advanced.php:63
-msgid "Film/dance/culture/entertainment:"
-msgstr "Filme/Tänze/Kultur/Unterhaltung:"
+#: ../../include/contact_selectors.php:60
+msgid "Weekly"
+msgstr "Wöchentlich"
 
-#: ../../include/profile_advanced.php:65
-msgid "Love/Romance:"
-msgstr "Liebesleben:"
+#: ../../include/contact_selectors.php:61
+msgid "Monthly"
+msgstr "Monatlich"
 
-#: ../../include/profile_advanced.php:67
-msgid "Work/employment:"
-msgstr "Arbeit/Beschäftigung:"
+#: ../../include/contact_selectors.php:77
+msgid "OStatus"
+msgstr "OStatus"
 
-#: ../../include/profile_advanced.php:69
-msgid "School/education:"
-msgstr "Schule/Ausbildung:"
+#: ../../include/contact_selectors.php:78
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
 
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:243
-msgid "Starts:"
-msgstr "Beginnt:"
+#: ../../include/contact_selectors.php:82
+msgid "Zot!"
+msgstr "Zott"
 
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:251
-msgid "Finishes:"
-msgstr "Endet:"
+#: ../../include/contact_selectors.php:83
+msgid "LinkedIn"
+msgstr "LinkedIn"
 
-#: ../../include/items.php:2413
-msgid "A new person is sharing with you at "
-msgstr "Eine neue Person teilt mit dir auf "
+#: ../../include/contact_selectors.php:84
+msgid "XMPP/IM"
+msgstr "XMPP/Chat"
 
-#: ../../include/items.php:2413
-msgid "You have a new follower at "
-msgstr "Du hast einen neuen Kontakt auf "
+#: ../../include/contact_selectors.php:85
+msgid "MySpace"
+msgstr "MySpace"
 
 #: ../../include/profile_selectors.php:6
 msgid "Male"
@@ -4415,485 +4756,317 @@ msgstr "Ist mir nicht wichtig"
 msgid "Ask me"
 msgstr "Frag mich"
 
-#: ../../include/Contact.php:125 ../../include/conversation.php:723
-msgid "View status"
-msgstr "Status anzeigen"
-
-#: ../../include/Contact.php:126 ../../include/conversation.php:724
-msgid "View profile"
-msgstr "Profil anzeigen"
-
-#: ../../include/Contact.php:127 ../../include/conversation.php:725
-msgid "View photos"
-msgstr "Fotos ansehen"
-
-#: ../../include/Contact.php:128 ../../include/Contact.php:141
-#: ../../include/conversation.php:726
-msgid "View recent"
-msgstr "Neueste anzeigen"
-
-#: ../../include/Contact.php:130 ../../include/Contact.php:141
-#: ../../include/conversation.php:728
-msgid "Send PM"
-msgstr "Private Nachricht senden"
-
-#: ../../include/conversation.php:23 ../../include/conversation.php:96
-#: ../../addon/communityhome/communityhome.php:155
-msgid "event"
-msgstr "Veranstaltung"
-
-#: ../../include/conversation.php:252 ../../include/conversation.php:508
-msgid "Select"
-msgstr "Auswählen"
-
-#: ../../include/conversation.php:267 ../../include/conversation.php:602
-#: ../../include/conversation.php:603
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Das Profil von %s auf %s betrachten."
-
-#: ../../include/conversation.php:276 ../../include/conversation.php:614
-#, php-format
-msgid "%s from %s"
-msgstr "%s von %s"
-
-#: ../../include/conversation.php:292
-msgid "View in context"
-msgstr "Im Zusammenhang betrachten"
-
-#: ../../include/conversation.php:407
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d Kommentar"
-msgstr[1] "%d Kommentare"
-
-#: ../../include/conversation.php:410 ../../boot.php:439
-msgid "show more"
-msgstr "mehr anzeigen"
-
-#: ../../include/conversation.php:470
-msgid "like"
-msgstr "mag ich"
-
-#: ../../include/conversation.php:471
-msgid "dislike"
-msgstr "mag ich nicht"
-
-#: ../../include/conversation.php:473
-msgid "Share this"
-msgstr "Teilen"
-
-#: ../../include/conversation.php:473
-msgid "share"
-msgstr "Teilen"
-
-#: ../../include/conversation.php:518
-msgid "add star"
-msgstr "markieren"
-
-#: ../../include/conversation.php:519
-msgid "remove star"
-msgstr "Markierung entfernen"
-
-#: ../../include/conversation.php:520
-msgid "toggle star status"
-msgstr "Markierung umschalten"
-
-#: ../../include/conversation.php:523
-msgid "starred"
-msgstr "markiert"
-
-#: ../../include/conversation.php:524
-msgid "add tag"
-msgstr "Tag hinzufügen"
-
-#: ../../include/conversation.php:604
-msgid "to"
-msgstr "to"
-
-#: ../../include/conversation.php:605
-msgid "Wall-to-Wall"
-msgstr "Wall-to-Wall"
-
-#: ../../include/conversation.php:606
-msgid "via Wall-To-Wall:"
-msgstr "via Wall-To-Wall:"
+#: ../../include/event.php:17 ../../include/bb2diaspora.php:255
+msgid "Starts:"
+msgstr "Beginnt:"
 
-#: ../../include/conversation.php:648
-msgid "Delete Selected Items"
-msgstr "Lösche die markierten Beiträge"
+#: ../../include/event.php:27 ../../include/bb2diaspora.php:263
+msgid "Finishes:"
+msgstr "Endet:"
 
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s likes this."
-msgstr "%s mag das."
+#: ../../include/delivery.php:416 ../../include/notifier.php:629
+msgid "(no subject)"
+msgstr "(kein Betreff)"
 
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s mag das nicht."
+#: ../../include/delivery.php:423 ../../include/enotify.php:16
+#: ../../include/notifier.php:636
+msgid "noreply"
+msgstr "noreply"
 
-#: ../../include/conversation.php:782
-#, php-format
-msgid "<span  %1$s>%2$d people</span> like this."
-msgstr "<span  %1$s>%2$d Leute</span> mögen das."
+#: ../../include/text.php:232
+msgid "prev"
+msgstr "vorige"
 
-#: ../../include/conversation.php:784
-#, php-format
-msgid "<span  %1$s>%2$d people</span> don't like this."
-msgstr "<span  %1$s>%2$d Leute</span> mögen das nicht."
+#: ../../include/text.php:234
+msgid "first"
+msgstr "erste"
 
-#: ../../include/conversation.php:790
-msgid "and"
-msgstr "und"
+#: ../../include/text.php:263
+msgid "last"
+msgstr "letzte"
 
-#: ../../include/conversation.php:793
-#, php-format
-msgid ", and %d other people"
-msgstr " und %d andere"
+#: ../../include/text.php:266
+msgid "next"
+msgstr "nächste"
 
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s like this."
-msgstr "%s mögen das."
+#: ../../include/text.php:557
+msgid "No contacts"
+msgstr "Keine Kontakte"
 
-#: ../../include/conversation.php:794
+#: ../../include/text.php:566
 #, php-format
-msgid "%s don't like this."
-msgstr "%s mögen das nicht."
-
-#: ../../include/conversation.php:814
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Für <strong>Jedermann</strong> sichtbar"
-
-#: ../../include/conversation.php:816
-msgid "Please enter a video link/URL:"
-msgstr "Bitte Link/URL zum Video einfügen:"
-
-#: ../../include/conversation.php:817
-msgid "Please enter an audio link/URL:"
-msgstr "Bitte Link/URL zum Audio einfügen:"
-
-#: ../../include/conversation.php:818
-msgid "Tag term:"
-msgstr "Tag:"
-
-#: ../../include/conversation.php:819
-msgid "Where are you right now?"
-msgstr "Wo hältst du dich jetzt gerade auf?"
-
-#: ../../include/conversation.php:820
-msgid "Enter a title for this item"
-msgstr "Gib den Titel für diesen Beitrag ein"
-
-#: ../../include/conversation.php:864
-msgid "upload photo"
-msgstr "Bild hochladen"
-
-#: ../../include/conversation.php:866
-msgid "attach file"
-msgstr "Datei anhängen"
-
-#: ../../include/conversation.php:868
-msgid "web link"
-msgstr "Weblink"
-
-#: ../../include/conversation.php:869
-msgid "Insert video link"
-msgstr "Video-Adresse einfügen"
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] "%d Kontakt"
+msgstr[1] "%d Kontakte"
 
-#: ../../include/conversation.php:870
-msgid "video link"
-msgstr "Video-Link"
+#: ../../include/text.php:637 ../../include/nav.php:87
+msgid "Search"
+msgstr "Suche"
 
-#: ../../include/conversation.php:871
-msgid "Insert audio link"
-msgstr "Audio-Adresse einfügen"
+#: ../../include/text.php:735
+msgid "Monday"
+msgstr "Montag"
 
-#: ../../include/conversation.php:872
-msgid "audio link"
-msgstr "Audio-Link"
+#: ../../include/text.php:735
+msgid "Tuesday"
+msgstr "Dienstag"
 
-#: ../../include/conversation.php:874
-msgid "set location"
-msgstr "Ort setzen"
+#: ../../include/text.php:735
+msgid "Wednesday"
+msgstr "Mittwoch"
 
-#: ../../include/conversation.php:876
-msgid "clear location"
-msgstr "Ort löschen"
+#: ../../include/text.php:735
+msgid "Thursday"
+msgstr "Donnerstag"
 
-#: ../../include/conversation.php:878
-msgid "Set title"
-msgstr "Titel setzen"
+#: ../../include/text.php:735
+msgid "Friday"
+msgstr "Freitag"
 
-#: ../../include/conversation.php:881
-msgid "permissions"
-msgstr "Zugriffsrechte"
+#: ../../include/text.php:735
+msgid "Saturday"
+msgstr "Samstag"
 
-#: ../../include/notifier.php:628 ../../include/delivery.php:415
-msgid "(no subject)"
-msgstr "(kein Betreff)"
+#: ../../include/text.php:735
+msgid "Sunday"
+msgstr "Sonntag"
 
-#: ../../include/notifier.php:635 ../../include/enotify.php:16
-msgid "noreply"
-msgstr "noreply"
+#: ../../include/text.php:739
+msgid "January"
+msgstr "Januar"
 
-#: ../../include/diaspora.php:570
-msgid "Sharing notification from Diaspora network"
-msgstr "Freigabe-Benachrichtigung von Diaspora"
+#: ../../include/text.php:739
+msgid "February"
+msgstr "Februar"
 
-#: ../../include/diaspora.php:1862
-msgid "Attachments:"
-msgstr "Anhänge:"
+#: ../../include/text.php:739
+msgid "March"
+msgstr "März"
 
-#: ../../include/diaspora.php:2045
-#, php-format
-msgid "[Relayed] Comment authored by %s from network %s"
-msgstr "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk"
+#: ../../include/text.php:739
+msgid "April"
+msgstr "April"
 
-#: ../../include/bb2diaspora.php:53
-msgid "view full size"
-msgstr "Volle Größe anzeigen"
+#: ../../include/text.php:739
+msgid "May"
+msgstr "Mai"
 
-#: ../../include/bb2diaspora.php:102 ../../include/bb2diaspora.php:112
-msgid "image/photo"
-msgstr "Bild/Foto"
+#: ../../include/text.php:739
+msgid "June"
+msgstr "Juni"
 
-#: ../../include/bb2diaspora.php:102 ../../addon/facebook/facebook.php:869
-#: ../../addon/facebook/facebook.php:878
-msgid "link"
-msgstr "Verweis"
+#: ../../include/text.php:739
+msgid "July"
+msgstr "Juli"
 
-#: ../../include/acl_selectors.php:279
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
+#: ../../include/text.php:739
+msgid "August"
+msgstr "August"
 
-#: ../../include/acl_selectors.php:280
-msgid "show"
-msgstr "zeigen"
+#: ../../include/text.php:739
+msgid "September"
+msgstr "September"
 
-#: ../../include/acl_selectors.php:281
-msgid "don't show"
-msgstr "nicht zeigen"
+#: ../../include/text.php:739
+msgid "October"
+msgstr "Oktober"
 
-#: ../../include/enotify.php:8
-msgid "Friendica Notification"
-msgstr "Friendica-Benachrichtigung"
+#: ../../include/text.php:739
+msgid "November"
+msgstr "November"
 
-#: ../../include/enotify.php:11
-msgid "Thank You,"
-msgstr "Danke,"
+#: ../../include/text.php:739
+msgid "December"
+msgstr "Dezember"
 
-#: ../../include/enotify.php:13
-#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
+#: ../../include/text.php:809
+msgid "bytes"
+msgstr "Byte"
 
-#: ../../include/enotify.php:28
-#, php-format
-msgid "New mail received at %s"
-msgstr "Neue Nachricht auf %s empfangen"
+#: ../../include/text.php:901
+msgid "Select an alternate language"
+msgstr "Alternative Sprache auswählen"
 
-#: ../../include/enotify.php:30
-#, php-format
-msgid "%s sent you a new private message at %s."
-msgstr "%s hat dir eine neue private Nachricht auf %s geschrieben."
+#: ../../include/text.php:913
+msgid "default"
+msgstr "standard"
 
-#: ../../include/enotify.php:32
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr ""
-"Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu "
-"beantworten."
+#: ../../include/diaspora.php:570
+msgid "Sharing notification from Diaspora network"
+msgstr "Freigabe-Benachrichtigung von Diaspora"
 
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s commented on an item at %s"
-msgstr "%s kommentierte einen Beitrag auf %s"
+#: ../../include/diaspora.php:1895
+msgid "Attachments:"
+msgstr "Anhänge:"
 
-#: ../../include/enotify.php:41
+#: ../../include/diaspora.php:2078
 #, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
+msgid "[Relayed] Comment authored by %s from network %s"
+msgstr "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk"
 
-#: ../../include/enotify.php:42 ../../include/enotify.php:51
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr ""
-"Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
+#: ../../include/oembed.php:128
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
 
-#: ../../include/enotify.php:49
-#, php-format
-msgid "%s posted to your profile wall at %s"
-msgstr "%s hat auf deine Pinnwand bei %s gepostet"
+#: ../../include/oembed.php:137
+msgid "Embedding disabled"
+msgstr "Einbettungen deaktiviert"
 
-#: ../../include/enotify.php:58
-#, php-format
-msgid "Introduction received at %s"
-msgstr "Kontaktanfrage auf %s erhalten"
+#: ../../include/group.php:25
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest erstelle bitte eine andere Gruppe mit einem anderen Namen."
 
-#: ../../include/enotify.php:59
-#, php-format
-msgid "You've received an introduction from '%s' at %s"
-msgstr "Du hast eine Kontaktanfrage von '%s' auf %s erhalten"
+#: ../../include/group.php:168
+msgid "Everybody"
+msgstr "Alle Kontakte"
 
-#: ../../include/enotify.php:60 ../../include/enotify.php:73
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Hier kannst du das Profil betrachten: %s"
+#: ../../include/group.php:191
+msgid "edit"
+msgstr "bearbeiten"
 
-#: ../../include/enotify.php:62
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
+#: ../../include/group.php:212
+msgid "Groups"
+msgstr "Gruppen"
 
-#: ../../include/enotify.php:69
-#, php-format
-msgid "Friend suggestion received at %s"
-msgstr "Kontaktvorschlag empfangen auf %s"
+#: ../../include/group.php:213
+msgid "Edit group"
+msgstr "Gruppe bearbeiten"
 
-#: ../../include/enotify.php:70
-#, php-format
-msgid "You've received a friend suggestion from '%s' at %s"
-msgstr "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s"
+#: ../../include/group.php:214
+msgid "Create a new group"
+msgstr "Neue Gruppe erstellen"
 
-#: ../../include/enotify.php:71
-msgid "Name:"
-msgstr "Name:"
+#: ../../include/nav.php:44 ../../boot.php:705
+msgid "Logout"
+msgstr "Abmelden"
 
-#: ../../include/enotify.php:72
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../include/nav.php:44
+msgid "End this session"
+msgstr "Diese Sitzung beenden"
 
-#: ../../include/enotify.php:75
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
+#: ../../include/nav.php:47 ../../boot.php:1327
+msgid "Status"
+msgstr "Status"
 
-#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
-msgid "Image/photo"
-msgstr "Bild/Foto"
+#: ../../include/nav.php:47 ../../include/nav.php:111
+msgid "Your posts and conversations"
+msgstr "Deine Beiträge und Unterhaltungen"
 
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Unbekannt | Nicht kategorisiert"
+#: ../../include/nav.php:48
+msgid "Your profile page"
+msgstr "Deine Profilseite"
 
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Sofort blockieren"
+#: ../../include/nav.php:49 ../../boot.php:1337
+msgid "Photos"
+msgstr "Bilder"
 
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Zwielichtig, Spammer, Selbstdarsteller"
+#: ../../include/nav.php:49
+msgid "Your photos"
+msgstr "Deine Fotos"
 
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Ist mir bekannt, hab aber keine Meinung"
+#: ../../include/nav.php:50
+msgid "Your events"
+msgstr "Deine Ereignisse"
 
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "OK, wahrscheinlich harmlos"
+#: ../../include/nav.php:51
+msgid "Personal notes"
+msgstr "Persönliche Notizen"
 
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Seriös, hat mein Vertrauen"
+#: ../../include/nav.php:51
+msgid "Your personal photos"
+msgstr "Deine privaten Fotos"
 
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "Häufig"
+#: ../../include/nav.php:62
+msgid "Sign in"
+msgstr "Anmelden"
 
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Stündlich"
+#: ../../include/nav.php:73
+msgid "Home Page"
+msgstr "Homepage"
 
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Zweimal Täglich"
+#: ../../include/nav.php:77
+msgid "Create an account"
+msgstr "Account erstellen"
 
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Täglich"
+#: ../../include/nav.php:82
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
 
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Wöchentlich"
+#: ../../include/nav.php:85
+msgid "Apps"
+msgstr "Apps"
 
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Monatlich"
+#: ../../include/nav.php:85
+msgid "Addon applications, utilities, games"
+msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
 
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../include/nav.php:87
+msgid "Search site content"
+msgstr "Inhalt der Seite durchsuchen"
 
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../include/nav.php:97
+msgid "Conversations on this site"
+msgstr "Unterhaltungen auf dieser Seite"
 
-#: ../../include/contact_selectors.php:81
-#: ../../addon/facebook/facebook.php:475
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/nav.php:99
+msgid "Directory"
+msgstr "Verzeichnis"
 
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zott"
+#: ../../include/nav.php:99
+msgid "People directory"
+msgstr "Nutzerverzeichnis"
 
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../include/nav.php:109
+msgid "Conversations from your friends"
+msgstr "Unterhaltungen deiner Kontakte"
 
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/Chat"
+#: ../../include/nav.php:117
+msgid "Friend Requests"
+msgstr "Kontaktanfragen"
 
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../include/nav.php:119
+msgid "See all notifications"
+msgstr "Alle Benachrichtigungen anzeigen"
 
-#: ../../include/auth.php:27
-msgid "Logged out."
-msgstr "Abgemeldet."
+#: ../../include/nav.php:123
+msgid "Private mail"
+msgstr "Private Email"
 
-#: ../../include/oembed.php:128
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../include/nav.php:126
+msgid "Manage"
+msgstr "Verwalten"
 
-#: ../../include/oembed.php:137
-msgid "Embedding disabled"
-msgstr "Einbettungen deaktiviert"
+#: ../../include/nav.php:126
+msgid "Manage other pages"
+msgstr "Andere Seiten verwalten"
 
-#: ../../include/group.php:25
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr ""
-"Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende "
-"Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder "
-"zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest "
-"erstelle bitte eine andere Gruppe mit einem anderen Namen."
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Profiles"
+msgstr "Profile"
 
-#: ../../include/group.php:168
-msgid "Everybody"
-msgstr "Alle Kontakte"
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Manage/edit profiles"
+msgstr "Profile verwalten/editieren"
 
-#: ../../include/group.php:191
-msgid "edit"
-msgstr "bearbeiten"
+#: ../../include/nav.php:131
+msgid "Manage/edit friends and contacts"
+msgstr "Freunde und Kontakte verwalten/editieren"
 
-#: ../../include/group.php:212
-msgid "Groups"
-msgstr "Gruppen"
+#: ../../include/nav.php:138
+msgid "Admin"
+msgstr "Administration"
 
-#: ../../include/group.php:213
-msgid "Edit group"
-msgstr "Gruppe bearbeiten"
+#: ../../include/nav.php:138
+msgid "Site setup and configuration"
+msgstr "Einstellungen der Seite und Konfiguration"
 
-#: ../../include/group.php:214
-msgid "Create a new group"
-msgstr "Neue Gruppe erstellen"
+#: ../../include/nav.php:161
+msgid "Nothing new here"
+msgstr "Keine Neuigkeiten."
 
 #: ../../include/contact_widgets.php:6
 msgid "Add New Contact"
@@ -4946,766 +5119,519 @@ msgstr "Netzwerke"
 msgid "All Networks"
 msgstr "Alle Netzwerke"
 
-#: ../../addon/facebook/facebook.php:337
-msgid "Facebook disabled"
-msgstr "Facebook deaktiviert"
-
-#: ../../addon/facebook/facebook.php:342
-msgid "Updating contacts"
-msgstr "Aktualisiere Kontakte"
-
-#: ../../addon/facebook/facebook.php:351
-msgid "Facebook API key is missing."
-msgstr "Facebook-API-Schlüssel nicht gefunden"
-
-#: ../../addon/facebook/facebook.php:358
-msgid "Facebook Connect"
-msgstr "Mit Facebook verbinden"
-
-#: ../../addon/facebook/facebook.php:364
-msgid "Install Facebook connector for this account."
-msgstr "Facebook-Connector für diesen Account installieren."
-
-#: ../../addon/facebook/facebook.php:371
-msgid "Remove Facebook connector"
-msgstr "Facebook-Connector entfernen"
-
-#: ../../addon/facebook/facebook.php:376
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr ""
-"Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-"
-"Passwort geändert hast.]"
-
-#: ../../addon/facebook/facebook.php:383
-msgid "Post to Facebook by default"
-msgstr "Veröffentliche standardmäßig bei Facebook"
-
-#: ../../addon/facebook/facebook.php:387
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr ""
-"All meine Facebook-Kontakte und -Konversationen hier auf diese Website "
-"importieren"
-
-#: ../../addon/facebook/facebook.php:389
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr ""
-"Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> "
-"erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>"
-
-#: ../../addon/facebook/facebook.php:390
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr ""
-"Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde "
-"(Stream) sehen."
-
-#: ../../addon/facebook/facebook.php:391
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr ""
-"Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner "
-"Facebook-Pinnwand hier auf dieser Seite einstellen."
-
-#: ../../addon/facebook/facebook.php:395
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr ""
-"Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar "
-"machen"
-
-#: ../../addon/facebook/facebook.php:400
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Facebook-Pinnwand nicht importieren"
-
-#: ../../addon/facebook/facebook.php:402
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr ""
-"Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht "
-"setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser "
-"Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf "
-"dieser Webseite geben dann an, wer die Konversationen sehen kann."
-
-#: ../../addon/facebook/facebook.php:407
-msgid "Comma separated applications to ignore"
-msgstr "Komma separierte Liste von Anwendungen die ignoriert werden sollen"
-
-#: ../../addon/facebook/facebook.php:476
-msgid "Facebook Connector Settings"
-msgstr "Facebook-Verbindungseinstellungen"
-
-#: ../../addon/facebook/facebook.php:490
-msgid "Post to Facebook"
-msgstr "Bei Facebook veröffentlichen"
-
-#: ../../addon/facebook/facebook.php:581
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr ""
-"Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-"
-"Netzwerk-Zugriffsrechten vorliegen."
-
-#: ../../addon/facebook/facebook.php:644
-msgid "Image: "
-msgstr "Bild: "
-
-#: ../../addon/facebook/facebook.php:720
-msgid "View on Friendica"
-msgstr "In Friendica betrachten"
-
-#: ../../addon/facebook/facebook.php:744
-msgid "Facebook post failed. Queued for retry."
-msgstr ""
-"Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
-
-#: ../../addon/wppost/wppost.php:41
-msgid "Post to Wordpress"
-msgstr "Bei WordPress veröffentlichen"
-
-#: ../../addon/wppost/wppost.php:73
-msgid "WordPress Post Settings"
-msgstr "WordPress-Beitragseinstellungen"
-
-#: ../../addon/wppost/wppost.php:75
-msgid "Enable WordPress Post Plugin"
-msgstr "WordPress-Plugin aktivieren."
-
-#: ../../addon/wppost/wppost.php:80
-msgid "WordPress username"
-msgstr "WordPress-Benutzername"
-
-#: ../../addon/wppost/wppost.php:85
-msgid "WordPress password"
-msgstr "WordPress-Passwort"
-
-#: ../../addon/wppost/wppost.php:90
-msgid "WordPress API URL"
-msgstr "WordPress-API-URL"
-
-#: ../../addon/wppost/wppost.php:95
-msgid "Post to WordPress by default"
-msgstr "Standardmäßig auf WordPress veröffentlichen"
-
-#: ../../addon/wppost/wppost.php:171 ../../addon/tumblr/tumblr.php:174
-#: ../../addon/posterous/posterous.php:172
-msgid "Post from Friendica"
-msgstr "Beitrag via Friendica"
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:56
-#, php-format
-msgid ""
-"Allow to use your friendika id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud)"
-msgstr ""
-"Erlaube die Verwendung deiner friendica ID (%s) zu externen unhosted-fähigen"
-" Speichern (wie z.B. ownCloud) zu verbinden."
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:57
-msgid "Unhosted DAV storage url"
-msgstr "Unhosted DAV Speicher-URL"
-
-#: ../../addon/tumblr/tumblr.php:35
-msgid "Post to Tumblr"
-msgstr "Bei Tumblr veröffentlichen"
-
-#: ../../addon/tumblr/tumblr.php:66
-msgid "Tumblr Post Settings"
-msgstr "Tumblr-Beitragseinstellungen"
-
-#: ../../addon/tumblr/tumblr.php:68
-msgid "Enable Tumblr Post Plugin"
-msgstr "Tumblr-Plugin aktivieren"
-
-#: ../../addon/tumblr/tumblr.php:73
-msgid "Tumblr login"
-msgstr "Tumblr Login"
-
-#: ../../addon/tumblr/tumblr.php:78
-msgid "Tumblr password"
-msgstr "Tumblr Passwort"
+#: ../../include/auth.php:29
+msgid "Logged out."
+msgstr "Abgemeldet."
 
-#: ../../addon/tumblr/tumblr.php:83
-msgid "Post to Tumblr by default"
-msgstr "Standardmäßig bei Tumblr veröffentlichen"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
 
-#: ../../addon/oembed/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "OEmbed Einstellungen aktualisiert."
+#: ../../include/datetime.php:121 ../../include/datetime.php:253
+msgid "year"
+msgstr "Jahr"
 
-#: ../../addon/oembed/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "OEmbed für Youtube Videos verwenden"
+#: ../../include/datetime.php:126 ../../include/datetime.php:254
+msgid "month"
+msgstr "Monat"
 
-#: ../../addon/oembed/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL zum Einbetten:"
+#: ../../include/datetime.php:131 ../../include/datetime.php:256
+msgid "day"
+msgstr "Tag"
 
-#: ../../addon/posterous/posterous.php:35
-msgid "Post to Posterous"
-msgstr "Nach Posterous senden"
+#: ../../include/datetime.php:244
+msgid "never"
+msgstr "nie"
 
-#: ../../addon/posterous/posterous.php:66
-msgid "Posterous Post Settings"
-msgstr "Posterous Beitrags-Einstellungen"
+#: ../../include/datetime.php:250
+msgid "less than a second ago"
+msgstr "vor weniger als einer Sekunde"
 
-#: ../../addon/posterous/posterous.php:68
-msgid "Enable Posterous Post Plugin"
-msgstr "Posterous-Plugin aktivieren"
+#: ../../include/datetime.php:253
+msgid "years"
+msgstr "Jahre"
 
-#: ../../addon/posterous/posterous.php:73
-msgid "Posterous login"
-msgstr "Posterous-Anmeldename"
+#: ../../include/datetime.php:254
+msgid "months"
+msgstr "Monate"
 
-#: ../../addon/posterous/posterous.php:78
-msgid "Posterous password"
-msgstr "Posterous-Passwort"
+#: ../../include/datetime.php:255
+msgid "week"
+msgstr "Woche"
 
-#: ../../addon/posterous/posterous.php:83
-msgid "Post to Posterous by default"
-msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Posterous"
+#: ../../include/datetime.php:255
+msgid "weeks"
+msgstr "Wochen"
 
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Datei hochladen"
+#: ../../include/datetime.php:256
+msgid "days"
+msgstr "Tage"
 
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Ziehe die Dateien hierher die du hochladen willst"
+#: ../../include/datetime.php:257
+msgid "hour"
+msgstr "Stunde"
 
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Fehlgeschlagen"
+#: ../../include/datetime.php:257
+msgid "hours"
+msgstr "Stunden"
 
-#: ../../addon/js_upload/js_upload.php:294
-msgid "No files were uploaded."
-msgstr "Keine Dateien hochgeladen."
+#: ../../include/datetime.php:258
+msgid "minute"
+msgstr "Minute"
 
-#: ../../addon/js_upload/js_upload.php:300
-msgid "Uploaded file is empty"
-msgstr "Hochgeladene Datei ist leer"
+#: ../../include/datetime.php:258
+msgid "minutes"
+msgstr "Minuten"
 
-#: ../../addon/js_upload/js_upload.php:323
-msgid "File has an invalid extension, it should be one of "
-msgstr ""
-"Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein "
+#: ../../include/datetime.php:259
+msgid "second"
+msgstr "Sekunde"
 
-#: ../../addon/js_upload/js_upload.php:334
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
+#: ../../include/datetime.php:259
+msgid "seconds"
+msgstr "Sekunden"
 
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Fehlerreport erstellen"
+#: ../../include/datetime.php:267
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s her"
 
-#: ../../addon/statusnet/statusnet.php:141
-msgid "Post to StatusNet"
-msgstr "Bei StatusNet veröffentlichen"
+#: ../../include/poller.php:459
+msgid "From: "
+msgstr "Von: "
 
-#: ../../addon/statusnet/statusnet.php:183
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr ""
-"Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL"
-" ist nicht gültig."
+#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
+msgid "Image/photo"
+msgstr "Bild/Foto"
 
-#: ../../addon/statusnet/statusnet.php:211
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr ""
-"Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."
+#: ../../include/dba.php:39
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
 
-#: ../../addon/statusnet/statusnet.php:238
-msgid "StatusNet settings updated."
-msgstr "StatusNet Einstellungen aktualisiert."
+#: ../../include/message.php:14
+msgid "[no subject]"
+msgstr "[kein Betreff]"
 
-#: ../../addon/statusnet/statusnet.php:261
-msgid "StatusNet Posting Settings"
-msgstr "StatusNet-Beitragseinstellungen"
+#: ../../include/acl_selectors.php:279
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
 
-#: ../../addon/statusnet/statusnet.php:275
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Verfügbare OAuth Schlüssel für StatusNet"
+#: ../../include/acl_selectors.php:280
+msgid "show"
+msgstr "zeigen"
 
-#: ../../addon/statusnet/statusnet.php:276
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr ""
-"Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du"
-" einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. "
-"Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen."
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
+msgstr "nicht zeigen"
 
-#: ../../addon/statusnet/statusnet.php:284
-msgid "Provide your own OAuth Credentials"
-msgstr "Eigene OAuth Schlüssel eintragen"
+#: ../../include/enotify.php:8
+msgid "Friendica Notification"
+msgstr "Friendica-Benachrichtigung"
 
-#: ../../addon/statusnet/statusnet.php:285
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet account, copy the consumer key pair "
-"here and enter the API base root.<br />Before you register your own OAuth "
-"key pair ask the administrator if there is already a key pair for this "
-"Friendica installation at your favorited StatusNet installation."
-msgstr ""
-"Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen "
-"Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar "
-"hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-"
-"Schlüsselpaar registrierst, frage den Administrator dieses Friendica-"
-"Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem "
-"StatusNet-Server existiert."
-
-#: ../../addon/statusnet/statusnet.php:287
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
+#: ../../include/enotify.php:11
+msgid "Thank You,"
+msgstr "Danke,"
 
-#: ../../addon/statusnet/statusnet.php:290
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
+#: ../../include/enotify.php:13
+#, php-format
+msgid "%s Administrator"
+msgstr "der Administrator von %s"
 
-#: ../../addon/statusnet/statusnet.php:293
-msgid "Base API Path (remember the trailing /)"
-msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
+#: ../../include/enotify.php:28
+#, php-format
+msgid "New mail received at %s"
+msgstr "Neue Nachricht auf %s empfangen"
 
-#: ../../addon/statusnet/statusnet.php:314
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr ""
-"Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den "
-"Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere "
-"diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine "
-"<strong>öffentlichen</strong> Nachrichten an StatusNet gesendet."
+#: ../../include/enotify.php:30
+#, php-format
+msgid "%s sent you a new private message at %s."
+msgstr "%s hat dir eine neue private Nachricht auf %s geschrieben."
 
-#: ../../addon/statusnet/statusnet.php:315
-msgid "Log in with StatusNet"
-msgstr "Bei StatusNet anmelden"
+#: ../../include/enotify.php:32
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten."
 
-#: ../../addon/statusnet/statusnet.php:317
-msgid "Copy the security code from StatusNet here"
-msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
+#: ../../include/enotify.php:40
+#, php-format
+msgid "%s commented on an item at %s"
+msgstr "%s kommentierte einen Beitrag auf %s"
 
-#: ../../addon/statusnet/statusnet.php:323
-msgid "Cancel Connection Process"
-msgstr "Verbindungsprozess abbrechen"
+#: ../../include/enotify.php:41
+#, php-format
+msgid "%s commented on an item/conversation you have been following."
+msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
 
-#: ../../addon/statusnet/statusnet.php:325
-msgid "Current StatusNet API is"
-msgstr "Derzeitige StatusNet-API-URL lautet"
+#: ../../include/enotify.php:42 ../../include/enotify.php:51
+#: ../../include/enotify.php:60 ../../include/enotify.php:69
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
 
-#: ../../addon/statusnet/statusnet.php:326
-msgid "Cancel StatusNet Connection"
-msgstr "Verbindung zum StatusNet Server abbrechen"
+#: ../../include/enotify.php:49
+#, php-format
+msgid "%s posted to your profile wall at %s"
+msgstr "%s hat auf deine Pinnwand bei %s gepostet"
 
-#: ../../addon/statusnet/statusnet.php:337 ../../addon/twitter/twitter.php:188
-msgid "Currently connected to: "
-msgstr "Momentan verbunden mit: "
+#: ../../include/enotify.php:58
+#, php-format
+msgid "%s tagged you at %s"
+msgstr "%s hat dich auf %s erwähnt"
 
-#: ../../addon/statusnet/statusnet.php:338
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr ""
-"Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf "
-"dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) "
-"als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den "
-"Beitragsoptionen festlegen."
+#: ../../include/enotify.php:67
+#, php-format
+msgid "%s tagged your post at %s"
+msgstr "%s hat deinen Beitrag auf %s getaggt"
 
-#: ../../addon/statusnet/statusnet.php:340
-msgid "Allow posting to StatusNet"
-msgstr "Veröffentlichung bei StatusNet erlauben"
+#: ../../include/enotify.php:76
+#, php-format
+msgid "Introduction received at %s"
+msgstr "Kontaktanfrage auf %s erhalten"
 
-#: ../../addon/statusnet/statusnet.php:343
-msgid "Send public postings to StatusNet by default"
-msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei StatusNet"
+#: ../../include/enotify.php:77
+#, php-format
+msgid "You've received an introduction from '%s' at %s"
+msgstr "Du hast eine Kontaktanfrage von '%s' auf %s erhalten"
 
-#: ../../addon/statusnet/statusnet.php:348 ../../addon/twitter/twitter.php:199
-msgid "Clear OAuth configuration"
-msgstr "OAuth-Konfiguration löschen"
+#: ../../include/enotify.php:78 ../../include/enotify.php:91
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Hier kannst du das Profil betrachten: %s"
 
-#: ../../addon/statusnet/statusnet.php:478
-msgid "API URL"
-msgstr "API-URL"
+#: ../../include/enotify.php:80
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
 
-#: ../../addon/widgets/widgets.php:55
-msgid "Generate new key"
-msgstr "Neuen Schlüssel erstellen"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "Friend suggestion received at %s"
+msgstr "Kontaktvorschlag empfangen auf %s"
 
-#: ../../addon/widgets/widgets.php:58
-msgid "Widgets key"
-msgstr "Widgets Schlüssel"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "You've received a friend suggestion from '%s' at %s"
+msgstr "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s"
 
-#: ../../addon/widgets/widgets.php:60
-msgid "Widgets available"
-msgstr "Verfügbare Widgets"
+#: ../../include/enotify.php:89
+msgid "Name:"
+msgstr "Name:"
 
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "In Friendica verbinden!"
+#: ../../include/enotify.php:90
+msgid "Photo:"
+msgstr "Foto:"
 
-#: ../../addon/widgets/widget_like.php:58
+#: ../../include/enotify.php:93
 #, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "%d Person mag das"
-msgstr[1] "%d Leuten mögen das"
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
 
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] " %d Person mag das nicht"
-msgstr[1] "%d Leute mögen das nicht"
+#: ../../include/items.php:2450
+msgid "A new person is sharing with you at "
+msgstr "Eine neue Person teilt mit dir auf "
 
-#: ../../addon/twitter/twitter.php:78
-msgid "Post to Twitter"
-msgstr "Bei Twitter veröffentlichen"
+#: ../../include/items.php:2450
+msgid "You have a new follower at "
+msgstr "Du hast einen neuen Kontakt auf "
 
-#: ../../addon/twitter/twitter.php:123
-msgid "Twitter settings updated."
-msgstr "Twitter Einstellungen aktualisiert."
+#: ../../include/bb2diaspora.php:64
+msgid "view full size"
+msgstr "Volle Größe anzeigen"
 
-#: ../../addon/twitter/twitter.php:145
-msgid "Twitter Posting Settings"
-msgstr "Twitter-Beitragseinstellungen"
+#: ../../include/bb2diaspora.php:113 ../../include/bb2diaspora.php:123
+#: ../../include/bb2diaspora.php:124
+msgid "image/photo"
+msgstr "Bild/Foto"
 
-#: ../../addon/twitter/twitter.php:152
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr ""
-"Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den "
-"Administrator der Seite."
+#: ../../include/security.php:20
+msgid "Welcome "
+msgstr "Willkommen "
 
-#: ../../addon/twitter/twitter.php:171
-msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input"
-" box below and submit the form. Only your <strong>public</strong> posts will"
-" be posted to Twitter."
-msgstr ""
-"Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast"
-" deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu"
-" die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in "
-"das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu "
-"drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter "
-"veröffentlicht."
+#: ../../include/security.php:21
+msgid "Please upload a profile photo."
+msgstr "Bitte lade ein Profilbild hoch."
 
-#: ../../addon/twitter/twitter.php:172
-msgid "Log in with Twitter"
-msgstr "bei Twitter anmelden"
+#: ../../include/security.php:24
+msgid "Welcome back "
+msgstr "Willkommen zurück "
 
-#: ../../addon/twitter/twitter.php:174
-msgid "Copy the PIN from Twitter here"
-msgstr "Kopiere die Twitter-PIN hier her"
+#: ../../include/Contact.php:131 ../../include/conversation.php:744
+msgid "View status"
+msgstr "Status anzeigen"
+
+#: ../../include/Contact.php:132 ../../include/conversation.php:745
+msgid "View profile"
+msgstr "Profil anzeigen"
+
+#: ../../include/Contact.php:133 ../../include/conversation.php:746
+msgid "View photos"
+msgstr "Fotos ansehen"
 
-#: ../../addon/twitter/twitter.php:189
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr ""
-"Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf "
-"dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) "
-"als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den "
-"Beitragsoptionen festlegen."
+#: ../../include/Contact.php:134 ../../include/Contact.php:147
+#: ../../include/conversation.php:747
+msgid "View recent"
+msgstr "Neueste anzeigen"
 
-#: ../../addon/twitter/twitter.php:191
-msgid "Allow posting to Twitter"
-msgstr "Veröffentlichung bei Twitter erlauben"
+#: ../../include/Contact.php:136 ../../include/Contact.php:147
+#: ../../include/conversation.php:749
+msgid "Send PM"
+msgstr "Private Nachricht senden"
 
-#: ../../addon/twitter/twitter.php:194
-msgid "Send public postings to Twitter by default"
-msgstr "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Twitter"
+#: ../../include/conversation.php:141
+msgid "post/item"
+msgstr "Nachricht/Beitrag"
 
-#: ../../addon/twitter/twitter.php:301
-msgid "Consumer key"
-msgstr "Consumer Key"
+#: ../../include/conversation.php:142
+#, php-format
+msgid "%1$s marked %2$s's %3$s as favorite"
+msgstr "%1$s hat %2$s\\s %3$s als Favorit markiert"
 
-#: ../../addon/twitter/twitter.php:302
-msgid "Consumer secret"
-msgstr "Consumer Secret"
+#: ../../include/conversation.php:279 ../../include/conversation.php:535
+msgid "Select"
+msgstr "Auswählen"
 
-#: ../../addon/impressum/impressum.php:25
-msgid "Impressum"
-msgstr "Impressum"
+#: ../../include/conversation.php:294 ../../include/conversation.php:623
+#: ../../include/conversation.php:624
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Das Profil von %s auf %s betrachten."
 
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:40
-#: ../../addon/impressum/impressum.php:70
-msgid "Site Owner"
-msgstr "Betreiber der Seite"
+#: ../../include/conversation.php:303 ../../include/conversation.php:635
+#, php-format
+msgid "%s from %s"
+msgstr "%s von %s"
 
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:74
-msgid "Email Address"
-msgstr "Email Adresse"
+#: ../../include/conversation.php:319
+msgid "View in context"
+msgstr "Im Zusammenhang betrachten"
 
-#: ../../addon/impressum/impressum.php:43
-#: ../../addon/impressum/impressum.php:72
-msgid "Postal Address"
-msgstr "Postalische Anschrift"
+#: ../../include/conversation.php:434
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d Kommentar"
+msgstr[1] "%d Kommentare"
 
-#: ../../addon/impressum/impressum.php:49
-msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr ""
-"Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe "
-"mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren "
-"Parameter werden in der README-Datei des Addons erläutert."
+#: ../../include/conversation.php:437 ../../boot.php:444
+msgid "show more"
+msgstr "mehr anzeigen"
 
-#: ../../addon/impressum/impressum.php:71
-msgid "Site Owners Profile"
-msgstr "Profil des Seitenbetreibers"
+#: ../../include/conversation.php:497
+msgid "like"
+msgstr "mag ich"
 
-#: ../../addon/impressum/impressum.php:73
-msgid "Notes"
-msgstr "Hinweise"
+#: ../../include/conversation.php:498
+msgid "dislike"
+msgstr "mag ich nicht"
 
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Dreidimensionales Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "Share this"
+msgstr "Teilen"
 
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "share"
+msgstr "Teilen"
 
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Neues Spiel"
+#: ../../include/conversation.php:545
+msgid "add star"
+msgstr "markieren"
 
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Neues Handicap Spiel"
+#: ../../include/conversation.php:546
+msgid "remove star"
+msgstr "Markierung entfernen"
 
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr ""
-"3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf "
-"mehreren Ebenen gleichzeitig spielt."
+#: ../../include/conversation.php:547
+msgid "toggle star status"
+msgstr "Markierung umschalten"
 
-#: ../../addon/tictac/tictac.php:61
-msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
-msgstr ""
-"In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer "
-"Reihe auf einer beliebigen Reihe schafft, oder drei Ã¼bereinander oder "
-"diagonal auf verschiedenen Ebenen."
+#: ../../include/conversation.php:550
+msgid "starred"
+msgstr "markiert"
 
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr ""
-"Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt "
-"da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt."
+#: ../../include/conversation.php:551
+msgid "add tag"
+msgstr "Tag hinzufügen"
 
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Du fängst an..."
+#: ../../include/conversation.php:625
+msgid "to"
+msgstr "to"
 
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Diesmal fange ich an..."
+#: ../../include/conversation.php:626
+msgid "Wall-to-Wall"
+msgstr "Wall-to-Wall"
 
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Du gewinnst!"
+#: ../../include/conversation.php:627
+msgid "via Wall-To-Wall:"
+msgstr "via Wall-To-Wall:"
 
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Unentschieden!"
+#: ../../include/conversation.php:669
+msgid "Delete Selected Items"
+msgstr "Lösche die markierten Beiträge"
 
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Ich gewinne!"
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s likes this."
+msgstr "%s mag das."
 
-#: ../../addon/piwik/piwik.php:70
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr ""
-"Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open "
-"Source-Software zur statistischen Auswertung der Besucherzugriffe."
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s mag das nicht."
 
-#: ../../addon/piwik/piwik.php:73
+#: ../../include/conversation.php:805
 #, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can"
-" set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
-msgstr ""
-"Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden,"
-" kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf "
-"dieser Website nicht mehr verfolgen (opt-out)."
+msgid "<span  %1$s>%2$d people</span> like this."
+msgstr "<span  %1$s>%2$d Leute</span> mögen das."
 
-#: ../../addon/piwik/piwik.php:82
-msgid "Piwik Base URL"
-msgstr "Piwik Basis URL"
+#: ../../include/conversation.php:807
+#, php-format
+msgid "<span  %1$s>%2$d people</span> don't like this."
+msgstr "<span  %1$s>%2$d Leute</span> mögen das nicht."
 
-#: ../../addon/piwik/piwik.php:83
-msgid "Site ID"
-msgstr "Seiten ID"
+#: ../../include/conversation.php:813
+msgid "and"
+msgstr "und"
 
-#: ../../addon/piwik/piwik.php:84
-msgid "Show opt-out cookie link?"
-msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
+#: ../../include/conversation.php:816
+#, php-format
+msgid ", and %d other people"
+msgstr " und %d andere"
 
-#: ../../addon/membersince/membersince.php:17
+#: ../../include/conversation.php:817
 #, php-format
-msgid " - Member since: %s"
-msgstr " - Mitglied seit: %s"
+msgid "%s like this."
+msgstr "%s mögen das."
 
-#: ../../addon/communityhome/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../include/conversation.php:817
+#, php-format
+msgid "%s don't like this."
+msgstr "%s mögen das nicht."
 
-#: ../../addon/communityhome/communityhome.php:38
-msgid "Last users"
-msgstr "Letzte Nutzer"
+#: ../../include/conversation.php:842
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Für <strong>Jedermann</strong> sichtbar"
 
-#: ../../addon/communityhome/communityhome.php:81
-msgid "Most active users"
-msgstr "Aktivste Nutzer"
+#: ../../include/conversation.php:844
+msgid "Please enter a video link/URL:"
+msgstr "Bitte Link/URL zum Video einfügen:"
 
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Last photos"
-msgstr "Letzte Fotos"
+#: ../../include/conversation.php:845
+msgid "Please enter an audio link/URL:"
+msgstr "Bitte Link/URL zum Audio einfügen:"
 
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Last likes"
-msgstr "Zuletzt gemocht"
+#: ../../include/conversation.php:846
+msgid "Tag term:"
+msgstr "Tag:"
 
-#: ../../addon/pageheader/pageheader.php:47
-msgid "\"pageheader\" Settings"
-msgstr "\"pageheader\"-Einstellungen"
+#: ../../include/conversation.php:847
+msgid "Where are you right now?"
+msgstr "Wo hältst du dich jetzt gerade auf?"
 
-#: ../../addon/pageheader/pageheader.php:65
-msgid "pageheader Settings saved."
-msgstr "pageheader-Einstellungen gespeichert."
+#: ../../include/conversation.php:848
+msgid "Enter a title for this item"
+msgstr "Gib den Titel für diesen Beitrag ein"
 
-#: ../../addon/randplace/randplace.php:170
-msgid "Randplace Settings"
-msgstr "Randplace-Einstellungen"
+#: ../../include/conversation.php:891
+msgid "upload photo"
+msgstr "Bild hochladen"
 
-#: ../../addon/randplace/randplace.php:172
-msgid "Enable Randplace Plugin"
-msgstr "Randplace-Plugin aktivieren"
+#: ../../include/conversation.php:893
+msgid "attach file"
+msgstr "Datei anhängen"
 
-#: ../../addon/blockem/blockem.php:47
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\"-Einstellungen"
+#: ../../include/conversation.php:895
+msgid "web link"
+msgstr "Weblink"
 
-#: ../../addon/blockem/blockem.php:49
-msgid "Comma separated profile URLS to block"
-msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
+#: ../../include/conversation.php:896
+msgid "Insert video link"
+msgstr "Video-Adresse einfügen"
 
-#: ../../addon/blockem/blockem.php:66
-msgid "BLOCKEM Settings saved."
-msgstr "BLOCKEM-Einstellungen gesichert."
+#: ../../include/conversation.php:897
+msgid "video link"
+msgstr "Video-Link"
 
-#: ../../addon/blockem/blockem.php:104
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s blockiert - Zum Ã–ffnen/Schließen klicken"
+#: ../../include/conversation.php:898
+msgid "Insert audio link"
+msgstr "Audio-Adresse einfügen"
 
-#: ../../addon/nsfw/nsfw.php:47
-msgid "\"Not Safe For Work\" Settings"
-msgstr "\"Not Safe For Work\"-Einstellungen"
+#: ../../include/conversation.php:899
+msgid "audio link"
+msgstr "Audio-Link"
 
-#: ../../addon/nsfw/nsfw.php:49
-msgid "Comma separated words to treat as NSFW"
-msgstr "Wörter, die gefiltert werden sollen (durch Kommas getrennt)"
+#: ../../include/conversation.php:901
+msgid "set location"
+msgstr "Ort setzen"
 
-#: ../../addon/nsfw/nsfw.php:66
-msgid "NSFW Settings saved."
-msgstr "NSFW-Einstellungen gespeichert"
+#: ../../include/conversation.php:903
+msgid "clear location"
+msgstr "Ort löschen"
 
-#: ../../addon/nsfw/nsfw.php:102
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s â€“ Zum Ã–ffnen/Schließen klicken"
+#: ../../include/conversation.php:908
+msgid "permissions"
+msgstr "Zugriffsrechte"
 
-#: ../../boot.php:437
+#: ../../boot.php:442
 msgid "Delete this item?"
 msgstr "Diesen Beitrag löschen?"
 
-#: ../../boot.php:440
+#: ../../boot.php:445
 msgid "show fewer"
 msgstr "weniger anzeigen"
 
-#: ../../boot.php:683
+#: ../../boot.php:688
 msgid "Create a New Account"
 msgstr "Neuen Account erstellen"
 
-#: ../../boot.php:703
+#: ../../boot.php:708
 msgid "Nickname or Email address: "
 msgstr "Spitzname oder Email-Adresse: "
 
-#: ../../boot.php:704
+#: ../../boot.php:709
 msgid "Password: "
 msgstr "Passwort: "
 
-#: ../../boot.php:707
+#: ../../boot.php:712
 msgid "Or login using OpenID: "
 msgstr "Oder melde dich mit deiner OpenID an: "
 
-#: ../../boot.php:713
+#: ../../boot.php:718
 msgid "Forgot your password?"
 msgstr "Passwort vergessen?"
 
-#: ../../boot.php:860
+#: ../../boot.php:875
 msgid "Edit profile"
 msgstr "Profil bearbeiten"
 
-#: ../../boot.php:1027 ../../boot.php:1098
+#: ../../boot.php:1042 ../../boot.php:1113
 msgid "g A l F d"
 msgstr "l. d, F G \\U\\h\\\\r"
 
-#: ../../boot.php:1028 ../../boot.php:1099
+#: ../../boot.php:1043 ../../boot.php:1114
 msgid "F d"
 msgstr "d. F"
 
-#: ../../boot.php:1053
+#: ../../boot.php:1068
 msgid "Birthday Reminders"
 msgstr "Geburtstagserinnerungen"
 
-#: ../../boot.php:1054
+#: ../../boot.php:1069
 msgid "Birthdays this week:"
 msgstr "Geburtstage diese Woche:"
 
-#: ../../boot.php:1077 ../../boot.php:1141
+#: ../../boot.php:1092 ../../boot.php:1156
 msgid "[today]"
 msgstr "[heute]"
 
-#: ../../boot.php:1122
+#: ../../boot.php:1137
 msgid "Event Reminders"
 msgstr "Veranstaltungserinnerungen"
 
-#: ../../boot.php:1123
+#: ../../boot.php:1138
 msgid "Events this week:"
 msgstr "Veranstaltungen diese Woche"
 
-#: ../../boot.php:1135
+#: ../../boot.php:1150
 msgid "[No description]"
 msgstr "[keine Beschreibung]"
-
-
index 391d66ca37a051e33077c2a3b3c427d17b5bf39b..166880f0d7671a5c24643c2a46f33d4e67d61643 100755 (executable)
@@ -4,54 +4,289 @@ function string_plural_select_de($n){
        return ($n != 1);
 }
 ;
-$a->strings["Permission denied."] = "Zugriff verweigert.";
-$a->strings["Friends of %s"] = "Freunde von %s";
-$a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
+$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
 $a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
+$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
+$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
+$a->strings["Permission denied."] = "Zugriff verweigert.";
+$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
+$a->strings["Repair Contact Settings"] = "Kontakt-Einstellungen reparieren";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was auf dieser Seite gemacht wird.";
+$a->strings["Return to contact editor"] = "Zurück zum Kontakteditor";
+$a->strings["Name"] = "Name";
+$a->strings["Account Nickname"] = "Account-Spitzname";
+$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - Ã¼berschreibt Name/Spitzname";
+$a->strings["Account URL"] = "Account-URL";
+$a->strings["Friend Request URL"] = "URL für Freundschaftsanfragen";
+$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsanfragen";
+$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
+$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
+$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
+$a->strings["Submit"] = "Senden";
+$a->strings["Help:"] = "Hilfe:";
+$a->strings["Help"] = "Hilfe";
+$a->strings["Not Found"] = "Nicht gefunden";
+$a->strings["Page not found."] = "Seite nicht gefunden.";
+$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
+$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
+$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
+$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
+$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
+$a->strings["Event description and start time are required."] = "Ereignis Beschreibung und Startzeit sind erforderlich.";
+$a->strings["Events"] = "Veranstaltungen";
+$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
+$a->strings["Previous"] = "Vorherige";
+$a->strings["Next"] = "Nächste";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Veranstaltung bearbeiten";
+$a->strings["link to source"] = "Link zum Originalbeitrag";
+$a->strings["hour:minute"] = "Stunde:Minute";
+$a->strings["Event details"] = "Veranstaltungsdetails";
+$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
+$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
+$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
+$a->strings["Event Finishes:"] = "Veranstaltungsende:";
+$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
+$a->strings["Description:"] = "Beschreibung";
+$a->strings["Location:"] = "Ort:";
+$a->strings["Share this event"] = "Veranstaltung teilen";
+$a->strings["Cancel"] = "Abbrechen";
+$a->strings["Tag removed"] = "Tag entfernt";
+$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
+$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
+$a->strings["Remove"] = "Entfernen";
+$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
+$a->strings["Authorize application connection"] = "Verbindung der Applikation authorisieren";
+$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
+$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte sowie die Erstellung neuer Beiträge in deinem Namen gestatten?";
+$a->strings["Yes"] = "Ja";
+$a->strings["No"] = "Nein";
+$a->strings["Photo Albums"] = "Fotoalben";
+$a->strings["Contact Photos"] = "Kontaktbilder";
+$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
+$a->strings["everybody"] = "jeder";
+$a->strings["Contact information unavailable"] = "Kontaktinformationen nicht verfügbar";
+$a->strings["Profile Photos"] = "Profilbilder";
+$a->strings["Album not found."] = "Album nicht gefunden.";
+$a->strings["Delete Album"] = "Album löschen";
+$a->strings["Delete Photo"] = "Foto löschen";
+$a->strings["was tagged in a"] = "wurde getaggt in einem";
+$a->strings["photo"] = "Foto";
+$a->strings["by"] = "von";
+$a->strings["Image exceeds size limit of "] = "Die Bildgröße Ã¼bersteigt das Limit von ";
+$a->strings["Image file is empty."] = "Bilddatei ist leer.";
+$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
+$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
 $a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
-$a->strings["Global Directory"] = "Weltweites Verzeichnis";
-$a->strings["Normal site view"] = "Normale Seitenansicht";
-$a->strings["Admin - View all site entries"] = "Admin: Alle Einträge dieses Servers anzeigen";
-$a->strings["Find on this site"] = "Auf diesem Server suchen";
-$a->strings["Finding: "] = "Funde: ";
-$a->strings["Site Directory"] = "Verzeichnis";
-$a->strings["Find"] = "Finde";
-$a->strings["Age: "] = "Alter: ";
-$a->strings["Gender: "] = "Geschlecht:";
-$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
-$a->strings["Item not found."] = "Beitrag nicht gefunden.";
-$a->strings["Access denied."] = "Zugriff verweigert.";
-$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
-$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten.";
-$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Ãœberprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet.";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust.";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst.";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Ãœberprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar Ã¶ffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst.";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
+$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
+$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
+$a->strings["Upload Photos"] = "Bilder hochladen";
+$a->strings["New album name: "] = "Name des neuen Albums: ";
+$a->strings["or existing album name: "] = "oder existierender Albumname: ";
+$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
+$a->strings["Permissions"] = "Berechtigungen";
+$a->strings["Edit Album"] = "Album bearbeiten";
+$a->strings["View Photo"] = "Fotos betrachten";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
+$a->strings["Photo not available"] = "Foto nicht verfügbar";
+$a->strings["View photo"] = "Fotos ansehen";
+$a->strings["Edit photo"] = "Foto bearbeiten";
+$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
+$a->strings["Private Message"] = "Private Nachricht";
+$a->strings["View Full Size"] = "Betrachte Originalgröße";
+$a->strings["Tags: "] = "Tags: ";
+$a->strings["[Remove any tag]"] = "[Tag entfernen]";
+$a->strings["New album name"] = "Name des neuen Albums";
+$a->strings["Caption"] = "Bildunterschrift";
+$a->strings["Add a Tag"] = "Tag hinzufügen";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
+$a->strings["I like this (toggle)"] = "Ich mag das (toggle)";
+$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (toggle)";
+$a->strings["Share"] = "Teilen";
+$a->strings["Please wait"] = "Bitte warten";
+$a->strings["This is you"] = "Das bist du";
+$a->strings["Comment"] = "Kommentar";
+$a->strings["Preview"] = "Vorschau";
+$a->strings["Delete"] = "Löschen";
+$a->strings["View Album"] = "Album betrachten";
+$a->strings["Recent Photos"] = "Neueste Fotos";
+$a->strings["Not available."] = "Nicht verfügbar.";
+$a->strings["Community"] = "Gemeinschaft";
+$a->strings["No results."] = "Keine Ergebnisse.";
+$a->strings["This is Friendica, version"] = "Dies ist Friendica version";
+$a->strings["running at web location"] = "die unter folgender Webadresse zu finden ist";
+$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr Ã¼ber das Friendica Projekt zu erfahren.";
+$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
+$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com";
+$a->strings["Installed plugins/addons/apps"] = "Installierte Plugins/Erweiterungen/Apps";
+$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
+$a->strings["Item not found"] = "Beitrag nicht gefunden";
+$a->strings["Edit post"] = "Beitrag bearbeiten";
+$a->strings["Post to Email"] = "An E-Mail senden";
+$a->strings["Edit"] = "Bearbeiten";
+$a->strings["Upload photo"] = "Foto hochladen";
+$a->strings["Attach file"] = "Datei anhängen";
+$a->strings["Insert web link"] = "Weblink einfügen";
+$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
+$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg] Video einfügen";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg] Audio einfügen";
+$a->strings["Set your location"] = "Deinen Standort festlegen";
+$a->strings["Clear browser location"] = "Browser-Standort leeren";
+$a->strings["Permission settings"] = "Berechtigungseinstellungen";
+$a->strings["CC: email addresses"] = "Cc:-E-Mail-Addressen";
+$a->strings["Public post"] = "Öffentlicher Beitrag";
+$a->strings["Set title"] = "Titel setzen";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
+$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
+$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
+$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
+$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
+$a->strings["%d required parameter was not found at the given location"] = array(
+       0 => "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden",
+       1 => "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden",
+);
+$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
+$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
+$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
+$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Freundschaftsanfragen erhalten.";
+$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
+$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
+$a->strings["Invalid locator"] = "Ungültiger Locator";
+$a->strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen an der angegebenen Stelle nicht finden.";
+$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
+$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits ein Freund von %s bist.";
+$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
 $a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
-$a->strings["Connect URL missing."] = "Connect-URL fehlt";
-$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
-$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
-$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
-$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
-$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
-$a->strings["following"] = "folgen";
-$a->strings["People Search"] = "Personen Suche";
+$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
+$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
+$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
+$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Incorrect identity currently logged in. Please login to <strong>this</strong> profile.";
+$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
+$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
+$a->strings["Confirm"] = "Bestätigen";
+$a->strings["[Name Withheld]"] = "[Name Zurückgehalten]";
+$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein.";
+$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:";
+$a->strings["Friend/Connection Request"] = "Freundschafts-/Kontaktanfrage";
+$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
+$a->strings["Please answer the following:"] = "Bitte beantworte folgende Fragen:";
+$a->strings["Does %s know you?"] = "Kennt %s dich?";
+$a->strings["Add a personal note:"] = "Eine persönliche Notiz anfügen:";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["- please share from your own site as noted above"] = "- bitte fange von Deiner eigenen Seite aus zu teilen an";
+$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
+$a->strings["Submit Request"] = "Anfrage abschicken";
+$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke â€“ Setup";
+$a->strings["Database connection"] = "Datenbank-Verbindung";
+$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
+$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
+$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
+$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
+$a->strings["Proceed to registration"] = "Mit der Registrierung fortfahren";
+$a->strings["Proceed with Installation"] = "Mit der Installation fortfahren";
+$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
+$a->strings["Database import failed."] = "Import der Datenbank schlug fehl.";
+$a->strings["System check"] = "Systemtest";
+$a->strings["Check again"] = "Noch einmal testen";
+$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können müssen wir wissen wie wir zu deiner Datenbank Kontakt aufnehmen können.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
+$a->strings["Database Server Name"] = "Datenbank-Server";
+$a->strings["Database Login Name"] = "Datenbank-Nutzer";
+$a->strings["Database Login Password"] = "Datenbank-Passwort";
+$a->strings["Database Name"] = "Datenbank-Name";
+$a->strings["Site administrator email address"] = "E-Mail-Adresse des Administrators";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse Ã¼bereinstimmen, damit du das Admin-Panel benutzen kannst.";
+$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
+$a->strings["Site settings"] = "Server-Einstellungen";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
+$a->strings["PHP executable path"] = "Pfad zu PHP";
+$a->strings["Enter full path to php executable"] = "Kompletter Pfad zum PHP-Executable";
+$a->strings["Command line PHP"] = "Kommadozeilen-PHP";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
+$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
+$a->strings["PHP \"register_argc_argv\""] = "PHP \"register_argc_argv\"";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
+$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
+$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
+$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
+$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
+$a->strings["mysqli PHP module"] = "PHP: mysqli-Modul";
+$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
+$a->strings["Apace mod_rewrite module"] = "Apache: mod_rewrite-Modul";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli-Modul von PHP ist nicht installiert.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
+$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
+$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
+$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Bitte Ã¼berprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben.";
+$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\".";
+$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
+$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
+$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Time Conversion"] = "Zeitumrechnung";
+$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
+$a->strings["UTC time: %s"] = "UTC Zeit: %s";
+$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
+$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
+$a->strings["Please select your timezone:"] = "Bitte wähle deine Zeitzone.";
+$a->strings["Profile Match"] = "Profilübereinstimmungen";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
+$a->strings["is interested in:"] = "ist interessiert an:";
+$a->strings["Connect"] = "Verbinden";
 $a->strings["No matches"] = "Keine Ãœbereinstimmungen";
+$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
+$a->strings["Visible to:"] = "Sichtbar für:";
+$a->strings["Welcome to %s"] = "Willkommen zu %s";
+$a->strings["Invalid request identifier."] = "Invalid request identifier.";
+$a->strings["Discard"] = "Verwerfen";
+$a->strings["Ignore"] = "Ignorieren";
+$a->strings["Network"] = "Netzwerk";
+$a->strings["Personal"] = "Persönlich";
+$a->strings["Home"] = "Pinnwand";
+$a->strings["Introductions"] = "Kontaktanfragen";
+$a->strings["Messages"] = "Nachrichten";
+$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
+$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
+$a->strings["Notification type: "] = "Benachrichtigungstyp: ";
+$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
+$a->strings["suggested by %s"] = "vorgeschlagen von %s";
+$a->strings["Hide this contact from others"] = "Verberge diesen Kontakt vor anderen";
+$a->strings["Post a new friend activity"] = "Neue-Kontakt Nachricht senden";
+$a->strings["if applicable"] = "falls anwendbar";
+$a->strings["Approve"] = "Genehmigen";
+$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
+$a->strings["yes"] = "ja";
+$a->strings["no"] = "nein";
+$a->strings["Approve as: "] = "Genehmigen als: ";
+$a->strings["Friend"] = "Freund";
+$a->strings["Sharer"] = "Teilenden";
+$a->strings["Fan/Admirer"] = "Fan/Verehrer";
+$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
+$a->strings["New Follower"] = "Neuer Bewunderer";
+$a->strings["No introductions."] = "Keine Kontaktanfragen.";
+$a->strings["Notifications"] = "Benachrichtigungen";
+$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
+$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
+$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
+$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
+$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
+$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
+$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
+$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
 $a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
 $a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
 $a->strings["Contact updated."] = "Kontakt aktualisiert.";
-$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
 $a->strings["Contact has been blocked"] = "Kontakt wurde blockiert";
 $a->strings["Contact has been unblocked"] = "Kontakt wurde wieder freigegeben";
 $a->strings["Contact has been ignored"] = "Der Kontakt wurde ignoriert";
@@ -75,10 +310,8 @@ $a->strings["View all contacts"] = "Alle Kontakte anzeigen";
 $a->strings["Unblock"] = "Entsperren";
 $a->strings["Block"] = "Sperren";
 $a->strings["Unignore"] = "Ignorieren aufheben";
-$a->strings["Ignore"] = "Ignorieren";
 $a->strings["Repair"] = "Reparieren";
 $a->strings["Contact Editor"] = "Kontakt Editor";
-$a->strings["Submit"] = "Senden";
 $a->strings["Profile Visibility"] = "Profil Anzeige";
 $a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft.";
 $a->strings["Contact Information / Notes"] = "Kontakt Informationen / Notizen";
@@ -94,17 +327,33 @@ $a->strings["Update public posts"] = "Öffentliche Beiträge aktualisieren";
 $a->strings["Update now"] = "Jetzt aktualisieren";
 $a->strings["Currently blocked"] = "Derzeit geblockt";
 $a->strings["Currently ignored"] = "Derzeit ignoriert";
-$a->strings["Hide this contact from others"] = "Verberge diesen Kontakt vor anderen";
 $a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine Ã¶ffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein";
 $a->strings["Contacts"] = "Kontakte";
-$a->strings["Show Blocked Connections"] = "Zeige geblockte Verbindungen";
-$a->strings["Hide Blocked Connections"] = "Verstecke geblockte Verbindungen";
+$a->strings["Show Unblocked Contacts"] = "Nicht geblockte Kontakte anzeigen";
+$a->strings["Show Blocked Contacts"] = "Blockierte Kontakte anzeigen";
+$a->strings["Show All Contacts"] = "Alle Kontakte anzeigen";
 $a->strings["Search your contacts"] = "Suche in deinen Kontakten";
+$a->strings["Finding: "] = "Funde: ";
+$a->strings["Find"] = "Finde";
 $a->strings["Mutual Friendship"] = "Beidseitige Freundschaft";
 $a->strings["is a fan of yours"] = "ist ein Fan von dir";
 $a->strings["you are a fan of"] = "du bist Fan von";
 $a->strings["Edit contact"] = "Kontakt bearbeiten";
-$a->strings["everybody"] = "jeder";
+$a->strings["No valid account found."] = "Kein gültiger Account gefunden.";
+$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte Ã¼berprüfe deine E-Mail.";
+$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
+$a->strings["Administrator"] = "Administrator";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits Ã¤hnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
+$a->strings["Password Reset"] = "Passwort zurücksetzen";
+$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie gewünscht zurückgesetzt.";
+$a->strings["Your new password is"] = "Dein neues Passwort lautet";
+$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
+$a->strings["click here to login"] = "hier klicken, um dich anzumelden";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Du kannst das Passwort in den <em>Einstellungen</em> Ã¤ndern sobald du dich erfolgreich angemeldet hast.";
+$a->strings["Forgot your Password?"] = "Hast du dein Passwort vergessen?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
+$a->strings["Nickname or Email: "] = "Spitzname oder Email:";
+$a->strings["Reset"] = "Zurücksetzen";
 $a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
 $a->strings["Update"] = "Aktualisierungen";
 $a->strings["Failed to connect with email account using the settings provided."] = "Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen.";
@@ -124,23 +373,18 @@ $a->strings["Plugin settings"] = "Plugin-Einstellungen";
 $a->strings["Connections"] = "Verbindungen";
 $a->strings["Export personal data"] = "Persönliche Daten exportieren";
 $a->strings["Add application"] = "Programm hinzufügen";
-$a->strings["Cancel"] = "Abbrechen";
-$a->strings["Name"] = "Name";
 $a->strings["Consumer Key"] = "Consumer Key";
 $a->strings["Consumer Secret"] = "Consumer Secret";
 $a->strings["Redirect"] = "Umleiten";
 $a->strings["Icon url"] = "Icon URL";
 $a->strings["You can't edit this application."] = "Du kannst dieses Programm nicht bearbeiten.";
 $a->strings["Connected Apps"] = "Verbundene Programme";
-$a->strings["Edit"] = "Bearbeiten";
-$a->strings["Delete"] = "Löschen";
 $a->strings["Client key starts with"] = "Anwender Schlüssel beginnt mit";
 $a->strings["No name"] = "Kein Name";
 $a->strings["Remove authorization"] = "Authorisierung entziehen";
 $a->strings["No Plugin settings configured"] = "Keine Plugin-Einstellungen konfiguriert";
 $a->strings["Plugin Settings"] = "Plugin-Einstellungen";
 $a->strings["Built-in support for %s connectivity is %s"] = "Eingebaute Unterstützung für Verbindungen zu %s ist %s";
-$a->strings["Diaspora"] = "Diaspora";
 $a->strings["enabled"] = "eingeschaltet";
 $a->strings["disabled"] = "ausgeschaltet";
 $a->strings["StatusNet"] = "StatusNet";
@@ -168,8 +412,6 @@ $a->strings["Automatically approve all connection/friend requests as friends"] =
 $a->strings["OpenID:"] = "OpenID:";
 $a->strings["(Optional) Allow this OpenID to login to this account."] = "(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID.";
 $a->strings["Publish your default profile in your local site directory?"] = "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?";
-$a->strings["No"] = "Nein";
-$a->strings["Yes"] = "Ja";
 $a->strings["Publish your default profile in the global social directory?"] = "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?";
 $a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?";
 $a->strings["Hide your profile details from unknown viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
@@ -179,7 +421,7 @@ $a->strings["Allow us to suggest you as a potential friend to new members?"] = "
 $a->strings["Profile is <strong>not published</strong>."] = "Profil ist <strong>nicht veröffentlicht</strong>.";
 $a->strings["or"] = "oder";
 $a->strings["Your Identity Address is"] = "Die Adresse deines Profils lautet:";
-$a->strings["Automatically expire posts after days:"] = "Beiträge verfallen automatisch nach Tagen:";
+$a->strings["Automatically expire posts after this many days:"] = "Beiträge verfallen automatisch nach dieser Anzahl von Tagen";
 $a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht.";
 $a->strings["Advanced expiration settings"] = "Erweiterte Verfallseinstellungen";
 $a->strings["Advanced Expiration"] = "Erweitertes Verfallen";
@@ -214,221 +456,69 @@ $a->strings["Someone writes on your profile wall"] = "Jemand etwas auf deine Pin
 $a->strings["Someone writes a followup comment"] = "Jemand auch einen Kommentar verfasst";
 $a->strings["You receive a private message"] = "Du eine private Nachricht erhältst";
 $a->strings["You receive a friend suggestion"] = "Du eine Empfehlung erhältst";
+$a->strings["You are tagged in a post"] = "Du wurdest in einem Beitrag erwähnt";
 $a->strings["Advanced Page Settings"] = "Erweiterte Seiten-Einstellungen";
-$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
-$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
-$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
-$a->strings["Repair Contact Settings"] = "Kontakt-Einstellungen reparieren";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was auf dieser Seite gemacht wird.";
-$a->strings["Account Nickname"] = "Account-Spitzname";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - Ã¼berschreibt Name/Spitzname";
-$a->strings["Account URL"] = "Account-URL";
-$a->strings["Friend Request URL"] = "URL für Freundschaftsanfragen";
-$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsanfragen";
-$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
-$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
-$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
-$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
-$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
-$a->strings["%d required parameter was not found at the given location"] = array(
-       0 => "",
-       1 => "",
-);
-$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
-$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
-$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
-$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Freundschaftsanfragen erhalten.";
-$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
-$a->strings["Invalid locator"] = "Ungültiger Locator";
-$a->strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen an der angegebenen Stelle nicht finden.";
-$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
-$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits ein Freund von %s bist.";
-$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
-$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
-$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Incorrect identity currently logged in. Please login to <strong>this</strong> profile.";
-$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
-$a->strings["Confirm"] = "Bestätigen";
-$a->strings["[Name Withheld]"] = "[Name Zurückgehalten]";
-$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein.";
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:";
-$a->strings["Friend/Connection Request"] = "Freundschafts-/Kontaktanfrage";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-$a->strings["Please answer the following:"] = "Bitte beantworte folgende Fragen:";
-$a->strings["Does %s know you?"] = "Kennt %s dich?";
-$a->strings["Add a personal note:"] = "Eine persönliche Notiz anfügen:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["- please share from your own site as noted above"] = "- bitte fange von Deiner eigenen Seite aus zu teilen an";
-$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
-$a->strings["Submit Request"] = "Anfrage abschicken";
-$a->strings["Invalid request identifier."] = "Invalid request identifier.";
-$a->strings["Discard"] = "Verwerfen";
-$a->strings["Network"] = "Netzwerk";
-$a->strings["Personal"] = "Persönlich";
-$a->strings["Home"] = "Pinnwand";
-$a->strings["Introductions"] = "Kontaktanfragen";
-$a->strings["Messages"] = "Nachrichten";
-$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
-$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
-$a->strings["Notification type: "] = "Benachrichtigungstyp: ";
-$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
-$a->strings["suggested by %s"] = "vorgeschlagen von %s";
-$a->strings["Approve"] = "Genehmigen";
-$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
-$a->strings["yes"] = "ja";
-$a->strings["no"] = "nein";
-$a->strings["Approve as: "] = "Genehmigen als: ";
-$a->strings["Friend"] = "Freund";
-$a->strings["Sharer"] = "Teilenden";
-$a->strings["Fan/Admirer"] = "Fan/Verehrer";
-$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
-$a->strings["New Follower"] = "Neuer Bewunderer";
-$a->strings["No introductions."] = "Keine Kontaktanfragen.";
-$a->strings["Notifications"] = "Benachrichtigungen";
-$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
-$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
-$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
-$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
-$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
-$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
-$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
-$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
-$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
-$a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
-$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
-$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
-$a->strings["Message sent."] = "Nachricht gesendet.";
-$a->strings["Inbox"] = "Eingang";
-$a->strings["Outbox"] = "Ausgang";
-$a->strings["New Message"] = "Neue Nachricht";
-$a->strings["Message deleted."] = "Nachricht gelöscht.";
-$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
-$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
-$a->strings["Send Private Message"] = "Private Nachricht senden";
-$a->strings["To:"] = "An:";
-$a->strings["Subject:"] = "Betreff:";
-$a->strings["Your message:"] = "Deine Nachricht:";
-$a->strings["Upload photo"] = "Foto hochladen";
-$a->strings["Insert web link"] = "Weblink einfügen";
-$a->strings["Please wait"] = "Bitte warten";
-$a->strings["No messages."] = "Keine Nachrichten.";
-$a->strings["Delete conversation"] = "Unterhaltung löschen";
-$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
-$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
-$a->strings["Delete message"] = "Nachricht löschen";
-$a->strings["Send Reply"] = "Antwort senden";
-$a->strings["Image exceeds size limit of %d"] = "Bildgröße Ã¼berschreitet das Limit von %d";
-$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
-$a->strings["Wall Photos"] = "Pinnwand-Bilder";
-$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
-$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
-$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
-$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen.";
-$a->strings["Profile Photos"] = "Profilbilder";
-$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
-$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
-$a->strings["Upload File:"] = "Datei hochladen:";
-$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
-$a->strings["Upload"] = "Hochladen";
-$a->strings["skip this step"] = "diesen Schritt Ã¼berspringen";
-$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
-$a->strings["Crop Image"] = "Bild zurechtschneiden";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
-$a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
-$a->strings["Image uploaded successfully."] = "Bild erfolgreich auf den Server geladen.";
-$a->strings["Welcome back %s"] = "Willkommen zurück %s";
 $a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
-$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "(Wähle zwischen verschiedenen Identitäten oder Gemeinschafts/Gruppen-Seiten, die deine Accountdetails teilen.)";
+$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Wechsle zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppen Seiten die deine Zugangsdetails teilen oder zu denen du \"Manage\" Befugnisse bekommen hast.";
 $a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten: ";
-$a->strings["photo"] = "Foto";
-$a->strings["status"] = "Status";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s getaggt";
-$a->strings["Common Friends"] = "Gemeinsame Freunde";
-$a->strings["No friends in common."] = "Keine gemeinsamen Freunde.";
-$a->strings["Profile not found."] = "Profil nicht gefunden.";
-$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
-$a->strings["Profile updated."] = "Profil aktualisiert.";
-$a->strings["Profile deleted."] = "Profil gelöscht.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Neues Profil angelegt.";
-$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
-$a->strings["Edit Profile Details"] = "Profil bearbeiten";
-$a->strings["View this profile"] = "Dieses Profil anzeigen";
-$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
-$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
-$a->strings["Delete this profile"] = "Dieses Profil löschen";
-$a->strings["Profile Name:"] = "Profilname:";
-$a->strings["Your Full Name:"] = "Dein kompletter Name:";
-$a->strings["Title/Description:"] = "Titel/Beschreibung:";
-$a->strings["Your Gender:"] = "Dein Geschlecht:";
-$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
-$a->strings["Street Address:"] = "Adresse:";
-$a->strings["Locality/City:"] = "Wohnort/Stadt:";
-$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
-$a->strings["Country:"] = "Land:";
-$a->strings["Region/State:"] = "Region/Bundesstaat:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
-$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
-$a->strings["Homepage URL:"] = "Adresse der Homepage:";
-$a->strings["Political Views:"] = "Politische Ansichten:";
-$a->strings["Religious Views:"] = "Religiöse Ansichten:";
-$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
-$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
-$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
-$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir â€¦";
-$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
-$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
-$a->strings["Musical interests"] = "Musikalische Interessen";
-$a->strings["Books, literature"] = "Literatur/Bücher";
-$a->strings["Television"] = "Fernsehen";
-$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
-$a->strings["Love/romance"] = "Liebesleben";
-$a->strings["Work/employment"] = "Arbeit/Beschäftigung";
-$a->strings["School/education"] = "Schule/Ausbildung";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
-$a->strings["Edit/Manage Profiles"] = "Verwalte/Editiere Profile";
-$a->strings["Change profile photo"] = "Profilbild Ã¤ndern";
-$a->strings["Create New Profile"] = "Neues Profil anlegen";
-$a->strings["Profile Image"] = "Profilbild";
-$a->strings["visible to everybody"] = "sichtbar für jeden";
-$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-$a->strings["Login failed."] = "Annmeldung fehlgeschlagen.";
-$a->strings["Welcome "] = "Willkommen ";
-$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
-$a->strings["Welcome back "] = "Willkommen zurück ";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "Zeitumrechnung";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
-$a->strings["UTC time: %s"] = "UTC Zeit: %s";
-$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
-$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
-$a->strings["Please select your timezone:"] = "Bitte wähle deine Zeitzone.";
-$a->strings["%s : Not a valid email address."] = "%s: Keine gültige Email Adresse.";
-$a->strings["Please join my network on %s"] = "Bitte trete meinem Netzwerk auf %s bei";
-$a->strings["%s : Message delivery failed."] = "%s: Zustellung der Nachricht fehlgeschlagen.";
-$a->strings["%d message sent."] = array(
-       0 => "%d Nachricht gesendet.",
-       1 => "%d Nachrichten gesendet.",
+$a->strings["Search Results For:"] = "Suchergebnisse für:";
+$a->strings["Remove term"] = "Begriff entfernen";
+$a->strings["Saved Searches"] = "Gespeicherte Suchen";
+$a->strings["add"] = "hinzufügen";
+$a->strings["Commented Order"] = "Neueste Kommentare";
+$a->strings["Posted Order"] = "Neueste Beiträge";
+$a->strings["New"] = "Neue";
+$a->strings["Starred"] = "Markierte";
+$a->strings["Bookmarks"] = "Lesezeichen";
+$a->strings["Warning: This group contains %s member from an insecure network."] = array(
+       0 => "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk.",
+       1 => "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken.",
 );
-$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
-$a->strings["Send invitations"] = "Einladungen senden";
-$a->strings["Enter email addresses, one per line:"] = "E-Mail-Adressen eingeben, eine pro Zeile:";
-$a->strings["Please join my social network on %s"] = "Bitte trete meinem Sozialen Netzwerk auf %s bei";
-$a->strings["To accept this invitation, please visit:"] = "Um diese Einladung anzunehmen besuche bitte:";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungs Code: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
+$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Ã–ffentlichkeit geraten.";
+$a->strings["No such group"] = "Es gibt keine solche Gruppe";
+$a->strings["Group is empty"] = "Gruppe ist leer";
+$a->strings["Group: "] = "Gruppe: ";
+$a->strings["Contact: "] = "Kontakt: ";
+$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Ã–ffentlichkeit gelangen.";
+$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
+$a->strings["Personal Notes"] = "Persönliche Notizen";
+$a->strings["Save"] = "Speichern";
+$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
+$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten.";
+$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Ãœberprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust.";
+$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst.";
+$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Ãœberprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar Ã¶ffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst.";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
+$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
+$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
+$a->strings["Group created."] = "Gruppe erstellt.";
+$a->strings["Could not create group."] = "Konnte die Gruppe nicht erstellen.";
+$a->strings["Group not found."] = "Gruppe nicht gefunden.";
+$a->strings["Group name changed."] = "Gruppenname geändert.";
+$a->strings["Permission denied"] = "Zugriff verweigert";
+$a->strings["Create a group of contacts/friends."] = "Eine Gruppe von Kontakten/Freunden anlegen.";
+$a->strings["Group Name: "] = "Gruppenname:";
+$a->strings["Group removed."] = "Gruppe entfernt.";
+$a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
+$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
+$a->strings["Group Editor"] = "Gruppeneditor";
+$a->strings["Members"] = "Mitglieder";
+$a->strings["All Contacts"] = "Alle Kontakte";
+$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
+$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
+$a->strings["Profile"] = "Profil";
+$a->strings["Visible To"] = "Sichtbar für";
+$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
+$a->strings["View Contacts"] = "Kontakte anzeigen";
+$a->strings["No contacts."] = "Keine Kontakte.";
 $a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
 $a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht Ã¼berprüft werden.";
 $a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
@@ -445,7 +535,6 @@ $a->strings["SERIOUS ERROR: Generation of security keys failed."] = "SERIOUS ERR
 $a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
 $a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
 $a->strings["Registration details for %s"] = "Details der Registration von %s";
-$a->strings["Administrator"] = "Administrator";
 $a->strings["Registration successful. Please check your email for further instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet.";
 $a->strings["Failed to send email message. Here is the message that failed."] = "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte.";
 $a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
@@ -464,114 +553,64 @@ $a->strings["Your Email Address: "] = "Deine E-Mail-Adresse: ";
 $a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@\$sitename</strong>' sein.";
 $a->strings["Choose a nickname: "] = "Spitznamen wählen: ";
 $a->strings["Register"] = "Registrieren";
-$a->strings["Applications"] = "Anwendungen";
-$a->strings["No installed applications."] = "Keine Applikationen installiert.";
+$a->strings["People Search"] = "Personen Suche";
+$a->strings["status"] = "Status";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
+$a->strings["Item not found."] = "Beitrag nicht gefunden.";
+$a->strings["Access denied."] = "Zugriff verweigert.";
+$a->strings["Account approved."] = "Account freigegeben.";
+$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
+$a->strings["Please login."] = "Bitte melde dich an.";
+$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
+$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
+$a->strings["Wall Photos"] = "Pinnwand-Bilder";
+$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag konnte nicht gespeichert werden.";
+$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
+$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
+$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
+$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
+$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen.";
+$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
+$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
+$a->strings["Image exceeds size limit of %d"] = "Bildgröße Ã¼berschreitet das Limit von %d";
+$a->strings["Upload File:"] = "Datei hochladen:";
+$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
+$a->strings["Upload"] = "Hochladen";
+$a->strings["skip this step"] = "diesen Schritt Ã¼berspringen";
+$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
+$a->strings["Crop Image"] = "Bild zurechtschneiden";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
+$a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
+$a->strings["Image uploaded successfully."] = "Bild erfolgreich auf den Server geladen.";
 $a->strings["No profile"] = "Kein Profil";
-$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
-$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
-$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
-$a->strings["{0} wants to be your friend"] = "{0} möchte mit dir in Kontakt treten";
-$a->strings["{0} sent you a message"] = "{0} hat dir eine Nachricht geschickt";
-$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
-$a->strings["{0} commented %s's post"] = "{0} kommentierte einen Beitrag von %s";
-$a->strings["{0} liked %s's post"] = "{0} mag %ss Beitrag";
-$a->strings["{0} disliked %s's post"] = "{0} mag %ss Beitrag nicht";
-$a->strings["{0} is now friends with %s"] = "{0} ist jetzt mit %s befreundet";
-$a->strings["{0} posted"] = "{0} hat etwas veröffentlicht";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen";
-$a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erwähnt";
-$a->strings["No valid account found."] = "Kein gültiger Account gefunden.";
-$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte Ã¼berprüfe deine E-Mail.";
-$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits Ã¤hnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
-$a->strings["Password Reset"] = "Passwort zurücksetzen";
-$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie gewünscht zurückgesetzt.";
-$a->strings["Your new password is"] = "Dein neues Passwort lautet";
-$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
-$a->strings["click here to login"] = "hier klicken, um dich anzumelden";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Du kannst das Passwort in den <em>Einstellungen</em> Ã¤ndern sobald du dich erfolgreich angemeldet hast.";
-$a->strings["Forgot your Password?"] = "Hast du dein Passwort vergessen?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
-$a->strings["Nickname or Email: "] = "Spitzname oder Email:";
-$a->strings["Reset"] = "Zurücksetzen";
-$a->strings["Item not found"] = "Beitrag nicht gefunden";
-$a->strings["Edit post"] = "Beitrag bearbeiten";
-$a->strings["Post to Email"] = "An E-Mail senden";
-$a->strings["Attach file"] = "Datei anhängen";
-$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
-$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg] Video einfügen";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg] Audio einfügen";
-$a->strings["Set your location"] = "Deinen Standort festlegen";
-$a->strings["Clear browser location"] = "Browser-Standort leeren";
-$a->strings["Permission settings"] = "Berechtigungseinstellungen";
-$a->strings["CC: email addresses"] = "Cc:-E-Mail-Addressen";
-$a->strings["Public post"] = "Öffentlicher Beitrag";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
 $a->strings["Remove My Account"] = "Account löschen";
 $a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dies wird deinen Account endgültig löschen. Es gibt keine Möglichkeit, ihn wiederherzustellen.";
 $a->strings["Please enter your password for verification:"] = "Bitte gib dein Passwort zur Verifikation ein:";
-$a->strings["Account approved."] = "Account freigegeben.";
-$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
-$a->strings["Please login."] = "Bitte melde dich an.";
-$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke â€“ Setup";
-$a->strings["Database connection"] = "Datenbank-Verbindung";
-$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
-$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
-$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
-$a->strings["Proceed to registration"] = "Mit der Registrierung fortfahren";
-$a->strings["Proceed with Installation"] = "Mit der Installation fortfahren";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
-$a->strings["Database import failed."] = "Import der Datenbank schlug fehl.";
-$a->strings["System check"] = "Systemtest";
-$a->strings["Next"] = "Nächste";
-$a->strings["Check again"] = "Noch einmal testen";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können müssen wir wissen wie wir zu deiner Datenbank Kontakt aufnehmen können.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
-$a->strings["Database Server Name"] = "Datenbank-Server";
-$a->strings["Database Login Name"] = "Datenbank-Nutzer";
-$a->strings["Database Login Password"] = "Datenbank-Passwort";
-$a->strings["Database Name"] = "Datenbank-Name";
-$a->strings["Site administrator email address"] = "E-Mail-Adresse des Administrators";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse Ã¼bereinstimmen, damit du das Admin-Panel benutzen kannst.";
-$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
-$a->strings["Site settings"] = "Server-Einstellungen";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
-$a->strings["PHP executable path"] = "Pfad zu PHP";
-$a->strings["Enter full path to php executable"] = "Kompletter Pfad zum PHP-Executable";
-$a->strings["Command line PHP"] = "Kommadozeilen-PHP";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
-$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
-$a->strings["PHP \"register_argc_argv\""] = "PHP \"register_argc_argv\"";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
-$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
-$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
-$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
-$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
-$a->strings["mysqli PHP module"] = "PHP: mysqli-Modul";
-$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
-$a->strings["Apace mod_rewrite module"] = "Apache: mod_rewrite-Modul";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
-$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
-$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
-$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Bitte Ã¼berprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben.";
-$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\".";
-$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
-$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
-$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
-$a->strings["Not available."] = "Nicht verfügbar.";
-$a->strings["Community"] = "Gemeinschaft";
-$a->strings["No results."] = "Keine Ergebnisse.";
-$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "Geteilte Inhalte innerhalb des Friendica-Netzwerks sind unter der <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> verfügbar.";
-$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
+$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
+$a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
+$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
+$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
+$a->strings["Message sent."] = "Nachricht gesendet.";
+$a->strings["Inbox"] = "Eingang";
+$a->strings["Outbox"] = "Ausgang";
+$a->strings["New Message"] = "Neue Nachricht";
+$a->strings["Message deleted."] = "Nachricht gelöscht.";
+$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
+$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
+$a->strings["Send Private Message"] = "Private Nachricht senden";
+$a->strings["To:"] = "An:";
+$a->strings["Subject:"] = "Betreff:";
+$a->strings["Your message:"] = "Deine Nachricht:";
+$a->strings["No messages."] = "Keine Nachrichten.";
+$a->strings["Delete conversation"] = "Unterhaltung löschen";
+$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
+$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
+$a->strings["Delete message"] = "Nachricht löschen";
+$a->strings["Send Reply"] = "Antwort senden";
+$a->strings["Friends of %s"] = "Freunde von %s";
+$a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
 $a->strings["Site"] = "Seite";
 $a->strings["Users"] = "Nutzer";
 $a->strings["Plugins"] = "Plugins";
@@ -657,23 +696,122 @@ $a->strings["FTP Host"] = "FTP Host";
 $a->strings["FTP Path"] = "FTP Pfad";
 $a->strings["FTP User"] = "FTP Nutzername";
 $a->strings["FTP Password"] = "FTP Passwort";
-$a->strings["Friend Suggestions"] = "Kontaktvorschläge";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
-$a->strings["Connect"] = "Verbinden";
-$a->strings["Ignore/Hide"] = "Ignorieren/Verbergen";
+$a->strings["Requested profile is not available."] = "Profil nicht vorhanden.";
 $a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
+$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
+$a->strings["{0} wants to be your friend"] = "{0} möchte mit dir in Kontakt treten";
+$a->strings["{0} sent you a message"] = "{0} hat dir eine Nachricht geschickt";
+$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
+$a->strings["{0} commented %s's post"] = "{0} kommentierte einen Beitrag von %s";
+$a->strings["{0} liked %s's post"] = "{0} mag %ss Beitrag";
+$a->strings["{0} disliked %s's post"] = "{0} mag %ss Beitrag nicht";
+$a->strings["{0} is now friends with %s"] = "{0} ist jetzt mit %s befreundet";
+$a->strings["{0} posted"] = "{0} hat etwas veröffentlicht";
+$a->strings["{0} tagged %s's post with #%s"] = "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen";
+$a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erwähnt";
+$a->strings["Login failed."] = "Annmeldung fehlgeschlagen.";
+$a->strings["Connect URL missing."] = "Connect-URL fehlt";
+$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
+$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
+$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
+$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
+$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
+$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.";
+$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
+$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
+$a->strings["following"] = "folgen";
+$a->strings["Common Friends"] = "Gemeinsame Freunde";
+$a->strings["No friends in common."] = "Keine gemeinsamen Freunde.";
 $a->strings["Item has been removed."] = "Eintrag wurde entfernt.";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
-$a->strings["Profile Match"] = "Profilübereinstimmungen";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
-$a->strings["is interested in:"] = "ist interessiert an:";
-$a->strings["Personal Notes"] = "Persönliche Notizen";
-$a->strings["Save"] = "Speichern";
-$a->strings["Help:"] = "Hilfe:";
-$a->strings["Help"] = "Hilfe";
-$a->strings["Not Found"] = "Nicht gefunden";
-$a->strings["Page not found."] = "Seite nicht gefunden.";
+$a->strings["Applications"] = "Anwendungen";
+$a->strings["No installed applications."] = "Keine Applikationen installiert.";
+$a->strings["Search This Site"] = "Diese Seite durchsuchen";
+$a->strings["Profile not found."] = "Profil nicht gefunden.";
+$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
+$a->strings["Profile updated."] = "Profil aktualisiert.";
+$a->strings["Profile deleted."] = "Profil gelöscht.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Neues Profil angelegt.";
+$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
+$a->strings["Edit Profile Details"] = "Profil bearbeiten";
+$a->strings["View this profile"] = "Dieses Profil anzeigen";
+$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
+$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
+$a->strings["Delete this profile"] = "Dieses Profil löschen";
+$a->strings["Profile Name:"] = "Profilname:";
+$a->strings["Your Full Name:"] = "Dein kompletter Name:";
+$a->strings["Title/Description:"] = "Titel/Beschreibung:";
+$a->strings["Your Gender:"] = "Dein Geschlecht:";
+$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
+$a->strings["Street Address:"] = "Adresse:";
+$a->strings["Locality/City:"] = "Wohnort/Stadt:";
+$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
+$a->strings["Country:"] = "Land:";
+$a->strings["Region/State:"] = "Region/Bundesstaat:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
+$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
+$a->strings["Homepage URL:"] = "Adresse der Homepage:";
+$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Religious Views:"] = "Religiöse Ansichten:";
+$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
+$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
+$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)";
+$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
+$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir â€¦";
+$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
+$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
+$a->strings["Musical interests"] = "Musikalische Interessen";
+$a->strings["Books, literature"] = "Literatur/Bücher";
+$a->strings["Television"] = "Fernsehen";
+$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
+$a->strings["Love/romance"] = "Liebesleben";
+$a->strings["Work/employment"] = "Arbeit/Beschäftigung";
+$a->strings["School/education"] = "Schule/Ausbildung";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
+$a->strings["Age: "] = "Alter: ";
+$a->strings["Edit/Manage Profiles"] = "Verwalte/Editiere Profile";
+$a->strings["Change profile photo"] = "Profilbild Ã¤ndern";
+$a->strings["Create New Profile"] = "Neues Profil anlegen";
+$a->strings["Profile Image"] = "Profilbild";
+$a->strings["visible to everybody"] = "sichtbar für jeden";
+$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s getaggt";
+$a->strings["No potential page delegates located."] = "Keine potentiellen Bevollmächtigte für die Seite gefunden.";
+$a->strings["Delegate Page Management"] = "Delegiere das Management für die Seite";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Bevollmächtigte sind in der Lage alle Aspekte dieses Accounts/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Accounts. Bitte gib Niemandem eine Bevollmächtigung für deinen privaten Account dem du nicht absolut vertraust.";
+$a->strings["Existing Page Managers"] = "Vorhandene Seiten Manager";
+$a->strings["Existing Page Delegates"] = "Vorhandene Bevollmächtigte für die Seite";
+$a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
+$a->strings["Add"] = "Hinzufügen";
+$a->strings["No entries."] = "Keine Einträge";
+$a->strings["Friend Suggestions"] = "Kontaktvorschläge";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
+$a->strings["Ignore/Hide"] = "Ignorieren/Verbergen";
+$a->strings["Global Directory"] = "Weltweites Verzeichnis";
+$a->strings["Normal site view"] = "Normale Seitenansicht";
+$a->strings["Admin - View all site entries"] = "Admin: Alle Einträge dieses Servers anzeigen";
+$a->strings["Find on this site"] = "Auf diesem Server suchen";
+$a->strings["Site Directory"] = "Verzeichnis";
+$a->strings["Gender: "] = "Geschlecht:";
+$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
+$a->strings["%s : Not a valid email address."] = "%s: Keine gültige Email Adresse.";
+$a->strings["Please join my network on %s"] = "Bitte trete meinem Netzwerk auf %s bei";
+$a->strings["%s : Message delivery failed."] = "%s: Zustellung der Nachricht fehlgeschlagen.";
+$a->strings["%d message sent."] = array(
+       0 => "%d Nachricht gesendet.",
+       1 => "%d Nachrichten gesendet.",
+);
+$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
+$a->strings["Send invitations"] = "Einladungen senden";
+$a->strings["Enter email addresses, one per line:"] = "E-Mail-Adressen eingeben, eine pro Zeile:";
+$a->strings["Please join my social network on %s"] = "Bitte trete meinem Sozialen Netzwerk auf %s bei";
+$a->strings["To accept this invitation, please visit:"] = "Um diese Einladung anzunehmen besuche bitte:";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungs Code: \$invite_code";
+$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
 $a->strings["Response from remote site was not understood."] = "Antwort der entfernten Gegenstelle unverständlich.";
 $a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
 $a->strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
@@ -691,227 +829,195 @@ $a->strings["The ID provided by your system is a duplicate on our system. It sho
 $a->strings["Unable to set your contact credentials on our system."] = "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden.";
 $a->strings["Unable to update your contact profile details on our system"] = "Die Updates für dein Profil konnten nicht gespeichert werden";
 $a->strings["Connection accepted at %s"] = "Auf %s wurde die Verbindung akzeptiert";
-$a->strings["Requested profile is not available."] = "Profil nicht vorhanden.";
-$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
-$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
-$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
-$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag konnte nicht gespeichert werden.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
-$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
-$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
-$a->strings["Saved Searches"] = "Gespeicherte Suchen";
-$a->strings["Remove term"] = "Begriff entfernen";
-$a->strings["Search This Site"] = "Diese Seite durchsuchen";
-$a->strings["Photo Albums"] = "Fotoalben";
-$a->strings["Contact Photos"] = "Kontaktbilder";
-$a->strings["Contact information unavailable"] = "Kontaktinformationen nicht verfügbar";
-$a->strings["Album not found."] = "Album nicht gefunden.";
-$a->strings["Delete Album"] = "Album löschen";
-$a->strings["Delete Photo"] = "Foto löschen";
-$a->strings["was tagged in a"] = "wurde getaggt in einem";
-$a->strings["by"] = "von";
-$a->strings["Image exceeds size limit of "] = "Die Bildgröße Ã¼bersteigt das Limit von ";
-$a->strings["Image file is empty."] = "Bilddatei ist leer.";
-$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
-$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
-$a->strings["Upload Photos"] = "Bilder hochladen";
-$a->strings["New album name: "] = "Name des neuen Albums: ";
-$a->strings["or existing album name: "] = "oder existierender Albumname: ";
-$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
-$a->strings["Permissions"] = "Berechtigungen";
-$a->strings["Edit Album"] = "Album bearbeiten";
-$a->strings["View Photo"] = "Fotos betrachten";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
-$a->strings["Photo not available"] = "Foto nicht verfügbar";
-$a->strings["View photo"] = "Fotos ansehen";
-$a->strings["Edit photo"] = "Foto bearbeiten";
-$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
-$a->strings["Private Message"] = "Private Nachricht";
-$a->strings["View Full Size"] = "Betrachte Originalgröße";
-$a->strings["Tags: "] = "Tags: ";
-$a->strings["[Remove any tag]"] = "[Tag entfernen]";
-$a->strings["New album name"] = "Name des neuen Albums";
-$a->strings["Caption"] = "Bildunterschrift";
-$a->strings["Add a Tag"] = "Tag hinzufügen";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Ich mag das (toggle)";
-$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (toggle)";
-$a->strings["Share"] = "Teilen";
-$a->strings["This is you"] = "Das bist du";
-$a->strings["Comment"] = "Kommentar";
-$a->strings["Preview"] = "Vorschau";
-$a->strings["View Album"] = "Album betrachten";
-$a->strings["Recent Photos"] = "Neueste Fotos";
-$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
-$a->strings["Search Results For:"] = "Suchergebnisse für:";
-$a->strings["add"] = "hinzufügen";
-$a->strings["Commented Order"] = "Neueste Kommentare";
-$a->strings["Posted Order"] = "Neueste Beiträge";
-$a->strings["New"] = "Neue";
-$a->strings["Starred"] = "Markierte";
-$a->strings["Bookmarks"] = "Lesezeichen";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
-       0 => "",
-       1 => "",
+$a->strings["Facebook disabled"] = "Facebook deaktiviert";
+$a->strings["Updating contacts"] = "Aktualisiere Kontakte";
+$a->strings["Facebook API key is missing."] = "Facebook-API-Schlüssel nicht gefunden";
+$a->strings["Facebook Connect"] = "Mit Facebook verbinden";
+$a->strings["Install Facebook connector for this account."] = "Facebook-Connector für diesen Account installieren.";
+$a->strings["Remove Facebook connector"] = "Facebook-Connector entfernen";
+$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]";
+$a->strings["Post to Facebook by default"] = "Veröffentliche standardmäßig bei Facebook";
+$a->strings["Link all your Facebook friends and conversations on this website"] = "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren";
+$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>";
+$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen.";
+$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen.";
+$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen";
+$a->strings["Do not import your Facebook profile wall conversations"] = "Facebook-Pinnwand nicht importieren";
+$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann.";
+$a->strings["Comma separated applications to ignore"] = "Komma separierte Liste von Anwendungen die ignoriert werden sollen";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Facebook Connector Settings"] = "Facebook-Verbindungseinstellungen";
+$a->strings["Post to Facebook"] = "Bei Facebook veröffentlichen";
+$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen.";
+$a->strings["Image: "] = "Bild: ";
+$a->strings["View on Friendica"] = "In Friendica betrachten";
+$a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut.";
+$a->strings["link"] = "Verweis";
+$a->strings["%d person likes this"] = array(
+       0 => "%d Person mag das",
+       1 => "%d Leuten mögen das",
 );
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Ã–ffentlichkeit geraten.";
-$a->strings["No such group"] = "Es gibt keine solche Gruppe";
-$a->strings["Group is empty"] = "Gruppe ist leer";
-$a->strings["Group: "] = "Gruppe: ";
-$a->strings["Contact: "] = "Kontakt: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Ã–ffentlichkeit gelangen.";
-$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
-$a->strings["Authorize application connection"] = "Verbindung der Applikation authorisieren";
-$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
-$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte sowie die Erstellung neuer Beiträge in deinem Namen gestatten?";
-$a->strings["This is Friendica, version"] = "Dies ist Friendica version";
-$a->strings["running at web location"] = "die unter folgender Webadresse zu finden ist";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr Ã¼ber das Friendica Projekt zu erfahren.";
-$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com";
-$a->strings["Installed plugins/addons/apps"] = "Installierte Plugins/Erweiterungen/Apps";
-$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
-$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
-$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
-$a->strings["View Contacts"] = "Kontakte anzeigen";
-$a->strings["No contacts."] = "Keine Kontakte.";
-$a->strings["Tag removed"] = "Tag entfernt";
-$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
-$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
-$a->strings["Remove"] = "Entfernen";
-$a->strings["Group created."] = "Gruppe erstellt.";
-$a->strings["Could not create group."] = "Konnte die Gruppe nicht erstellen.";
-$a->strings["Group not found."] = "Gruppe nicht gefunden.";
-$a->strings["Group name changed."] = "Gruppenname geändert.";
-$a->strings["Permission denied"] = "Zugriff verweigert";
-$a->strings["Create a group of contacts/friends."] = "Eine Gruppe von Kontakten/Freunden anlegen.";
-$a->strings["Group Name: "] = "Gruppenname:";
-$a->strings["Group removed."] = "Gruppe entfernt.";
-$a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
-$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
-$a->strings["Group Editor"] = "Gruppeneditor";
-$a->strings["Members"] = "Mitglieder";
-$a->strings["All Contacts"] = "Alle Kontakte";
-$a->strings["Event description and start time are required."] = "Ereignis Beschreibung und Startzeit sind erforderlich.";
-$a->strings["Events"] = "Veranstaltungen";
-$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
-$a->strings["Previous"] = "Vorherige";
-$a->strings["l, F j"] = "l, F j";
-$a->strings["Edit event"] = "Veranstaltung bearbeiten";
-$a->strings["link to source"] = "Link zum Originalbeitrag";
-$a->strings["hour:minute"] = "Stunde:Minute";
-$a->strings["Event details"] = "Veranstaltungsdetails";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
-$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
-$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
-$a->strings["Event Finishes:"] = "Veranstaltungsende:";
-$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
-$a->strings["Description:"] = "Beschreibung";
-$a->strings["Location:"] = "Ort:";
-$a->strings["Share this event"] = "Veranstaltung teilen";
-$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
-$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
-$a->strings["Profile"] = "Profil";
-$a->strings["Visible To"] = "Sichtbar für";
-$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
-$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
-$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
-$a->strings["Visible to:"] = "Sichtbar für:";
-$a->strings["Welcome to %s"] = "Willkommen zu %s";
-$a->strings["Miscellaneous"] = "Verschiedenes";
-$a->strings["year"] = "Jahr";
-$a->strings["month"] = "Monat";
-$a->strings["day"] = "Tag";
-$a->strings["never"] = "nie";
-$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
-$a->strings["years"] = "Jahre";
-$a->strings["months"] = "Monate";
-$a->strings["week"] = "Woche";
-$a->strings["weeks"] = "Wochen";
-$a->strings["days"] = "Tage";
-$a->strings["hour"] = "Stunde";
-$a->strings["hours"] = "Stunden";
-$a->strings["minute"] = "Minute";
-$a->strings["minutes"] = "Minuten";
-$a->strings["second"] = "Sekunde";
-$a->strings["seconds"] = "Sekunden";
-$a->strings[" ago"] = " her";
-$a->strings["Birthday:"] = "Geburtstag:";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
-$a->strings["prev"] = "vorige";
-$a->strings["first"] = "erste";
-$a->strings["last"] = "letzte";
-$a->strings["next"] = "nächste";
-$a->strings["No contacts"] = "Keine Kontakte";
-$a->strings["%d Contact"] = array(
-       0 => "%d Kontakt",
-       1 => "%d Kontakte",
+$a->strings["%d person doesn't like this"] = array(
+       0 => " %d Person mag das nicht",
+       1 => "%d Leute mögen das nicht",
 );
-$a->strings["Search"] = "Suche";
-$a->strings["Monday"] = "Montag";
-$a->strings["Tuesday"] = "Dienstag";
-$a->strings["Wednesday"] = "Mittwoch";
-$a->strings["Thursday"] = "Donnerstag";
-$a->strings["Friday"] = "Freitag";
-$a->strings["Saturday"] = "Samstag";
-$a->strings["Sunday"] = "Sonntag";
-$a->strings["January"] = "Januar";
-$a->strings["February"] = "Februar";
-$a->strings["March"] = "März";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "August";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "Dezember";
-$a->strings["bytes"] = "Byte";
-$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
-$a->strings["default"] = "standard";
-$a->strings["From: "] = "Von: ";
-$a->strings["Logout"] = "Abmelden";
-$a->strings["End this session"] = "Diese Sitzung beenden";
-$a->strings["Status"] = "Status";
-$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-$a->strings["Your profile page"] = "Deine Profilseite";
-$a->strings["Photos"] = "Bilder";
-$a->strings["Your photos"] = "Deine Fotos";
-$a->strings["Your events"] = "Deine Ereignisse";
-$a->strings["Personal notes"] = "Persönliche Notizen";
-$a->strings["Your personal photos"] = "Deine privaten Fotos";
+$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
+$a->strings["Widgets key"] = "Widgets Schlüssel";
+$a->strings["Widgets available"] = "Verfügbare Widgets";
+$a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
+$a->strings["YourLS Settings"] = "YourLS Einstellungen";
+$a->strings["URL: http://"] = "URL: http://";
+$a->strings["Username:"] = "Nutzername:";
+$a->strings["Password:"] = "Passwort:";
+$a->strings["Use SSL "] = "SSL Verwenden ";
+$a->strings["yourls Settings saved."] = "yourls Einstellungen gespeichert";
+$a->strings["\"Not Safe For Work\" Settings"] = "\"Not Safe For Work\"-Einstellungen";
+$a->strings["Enable NSFW filter"] = "NSFW Filter aktivieren";
+$a->strings["Comma separated words to treat as NSFW"] = "Wörter, die gefiltert werden sollen (durch Kommas getrennt)";
+$a->strings["Use /expression/ to provide regular expressions"] = "Verwende /expression/ um Reguläre Ausdrücke zu verwenden";
+$a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
+$a->strings["%s - Click to open/close"] = "%s â€“ Zum Ã–ffnen/Schließen klicken";
 $a->strings["Login"] = "Anmeldung";
-$a->strings["Sign in"] = "Anmelden";
-$a->strings["Home Page"] = "Homepage";
-$a->strings["Create an account"] = "Account erstellen";
-$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
-$a->strings["Apps"] = "Apps";
-$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
-$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
-$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
-$a->strings["Directory"] = "Verzeichnis";
-$a->strings["People directory"] = "Nutzerverzeichnis";
-$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
-$a->strings["Friend Requests"] = "Kontaktanfragen";
-$a->strings["Private mail"] = "Private Email";
-$a->strings["Manage"] = "Verwalten";
-$a->strings["Manage other pages"] = "Andere Seiten verwalten";
-$a->strings["Profiles"] = "Profile";
-$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
-$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
-$a->strings["Admin"] = "Administration";
-$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
-$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
-$a->strings["[no subject]"] = "[kein Betreff]";
+$a->strings["OpenID"] = "OpenID";
+$a->strings["Last users"] = "Letzte Nutzer";
+$a->strings["Most active users"] = "Aktivste Nutzer";
+$a->strings["Last photos"] = "Letzte Fotos";
+$a->strings["Last likes"] = "Zuletzt gemocht";
+$a->strings["event"] = "Veranstaltung";
+$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Ermöglicht es deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
+$a->strings["Template URL (with {category})"] = "Vorlagen URL (mit {Kategorie})";
+$a->strings["OAuth end-point"] = "OAuth end-point";
+$a->strings["Api"] = "Api";
+$a->strings["Member since:"] = "Mitglied seit:";
+$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
+$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+$a->strings["New game"] = "Neues Spiel";
+$a->strings["New game with handicap"] = "Neues Handicap Spiel";
+$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt.";
+$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei Ã¼bereinander oder diagonal auf verschiedenen Ebenen.";
+$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt.";
+$a->strings["You go first..."] = "Du fängst an...";
+$a->strings["I'm going first this time..."] = "Diesmal fange ich an...";
+$a->strings["You won!"] = "Du gewinnst!";
+$a->strings["\"Cat\" game!"] = "Unentschieden!";
+$a->strings["I won!"] = "Ich gewinne!";
+$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
+$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
+$a->strings["Post to Drupal"] = "Bei Drupal veröffentlichen";
+$a->strings["Drupal Post Settings"] = "Drupal-Beitragseinstellungen";
+$a->strings["Enable Drupal Post Plugin"] = "Veröffentlichung bei Drupal erlauben";
+$a->strings["Drupal username"] = "Drupal Nutzername";
+$a->strings["Drupal password"] = "Drupal Passwort";
+$a->strings["Post Type - article,page,or blog"] = "Beitragstyp - Artikel, Seite oder Blog";
+$a->strings["Drupal site URL"] = "URL der Drupal Seite";
+$a->strings["Drupal site uses clean URLS"] = "Drupal Seite verwendet bereinigte URLs";
+$a->strings["Post to Drupal by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Drupal";
+$a->strings["Post from Friendica"] = "Beitrag via Friendica";
+$a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
+$a->strings["Geonames Settings"] = "Geonames Einstellungen";
+$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
+$a->strings["Upload a file"] = "Datei hochladen";
+$a->strings["Drop files here to upload"] = "Ziehe die Dateien hierher die du hochladen willst";
+$a->strings["Failed"] = "Fehlgeschlagen";
+$a->strings["No files were uploaded."] = "Keine Dateien hochgeladen.";
+$a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
+$a->strings["File has an invalid extension, it should be one of "] = "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein ";
+$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
+$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
+$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
+$a->strings["URL to embed:"] = "URL zum Einbetten:";
+$a->strings["Impressum"] = "Impressum";
+$a->strings["Site Owner"] = "Betreiber der Seite";
+$a->strings["Email Address"] = "Email Adresse";
+$a->strings["Postal Address"] = "Postalische Anschrift";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
+$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
+$a->strings["Notes"] = "Hinweise";
+$a->strings["Report Bug"] = "Fehlerreport erstellen";
+$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
+$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
+$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
+$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Ã–ffnen/Schließen klicken";
+$a->strings["Unblock Author"] = "Autor freischalten";
+$a->strings["Block Author"] = "Autor blockieren";
+$a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
+$a->strings["Editplain settings updated."] = "Editplain Einstellungen aktualisiert";
+$a->strings["Editplain Settings"] = "Editplain Einstellungen";
+$a->strings["Disable richtext status editor"] = "RichText Editor deaktivieren";
+$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
+$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
+$a->strings["View Source"] = "Quelle ansehen";
+$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
+$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";
+$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden.";
+$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert.";
+$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen";
+$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet";
+$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen.";
+$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen";
+$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert.";
+$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
+$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
+$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)";
+$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet.";
+$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden";
+$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin";
+$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
+$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
+$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
+$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
+$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
+$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei StatusNet";
+$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
+$a->strings["API URL"] = "API-URL";
+$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
+$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
+$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
+$a->strings["Tumblr login"] = "Tumblr Login";
+$a->strings["Tumblr password"] = "Tumblr Passwort";
+$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
+$a->strings["Numfriends settings updated."] = "Numfriends Einstellungen aktualisiert";
+$a->strings["Numfriends Settings"] = "Numfriends Einstellungen";
+$a->strings["How many contacts to display on profile sidebar"] = "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden";
+$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
+$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
+$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren.";
+$a->strings["WordPress username"] = "WordPress-Benutzername";
+$a->strings["WordPress password"] = "WordPress-Passwort";
+$a->strings["WordPress API URL"] = "WordPress-API-URL";
+$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
+$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
+$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
+$a->strings["Piwik Base URL"] = "Piwik Basis URL";
+$a->strings["Site ID"] = "Seiten ID";
+$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
+$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
+$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
+$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
+$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
+$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
+$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
+$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
+$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
+$a->strings["Send public postings to Twitter by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Twitter";
+$a->strings["Consumer key"] = "Consumer Key";
+$a->strings["Consumer secret"] = "Consumer Secret";
+$a->strings["Post to Posterous"] = "Nach Posterous senden";
+$a->strings["Posterous Post Settings"] = "Posterous Beitrags-Einstellungen";
+$a->strings["Enable Posterous Post Plugin"] = "Posterous-Plugin aktivieren";
+$a->strings["Posterous login"] = "Posterous-Anmeldename";
+$a->strings["Posterous password"] = "Posterous-Passwort";
+$a->strings["Post to Posterous by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Posterous";
 $a->strings["Gender:"] = "Geschlecht:";
 $a->strings["j F, Y"] = "j F, Y";
 $a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Geburtstag:";
 $a->strings["Age:"] = "Alter:";
 $a->strings["Status:"] = "Status:";
 $a->strings["Homepage:"] = "Homepage:";
+$a->strings["Tags:"] = "Tags";
 $a->strings["Religion:"] = "Religion:";
 $a->strings["About:"] = "Ãœber:";
 $a->strings["Hobbies/Interests:"] = "Hobbies/Interessen:";
@@ -923,10 +1029,24 @@ $a->strings["Film/dance/culture/entertainment:"] = "Filme/Tänze/Kultur/Unterhal
 $a->strings["Love/Romance:"] = "Liebesleben:";
 $a->strings["Work/employment:"] = "Arbeit/Beschäftigung:";
 $a->strings["School/education:"] = "Schule/Ausbildung:";
-$a->strings["Starts:"] = "Beginnt:";
-$a->strings["Finishes:"] = "Endet:";
-$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
-$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
+$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
+$a->strings["Block immediately"] = "Sofort blockieren";
+$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
+$a->strings["Known to me, but no opinion"] = "Ist mir bekannt, hab aber keine Meinung";
+$a->strings["OK, probably harmless"] = "OK, wahrscheinlich harmlos";
+$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
+$a->strings["Frequently"] = "Häufig";
+$a->strings["Hourly"] = "Stündlich";
+$a->strings["Twice daily"] = "Zweimal Täglich";
+$a->strings["Daily"] = "Täglich";
+$a->strings["Weekly"] = "Wöchentlich";
+$a->strings["Monthly"] = "Monatlich";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Zot!"] = "Zott";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/Chat";
+$a->strings["MySpace"] = "MySpace";
 $a->strings["Male"] = "Männlich";
 $a->strings["Female"] = "Weiblich";
 $a->strings["Currently Male"] = "Momentan männlich";
@@ -980,12 +1100,161 @@ $a->strings["Uncertain"] = "Unsicher";
 $a->strings["Complicated"] = "Kompliziert";
 $a->strings["Don't care"] = "Ist mir nicht wichtig";
 $a->strings["Ask me"] = "Frag mich";
+$a->strings["Starts:"] = "Beginnt:";
+$a->strings["Finishes:"] = "Endet:";
+$a->strings["(no subject)"] = "(kein Betreff)";
+$a->strings["noreply"] = "noreply";
+$a->strings["prev"] = "vorige";
+$a->strings["first"] = "erste";
+$a->strings["last"] = "letzte";
+$a->strings["next"] = "nächste";
+$a->strings["No contacts"] = "Keine Kontakte";
+$a->strings["%d Contact"] = array(
+       0 => "%d Kontakt",
+       1 => "%d Kontakte",
+);
+$a->strings["Search"] = "Suche";
+$a->strings["Monday"] = "Montag";
+$a->strings["Tuesday"] = "Dienstag";
+$a->strings["Wednesday"] = "Mittwoch";
+$a->strings["Thursday"] = "Donnerstag";
+$a->strings["Friday"] = "Freitag";
+$a->strings["Saturday"] = "Samstag";
+$a->strings["Sunday"] = "Sonntag";
+$a->strings["January"] = "Januar";
+$a->strings["February"] = "Februar";
+$a->strings["March"] = "März";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "August";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "Dezember";
+$a->strings["bytes"] = "Byte";
+$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
+$a->strings["default"] = "standard";
+$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
+$a->strings["Attachments:"] = "Anhänge:";
+$a->strings["[Relayed] Comment authored by %s from network %s"] = "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk";
+$a->strings["Embedded content"] = "Eingebetteter Inhalt";
+$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
+$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest erstelle bitte eine andere Gruppe mit einem anderen Namen.";
+$a->strings["Everybody"] = "Alle Kontakte";
+$a->strings["edit"] = "bearbeiten";
+$a->strings["Groups"] = "Gruppen";
+$a->strings["Edit group"] = "Gruppe bearbeiten";
+$a->strings["Create a new group"] = "Neue Gruppe erstellen";
+$a->strings["Logout"] = "Abmelden";
+$a->strings["End this session"] = "Diese Sitzung beenden";
+$a->strings["Status"] = "Status";
+$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
+$a->strings["Your profile page"] = "Deine Profilseite";
+$a->strings["Photos"] = "Bilder";
+$a->strings["Your photos"] = "Deine Fotos";
+$a->strings["Your events"] = "Deine Ereignisse";
+$a->strings["Personal notes"] = "Persönliche Notizen";
+$a->strings["Your personal photos"] = "Deine privaten Fotos";
+$a->strings["Sign in"] = "Anmelden";
+$a->strings["Home Page"] = "Homepage";
+$a->strings["Create an account"] = "Account erstellen";
+$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
+$a->strings["Apps"] = "Apps";
+$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
+$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
+$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
+$a->strings["Directory"] = "Verzeichnis";
+$a->strings["People directory"] = "Nutzerverzeichnis";
+$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
+$a->strings["Friend Requests"] = "Kontaktanfragen";
+$a->strings["See all notifications"] = "Alle Benachrichtigungen anzeigen";
+$a->strings["Private mail"] = "Private Email";
+$a->strings["Manage"] = "Verwalten";
+$a->strings["Manage other pages"] = "Andere Seiten verwalten";
+$a->strings["Profiles"] = "Profile";
+$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
+$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
+$a->strings["Admin"] = "Administration";
+$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
+$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
+$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
+$a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
+$a->strings["Invite Friends"] = "Freunde einladen";
+$a->strings["%d invitation available"] = array(
+       0 => "%d Einladung verfügbar",
+       1 => "%d Einladungen verfügbar",
+);
+$a->strings["Find People"] = "Leute finden";
+$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
+$a->strings["Connect/Follow"] = "Verbinden/Folgen";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
+$a->strings["Similar Interests"] = "Ähnliche Interessen";
+$a->strings["Networks"] = "Netzwerke";
+$a->strings["All Networks"] = "Alle Netzwerke";
+$a->strings["Logged out."] = "Abgemeldet.";
+$a->strings["Miscellaneous"] = "Verschiedenes";
+$a->strings["year"] = "Jahr";
+$a->strings["month"] = "Monat";
+$a->strings["day"] = "Tag";
+$a->strings["never"] = "nie";
+$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
+$a->strings["years"] = "Jahre";
+$a->strings["months"] = "Monate";
+$a->strings["week"] = "Woche";
+$a->strings["weeks"] = "Wochen";
+$a->strings["days"] = "Tage";
+$a->strings["hour"] = "Stunde";
+$a->strings["hours"] = "Stunden";
+$a->strings["minute"] = "Minute";
+$a->strings["minutes"] = "Minuten";
+$a->strings["second"] = "Sekunde";
+$a->strings["seconds"] = "Sekunden";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s her";
+$a->strings["From: "] = "Von: ";
+$a->strings["Image/photo"] = "Bild/Foto";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
+$a->strings["[no subject]"] = "[kein Betreff]";
+$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["show"] = "zeigen";
+$a->strings["don't show"] = "nicht zeigen";
+$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
+$a->strings["Thank You,"] = "Danke,";
+$a->strings["%s Administrator"] = "der Administrator von %s";
+$a->strings["New mail received at %s"] = "Neue Nachricht auf %s empfangen";
+$a->strings["%s sent you a new private message at %s."] = "%s hat dir eine neue private Nachricht auf %s geschrieben.";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
+$a->strings["%s commented on an item at %s"] = "%s kommentierte einen Beitrag auf %s";
+$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
+$a->strings["%s posted to your profile wall at %s"] = "%s hat auf deine Pinnwand bei %s gepostet";
+$a->strings["%s tagged you at %s"] = "%s hat dich auf %s erwähnt";
+$a->strings["%s tagged your post at %s"] = "%s hat deinen Beitrag auf %s getaggt";
+$a->strings["Introduction received at %s"] = "Kontaktanfrage auf %s erhalten";
+$a->strings["You've received an introduction from '%s' at %s"] = "Du hast eine Kontaktanfrage von '%s' auf %s erhalten";
+$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
+$a->strings["Friend suggestion received at %s"] = "Kontaktvorschlag empfangen auf %s";
+$a->strings["You've received a friend suggestion from '%s' at %s"] = "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s";
+$a->strings["Name:"] = "Name:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
+$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
+$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
+$a->strings["view full size"] = "Volle Größe anzeigen";
+$a->strings["image/photo"] = "Bild/Foto";
+$a->strings["Welcome "] = "Willkommen ";
+$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
+$a->strings["Welcome back "] = "Willkommen zurück ";
 $a->strings["View status"] = "Status anzeigen";
 $a->strings["View profile"] = "Profil anzeigen";
 $a->strings["View photos"] = "Fotos ansehen";
 $a->strings["View recent"] = "Neueste anzeigen";
 $a->strings["Send PM"] = "Private Nachricht senden";
-$a->strings["event"] = "Veranstaltung";
+$a->strings["post/item"] = "Nachricht/Beitrag";
+$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s hat %2\$s\\s %3\$s als Favorit markiert";
 $a->strings["Select"] = "Auswählen";
 $a->strings["View %s's profile @ %s"] = "Das Profil von %s auf %s betrachten.";
 $a->strings["%s from %s"] = "%s von %s";
@@ -1031,227 +1300,7 @@ $a->strings["Insert audio link"] = "Audio-Adresse einfügen";
 $a->strings["audio link"] = "Audio-Link";
 $a->strings["set location"] = "Ort setzen";
 $a->strings["clear location"] = "Ort löschen";
-$a->strings["Set title"] = "Titel setzen";
 $a->strings["permissions"] = "Zugriffsrechte";
-$a->strings["(no subject)"] = "(kein Betreff)";
-$a->strings["noreply"] = "noreply";
-$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
-$a->strings["Attachments:"] = "Anhänge:";
-$a->strings["[Relayed] Comment authored by %s from network %s"] = "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk";
-$a->strings["view full size"] = "Volle Größe anzeigen";
-$a->strings["image/photo"] = "Bild/Foto";
-$a->strings["link"] = "Verweis";
-$a->strings["Visible to everybody"] = "Für jeden sichtbar";
-$a->strings["show"] = "zeigen";
-$a->strings["don't show"] = "nicht zeigen";
-$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
-$a->strings["Thank You,"] = "Danke,";
-$a->strings["%s Administrator"] = "der Administrator von %s";
-$a->strings["New mail received at %s"] = "Neue Nachricht auf %s empfangen";
-$a->strings["%s sent you a new private message at %s."] = "%s hat dir eine neue private Nachricht auf %s geschrieben.";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
-$a->strings["%s commented on an item at %s"] = "%s kommentierte einen Beitrag auf %s";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
-$a->strings["%s posted to your profile wall at %s"] = "%s hat auf deine Pinnwand bei %s gepostet";
-$a->strings["Introduction received at %s"] = "Kontaktanfrage auf %s erhalten";
-$a->strings["You've received an introduction from '%s' at %s"] = "Du hast eine Kontaktanfrage von '%s' auf %s erhalten";
-$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
-$a->strings["Friend suggestion received at %s"] = "Kontaktvorschlag empfangen auf %s";
-$a->strings["You've received a friend suggestion from '%s' at %s"] = "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s";
-$a->strings["Name:"] = "Name:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
-$a->strings["Image/photo"] = "Bild/Foto";
-$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
-$a->strings["Block immediately"] = "Sofort blockieren";
-$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
-$a->strings["Known to me, but no opinion"] = "Ist mir bekannt, hab aber keine Meinung";
-$a->strings["OK, probably harmless"] = "OK, wahrscheinlich harmlos";
-$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
-$a->strings["Frequently"] = "Häufig";
-$a->strings["Hourly"] = "Stündlich";
-$a->strings["Twice daily"] = "Zweimal Täglich";
-$a->strings["Daily"] = "Täglich";
-$a->strings["Weekly"] = "Wöchentlich";
-$a->strings["Monthly"] = "Monatlich";
-$a->strings["OStatus"] = "OStatus";
-$a->strings["RSS/Atom"] = "RSS/Atom";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Zot!"] = "Zott";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/Chat";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Logged out."] = "Abgemeldet.";
-$a->strings["Embedded content"] = "Eingebetteter Inhalt";
-$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
-$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest erstelle bitte eine andere Gruppe mit einem anderen Namen.";
-$a->strings["Everybody"] = "Alle Kontakte";
-$a->strings["edit"] = "bearbeiten";
-$a->strings["Groups"] = "Gruppen";
-$a->strings["Edit group"] = "Gruppe bearbeiten";
-$a->strings["Create a new group"] = "Neue Gruppe erstellen";
-$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
-$a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
-$a->strings["Invite Friends"] = "Freunde einladen";
-$a->strings["%d invitation available"] = array(
-       0 => "%d Einladung verfügbar",
-       1 => "%d Einladungen verfügbar",
-);
-$a->strings["Find People"] = "Leute finden";
-$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
-$a->strings["Connect/Follow"] = "Verbinden/Folgen";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
-$a->strings["Similar Interests"] = "Ähnliche Interessen";
-$a->strings["Networks"] = "Netzwerke";
-$a->strings["All Networks"] = "Alle Netzwerke";
-$a->strings["Facebook disabled"] = "Facebook deaktiviert";
-$a->strings["Updating contacts"] = "Aktualisiere Kontakte";
-$a->strings["Facebook API key is missing."] = "Facebook-API-Schlüssel nicht gefunden";
-$a->strings["Facebook Connect"] = "Mit Facebook verbinden";
-$a->strings["Install Facebook connector for this account."] = "Facebook-Connector für diesen Account installieren.";
-$a->strings["Remove Facebook connector"] = "Facebook-Connector entfernen";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]";
-$a->strings["Post to Facebook by default"] = "Veröffentliche standardmäßig bei Facebook";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Facebook-Pinnwand nicht importieren";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann.";
-$a->strings["Comma separated applications to ignore"] = "Komma separierte Liste von Anwendungen die ignoriert werden sollen";
-$a->strings["Facebook Connector Settings"] = "Facebook-Verbindungseinstellungen";
-$a->strings["Post to Facebook"] = "Bei Facebook veröffentlichen";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen.";
-$a->strings["Image: "] = "Bild: ";
-$a->strings["View on Friendica"] = "In Friendica betrachten";
-$a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut.";
-$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
-$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
-$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren.";
-$a->strings["WordPress username"] = "WordPress-Benutzername";
-$a->strings["WordPress password"] = "WordPress-Passwort";
-$a->strings["WordPress API URL"] = "WordPress-API-URL";
-$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
-$a->strings["Post from Friendica"] = "Beitrag via Friendica";
-$a->strings["Allow to use your friendika id (%s) to connecto to external unhosted-enabled storage (like ownCloud)"] = "Erlaube die Verwendung deiner friendica ID (%s) zu externen unhosted-fähigen Speichern (wie z.B. ownCloud) zu verbinden.";
-$a->strings["Unhosted DAV storage url"] = "Unhosted DAV Speicher-URL";
-$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
-$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
-$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
-$a->strings["Tumblr login"] = "Tumblr Login";
-$a->strings["Tumblr password"] = "Tumblr Passwort";
-$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
-$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
-$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
-$a->strings["URL to embed:"] = "URL zum Einbetten:";
-$a->strings["Post to Posterous"] = "Nach Posterous senden";
-$a->strings["Posterous Post Settings"] = "Posterous Beitrags-Einstellungen";
-$a->strings["Enable Posterous Post Plugin"] = "Posterous-Plugin aktivieren";
-$a->strings["Posterous login"] = "Posterous-Anmeldename";
-$a->strings["Posterous password"] = "Posterous-Passwort";
-$a->strings["Post to Posterous by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Posterous";
-$a->strings["Upload a file"] = "Datei hochladen";
-$a->strings["Drop files here to upload"] = "Ziehe die Dateien hierher die du hochladen willst";
-$a->strings["Failed"] = "Fehlgeschlagen";
-$a->strings["No files were uploaded."] = "Keine Dateien hochgeladen.";
-$a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
-$a->strings["File has an invalid extension, it should be one of "] = "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
-$a->strings["Report Bug"] = "Fehlerreport erstellen";
-$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden.";
-$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert.";
-$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen.";
-$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert.";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet.";
-$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden";
-$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin";
-$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
-$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
-$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
-$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
-$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei StatusNet";
-$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
-$a->strings["API URL"] = "API-URL";
-$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
-$a->strings["Widgets key"] = "Widgets Schlüssel";
-$a->strings["Widgets available"] = "Verfügbare Widgets";
-$a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
-$a->strings["%d person likes this"] = array(
-       0 => "%d Person mag das",
-       1 => "%d Leuten mögen das",
-);
-$a->strings["%d person doesn't like this"] = array(
-       0 => " %d Person mag das nicht",
-       1 => "%d Leute mögen das nicht",
-);
-$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
-$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
-$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
-$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
-$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
-$a->strings["Send public postings to Twitter by default"] = "Veröffentliche Ã¶ffentliche Beiträge standardmäßig bei Twitter";
-$a->strings["Consumer key"] = "Consumer Key";
-$a->strings["Consumer secret"] = "Consumer Secret";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Betreiber der Seite";
-$a->strings["Email Address"] = "Email Adresse";
-$a->strings["Postal Address"] = "Postalische Anschrift";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
-$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
-$a->strings["Notes"] = "Hinweise";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "Neues Spiel";
-$a->strings["New game with handicap"] = "Neues Handicap Spiel";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt.";
-$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei Ã¼bereinander oder diagonal auf verschiedenen Ebenen.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt.";
-$a->strings["You go first..."] = "Du fängst an...";
-$a->strings["I'm going first this time..."] = "Diesmal fange ich an...";
-$a->strings["You won!"] = "Du gewinnst!";
-$a->strings["\"Cat\" game!"] = "Unentschieden!";
-$a->strings["I won!"] = "Ich gewinne!";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
-$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik Basis URL";
-$a->strings["Site ID"] = "Seiten ID";
-$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
-$a->strings[" - Member since: %s"] = " - Mitglied seit: %s";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Last users"] = "Letzte Nutzer";
-$a->strings["Most active users"] = "Aktivste Nutzer";
-$a->strings["Last photos"] = "Letzte Fotos";
-$a->strings["Last likes"] = "Zuletzt gemocht";
-$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
-$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
-$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
-$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
-$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
-$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
-$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Ã–ffnen/Schließen klicken";
-$a->strings["\"Not Safe For Work\" Settings"] = "\"Not Safe For Work\"-Einstellungen";
-$a->strings["Comma separated words to treat as NSFW"] = "Wörter, die gefiltert werden sollen (durch Kommas getrennt)";
-$a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
-$a->strings["%s - Click to open/close"] = "%s â€“ Zum Ã–ffnen/Schließen klicken";
 $a->strings["Delete this item?"] = "Diesen Beitrag löschen?";
 $a->strings["show fewer"] = "weniger anzeigen";
 $a->strings["Create a New Account"] = "Neuen Account erstellen";
diff --git a/view/event.tpl b/view/event.tpl
new file mode 100644 (file)
index 0000000..ac9f889
--- /dev/null
@@ -0,0 +1,10 @@
+{{ for $events as $event }}
+       <div class="event">
+       
+       {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
+       $event.html
+       {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" target="external-link" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
+       {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
+       </div>
+       <div class="clear"></div>
+{{ endfor }}
index 6de471acaa114aa67daae33943a7f6ee41e2771f..7d5f8cf4a30431fab605698404055267fb70796d 100755 (executable)
@@ -1,7 +1,7 @@
-<h3>$e_text</h3>
+<h3>$title</h3>
 
 <p>
-$e_desc
+$desc
 </p>
 
 <form action="$post" method="post" >
index fe0b8fe2a0ef12a0f7924a1d92999d6afaafc326..498ac9941c650ed9bdcd6114703c807f7072e634 100755 (executable)
@@ -1,3 +1,64 @@
+<link rel='stylesheet' type='text/css' href='$baseurl/library/fullcalendar/fullcalendar.css' />
+<script language="javascript" type="text/javascript"
+          src="$baseurl/library/fullcalendar/fullcalendar.min.js"></script>
+
+<script>
+       $(document).ready(function() {
+           $('#events-calendar').fullCalendar({
+                       events: '$baseurl/events/json/',
+                       header: {
+                               left: 'prev,next today',
+                               center: 'title',
+                               right: 'month,agendaWeek,agendaDay'
+                       },                      
+                       timeFormat: 'H(:mm)',
+                       eventClick: function(calEvent, jsEvent, view) {
+                               $.get(
+                                       '$baseurl/events/?id='+calEvent.id,
+                                       function(data){
+                                               $.fancybox(data);
+                                       }
+                               );
+                       },
+                       
+                       eventRender: function(event, element, view) {
+                               //console.log(view.name);
+                               if (event.item['author-name']==null) return;
+                               switch(view.name){
+                                       case "month":
+                                       element.find(".fc-event-title").html(
+                                               "<img src='{0}' style='height:10px;width:10px'>{1} : {2}".format(
+                                                       event.item['author-avatar'],
+                                                       event.item['author-name'],
+                                                       event.title
+                                       ));
+                                       break;
+                                       case "agendaWeek":
+                                       element.find(".fc-event-title").html(
+                                               "<img src='{0}' style='height:12px; width:12px'>{1}<p>{2}</p><p>{3}</p>".format(
+                                                       event.item['author-avatar'],
+                                                       event.item['author-name'],
+                                                       event.item.desc,
+                                                       event.item.location
+                                       ));
+                                       break;
+                                       case "agendaDay":
+                                       element.find(".fc-event-title").html(
+                                               "<img src='{0}' style='height:24px;width:24px'>{1}<p>{2}</p><p>{3}</p>".format(
+                                                       event.item['author-avatar'],
+                                                       event.item['author-name'],
+                                                       event.item.desc,
+                                                       event.item.location
+                                       ));
+                                       break;
+                               }
+                       }
+                       
+               })
+       });
+</script>
+
+
 <script language="javascript" type="text/javascript"
           src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
           <script language="javascript" type="text/javascript">
@@ -24,9 +85,9 @@ tinyMCE.init({
        theme_advanced_path : false,
        setup : function(ed) {
                ed.onInit.add(function(ed) {
-            ed.pasteAsPlainText = true;
-        });
-    }
+                       ed.pasteAsPlainText = true;
+               });
+       }
 
 });
 
diff --git a/view/events-js.tpl b/view/events-js.tpl
new file mode 100644 (file)
index 0000000..b0e182c
--- /dev/null
@@ -0,0 +1,6 @@
+$tabs
+<h2>$title</h2>
+
+<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
+
+<div id="events-calendar"></div>
diff --git a/view/events.tpl b/view/events.tpl
new file mode 100644 (file)
index 0000000..5a9787d
--- /dev/null
@@ -0,0 +1,24 @@
+$tabs
+<h2>$title</h2>
+
+<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
+
+<div id="event-calendar-wrapper">
+       <a href="$previus.0" class="prevcal $previus.2"><div id="event-calendar-prev" class="icon s22 prev" title="$previus.1"></div></a>
+       $calendar
+       <a href="$next.0" class="nextcal $next.2"><div id="event-calendar-prev" class="icon s22 next" title="$next.1"></div></a>
+</div>
+<div class="event-calendar-end"></div>
+
+
+{{ for $events as $event }}
+       <div class="event">
+       {{ if $event.is_first }}<hr /><a name="link-$event.j" ><div class="event-list-date">$event.d</div></a>{{ endif }}
+       {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
+       $event.html
+       {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" target="external-link" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
+       {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
+       </div>
+       <div class="clear"></div>
+
+{{ endfor }}
index 9fe5a63b3b0ac24d78bb02010ef5e49f48c6035a..2a18370887dbd5e72c6c20650d1172730cedac5a 100755 (executable)
                }
        }
 
+
+       function commentInsert(obj,id) {
+               var tmpStr = $("#comment-edit-text-" + id).val();
+               if(tmpStr == '$comment') {
+                       tmpStr = '';
+                       $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+                       $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+                       openMenu("comment-edit-submit-wrapper-" + id);
+               }
+               var ins = $(obj).html();
+               ins = ins.replace('&lt;','<');
+               ins = ins.replace('&gt;','>');
+               ins = ins.replace('&amp;','&');
+               ins = ins.replace('&quot;','"');
+               $("#comment-edit-text-" + id).val(tmpStr + ins);
+       }
+
        function showHideComments(id) {
                if( $('#collapsed-comments-' + id).is(':visible')) {
                        $('#collapsed-comments-' + id).hide();
index 538bdf0baf0cdf581d0f3c5e7ff3e82b57fa9ba4..a1a75ade6081402f559ae56321c6db982a234e97 100755 (executable)
@@ -1,6 +1,6 @@
 <h1>$title</h1>
 <h2>$pass</h2>
-<form  action="$baseurl/install" method="POST">
+<form  action="$baseurl/install" method="post">
 <table>
 {{ for $checks as $check }}
        <tr><td>$check.title </td><td><span class="icon s22 {{if $check.status}}on{{else}}off{{endif}}"></td><td>{{if $check.required}}(required){{endif}}</td></tr>
index d02fd57e6d08344bdfb523c18b30e9158a42d5a1..e7fd53ca4f7504e3791aabb3b1e69e95a3788852 100755 (executable)
@@ -15,6 +15,7 @@
 
 <form class="intro-approve-form" action="dfrn_confirm" method="post">
 {{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
+{{inc field_checkbox.tpl with $field=$activity }}{{endinc}}
 <input type="hidden" name="dfrn_id" value="$dfrn_id" >
 <input type="hidden" name="intro_id" value="$intro_id" >
 <input type="hidden" name="contact_id" value="$contact_id" >
index d998e977a40ab3852d60cbe26c371ea6bd3efae5..007f639b671a00d0886bf31c10c268d26cef519d 100755 (executable)
@@ -3,14 +3,27 @@
 
 var editor=false;
 var textlen = 0;
+var plaintext = '$editselect';
 
 function initEditor(cb){
        if (editor==false){
-               $("#profile-jot-text-loading").show();  
+               $("#profile-jot-text-loading").show();
+               if(plaintext == 'none') {
+                       $("#profile-jot-text-loading").hide();
+                       $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
+                       editor = true;
+                       $("a#jot-perms-icon").fancybox({
+                               'transitionIn' : 'elastic',
+                               'transitionOut' : 'elastic'
+                       }); 
+                       $(".jothidden").show();
+                       if (typeof cb!="undefined") cb();
+                       return;
+               }       
                tinyMCE.init({
                        theme : "advanced",
                        mode : "specific_textareas",
-                       editor_selector: /(profile-jot-text|prvmail-text)/,
+                       editor_selector: $editselect,
                        auto_focus: "profile-jot-text",
                        plugins : "bbcode,paste,autoresize",
                        theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
@@ -105,7 +118,7 @@ function enableOnUser(){
 }
 
 </script>
-<script type="text/javascript" src="js/ajaxupload.js" ></script>
+<script type="text/javascript" src="$baseurl/js/ajaxupload.js" ></script>
 <script>
        var ispublic = '$ispublic';
        var addtitle = '$addtitle';
@@ -123,7 +136,7 @@ function enableOnUser(){
                                name: 'userfile',
                                onSubmit: function(file,ext) { $('#profile-rotator').show(); },
                                onComplete: function(file,response) {
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,response);
+                                       addeditortext(response);
                                        $('#profile-rotator').hide();
                                }                                
                        }
@@ -134,7 +147,7 @@ function enableOnUser(){
                                name: 'userfile',
                                onSubmit: function(file,ext) { $('#profile-rotator').show(); },
                                onComplete: function(file,response) {
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,response);
+                                       addeditortext(response);
                                        $('#profile-rotator').hide();
                                }                                
                        }
@@ -167,7 +180,7 @@ function enableOnUser(){
                        reply = bin2hex(reply);
                        $('#profile-rotator').show();
                        $.get('parse_url?binurl=' + reply, function(data) {
-                               tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                               addeditortext(data);
                                $('#profile-rotator').hide();
                        });
                }
@@ -176,14 +189,14 @@ function enableOnUser(){
        function jotVideoURL() {
                reply = prompt("$vidurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+                       addeditortext('[video]' + reply + '[/video]');
                }
        }
 
        function jotAudioURL() {
                reply = prompt("$audurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+                       addeditortext('[audio]' + reply + '[/audio]');
                }
        }
 
@@ -196,11 +209,13 @@ function enableOnUser(){
        }
 
        function jotShare(id) {
+               if ($('#jot-popup').length != 0) $('#jot-popup').show();
+
                $('#like-rotator-' + id).show();
                $.get('share/' + id, function(data) {
                        if (!editor) $("#profile-jot-text").val("");
                        initEditor(function(){
-                               tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                               addeditortext(data);
                                $('#like-rotator-' + id).hide();
                                $(window).scrollTop(0);
                        });
@@ -224,7 +239,7 @@ function enableOnUser(){
                        $.get('parse_url?binurl=' + reply, function(data) {
                                if (!editor) $("#profile-jot-text").val("");
                                initEditor(function(){
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                                       addeditortext(data);
                                        $('#profile-rotator').hide();
                                });
                        });
@@ -253,6 +268,15 @@ function enableOnUser(){
                $('#profile-nolocation-wrapper').hide();
        }
 
+       function addeditortext(data) {
+               if(plaintext == 'none') {
+                       var currentText = $("#profile-jot-text").val();
+                       $("#profile-jot-text").val(currentText + data);
+               }
+               else
+                       tinyMCE.execCommand('mceInsertRawHTML',false,data);
+       }       
+
        $geotag
 
 </script>
index f116dc0f022c3821804c5fba9c0a7b3ac82cc923..1c19dd6fac0a8891c5e93a9a68f926ceb5f3ab6b 100755 (executable)
@@ -13,9 +13,7 @@
                <input type="hidden" name="preview" id="jot-preview" value="0" />
                
                <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>                
-               {{ if $content }}<script>initEditor();</script>{{ endif }}
-               
-               
+                               
                <ul id="jot-tools" class="jothidden" style="display:none">
                        <li><a href="#" onclick="return false;" id="wall-image-upload" title="$upload">$shortupload</a></a></li>
                        <li><a href="#" onclick="return false;" id="wall-file-upload"  title="$attach">$shortattach</a></li>
@@ -45,6 +43,7 @@
        
 </form>
 
+{{ if $content }}<script>initEditor();</script>{{ endif }}
 
 
 
index be06326203f074dc6b9f9a70296f196a650530cd..ed36a7bb20667b47e5d0b2a3ae07836ce096c55c 100755 (executable)
@@ -7,7 +7,7 @@
                <div class="mail-conv-date">$date</div>
                <div class="mail-conv-subject">$subject</div>
                <div class="mail-conv-body">$body</div>
-       <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-$id" ><a href="message/drop/$id" onclick="return confirmDelete();" ><img src="images/b_drophide.gif" alt="$delete" title="$delete" id="mail-conv-delete-icon-$id" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
+       <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-$id" ><a href="message/drop/$id" class="icon drophide delete-icon mail-list-delete-icon" onclick="return confirmDelete();" title="$delete" id="mail-conv-delete-icon-$id" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
        <div class="mail-conv-outside-wrapper-end"></div>
 </div>
 </div>
index a5d8459874fb7ca243dcc0d56e454bfba838c90b..dffa6e5201c6f505fae508f59cb3f5932508b81a 100755 (executable)
@@ -79,7 +79,7 @@
                                <a class=" $nav.apps.2" href="#" rel="#nav-apps-menu" title="$nav.apps.3" >$nav.apps.1</a>
                                <ul id="nav-apps-menu" class="menu-popup">
                                        {{ for $apps as $ap }}
-                                       <li><a href="$ap.url">$ap.name</a></li>
+                                       <li>$ap</li>
                                        {{ endfor }}
                                </ul>
                        </li>
index 136edf8d7b44634006c03fe352aec2b33a529e87..470404fc339081347887ee5ff52d2d5bd1814f2e 100755 (executable)
@@ -1,75 +1,82 @@
 <h2>$title</h2>
 
-<dl>
+<dl id="aprofile-fullname" class="aprofile">
  <dt>$profile.fullname.0</dt>
  <dd>$profile.fullname.1</dd>
 </dl>
 
 {{ if $profile.gender }}
-<dl>
+<dl id="aprofile-gender" class="aprofile">
  <dt>$profile.gender.0</dt>
  <dd>$profile.gender.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.birthday }}
-<dl>
+<dl id="aprofile-birthday" class="aprofile">
  <dt>$profile.birthday.0</dt>
  <dd>$profile.birthday.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.age }}
-<dl>
+<dl id="aprofile-age" class="aprofile">
  <dt>$profile.age.0</dt>
  <dd>$profile.age.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.marital }}
-<dl>
+<dl id="aprofile-marital" class="aprofile">
  <dt><span class="heart">&hearts;</span>  $profile.marital.0</dt>
  <dd>$profile.marital.1  {{ if $profile.marital.with }}($profile.marital.with){{ endif }}</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.sexual }}
-<dl>
+<dl id="aprofile-sexual" class="aprofile">
  <dt>$profile.sexual.0</dt>
  <dd>$profile.sexual.1</dd>
 </dl>
 {{ endif }}
 
+{{ if $profile.pub_keywords }}
+<dl id="aprofile-tags" class="aprofile">
+ <dt>$profile.pub_keywords.0</dt>
+ <dd>$profile.pub_keywords.1</dd>
+</dl>
+{{ endif }}
+
 {{ if $profile.homepage }}
-<dl>
+<dl id="aprofile-homepage" class="aprofile">
  <dt>$profile.homepage.0</dt>
  <dd>$profile.homepage.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.politic }}
-<dl>
+<dl id="aprofile-politic" class="aprofile">
  <dt>$profile.politic.0</dt>
  <dd>$profile.politic.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.religion }}
-<dl>
+<dl id="aprofile-religion" class="aprofile">
  <dt>$profile.religion.0</dt>
  <dd>$profile.religion.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.about }}
-<dl>
+<dl id="aprofile-about" class="aprofile">
  <dt>$profile.about.0</dt>
  <dd>$profile.about.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.interest }}
-<dl>
+<dl id="aprofile-interest" class="aprofile">
  <dt>$profile.interest.0</dt>
  <dd>$profile.interest.1</dd>
 </dl>
@@ -77,7 +84,7 @@
 
 
 {{ if $profile.contact }}
-<dl>
+<dl id="aprofile-contact" class="aprofile">
  <dt>$profile.contact.0</dt>
  <dd>$profile.contact.1</dd>
 </dl>
@@ -85,7 +92,7 @@
 
 
 {{ if $profile.music }}
-<dl>
+<dl id="aprofile-music" class="aprofile">
  <dt>$profile.music.0</dt>
  <dd>$profile.music.1</dd>
 </dl>
 
 
 {{ if $profile.book }}
-<dl>
+<dl id="aprofile-book" class="aprofile">
  <dt>$profile.book.0</dt>
  <dd>$profile.book.1</dd>
 </dl>
 
 
 {{ if $profile.tv }}
-<dl>
+<dl id="aprofile-tv" class="aprofile">
  <dt>$profile.tv.0</dt>
  <dd>$profile.tv.1</dd>
 </dl>
 
 
 {{ if $profile.film }}
-<dl>
+<dl id="aprofile-film" class="aprofile">
  <dt>$profile.film.0</dt>
  <dd>$profile.film.1</dd>
 </dl>
 
 
 {{ if $profile.romance }}
-<dl>
+<dl id="aprofile-romance" class="aprofile">
  <dt>$profile.romance.0</dt>
  <dd>$profile.romance.1</dd>
 </dl>
 
 
 {{ if $profile.work }}
-<dl>
+<dl id="aprofile-work" class="aprofile">
  <dt>$profile.work.0</dt>
  <dd>$profile.work.1</dd>
 </dl>
 {{ endif }}
 
 {{ if $profile.education }}
-<dl>
+<dl id="aprofile-education" class="aprofile">
  <dt>$profile.education.0</dt>
  <dd>$profile.education.1</dd>
 </dl>
index c4f3ccac7ba3197c9e0ba82d45dba3466ae7666e..de8bd239617ee9826f8cadc060bc8de9a683657d 100755 (executable)
        <div class="wall-item-bottom">
                <div class="wall-item-links"></div>
                <div class="wall-item-like" id="wall-item-like-$id">$like</div>
-               <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div>        
+               <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div>
+               {{ if $conv }}
+               <div class="wall-item-conv" id="wall-item-conv-$id" >
+                       <a href='$conv.href' id='context-$id' title='$conv.title'>$conv.title</a>
+               {{ endif }}
+               </div>
        </div>
+       
+       
 </div>
+
index 6310ff47e8f7f45ea2b9036656a1cdb937970403..1172df8b91d0e3890849e91f4bb148ff38ad3934 100755 (executable)
@@ -108,6 +108,7 @@ $suggestme
 {{inc field_intcheckbox.tpl with $field=$notify4 }}{{endinc}}
 {{inc field_intcheckbox.tpl with $field=$notify5 }}{{endinc}}
 {{inc field_intcheckbox.tpl with $field=$notify6 }}{{endinc}}
+{{inc field_intcheckbox.tpl with $field=$notify7 }}{{endinc}}
 </div>
 
 
diff --git a/view/theme/darkbubble/experimental b/view/theme/darkbubble/experimental
deleted file mode 100755 (executable)
index e69de29..0000000
index 79db0ec5aea614211f4dd6c368962a112c7e28fd..8dccf71ed09ed3bc11478983b70aecbc228ee86e 100755 (executable)
@@ -9,6 +9,33 @@ function initEditor(cb) {
     if (editor==false) {
         $("#profile-jot-text-loading").show();
                $("#jot-title-desc").show();
+ if(plaintext == 'none') {
+            $("#profile-jot-text-loading").hide();
+            $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
+            $(".jothidden").show();
+            editor = true;
+            $("a#jot-perms-icon").fancybox({
+                'transitionIn' : 'elastic',
+                'transitionOut' : 'elastic'
+            });
+                                   $("#profile-jot-submit-wrapper").show();
+                                                               {{ if $newpost }}
+                                   $("#profile-upload-wrapper").show();
+                                       $("#profile-attach-wrapper").show();
+                                   $("#profile-link-wrapper").show();
+                                       $("#profile-video-wrapper").show();
+                                   $("#profile-audio-wrapper").show();
+                                       $("#profile-location-wrapper").show();
+                                   $("#profile-nolocation-wrapper").show();
+                                       $("#profile-title-wrapper").show();
+                                       $("#profile-jot-plugin-wrapper").show();
+                                       $("#jot-preview-link").show();
+                                                               {{ endif }}   
+
+
+            if (typeof cb!="undefined") cb();
+            return;
+        }
         tinyMCE.init({
                 theme : "advanced",
                 mode : "specific_textareas",
@@ -132,7 +159,7 @@ function initEditor(cb) {
                                name: 'userfile',
                                onSubmit: function(file,ext) { $('#profile-rotator').show(); },
                                onComplete: function(file,response) {
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,response);
+                                       addeditortext(response);
                                        $('#profile-rotator').hide();
                                }                                
                        }
@@ -143,7 +170,7 @@ function initEditor(cb) {
                                name: 'userfile',
                                onSubmit: function(file,ext) { $('#profile-rotator').show(); },
                                onComplete: function(file,response) {
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,response);
+                                       addeditortext(response);
                                        $('#profile-rotator').hide();
                                }                                
                        }
@@ -190,7 +217,7 @@ function initEditor(cb) {
                        reply = bin2hex(reply);
                        $('#profile-rotator').show();
                        $.get('parse_url?binurl=' + reply, function(data) {
-                               tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                               addeditortext(data);
                                $('#profile-rotator').hide();
                        });
                }
@@ -199,21 +226,21 @@ function initEditor(cb) {
        function jotGetVideo() {
                reply = prompt("$utubeurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[youtube]' + reply + '[/youtube]');
+                       addeditortext('[youtube]' + reply + '[/youtube]');
                }
        }
 
        function jotVideoURL() {
                reply = prompt("$vidurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+                       addeditortext('[video]' + reply + '[/video]');
                }
        }
 
        function jotAudioURL() {
                reply = prompt("$audurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+                       addeditortext('[audio]' + reply + '[/audio]');
                }
        }
 
@@ -237,7 +264,7 @@ function initEditor(cb) {
                $.get('share/' + id, function(data) {
                                if (!editor) $("#profile-jot-text").val("");
                                initEditor(function(){
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                                       addeditortext(data);
                                        $('#like-rotator-' + id).hide();
                                        $(window).scrollTop(0);
                                });
@@ -260,7 +287,7 @@ function initEditor(cb) {
                        $.get('parse_url?binurl=' + reply, function(data) {
                                if (!editor) $("#profile-jot-text").val("");
                                initEditor(function(){
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                                       addeditortext(data);
                                        $('#profile-rotator').hide();
                                });
                        });
@@ -272,6 +299,15 @@ function initEditor(cb) {
                $('#profile-nolocation-wrapper').hide();
        }
 
+  function addeditortext(data) {
+        if(plaintext == 'none') {
+            var currentText = $("#profile-jot-text").val();
+            $("#profile-jot-text").val(currentText + data);
+        }
+        else
+            tinyMCE.execCommand('mceInsertRawHTML',false,data);
+    }
+
        $geotag
 
 </script>
index 0ceddb3b7be39aeaeddd143974114c29afe8047b..c312d221a1e89d5a22442ed883e3665f2f647d44 100755 (executable)
@@ -24,7 +24,6 @@
 
                 <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                 <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
-                {{ if $content }}<script>initEditor();</script>{{ endif }}
 
 
 <div id="profile-jot-submit-wrapper" style="display:none">
@@ -73,3 +72,4 @@
 <div id="profile-jot-end"></div>
 </form>
 </div>
+                {{ if $content }}<script>initEditor();</script>{{ endif }}
index f2807b36f1c6ab4aff2c5ccf12e242a83de0960e..5bc1450db4f5df88decec9bb1d66a61a749e344b 100755 (executable)
@@ -1291,3 +1291,11 @@ footer { display: block; margin: 50px 20%; clear: both; }
 .acpopupitem.selected {
        color: #2e3436; background-color: #eeeeec;
 }
+.qcomment {
+       opacity: 0;
+       filter:alpha(opacity=0);
+}
+.qcomment:hover {
+       opacity: 1.0;
+       filter:alpha(opacity=100);
+}
index 51431d4eb985d1fc18bbf7369adaf70365683c0c..9c3703f5fd93f47525d3d30e68732807d72f735e 100755 (executable)
@@ -29,7 +29,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
index 4b2b52b85f2fc804379706dc1df059c032736e66..95c68220ae14325e00b78a8819af7a7a0d3193b3 100755 (executable)
@@ -34,7 +34,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
diff --git a/view/theme/duepuntozero/comment_item.tpl b/view/theme/duepuntozero/comment_item.tpl
new file mode 100755 (executable)
index 0000000..b297352
--- /dev/null
@@ -0,0 +1,32 @@
+               <div class="comment-$wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
+                       <form class="comment-edit-form" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
+                               <input type="hidden" name="type" value="$type" />
+                               <input type="hidden" name="profile_uid" value="$profile_uid" />
+                               <input type="hidden" name="parent" value="$parent" />
+                               <input type="hidden" name="return" value="$return_path" />
+                               <input type="hidden" name="jsreload" value="$jsreload" />
+                               <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
+
+                               <div class="comment-edit-photo" id="comment-edit-photo-$id" >
+                                       <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
+                               </div>
+                               <div class="comment-edit-photo-end"></div>
+                               <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
+                               {{ if $qcomment }}
+                               {{ for $qcomment as $qc }}                              
+                                       <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+                                       &nbsp;
+                               {{ endfor }}
+                               {{ endif }}
+
+                               <div class="comment-edit-text-end"></div>
+                               <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
+                                       <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
+                                       <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
+                                       <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
+                               </div>
+
+                               <div class="comment-edit-end"></div>
+                       </form>
+
+               </div>
index ade1614b7190b879f71f9eab2f29eb099989b4ef..e356d1d8f86bd23aca05e9e886dd60aacef25cb8 100755 (executable)
@@ -18,7 +18,6 @@
                <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
 
-               {{ if $content }}<script>initEditor();</script>{{ endif }}
 
 <div id="profile-jot-submit-wrapper" class="jothidden">
        <input type="submit" id="profile-jot-submit" name="submit" value="$share" />
@@ -81,3 +80,4 @@
 <div id="profile-jot-end"></div>
 </form>
 </div>
+               {{ if $content }}<script>initEditor();</script>{{ endif }}
index 1a96e7f17f25a6db76dc045161f338528645ed3b..cf7505ad0f6fe26b4420e4f567d2a29f9077ac6d 100755 (executable)
@@ -809,6 +809,9 @@ input#dfrn-url {
        width: 120px;
        height: 120px;
 }
+#contacts-search-end {
+       margin-bottom: 10px;
+}
 
 .contact-entry-direction-icon {
        margin-top: 24px;
@@ -824,6 +827,7 @@ input#dfrn-url {
 .contact-entry-name {
        float: left;
        margin-left: 0px;
+       margin-right: 10px;
        width: 120px;
        overflow: hidden;
 }
@@ -2535,6 +2539,7 @@ aside input[type='text'] {
        margin-top: 15px;
 }
 
+#crepair-name-label,
 #crepair-nick-label,
 #crepair-attag-label,
 #crepair-url-label,
@@ -2548,6 +2553,7 @@ aside input[type='text'] {
        margin-bottom: 15px;
 }
 
+#crepair-name,
 #crepair-nick,
 #crepair-attag,
 #crepair-url,
@@ -2947,3 +2953,17 @@ div.jGrowl div.info {
   color: #ffffff;
   padding-left: 58px;
 }
+
+.qcomment {
+       border: 1px solid #EEE;
+       padding: 3px;
+}
+
+.qcomment {
+       opacity: 0;
+       filter:alpha(opacity=0);
+}
+.qcomment:hover {
+       opacity: 1.0;
+       filter:alpha(opacity=100);
+}
index 5d54a1d6a58663b3ea2b914e308d391e9ff0aa7d..a5136eed3a6421f9bdde983582fb9a24f620856b 100755 (executable)
@@ -42,7 +42,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
index 3ccd1224b21804d3832ea1fc17c863ab237f8755..ea9a218b42916c467ee0582c97482cb5155e2fcf 100755 (executable)
@@ -46,7 +46,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
diff --git a/view/theme/loozah/comment_item.tpl b/view/theme/loozah/comment_item.tpl
new file mode 100755 (executable)
index 0000000..b297352
--- /dev/null
@@ -0,0 +1,32 @@
+               <div class="comment-$wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
+                       <form class="comment-edit-form" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
+                               <input type="hidden" name="type" value="$type" />
+                               <input type="hidden" name="profile_uid" value="$profile_uid" />
+                               <input type="hidden" name="parent" value="$parent" />
+                               <input type="hidden" name="return" value="$return_path" />
+                               <input type="hidden" name="jsreload" value="$jsreload" />
+                               <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
+
+                               <div class="comment-edit-photo" id="comment-edit-photo-$id" >
+                                       <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
+                               </div>
+                               <div class="comment-edit-photo-end"></div>
+                               <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
+                               {{ if $qcomment }}
+                               {{ for $qcomment as $qc }}                              
+                                       <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+                                       &nbsp;
+                               {{ endfor }}
+                               {{ endif }}
+
+                               <div class="comment-edit-text-end"></div>
+                               <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
+                                       <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
+                                       <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
+                                       <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
+                               </div>
+
+                               <div class="comment-edit-end"></div>
+                       </form>
+
+               </div>
index 9bda1868e5dfb6849031bb0f3f6b74e6e171541d..ac64223fb0cb41d41c41c82537af16f4487848ab 100755 (executable)
@@ -19,7 +19,6 @@
                <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
 
-               {{ if $content }}<script>initEditor();</script>{{ endif }}
 
 <div id="profile-jot-submit-wrapper" style="display:none" class="jothidden">
 <input type="submit" id="profile-jot-submit" name="submit" value="$share" />
@@ -82,3 +81,4 @@
 <div id="profile-jot-end"></div>
 </form>
 </div>
+               {{ if $content }}<script>initEditor();</script>{{ endif }}
index e2b7c9c5ad378305b272017bf90592db31ca67e6..727e3d1c24edd2c15281202400de480378bb6206 100755 (executable)
@@ -36,7 +36,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
index aaa542760e7ab592f1e8db71c3aea6625ae78fdf..09de86c7be5d61b67089d87c3c288385248a9cda 100755 (executable)
@@ -40,7 +40,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
diff --git a/view/theme/quattro-green/colors.less b/view/theme/quattro-green/colors.less
new file mode 100755 (executable)
index 0000000..fd32b10
--- /dev/null
@@ -0,0 +1,94 @@
+// Quattro Theme LESS file
+
+// "Echo" palette from Inkscape
+@Blue1:rgb(25,174,255);
+@Blue2:rgb(0,132,200);
+@Blue3:rgb(0,92,148);
+@Red1:rgb(255,65,65);
+@Red2:rgb(220,0,0);
+@Red3:rgb(181,0,0);
+@Orange1:rgb(255,255,62);
+@Orange2:rgb(255,153,0);
+@Orange3:rgb(255,102,0);
+@Brown1:rgb(255,192,34);
+@Brown2:rgb(184,129,0);
+@Brown3:rgb(128,77,0);
+@Green1:rgb(204,255,66);
+@Green2:rgb(154,222,0);
+@Green3:rgb(0,145,0);
+@Purple1:rgb(241,202,255);
+@Purple2:rgb(215,108,255);
+@Purple3:rgb(186,0,255);
+@Metalic1:rgb(189,205,212);
+@Metalic2:rgb(158,171,176);
+@Metalic3:rgb(54,78,89);
+@Metalic4:rgb(14,35,46);
+@Grey1:rgb(255,255,255);
+@Grey2:rgb(204,204,204);
+@Grey3:rgb(153,153,153);
+@Grey4:rgb(102,102,102);
+@Grey5:rgb(45,45,45);
+
+
+// Theme colors
+@BodyBackground: @Grey1;
+@BodyColor:    @Grey5;
+
+@Link: @Green3;
+@LinkHover: @Green3;
+@LinkVisited: @Green3;
+
+
+@ButtonColor: @Grey1;
+@ButtonBackgroundColor: @Grey5;
+
+@Banner: @Grey1;
+
+@NavbarBackground:@Green3;
+@NavbarSelectedBg:@Metalic3;
+@NavbarSelectedBorder: @Metalic2;
+@NavbarNotifBg: @Red2;
+
+@Menu: @Grey5;
+@MenuBg: @Grey1;
+@MenuBorder: @Metalic3;
+@MenuItem: @Grey5;
+@MenuItemHoverBg: @Green1;
+@MenuItemSeparator: @Metalic2;
+@MenuEmpty: @Metalic2;
+@MenuItemDetail: @Metalic2;
+
+@AsideBorder: @Metalic1;
+@AsideConnect: @Grey1;
+@AsideConnectBg: @Green3;
+@AsideConnectHoverBg: @Green1;
+@VCardLabelColor: @Grey3;
+
+@InfoColor: @Grey1;
+@InfoBackgroundColor: @Metalic3;
+
+@NoticeColor: @Grey1;
+@NoticeBackgroundColor: #511919;
+
+@ThreadBackgroundColor: #f6f7f8;
+
+@CommentBoxEmptyColor: @Grey3;
+@CommentBoxEmptyBorderColor: @Grey3;
+@CommentBoxFullColor: @Grey5;
+@CommentBoxFullBorderColor: @Grey5;
+
+@TagColor: @Grey1;
+
+@JotToolsBackgroundColor: @Green3;
+@JotToolsBorderColor: @Metalic2;
+@JotToolsOverBackgroundColor: @Green2;
+@JotToolsOverBorderColor: @Metalic1;
+@JotToolsText: @Grey5;
+@JotSubmitBackgroundColor: @Grey2;
+@JotSubmitText: @Grey4;
+@JotSubmitOverBackgroundColor: @Green1;
+@JotSubmitOverText: @Grey4;
+@JotPermissionUnlockBackgroundColor: @Grey2;
+@JotPermissionLockBackgroundColor: @Grey4;
+@JotLoadingBackgroundColor: @Grey1;
+
diff --git a/view/theme/quattro-green/contact_template.tpl b/view/theme/quattro-green/contact_template.tpl
new file mode 100755 (executable)
index 0000000..f274965
--- /dev/null
@@ -0,0 +1,21 @@
+
+<div class="contact-wrapper" id="contact-entry-wrapper-$id" >
+       <div class="contact-photo-wrapper" >
+               <div class="contact-photo mframe" id="contact-entry-photo-$id"
+               onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('contact-photo-menu-button-$id')" onmouseout="t$id=setTimeout('closeMenu(\'contact-photo-menu-button-$id\'); closeMenu(\'contact-photo-menu-$id\');',200)" >
+
+                       <a href="$url" title="$img_hover" /><img src="$thumb" $sparkle alt="$name" /></a>
+
+                       <a href="#" rel="#contact-photo-menu-$id" class="contact-photo-menu-button icon s16 menu" id="contact-photo-menu-button-$id">menu</a>
+                       <ul class="contact-photo-menu menu-popup" id="contact-photo-menu-$id">
+                               $contact_photo_menu
+                       </ul>
+
+               </div>
+                       
+       </div>
+       <div class="contact-name" id="contact-entry-name-$id" >$name</div>
+
+
+</div>
+
diff --git a/view/theme/quattro-green/experimental b/view/theme/quattro-green/experimental
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/view/theme/quattro-green/style.css b/view/theme/quattro-green/style.css
new file mode 100755 (executable)
index 0000000..8dad509
--- /dev/null
@@ -0,0 +1,1374 @@
+/**
+ * Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ **/
+/* icons */
+.icon {
+  background-color: transparent ;
+  background-repeat: no-repeat;
+  background-position: left center;
+  display: block;
+  overflow: hidden;
+  text-indent: -9999px;
+  padding: 1px;
+}
+.icon.text {
+  text-indent: 0px;
+}
+.icon.s10 {
+  min-width: 10px;
+  height: 10px;
+}
+.icon.s10.notify {
+  background-image: url("../../../images/icons/10/notify_off.png");
+}
+.icon.s10.gear {
+  background-image: url("../../../images/icons/10/gear.png");
+}
+.icon.s10.add {
+  background-image: url("../../../images/icons/10/add.png");
+}
+.icon.s10.delete {
+  background-image: url("../../../images/icons/10/delete.png");
+}
+.icon.s10.edit {
+  background-image: url("../../../images/icons/10/edit.png");
+}
+.icon.s10.star {
+  background-image: url("../../../images/icons/10/star.png");
+}
+.icon.s10.menu {
+  background-image: url("../../../images/icons/10/menu.png");
+}
+.icon.s10.link {
+  background-image: url("../../../images/icons/10/link.png");
+}
+.icon.s10.lock {
+  background-image: url("../../../images/icons/10/lock.png");
+}
+.icon.s10.unlock {
+  background-image: url("../../../images/icons/10/unlock.png");
+}
+.icon.s10.text {
+  padding: 2px 0px 0px 15px;
+}
+.icon.s16 {
+  min-width: 16px;
+  height: 16px;
+}
+.icon.s16.notify {
+  background-image: url("../../../images/icons/16/notify_off.png");
+}
+.icon.s16.gear {
+  background-image: url("../../../images/icons/16/gear.png");
+}
+.icon.s16.add {
+  background-image: url("../../../images/icons/16/add.png");
+}
+.icon.s16.delete {
+  background-image: url("../../../images/icons/16/delete.png");
+}
+.icon.s16.edit {
+  background-image: url("../../../images/icons/16/edit.png");
+}
+.icon.s16.star {
+  background-image: url("../../../images/icons/16/star.png");
+}
+.icon.s16.menu {
+  background-image: url("../../../images/icons/16/menu.png");
+}
+.icon.s16.link {
+  background-image: url("../../../images/icons/16/link.png");
+}
+.icon.s16.lock {
+  background-image: url("../../../images/icons/16/lock.png");
+}
+.icon.s16.unlock {
+  background-image: url("../../../images/icons/16/unlock.png");
+}
+.icon.s16.text {
+  padding: 4px 0px 0px 20px;
+}
+.icon.s22 {
+  min-width: 22px;
+  height: 22px;
+}
+.icon.s22.notify {
+  background-image: url("../../../images/icons/22/notify_off.png");
+}
+.icon.s22.gear {
+  background-image: url("../../../images/icons/22/gear.png");
+}
+.icon.s22.add {
+  background-image: url("../../../images/icons/22/add.png");
+}
+.icon.s22.delete {
+  background-image: url("../../../images/icons/22/delete.png");
+}
+.icon.s22.edit {
+  background-image: url("../../../images/icons/22/edit.png");
+}
+.icon.s22.star {
+  background-image: url("../../../images/icons/22/star.png");
+}
+.icon.s22.menu {
+  background-image: url("../../../images/icons/22/menu.png");
+}
+.icon.s22.link {
+  background-image: url("../../../images/icons/22/link.png");
+}
+.icon.s22.lock {
+  background-image: url("../../../images/icons/22/lock.png");
+}
+.icon.s22.unlock {
+  background-image: url("../../../images/icons/22/unlock.png");
+}
+.icon.s22.text {
+  padding: 10px 0px 0px 25px;
+}
+.icon.s48 {
+  width: 48px;
+  height: 48px;
+}
+.icon.s48.notify {
+  background-image: url("../../../images/icons/48/notify_off.png");
+}
+.icon.s48.gear {
+  background-image: url("../../../images/icons/48/gear.png");
+}
+.icon.s48.add {
+  background-image: url("../../../images/icons/48/add.png");
+}
+.icon.s48.delete {
+  background-image: url("../../../images/icons/48/delete.png");
+}
+.icon.s48.edit {
+  background-image: url("../../../images/icons/48/edit.png");
+}
+.icon.s48.star {
+  background-image: url("../../../images/icons/48/star.png");
+}
+.icon.s48.menu {
+  background-image: url("../../../images/icons/48/menu.png");
+}
+.icon.s48.link {
+  background-image: url("../../../images/icons/48/link.png");
+}
+.icon.s48.lock {
+  background-image: url("../../../images/icons/48/lock.png");
+}
+.icon.s48.unlock {
+  background-image: url("../../../images/icons/48/unlock.png");
+}
+/* global */
+body {
+  font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
+  font-size: 11px;
+  background-color: #ffffff;
+  color: #2d2d2d;
+  margin: 50px 0px 0px 0px;
+  display: table;
+}
+h4 {
+  font-size: 1.1em;
+}
+a, a:link {
+  color: #009100;
+  text-decoration: none;
+}
+a:visited {
+  color: #009100;
+  text-decoration: none;
+}
+a:hover {
+  color: #009100;
+  text-decoration: underline;
+}
+.left {
+  float: left;
+}
+.right {
+  float: right;
+}
+.hidden {
+  display: none;
+}
+.clear {
+  clear: both;
+}
+.fakelink {
+  color: #009100;
+  text-decoration: none;
+  cursor: pointer;
+}
+.fakelink:hover {
+  color: #009100;
+  text-decoration: underline;
+}
+code {
+  font-family: Courier, monospace;
+  white-space: pre;
+  display: block;
+  overflow: auto;
+  border: 1px solid #444;
+  background: #EEE;
+  color: #444;
+  padding: 10px;
+  margin-top: 20px;
+}
+#panel {
+  position: absolute;
+  width: 10em;
+  background: #ffffff;
+  color: #2d2d2d;
+  margin: 0px;
+  padding: 1em;
+  list-style: none;
+  border: 3px solid #364e59;
+  z-index: 100000;
+  -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+  -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+  box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+/* tool */
+.tool {
+  height: auto;
+  overflow: auto;
+}
+.tool .label {
+  float: left;
+}
+.tool .action {
+  float: right;
+}
+/* popup notifications */
+div.jGrowl div.notice {
+  background: #511919 url("../../../images/icons/48/notice.png") no-repeat 5px center;
+  color: #ffffff;
+  padding-left: 58px;
+}
+div.jGrowl div.info {
+  background: #364e59 url("../../../images/icons/48/info.png") no-repeat 5px center;
+  color: #ffffff;
+  padding-left: 58px;
+}
+/* header */
+header {
+  position: fixed;
+  left: 43%;
+  right: 43%;
+  top: 0px;
+  margin: 0px;
+  padding: 0px;
+  /*width: 100%; height: 12px; */
+
+  z-index: 110;
+  color: #ffffff;
+}
+header #site-location {
+  display: none;
+}
+header #banner {
+  overflow: hidden;
+  text-align: center;
+  width: 100%;
+}
+header #banner a,
+header #banner a:active,
+header #banner a:visited,
+header #banner a:link,
+header #banner a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  outline: none;
+  vertical-align: bottom;
+}
+header #banner #logo-img {
+  height: 22px;
+  margin-top: 5px;
+}
+header #banner #logo-text {
+  font-size: 22px;
+}
+/* nav */
+nav {
+  width: 100%;
+  height: 32px;
+  position: fixed;
+  left: 0px;
+  top: 0px;
+  padding: 0px;
+  background-color: #009100;
+  color: #ffffff;
+  z-index: 100;
+  -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+  -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+}
+nav a,
+nav a:active,
+nav a:visited,
+nav a:link,
+nav a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  outline: none;
+}
+nav ul {
+  margin: 0px;
+  padding: 0px 20px;
+}
+nav ul li {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+  float: left;
+}
+nav ul li .menu-popup {
+  left: 0px;
+  right: auto;
+}
+nav .nav-menu-icon {
+  position: relative;
+  height: 22px;
+  padding: 5px;
+  margin: 0px 10px;
+  -moz-border-radius: 5px 5px 0 0;
+  -webkit-border-radius: 5px 5px 0 0;
+  border-radius: 5px 5px 0 0;
+}
+nav .nav-menu-icon.selected {
+  background-color: #364e59;
+}
+nav .nav-menu-icon img {
+  width: 22px;
+  height: 22px;
+}
+nav .nav-menu-icon .nav-notify {
+  top: 3px;
+}
+nav .nav-menu {
+  position: relative;
+  height: 16px;
+  padding: 5px;
+  margin: 3px 15px 0px;
+  font-size: 14px;
+  border-bottom: 3px solid #009100;
+}
+nav .nav-menu.selected {
+  border-bottom: 3px solid #9eabb0;
+}
+nav .nav-notify {
+  display: none;
+  position: absolute;
+  background-color: #dc0000;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+  font-size: 10px;
+  padding: 1px 3px;
+  top: 0px;
+  right: -10px;
+  min-width: 15px;
+  text-align: right;
+}
+nav .nav-notify.show {
+  display: block;
+}
+nav #nav-help-link,
+nav #nav-search-link,
+nav #nav-directory-link,
+nav #nav-apps-link,
+nav #nav-site-linkmenu {
+  float: right;
+}
+nav #nav-help-link .menu-popup,
+nav #nav-search-link .menu-popup,
+nav #nav-directory-link .menu-popup,
+nav #nav-apps-link .menu-popup,
+nav #nav-site-linkmenu .menu-popup {
+  right: 0px;
+  left: auto;
+}
+nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-linkmenu.selected .icon.s22.notify {
+  background-image: url("../../../images/icons/22/notify_on.png");
+}
+nav #nav-apps-link.selected {
+  background-color: #364e59;
+}
+ul.menu-popup {
+  position: absolute;
+  display: none;
+  width: 10em;
+  background: #ffffff;
+  color: #2d2d2d;
+  margin: 0px;
+  padding: 0px;
+  list-style: none;
+  border: 3px solid #364e59;
+  z-index: 100000;
+  -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+  -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+  box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+ul.menu-popup a {
+  display: block;
+  color: #2d2d2d;
+  padding: 5px 10px;
+  text-decoration: none;
+}
+ul.menu-popup a:hover {
+  background-color: #ccff42;
+}
+ul.menu-popup .menu-sep {
+  border-top: 1px solid #9eabb0;
+}
+ul.menu-popup li {
+  float: none;
+  overflow: auto;
+  height: auto;
+  display: block;
+}
+ul.menu-popup li img {
+  float: left;
+  width: 16px;
+  height: 16px;
+  padding-right: 5px;
+}
+ul.menu-popup .empty {
+  padding: 5px;
+  text-align: center;
+  color: #9eabb0;
+}
+/* autocomplete popup */
+.acpopup {
+  max-height: 150px;
+  background-color: #ffffff;
+  color: #2d2d2d;
+  border: 1px solid #MenuBorder;
+  overflow: auto;
+  z-index: 100000;
+  -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+  -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+  box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+.acpopupitem {
+  color: #2d2d2d;
+  padding: 4px;
+  clear: left;
+}
+.acpopupitem img {
+  float: left;
+  margin-right: 4px;
+}
+.acpopupitem.selected {
+  background-color: #ccff42;
+}
+#nav-notifications-menu {
+  width: 400px;
+  max-height: 550px;
+  overflow: auto;
+}
+#nav-notifications-menu img {
+  float: left;
+  margin-right: 5px;
+}
+#nav-notifications-menu .contactname {
+  font-weight: bold;
+}
+#nav-notifications-menu .notif-when {
+  font-size: 10px;
+  color: #9eabb0;
+  display: block;
+}
+/* aside */
+aside {
+  display: table-cell;
+  vertical-align: top;
+  width: 200px;
+  padding: 0px 10px 0px 20px;
+  border-right: 1px solid #bdcdd4;
+}
+aside .vcard .fn {
+  font-size: 16px;
+  font-weight: bold;
+  margin-bottom: 5px;
+}
+aside .vcard .title {
+  margin-bottom: 5px;
+}
+aside .vcard dl {
+  height: auto;
+  overflow: auto;
+}
+aside .vcard dt {
+  float: left;
+  margin-left: 0px;
+  width: 35%;
+  text-align: right;
+  color: #999999;
+}
+aside .vcard dd {
+  float: left;
+  margin-left: 4px;
+  width: 60%;
+}
+aside #profile-extra-links ul {
+  padding: 0px;
+  margin: 0px;
+}
+aside #profile-extra-links li {
+  padding: 0px;
+  margin: 0px;
+  list-style: none;
+}
+aside #dfrn-request-link {
+  display: block;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+  color: #ffffff;
+  background: #009100 url('../../../images/connect-bg.png') no-repeat left center;
+  font-weight: bold;
+  text-transform: uppercase;
+  padding: 4px 2px 2px 35px;
+}
+aside #dfrn-request-link:hover {
+  text-decoration: none;
+  background-color: #ccff42;
+}
+aside #profiles-menu {
+  width: 20em;
+}
+#contact-block {
+  overflow: auto;
+  height: auto;
+}
+#contact-block .contact-block-h4 {
+  float: left;
+  margin: 5px 0px;
+}
+#contact-block .allcontact-link {
+  float: right;
+  margin: 5px 0px;
+}
+#contact-block .contact-block-content {
+  clear: both;
+  overflow: auto;
+  height: auto;
+}
+#contact-block .contact-block-link {
+  float: left;
+  margin: 0px 2px 2px 0px;
+}
+#contact-block .contact-block-link img {
+  widht: 48px;
+  height: 58px;
+}
+/* group member */
+#contact-edit-drop-link, .mail-list-delete-wrapper, .group-delete-wrapper {
+  float: right;
+  margin-right: 50px;
+}
+#contact-edit-drop-link .drophide, .mail-list-delete-wrapper .drophide, .group-delete-wrapper .drophide {
+  background-image: url('../../../images/icons/22/delete.png');
+  display: block;
+  width: 22px;
+  height: 22px;
+  opacity: 0.3;
+  position: relative;
+  top: -50px;
+}
+#contact-edit-drop-link .drop, .mail-list-delete-wrapper .drop, .group-delete-wrapper .drop {
+  background-image: url('../../../images/icons/22/delete.png');
+  display: block;
+  width: 22px;
+  height: 22px;
+  position: relative;
+  top: -50px;
+}
+#group-members {
+  margin-top: 20px;
+  padding: 10px;
+  height: 250px;
+  overflow: auto;
+  border: 1px solid #ddd;
+}
+#group-members-end {
+  clear: both;
+}
+#group-all-contacts {
+  padding: 10px;
+  height: 450px;
+  overflow: auto;
+  border: 1px solid #ddd;
+}
+#group-all-contacts-end {
+  clear: both;
+  margin-bottom: 10px;
+}
+.contact-block-div {
+  float: left;
+  width: 52px;
+  height: 52px;
+}
+/* widget */
+.widget {
+  margin-bottom: 2em;
+  /*.action .s10 { width: 10px; overflow: hidden; padding: 0px;}
+       .action .s16 { width: 16px; overflow: hidden; padding: 0px;}*/
+
+}
+.widget h3 {
+  padding: 0px;
+  margin: 2px;
+}
+.widget .action {
+  opacity: 0.1;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.widget input.action {
+  opacity: 0.5;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.widget:hover .title .action {
+  opacity: 1;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.widget .tool:hover .action {
+  opacity: 1;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.widget .tool:hover .action.ticked {
+  opacity: 1;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.widget ul {
+  padding: 0px;
+}
+.widget ul li {
+  padding-left: 16px;
+  min-height: 16px;
+  list-style: none;
+}
+.widget .tool.selected {
+  background: url('../../../images/selected.png') no-repeat left center;
+}
+/* widget: search */
+#add-search-popup {
+  width: 200px;
+  top: 18px;
+}
+/* section */
+section {
+  display: table-cell;
+  vertical-align: top;
+  width: 800px;
+  padding: 0px 20px 0px 10px;
+}
+/* wall item */
+.tread-wrapper {
+  background-color: #f6f7f8;
+  position: relative;
+  padding: 10px;
+  margin-bottom: 20px;
+  width: 780px;
+}
+.wall-item-decor {
+  position: absolute;
+  left: 790px;
+  top: -10px;
+  width: 16px;
+}
+.unstarred {
+  display: none;
+}
+.wall-item-container {
+  display: table;
+  width: 780px;
+}
+.wall-item-container .wall-item-item, .wall-item-container .wall-item-bottom {
+  display: table-row;
+}
+.wall-item-container .wall-item-bottom {
+  opacity: 0.5;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.wall-item-container:hover .wall-item-bottom {
+  opacity: 1;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.wall-item-container .wall-item-info {
+  display: table-cell;
+  vertical-align: top;
+  text-align: left;
+  width: 60px;
+}
+.wall-item-container .wall-item-location {
+  word-wrap: break-word;
+  width: 50px;
+}
+.wall-item-container .wall-item-content {
+  display: table-cell;
+  font-size: 12px;
+  max-width: 720px;
+  word-wrap: break-word;
+}
+.wall-item-container .wall-item-content img {
+  max-width: 710px;
+}
+.wall-item-container .wall-item-links, .wall-item-container .wall-item-actions {
+  display: table-cell;
+  vertical-align: middle;
+}
+.wall-item-container .wall-item-links .icon, .wall-item-container .wall-item-actions .icon {
+  opacity: 0.5;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.wall-item-container .wall-item-links .icon:hover, .wall-item-container .wall-item-actions .icon:hover {
+  opacity: 1;
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  -ms-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+.wall-item-container .wall-item-ago {
+  padding-right: 40px;
+}
+.wall-item-container .wall-item-name {
+  font-weight: bold;
+}
+.wall-item-container .wall-item-actions-author {
+  float: left;
+  width: 20em;
+  margin-top: 0.5em;
+}
+.wall-item-container .wall-item-actions-social {
+  float: left;
+  margin-top: 0.5em;
+}
+.wall-item-container .wall-item-actions-social a {
+  margin-right: 3em;
+}
+.wall-item-container .wall-item-actions-tools {
+  float: right;
+  width: 15%;
+}
+.wall-item-container .wall-item-actions-tools a {
+  float: right;
+}
+.wall-item-container .wall-item-actions-tools input {
+  float: right;
+}
+.wall-item-container.comment {
+  /*margin-top: 50px;*/
+
+}
+.wall-item-container.comment .contact-photo {
+  width: 32px;
+  height: 32px;
+  margin-left: 16px;
+  /*background: url(../../../images/icons/22/user.png) no-repeat center center;*/
+
+}
+.wall-item-container.comment .contact-photo-menu-button {
+  top: 15px !important;
+  left: 15px !important;
+}
+.wall-item-container.comment .wall-item-links {
+  padding-left: 12px;
+}
+.wall-item-comment-wrapper {
+  margin: 30px 2em 2em 60px;
+}
+.wall-item-comment-wrapper .comment-edit-photo {
+  display: none;
+}
+.wall-item-comment-wrapper textarea {
+  height: 1em;
+  width: 100%;
+  font-size: 10px;
+  color: #999999;
+  border: 1px solid #999999;
+  padding: 0.3em;
+}
+.wall-item-comment-wrapper .comment-edit-text-full {
+  font-size: 14px;
+  height: 4em;
+  color: #2d2d2d;
+  border: 1px solid #2d2d2d;
+}
+.comment-edit-preview {
+  width: 710px;
+  border: 1px solid #2d2d2d;
+  margin-top: 10px;
+}
+.comment-edit-preview .contact-photo {
+  width: 32px;
+  height: 32px;
+  margin-left: 16px;
+  /*background: url(../../../images/icons/22/user.png) no-repeat center center;*/
+
+}
+.comment-edit-preview .contact-photo-menu-button {
+  top: 15px !important;
+  left: 15px !important;
+}
+.comment-edit-preview .wall-item-links {
+  padding-left: 12px;
+}
+.comment-edit-preview .wall-item-container {
+  width: 700px;
+}
+.comment-edit-preview .tread-wrapper {
+  width: 700px;
+  padding: 0;
+  margin: 10px 0;
+}
+.wall-item-tags {
+  padding-top: 5px;
+}
+.tag {
+  background: url("../../../images/tag_b.png") no-repeat center left;
+  color: #ffffff;
+  padding-left: 3px;
+}
+.tag a {
+  padding-right: 8px;
+  background: url("../../../images/tag.png") no-repeat center right;
+  color: #ffffff;
+}
+.wwto {
+  position: absolute !important;
+  width: 25px;
+  height: 25px;
+  background: #FFFFFF;
+  border: 2px solid #364e59;
+  height: 25px;
+  width: 25px;
+  overflow: hidden;
+  padding: 1px;
+  position: absolute !important;
+  top: 40px;
+  left: 30px;
+  -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+  -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+}
+.wwto .contact-photo {
+  width: 25px;
+  height: 25px;
+}
+#pause {
+  position: fixed;
+  bottom: 5px;
+  right: 5px;
+}
+/* contacts menu */
+.contact-photo-wrapper {
+  position: relative;
+}
+.contact-photo {
+  width: 48px;
+  height: 48px;
+  overflow: hidden;
+  display: block;
+}
+.contact-photo img {
+  width: 48px;
+  height: 48px;
+}
+.contact-photo-menu-button {
+  display: none;
+  position: absolute;
+  left: -2px;
+  top: 31px;
+}
+.contact-wrapper {
+  float: left;
+  width: 90px;
+  height: 90px;
+  margin-bottom: 15px;
+}
+.contact-wrapper .contact-photo {
+  width: 80px;
+  height: 80px;
+}
+.contact-wrapper .contact-photo img {
+  width: 80px;
+  height: 80px;
+}
+.contact-wrapper .contact-photo-menu-button {
+  left: 0px;
+  top: 63px;
+}
+.directory-item {
+  float: left;
+  width: 200px;
+  height: 200px;
+}
+.directory-item .contact-photo {
+  width: 175px;
+  height: 175px;
+}
+.directory-item .contact-photo img {
+  width: 175px;
+  height: 175px;
+}
+.contact-name {
+  text-align: center;
+  font-weight: bold;
+}
+.contact-details {
+  color: #999999;
+}
+/* editor */
+.jothidden {
+  display: none;
+}
+#jot {
+  width: 100%;
+  margin: 0px 2em 20px 0px;
+}
+#jot .profile-jot-text {
+  height: 1em;
+  width: 99%;
+  font-size: 10px;
+  color: #999999;
+  border: 1px solid #999999;
+  padding: 0.3em;
+}
+#jot #jot-tools {
+  margin: 0px;
+  padding: 0px;
+  height: 40px;
+  overflow: none;
+  width: 800px;
+  background-color: #009100;
+  border-bottom: 2px solid #9eabb0;
+}
+#jot #jot-tools li {
+  list-style: none;
+  float: left;
+  width: 80px;
+  height: 40px;
+  border-bottom: 2px solid #9eabb0;
+}
+#jot #jot-tools li a {
+  display: block;
+  color: #2d2d2d;
+  width: 100%;
+  height: 40px;
+  text-align: center;
+  line-height: 40px;
+  overflow: hidden;
+}
+#jot #jot-tools li:hover {
+  background-color: #9ade00;
+  border-bottom: 2px solid #bdcdd4;
+}
+#jot #jot-tools li.perms {
+  float: right;
+  width: 40px;
+}
+#jot #jot-tools li.perms a.unlock {
+  width: 30px;
+  border-left: 10px solid #cccccc;
+  background-color: #cccccc;
+}
+#jot #jot-tools li.perms a.lock {
+  width: 30px;
+  border-left: 10px solid #666666;
+  background-color: #666666;
+}
+#jot #jot-tools li.submit {
+  float: right;
+  background-color: #cccccc;
+  border-bottom: 2px solid #cccccc;
+  border-right: 1px solid #666666;
+  border-left: 1px solid #666666;
+}
+#jot #jot-tools li.submit input {
+  border: 0px;
+  margin: 0px;
+  padding: 0px;
+  background-color: #cccccc;
+  color: #666666;
+  width: 80px;
+  height: 40px;
+  line-height: 40px;
+}
+#jot #jot-tools li.submit input:hover {
+  background-color: #ccff42;
+  color: #666666;
+}
+#jot #jot-tools li.loading {
+  float: right;
+  background-color: #ffffff;
+  width: 20px;
+  vertical-align: center;
+  text-align: center;
+  border-top: 2px solid #9eabb0;
+  height: 38px;
+}
+#jot #jot-tools li.loading img {
+  margin-top: 10px;
+}
+#jot #jot-title {
+  border: 0px;
+  margin: 0px;
+  height: 20px;
+  width: 700px;
+  font-weight: bold;
+  border: 1px solid #ffffff;
+}
+#jot #jot-title:-webkit-input-placeholder {
+  font-weight: normal;
+}
+#jot #jot-title:-moz-placeholder {
+  font-weight: normal;
+}
+#jot #jot-title:hover {
+  border: 1px solid #999999;
+}
+#jot #jot-title:focus {
+  border: 1px solid #999999;
+}
+#jot #character-counter {
+  width: 80px;
+  float: right;
+  text-align: right;
+  height: 20px;
+  line-height: 20px;
+  padding-right: 20px;
+}
+/** buttons **/
+/*input[type="submit"] {
+       border: 0px;
+    background-color: @ButtonBackgroundColor;
+    color: @ButtonColor;
+    padding: 0px 10px;
+       .rounded(5px);
+    height: 18px;
+}*/
+/** acl **/
+#photo-edit-perms-select, #photos-upload-permissions-wrapper, #profile-jot-acl-wrapper {
+  display: block!important;
+}
+#acl-wrapper {
+  width: 690px;
+  float: left;
+}
+#acl-search {
+  float: right;
+  background: #ffffff url("../../../images/search_18.png") no-repeat right center;
+  padding-right: 20px;
+}
+#acl-showall {
+  float: left;
+  display: block;
+  width: auto;
+  height: 18px;
+  background-color: #cccccc;
+  background-image: url("../../../images/show_all_off.png");
+  background-position: 7px 7px;
+  background-repeat: no-repeat;
+  padding: 7px 5px 0px 30px;
+  color: #999999;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+#acl-showall.selected {
+  color: #000000;
+  background-color: #ff9900;
+  background-image: url("../../../images/show_all_on.png");
+}
+#acl-list {
+  height: 210px;
+  border: 1px solid #cccccc;
+  clear: both;
+  margin-top: 30px;
+  overflow: auto;
+}
+.acl-list-item {
+  display: block;
+  width: 150px;
+  height: 30px;
+  border: 1px solid #cccccc;
+  margin: 5px;
+  float: left;
+}
+.acl-list-item img {
+  width: 22px;
+  height: 22px;
+  float: left;
+  margin: 4px;
+}
+.acl-list-item p {
+  height: 12px;
+  font-size: 10px;
+  margin: 0px;
+  padding: 2px 0px 1px;
+  overflow: hidden;
+}
+.acl-list-item a {
+  font-size: 8px;
+  display: block;
+  width: 40px;
+  height: 10px;
+  float: left;
+  color: #999999;
+  background-color: #cccccc;
+  background-position: 3px 3px;
+  background-repeat: no-repeat;
+  margin-right: 5px;
+  -webkit-border-radius: 2px ;
+  -moz-border-radius: 2px;
+  border-radius: 2px;
+  padding-left: 15px;
+}
+#acl-wrapper a:hover {
+  text-decoration: none;
+  color: #000000;
+}
+.acl-button-show {
+  background-image: url("../../../images/show_off.png");
+}
+.acl-button-hide {
+  background-image: url("../../../images/hide_off.png");
+}
+.acl-button-show.selected {
+  color: #000000;
+  background-color: #9ade00;
+  background-image: url("../../../images/show_on.png");
+}
+.acl-button-hide.selected {
+  color: #000000;
+  background-color: #ff4141;
+  background-image: url("../../../images/hide_on.png");
+}
+.acl-list-item.groupshow {
+  border-color: #9ade00;
+}
+.acl-list-item.grouphide {
+  border-color: #ff4141;
+}
+/** /acl **/
+/** tab buttons **/
+ul.tabs {
+  list-style-type: none;
+  padding-bottom: 10px;
+}
+ul.tabs li {
+  float: left;
+  margin-left: 20px;
+}
+ul.tabs li .active {
+  border-bottom: 1px solid #009100;
+}
+/**
+ * Form fields
+ */
+.field {
+  margin-bottom: 10px;
+  padding-bottom: 10px;
+  overflow: auto;
+  width: 100%;
+}
+.field label {
+  float: left;
+  width: 200px;
+}
+.field input, .field textarea {
+  width: 400px;
+}
+.field textarea {
+  height: 100px;
+}
+.field .field_help {
+  display: block;
+  margin-left: 200px;
+  color: #666666;
+}
+.field .onoff {
+  float: left;
+  width: 80px;
+}
+.field .onoff a {
+  display: block;
+  border: 1px solid #666666;
+  background-image: url("../../../images/onoff.jpg");
+  background-repeat: no-repeat;
+  padding: 4px 2px 2px 2px;
+  height: 16px;
+  text-decoration: none;
+}
+.field .onoff .off {
+  border-color: #666666;
+  padding-left: 40px;
+  background-position: left center;
+  background-color: #cccccc;
+  color: #666666;
+  text-align: right;
+}
+.field .onoff .on {
+  border-color: #204A87;
+  padding-right: 40px;
+  background-position: right center;
+  background-color: #D7E3F1;
+  color: #204A87;
+  text-align: left;
+}
+.field .hidden {
+  display: none!important;
+}
+.field.radio .field_help {
+  margin-left: 0px;
+}
+#profile-edit-links li {
+  list-style: none;
+  margin-top: 10px;
+}
+#profile-edit-default-desc {
+  color: #FF0000;
+  border: 1px solid #FF8888;
+  background-color: #FFEEEE;
+  padding: 7px;
+}
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-with-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-gender-select,
+#profile-edit-homepage-label {
+  float: left;
+  width: 175px;
+  padding-top: 7px;
+}
+#profile-edit-profile-name,
+#profile-edit-name,
+#gender-select,
+#profile-edit-pdesc,
+#profile-edit-gender,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#profile-edit-marital,
+#profile-edit-with,
+#profile-edit-sexual,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-edit-homepage {
+  margin-top: 5px;
+}
+/* oauth */
+.oauthapp {
+  height: auto;
+  overflow: auto;
+  border-bottom: 2px solid #cccccc;
+  padding-bottom: 1em;
+  margin-bottom: 1em;
+}
+.oauthapp img {
+  float: left;
+  width: 48px;
+  height: 48px;
+  margin: 10px;
+}
+.oauthapp img.noicon {
+  background-image: url("../../../images/icons/48/plugin.png");
+  background-position: center center;
+  background-repeat: no-repeat;
+}
+.oauthapp a {
+  float: left;
+}
+/* contacts */
+.contact-entry-wrapper {
+  width: 50px;
+  float: left;
+}
+/* photo */
+.lframe {
+  float: left;
+  margin: 0px 10px 10px 0px;
+}
+/* profile match wrapper */
+.profile-match-wrapper {
+  float: left;
+  width: 90px;
+  height: 90px;
+  margin-bottom: 20px;
+}
+.profile-match-wrapper .contact-photo {
+  width: 80px;
+  height: 80px;
+}
+.profile-match-wrapper .contact-photo img {
+  width: 80px;
+  height: 80px;
+}
+.profile-match-wrapper .contact-photo-menu-button {
+  left: 0px;
+  top: 63px;
+}
+/* page footer */
+footer {
+  height: 100px;
+  display: table-row;
+}
+.pager {
+  margin-top: 25px;
+  clear: both;
+}
diff --git a/view/theme/quattro-green/style.less b/view/theme/quattro-green/style.less
new file mode 100755 (executable)
index 0000000..f8b0bb3
--- /dev/null
@@ -0,0 +1,14 @@
+/**
+ * Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ **/
+// Less file http://lesscss.org/
+// compile with lessc
+// $ lessc style.less > style.css
+
+@import "colors";
+@import "../quattro/icons";
+@import "../quattro/quattro";
+
+
+
+
index f87327703fb9a1324bbafcc14cfe169f8df9402b..e314fba1fdd29d20ca5da45c053775daba8ce0c3 100755 (executable)
        &.link          { background-image: url("../../../images/icons/@{size}/link.png"); }
        &.lock          { background-image: url("../../../images/icons/@{size}/lock.png"); }
        &.unlock        { background-image: url("../../../images/icons/@{size}/unlock.png"); }
+       &.type-unkn     { background-image: url("../../../images/icons/@{size}/zip.png"); }
+       &.type-audio{ background-image: url("../../../images/icons/@{size}/audio.png"); }
+       &.type-video{ background-image: url("../../../images/icons/@{size}/video.png"); }
+       &.type-image{ background-image: url("../../../images/icons/@{size}/image.png"); }
+       &.type-text     { background-image: url("../../../images/icons/@{size}/text.png"); }
        
 }
 
index 8fcf7f8171e69d50053fbf401fc354b69d9dcc0a..ac84e0eff7cbb2fc879eb0aff14e00a3521de7ec 100755 (executable)
@@ -318,7 +318,51 @@ aside {
        }
 }
 
-
+/* group member */
+#contact-edit-drop-link,
+.mail-list-delete-wrapper,
+.group-delete-wrapper {
+       float: right;
+       margin-right: 50px;
+        .drophide {
+            background-image: url('../../../images/icons/22/delete.png');
+            display: block; width: 22px; height: 22px;
+            opacity: 0.3;
+            position: relative;
+            top: -50px;
+        }
+        .drop {
+            background-image: url('../../../images/icons/22/delete.png');
+            display: block; width: 22px; height: 22px;
+            position: relative;
+            top: -50px;
+        }
+}
+#group-members {
+       margin-top: 20px;
+       padding: 10px;
+       height: 250px;
+       overflow: auto;
+       border: 1px solid #ddd;
+}
+#group-members-end {
+       clear: both;
+}
+#group-all-contacts {
+       padding: 10px;
+       height: 450px;
+       overflow: auto;
+       border: 1px solid #ddd;
+}
+#group-all-contacts-end {
+       clear: both;
+       margin-bottom: 10px;
+}
+.contact-block-div {
+       float: left;
+       width: 52px;
+       height: 52px;
+}
 /* widget */
 .widget {
        margin-bottom: 2em;
@@ -503,6 +547,13 @@ section {
 }
 .wwto .contact-photo { width: 25px; height: 25px; }
 
+
+#pause {
+ position: fixed;
+ bottom: 5px;
+ right: 5px;
+}
+
 /* contacts menu */
 .contact-photo-wrapper { position: relative; }
 .contact-photo { 
@@ -852,6 +903,58 @@ ul.tabs {
 
 #profile-edit-links li {
        list-style: none;
+        margin-top: 10px;
+}
+
+#profile-edit-default-desc {
+       color: #FF0000;
+       border: 1px solid #FF8888;
+       background-color: #FFEEEE;
+       padding: 7px;
+}
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-with-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-gender-select,
+#profile-edit-homepage-label {
+       float: left;
+       width: 175px;
+        padding-top: 7px;
+}
+#profile-edit-profile-name,
+#profile-edit-name,
+#gender-select, 
+#profile-edit-pdesc,
+#profile-edit-gender,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#profile-edit-marital,
+#profile-edit-with,
+#profile-edit-sexual,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-edit-homepage {
+    margin-top: 5px;
 }
 
 /* oauth */
@@ -910,3 +1013,4 @@ footer { height: 100px; display: table-row; }
     margin-top: 25px;
     clear: both;
 }
+
index 3f90f8915731ee8495fa3fd3e943339ccbd670eb..4c24ade8ea7aaf40ce67de38400cd7516c2199a3 100755 (executable)
 .icon.s10.unlock {
   background-image: url("../../../images/icons/10/unlock.png");
 }
+.icon.s10.type-unkn {
+  background-image: url("../../../images/icons/10/zip.png");
+}
+.icon.s10.type-audio {
+  background-image: url("../../../images/icons/10/audio.png");
+}
+.icon.s10.type-video {
+  background-image: url("../../../images/icons/10/video.png");
+}
+.icon.s10.type-image {
+  background-image: url("../../../images/icons/10/image.png");
+}
+.icon.s10.type-text {
+  background-image: url("../../../images/icons/10/text.png");
+}
 .icon.s10.text {
   padding: 2px 0px 0px 15px;
 }
 .icon.s16.unlock {
   background-image: url("../../../images/icons/16/unlock.png");
 }
+.icon.s16.type-unkn {
+  background-image: url("../../../images/icons/16/zip.png");
+}
+.icon.s16.type-audio {
+  background-image: url("../../../images/icons/16/audio.png");
+}
+.icon.s16.type-video {
+  background-image: url("../../../images/icons/16/video.png");
+}
+.icon.s16.type-image {
+  background-image: url("../../../images/icons/16/image.png");
+}
+.icon.s16.type-text {
+  background-image: url("../../../images/icons/16/text.png");
+}
 .icon.s16.text {
   padding: 4px 0px 0px 20px;
 }
 .icon.s22.unlock {
   background-image: url("../../../images/icons/22/unlock.png");
 }
+.icon.s22.type-unkn {
+  background-image: url("../../../images/icons/22/zip.png");
+}
+.icon.s22.type-audio {
+  background-image: url("../../../images/icons/22/audio.png");
+}
+.icon.s22.type-video {
+  background-image: url("../../../images/icons/22/video.png");
+}
+.icon.s22.type-image {
+  background-image: url("../../../images/icons/22/image.png");
+}
+.icon.s22.type-text {
+  background-image: url("../../../images/icons/22/text.png");
+}
 .icon.s22.text {
   padding: 10px 0px 0px 25px;
 }
 .icon.s48.unlock {
   background-image: url("../../../images/icons/48/unlock.png");
 }
+.icon.s48.type-unkn {
+  background-image: url("../../../images/icons/48/zip.png");
+}
+.icon.s48.type-audio {
+  background-image: url("../../../images/icons/48/audio.png");
+}
+.icon.s48.type-video {
+  background-image: url("../../../images/icons/48/video.png");
+}
+.icon.s48.type-image {
+  background-image: url("../../../images/icons/48/image.png");
+}
+.icon.s48.type-text {
+  background-image: url("../../../images/icons/48/text.png");
+}
 /* global */
 body {
   font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
@@ -564,6 +624,53 @@ aside #profiles-menu {
   widht: 48px;
   height: 58px;
 }
+/* group member */
+#contact-edit-drop-link, .mail-list-delete-wrapper, .group-delete-wrapper {
+  float: right;
+  margin-right: 50px;
+}
+#contact-edit-drop-link .drophide, .mail-list-delete-wrapper .drophide, .group-delete-wrapper .drophide {
+  background-image: url('../../../images/icons/22/delete.png');
+  display: block;
+  width: 22px;
+  height: 22px;
+  opacity: 0.3;
+  position: relative;
+  top: -50px;
+}
+#contact-edit-drop-link .drop, .mail-list-delete-wrapper .drop, .group-delete-wrapper .drop {
+  background-image: url('../../../images/icons/22/delete.png');
+  display: block;
+  width: 22px;
+  height: 22px;
+  position: relative;
+  top: -50px;
+}
+#group-members {
+  margin-top: 20px;
+  padding: 10px;
+  height: 250px;
+  overflow: auto;
+  border: 1px solid #ddd;
+}
+#group-members-end {
+  clear: both;
+}
+#group-all-contacts {
+  padding: 10px;
+  height: 450px;
+  overflow: auto;
+  border: 1px solid #ddd;
+}
+#group-all-contacts-end {
+  clear: both;
+  margin-bottom: 10px;
+}
+.contact-block-div {
+  float: left;
+  width: 52px;
+  height: 52px;
+}
 /* widget */
 .widget {
   margin-bottom: 2em;
@@ -844,6 +951,11 @@ section {
   width: 25px;
   height: 25px;
 }
+#pause {
+  position: fixed;
+  bottom: 5px;
+  right: 5px;
+}
 /* contacts menu */
 .contact-photo-wrapper {
   position: relative;
@@ -1208,6 +1320,57 @@ ul.tabs li .active {
 }
 #profile-edit-links li {
   list-style: none;
+  margin-top: 10px;
+}
+#profile-edit-default-desc {
+  color: #FF0000;
+  border: 1px solid #FF8888;
+  background-color: #FFEEEE;
+  padding: 7px;
+}
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-with-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-gender-select,
+#profile-edit-homepage-label {
+  float: left;
+  width: 175px;
+  padding-top: 7px;
+}
+#profile-edit-profile-name,
+#profile-edit-name,
+#gender-select,
+#profile-edit-pdesc,
+#profile-edit-gender,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#profile-edit-marital,
+#profile-edit-with,
+#profile-edit-sexual,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-edit-homepage {
+  margin-top: 5px;
 }
 /* oauth */
 .oauthapp {
index cad572f4ea5ae3466bdfbe7f22faddab5035e95d..bc75eb1a6762b4842f748f5ca606b83670b0e366 100755 (executable)
                                        <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
                                </div>
                                <div class="comment-edit-photo-end"></div>
+                               {{ if $qcomment }}
+                               {{ for $qcomment as $qc }}                              
+                                       <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+                                       &nbsp;
+                               {{ endfor }}
+                               {{ endif }}
+
                                <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
 
                                <div class="comment-edit-text-end"></div>
index 0d9a824f750b1c0078cb9180a95b87076bb962b7..b44ea78fddafb53a105cb5fe07192f4d7e9f5928 100755 (executable)
@@ -4,10 +4,38 @@
 
 var editor=false;
 var textlen = 0;
+var plaintext = '$editselect';
 
 function initEditor(cb) {
     if (editor==false) {
         $("#profile-jot-text-loading").show();
+ if(plaintext == 'none') {
+            $("#profile-jot-text-loading").hide();
+            $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
+            $(".jothidden").show();
+            editor = true;
+            $("a#jot-perms-icon").fancybox({
+                'transitionIn' : 'elastic',
+                'transitionOut' : 'elastic'
+            });
+                                   $("#profile-jot-submit-wrapper").show();
+                                                               {{ if $newpost }}
+                                   $("#profile-upload-wrapper").show();
+                                       $("#profile-attach-wrapper").show();
+                                   $("#profile-link-wrapper").show();
+                                       $("#profile-video-wrapper").show();
+                                   $("#profile-audio-wrapper").show();
+                                       $("#profile-location-wrapper").show();
+                                   $("#profile-nolocation-wrapper").show();
+                                       $("#profile-title-wrapper").show();
+                                       $("#profile-jot-plugin-wrapper").show();
+                                       $("#jot-preview-link").show();
+                                                               {{ endif }}   
+
+
+            if (typeof cb!="undefined") cb();
+            return;
+        }
         tinyMCE.init({
                 theme : "advanced",
                 mode : "specific_textareas",
@@ -132,7 +160,7 @@ function initEditor(cb) {
                                name: 'userfile',
                                onSubmit: function(file,ext) { $('#profile-rotator').show(); },
                                onComplete: function(file,response) {
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,response);
+                                       addeditortext(response);
                                        $('#profile-rotator').hide();
                                }                                
                        }
@@ -143,7 +171,7 @@ function initEditor(cb) {
                                name: 'userfile',
                                onSubmit: function(file,ext) { $('#profile-rotator').show(); },
                                onComplete: function(file,response) {
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,response);
+                                       addeditortext(response);
                                        $('#profile-rotator').hide();
                                }                                
                        }
@@ -190,7 +218,7 @@ function initEditor(cb) {
                        reply = bin2hex(reply);
                        $('#profile-rotator').show();
                        $.get('parse_url?binurl=' + reply, function(data) {
-                               tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                               addeditortext(data);
                                $('#profile-rotator').hide();
                        });
                }
@@ -199,14 +227,14 @@ function initEditor(cb) {
        function jotVideoURL() {
                reply = prompt("$vidurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+                       addeditortext('[video]' + reply + '[/video]');
                }
        }
 
        function jotAudioURL() {
                reply = prompt("$audurl");
                if(reply && reply.length) {
-                       tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+                       addeditortext('[audio]' + reply + '[/audio]');
                }
        }
 
@@ -230,7 +258,7 @@ function initEditor(cb) {
                $.get('share/' + id, function(data) {
                                if (!editor) $("#profile-jot-text").val("");
                                initEditor(function(){
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                                       addeditortext(data);
                                        $('#like-rotator-' + id).hide();
                                        $(window).scrollTop(0);
                                });
@@ -253,7 +281,7 @@ function initEditor(cb) {
                        $.get('parse_url?binurl=' + reply, function(data) {
                                if (!editor) $("#profile-jot-text").val("");
                                initEditor(function(){
-                                       tinyMCE.execCommand('mceInsertRawHTML',false,data);
+                                       addeditortext(data);
                                        $('#profile-rotator').hide();
                                });
                        });
@@ -282,6 +310,16 @@ function initEditor(cb) {
                $('#profile-nolocation-wrapper').hide();
        }
 
+  function addeditortext(data) {
+        if(plaintext == 'none') {
+            var currentText = $("#profile-jot-text").val();
+            $("#profile-jot-text").val(currentText + data);
+        }
+        else
+            tinyMCE.execCommand('mceInsertRawHTML',false,data);
+    }
+
+
        $geotag
 
 </script>
index e2fd7132a33d4321e9e6529fc79b6495cb89d671..5bb5b46736893070ff4497218f4c2ed546843159 100755 (executable)
@@ -20,7 +20,6 @@
 
                 <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                 <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
-                {{ if $content }}<script>initEditor();</script>{{ endif }}
 
        <div id="profile-upload-wrapper" class="jot-tool" style="display: none;" >
                <div id="wall-image-upload-div" ><a onclick="return false;" id="wall-image-upload" class="icon border camera" title="$upload"></a></div>
@@ -72,3 +71,4 @@
 <div id="profile-jot-end"></div>
 </form>
 </div>
+                {{ if $content }}<script>initEditor();</script>{{ endif }}
index 118fc2e7ccf2e13f95cc4f0e06208ee90ed364d7..fcb7bea7a1feb32937139215e7b28e48e02bc34e 100755 (executable)
@@ -3259,3 +3259,12 @@ ul.menu-popup {
        background-color:#b20202; 
        order-bottom: none;
 }
+
+.qcomment {
+       opacity: 0;
+       filter:alpha(opacity=0);
+}
+.qcomment:hover {
+       opacity: 1.0;
+       filter:alpha(opacity=100);
+}
index 4fe819f4b9c03a4b719bb90189f93f0b09b53ad5..2b0e6740a738a749391b888d5b5b6605db8195cf 100755 (executable)
@@ -39,7 +39,7 @@
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
index 015e62f3e8fa3ae5b6a44eca9b662e4eacdb73fa..cd4def7fc5689870cfb7a2e2c4e8818fc6a582d8 100755 (executable)
                                {{ if $lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,$id);" /></div>
                                {{ else }}<div class="wall-item-lock"></div>{{ endif }}
                </div>
+               <div class="wall-item-content" id="wall-item-content-$id" >
+                       <div class="wall-item-title" id="wall-item-title-$id">$title</div>
+                       <div class="wall-item-title-end"></div>
+                       <div class="wall-item-body" id="wall-item-body-$id" >$body
+                                       <div class="body-tag">
+                                               {{ for $tags as $tag }}
+                                                       <span class='tag'>$tag</span>
+                                               {{ endfor }}
+                                       </div>
+                       </div>
+               </div>
                <div class="wall-item-tools" id="wall-item-tools-$id">
                        {{ if $vote }}
                        <div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
                                <a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
                                <a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
-                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+                               {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
                                <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
                        </div>
                        {{ endif }}
                                {{ if $drop.dropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$drop.select" class="item-select" name="itemselected[]" value="$id" />{{ endif }}
                        <div class="wall-item-delete-end"></div>
                </div>
-               <div class="wall-item-content" id="wall-item-content-$id" >
-                       <div class="wall-item-title" id="wall-item-title-$id">$title</div>
-                       <div class="wall-item-title-end"></div>
-                       <div class="wall-item-body" id="wall-item-body-$id" >$body
-                                       <div class="body-tag">
-                                               {{ for $tags as $tag }}
-                                                       <span class='tag'>$tag</span>
-                                               {{ endfor }}
-                                       </div>
-                       </div>
-               </div>
                <div class="wall-item-author">
                        <a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a>
                        <div class="wall-item-ago"  id="wall-item-ago-$id">$ago</div>
index a9ff22f78dfe90899a13803822686d1d30acb8ba..d4084c05d66807e681e3ee8215d05686b8407ced 100644 (file)
 .icon.s16.delete {
   background-image: url("../../../images/icons/16/delete.png");
 }
+<<<<<<< HEAD
 /*.icon.s16.edit {
   background-image: url("../../../images/icons/16/edit.png");
 }*/
+=======
+.icon.s16.edit {
+  background-image: url("../../../images/icons/16/edit.png");
+}
+>>>>>>> upstream/master
 .icon.s16.star {
   background-image: url("../../../images/icons/16/star.png");
 }
@@ -913,7 +919,11 @@ section {
 }
 .wall-item-container .wall-item-actions-tools {
   float: right;
+<<<<<<< HEAD
   width: 80px;
+=======
+  width: 60px;
+>>>>>>> upstream/master
 }
 .wall-item-container .wall-item-actions-tools a {
   float: right;
@@ -1028,6 +1038,7 @@ section {
 /* contacts menu */
 .contact-photo-wrapper {
   position: relative;
+<<<<<<< HEAD
   width: 80px;
 }
 
@@ -1035,6 +1046,9 @@ section {
   width: 25px;
 }
 
+=======
+}
+>>>>>>> upstream/master
 .contact-photo {
   width: 48px;
   height: 48px;
@@ -1396,6 +1410,7 @@ ul.tabs li .active {
 .field.radio .field_help {
   margin-left: 0px;
 }
+<<<<<<< HEAD
 
 #profile-edit-links-end {
         clear: both;
@@ -1424,6 +1439,11 @@ ul.tabs li .active {
   color: #B20202;
 }
 
+=======
+#profile-edit-links li {
+  list-style: none;
+}
+>>>>>>> upstream/master
 /* oauth */
 .oauthapp {
   height: auto;
@@ -1480,6 +1500,7 @@ footer {
   height: 100px;
   display: table-row;
 }
+<<<<<<< HEAD
 
 blockquote {
     border-left: 1px solid #D2D2D2;
@@ -1515,3 +1536,5 @@ blockquote {
 #group-separator,
 #prof-separator { display: none;}
 */
+=======
+>>>>>>> upstream/master