Merge branch 'master' of git://github.com/friendika/Free-Friendika

This commit is contained in:
Tobias Diekershoff 2011-10-05 20:59:21 +02:00
commit 90870d4872
85 changed files with 1745 additions and 2961 deletions

View file

@ -8,9 +8,9 @@ require_once("include/pgettext.php");
require_once('include/nav.php');
define ( 'FRIENDIKA_PLATFORM', 'Free Friendika');
define ( 'FRIENDIKA_VERSION', '2.3.1118' );
define ( 'FRIENDIKA_VERSION', '2.3.1124' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1092 );
define ( 'DB_UPDATE_VERSION', 1094 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@ -152,6 +152,8 @@ define ( 'ACTIVITY_DISLIKE', NAMESPACE_DFRN . '/dislike' );
define ( 'ACTIVITY_OBJ_HEART', NAMESPACE_DFRN . '/heart' );
define ( 'ACTIVITY_FRIEND', NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' );
define ( 'ACTIVITY_REQ_FRIEND', NAMESPACE_ACTIVITY_SCHEMA . 'request-friend' );
define ( 'ACTIVITY_UNFRIEND', NAMESPACE_ACTIVITY_SCHEMA . 'remove-friend' );
define ( 'ACTIVITY_FOLLOW', NAMESPACE_ACTIVITY_SCHEMA . 'follow' );
define ( 'ACTIVITY_UNFOLLOW', NAMESPACE_ACTIVITY_SCHEMA . 'stop-following' );
define ( 'ACTIVITY_POST', NAMESPACE_ACTIVITY_SCHEMA . 'post' );

View file

@ -114,6 +114,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
CREATE TABLE IF NOT EXISTS `group` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`visible` tinyint(1) NOT NULL DEFAULT '0',
`deleted` tinyint(1) NOT NULL DEFAULT '0',
`name` char(255) NOT NULL,
PRIMARY KEY (`id`)
@ -424,7 +425,9 @@ CREATE TABLE IF NOT EXISTS `user` (
`deny_gid` mediumtext NOT NULL,
`openidserver` text NOT NULL,
PRIMARY KEY (`uid`),
KEY `nickname` (`nickname`)
KEY `nickname` (`nickname`),
KEY `account_expired` (`account_expired`),
KEY `login_date` (`login_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@ -630,3 +633,12 @@ CREATE TABLE IF NOT EXISTS `search` (
INDEX ( `uid` ),
INDEX ( `term` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fserver` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`server` CHAR( 255 ) NOT NULL ,
`posturl` CHAR( 255 ) NOT NULL ,
`key` TEXT NOT NULL,
INDEX ( `server` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;

View file

@ -142,8 +142,8 @@ function conversation(&$a, $items, $mode, $update) {
// array with html for each thread (parent+comments)
$treads = array();
$treadsid = -1;
$threads = array();
$threadsid = -1;
if(count($items)) {
@ -155,7 +155,7 @@ function conversation(&$a, $items, $mode, $update) {
$tpl = get_markup_template('search_item.tpl');
foreach($items as $item) {
$treadsid++;
$threadsid++;
$comment = '';
$owner_url = '';
@ -220,7 +220,7 @@ function conversation(&$a, $items, $mode, $update) {
$body = prepare_body($item,true);
$treads[$treadsid] .= replace_macros($tpl,array(
$tmp_item = replace_macros($tpl,array(
'$id' => $item['item_id'],
'$linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
'$profile_url' => $profile_link,
@ -251,6 +251,11 @@ function conversation(&$a, $items, $mode, $update) {
'$wait' => t('Please wait'),
));
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
$threads[$threadsid] .= $arr['output'];
}
}
@ -331,8 +336,8 @@ function conversation(&$a, $items, $mode, $update) {
$comments_seen = 0;
$comments_collapsed = false;
$treadsid++;
$treads[$treadsid] = "";
$threadsid++;
$threads[$threadsid] = "";
}
else {
// prevent private email from leaking into public conversation
@ -346,7 +351,7 @@ function conversation(&$a, $items, $mode, $update) {
if(($comments[$item['parent']] > 2) && ($comments_seen <= ($comments[$item['parent']] - 2)) && ($item['gravity'] == 6)) {
if(! $comments_collapsed) {
$treads[$treadsid] .= '<div class="ccollapse-wrapper fakelink" id="ccollapse-wrapper-' . $item['parent']
$threads[$threadsid] .= '<div class="ccollapse-wrapper fakelink" id="ccollapse-wrapper-' . $item['parent']
. '" onclick="openClose(' . '\'ccollapse-' . $item['parent'] . '\'); $(\'#ccollapse-wrapper-' . $item['parent'] . '\').hide();" >'
. sprintf( t('See all %d comments'), $comments[$item['parent']]) . '</div>'
. '<div class="ccollapse" id="ccollapse-' . $item['parent'] . '" style="display: none;" >';
@ -354,7 +359,7 @@ function conversation(&$a, $items, $mode, $update) {
}
}
if(($comments[$item['parent']] > 2) && ($comments_seen == ($comments[$item['parent']] - 1))) {
$treads[$treadsid] .= '</div>';
$threads[$threadsid] .= '</div>';
}
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
@ -450,7 +455,7 @@ function conversation(&$a, $items, $mode, $update) {
);
$star = false;
$starred = "unstarred";
$isstarred = "unstarred";
if ($profile_owner == local_user() && $toplevelpost) {
$isstarred = (($item['starred']) ? "starred" : "unstarred");
@ -559,7 +564,7 @@ function conversation(&$a, $items, $mode, $update) {
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
$treads[$treadsid] .= $arr['output'];
$threads[$threadsid] .= $arr['output'];
}
}
}
@ -568,11 +573,11 @@ function conversation(&$a, $items, $mode, $update) {
// if author collapsing is in force but didn't get closed, close it off now.
/*if($blowhard_count >= 3)
$treads[$treadsid] .= '</div>';*/
$threads[$threadsid] .= '</div>';*/
$page_template = get_markup_template("conversation.tpl");
$o .= replace_macros($page_template, array(
'$treads' => $treads,
'$threads' => $threads,
'$dropping' => ($dropping?t('Delete Selected Items'):False),
));

View file

@ -72,7 +72,7 @@ function delivery_run($argv, $argc){
$normal_mode = false;
$expire = true;
$items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1
AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP - INTERVAL 30 MINUTE",
AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 30 MINUTE",
intval($item_id)
);
$uid = $item_id;
@ -96,6 +96,8 @@ function delivery_run($argv, $argc){
$uid = $r[0]['uid'];
$updated = $r[0]['edited'];
if(! $parent_id)
return;
$items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer`
@ -121,7 +123,6 @@ function delivery_run($argv, $argc){
if( ! ($icontacts && count($icontacts)))
return;
// avoid race condition with deleting entries
if($items[0]['deleted']) {
@ -267,7 +268,12 @@ function delivery_run($argv, $argc){
if(! $item_contact)
continue;
$atom .= atom_entry($item,'text',$item_contact,$owner,true);
if($normal_mode) {
if($item_id == $item['id'] || $item['id'] == $item['parent'])
$atom .= atom_entry($item,'text',$item_contact,$owner,true);
}
else
$atom .= atom_entry($item,'text',$item_contact,$owner,true);
}

View file

@ -807,6 +807,14 @@ function item_store($arr,$force_parent = false) {
}
}
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($arr['uri']),
dbesc($arr['uid'])
);
if($r && count($r)) {
logger('item-store: duplicate item ignored. ' . print_r($arr,true));
return 0;
}
call_hooks('post_remote',$arr);
@ -1070,10 +1078,21 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
* have a contact record.
* $hub = should we find a hub declation in the feed, pass it back to our calling process, who might (or
* might not) try and subscribe to it.
* $datedir sorts in reverse order
* $pass - by default ($pass = 0) we cannot guarantee that a parent item has been
* imported prior to its children being seen in the stream unless we are certain
* of how the feed is arranged/ordered.
* With $pass = 1, we only pull parent items out of the stream.
* With $pass = 2, we only pull children (comments/likes).
*
* So running this twice, first with pass 1 and then with pass 2 will do the right
* thing regardless of feed ordering. This won't be adequate in a fully-threaded
* model where comments can have sub-threads. That would require some massive sorting
* to get all the feed items into a mostly linear ordering, and might still require
* recursion.
*/
function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_feed = false) {
function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) {
require_once('library/simplepie/simplepie.inc');
@ -1241,7 +1260,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
// process any deleted entries
$del_entries = $feed->get_feed_tags(NAMESPACE_TOMB, 'deleted-entry');
if(is_array($del_entries) && count($del_entries)) {
if(is_array($del_entries) && count($del_entries) && $pass != 2) {
foreach($del_entries as $dentry) {
$deleted = false;
if(isset($dentry['attribs']['']['ref'])) {
@ -1333,7 +1352,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
$parent_uri = $rawthread[0]['attribs']['']['ref'];
}
if(($is_reply) && is_array($contact)) {
if(($is_reply) && is_array($contact) && $pass != 1) {
// Have we seen it? If not, import it.
@ -1385,7 +1404,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
}
$force_parent = false;
if($contact['network'] === 'stat') {
if($contact['network'] === NETWORK_OSTATUS) {
$force_parent = true;
if(strlen($datarray['title']))
unset($datarray['title']);
@ -1397,7 +1416,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
$datarray['last-child'] = 1;
}
if(($contact['network'] === 'feed') || (! strlen($contact['notify']))) {
if(($contact['network'] === NETWORK_FEED) || (! strlen($contact['notify']))) {
// one way feed - no remote comment ability
$datarray['last-child'] = 0;
}
@ -1430,6 +1449,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
$datarray['author-avatar'] = $contact['thumb'];
}
// special handling for events
if((x($datarray,'object-type')) && ($datarray['object-type'] === ACTIVITY_OBJ_EVENT)) {
$ev = bbtoevent($datarray['body']);
if(x($ev,'desc') && x($ev,'start')) {
@ -1491,16 +1512,28 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
lose_follower($importer,$contact,$datarray,$item);
return;
}
if(activity_match($datarray['verb'],ACTIVITY_REQ_FRIEND)) {
logger('consume-feed: New friend request');
new_follower($importer,$contact,$datarray,$item,true);
return;
}
if(activity_match($datarray['verb'],ACTIVITY_UNFRIEND)) {
lose_sharer($importer,$contact,$datarray,$item);
return;
}
if(! is_array($contact))
return;
if($contact['network'] === 'stat' || stristr($permalink,'twitter.com')) {
if($contact['network'] === NETWORK_OSTATUS || stristr($permalink,'twitter.com')) {
if(strlen($datarray['title']))
unset($datarray['title']);
$datarray['last-child'] = 1;
}
if(($contact['network'] === 'feed') || (! strlen($contact['notify']))) {
if(($contact['network'] === NETWORK_FEED) || (! strlen($contact['notify']))) {
// one way feed - no remote comment ability
$datarray['last-child'] = 0;
}
@ -1522,7 +1555,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $secure_fee
}
}
function new_follower($importer,$contact,$datarray,$item) {
function new_follower($importer,$contact,$datarray,$item,$sharing = false) {
$url = notags(trim($datarray['author-link']));
$name = notags(trim($datarray['author-name']));
$photo = notags(trim($datarray['author-avatar']));
@ -1532,14 +1565,14 @@ function new_follower($importer,$contact,$datarray,$item) {
$nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
if(is_array($contact)) {
if($contact['network'] == 'stat' && $contact['rel'] == CONTACT_IS_SHARING) {
if(($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
|| ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) {
$r = q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(CONTACT_IS_FRIEND),
intval($contact['id']),
intval($importer['uid'])
);
}
// send email notification to owner?
}
else {
@ -1555,13 +1588,12 @@ function new_follower($importer,$contact,$datarray,$item) {
dbesc($name),
dbesc($nick),
dbesc($photo),
dbesc('stat'),
intval(CONTACT_IS_FOLLOWER)
dbesc(($sharing) ? NETWORK_ZOT : NETWORK_OSTATUS),
intval(($sharing) ? CONTACT_IS_SHARING : CONTACT_IS_FOLLOWER)
);
$r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 AND `rel` = %d LIMIT 1",
$r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 LIMIT 1",
intval($importer['uid']),
dbesc($url),
intval(CONTACT_IS_FOLLOWER)
dbesc($url)
);
if(count($r))
$contact_record = $r[0];
@ -1593,7 +1625,7 @@ function new_follower($importer,$contact,$datarray,$item) {
'$sitename' => $a->config['sitename']
));
$res = mail($r[0]['email'],
t("You have a new follower at ") . $a->config['sitename'],
(($sharing) ? t('A new person is sharing with you at ') : t("You have a new follower at ")) . $a->config['sitename'],
$email,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
@ -1617,8 +1649,21 @@ function lose_follower($importer,$contact,$datarray,$item) {
}
}
function lose_sharer($importer,$contact,$datarray,$item) {
function subscribe_to_hub($url,$importer,$contact,$submode = 'subscribe') {
if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) {
q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1",
intval(CONTACT_IS_FOLLOWER),
intval($contact['id'])
);
}
else {
contact_remove($contact['id']);
}
}
function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') {
if(is_array($importer)) {
$r = q("SELECT `nickname` FROM `user` WHERE `uid` = %d LIMIT 1",
@ -1641,7 +1686,7 @@ function subscribe_to_hub($url,$importer,$contact,$submode = 'subscribe') {
$params= 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token;
logger('subscribe_to_hub: subscribing ' . $contact['name'] . ' to hub ' . $url . ' with verifier ' . $verify_token);
logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token);
if(! strlen($contact['hub-verify'])) {
$r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d LIMIT 1",

View file

@ -86,7 +86,7 @@ function notifier_run($argv, $argc){
$normal_mode = false;
$expire = true;
$items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1
AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP - INTERVAL 10 MINUTE",
AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 10 MINUTE",
intval($item_id)
);
$uid = $item_id;
@ -123,6 +123,9 @@ function notifier_run($argv, $argc){
$uid = $r[0]['uid'];
$updated = $r[0]['edited'];
if(! $parent_id)
return;
$items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer`
FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d ORDER BY `id` ASC",
intval($parent_id)
@ -357,7 +360,16 @@ function notifier_run($argv, $argc){
if(! $contact)
continue;
$atom .= atom_entry($item,'text',$contact,$owner,true);
if($normal_mode) {
// we only need the current item, but include the parent because without it
// older sites without a corresponding dfrn_notify change may do the wrong thing.
if($item_id == $item['id'] || $item['id'] == $item['parent'])
$atom .= atom_entry($item,'text',$contact,$owner,true);
}
else
$atom .= atom_entry($item,'text',$contact,$owner,true);
if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
$slaps[] = atom_entry($item,'html',$contact,$owner,true);

View file

@ -44,6 +44,12 @@ function poller_run($argv, $argc){
AND `account_expires_on` != '0000-00-00 00:00:00'
AND `account_expires_on` < UTC_TIMESTAMP() ");
$abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1)
$abandon_days = 0;
// once daily run expire in background
$d1 = get_config('system','last_expire_day');
@ -92,12 +98,17 @@ function poller_run($argv, $argc){
// and which have a polling address and ignore Diaspora since
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
$abandon_sql = (($abandon_days)
? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
: ''
);
$contacts = q("SELECT `contact`.`id` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
AND `network` != '%s'
$sql_extra
AND `self` = 0 AND `contact`.`blocked` = 0 AND `contact`.`readonly` = 0
AND `user`.`account_expired` = 0 ORDER BY RAND()",
AND `user`.`account_expired` = 0 $abandon_sql ORDER BY RAND()",
intval(CONTACT_IS_SHARING),
intval(CONTACT_IS_FRIEND),
dbesc(NETWORK_DIASPORA)
@ -475,11 +486,11 @@ function poller_run($argv, $argc){
}
consume_feed($xml,$importer,$contact,$hub,1, true);
consume_feed($xml,$importer,$contact,$hub,1,1);
// do it twice. Ensures that children of parents which may be later in the stream aren't tossed
consume_feed($xml,$importer,$contact,$hub,1);
consume_feed($xml,$importer,$contact,$hub,1,2);
$hubmode = 'subscribe';
if($contact['network'] === NETWORK_DFRN || $contact['blocked'] || $contact['readonly'])

View file

@ -744,7 +744,12 @@ function link_compare($a,$b) {
if(! function_exists('prepare_body')) {
function prepare_body($item,$attach = false) {
call_hooks('prepare_body_init', $item);
$s = prepare_text($item['body']);
call_hooks('prepare_body', $s);
if(! $attach)
return $s;
@ -776,6 +781,7 @@ function prepare_body($item,$attach = false) {
}
$s .= '<div class="clear"></div></div>';
}
call_hooks('prepare_body_final', $s);
return $s;
}}

View file

@ -95,6 +95,16 @@
if(home == 0) { home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
$('#home-update').html(home);
var intro = $(data).find('intro').text();
if(intro == 0) { intro = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
$('#intro-update').html(intro);
var mail = $(data).find('mail').text();
if(mail == 0) { mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
$('#mail-update').html(mail);
var eNotif = $(data).find('notif')
notif = eNotif.attr('count');
if (notif>0){
@ -154,6 +164,15 @@
});
function NavUpdate() {
if(! stopped) {
$.get("ping",function(data) {
$(data).find('result').each(function() {
// send nav-update event
$('nav').trigger('nav-update', this);
});
}) ;
}
if($('#live-network').length) { src = 'network'; liveUpdate(); }
if($('#live-profile').length) { src = 'profile'; liveUpdate(); }
@ -172,14 +191,6 @@
}
}
if(! stopped) {
$.get("ping",function(data) {
$(data).find('result').each(function() {
// send nav-update event
$('nav').trigger('nav-update', this);
});
}) ;
}
timer = setTimeout(NavUpdate,30000);
}

View file

@ -177,6 +177,8 @@ function admin_page_site_post(&$a){
$register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
$abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
$register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
$allowed_sites = ((x($_POST,'allowed_sites')) ? notags(trim($_POST['allowed_sites'])) : '');
@ -215,6 +217,7 @@ function admin_page_site_post(&$a){
set_config('system','maximagesize', $maximagesize);
set_config('config','register_policy', $register_policy);
set_config('system','account_abandon_days', $abandon_days);
set_config('config','register_text', $register_text);
set_config('system','allowed_sites', $allowed_sites);
set_config('system','allowed_email', $allowed_email);
@ -314,6 +317,7 @@ function admin_page_site(&$a) {
'$register_policy' => array('register_policy', t("Register policy"), $a->config['register_policy'], "", $register_choices),
'$register_text' => array('register_text', t("Register text"), htmlentities($a->config['register_text'], ENT_QUOTES), "Will be displayed prominently on the registration page."),
'$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
'$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), "Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"),
'$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), "Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains"),
'$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), "Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."),

View file

@ -450,7 +450,15 @@ function dfrn_notify_post(&$a) {
}
if($is_reply) {
if($feed->get_item_quantity() == 1) {
// was the top-level post for this reply written by somebody on this site? Specifically, the recipient?
$r = q("select `id` from `item` where `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($parent_uri),
intval($importer['importer_uid'])
);
if($r && count($r)) {
logger('dfrn_notify: received remote comment');
$is_like = false;
// remote reply to our post. Import and then notify everybody else.

View file

@ -779,6 +779,11 @@ function item_post(&$a) {
}
}
// fallback so that parent always gets set to non-zero.
if(! $parent)
$parent = $post_id;
$r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `plink` = '%s', `changed` = '%s', `last-child` = 1, `visible` = 1
WHERE `id` = %d LIMIT 1",
intval($parent),

View file

@ -22,6 +22,7 @@ function match_content(&$a) {
$params = array();
$tags = trim($r[0]['pub_keywords'] . ' ' . $r[0]['prv_keywords']);
if($tags) {
$params['s'] = $tags;
if($a->pager['page'] != 1)
@ -40,15 +41,17 @@ function match_content(&$a) {
}
if(count($j->results)) {
$tpl = get_markup_template('match.tpl');
foreach($j->results as $jj) {
$o .= '<div class="profile-match-wrapper"><div class="profile-match-photo">';
$o .= '<a href="' . $jj->url . '">' . '<img src="' . $jj->photo . '" alt="' . $jj->name . '" title="' . $jj->name . '[' . $jj->tags . ']' . '" /></a></div>';
$o .= '<div class="profile-match-break"></div>';
$o .= '<div class="profile-match-name"><a href="' . $jj->url . '" title="' . $jj->name . '[' . $jj->url .']' . '">' . $jj->name . '</a></div>';
$o .= '<div class="profile-match-end"></div></div>';
$o .= replace_macros($tpl,array(
'$url' => $jj->url,
'$name' => $jj->name,
'$photo' => $jj->photo,
'$tags' => $jj->tags
));
}
$o .= '<div id="profile-match-wrapper-end"></div>';
}
else {
info( t('No matches') . EOL);

View file

@ -45,13 +45,21 @@ function message_content(&$a) {
$myprofile = $a->get_baseurl() . '/profile/' . $a->user['nickname'];
if (($a->argc > 1) && ($a->argv[1] === 'new')) {
$tab = 'new';
} else if ($a->argc == 2 && $a->argv[1] === 'sent') {
$tab = 'sent';
} else {
$tab = 'inbox';
}
$tpl = get_markup_template('mail_head.tpl');
$header = replace_macros($tpl, array(
'$messages' => t('Messages'),
'$inbox' => t('Inbox'),
'$outbox' => t('Outbox'),
'$new' => t('New Message')
'$new' => t('New Message'),
'$activetab' => $tab
));
@ -90,6 +98,8 @@ function message_content(&$a) {
if(($a->argc > 1) && ($a->argv[1] === 'new')) {
$o .= $header;
$tpl = get_markup_template('msg-header.tpl');
$a->page['htmlhead'] .= replace_macros($tpl, array(
@ -114,7 +124,6 @@ function message_content(&$a) {
'$upload' => t('Upload photo'),
'$insert' => t('Insert web link'),
'$wait' => t('Please wait')
));
return $o;
@ -248,7 +257,6 @@ function message_content(&$a) {
'$upload' => t('Upload photo'),
'$insert' => t('Insert web link'),
'$wait' => t('Please wait')
));
return $o;

View file

@ -137,7 +137,7 @@ function saved_searches($search) {
if(count($r)) {
$o .= '<ul id="saved-search-ul">' . "\r\n";
foreach($r as $rr) {
$o .= '<li class="saved-search-li clear"><a href="network/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="network/?f&search=' . $rr['term'] . '" class="savedsearchterm" >' . $rr['term'] . '</a></li>' . "\r\n";
$o .= '<li class="saved-search-li clear"><a href="network/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="network/?f&search=' . urlencode($rr['term']) . '" class="savedsearchterm" >' . $rr['term'] . '</a></li>' . "\r\n";
}
$o .= '</ul>';
}

View file

@ -128,7 +128,14 @@ function photo_init(&$a) {
}
}
if(function_exists('header_remove')) {
header_remove('Pragma');
header_remove('pragma');
}
header("Content-type: image/jpeg");
header("Expires: " . gmdate("D, d M Y H:i:s", time() + (3600*24)) . " GMT");
header("Cache-Control: max-age=" . (3600*24));
echo $data;
killme();
// NOTREACHED

View file

@ -92,15 +92,11 @@ EOT;
function photos_post(&$a) {
logger('mod/photos.php: photos_post(): begin' , 'LOGGER_DEBUG');
logger('mod-photos: photos_post(): begin' , 'LOGGER_DEBUG');
foreach($_REQUEST AS $key => $val) {
logger('mod/photos.php: photos_post(): $_REQUEST key: ' . $key . ' val: ' . $val , 'LOGGER_DEBUG');
}
foreach($_FILES AS $key => $val) {
logger('mod/photos.php: photos_post(): $_FILES key: ' . $key . ' val: ' . $val , 'LOGGER_DEBUG');
}
logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
$can_post = false;
$visitor = 0;
@ -585,6 +581,9 @@ function photos_post(&$a) {
else
$visible = 0;
if(intval($_REQUEST['not_visible']))
$visible = 0;
$str_group_allow = perms2str(((is_array($_REQUEST['group_allow'])) ? $_REQUEST['group_allow'] : explode(',',$_REQUEST['group_allow'])));
$str_contact_allow = perms2str(((is_array($_REQUEST['contact_allow'])) ? $_REQUEST['contact_allow'] : explode(',',$_REQUEST['contact_allow'])));
$str_group_deny = perms2str(((is_array($_REQUEST['group_deny'])) ? $_REQUEST['group_deny'] : explode(',',$_REQUEST['group_deny'])));
@ -892,6 +891,7 @@ function photos_content(&$a) {
'$nickname' => $a->data['user']['nickname'],
'$newalbum' => t('New album name: '),
'$existalbumtext' => t('or existing album name: '),
'$nosharetext' => t('Do not show a status post for this upload'),
'$albumselect' => template_escape($albumselect),
'$permissions' => t('Permissions'),
'$aclselect' => (($visitor) ? '' : template_escape(populate_acl($a->user, $celeb))),

View file

@ -114,7 +114,7 @@ function ping_init(&$a) {
function xmlize($href, $name, $url, $photo, $date, $message){
$notsxml = '<note href="%s" name="%s" url="%s" photo="%s" date="%s">%s</note>';
return sprintf ( $notsxml,
$href, $name, $url, $photo, $date, $message
xmlify($href), xmlify($name), xmlify($url), xmlify($photo), xmlify($date), xmlify($message)
);
}

View file

@ -110,8 +110,10 @@ function profperm_content(&$a) {
if($change)
$o = '';
$o .= '<div id="prof-members">';
$o .= '<div id="prof-members-title">';
$o .= '<h3>' . t('Visible To') . '</h3>';
$o .= '</div>';
$o .= '<div id="prof-members">';
$textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
@ -123,9 +125,12 @@ function profperm_content(&$a) {
}
$o .= '</div><div id="prof-members-end"></div>';
$o .= '<hr id="prof-separator" />';
$o .= '<div id="prof-all-contcts-title">';
$o .= '<h3>' . t("All Contacts \x28with secure profile access\x29") . '</h3>';
$o .= '</div>';
$o .= '<div id="prof-all-contacts">';
$o .= '<h3>' . t("All Contacts \x28with secure profile access\x29") . '</h3>';
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 and `pending` = 0 and `self` = 0
AND `network` = 'dfrn' ORDER BY `name` ASC",
intval(local_user())

View file

@ -69,8 +69,13 @@ function pubsub_init(&$a) {
// We must initiate an unsubscribe request with a verify_token.
// Don't allow outsiders to unsubscribe us.
if(($hub_mode === 'unsubscribe') && (! strlen($hub_verify)))
hub_return(false, '');
if($hub_mode === 'unsubscribe') {
if(! strlen($hub_verify)) {
logger('pubsub: bogus unsubscribe');
hub_return(false, '');
}
logger('pubsub: unsubscribe success');
}
$r = q("UPDATE `contact` SET `subhub` = %d WHERE `id` = %d LIMIT 1",
intval($subscribe),
@ -132,11 +137,11 @@ function pubsub_post(&$a) {
require_once('include/items.php');
consume_feed($xml,$importer,$contact,$feedhub,1);
consume_feed($xml,$importer,$contact,$feedhub,1,1);
// do it a second time so that any children find their parents.
consume_feed($xml,$importer,$contact,$feedhub,1);
consume_feed($xml,$importer,$contact,$feedhub,1,2);
hub_post_return();

View file

@ -13,7 +13,7 @@ function search_saved_searches() {
$o .= '<h3>' . t('Saved Searches') . '</h3>' . "\r\n";
$o .= '<ul id="saved-search-ul">' . "\r\n";
foreach($r as $rr) {
$o .= '<li class="saved-search-li clear"><a href="search/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="search/?f&search=' . $rr['term'] . '" class="savedsearchterm" >' . $rr['term'] . '</a></li>' . "\r\n";
$o .= '<li class="saved-search-li clear"><a href="search/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="search/?f=&search=' . $rr['term'] . '" class="savedsearchterm" >' . $rr['term'] . '</a></li>' . "\r\n";
}
$o .= '</ul></div>' . "\r\n";
}

52
mod/tagmatch.php Normal file
View file

@ -0,0 +1,52 @@
<?php
function tagmatch_content(&$a) {
$search = notags(trim($_REQUEST['search']));
$o = '';
$o .= '<h2>' . t('Tag Match') . ' - ' . $search . '</h2>';
if($search) {
$p = (($a->pager['page'] != 1) ? '&p=' . $a->pager['page'] : '');
if(strlen(get_config('system','directory_submit_url')))
$x = fetch_url('http://dir.friendika.com/lsearch?f=' . $p . '&search=' . urlencode($search));
//TODO fallback local search if global dir not available.
// else
// $x = post_url($a->get_baseurl() . '/lsearch', $params);
$j = json_decode($x);
if($j->total) {
$a->set_pager_total($j->total);
$a->set_pager_itemspage($j->items_page);
}
if(count($j->results)) {
$tpl = get_markup_template('match.tpl');
foreach($j->results as $jj) {
$o .= replace_macros($tpl,array(
'$url' => $jj->url,
'$name' => $jj->name,
'$photo' => $jj->photo,
'$tags' => $jj->tags
));
}
}
else {
info( t('No matches') . EOL);
}
}
$o .= '<div class="clear"></div>';
$o .= paginate($a);
return $o;
}

View file

@ -1,6 +1,6 @@
<?php
define( 'UPDATE_VERSION' , 1092 );
define( 'UPDATE_VERSION' , 1094 );
/**
*
@ -770,3 +770,20 @@ function update_1091() {
}
function update_1092() {
q("ALTER TABLE `user` ADD INDEX ( `login_date` ) ");
q("ALTER TABLE `user` ADD INDEX ( `account_expired` ) ");
}
function update_1093() {
q("CREATE TABLE IF NOT EXISTS `fserver` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`server` CHAR( 255 ) NOT NULL ,
`posturl` CHAR( 255 ) NOT NULL ,
`key` TEXT NOT NULL,
INDEX ( `server` )
) ENGINE = MYISAM ");
q("ALTER TABLE `group` ADD `visible` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `uid` ");
}

View file

@ -12,26 +12,26 @@
</script>
<h4><a href="$admurl">Admin</a></h4>
<ul class='admin linklist'>
<li class='admin link $admin.site.2'><a href='$admin.site.0'>$admin.site.1</a></li>
<li class='admin link $admin.users.2'><a href='$admin.users.0'>$admin.users.1</a><span id='pending-update' title='$h_pending'></span></li>
<li class='admin link $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
<li class='admin link button $admin.site.2'><a href='$admin.site.0'>$admin.site.1</a></li>
<li class='admin link button $admin.users.2'><a href='$admin.users.0'>$admin.users.1</a><span id='pending-update' title='$h_pending'></span></li>
<li class='admin link button $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
</ul>
<ul class='admin linklist'>
<li class='admin link $admin.update.2'><a href='$admin.update.0'>$admin.update.1</a></li>
<li class='admin link button $admin.update.2'><a href='$admin.update.0'>$admin.update.1</a></li>
</ul>
{{ if $admin.plugins_admin }}<h4>Plugins</h4>{{ endif }}
<ul class='admin linklist'>
{{ for $admin.plugins_admin as $l }}
<li class='admin link $l.2'><a href='$l.0'>$l.1</a></li>
<li class='admin link button $l.2'><a href='$l.0'>$l.1</a></li>
{{ endfor }}
</ul>
<h4>Logs</h4>
<ul class='admin linklist'>
<li class='admin link $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
<li class='admin link button $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
</ul>

View file

@ -43,6 +43,7 @@
{{ inc field_input.tpl with $field=$proxy }}{{ endinc }}
{{ inc field_input.tpl with $field=$proxyuser }}{{ endinc }}
{{ inc field_input.tpl with $field=$timeout }}{{ endinc }}
{{ inc field_input.tpl with $field=$abandon_days }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -1,8 +1,9 @@
{{ for $treads as $tread }}
{{ for $threads as $thread }}
<div class="tread-wrapper">
$tread
$thread
</div>
{{ endfor }}
{{ if $dropping }}
<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
<div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,5 @@
<?php
function string_plural_select_fr($n){
return ($n != 1);
}
;
$a->strings["Logged out."] = "Déconnecté.";
$a->strings["Login failed."] = "Échec de connexion.";
@ -37,7 +34,7 @@ $a->strings["Abstinent"] = "Abstinent";
$a->strings["Virgin"] = "Vierge";
$a->strings["Deviant"] = "Déviant";
$a->strings["Fetish"] = "Fétichiste";
$a->strings["Oodles"] = "Oodles";
$a->strings["Oodles"] = "";
$a->strings["Nonsexual"] = "Non-sexuel";
$a->strings["Single"] = "Célibataire";
$a->strings["Lonely"] = "Esseulé";
@ -48,10 +45,10 @@ $a->strings["Unfaithful"] = "Infidèle";
$a->strings["Sex Addict"] = "Accro au sexe";
$a->strings["Friends"] = "Amis";
$a->strings["Friends/Benefits"] = "Amis par intérêt";
$a->strings["Casual"] = "Casual";
$a->strings["Casual"] = "Relation informelle";
$a->strings["Engaged"] = "Fiancé";
$a->strings["Married"] = "Marié";
$a->strings["Partners"] = "Partenaire";
$a->strings["Partners"] = "Avec partenaire";
$a->strings["Cohabiting"] = "En cohabitation";
$a->strings["Happy"] = "Heureux";
$a->strings["Not Looking"] = "Sans recherche";
@ -676,7 +673,7 @@ $a->strings["%d member"] = array(
1 => "%d membres",
);
$a->strings["Warning: This group contains %s from an insecure network."] = "Attention : ce groupe contient %s, qui se connecte depuis un réseau non-sécurisé.";
$a->strings["Private messages to this group are at risk of public disclosure."] = "es messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée.";
$a->strings["Private messages to this group are at risk of public disclosure."] = "Les messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée.";
$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
$a->strings["Friendika Social Network"] = "Réseau social Friendika";
$a->strings["Installation"] = "Installation";
@ -689,9 +686,9 @@ $a->strings["Database Login Password"] = "Mot de passe de la base";
$a->strings["Database Name"] = "Nom de la base";
$a->strings["Please select a default timezone for your website"] = "Sélectionner un fuseau horaire par défaut pour votre site";
$a->strings["Normal Account"] = "Compte normal";
$a->strings["This account is a normal personal profile"] = "e compte correspond à un profil normal, pour une seule personne (physique, généralement)";
$a->strings["This account is a normal personal profile"] = "Ce compte correspond à un profil normal, pour une seule personne (physique, généralement)";
$a->strings["Soapbox Account"] = "Compte \"boîte à savon\"";
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "ccepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'";
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'";
$a->strings["Community/Celebrity Account"] = "Compte de communauté/célébrité";
$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans en 'lecture/écriture'";
$a->strings["Automatic Friend Account"] = "Compte auto-amical";
@ -907,7 +904,7 @@ $a->strings["Hide your contact/friend list from viewers of this profile?"] = "Ca
$a->strings["Birthday (%s):"] = "Date de naissance (%s):";
$a->strings["visible to everybody"] = "visible par tout le monde";
$a->strings["Events"] = "Evènements";
$a->strings["Personal Notes"] = "Notes personnelles";
$a->strings["Personal Notes"] = "Notes";
$a->strings["Save"] = "Enregistrer";
$a->strings["An invitation is required."] = "Une invitation est requise.";
$a->strings["Invitation could not be verified."] = "L'invitation n'a pu être vérifiée.";
@ -1086,3 +1083,57 @@ $a->strings["%d invitation available"] = array(
1 => "%d invitations disponibles",
);
$a->strings["Suggest friends"] = "Suggérer des amis/contacts";
$a->strings["View %s's profile @ %s"] = "Voir le profil de %s sur %s";
$a->strings["like"] = "aime";
$a->strings["dislike"] = "n'aime pas";
$a->strings["Share this"] = "Partager ça";
$a->strings["share"] = "partager";
$a->strings["add star"] = "mettre en avant";
$a->strings["remove star"] = "ne plus mettre en avant";
$a->strings["starred"] = "mis en avant";
$a->strings["default"] = "";
$a->strings["[Relayed] Comment authored by %s from network %s"] = "[Relayé] Commentaire de %s du réseau %s";
$a->strings["OStatus"] = "OStatus";
$a->strings["RSS/Atom"] = "RSS/Atom";
$a->strings["Diaspora"] = "Diaspora";
$a->strings["Zot!"] = "Zot!";
$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."] = "Un groupe supprimé portant ce nom a été re-créé. Les anciennes permissions <strong>peuvent</strong> s'appliquer à ce groupe ainsi qu'à tous ses membres futurs. Si ce n'est pas ce que vous souhaitez, merci de créer un nouveau groupe avec un nom différent.";
$a->strings["A new person is sharing with you at "] = "Une nouvelle personne partage avec vous sur ";
$a->strings["Your profile page"] = "Votre page de profil";
$a->strings["Your photos"] = "Vos photos";
$a->strings["Your events"] = "Vos évènements";
$a->strings["Personal notes"] = "Notes personnelles";
$a->strings["Your personal photos"] = "Vos photos personnelles";
$a->strings["Nothing new here"] = "Rien de neuf ici";
$a->strings["Tag Match"] = "";
$a->strings["All"] = "Tout";
$a->strings["New"] = "Nouveaux";
$a->strings["Starred"] = "Mis en avant";
$a->strings["Bookmarks"] = "Favoris";
$a->strings["Saved Searches"] = "Recherches sauvées";
$a->strings["Remove term"] = "Retirer le terme";
$a->strings["Site public key not available in contact record for URL %s."] = "La clé publique du site n'est pas disponible dans l'enregistrement de contact pour l'URL %s.";
$a->strings["Time Conversion"] = "Conversion de date/heure";
$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendika fournit ce service pour partager des évènements avec d'autres réseaux, et des contacts situés dans des fuseaux horaires inconnus.";
$a->strings["UTC time: %s"] = "Temps universel (UTC): %s";
$a->strings["Current timezone: %s"] = "Fuseau horaire actuel: %s";
$a->strings["Converted localtime: %s"] = "Temps converti: %s";
$a->strings["Please select your timezone:"] = "Merci de choisir votre fuseau:";
$a->strings["Accounts abandoned after x days"] = "Délai d'\"expiration\" des comptes (en jours)";
$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Pour ne pas gaspiller les ressources du système en surveillant des sites externes, Friendika peut marquer certains comptes inactifs comme abandonnés. Mettre 0 pour ne pas avoir de limite.";
$a->strings["{0} wants to be your friend"] = "{0} veut être relié";
$a->strings["{0} sent you a message"] = "{0} vous a envoyé un message";
$a->strings["{0} requested registration"] = "{0} a demandé à s'enregistrer";
$a->strings["{0} commented %s's post"] = "{0} a commenté l'entrée de %s";
$a->strings["{0} like %s's post"] = "{0} aime l'entrée de %s";
$a->strings["{0} dislike %s's post"] = "{0} n'aime pas l'entrée de %s";
$a->strings["{0} is now friend with %s"] = "{0} est désormais relié à %s";
$a->strings["Event description and start time are required."] = "L'évènement requiert une description et un début.";
$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "Aux membres de Diaspora: merci de ne pas utiliser ce formulaire. Entrez plutôt \"%s\" dans votre barre de recherche Diaspora.";
$a->strings["- please share from your own site as noted above"] = "- merci de partager depuis votre propre site, comme indiqué plus haut";
$a->strings["@Tagname - overrides Name/Nickname"] = "@NomDuTag - outrepasse Nom/Surnom";
$a->strings["Do not show a status post for this upload"] = "Ne pas notifier le réseau de cet envoi";
$a->strings["Permission denied. Access to this item may be restricted."] = "Permission refusée. L'accès à cet élément peut avoir été restreint.";
$a->strings["View photo"] = "Voir photo";
$a->strings["Similar Interests"] = "Intérêts similaires";
$a->strings["Network type: %s"] = "Type de réseau: %s";

View file

@ -1,7 +1,6 @@
<div class="group-delete-wrapper" id="group-delete-wrapper-$id" >
<div class="group-delete-wrapper button" id="group-delete-wrapper-$id" >
<a href="group/drop/$id"
onclick="return confirmDelete();"
title="$delete"
id="group-delete-icon-$id"
class="icon drophide group-delete-icon"
onmouseover="imgbright(this);"

5
view/like_noshare.tpl Normal file
View file

@ -0,0 +1,5 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like"title="$likethis" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$nolike" onclick="dolike($id,'dislike'); return false"></a>
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>

View file

@ -7,9 +7,8 @@
<div class="mail-conv-date">$date</div>
<div class="mail-conv-subject">$subject</div>
<div class="mail-conv-body">$body</div>
</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-outside-wrapper-end"></div>
</div>
</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-outside-wrapper-end"></div>
<hr class="mail-conv-break" />

View file

@ -6,10 +6,10 @@
<div class="mail-list-sender-name" >$from_name</div>
<div class="mail-list-date">$date</div>
<div class="mail-list-subject"><a href="message/$id" class="mail-list-link">$subject</a></div>
<div class="mail-list-delete-wrapper" id="mail-list-delete-wrapper-$id" >
<a href="message/dropconv/$id" onclick="return confirmDelete();" title="$delete" class="icon drophide mail-list- delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
</div>
</div>
<div class="mail-list-delete-wrapper" id="mail-list-delete-wrapper-$id" >
<a href="message/dropconv/$id" onclick="return confirmDelete();" title="$delete" class="icon drophide mail-list-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
</div>
<div class="mail-list-delete-end"></div>

12
view/match.tpl Normal file
View file

@ -0,0 +1,12 @@
<div class="profile-match-wrapper">
<div class="profile-match-photo">
<a href="$url">
<img src="$photo" alt="$name" title="$name[$tags]" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
<a href="$url" title="$name[$tags]">$name</a>
</div>
<div class="profile-match-end"></div>
</div>

View file

@ -1,8 +1,7 @@
<div class="photo-album-image-wrapper" id="photo-album-image-wrapper-$id">
<a href="$photolink" class="photo-album-photo-link" id="photo-album-photo-link-$id" title="$phototitle">
<img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo" id="photo-album-photo-$id" />
<img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo lframe resize" id="photo-album-photo-$id" />
<p class='caption'>$desc</p>
</a>
</div>
<div class="photo-album-image-wrapper-end"></div>

View file

@ -13,6 +13,11 @@
</div>
<div id="photos-upload-exist-end"></div>
<div id="photos-upload-noshare-div" class="photos-upload-noshare-div" >
<input id="photos-upload-noshare" type="checkbox" name="not_visible" value="1" />
<label id="photos-upload-noshare-text" for="photos-upload-noshare" >$nosharetext</label>
</div>
<div id="photos-upload-perms" class="photos-upload-perms" >
<a href="#photos-upload-permissions-wrapper" id="photos-upload-perms-menu" class="button" />

View file

@ -15,7 +15,7 @@ $select
<div id="prvmail-message-label">$yourmessage</div>
<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" ></textarea>
</div>
<div id="prvmail-submit-wrapper" >
<input type="submit" id="prvmail-submit" name="submit" value="Submit" />
<div id="prvmail-upload-wrapper" >
@ -29,5 +29,6 @@ $select
</div>
</div>
<div id="prvmail-end"></div>
</div>
</form>
</div>

View file

@ -1,6 +1,6 @@
<div id="profile-tabs-wrapper" >
<a href="$account.1" id="profile-tab-status-link" class="profile-tabs" >$account.0</a>
<a href="$plugins.1" id="profile-tab-profile-link" class="profile-tabs" >$plugins.0</a>
<a href="$account.1" id="profile-tab-status-link" class="profile-tabs button" >$account.0</a>
<a href="$plugins.1" id="profile-tab-profile-link" class="profile-tabs button" >$plugins.0</a>
<div id="profile-tabs-end"></div>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 B

View file

@ -1,67 +0,0 @@
<h2>$header</h2>
<div id="contact-edit-banner-name">$name</div>
$nettype
<form action="contacts/$contact_id" method="post" >
<input type="hidden" name="contact_id" value="$contact_id">
<div id="contact-edit-wrapper" >
<div id="contact-edit-photo-wrapper" >
<img id="contact-edit-direction-icon" src="$dir_icon" alt="$alt_text" title="$alt_text" />
<div id="contact-edit-photo" >
<a href="$url" title="$visit" /><img src="$photo" $sparkle alt="$name" /></a>
</div>
<div id="contact-edit-photo-end" ></div>
</div>
<div id="contact-edit-nav-wrapper" >
<div id="contact-edit-links" >
<a href="contacts/$contact_id/block" class="icon block" id="contact-edit-block-link" title="$block_text"></a>
<a href="contacts/$contact_id/ignore" class="icon no" id="contact-edit-ignore-link" title="$ignore_text"></a>
<a href="crepair/$contact_id" class="icon tools" id="contact-edit-repair" title="$lblcrepair"></a>
<a href="contacts/$contact_id/drop" class="icon drophide" id="contact-edit-drop-link" onclick="return confirmDelete();" title="$delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);"></a>
</div>
<div id="contact-edit-nav-end"></div>
{{ if $poll_enabled }}
<div id="contact-edit-poll-wrapper">
<div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span></div>
<div id="contact-edit-poll-text">$updpub</div>
$poll_interval
<div id="contact-edit-update-now"><a href="contacts/$contact_id/update" >$udnow</a></div>
</div>
{{ endif }}
</div>
<div id="contact-edit-end" ></div>
$insecure
$blocked
$ignored
<div id="view-recent-wrapper"><a href="network/?cid=$contact_id" id="contact-view-recent">$lblrecent</a></div>
$lblsuggest
<div id="contact-edit-info-wrapper">
<h4>$lbl_info1</h4>
<textarea id="contact-edit-info" rows="10" cols="72" name="info" >$info</textarea>
</div>
<div id="contact-edit-info-end"></div>
<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
<div id="contact-edit-profile-select-text">
<h4>$lbl_vis1</h4>
<p>$lbl_vis2
</p>
</div>
$profile_select
<div id="contact-edit-profile-select-end"></div>
<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
</form>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -1,8 +0,0 @@
<div class="group-delete-wrapper" id="group-delete-wrapper-$id" >
<a href="group/drop/$id"
onclick="return confirmDelete();"
title="$delete"
id="group-delete-icon-$id"
class="drophide group-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" >Delete Group</a>
</div>
<div class="group-delete-end"></div>

View file

@ -1,16 +0,0 @@
<h2>$title</h2>
<div id="group-edit-wrapper" >
<form action="group/$gid" id="group-edit-form" method="post" >
<div id="group-edit-name-wrapper" >
<label id="group-edit-name-label" for="group-edit-name" >$gname</label>
<input type="text" id="group-edit-name" name="groupname" value="$name" />
<input type="submit" name="submit" value="$submit">
$drop
</div>
<div id="group-edit-name-end"></div>
<div id="group-edit-desc">$desc</div>
<div id="group-edit-select-end" ></div>
</form>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 81 KiB

View file

@ -1,251 +0,0 @@
<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
var editor=false;
var textlen = 0;
function initEditor(cb) {
if (editor==false) {
$("#profile-jot-text-loading").show();
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
editor_selector: /(profile-jot-text|prvmail-text)/,
plugins : "bbcode,paste,fullscreen,autoresize",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code,fullscreen",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "center",
theme_advanced_blockformats : "blockquote,code",
//theme_advanced_resizing : true,
//theme_advanced_statusbar_location : "bottom",
paste_text_sticky : true,
entity_encoding : "raw",
add_unload_trigger : false,
remove_linebreaks : false,
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
convert_urls: false,
content_css: "$baseurl/view/custom_tinymce.css",
theme_advanced_path : false,
setup : function(ed) {
//Character count
ed.onKeyUp.add(function(ed, e) {
var txt = tinyMCE.activeEditor.getContent();
textlen = txt.length;
if(textlen != 0 && $('#jot-perms-icon').is('.unlock')) {
$('#profile-jot-desc').html(ispublic);
}
else {
$('#profile-jot-desc').html('&nbsp;');
}
if(textlen <= 140) {
$('#character-counter').removeClass('red');
$('#character-counter').removeClass('orange');
$('#character-counter').addClass('grey');
}
if((textlen > 140) && (textlen <= 420)) {
$('#character-counter').removeClass('grey');
$('#character-counter').removeClass('red');
$('#character-counter').addClass('orange');
}
if(textlen > 420) {
$('#character-counter').removeClass('grey');
$('#character-counter').removeClass('orange');
$('#character-counter').addClass('red');
}
$('#character-counter').text(textlen);
});
ed.onInit.add(function(ed) {
ed.pasteAsPlainText = true;
$("#profile-jot-text-loading").hide();
$("#profile-jot-submit-wrapper").show();
$("#profile-upload-wrapper").show();
$("#profile-attach-wrapper").show();
$("#profile-link-wrapper").show();
$("#profile-youtube-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();
$("#character-counter").show();
if (typeof cb!="undefined") cb();
});
}
});
editor = true;
// setup acl popup
$("a#jot-perms-icon").fancybox({
'transitionIn' : 'none',
'transitionOut' : 'none'
});
} else {
if (typeof cb!="undefined") cb();
}
} // initEditor
</script>
<script type="text/javascript" src="js/ajaxupload.js" ></script>
<script>
var ispublic = '$ispublic';
$(document).ready(function() {
/* enable tinymce on focus */
$("#profile-jot-text").focus(function(){
if (editor) return;
$(this).val("");
initEditor();
});
var uploader = new window.AjaxUpload(
'wall-image-upload',
{ action: 'wall_upload/$nickname',
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
tinyMCE.execCommand('mceInsertRawHTML',false,response);
$('#profile-rotator').hide();
}
}
);
var file_uploader = new window.AjaxUpload(
'wall-file-upload',
{ action: 'wall_attach/$nickname',
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
tinyMCE.execCommand('mceInsertRawHTML',false,response);
$('#profile-rotator').hide();
}
}
);
$('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
var selstr;
$('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
selstr = $(this).text();
$('#jot-perms-icon').removeClass('unlock').addClass('lock');
$('#jot-public').hide();
$('.profile-jot-net input').attr('disabled', 'disabled');
});
if(selstr == null) {
$('#jot-perms-icon').removeClass('lock').addClass('unlock');
$('#jot-public').show();
$('.profile-jot-net input').attr('disabled', false);
}
}).trigger('change');
});
function deleteCheckedItems() {
var checkedstr = '';
$('.item-select').each( function() {
if($(this).is(':checked')) {
if(checkedstr.length != 0) {
checkedstr = checkedstr + ',' + $(this).val();
}
else {
checkedstr = $(this).val();
}
}
});
$.post('item', { dropitems: checkedstr }, function(data) {
window.location.reload();
});
}
function jotGetLink() {
reply = prompt("$linkurl");
if(reply && reply.length) {
reply = bin2hex(reply);
$('#profile-rotator').show();
$.get('parse_url?url=' + reply, function(data) {
tinyMCE.execCommand('mceInsertRawHTML',false,data);
$('#profile-rotator').hide();
});
}
}
function jotGetVideo() {
reply = prompt("$utubeurl");
if(reply && reply.length) {
tinyMCE.execCommand('mceInsertRawHTML',false,'[youtube]' + reply + '[/youtube]');
}
}
function jotVideoURL() {
reply = prompt("$vidurl");
if(reply && reply.length) {
tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
}
}
function jotAudioURL() {
reply = prompt("$audurl");
if(reply && reply.length) {
tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
}
}
function jotGetLocation() {
reply = prompt("$whereareu", $('#jot-location').val());
if(reply && reply.length) {
$('#jot-location').val(reply);
}
}
function jotTitle() {
reply = prompt("$title", $('#jot-title').val());
if(reply && reply.length) {
$('#jot-title').val(reply);
}
}
function jotShare(id) {
$('#like-rotator-' + id).show();
$.get('share/' + id, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
tinyMCE.execCommand('mceInsertRawHTML',false,data);
$('#like-rotator-' + id).hide();
$(window).scrollTop(0);
});
});
}
function linkdropper(event) {
var linkFound = event.dataTransfer.types.contains("text/uri-list");
if(linkFound)
event.preventDefault();
}
function linkdrop(event) {
var reply = event.dataTransfer.getData("text/uri-list");
event.target.textContent = reply;
event.preventDefault();
if(reply && reply.length) {
$('#profile-rotator').show();
$.get('parse_url?url=' + reply, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
tinyMCE.execCommand('mceInsertRawHTML',false,data);
$('#profile-rotator').hide();
});
});
}
}
function jotClearLocation() {
$('#jot-coord').val('');
$('#profile-nolocation-wrapper').hide();
}
$geotag
</script>

View file

@ -1,75 +0,0 @@
<div id="profile-jot-wrapper" >
<div id="profile-jot-banner-wrapper">
<div id="profile-jot-desc" >&nbsp;</div>
<div id="character-counter" class="grey" style="display: none;">0</div>
<div id="profile-rotator-wrapper" style="display: $visitor;" >
<img id="profile-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display:none;" />
</div>
</div>
<form id="profile-jot-form" action="$action" method="post" >
<input type="hidden" name="type" value="wall" />
<input type="hidden" name="profile_uid" value="$profile_uid" />
<input type="hidden" name="return" value="$return_path" />
<input type="hidden" name="location" id="jot-location" value="$defloc" />
<input type="hidden" name="coord" id="jot-coord" value="" />
<input type="hidden" name="title" id="jot-title" value="" />
<input type="hidden" name="post_id" value="$post_id" />
<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>
</div>
<div id="profile-attach-wrapper" class="jot-tool" style="display: none;" >
<div id="wall-file-upload-div" ><a href="#" onclick="return false;" id="wall-file-upload" class="icon border attach" title="$attach"></a></div>
</div>
<div id="profile-link-wrapper" class="jot-tool" style="display: none;" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >
<a id="profile-link" class="icon border link" title="$weblink" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></a>
</div>
<div id="profile-youtube-wrapper" class="jot-tool" style="display: none;" >
<a id="profile-youtube" class="icon border youtube" title="$youtube" onclick="jotGetVideo(); return false;"></a>
</div>
<div id="profile-video-wrapper" class="jot-tool" style="display: none;" >
<a id="profile-video" class="icon border video" title="$video" onclick="jotVideoURL(); return false;"></a>
</div>
<div id="profile-audio-wrapper" class="jot-tool" style="display: none;" >
<a id="profile-audio" class="icon border audio" title="$audio" onclick="jotAudioURL(); return false;"></a>
</div>
<div id="profile-location-wrapper" class="jot-tool" style="display: none;" >
<a id="profile-location" class="icon border globe" title="$setloc" onclick="jotGetLocation(); return false;"></a>
</div>
<div id="profile-nolocation-wrapper" class="jot-tool" style="display: none;" >
<a id="profile-nolocation" class="icon border noglobe" title="$noloc" onclick="jotClearLocation(); return false;"></a>
</div>
<div id="profile-title-wrapper" class="jot-tool" style="display: none;" >
<a id="profile-title" class="icon border article" title="$title" onclick="jotTitle(); return false;"></a>
</div>
<div id="profile-jot-submit-wrapper" style="display:none;padding-left: 400px;">
<input type="submit" id="profile-jot-submit" name="submit" value="$share" />
<div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" >
<a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon $lockstate sharePerms" title="$permset"></a>$bang</div>
</div>
<div id="profile-jot-plugin-wrapper" style="display: none;">
$jotplugins
</div>
<div id="profile-jot-tools-end"></div>
<div style="display: none;">
<div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
$acl
<hr style="clear:both"/>
<div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle" />
<div id="profile-jot-email-end"></div>
$jotnets
</div>
</div>
<div id="profile-jot-end"></div>
</form>
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 B

View file

@ -1,25 +0,0 @@
<form action="" method="post" >
<input type="hidden" name="auth-params" value="login" />
<div id="login-name-wrapper">
<label for="login-name" id="label-login-name">$namelabel</label>
<input type="text" maxlength="60" name="openid_url" class="$classname" id="login-name" value="" />
</div>
<div id="login-name-end" ></div>
<div id="login-password-wrapper">
<label for="login-password" id="label-login-password">$passlabel</label>
<input type="password" maxlength="60" name="password" id="login-password" value="" />
</div>
<div id="login-password-end"></div>
<div id="login-submit-wrapper" >
<input type="submit" name="submit" id="login-submit-button" value="$login" />
<a href="lostpass" title="$lostpass" id="lost-password-link" >$lostlink</a>
</div>
<div id="login-submit-end"></div>
<div id="login-extra-links">
<div id="login-extra-filler">&nbsp;</div>
$register_html
</div>
<div id="login-extra-end"></div>
</form>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

View file

@ -1,7 +0,0 @@
<h3>$messages</h3>
<ul class="tabs-wrapper">
<li><a href="message" class="tabs">$inbox</a></li>
<li><a href="message/sent" class="tabs">$outbox</a></li>
<li><a href="message/new" class="tabs">$new</a></li>
</ul>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

View file

@ -1,55 +0,0 @@
<nav>
$langselector
<span id="banner">$banner</span>
<div id="notifications">
{{ if $nav.network }}<a id="net-update" class="nav-ajax-update" href="$nav.network.0" title="$nav.network.1"></a>{{ endif }}
{{ if $nav.home }}<a id="home-update" class="nav-ajax-update" href="$nav.home.0" title="$nav.home.1"></a>{{ endif }}
{{ if $nav.notifications }}<a id="notify-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }}
{{ if $nav.messages }}<a id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }}
</div>
<div id="user-menu" >
<a id="user-menu-label" onclick="openClose('user-menu-popup'); return false" href="$nav.home.0">$sitelocation</a>
<ul id="user-menu-popup"
onmouseover="if (typeof tmenu != 'undefined') clearTimeout(tmenu); openMenu('user-menu-popup')"
onmouseout="tmenu=setTimeout('closeMenu(\'user-menu-popup\');',200)">
{{ if $nav.register }}<li><a id="nav-register-link" class="nav-commlink $nav.register.2" href="$nav.register.0" title="$nav.register.1">$nav.register.1</a></li>{{ endif }}
{{ if $nav.home }}<li><a id="nav-home-link" class="nav-commlink $nav.home.2" href="$nav.home.0">$nav.home.1</a></li>{{ endif }}
{{ if $nav.network }}<li><a id="nav-network-link" class="nav-commlink $nav.network.2" href="$nav.network.0">$nav.network.1</a></li>{{ endif }}
{{ if $nav.community }}
<li><a id="nav-community-link" class="nav-commlink $nav.community.2" href="$nav.community.0" title="$nav.community.3" >$nav.community.1</a></li>
{{ endif }}
<li><a id="nav-search-link" class="nav-link $nav.search.2" href="$nav.search.0" title="$nav.search.1">$nav.search.1</a></li>
<li><a id="nav-directory-link" class="nav-link $nav.directory.2" href="$nav.directory.0" title="$nav.directory.1">$nav.directory.1</a></li>
{{ if $nav.apps }}<li><a id="nav-apps-link" class="nav-link $nav.apps.2" href="$nav.apps.0" title="$nav.apps.1">$nav.apps.1</a></li>{{ endif }}
{{ if $nav.notifications }}<li><a id="nav-notify-link" class="nav-commlink nav-sep $nav.notifications.2" href="$nav.notifications.0">$nav.notifications.1</a></li>{{ endif }}
{{ if $nav.messages }}<li><a id="nav-messages-link" class="nav-commlink $nav.messages.2" href="$nav.messages.0">$nav.messages.1</a></li>{{ endif }}
{{ if $nav.contacts }}<li><a id="nav-contacts-link" class="nav-commlink $nav.contacts.2" href="$nav.contacts.0">$nav.contacts.1</a></li>{{ endif }}
{{ if $nav.profiles }}<li><a id="nav-profiles-link" class="nav-commlink nav-sep $nav.profiles.2" href="$nav.profiles.0">$nav.profiles.1</a></li>{{ endif }}
{{ if $nav.settings }}<li><a id="nav-settings-link" class="nav-commlink $nav.settings.2" href="$nav.settings.0">$nav.settings.1</a></li>{{ endif }}
{{ if $nav.manage }}<li><a id="nav-manage-link" class="nav-commlink $nav.manage.2" href="$nav.manage.0">$nav.manage.1</a></li>{{ endif }}
{{ if $nav.admin }}<li><a id="nav-admin-link" class="nav-commlink $nav.admin.2" href="$nav.admin.0">$nav.admin.1</a></li>{{ endif }}
<li><a id="nav-help-link" class="nav-link $nav.help.2" href="$nav.help.0" title="$nav.help.1">$nav.help.1</a></li>
{{ if $nav.login }}<li><a id="nav-login-link" class="nav-link $nav.login.2" href="$nav.login.0" title="$nav.login.1">$nav.login.1</a></li> {{ endif }}
{{ if $nav.logout }}<li><a id="nav-logout-link" class="nav-commlink nav-sep $nav.logout.2" href="$nav.logout.0">$nav.logout.1</a></li> {{ endif }}
</ul>
</div>
</nav>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

View file

@ -1,40 +0,0 @@
<div id="live-display"></div>
<h3><a href="$album.0">$album.1</a></h3>
<div id="photo-edit-link-wrap">
{{ if $tools }}
<a id="photo-edit-link" href="$tools.edit.0">$tools.edit.1</a>
-
<a id="photo-toprofile-link" href="$tools.profile.0">$tools.profile.1</a>
{{ endif }}
{{ if $lock }} - <img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,'photo$id');" /> {{ endif }}
</div>
<div id="photo-photo">
{{ if $prevlink }}<div id="photo-prev-link"><a href="$prevlink.0">$prevlink.1</a></div>{{ endif }}
<a href="$photo.href" title="$photo.title"><img src="$photo.src" /></a>
{{ if $nextlink }}<div id="photo-next-link"><a href="$nextlink.0">$nextlink.1</a></div>{{ endif }}
</div>
<div id="photo-photo-end"></div>
<div id="photo-caption" >$desc</div>
{{ if $tags }}
<div id="in-this-photo-text">$tags.0</div>
<div id="in-this-photo">$tags.1</div>
{{ endif }}
{{ if $tags.2 }}<div id="tag-remove"><a href="$tags.2">$tags.3</a></div>{{ endif }}
{{ if $edit }}$edit{{ endif }}
{{ if $likebuttons }}
<div id="photo-like-div">
$likebuttons
$like
$dislike
</div>
{{ endif }}
$comments
$paginate

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 853 B

View file

@ -1,11 +0,0 @@
<div class="profile-listing" >
<div class="profile-listing-photo-wrapper" >
<a href="profiles/$id" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-$id" src="$photo" alt="$alt" /></a>
</div>
<div class="profile-listing-photo-end"></div>
<div class="profile-listing-name" id="profile-listing-name-$id"><a href="profiles/$id" class="profile-listing-edit-link" >$profile_name</a></div>
<div class='profile-visible'>$visible</div>
</div>
<div class="profile-listing-end"></div>

View file

@ -1,9 +0,0 @@
<div class="tabs-wrapper" >
<a href="$url" id="profile-tab-status-link" class="tabs {{if $activetab==posts}}active{{endif}}" >$status</a>
<a href="$url?tab=profile" id="profile-tab-profile-link" class="tabs {{if $activetab==profile}}active{{endif}}" >$profile</a>
<a href="$phototab" id="profile-tab-photos-link" class="tabs {{if $activetab==photos}}active{{endif}}" >$photos</a>
{{ if $events }}<a href="events" id="profile-tab-events-link" class="tabs {{if $activetab==events}}active{{endif}}" >$events</a>{{ endif }}
{{ if $notes }}<a href="notes" id="profile-tab-notes-link" class="tabs {{if $activetab==notes}}active{{endif}}" >$notes</a>{{ endif }}
<div class="tabs-end"></div>
</div>

View file

@ -1,45 +0,0 @@
<div class="vcard">
<div class="fn label">$profile.name</div>
{{ if $pdesc }}<div class="title">$profile.pdesc</div>{{ endif }}
<div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="$profile.photo" alt="$profile.name"></div>
{{ if $location }}
<dl class="location"><dt class="location-label">$location</dt>
<dd class="adr">
{{ if $profile.address }}<div class="street-address">$profile.address</div>{{ endif }}
<span class="city-state-zip">
<span class="locality">$profile.locality</span>{{ if $profile.locality }}, {{ endif }}
<span class="region">$profile.region</span>
<span class="postal-code">$profile.postal-code</span>
</span>
{{ if $profile.country-name }}<span class="country-name">$profile.country-name</span>{{ endif }}
</dd>
</dl>
{{ endif }}
{{ if $gender }}<dl class="mf"><dt class="gender-label">$gender</dt> <dd class="x-gender">$profile.gender</dd></dl>{{ endif }}
{{ if $profile.pubkey }}<div class="key" style="display:none;">$profile.pubkey</div>{{ endif }}
{{ if $marital }}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>$marital</dt><dd class="marital-text">$profile.marital</dd></dl>{{ endif }}
{{ if $homepage }}<dl class="homepage"><dt class="homepage-label">$homepage</dt><dd class="homepage-url"><a href="$profile.homepage" target="external-link">$profile.homepage</a></dd></dl>{{ endif }}
{{ inc diaspora_vcard.tpl }}{{ endinc }}
<div id="profile-extra-links">
<ul>
{{ if $connect }}
<li><a id="dfrn-request-link" href="dfrn_request/$profile.nickname">$connect</a></li>
{{ endif }}
</ul>
</div>
</div>
$contact_block

Binary file not shown.

Before

Width:  |  Height:  |  Size: 808 B

View file

@ -1,48 +0,0 @@
<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" >
<div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
<div class="wall-item-info" id="wall-item-info-$id">
<div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id"
onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
<a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
<img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
<span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
<div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
<ul>
$item_photo_menu
</ul>
</div>
</div>
<div class="wall-item-photo-end"></div>
<div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div>
</div>
<div class="wall-item-lock-wrapper">
{{ 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-tools" id="wall-item-tools-$id">
<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$id" >
{{ if $drop.dropping }}<a href="item/drop/$id" onclick="return confirmDelete();" class="icon drophide" title="$drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
</div>
{{ 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>
</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>
</div>
</div>
<div class="wall-item-conv" id="wall-item-conv-$id" >
{{ if $conv }}<a href='$conv.href' id='context-$id' title='$conv.title'>$conv.title</a>{{ endif }}
</div>
<div class="wall-item-wrapper-end"></div>
</div>
<div class="wall-item-outside-wrapper-end$indent" ></div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,7 +1,33 @@
@import url('../testbubble/style.css');
.icon {
background-image: url('dbicons.png');
}
body {
background: #000000;
color: #dddddd;
}
.info-message {
color: #444444;
}
#id_openid_url {
background: url(../testbubble/login-bg.gif) no-repeat #ffffff;
background-position: 0 50%;
padding-left: 18px;
width: 385px;
color: #000000;
}
.vevent, .eventcal {
color: #000000;
}
.event-list-date {
color: #DDDDDD;
}
.fortunate {
color: #8888FF !important;
}

View file

@ -0,0 +1,4 @@
<?php
$a->theme_info = array(
'extends' => 'testbubble',
);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 664 B

View file

@ -1,75 +0,0 @@
<!-- test -->
<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" >
<div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
<div class="wall-item-info" id="wall-item-info-$id">
<div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id"
onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
<a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
<img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" />
</a>
<span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
<div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
<ul>
$item_photo_menu
</ul>
</div>
</div>
<div class="wall-item-photo-end"></div>
<div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div>
</div>
<div class="wall-item-lock-wrapper">
{{ 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>
</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 }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
{{ if $plink }}
<div class="wall-item-links-wrapper"><a href="$plink.href" title="$plink.title" target="external-link" class="icon remote-link"></a></div>
{{ endif }}
{{ if $edpost }}
<a class="editpost icon pencil" href="$edpost.0" title="$edpost.1"></a>
{{ endif }}
{{ if $star }}
<a href="#" id="starred-$id" onclick="dostar($id); return false;" class="star-item icon $isstarred" title="$star.toggle"></a>
{{ endif }}
<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$id" >
{{ if $drop.dropping }}<a href="item/drop/$id" onclick="return confirmDelete();" class="icon drophide" title="$drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
</div>
{{ 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-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>
</div>
</div>
<div class="wall-item-wrapper-end"></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-comment-wrapper" >
$comment
</div>
</div>
<div class="wall-item-outside-wrapper-end$indent" ></div>

View file

@ -1,74 +0,0 @@
<div class="wall-item-outside-wrapper$indent wallwall" id="wall-item-outside-wrapper-$id" >
<div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
<div class="wall-item-info wallwall" id="wall-item-info-$id">
<div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$id" >
<a href="$owner_url" title="$olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$id">
<img src="$owner_photo" class="wall-item-photo$osparkle" id="wall-item-ownerphoto-$id" style="height: 80px; width: 80px;" alt="$owner_name" /></a>
</div>
<div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$wall" /></div>
<div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$id"
onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
<a href="$profile_url" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
<img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
<span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
<div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
<ul>
$item_photo_menu
</ul>
</div>
</div>
<div class="wall-item-photo-end"></div>
<div class="wall-item-location" id="wall-item-location-$id">{{ if $location }}<span class="icon globe"></span>$location {{ endif }}</div>
</div>
<div class="wall-item-lock-wrapper">
{{ 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-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 }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
{{ if $plink }}
<div class="wall-item-links-wrapper"><a href="$plink.href" title="$plink.title" target="external-link" class="icon remote-link"></a></div>
{{ endif }}
{{ if $edpost }}
<a class="editpost icon pencil" href="$edpost.0" title="$edpost.1"></a>
{{ endif }}
{{ if $star }}
<a href="#" id="starred-$id" onclick="dostar($id); return false;" class="star-item icon $isstarred" title="$star.toggle"></a>
{{ endif }}
<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$id" >
{{ if $drop.dropping }}<a href="item/drop/$id" onclick="return confirmDelete();" class="icon drophide" title="$drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
</div>
{{ 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>
</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>
</div>
</div>
<div class="wall-item-wrapper-end"></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-comment-wrapper" >
$comment
</div>
</div>
<div class="wall-item-outside-wrapper-end$indent" ></div>

View file

@ -32,7 +32,7 @@
{{ endif }}
{{ if $nav.notifications }}
<a id="nav-notify-link" class="nav-commlink $nav.notifications.2 $sel.notifications" href="$nav.notifications.0" title="$nav.notifications.3" >$nav.notifications.1</a>
<span id="notify-update" class="nav-ajax-left"></span>
<span id="intro-update" class="nav-ajax-left"></span>
{{ endif }}
{{ if $nav.messages }}
<a id="nav-messages-link" class="nav-commlink $nav.messages.2" href="$nav.messages.0 $sel.messages" title="$nav.messages.3" >$nav.messages.1</a>

View file

@ -1559,6 +1559,8 @@ input#dfrn-url {
display:block!important;
}
#acl-wrapper {
width: 690px;
float:left;
@ -1917,6 +1919,10 @@ a.mail-list-link {
float: left;
width: 175px;
}
#photos-upload-noshare {
margin-bottom: 10px;
}
#photos-upload-existing-album-text {
float: left;
width: 175px;

View file

@ -67,3 +67,8 @@
@NoticeBackgroundColor: #511919;
@ThreadBackgroundColor: #f6f7f8;
@CommentBoxEmptyColor: @Grey3;
@CommentBoxEmptyBorderColor: @Grey3;
@CommentBoxFullColor: @Grey5;
@CommentBoxFullBorderColor: @Grey5;

View file

@ -3,7 +3,7 @@
/* global */
body {
font-family: Liberation Sans,helvetica,arial,clean,sans-serif;
font-size: 10px;
font-size: 12px;
background-color: @BodyBackground;
color: @BodyColor;
margin: 50px 0px 0px 0px;
@ -324,18 +324,17 @@ section {
.wall-item-ago { padding-right: 40px; }
.wall-item-name { font-weight: bold; }
.wall-item-actions-author { float: left; width: 25%; margin-top: 0.5em; }
.wall-item-actions-social { float: left; width: 50%; margin-top: 0.5em;
.wall-item-actions-author { float: left; width: 20em; margin-top: 0.5em; }
.wall-item-actions-social { float: left; margin-top: 0.5em;
a { margin-right: 3em; }
}
.wall-item-actions-tools { float: right; width: 25%;
.wall-item-actions-tools { float: right; width: 15%;
a { float: right; }
input { float: right; }
}
}
.wall-item-container.comment {
margin-top: 50px;
.wall-item-photo { width: 32px; height: 32px; margin-left: 16px;}
@ -345,3 +344,34 @@ section {
}
.wall-item-links { padding-left: 12px; }
}
.wall-item-comment-wrapper {
margin: 30px 2em 2em 60px;
.comment-edit-photo { display: none; }
textarea {
height: 1em; width: 100%; font-size: 10px;
color: @CommentBoxEmptyColor;
border: 1px solid @CommentBoxEmptyBorderColor;
padding:0.3em;
}
.comment-edit-text-full {
font-size: 14px;
height: 4em;
color: @CommentBoxFullColor;
border: 1px solid @CommentBoxFullBorderColor;
}
}
#profile-jot-wrapper {
width: 100%;
margin: 0px 2em 20px 0px;
}
.profile-jot-text {
height: 1em; width: 100%; font-size: 10px;
color: @CommentBoxEmptyColor;
border: 1px solid @CommentBoxEmptyBorderColor;
padding:0.3em;
}

View file

@ -153,7 +153,7 @@
/* global */
body {
font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
font-size: 10px;
font-size: 12px;
background-color: #ffffff;
color: #2d2d2d;
margin: 50px 0px 0px 0px;
@ -574,12 +574,11 @@ section {
}
.wall-item-container .wall-item-actions-author {
float: left;
width: 25%;
width: 20em;
margin-top: 0.5em;
}
.wall-item-container .wall-item-actions-social {
float: left;
width: 50%;
margin-top: 0.5em;
}
.wall-item-container .wall-item-actions-social a {
@ -587,7 +586,7 @@ section {
}
.wall-item-container .wall-item-actions-tools {
float: right;
width: 25%;
width: 15%;
}
.wall-item-container .wall-item-actions-tools a {
float: right;
@ -610,3 +609,35 @@ section {
.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;
}
#profile-jot-wrapper {
width: 100%;
margin: 0px 2em 20px 0px;
}
.profile-jot-text {
height: 1em;
width: 100%;
font-size: 10px;
color: #999999;
border: 1px solid #999999;
padding: 0.3em;
}

View file

@ -1,7 +1,7 @@
<h3>$messages</h3>
<ul class="tabs-wrapper">
<li><a href="message" class="tabs">$inbox</a></li>
<li><a href="message/sent" class="tabs">$outbox</a></li>
<li><a href="message/new" class="tabs">$new</a></li>
<li><a href="message" class="tabs button {{if $activetab==inbox}}active{{endif}}">$inbox</a></li>
<li><a href="message/sent" class="tabs button {{if $activetab==sent}}active{{endif}}">$outbox</a></li>
<li><a href="message/new" class="tabs button {{if $activetab==new}}active{{endif}}">$new</a></li>
</ul>

View file

@ -0,0 +1,10 @@
<div class="profile-match-wrapper">
<div class="profile-match-photo">
<a href="$url">
<img src="$photo" alt="$name" />
</a>
</div>
<span><a href="$url">$name</a> is interested in:<br />$tags</span>
<div class="profile-match-break"></div>
<div class="profile-match-end"></div>
</div>

View file

@ -4,10 +4,13 @@
<span id="banner">$banner</span>
<div id="notifications">
{{ if $nav.network }}<a id="net-update" class="nav-ajax-update" href="$nav.network.0" title="$nav.network.1"></a>{{ endif }}
{{ if $nav.home }}<a id="home-update" class="nav-ajax-update" href="$nav.home.0" title="$nav.home.1"></a>{{ endif }}
{{ if $nav.notifications }}<a id="notify-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }}
{{ if $nav.messages }}<a id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }}
{{ if $nav.network }}<a rel="#nav-notifications-menu" id="net-update" class="nav-ajax-update" href="$nav.network.0" title="$nav.network.1"></a>{{ endif }}
{{ if $nav.home }}<a rel="#nav-notifications-menu" id="home-update" class="nav-ajax-update" href="$nav.home.0" title="$nav.home.1"></a>{{ endif }}
{{ if $nav.notifications }}<a rel="#nav-notifications-menu" id="intro-update" class="nav-ajax-update" href="$nav.notifications.0" title="$nav.notifications.1"></a>{{ endif }}
{{ if $nav.messages }}<a rel="#nav-notifications-menu" id="mail-update" class="nav-ajax-update" href="$nav.messages.0" title="$nav.messages.1"></a>{{ endif }}
<ul id="nav-notifications-menu" class="menu-popup">
<li class="empty">$emptynotifications</li>
</ul>
</div>
<div id="user-menu" >
@ -48,8 +51,8 @@
{{ if $nav.logout }}<li><a id="nav-logout-link" class="nav-commlink nav-sep $nav.logout.2" href="$nav.logout.0">$nav.logout.1</a></li> {{ endif }}
</ul>
</div>
</nav>
<ul id="nav-notifications-template" style="display:none;" rel="template">
<a href="{0}"><li>{2} <span class="notif-when">{3}</span></li></a>
</ul>

View file

@ -0,0 +1,8 @@
<div class="photo-album-image-wrapper" id="photo-album-image-wrapper-$id">
<a href="$photolink" class="photo-album-photo-link" id="photo-album-photo-link-$id" title="$phototitle">
<img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo lframe resize" id="photo-album-photo-$id" />
</div>
<p class='caption'>$desc</p>
</a>
</div>
<div class="photo-album-image-wrapper-end"></div>

View file

@ -0,0 +1,8 @@
<div class="photo-top-image-wrapper lframe" id="photo-top-image-wrapper-$id">
<div id="photo-album-wrapper-inner">
<a href="$photolink" class="photo-top-photo-link" id="photo-top-photo-link-$id" title="$phototitle"><img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-top-photo" id="photo-top-photo-$id" /></a>
</div>
<div class="photo-top-album-name"><a href="$albumlink" class="photo-top-album-link" title="$albumalt" >$albumname</a></div>
</div>
<div class="photo-top-image-wrapper-end"></div>

View file

@ -7,14 +7,11 @@
*/
/* ========== */
/* = Colors
Red links - #b20202
Red link hover - #db0503
Red Gradients (buttons and other gradients) - #b20202 and #d60808
Grey/body text - #626262
Grey Gradients (buttons and other gradients) - #bdbdbd and #a2a2a2
Dark Grey Gradients - #7c7d7b and #555753
You can switch out the colors of the header, buttons and links by using a find and replace in your text editor.
@ -134,7 +131,7 @@ section {
.mframe {
padding: 5px;
background-color: #efefef;
border: 2px dotted #eeeeee;
border: 2px solid #dddddd;
-moz-box-shadow: 3px 3px 4px #959494;
-webkit-box-shadow: 3px 3px 4px #959494;
box-shadow: 3px 3px 4px #959494;
@ -364,7 +361,7 @@ ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:in
#notifications {
height: 32px;
position: absolute;
top:10px; left: 650px;
top:10px; left: 40%;
}
.nav-ajax-update {
width: 44px;
@ -376,12 +373,12 @@ ul#user-menu-popup li a.nav-sep { border-top: 1px solid #989898; border-style:in
padding-top: 0.5em;
float: left;
padding-left: 11px;
display: none;
/*display: none;*/
}
#net-update { background-position: 0px 0px; }
#mail-update { background-position: 0px -42px; }
#notify-update { background-position: 0px -84px; }
#home-update { background-position: 0px -126px; }
#net-update { background-position: 0px -126px; }
#mail-update { background-position: 0px -40px; }
#intro-update { background-position: 0px -84px; }
#home-update { background-position: 0px 0px; }
#lang-select-icon {
cursor: pointer;
@ -452,14 +449,10 @@ aside a{
font-variant:small-caps;
}
.marital {
font-size: 1em;
font-variant:small-caps;
}
.homepage-label {
font-size: 1em;
font-variant:small-caps;
.vcard dd {
font-size: 12px;
font-variant: normal;
-webkit-margin-start: 10px;
}
.vcard .fn {
@ -848,10 +841,16 @@ profile-jot-banner-wrapper {
/* ========= */
.wall-item-outside-wrapper {
margin-top: 50px;
max-width: 83%;
border-bottom: 1px solid #dedede;
margin-top: 20px;
padding-right: 10px;
padding-left: 12px;
overflow: hidden;
}
.wall-item-outside-wrapper-end { clear: both;}
.wall-item-content-wrapper { position: relative; max-width: 95%; }
.wall-item-content-wrapper { position: relative; max-width: 100%; }
.wall-item-photo-menu { display: none;}
.wall-item-photo-menu-button {
display:none;
@ -897,12 +896,13 @@ profile-jot-banner-wrapper {
}
.wall-item-outside-wrapper.comment .wall-item-tools {
margin: 5px 5px 10px 60px;
margin: 5px 5px 10px 70px;
float: left;
}
.wall-item-like-buttons {
float: left;
padding-left: 10px;
}
.wall-item-like-buttons a.icon {
float: left;
@ -931,9 +931,13 @@ profile-jot-banner-wrapper {
float: left;
}
.wall-item-title { font-size: 1.2em; font-weight: bold;}
.wall-item-body { margin-left: 140px; padding-right: 20px; }
.wall-item-body {
margin-left: 140px;
padding-right: 10px;
max-width: 85%;
}
.wall-item-body p {
max-width: 600px;
font-size: 0.8em;
}
.wall-item-lock-wrapper { float: right; }
@ -943,6 +947,7 @@ profile-jot-banner-wrapper {
clear: left;
font-size: 0.9em;
margin: 4px 0px 0px 140px;
padding-left: 10px;
font-variant:small-caps;
}
@ -1049,11 +1054,7 @@ profile-jot-banner-wrapper {
.icon.drop,
.icon.drophide { float: left; }
#item-delete-selected { overflow: auto; width: 100%;}
.wall-item-outside-wrapper {
max-width: 83%;
border-bottom: 1px solid #dedede;
margin-top: 20px;
}
/* ============ */
/* = Comments = */
@ -1062,11 +1063,11 @@ profile-jot-banner-wrapper {
.ccollapse-wrapper {
font-size: 0.9em;
color: #898989;
margin-left: 80px;
margin-left: 60px;
font-variant:small-caps;
}
.wall-item-outside-wrapper.comment { margin-left: 80px; }
.wall-item-outside-wrapper.comment { margin-left: 70px; }
.wall-item-outside-wrapper.comment .wall-item-photo {
width: 40px!important;
height: 40px!important;
@ -1079,7 +1080,13 @@ profile-jot-banner-wrapper {
background-position: 35px center;
}
.wall-item-outside-wrapper.comment .wall-item-info { width: 60px; }
.wall-item-outside-wrapper.comment .wall-item-body { margin-left: 60px; max-width: 85%;}
.wall-item-outside-wrapper.comment .wall-item-body {
margin-left: 70px;
max-width: 85%;
padding-right: 10px;
padding-left: 10px;
}
.wall-item-outside-wrapper.comment .wall-item-author { margin-left: 60px;}
.wall-item-outside-wrapper.comment .wall-item-photo-menu {
@ -1140,11 +1147,14 @@ profile-jot-banner-wrapper {
}
.wall-item-body code {
border-color: #CCCCCC;
border-style: solid;
font-family: Courier, monospace;
white-space: pre;
display: block;
overflow: auto;
border: 1px solid #cccccc;
border-width: 1px 1px 1px 10px;
display: block;
padding-left: 10px;
padding-left: 10px;
margin-top: 20px;
}
/* =========== */
@ -1242,23 +1252,44 @@ div[id$="wrapper"] br { clear: left; }
}
.profile-match-wrapper {
width: 300px;
width: 82%;
padding: 5px;
margin-bottom:10px;
margin-left: 20px;
background-color: #f6f6f6;
border: 1px solid #dddddd;
-moz-box-shadow: 3px 3px 4px #959494;
-webkit-box-shadow: 3px 3px 4px #959494;
box-shadow: 3px 3px 4px #959494;
clear: both;
}
.profile-match-end {
clear: both;
}
.profile-match-photo {
float: left;
margin-right: 10px;
margin-bottom: 5px;
}
/* ========== */
/* = Photos = */
/* ========== */
#side-bar-photos-albums h3:before {
content: url("photography.png");
padding-right: 10px;
vertical-align: middle;
}
#side-bar-photos-albums li {
font-size: 1.2em;
font-size: 14px;
font-variant: none;
text-align: left;
padding-left: 20px;
margin-bottom: 5px;
}
#photo-top-links {
@ -1286,15 +1317,31 @@ div[id$="wrapper"] br { clear: left; }
background-color: #b20202;
}
.photo-album-image-wrapper,
.photo-top-image-wrapper {
.photo-album-image-wrapper {
float: left;
margin: 0px 10px 10px 0px;
padding-bottom: 30px;
position:relative;
}
#photo-photo { max-width: 100% }
.photo-top-image-wrapper {
float: left;
width: 180px;
height: 180px;
margin: 0px 10px 10px 0px;
padding-bottom: 30px;
position:relative;
}
#photo-album-wrapper-inner {
position: relative;
float: left;
width: 180px;
height: 180px;
overflow: hidden;
}
#photo-photo { max-width: 85%; height: auto; }
#photo-photo img { max-width: 100% }
.photo-top-image-wrapper a:hover,
@ -1303,7 +1350,7 @@ div[id$="wrapper"] br { clear: left; }
border-bottom: 0px;
}
.photo-top-photo,
.photo-top-photo {}
.photo-album-photo {}
.photo-top-album-name {
@ -1502,16 +1549,6 @@ input#photo_edit_form {
margin-left: 190px;
}
#side-bar-photos-albums h3:before {
content: url("photography.png");
padding-right: 10px;
vertical-align: middle;
}
#side-bar-photos-albums li {
margin-bottom: 5px;
}
#photo-album-edit-wrapper {
margin-bottom: 10px;
}
@ -1587,16 +1624,15 @@ input#photo_edit_form {
font-size: 1em;
}
#prvmail-submit-wrapper { margin-top: 10px; }
#prvmail-submit {
float: right;
margin-top: 0px;
margin-right: 90px;
margin-right: 0px;
}
#prvmail-upload {
margin-left: 90px;
margin-left: 0px;
}
#prvmail-submit-wrapper > div {
@ -1637,7 +1673,7 @@ margin-left: 90px;
float: right;
clear: block;
display: inline;
font-size: 0.8em;
font-size: 0.9em;
padding-left: 10px;
font-stretch:ultra-condensed;
font-variant:small-caps;
@ -1654,11 +1690,15 @@ margin-left: 90px;
color: #626262;
}
.mail-list-delete-wrapper { float: left; margin-right:550px; }
.mail-list-delete-wrapper { float: right;}
.mail-list-outside-wrapper-end {
clear: both;
}
.mail-conv-outside-wrapper {
margin-bottom: 10px;
}
.mail-conv-sender {float: left; margin: 0px 5px 5px 0px; }
.mail-conv-sender-photo {
width: 64px;
@ -1675,13 +1715,20 @@ margin-left: 90px;
.mail-conv-detail {
width: 500px;
padding: 30px;
padding-bottom: 10px;
margin-left: 20px;
margin-bottom: 0px;
vertical-align: middle;
margin: auto;
border: 1px solid #dddddd;
}
.mail-conv-break { display: none; border: none;}
.mail-conv-delete-wrapper { margin-top: 5px; width: 650px; text-align: right; }
.mail-conv-delete-wrapper { padding-top: 10px; width: 510px; text-align: right; }
#prvmail-subject {
font-weight: bold;
border: 1px solid #dddddd;
}
/* ================= */
/* = Notifications = */
@ -2061,56 +2108,19 @@ margin-left: 90px;
padding-top: 10px;
}
#profile-tab-status-link:hover {
#profile-tab-status-link {
border: 0px;
padding: 5px 10px 5px 10px;
font-style: bold;
color: #efefef;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
background-color:#b20202;
}
#profile-tab-status-link:active {
border: 0px;
padding: 5px 10px 5px 10px;
font-style: bold;
background-color: #b20202;
position:relative;
top:1px;
}
#profile-tab-status-link a {
color: #efefef;
}
#uexport-link a {
color: #efefef;
}
#profile-tab-profile-link:hover {
#profile-tab-profile-link {
border: 0px;
padding: 5px 10px 5px 10px;
font-style: bold;
color: #efefef;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
background-color:#b20202;
}
#profile-tab-profile-link:active {
border: 0px;
padding: 5px 10px 5px 10px;
font-style: bold;
background-color: #b20202;
position:relative;
top:1px;
}
#profile-tab-profile-link a {
color: #efefef;
}
#uexport-link {
@ -2255,7 +2265,7 @@ margin-left: 90px;
background-color:#bdbdbd;
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
border-radius:5px;*/
}
.group-delete-wrapper:hover {
@ -2602,7 +2612,9 @@ tr {
.admin.link {
list-style-position: inside;
font-size: 1em;
padding: 3px;
padding: 5px;
width: 100px;
margin: 5px;
}
#adminpage dl {
@ -2990,3 +3002,61 @@ a.active {
padding: 5px 10px 5px 10px;
margin-right: 5px;
}
/* notifications popup menu */
.nav-notify {
display: none;
position: absolute;
font-size: 10px;
padding: 1px 3px;
top: 0px;
right: -10px;
min-width: 15px;
text-align: right;
}
.nav-notify.show {
display: block;
}
ul.menu-popup {
position: absolute;
display: none;
width: 10em;
margin: 0px;
padding: 0px;
list-style: none;
z-index: 100000;
top: 40px;
}
#nav-notifications-menu {
width: 320px;
max-height: 400px;
overflow-y: scroll;
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #797979), color-stop(1, #898988) );
background:-moz-linear-gradient( center top, #797979 5%, #898988 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#797979', endColorstr='#898988');
background-color:#a2a2a2;
-moz-border-radius:0px 0px 5px 5px;
-webkit-border-radius:0px 0px 5px 5px;
border-radius:0px 0px 5px 5px;
border: 1px solid #9A9A9A;
border-top: none;
-moz-box-shadow: 5px 5px 10px #242424;
-webkit-box-shadow: 5px 5px 10px #242424;
box-shadow: 5px 5px 10px #242424;
}
#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
#nav-notifications-menu img { float: left; margin-right: 5px; }
#nav-notifications-menu .notif-when { font-size: 0.8em; display: block; }
#nav-notifications-menu li {
padding: 7px 10px 7px 10px;
word-wrap:normal;
border-bottom: 1px solid #626262;
}
#nav-notifications-menu li:hover {
background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
background-color:#b20202;
}

View file

@ -66,4 +66,6 @@
</div>
</div>
</div>
<div class="wall-item-comment-wrapper" >
$comment
</div>

View file

@ -1,58 +1,3 @@
{#<div class="wall-item-outside-wrapper$indent wallwall" id="wall-item-outside-wrapper-$id" >
<div class="wall-item-content-wrapper$indent" id="wall-item-content-wrapper-$id" >
<div class="wall-item-info wallwall" id="wall-item-info-$id">
<div class="wall-item-photo-wrapper mframe wwto" id="wall-item-ownerphoto-wrapper-$id" >
<a href="$owner_url" target="redir" title="$olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$id">
<img src="$owner_photo" class="wall-item-photo$osparkle" id="wall-item-ownerphoto-$id" style="height: 80px; width: 80px;" alt="$owner_name" /></a>
</div>
<div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$wall" /></div>
<div class="wall-item-photo-wrapper mframe wwfrom" id="wall-item-photo-wrapper-$id"
onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
<a href="$profile_url" target="redir" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
<img src="$thumb" class="wall-item-photo$sparkle" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
<span onclick="openClose('wall-item-photo-menu-$id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$id">menu</span>
<div class="wall-item-photo-menu" id="wall-item-photo-menu-$id">
<ul>
$item_photo_menu
</ul>
</div>
</div>
<div class="wall-item-photo-end"></div>
<div class="wall-item-wrapper" id="wall-item-wrapper-$id" >
$lock
<div class="wall-item-location" id="wall-item-location-$id">$location</div>
</div>
</div>
<div class="wall-item-author">
<a href="$profile_url" target="redir" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a> $to <a href="$owner_url" target="redir" title="$olinktitle" class="wall-item-name-link"><span class="wall-item-name$osparkle" id="wall-item-ownername-$id">$owner_name</span></a> $vwall<br />
<div class="wall-item-ago" id="wall-item-ago-$id">$ago</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>
</div>
<div class="wall-item-tools" id="wall-item-tools-$id">
$vote
$plink
$edpost
$star
$drop
</div>
</div>
<div class="wall-item-wrapper-end"></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-comment-separator"></div>
<div class="wall-item-comment-wrapper" >
$comment
</div>
<div class="wall-item-outside-wrapper-end$indent" ></div>
</div> #}
{{ if $indent }}{{ else }}
<div class="wall-item-decor">
<span class="icon s22 star $isstarred" id="starred-$id" title="$star.starred">$star.starred</span>
@ -63,12 +8,12 @@
<div class="wall-item-container $indent">
<div class="wall-item-item">
<div class="wall-item-info">
<div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$id" >
<div class="wall-item-photo-wrapper mframe wwto" id="wall-item-ownerphoto-wrapper-$id" >
<a href="$owner_url" target="redir" title="$olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$id">
<img src="$owner_photo" class="wall-item-photo$osparkle" id="wall-item-ownerphoto-$id" alt="$owner_name" />
</a>
</div>
<div class="wall-item-photo-wrapper wwfrom"
<div class="wall-item-photo-wrapper mframe wwfrom"
onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('wall-item-photo-menu-button-$id')"
onmouseout="t$id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$id\'); closeMenu(\'wall-item-photo-menu-$id\');',200)">
<a href="$profile_url" target="redir" title="$linktitle" class="wall-item-photo-link" id="wall-item-photo-link-$id">
@ -128,3 +73,6 @@
</div>
</div>
</div>
<div class="wall-item-comment-wrapper" >
$comment
</div>

134
zot.txt
View file

@ -1,7 +1,7 @@
This is the Zot! social communications protocol.
Specification revision: 1
15 September 2011
2 October 2011
Mike Macgirvin
This specification is public domain.
@ -78,16 +78,21 @@ zot:env
*******
This consists of RFC822-style header fields representing the sender and
recipient(s). Example:
recipient(s). Line lengths have no defined limit and RFC822 continuation
lines are not supported. If an inbound server is not able to process an
envelope or post due to size constraints, it SHOULD return a
"413 Entity too large" HTTP response.
From: bob@example.com
Sender: bob@example.com
To: alice@example.com
Example:
Both "From:" and "Sender:" MUST be provided, and represent a webfinger
address of the author and sender respectively. The webfinger address for
the From address MUST contain a discoverable salmon public key that
is needed to verify the enclosed salmon data. Sender is used to indicate
Z-From: zot:bob@example.com
Z-Sender: zot:bob@example.com
Z-To: zot:alice@example.com
Both "Z-From:" and "Z-Sender:" MUST be provided, and represent a single
webfinger address of the author and sender respectively. The webfinger
address for the From address MUST contain a discoverable salmon public key
which is needed to verify the enclosed salmon data. Sender is used to indicate
the webfinger identity responsible for transmitting this message. From
indicates the message author.
@ -95,46 +100,92 @@ In web-based social systems, a reply to a message SHOULD be conveyed to all of
the original message participants. Only the author of the original message
may know all the recipients (such as those contained in Bcc: elements). The
author of a message always provides 'From'. They MUST duplicate this
information as 'Sender'.
information as 'Sender' when posting a followup message.
A reply to a given message MUST be sent to the original From address, and MAY
be sent to any additional addresses in the recipient list. The original author
MUST send the reply to all known recipients of the original message, with
their webfinger identity as Sender, and the comment/reply author as From.
A reply to a given message MUST be sent to the From address of the original
post, and MAY be sent to any additional addresses in the recipient list. The
original post author MUST send the reply to all known recipients of the
original message, with their webfinger identity as Sender, and the
comment/reply author as From.
Receiving agents SHOULD validate the From identity as the signer of the salmon
magic envelope, and MAY reject it. They SHOULD also verify the Sender signature
of the zot packet if it is different than the salmon signature. They MAY
reject the message if the Sender is not allowed in their "friend list", or if
they do not have a suitable relationship with the Sender, or if either
signature fails to validate.
signature fails to validate. Rejected messages for one of these reasons SHOULD
be indicated with a "400 Bad Request" HTTP response.
To: *
Z-To: *
indicates a public message with no specifically enumerated recipients.
The fields To:, Cc:, and/or Bcc: MAY be present. At least one recipient field
MUST be present. These fields may use the entire syntax specified by RFC822,
for example:
The fields Z-To: and/or Z-Bcc: MAY be present. At least one recipient field
MUST be present.
To: "Bob Smith" <bob@example.com>, "Alice Jones" <alice@example.com>
Z-To: zot:bob@example.com, zot:alice@example.com, mailto:dave@example.com
Z-Bcc: zot:https://example.com/profile/richard
is a valid entry. A zot envelope is UTF-8 encoded, which differs from RFC822.
The host component MUST be US-ASCII, with punycode translation of
internationalised domain names applied.
are valid entries. Adresses are comma separated and individual entries MUST NOT
contain commas. There MAY be any number of ASCII space characters between
entries for legibility. Header lines are terminated with a linefeed character
(ASCII 0x0A).
The entire envelope is then encrypted using alg with env_key and env_iv and
This specification provides the following protocol address prefixes
for use in Z-To: or Z-Bcc: elements:
zot: - normal zot delivery using webfinger or LRDD resolvable address
dfrn: - legacy DFRN mode delivery using webfinger or LRDD resovable address
ostatus: - normal OStatus delivery using webfinger or LRDD resovable address
diaspora: - Diaspora network delivery using webfinger address
facebook: - Facebook profile page URL
twitter: - Twitter personal page URL without AJAX '#!' fragment
mailto: - email RFC822/ESMTP address
Examples:
twitter:http://twitter.com/bjensen
facebook:http://facebook.com/profile.php?id=000000001
Foreign protocol addresses which have not been defined in this specification
or future revisions of this specification and which are unknown to the
recipient delivery process MAY be ignored.
In cases where an address may contain either a webfinger or LRDD address, the
webfinger address SHOULD be used preferentially.
Z-Bcc:
******
The Z-Bcc element may contain one or more addresses which are hidden from end
user presentation. A zot receiving system MUST NOT store or allow for
the display of the Bcc information. Implementations which require extreme
privacy SHOULD send individual posts to each of the Bcc: recipients containing
only a single address. They MAY send all Bcc: posts using bulk delivery,
however this may have privacy implications as there is no guarantee a
receiving system will not log, store, or otherwise reveal the contents of the
Bcc recipient list.
Z-To: addresses MAY be shown to an end user.
Envelope encryption
*******************
The entire envelope is encrypted using alg with env_key and env_iv and
base64url encoded for transmission.
The zot envelope MAY include remote addresses. A zot delivery agent MUST parse
all addresses and determine whether a delivery address to the current endpoint
is valid. This may be the result of:
The zot envelope MAY include remote addresses. A zot inbound delivery agent
MUST parse the envelope and determine whether a delivery address to the
current endpoint is valid. This may be the result of:
1. An address contains the public message wildcard '*'
2. The current endpoint is a personal endpoint and one of the recipients
listed in the To:, Cc:, or Bcc: addresses matches the webfinger address of
listed in the Z-To: or Z-Bcc: addresses matches the webfinger address of
the "owner" of the endpoint.
3. The current endpoint is a bulk delivery endpoint. The bulk delivery
@ -203,15 +254,12 @@ This specification is subject to change. The current version which is in
effect at a given site may be noted by XRD properties. The following
properties MUST be present in the XRD providing the relevant endpoint:
<Property xmlns:zot="http://purl.og/zot/1.0"
type="http://purl.org/zot/1.0/version"
zot:version="1" />
<Property type="http://purl.org/zot/1.0/version">1</Property>
<Property type="http://purl.org/zot/1.0/accept">application/atom+xml</Property>
<Property xmlns:zot="http://purl.og/zot/1.0"
type="http://purl.org/zot/1.0/accept"
zot:accept="application/atom+xml" />
Version is specified in this document and indicates the current revision.
Version is an increasing non-zero integer value. There are no minor versions.
Implementations MAY provide compatibility to multiple incompatible versions
by using this version indication. The "accept" indicates a range of document
content types which may be enclosed in the underlying salmon magic envelope.
@ -219,7 +267,8 @@ We anticipate this specification will in the future allow for a close variant
of "message/rfc822" and which may include MIME. This may also be used to
embed alternate message formats and protocols such as
"application/x-diaspora+xml". If a delivery agent is unable to provide any
acceptable data format, the delivery MUST be terminated/cancelled.
acceptable data format to the remote system, the delivery to that system MUST
be terminated/cancelled.
Foreign Messages
****************
@ -233,9 +282,18 @@ systems MAY reject foreign messages.
**********************
* Zid authentication *
**********************
*******************************
* Zid (Zot-ID) authentication *
*******************************
This section of the document is considered separate from the delivery
specification precding it and represents a different protocol, which is
currently incomplete. This will be split off into another document in the
future, but is presented here as a synergistic component of the Zot network
model.
URLs may be present within a zot message which refer to private and/or
protected resources. Zid uses OpenID to gain access to these protected