Merge branch 'master' of git://github.com/friendica/friendica

pull/380/head
Vasudev Kamath 2012-06-23 08:11:35 +05:30
commit 6e4760dd9c
61 changed files with 6437 additions and 5254 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Disable LF normalization for all files
* -text

View File

@ -4,12 +4,13 @@ require_once('include/config.php');
require_once('include/network.php');
require_once('include/plugin.php');
require_once('include/text.php');
require_once('include/datetime.php');
require_once('include/pgettext.php');
require_once('include/nav.php');
require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.0.1370' );
define ( 'FRIENDICA_VERSION', '3.0.1382' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1149 );
@ -76,14 +77,6 @@ define ( 'CONTACT_IS_SHARING', 2);
define ( 'CONTACT_IS_FRIEND', 3);
/**
* Hook array order
*/
define ( 'HOOK_HOOK', 0);
define ( 'HOOK_FILE', 1);
define ( 'HOOK_FUNCTION', 2);
/**
* DB update return values
*/
@ -331,8 +324,17 @@ if(! class_exists('App')) {
private $curl_code;
private $curl_headers;
private $cached_profile_image;
private $cached_profile_picdate;
function __construct() {
global $default_timezone;
$this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
date_default_timezone_set($this->timezone);
$this->config = array();
$this->page = array();
$this->pager= array();
@ -407,9 +409,6 @@ if(! class_exists('App')) {
$this->argc = count($this->argv);
if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
$this->module = str_replace(".", "_", $this->argv[0]);
if(array_key_exists('2',$this->argv)) {
$this->category = $this->argv[2];
}
}
else {
$this->argc = 1;
@ -432,7 +431,7 @@ if(! class_exists('App')) {
* pagination
*/
$this->pager['page'] = ((x($_GET,'page')) ? $_GET['page'] : 1);
$this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
$this->pager['itemspage'] = 50;
$this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
$this->pager['total'] = 0;
@ -499,7 +498,7 @@ if(! class_exists('App')) {
}
function set_pager_itemspage($n) {
$this->pager['itemspage'] = intval($n);
$this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
$this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
}
@ -539,6 +538,28 @@ if(! class_exists('App')) {
return $this->curl_headers;
}
function get_cached_avatar_image($avatar_image){
if($this->cached_profile_image[$avatar_image])
return $this->cached_profile_image[$avatar_image];
$path_parts = explode("/",$avatar_image);
$common_filename = $path_parts[count($path_parts)-1];
if($this->cached_profile_picdate[$common_filename]){
$this->cached_profile_image[$avatar_image] = $avatar_image . $this->cached_profile_picdate[$common_filename];
} else {
$r = q("SELECT `contact`.`avatar-date` AS picdate FROM `contact` WHERE `contact`.`thumb` like \"%%/%s\"",
$common_filename);
if(! count($r)){
$this->cached_profile_image[$avatar_image] = $avatar_image;
} else {
$this->cached_profile_picdate[$common_filename] = "?rev=" . urlencode($r[0]['picdate']);
$this->cached_profile_image[$avatar_image] = $avatar_image . $this->cached_profile_picdate[$common_filename];
}
}
return $this->cached_profile_image[$avatar_image];
}
}
}
@ -1126,9 +1147,9 @@ if(! function_exists('profile_sidebar')) {
'fullname' => $profile['name'],
'firstname' => $firstname,
'lastname' => $lastname,
'photo300' => $a->get_baseurl() . '/photo/custom/300/' . $profile['uid'] . '.jpg',
'photo100' => $a->get_baseurl() . '/photo/custom/100/' . $profile['uid'] . '.jpg',
'photo50' => $a->get_baseurl() . '/photo/custom/50/' . $profile['uid'] . '.jpg',
'photo300' => $a->get_cached_avatar_image($a->get_baseurl() . '/photo/custom/300/' . $profile['uid'] . '.jpg'),
'photo100' => $a->get_cached_avatar_image($a->get_baseurl() . '/photo/custom/100/' . $profile['uid'] . '.jpg'),
'photo50' => $a->get_cached_avatar_image($a->get_baseurl() . '/photo/custom/50/' . $profile['uid'] . '.jpg'),
);
if (!$block){
@ -1363,7 +1384,7 @@ if(! function_exists('proc_run')) {
if(! function_exists('current_theme')) {
function current_theme(){
$app_base_themes = array('duepuntozero', 'loozah');
$app_base_themes = array('duepuntozero', 'dispy', 'quattro');
$a = get_app();
@ -1381,7 +1402,7 @@ if(! function_exists('current_theme')) {
return($t);
}
$fallback = glob('view/theme/*/style.[css|php]');
$fallback = array_merge(glob('view/theme/*/style.css'),glob('view/theme/*/style.php'));
if(count($fallback))
return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
@ -1573,3 +1594,30 @@ function zrl($s,$force = false) {
return $s . $achar . 'zrl=' . urlencode($mine);
return $s;
}
/**
* returns querystring as string from a mapped array
*
* @param params Array
* @return string
*/
function build_querystring($params, $name=null) {
$ret = "";
foreach($params as $key=>$val) {
if(is_array($val)) {
if($name==null) {
$ret .= build_querystring($val, $key);
} else {
$ret .= build_querystring($val, $name."[$key]");
}
} else {
$val = urlencode($val);
if($name!=null) {
$ret.=$name."[$key]"."=$val&";
} else {
$ret.= "$key=$val&";
}
}
}
return $ret;
}

View File

@ -139,6 +139,10 @@ function terminate_friendship($user,$self,$contact) {
if(! function_exists('mark_for_death')) {
function mark_for_death($contact) {
if($contact['archive'])
return;
if($contact['term-date'] == '0000-00-00 00:00:00') {
q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()),
@ -146,12 +150,23 @@ function mark_for_death($contact) {
);
}
else {
// TODO: We really should send a notification to the owner after 2-3 weeks
// so they won't be surprised when the contact vanishes and can take
// remedial action if this was a serious mistake or glitch
$expiry = $contact['term-date'] . ' + 32 days ';
if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) {
// relationship is really truly dead.
// archive them rather than delete
// though if the owner tries to unarchive them we'll start the whole process over again
contact_remove($contact['id']);
q("update contact set `archive` = 1 where id = %d limit 1",
intval($contact['id'])
);
//contact_remove($contact['id']);
}
}

View File

@ -121,7 +121,70 @@ class Photo {
$this->image = imagerotate($this->image,$degrees,0);
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
}
}
public function flip($horiz = true, $vert = false) {
$w = imagesx($this->image);
$h = imagesy($this->image);
$flipped = imagecreate($w, $h);
if($horiz) {
for ($x = 0; $x < $w; $x++) {
imagecopy($flipped, $this->image, $x, 0, $w - $x - 1, 0, 1, $h);
}
}
if($vert) {
for ($y = 0; $y < $h; $y++) {
imagecopy($flipped, $this->image, 0, $y, 0, $h - $y - 1, $w, 1);
}
}
$this->image = $flipped;
}
public function orient($filename) {
// based off comment on http://php.net/manual/en/function.imagerotate.php
if(! function_exists('exif_read_data'))
return;
$exif = exif_read_data($filename);
$ort = $exif['Orientation'];
switch($ort)
{
case 1: // nothing
break;
case 2: // horizontal flip
$this->flip();
break;
case 3: // 180 rotate left
$this->rotate(180);
break;
case 4: // vertical flip
$this->flip(false, true);
break;
case 5: // vertical flip + 90 rotate right
$this->flip(false, true);
$this->rotate(-90);
break;
case 6: // 90 rotate right
$this->rotate(-90);
break;
case 7: // horizontal flip + 90 rotate right
$this->flip();
$this->rotate(-90);
break;
case 8: // 90 rotate left
$this->rotate(90);
break;
}
}
@ -256,35 +319,81 @@ class Photo {
else
$guid = get_guid();
$r = q("INSERT INTO `photo`
( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
intval($uid),
intval($cid),
dbesc($guid),
dbesc($rid),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(basename($filename)),
dbesc($this->type),
dbesc($album),
intval($this->height),
intval($this->width),
dbesc($this->imageString()),
intval($scale),
intval($profile),
dbesc($allow_cid),
dbesc($allow_gid),
dbesc($deny_cid),
dbesc($deny_gid)
$x = q("select id from photo where `resource-id` = '%s' and uid = %d and `contact-id` = %d and `scale` = %d limit 1",
dbesc($rid),
intval($uid),
intval($cid),
intval($scale)
);
if(count($x)) {
$r = q("UPDATE `photo`
set `uid` = %d,
`contact-id` = %d,
`guid` = '%s',
`resource-id` = '%s',
`created` = '%s',
`edited` = '%s',
`filename` = '%s',
`type` = '%s',
`album` = '%s',
`height` = %d,
`width` = %d,
`data` = '%s',
`scale` = %d,
`profile` = %d,
`allow_cid` = '%s',
`allow_gid` = '%s',
`deny_cid` = '%s',
`deny_gid` = '%s'
where id = %d limit 1",
intval($uid),
intval($cid),
dbesc($guid),
dbesc($rid),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(basename($filename)),
dbesc($this->type),
dbesc($album),
intval($this->height),
intval($this->width),
dbesc($this->imageString()),
intval($scale),
intval($profile),
dbesc($allow_cid),
dbesc($allow_gid),
dbesc($deny_cid),
dbesc($deny_gid),
intval($x[0]['id'])
);
}
else {
$r = q("INSERT INTO `photo`
( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
intval($uid),
intval($cid),
dbesc($guid),
dbesc($rid),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc(basename($filename)),
dbesc($this->type),
dbesc($album),
intval($this->height),
intval($this->width),
dbesc($this->imageString()),
intval($scale),
intval($profile),
dbesc($allow_cid),
dbesc($allow_gid),
dbesc($deny_cid),
dbesc($deny_gid)
);
}
return $r;
}
}}
@ -326,6 +435,17 @@ function import_profile_photo($photo,$uid,$cid) {
$a = get_app();
$r = q("select `resource-id` from photo where `uid` = %d and `contact-id` = %d and `scale` = 4 and `album` = 'Contact Photos' limit 1",
intval($uid),
intval($cid)
);
if(count($r)) {
$hash = $r[0]['resource-id'];
}
else {
$hash = photo_new_resource();
}
$photo_failure = false;
$filename = basename($photo);
@ -340,8 +460,6 @@ function import_profile_photo($photo,$uid,$cid) {
$img->scaleImageSquare(175);
$hash = photo_new_resource();
$r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 4 );
if($r === false)
@ -361,8 +479,6 @@ function import_profile_photo($photo,$uid,$cid) {
if($r === false)
$photo_failure = true;
$photo = $a->get_baseurl() . '/photo/' . $hash . '-4.' . $img->getExt();
$thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.' . $img->getExt();
$micro = $a->get_baseurl() . '/photo/' . $hash . '-6.' . $img->getExt();

View File

@ -352,10 +352,11 @@ function probe_url($url, $mode = PROBE_NORMAL) {
$email_conversant = false;
$twitter = ((strpos($url,'twitter.com') !== false) ? true : false);
$lastfm = ((strpos($url,'last.fm/user') !== false) ? true : false);
$at_addr = ((strpos($url,'@') !== false) ? true : false);
if(! $twitter) {
if((! $twitter) && (! $lastfm)) {
if(strpos($url,'mailto:') !== false && $at_addr) {
$url = str_replace('mailto:','',$url);
@ -564,6 +565,14 @@ function probe_url($url, $mode = PROBE_NORMAL) {
$vcard['fn'] = $tid . '@twitter';
}
if($lastfm) {
$profile = $url;
$poll = str_replace(array('www.','last.fm/'),array('','ws.audioscrobbler.com/1.0/'),$url) . '/recenttracks.rss';
$vcard['nick'] = basename($url);
$vcard['fn'] = $vcard['nick'] . t(' on Last.fm');
$network = NETWORK_FEED;
}
if(! x($vcard,'fn'))
if(x($vcard,'nick'))
$vcard['fn'] = $vcard['nick'];

View File

@ -245,7 +245,7 @@
}
logger('api_user: ' . $extra_query . ' ' , $user);
logger('api_user: ' . $extra_query . ', user: ' . $user);
// user info
$uinfo = q("SELECT *, `contact`.`id` as `cid` FROM `contact`
WHERE 1
@ -719,14 +719,18 @@
if ($page<0) $page=0;
$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
$max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
$exclude_replies = (x($_REQUEST,'exclude_replies')?1:0);
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
$start = $page*$count;
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
$sql_extra = '';
if ($max_id > 0)
$sql_extra = 'AND `item`.`id` <= '.intval($max_id);
$sql_extra .= ' AND `item`.`id` <= '.intval($max_id);
if ($exclude_replies > 0)
$sql_extra .= ' AND `item`.`parent` = `item`.`id`';
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
@ -860,6 +864,8 @@
logger('API: api_statuses_show: '.$id);
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
//$sql_extra = "";
if ($_GET["conversation"] == "true") $sql_extra .= " AND `item`.`parent` = %d ORDER BY `received` ASC "; else $sql_extra .= " AND `item`.`id` = %d";
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
@ -870,19 +876,24 @@
AND `contact`.`id` = `item`.`contact-id`
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
$sql_extra
AND `item`.`id`=%d",
",
intval($id)
);
//var_dump($r);
$ret = api_format_items($r,$user_info);
$data = array('$status' => $ret[0]);
/*switch($type){
case "atom":
case "rss":
$data = api_rss_extra($a, $data, $user_info);
}*/
return api_apply_template("status", $type, $data);
//var_dump($ret);
if ($_GET["conversation"] == "true") {
$data = array('$statuses' => $ret);
return api_apply_template("timeline", $type, $data);
} else {
$data = array('$status' => $ret[0]);
/*switch($type){
case "atom":
case "rss":
$data = api_rss_extra($a, $data, $user_info);
}*/
return api_apply_template("status", $type, $data);
}
}
api_register_func('api/statuses/show','api_statuses_show', true);
@ -1061,11 +1072,14 @@
$page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
if ($page<0) $page=0;
$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
$exclude_replies = (x($_REQUEST,'exclude_replies')?1:0);
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
$start = $page*$count;
if ($user_info['self']==1) $sql_extra = "AND `item`.`wall` = 1 ";
$sql_extra = '';
if ($user_info['self']==1) $sql_extra .= " AND `item`.`wall` = 1 ";
if ($exclude_replies > 0) $sql_extra .= ' AND `item`.`parent` = `item`.`id`';
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
@ -1654,7 +1668,6 @@ account/update_profile_background_image
account/update_profile_image
blocks/create
blocks/destroy
oauth/authorize
Not implemented in status.net:
statuses/retweeted_to_me

View File

@ -18,19 +18,17 @@
if(! function_exists('load_config')) {
function load_config($family) {
global $a;
$r = q("SELECT * FROM `config` WHERE `cat` = '%s'",
dbesc($family)
);
$r = q("SELECT * FROM `config` WHERE `cat` = '%s'", dbesc($family));
if(count($r)) {
foreach($r as $rr) {
$k = $rr['k'];
if ($rr['cat'] === 'config') {
if ($family === 'config') {
$a->config[$k] = $rr['v'];
} else {
$a->config[$family][$k] = $rr['v'];
}
}
} else if ($rr['cat'] != 'config') {
} else if ($family != 'config') {
// Negative caching
$a->config[$family] = "!<unset>!";
}
@ -128,7 +126,7 @@ function load_pconfig($uid,$family) {
$k = $rr['k'];
$a->config[$uid][$family][$k] = $rr['v'];
}
} else if ($rr['cat'] != 'config') {
} else if ($family != 'config') {
// Negative caching
$a->config[$uid][$family] = "!<unset>!";
}

View File

@ -173,8 +173,8 @@ function localize_item(&$item){
$item['body'] = str_replace($mtch[0],'@[url=' . zrl($mtch[1]). ']',$item['body']);
}
}
// add zrl's to public images
if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
logger('matched');
foreach($matches as $mtch) {
$item['body'] = str_replace($mtch[0],'[url=' . zrl($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3] ,true) . '][img' . $mtch[4] . ']h' . $mtch[5] . '[/img][/url]',$item['body']);
}
@ -308,7 +308,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
$profile_avatar = $a->contacts[$normalised]['thumb'];
else
$profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
$profile_avatar = ((strlen($item['author-avatar'])) ? $a->get_cached_avatar_image($item['author-avatar']) : $item['thumb']);
$locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
call_hooks('render_location',$locate);
@ -546,7 +546,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
}
$likebuttons = '';
$shareable = ((($profile_owner == local_user()) && (! $item['private'])) ? true : false); //($mode != 'display') &&
$shareable = ((($profile_owner == local_user()) && ((! $item['private']) || $item['network'] === NETWORK_FEED)) ? true : false);
if($page_writeable) {
if($toplevelpost) {
@ -657,7 +657,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
$profile_avatar = $a->contacts[$normalised]['thumb'];
else
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $thumb);
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb));
$like = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
$dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');

View File

@ -87,7 +87,7 @@ function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d
$from = 'UTC';
if($to === '')
$to = 'UTC';
if($s === '')
if( ($s === '') || (! is_string($s)) )
$s = 'now';
// Slight hackish adjustment so that 'zero' datetime actually returns what is intended

View File

@ -1060,45 +1060,64 @@ function diaspora_comment($importer,$xml,$msg) {
}
$parent_item = $r[0];
$author_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle;
$author_signature = base64_decode($author_signature);
/* How Diaspora performs comment signature checking:
if(strcasecmp($diaspora_handle,$msg['author']) == 0) {
$person = $contact;
$key = $msg['key'];
}
else {
$person = find_diaspora_person_by_handle($diaspora_handle);
- If an item has been sent by the comment author to the top-level post owner to relay on
to the rest of the contacts on the top-level post, the top-level post owner should check
the author_signature, then create a parent_author_signature before relaying the comment on
- If an item has been relayed on by the top-level post owner, the contacts who receive it
check only the parent_author_signature. Basically, they trust that the top-level post
owner has already verified the authenticity of anything he/she sends out
- In either case, the signature that get checked is the signature created by the person
who sent the salmon
*/
if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey'];
else {
logger('diaspora_comment: unable to find author details');
return;
}
}
if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) {
logger('diaspora_comment: verification failed.');
return;
}
$signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle;
$key = $msg['key'];
if($parent_author_signature) {
$owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle;
// If a parent_author_signature exists, then we've received the comment
// relayed from the top-level post owner. There's no need to check the
// author_signature if the parent_author_signature is valid
$parent_author_signature = base64_decode($parent_author_signature);
$key = $msg['key'];
if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
logger('diaspora_comment: top-level owner verification failed.');
return;
}
}
else {
// If there's no parent_author_signature, then we've received the comment
// from the comment creator. In that case, the person is commenting on
// our post, so he/she must be a contact of ours and his/her public key
// should be in $msg['key']
if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) {
logger('diaspora_comment: owner verification failed.');
$author_signature = base64_decode($author_signature);
if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) {
logger('diaspora_comment: comment author verification failed.');
return;
}
}
// Phew! Everything checks out. Now create an item.
// Find the original comment author information.
// We need this to make sure we display the comment author
// information (name and avatar) correctly.
if(strcasecmp($diaspora_handle,$msg['author']) == 0)
$person = $contact;
else {
$person = find_diaspora_person_by_handle($diaspora_handle);
if(! is_array($person)) {
logger('diaspora_comment: unable to find author details');
return;
}
}
$body = diaspora2bb($text);
$message_id = $diaspora_handle . ':' . $guid;
@ -1613,7 +1632,7 @@ function diaspora_like($importer,$xml,$msg) {
intval($r[0]['id']),
intval($importer['uid'])
);*/
// FIXME
// FIXME--actually don't unless it turns out that Diaspora does indeed send out "false" likes
// send notification via proc_run()
return;
}
@ -1626,45 +1645,64 @@ function diaspora_like($importer,$xml,$msg) {
return;
}
/* How Diaspora performs "like" signature checking:
- If an item has been sent by the like author to the top-level post owner to relay on
to the rest of the contacts on the top-level post, the top-level post owner should check
the author_signature, then create a parent_author_signature before relaying the like on
- If an item has been relayed on by the top-level post owner, the contacts who receive it
check only the parent_author_signature. Basically, they trust that the top-level post
owner has already verified the authenticity of anything he/she sends out
- In either case, the signature that get checked is the signature created by the person
who sent the salmon
*/
$signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
$author_signature = base64_decode($author_signature);
if(strcasecmp($diaspora_handle,$msg['author']) == 0) {
$person = $contact;
$key = $msg['key'];
}
else {
$person = find_diaspora_person_by_handle($diaspora_handle);
if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey'];
else {
logger('diaspora_like: unable to find author details');
return;
}
}
if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) {
logger('diaspora_like: verification failed.');
return;
}
$key = $msg['key'];
if($parent_author_signature) {
//$owner_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
// If a parent_author_signature exists, then we've received the like
// relayed from the top-level post owner. There's no need to check the
// author_signature if the parent_author_signature is valid
$parent_author_signature = base64_decode($parent_author_signature);
$key = $msg['key'];
if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
logger('diaspora_like: owner verification failed.');
logger('diaspora_like: top-level owner verification failed.');
return;
}
}
else {
// If there's no parent_author_signature, then we've received the like
// from the like creator. In that case, the person is "like"ing
// our post, so he/she must be a contact of ours and his/her public key
// should be in $msg['key']
$author_signature = base64_decode($author_signature);
if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) {
logger('diaspora_like: like creator verification failed.');
return;
}
}
// Phew! Everything checks out. Now create an item.
// Find the original comment author information.
// We need this to make sure we display the comment author
// information (name and avatar) correctly.
if(strcasecmp($diaspora_handle,$msg['author']) == 0)
$person = $contact;
else {
$person = find_diaspora_person_by_handle($diaspora_handle);
if(! is_array($person)) {
logger('diaspora_like: unable to find author details');
return;
}
}
$uri = $diaspora_handle . ':' . $guid;
$activity = ACTIVITY_LIKE;
@ -1802,40 +1840,39 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
$signed_data = $guid . ';' . $type ;
$key = $msg['key'];
$sig_decode = base64_decode($sig);
/* How Diaspora performs relayable_retraction signature checking:
if(strcasecmp($diaspora_handle,$msg['author']) == 0) {
$person = $contact;
$key = $msg['key'];
}
else {
$person = find_diaspora_person_by_handle($diaspora_handle);
if(is_array($person) && x($person,'pubkey'))
$key = $person['pubkey'];
else {
logger('diaspora_signed_retraction: unable to find author details');
return;
}
}
if(! rsa_verify($signed_data,$sig_decode,$key,'sha256')) {
logger('diaspora_signed_retraction: retraction-owner verification failed.' . print_r($msg,true));
return;
}
- If an item has been sent by the item author to the top-level post owner to relay on
to the rest of the contacts on the top-level post, the top-level post owner checks
the author_signature, then creates a parent_author_signature before relaying the item on
- If an item has been relayed on by the top-level post owner, the contacts who receive it
check only the parent_author_signature. Basically, they trust that the top-level post
owner has already verified the authenticity of anything he/she sends out
- In either case, the signature that get checked is the signature created by the person
who sent the salmon
*/
if($parent_author_signature) {
$parent_author_signature = base64_decode($parent_author_signature);
$key = $msg['key'];
if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
logger('diaspora_signed_retraction: failed to verify person relaying the retraction (e.g. owner of a post relaying a retracted comment');
logger('diaspora_signed_retraction: top-level post owner verification failed');
return;
}
}
else {
$sig_decode = base64_decode($sig);
if(! rsa_verify($signed_data,$sig_decode,$key,'sha256')) {
logger('diaspora_signed_retraction: retraction owner verification failed.' . print_r($msg,true));
return;
}
}
if($type === 'StatusMessage' || $type === 'Comment' || $type === 'Like') {
$r = q("select * from item where guid = '%s' and uid = %d and not file like '%%[%%' limit 1",
@ -2113,7 +2150,7 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
$a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$theiraddr = $contact['addr'];
// $theiraddr = $contact['addr'];
// The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always
// return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent.
@ -2176,7 +2213,10 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
$a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$theiraddr = $contact['addr'];
// $theiraddr = $contact['addr'];
$body = $item['body'];
$text = html_entity_decode(bb2diaspora($body));
// The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always
@ -2195,26 +2235,30 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
$relay_retract = false;
$sql_sign_id = 'iid';
if( $item['deleted']) {
$tpl = get_markup_template('diaspora_relayable_retraction.tpl');
$relay_retract = true;
$sql_sign_id = 'retract_iid';
$target_type = ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
$sender_signed_text = $item['guid'] . ';' . $target_type ;
$sql_sign_id = 'retract_iid';
$tpl = get_markup_template('diaspora_relayable_retraction.tpl');
}
elseif($item['verb'] === ACTIVITY_LIKE) {
$tpl = get_markup_template('diaspora_like_relay.tpl');
$like = true;
$target_type = 'Post';
// $positive = (($item['deleted']) ? 'false' : 'true');
$positive = 'true';
$sender_signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr;
$tpl = get_markup_template('diaspora_like_relay.tpl');
}
else {
else { // item is a comment
$sender_signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
$tpl = get_markup_template('diaspora_comment_relay.tpl');
}
$body = $item['body'];
$text = html_entity_decode(bb2diaspora($body));
// fetch the original signature if the relayable was created by a Diaspora
// or DFRN user. Relayables for other networks are not supported.
@ -2235,51 +2279,20 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
// function is called
logger('diaspora_send_relay: original author signature not found, cannot send relayable');
return;
/*
$itemcontact = q("select * from contact where `id` = %d limit 1",
intval($item['contact-id'])
);
if(count($itemcontact)) {
if(! $itemcontact[0]['self']) {
$prefix = sprintf( t('[Relayed] Comment authored by %s from network %s'),
'['. $item['author-name'] . ']' . '(' . $item['author-link'] . ')',
network_to_name($itemcontact['network'])) . "\n";
// "$body" was assigned to "$text" above. It isn't used after that, so I don't think
// the following change will do anything
$body = $prefix . $body;
// I think this comment will fail upon reaching Diaspora, because "$signed_text" is not defined
}
}
else {
// I'm confused about this "else." Since it sets "$handle = $myaddr," it seems like it should be for the case
// where the top-level post owner commented on his own post, i.e. "$itemcontact[0]['self']" is true. But it's
// positioned to be for the case where "count($itemcontact)" is 0.
$handle = $myaddr;
if($like)
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $handle;
elseif($relay_retract)
$signed_text = $item['guid'] . ';' . $target_type;
else
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $handle;
$authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
q("insert into sign (`" . $sql_sign_id . "`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($item['id']),
dbesc($signed_text),
dbesc($authorsig),
dbesc($handle)
);
}
*/
}
// sign it with the top-level owner's signature
// Sign the relayable with the top-level owner's signature
//
// We'll use the $sender_signed_text that we just created, instead of the $signed_text
// stored in the database, because that provides the best chance that Diaspora will
// be able to reconstruct the signed text the same way we did. This is particularly a
// concern for the comment, whose signed text includes the text of the comment. The
// smallest change in the text of the comment, including removing whitespace, will
// make the signature verification fail. Since we translate from BB code to Diaspora's
// markup at the top of this function, which is AFTER we placed the original $signed_text
// in the database, it's hazardous to trust the original $signed_text.
$parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
$parentauthorsig = base64_encode(rsa_sign($sender_signed_text,$owner['uprvkey'],'sha256'));
$msg = replace_macros($tpl,array(
'$guid' => xmlify($item['guid']),

View File

@ -41,8 +41,8 @@ function notification($params) {
$subject = sprintf( t('[Friendica:Notify] New mail received at %s'),$sitename);
$preamble = sprintf( t('%s sent you a new private message at %s.'),$params['source_name'],$sitename);
$epreamble = sprintf( t('%s sent you %s.'),'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . t('a private message') . '[/url]');
$preamble = sprintf( t('%1$s sent you a new private message at %2$s.'),$params['source_name'],$sitename);
$epreamble = sprintf( t('%1$s sent you %2$s.'),'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . t('a private message') . '[/url]');
$sitelink = t('Please visit %s to view and/or reply to your private messages.');
$tsitelink = sprintf( $sitelink, $siteurl . '/message/' . $params['item']['id'] );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/message/' . $params['item']['id'] . '">' . $sitename . '</a>');
@ -66,27 +66,38 @@ function notification($params) {
);
}
$possess_desc = str_replace('<!item_type!>',item_post_type($p[0]),$possess_desc);
$item_post_type = item_post_type($p[0]);
//$possess_desc = str_replace('<!item_type!>',$possess_desc);
// "a post"
$dest_str = sprintf($possess_desc,'a');
$dest_str = sprintf(t('%1$s commented on [url=%2$s]a %3$s[/url]'),
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
$itemlink,
$item_post_type);
// "George Bull's post"
if($p)
$dest_str = sprintf($possess_desc,sprintf( t("%s's"),$p[0]['author-name']));
$dest_str = sprintf(t('%1$s commented on [url=%2$s]%3$s\'s %4$s[/url]'),
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
$itemlink,
$p[0]['author-name'],
$item_post_type);
// "your post"
if($p[0]['owner-name'] == $p[0]['author-name'] && $p[0]['wall'])
$dest_str = sprintf($possess_desc, t('your') );
$dest_str = sprintf(t('%1$s commented on [url=%2$s]your %3$s[/url]'),
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
$itemlink,
$item_post_type);
// Some mail softwares relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
$subject = sprintf( t('[Friendica:Notify] Comment to conversation #%d by %s'), $parent_id, $params['source_name']);
$subject = sprintf( t('[Friendica:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $params['source_name']);
$preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $params['source_name']);
$epreamble = sprintf( t('%s commented on %s.'), '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . $dest_str . '[/url]');
$epreamble = $dest_str;
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@ -97,9 +108,11 @@ function notification($params) {
if($params['type'] == NOTIFY_WALL) {
$subject = sprintf( t('[Friendica:Notify] %s posted to your profile wall') , $params['source_name']);
$preamble = sprintf( t('%s posted to your profile wall at %s') , $params['source_name'], $sitename);
$preamble = sprintf( t('%1$s posted to your profile wall at %2$s') , $params['source_name'], $sitename);
$epreamble = sprintf( t('%s posted to %s') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . t('your profile wall.') . '[/url]');
$epreamble = sprintf( t('%1$s posted to [url=%2s]your wall[/url]') ,
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
$itemlink);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@ -109,8 +122,10 @@ function notification($params) {
if($params['type'] == NOTIFY_TAGSELF) {
$subject = sprintf( t('[Friendica:Notify] %s tagged you') , $params['source_name']);
$preamble = sprintf( t('%s tagged you at %s') , $params['source_name'], $sitename);
$epreamble = sprintf( t('%s %s.') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=' . $params['link'] . ']' . t('tagged you') . '[/url]');
$preamble = sprintf( t('%1$s tagged you at %2$s') , $params['source_name'], $sitename);
$epreamble = sprintf( t('%1$s [url=%2$s]tagged you[/url].') ,
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
$params['link']);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@ -120,8 +135,10 @@ function notification($params) {
if($params['type'] == NOTIFY_TAGSHARE) {
$subject = sprintf( t('[Friendica:Notify] %s tagged your post') , $params['source_name']);
$preamble = sprintf( t('%s tagged your post at %s') , $params['source_name'], $sitename);
$epreamble = sprintf( t('%s tagged %s') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . t('your post') . '[/url]' );
$preamble = sprintf( t('%1$s tagged your post at %2$s') , $params['source_name'], $sitename);
$epreamble = sprintf( t('%1$s tagged [url=%2$s]your post[/url]') ,
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
$itemlink);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@ -131,8 +148,10 @@ function notification($params) {
if($params['type'] == NOTIFY_INTRO) {
$subject = sprintf( t('[Friendica:Notify] Introduction received'));
$preamble = sprintf( t('You\'ve received an introduction from \'%s\' at %s'), $params['source_name'], $sitename);
$epreamble = sprintf( t('You\'ve received %s from %s.'), '[url=$itemlink]' . t('an introduction') . '[/url]' , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$preamble = sprintf( t('You\'ve received an introduction from \'%1$s\' at %2$s'), $params['source_name'], $sitename);
$epreamble = sprintf( t('You\'ve received [url=%1$s]an introduction[/url] from %2$s.'),
$itemlink,
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$body = sprintf( t('You may visit their profile at %s'),$params['source_link']);
$sitelink = t('Please visit %s to approve or reject the introduction.');
@ -143,11 +162,12 @@ function notification($params) {
if($params['type'] == NOTIFY_SUGGEST) {
$subject = sprintf( t('[Friendica:Notify] Friend suggestion received'));
$preamble = sprintf( t('You\'ve received a friend suggestion from \'%s\' at %s'), $params['source_name'], $sitename);
$epreamble = sprintf( t('You\'ve received %s for %s from %s.'),
'[url=$itemlink]' . t('a friend suggestion') . '[/url]',
'[url=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/url]',
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$preamble = sprintf( t('You\'ve received a friend suggestion from \'%1$s\' at %2$s'), $params['source_name'], $sitename);
$epreamble = sprintf( t('You\'ve received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s.'),
$itemlink,
'[url=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/url]',
'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$body = t('Name:') . ' ' . $params['item']['name'] . "\n";
$body .= t('Photo:') . ' ' . $params['item']['photo'] . "\n";
$body .= sprintf( t('You may visit their profile at %s'),$params['item']['url']);

View File

@ -22,8 +22,6 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
if($a->argv[$x] === 'category' && $a->argc > ($x + 1) && strlen($a->argv[$x+1]))
$category = $a->argv[$x+1];
}
}
@ -448,6 +446,8 @@ function get_atom_elements($feed,$item) {
$res['body'] = $purifier->purify($res['body']);
$res['body'] = @html2bbcode($res['body']);
}
elseif(! $have_real_body) {
@ -816,6 +816,12 @@ function item_store($arr,$force_parent = false) {
if($r[0]['private'])
$arr['private'] = 1;
// Edge case. We host a public forum that was originally posted to privately.
// The original author commented, but as this is a comment, the permissions
// weren't fixed up so it will still show the comment as private unless we fix it here.
if((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private']))
$arr['private'] = 0;
}
else {
@ -910,6 +916,16 @@ function item_store($arr,$force_parent = false) {
intval($current_post)
);
$arr['id'] = $current_post;
$arr['parent'] = $parent_id;
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
$arr['private'] = $private;
$arr['deleted'] = $parent_deleted;
call_hooks('post_remote_end',$arr);
// update the commented timestamp on the parent
q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
@ -1250,6 +1266,12 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
return 3;
}
if($contact['term-date'] != '0000-00-00 00:00:00') {
logger("dfrn_deliver: $url back from the dead - removing mark for death");
require_once('include/Contact.php');
unmark_for_death($contact);
}
$res = parse_xml_string($xml);
return $res->status;
@ -1645,6 +1667,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
$r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
@ -1791,6 +1818,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
$r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
@ -1845,13 +1877,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$datarray['last-child'] = 1;
}
if($contact['network'] === NETWORK_FEED) {
if(! strlen($contact['notify'])) {
if(($contact['network'] === NETWORK_FEED) || (! strlen($contact['notify']))) {
// one way feed - no remote comment ability
$datarray['last-child'] = 0;
}
$datarray['private'] = 1;
}
if($contact['network'] === NETWORK_FEED)
$datarray['private'] = 1;
// This is my contact on another system, but it's really me.
// Turn this into a wall post.
@ -2277,7 +2308,12 @@ function local_delivery($importer,$data) {
if(count($r)) {
$iid = $r[0]['id'];
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
logger('received updated comment' , LOGGER_DEBUG);
$r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
@ -2456,6 +2492,11 @@ function local_delivery($importer,$data) {
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
$r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
@ -2622,6 +2663,11 @@ function local_delivery($importer,$data) {
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
$r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
@ -3358,3 +3404,69 @@ function drop_item($id,$interactive = true) {
}
}
function first_post_date($uid,$wall = false) {
$r = q("select id, created from item
where uid = %d and wall = %d and deleted = 0 and visible = 1 AND moderated = 0
and id = parent
order by created asc limit 1",
intval($uid),
intval($wall ? 1 : 0)
);
if(count($r)) {
// logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA);
return substr(datetime_convert('',date_default_timezone_get(),$r[0]['created']),0,10);
}
return false;
}
function posted_dates($uid,$wall) {
$dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d');
$dthen = first_post_date($uid,$wall);
if(! $dthen)
return array();
// If it's near the end of a long month, backup to the 28th so that in
// consecutive loops we'll always get a whole month difference.
if(intval(substr($dnow,8)) > 28)
$dnow = substr($dnow,0,8) . '28';
if(intval(substr($dthen,8)) > 28)
$dnow = substr($dthen,0,8) . '28';
$ret = array();
while($dnow >= $dthen) {
$dstart = substr($dnow,0,8) . '01';
$dend = substr($dnow,0,8) . get_dim(intval($dnow),intval(substr($dnow,5)));
$start_month = datetime_convert('','',$dstart,'Y-m-d');
$end_month = datetime_convert('','',$dend,'Y-m-d');
$str = day_translate(datetime_convert('','',$dnow,'F Y'));
$ret[] = array($str,$end_month,$start_month);
$dnow = datetime_convert('','',$dnow . ' -1 month', 'Y-m-d');
}
return $ret;
}
function posted_date_widget($url,$uid,$wall) {
$o = '';
// For former Facebook folks that left because of "timeline"
if($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget')))
return $o;
$ret = posted_dates($uid,$wall);
if(! count($ret))
return $o;
$o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
'$title' => t('Archives'),
'$size' => ((count($ret) > 6) ? 6 : count($ret)),
'$url' => $url,
'$dates' => $ret
));
return $o;
}

View File

@ -55,7 +55,7 @@ function nav(&$a) {
// user info
$r = q("SELECT micro FROM contact WHERE uid=%d AND self=1", intval($a->user['uid']));
$userinfo = array(
'icon' => (count($r) ? $r[0]['micro']: $a->get_baseurl($ssl_state)."/images/person-48.jpg"),
'icon' => (count($r) ? $a->get_cached_avatar_image($r[0]['micro']) : $a->get_baseurl($ssl_state)."/images/person-48.jpg"),
'name' => $a->user['username'],
);

View File

@ -36,11 +36,6 @@ function onepoll_run($argv, $argc){
logger('onepoll: start');
$abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1)
$abandon_days = 0;
$manual_id = 0;
$generation = 0;
$hub_update = false;
@ -54,9 +49,7 @@ function onepoll_run($argv, $argc){
logger('onepoll: no contact');
return;
}
if(was_recently_delayed($contact_id))
return;
$d = datetime_convert();
@ -64,11 +57,6 @@ function onepoll_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`.* FROM `contact`
WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
AND NOT `network` IN ( '%s', '%s' )
@ -88,14 +76,13 @@ function onepoll_run($argv, $argc){
$contact = $contacts[0];
$xml = false;
$t = $contact['last-update'];
if($contact['subhub']) {
$interval = get_config('system','pushpoll_frequency');
$contact['priority'] = (($interval !== false) ? intval($interval) : 3);
$poll_interval = get_config('system','pushpoll_frequency');
$contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
$hub_update = false;
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
@ -139,15 +126,18 @@ function onepoll_run($argv, $argc){
. '&perm=' . $perm ;
$handshake_xml = fetch_url($url);
$html_code = $a->get_curl_code();
logger('onepoll: handshake with url ' . $url . ' returns xml: ' . $handshake_xml, LOGGER_DATA);
if(! $handshake_xml) {
if((! strlen($handshake_xml)) || ($html_code >= 400) || (! $html_code)) {
logger("poller: $url appears to be dead - marking for death ");
// dead connection - might be a transient event, or this might
// mean the software was uninstalled or the domain expired.
// Will keep trying for one month.
mark_for_death($contact);
// set the last-update so we don't keep polling
@ -161,6 +151,9 @@ function onepoll_run($argv, $argc){
if(! strstr($handshake_xml,'<?xml')) {
logger('poller: response from ' . $url . ' did not contain XML.');
mark_for_death($contact);
$r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()),
intval($contact['id'])

View File

@ -148,7 +148,9 @@ function load_hooks() {
$r = q("SELECT * FROM `hook` WHERE 1");
if(count($r)) {
foreach($r as $rr) {
$a->hooks[] = array($rr['hook'], $rr['file'], $rr['function']);
if(! array_key_exists($rr['hook'],$a->hooks))
$a->hooks[$rr['hook']] = array();
$a->hooks[$rr['hook']][] = array($rr['file'],$rr['function']);
}
}
}}
@ -158,25 +160,24 @@ if(! function_exists('call_hooks')) {
function call_hooks($name, &$data = null) {
$a = get_app();
if(count($a->hooks)) {
foreach($a->hooks as $hook) {
if($hook[HOOK_HOOK] === $name) {
@include_once($hook[HOOK_FILE]);
if(function_exists($hook[HOOK_FUNCTION])) {
$func = $hook[HOOK_FUNCTION];
$func($a,$data);
}
else {
// remove orphan hooks
q("delete from hook where hook = '%s' and file = '$s' and function = '%s' limit 1",
dbesc($hook[HOOK_HOOK]),
dbesc($hook[HOOK_FILE]),
dbesc($hook[HOOK_FUNCTION])
);
}
if((is_array($a->hooks)) && (array_key_exists($name,$a->hooks))) {
foreach($a->hooks[$name] as $hook) {
@include_once($hook[0]);
if(function_exists($hook[1])) {
$func = $hook[1];
$func($a,$data);
}
else {
// remove orphan hooks
q("delete from hook where hook = '%s' and file = '$s' and function = '%s' limit 1",
dbesc($name),
dbesc($hook[0]),
dbesc($hook[1])
);
}
}
}
}}

View File

@ -201,8 +201,8 @@ function poller_run($argv, $argc){
if($contact['subhub']) {
$interval = get_config('system','pushpoll_frequency');
$contact['priority'] = (($interval !== false) ? intval($interval) : 3);
$poll_interval = get_config('system','pushpoll_frequency');
$contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
$hub_update = false;
if((datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) || $force)

View File

@ -23,6 +23,13 @@ function was_recently_delayed($cid) {
);
if(count($r))
return true;
$r = q("select `term-date` from contact where id = %d and `term-date` != '' and `term-date` != '0000-00-00 00:00:00' limit 1",
intval($cid)
);
if(count($r))
return true;
return false;
}

View File

@ -1059,7 +1059,7 @@ function feed_salmonlinks($nick) {
if(! function_exists('get_plink')) {
function get_plink($item) {
$a = get_app();
if (x($item,'plink') && (! $item['private'])){
if (x($item,'plink') && ((! $item['private']) || ($item['network'] === NETWORK_FEED))){
return array(
'href' => $item['plink'],
'title' => t('link to source'),
@ -1255,13 +1255,13 @@ function bb_translate_video($s) {
function html2bb_video($s) {
$s = preg_replace('#<object[^>]+>(.*?)https+://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+)(.*?)</object>#ism',
$s = preg_replace('#<object[^>]+>(.*?)https?://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+)(.*?)</object>#ism',
'[youtube]$2[/youtube]', $s);
$s = preg_replace('#<iframe[^>](.*?)https+://www.youtube.com/embed/([A-Za-z0-9\-_=]+)(.*?)</iframe>#ism',
$s = preg_replace('#<iframe[^>](.*?)https?://www.youtube.com/embed/([A-Za-z0-9\-_=]+)(.*?)</iframe>#ism',
'[youtube]$2[/youtube]', $s);
$s = preg_replace('#<iframe[^>](.*?)https+://player.vimeo.com/video/([0-9]+)(.*?)</iframe>#ism',
$s = preg_replace('#<iframe[^>](.*?)https?://player.vimeo.com/video/([0-9]+)(.*?)</iframe>#ism',
'[vimeo]$2[/vimeo]', $s);
return $s;
@ -1541,3 +1541,16 @@ function protect_sprintf($s) {
return(str_replace('%','%%',$s));
}
function is_a_date_arg($s) {
$i = intval($s);
if($i > 1900) {
$y = date('Y');
if($i <= $y+1 && strpos($s,'-') == 4) {
$m = intval(substr($s,5));
if($m > 0 && $m <= 12)
return true;
}
}
return false;
}

View File

@ -59,8 +59,7 @@ if(! $install) {
/**
*
* Important stuff we always need to do.
* Initialise authentication and date and time.
* Create the HTML head for the page, even if we may not use it (xml, etc.)
*
* The order of these may be important so use caution if you think they're all
* intertwingled with no logical order and decide to sort it out. Some of the
* dependencies have changed, but at least at one time in the recent past - the
@ -68,12 +67,6 @@ if(! $install) {
*
*/
require_once("datetime.php");
$a->timezone = (($default_timezone) ? $default_timezone : 'UTC');
date_default_timezone_set($a->timezone);
session_start();
/**
@ -253,7 +246,10 @@ if(! $install)
if($a->module_loaded) {
$a->page['page_title'] = $a->module;
$placeholder = '';
if(function_exists($a->module . '_init')) {
call_hooks($a->module . '_mod_init', $placeholder);
$func = $a->module . '_init';
$func($a);
}
@ -273,18 +269,25 @@ if($a->module_loaded) {
if(($_SERVER['REQUEST_METHOD'] === 'POST') && (! $a->error)
&& (function_exists($a->module . '_post'))
&& (! x($_POST,'auth-params'))) {
call_hooks($a->module . '_mod_post', $_POST);
$func = $a->module . '_post';
$func($a);
}
if((! $a->error) && (function_exists($a->module . '_afterpost'))) {
call_hooks($a->module . '_mod_afterpost',$placeholder);
$func = $a->module . '_afterpost';
$func($a);
}
if((! $a->error) && (function_exists($a->module . '_content'))) {
$arr = array('content' => $a->page['content']);
call_hooks($a->module . '_mod_content', $arr);
$a->page['content'] = $arr['content'];
$func = $a->module . '_content';
$a->page['content'] .= $func($a);
$arr = array('content' => $func($a));
call_hooks($a->module . '_mod_aftercontent', $arr);
$a->page['content'] .= $arr['content'];
}
}

View File

@ -709,7 +709,7 @@ class SimplePie
* @see SimplePie::strip_htmltags()
* @access private
*/
var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
/**
* The SimplePie class contains feed level data and options
@ -14803,7 +14803,7 @@ class SimplePie_Sanitize
// Options
var $remove_div = true;
var $image_handler = '';
var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
var $encode_instead_of_strip = false;
var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
var $strip_comments = false;
@ -14892,7 +14892,7 @@ class SimplePie_Sanitize
}
}
function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
{
if ($tags)
{

View File

@ -335,6 +335,7 @@ function contacts_content(&$a) {
$tab_tpl = get_markup_template('common_tabs.tpl');
$tab_str = replace_macros($tab_tpl, array('$tabs' => $tabs));
$lost_contact = (($contact['archive'] && $contact['term-date'] != '0000-00-00 00:00:00' && $contact['term-date'] < datetime_convert('','','now')) ? t('Communications lost with this contact!') : '');
$o .= replace_macros($tpl,array(
'$header' => t('Contact Editor'),
@ -359,6 +360,7 @@ function contacts_content(&$a) {
'$poll_interval' => contact_poll_interval($contact['priority'],(! $poll_enabled)),
'$poll_enabled' => $poll_enabled,
'$lastupdtext' => t('Last update:'),
'$lost_contact' => $lost_contact,
'$updpub' => t('Update public posts'),
'$last_update' => $last_update,
'$udnow' => t('Update now'),
@ -477,12 +479,13 @@ function contacts_content(&$a) {
$searching = false;
if($search) {
$search_hdr = $search;
$search = dbesc($search.'*');
$search_txt = dbesc(protect_sprintf(preg_quote($search)));
$searching = true;
}
$sql_extra .= ((strlen($search)) ? " AND MATCH `name` AGAINST ('$search' IN BOOLEAN MODE) " : "");
$sql_extra .= (($searching) ? " AND `name` REGEXP '$search_txt' " : "");
if($nets)
$sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
@ -499,7 +502,6 @@ function contacts_content(&$a) {
}
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 $sql_extra $sql_extra2 ORDER BY `name` ASC LIMIT %d , %d ",
intval($_SESSION['uid']),
intval($a->pager['start']),
@ -566,7 +568,7 @@ function contacts_content(&$a) {
'$total' => $total,
'$search' => $search_hdr,
'$desc' => t('Search your contacts'),
'$finding' => (strlen($search) ? t('Finding: ') . "'" . $search . "'" : ""),
'$finding' => (($searching) ? t('Finding: ') . "'" . $search . "'" : ""),
'$submit' => t('Find'),
'$cmd' => $a->cmd,
'$contacts' => $contacts,

View File

@ -443,7 +443,7 @@ function dfrn_poll_content(&$a) {
$encrypted_id = '';
$id_str = $my_id . '.' . mt_rand(1000,9999);
if($r[0]['duplex'] && strlen($r[0]['pubkey'])) {
if(($r[0]['duplex'] && strlen($r[0]['pubkey'])) || (! strlen($r[0]['prvkey']))) {
openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']);
openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']);
}

View File

@ -170,6 +170,21 @@ function dfrn_request_post(&$a) {
info( t("Introduction complete.") . EOL);
}
$r = q("select id from contact where uid = %d and url = '%s' and `site-pubkey` = '%s' limit 1",
intval(local_user()),
dbesc($dfrn_url),
$parms['key'] // this was already escaped
);
if(count($r)) {
$g = q("select def_gid from user where uid = %d limit 1",
intval(local_user())
);
if($g && intval($g[0]['def_gid'])) {
require_once('include/group.php');
group_add_member(local_user(),'',$r[0]['id'],$g[0]['def_gid']);
}
}
/**
* Allow the blocked remote notification to complete
*/

View File

@ -116,7 +116,7 @@ function directory_content(&$a) {
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $rr[$photo],
'$photo' => $a->get_cached_avatar_image($rr[$photo]),
'$alt-text' => $rr['name'],
'$name' => $rr['name'],
'$details' => $pdesc . $details

View File

@ -96,7 +96,7 @@ function manage_content(&$a) {
$o .= '<div id="identity-selector-wrapper">' . "\r\n";
$o .= '<form action="manage" method="post" >' . "\r\n";
$o .= '<select name="identity" size="4">' . "\r\n";
$o .= '<select name="identity" size="4" onchange="this.form.submit();" >' . "\r\n";
foreach($a->identities as $rr) {
$selected = (($rr['nickname'] === $a->user['nickname']) ? ' selected="selected" ' : '');
@ -106,7 +106,8 @@ function manage_content(&$a) {
$o .= '</select>' . "\r\n";
$o .= '<div id="identity-select-break"></div>' . "\r\n";
$o .= '<input id="identity-submit" type="submit" name="submit" value="' . t('Submit') . '" /></div></form>' . "\r\n";
// $o .= '<input id="identity-submit" type="submit" name="submit" value="' . t('Submit') . '" />';
$o .= '</div></form>' . "\r\n";
return $o;

View File

@ -407,6 +407,7 @@ function message_content(&$a) {
'$parent' => $parent,
'$upload' => t('Upload photo'),
'$insert' => t('Insert web link'),
'$submit' => t('Submit'),
'$wait' => t('Please wait')
));

View File

@ -7,13 +7,28 @@ function network_init(&$a) {
return;
}
$is_a_date_query = false;
if($a->argc > 1) {
for($x = 1; $x < $a->argc; $x ++) {
if(is_a_date_arg($a->argv[$x])) {
$is_a_date_query = true;
break;
}
}
}
// convert query string to array and remove first element (wich is friendica args)
$query_array = array();
parse_str($a->query_string, $query_array);
array_shift($query_array);
// fetch last used tab and redirect if needed
$sel_tabs = network_query_get_sel_tab($a);
$last_sel_tabs = get_pconfig(local_user(), 'network.view','tab.selected');
if (is_array($last_sel_tabs)){
$tab_urls = array(
'/network?f=&order=comment', //all
'/network?f=&order=comment',//all
'/network?f=&order=post', //postord
'/network?f=&conv=1', //conv
'/network/new', //new
@ -24,10 +39,24 @@ function network_init(&$a) {
// redirect if current selected tab is 'no_active' and
// last selected tab is _not_ 'all_active'.
if ($sel_tabs[0] == 'active' && $last_sel_tabs[0]!='active') {
// and this isn't a date query
if ($sel_tabs[0] == 'active' && $last_sel_tabs[0]!='active' && (! $is_a_date_query)) {
$k = array_search('active', $last_sel_tabs);
//echo "<pre>"; var_dump($sel_tabs, $last_sel_tabs, $tab_urlsm, $k, $tab_urls[$k]); killme();
goaway($a->get_baseurl() . $tab_urls[$k]);
// merge tab querystring with request querystring
$dest_qa = array();
list($dest_url,$dest_qs) = explode("?", $tab_urls[$k]);
parse_str( $dest_qs, $dest_qa);
$dest_qa = array_merge($query_array, $dest_qa);
$dest_qs = build_querystring($dest_qa);
// groups filter is in form of "network/nnn". Add it to $dest_url, if it's possible
if ($a->argc==2 && is_numeric($a->argv[1]) && strpos($dest_url, "/",1)===false){
$dest_url .= "/".$a->argv[1];
}
goaway($a->get_baseurl() . $dest_url."?".$dest_qs);
}
}
@ -35,6 +64,7 @@ function network_init(&$a) {
require_once('include/group.php');
require_once('include/contact_widgets.php');
require_once('include/items.php');
if(! x($a->page,'aside'))
$a->page['aside'] = '';
@ -66,8 +96,9 @@ function network_init(&$a) {
if(x($_GET,'search')) {
$a->page['content'] .= '<h2>' . t('Search Results For:') . ' ' . $search . '</h2>';
}
$a->page['aside'] .= group_side('network','network',true,$group_id);
$a->page['aside'] .= posted_date_widget($a->get_baseurl() . '/network',local_user(),false);
$a->page['aside'] .= networks_widget($a->get_baseurl(true) . '/network',(x($_GET, 'nets') ? $_GET['nets'] : ''));
$a->page['aside'] .= saved_searches($search);
$a->page['aside'] .= fileas_widget($a->get_baseurl(true) . '/network',(x($_GET, 'file') ? $_GET['file'] : ''));
@ -208,6 +239,34 @@ function network_content(&$a, $update = 0) {
call_hooks('network_content_init', $arr);
$datequery = $datequery2 = '';
$group = 0;
$nouveau = false;
if($a->argc > 1) {
for($x = 1; $x < $a->argc; $x ++) {
if(is_a_date_arg($a->argv[$x])) {
if($datequery)
$datequery2 = escape_tags($a->argv[$x]);
else {
$datequery = escape_tags($a->argv[$x]);
$_GET['order'] = 'post';
}
}
elseif($a->argv[$x] === 'new') {
$nouveau = true;
}
elseif(intval($a->argv[$x])) {
$group = intval($a->argv[$x]);
$def_acl = array('allow_gid' => '<' . $group . '>');
}
}
}
$o = '';
// item filter tabs
@ -218,43 +277,46 @@ function network_content(&$a, $update = 0) {
// if no tabs are selected, defaults to comments
if ($no_active=='active') $all_active='active';
//echo "<pre>"; var_dump($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active); killme();
$cmd = (($datequery) ? '' : $a->cmd);
$len_naked_cmd = strlen(str_replace('/new','',$cmd));
// tabs
$tabs = array(
array(
'label' => t('Commented Order'),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $a->cmd) . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
'sel'=>$all_active,
'title'=> t('Sort by Comment Date'),
),
array(
'label' => t('Posted Order'),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $a->cmd) . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
'sel'=>$postord_active,
'title' => t('Sort by Post Date'),
),
array(
'label' => t('Personal'),
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
'sel' => $conv_active,
'title' => t('Posts that mention or involve you'),
),
array(
'label' => t('New'),
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $a->cmd) . '/new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''),
'url' => $a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ($len_naked_cmd ? '/' : '') . 'new' . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : ''),
'sel' => $new_active,
'title' => t('Activity Stream - by date'),
),
array(
'label' => t('Starred'),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
'sel'=>$starred_active,
'title' => t('Favourite Posts'),
),
array(
'label' => t('Shared Links'),
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&bmark=1',
'url'=>$a->get_baseurl(true) . '/' . str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&bmark=1',
'sel'=>$bookmarked_active,
'title'=> t('Interesting Links'),
),
@ -285,9 +347,6 @@ function network_content(&$a, $update = 0) {
$contact_id = $a->cid;
$group = 0;
$nouveau = false;
require_once('include/acl_selectors.php');
$cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0);
@ -302,17 +361,7 @@ function network_content(&$a, $update = 0) {
$cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
$file = ((x($_GET,'file')) ? $_GET['file'] : '');
if(($a->argc > 2) && $a->argv[2] === 'new')
$nouveau = true;
if($a->argc > 1) {
if($a->argv[1] === 'new')
$nouveau = true;
else {
$group = intval($a->argv[1]);
$def_acl = array('allow_gid' => '<' . $group . '>');
}
}
if(x($_GET,'search') || x($_GET,'file'))
$nouveau = true;
@ -452,7 +501,17 @@ function network_content(&$a, $update = 0) {
. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
}
$sql_extra3 = '';
if($datequery) {
$sql_extra3 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery))));
}
if($datequery2) {
$sql_extra3 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
}
$sql_extra2 = (($nouveau) ? '' : " AND `item`.`parent` = `item`.`id` ");
$sql_extra3 = (($nouveau) ? '' : $sql_extra3);
if(x($_GET,'search')) {
$search = escape_tags($_GET['search']);
@ -508,7 +567,7 @@ function network_content(&$a, $update = 0) {
FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
$sql_extra2
$sql_extra2 $sql_extra3
$sql_extra $sql_nets ",
intval($_SESSION['uid'])
);
@ -560,7 +619,7 @@ function network_content(&$a, $update = 0) {
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
and `item`.`moderated` = 0 and `item`.`unseen` = 1
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
$sql_extra $sql_nets ",
$sql_extra3 $sql_extra $sql_nets ",
intval(local_user())
);
}
@ -570,7 +629,7 @@ function network_content(&$a, $update = 0) {
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
AND `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
AND `item`.`parent` = `item`.`id`
$sql_extra $sql_nets
$sql_extra3 $sql_extra $sql_nets
ORDER BY `item`.$ordering DESC $pager_sql ",
intval(local_user())
);

View File

@ -36,7 +36,7 @@ function photos_init(&$a) {
$o .= '<div class="vcard">';
$o .= '<div class="fn">' . $a->data['user']['username'] . '</div>';
$o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg" alt="' . $a->data['user']['username'] . '" /></div>';
$o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg') . '" alt="' . $a->data['user']['username'] . '" /></div>';
$o .= '</div>';
if(! intval($a->data['user']['hidewall'])) {
@ -306,7 +306,8 @@ function photos_post(&$a) {
$albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y');
if((x($_POST,'rotate') !== false) && (intval($_POST['rotate']) == 1)) {
if((x($_POST,'rotate') !== false) &&
( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
logger('rotate');
$r = q("select * from photo where `resource-id` = '%s' and uid = %d and scale = 0 limit 1",
@ -316,7 +317,8 @@ function photos_post(&$a) {
if(count($r)) {
$ph = new Photo($r[0]['data'], $r[0]['type']);
if($ph->is_valid()) {
$ph->rotate(270);
$rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
$ph->rotate($rotate_deg);
$width = $ph->getWidth();
$height = $ph->getHeight();
@ -325,8 +327,8 @@ function photos_post(&$a) {
dbesc($ph->imageString()),
intval($height),
intval($width),
dbesc($resource_id),
intval($page_owner_uid)
dbesc($resource_id),
intval($page_owner_uid)
);
if($width > 640 || $height > 640) {
@ -338,8 +340,8 @@ function photos_post(&$a) {
dbesc($ph->imageString()),
intval($height),
intval($width),
dbesc($resource_id),
intval($page_owner_uid)
dbesc($resource_id),
intval($page_owner_uid)
);
}
@ -352,8 +354,8 @@ function photos_post(&$a) {
dbesc($ph->imageString()),
intval($height),
intval($width),
dbesc($resource_id),
intval($page_owner_uid)
dbesc($resource_id),
intval($page_owner_uid)
);
}
}
@ -718,6 +720,7 @@ function photos_post(&$a) {
killme();
}
$ph->orient($src);
@unlink($src);
$width = $ph->getWidth();
@ -1250,7 +1253,8 @@ function photos_content(&$a) {
$edit_tpl = get_markup_template('photo_edit.tpl');
$edit = replace_macros($edit_tpl, array(
'$id' => $ph[0]['id'],
'$rotate' => t('Rotate CW'),
'$rotatecw' => t('Rotate CW (right)'),
'$rotateccw' => t('Rotate CCW (left)'),
'$album' => template_escape($ph[0]['album']),
'$newalbum' => t('New album name'),
'$nickname' => $a->data['user']['nickname'],

View File

@ -67,11 +67,23 @@ function profile_init(&$a) {
function profile_content(&$a, $update = 0) {
if (x($a->category)) {
$category = $a->category;
$category = $datequery = $datequery2 = '';
if($a->argc > 2) {
for($x = 2; $x < $a->argc; $x ++) {
if(is_a_date_arg($a->argv[$x])) {
if($datequery)
$datequery2 = escape_tags($a->argv[$x]);
else
$datequery = escape_tags($a->argv[$x]);
}
else
$category = $a->argv[$x];
}
}
else {
$category = ((x($_GET,'category')) ? $_GET['category'] : '');
if(! x($category)) {
$category = ((x($_GET,'category')) ? $_GET['category'] : '');
}
if(get_config('system','block_public') && (! local_user()) && (! remote_user())) {
@ -82,6 +94,8 @@ function profile_content(&$a, $update = 0) {
require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
require_once('include/items.php');
$groups = array();
$tab = 'posts';
@ -97,6 +111,7 @@ function profile_content(&$a, $update = 0) {
}
}
$contact = null;
$remote_contact = false;
@ -155,6 +170,7 @@ function profile_content(&$a, $update = 0) {
$celeb = ((($a->profile['page-flags'] == PAGE_SOAPBOX) || ($a->profile['page-flags'] == PAGE_COMMUNITY)) ? true : false);
$a->page['aside'] .= posted_date_widget($a->get_baseurl(true) . '/profile/' . $a->profile['nickname'],$a->profile['profile_uid'],true);
$a->page['aside'] .= categories_widget($a->get_baseurl(true) . '/profile/' . $a->profile['nickname'],(x($category) ? xmlify($category) : ''));
if(can_write_wall($a,$a->profile['profile_uid'])) {
@ -200,16 +216,24 @@ function profile_content(&$a, $update = 0) {
}
else {
if(x($category)) {
$sql_extra .= file_tag_file_query('item',$category,'category');
if(x($category)) {
$sql_extra .= protect_sprintf(file_tag_file_query('item',$category,'category'));
}
if($datequery) {
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery))));
}
if($datequery2) {
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
}
$r = q("SELECT COUNT(*) AS `total`
FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
and `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
AND `item`.`id` = `item`.`parent` AND `item`.`wall` = 1
$sql_extra ",
$sql_extra $sql_extra2 ",
intval($a->profile['profile_uid'])
);
@ -225,7 +249,7 @@ function profile_content(&$a, $update = 0) {
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
and `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
AND `item`.`id` = `item`.`parent` AND `item`.`wall` = 1
$sql_extra
$sql_extra $sql_extra2
ORDER BY `item`.`created` DESC $pager_sql ",
intval($a->profile['profile_uid'])

View File

@ -652,7 +652,7 @@ function profiles_content(&$a) {
foreach($r as $rr) {
$o .= replace_macros($tpl, array(
'$photo' => $rr['thumb'],
'$photo' => $a->get_cached_avatar_image($rr['thumb']),
'$id' => $rr['id'],
'$alt' => t('Profile Image'),
'$profile_name' => $rr['profile-name'],

View File

@ -8,10 +8,10 @@ function share_init(&$a) {
if((! $post_id) || (! local_user()))
killme();
$r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
$r = q("SELECT item.*, contact.network FROM `item` left join contact on `item`.`contact-id` = `contact`.`id` WHERE `item`.`id` = %d LIMIT 1",
intval($post_id)
);
if(! count($r) || $r[0]['private'])
if(! count($r) || ($r[0]['private'] && ($r[0]['network'] != NETWORK_FEED)))
killme();
$o = '';

182
spec/zot-2012.txt Normal file
View File

@ -0,0 +1,182 @@
Initial cut at Zot-2012 protocol. This is a very rough draft of some very rough ideas and concepts.
It is not yet intended to be a definitive specification and many things like the security handshakes are yet to be specified precisely.
All communications are https
First create a global unique userid
Site userid:
https://macgirvin.com/1
$guuid = base64url_encode(hash('whirlpool','https://macgirvin.com/1.' . mt_rand(1000000,9999999),1);
Then create a hashed site destination.
$gduid = base64url_encode(hash('whirlpool', $guuid . 'https://macgirvin.com',1);
These two keys will identify you as a person+site pair in the future.
You will also obtain a password upon introducing yourself to a site.
This can be used to edit locations in the future. You will always keep your global unique userid
The steps to connect with somebody are to first register your location with their site.
Then introduce yourself to the person. This contains flags for the desired relationship.
At some future time, they may confirm and adjust the relationship based on their comfort level.
Lack of confirmation is tantamount to denial.
You can set either or both of FOLLOW and SHARE which indicates the relationship from your viewpoint.
They may do likewise.
A relationship is based on you as a person and provided you register new locations with the site you can post from anywhere.
You do not need to register locations with each person, only with the site.
Introduce yourself to a site:
POST https://example.com/post
{
'type' => 'register'
'person' => $guuid
'address' => $gduid
'site' => 'https://macgirvin.com'
'info' => 'mike@macgirvin.com'
}
Returns:
{
'success' => 'true'
'pass' => me_encrypt($random_string)
}
---
Add location
---
POST https://example.com/post
{
'type' => 'location'
'person' => $guuid
'address' => $new_gduid
'site' => 'https://newsite.com'
'info' => 'mike@newsite.com'
'pass' => me_encrypt($gduid . '.' . $pass)
}
Returns:
{
'success' => 'true'
'pass' => me_encrypt($random_string)
}
---
Remove location
---
POST https://example.com/post
{
'type' => 'remove_location'
'person' => $guuid
'address' => $gduid
'pass' => me_encrypt($pass)
}
Returns:
{
'success' => 'true'
'message' => 'OK'
}
------------
Make friends
------------
This message may be reversed/repeated by the destination site to confirm.
flags is the desired friendship bits. The same message may be used with different flags
to edit or remove a relationship.
POST https://example.com/post
{
'type' => 'contact'
'person' => $gduid
'address' => $guuid
'target' => 'bobjones@example.com'
'flags' => HIDDEN=0,FOLLOW=1,SHARE=1,NOHIDDEN=1,NOFOLLOW=0,NOSHARE=0
'confirm' => me_encrypt($guuid . '.' . $pass)
}
Returns:
{
'success' => 'true'
'message' => 'OK'
'flags' => PENDING=1
}
-------
Message
-------
Passing messages is done asynchronously. This may (potentially) relieve a lot of the burden of distribution from the posting site. If you're on site 'A' and make a post, site 'A' just contacts any downstream sites and informs them that there is new content (via a $post_id). The downstream site initiates the actual data transfer.
POST https://example.com/post
{
'type' => 'post'
'person' => $guuid
'address' => $gduid
'post' => $post_id
}
Returns:
{
'success' => 'true'
'message' => 'OK'
}
--------
Callback
--------
POST https://macgirvin.com/post
{
'type' => 'retrieve'
'retrieve' => $post_id
'challenge' => you_encrypt('abc123')
'verify' => me_encrypt('xyz456' . '.' . $gduid)
}
Returns:
{
'success' => 'true'
'message' => 'OK'
'response' => 'abc123'
'data' => encrypted or raw structured post
}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,3 @@
<div class="clear"></div>
<div id="categories-sidebar" class="widget">
<h3>$title</h3>
<div id="nets-desc">$desc</div>

View File

@ -9,3 +9,4 @@
</div>
{{ endif }}
</div>
<div class="clear"></div>

View File

@ -17,6 +17,9 @@
<ul>
<li><div id="contact-edit-rel">$relation_text</div></li>
<li><div id="contact-edit-nettype">$nettype</div></li>
{{ if $lost_contact }}
<li><div id="lost-contact-message">$lost_contact</div></li>
{{ endif }}
{{ if $insecure }}
<li><div id="insecure-message">$insecure</div></li>
{{ endif }}

View File

@ -16,6 +16,8 @@
</div>
{{ endfor }}
<div id="conversation-end"></div>
{{ 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

@ -331,6 +331,7 @@ $a->strings["Archive"] = "Archivieren";
$a->strings["Toggle Archive status"] = "Archiviert-Status ein-/ausschalten";
$a->strings["Repair"] = "Reparieren";
$a->strings["Advanced Contact Settings"] = "Fortgeschrittene Kontakteinstellungen";
$a->strings["Communications lost with this contact!"] = "Verbindungen mit diesem Kontakt verloren!";
$a->strings["Contact Editor"] = "Kontakt Editor";
$a->strings["Profile Visibility"] = "Profil-Sichtbarkeit";
$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft.";
@ -678,6 +679,8 @@ $a->strings["Plugins"] = "Plugins";
$a->strings["Themes"] = "Themen";
$a->strings["DB updates"] = "DB Updates";
$a->strings["Logs"] = "Protokolle";
$a->strings["Admin"] = "Administration";
$a->strings["Plugin Features"] = "Plugin Features";
$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
$a->strings["Normal Account"] = "Normales Konto";
$a->strings["Soapbox Account"] = "Marktschreier-Konto";
@ -1001,6 +1004,9 @@ $a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei
$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "Deine Facebook Anmeldedaten sind ungültig geworden. Bitte re-authentifiziere dich.";
$a->strings["Facebook connection became invalid"] = "Facebook Anmeldedaten sind ungültig geworden";
$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "Hallo %1\$s,\n\ndie Verbindung zwischen deinem Account auf %2\$s und Facebook funktioniert derzeit nicht. Dies ist normalerweise das Ergebnis einer Passwortänderung bei Facebook. Um die Verbindung wieder zu aktivieren musst du %3\$sden Facebook-Connector neu authentifizieren%4\$s.";
$a->strings["StatusNet AutoFollow settings updated."] = "StatusNet AutoFollow Einstellungen aktualisiert.";
$a->strings["StatusNet AutoFollow Settings"] = "StatusNet AutoFollow Einstellungen";
$a->strings["Automatically follow any StatusNet followers/mentioners"] = "Automatisch allen StatusNet Followern/Erwähnungen folgen";
$a->strings["Lifetime of the cache (in hours)"] = "Lebenszeit des Caches (in Stunden)";
$a->strings["Cache Statistics"] = "Cache Statistik";
$a->strings["Number of items"] = "Anzahl der Einträge";
@ -1049,6 +1055,54 @@ $a->strings["Most active users"] = "Aktivste Nutzer";
$a->strings["Latest photos"] = "Neueste Fotos";
$a->strings["Latest likes"] = "Neueste Favoriten";
$a->strings["event"] = "Veranstaltung";
$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "U.S. Datumsformat (mm/dd/YYYY)";
$a->strings["German Time Format (dd.mm.YYYY)"] = "Deutsches Datumsformat (dd.mm.YYYY)";
$a->strings["Error"] = "Fehler";
$a->strings["No access"] = "Kein Zugriff";
$a->strings["New event"] = "Neue Veranstaltung";
$a->strings["Today"] = "Heute";
$a->strings["Day"] = "Tag";
$a->strings["Week"] = "Woche";
$a->strings["Month"] = "Monat";
$a->strings["Reload"] = "Neu Laden";
$a->strings["Date"] = "Datum";
$a->strings["Not found"] = "Nicht gefunden";
$a->strings["Go back to the calendar"] = "Zurück zum Kalender";
$a->strings["Starts"] = "Beginnt";
$a->strings["Ends"] = "Endet";
$a->strings["Description"] = "Beschreibung";
$a->strings["Notification"] = "Benachrichtigung";
$a->strings["Minutes"] = "Minuten";
$a->strings["Hours"] = "Stunden";
$a->strings["Days"] = "Tage";
$a->strings["before"] = "vorher";
$a->strings["Calendar Settings"] = "Kalender Einstellungen";
$a->strings["Date format"] = "Datumsformat";
$a->strings["Time zone"] = "Zeitzone";
$a->strings["Limitations"] = "Einschränkungen";
$a->strings["Warning"] = "Warnung";
$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronisation (iPhone, Thunderbird Lightning, Android, ...)";
$a->strings["Synchronizing this calendar with the iPhone"] = "Diesen Kalender mit dem iPhone synchronisieren";
$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Friendica-Kontakte mit dem iPhone synchronisieren";
$a->strings["Friendica-Contacts"] = "Friendica-Kontakte";
$a->strings["Your Friendica-Contacts"] = "Deine Friendica-Kontakte";
$a->strings["Calendar"] = "Kalender";
$a->strings["Extended calendar with CalDAV-support"] = "Erweiterter Kalender mit CalDAV Unterstützung.";
$a->strings["The database tables have been installed."] = "Die Datenbank-Tabellen wurden installiert.";
$a->strings["An error occurred during the installation."] = "Während der Installation trat ein Fehler auf.";
$a->strings["No system-wide settings yet."] = "Momentan keine systemweiten Einstellungen.";
$a->strings["Database status"] = "Datenbank Status";
$a->strings["Installed"] = "Installiert";
$a->strings["Upgrade needed"] = "Upgrade erforderlich";
$a->strings["Upgrade"] = "Upgrade";
$a->strings["Not installed"] = "Nicht installiert";
$a->strings["Install"] = "Installieren";
$a->strings["Troubleshooting"] = "Problembehebung";
$a->strings["Manual creation of the database tables:"] = "Manuelles anlegen der Datenbank Tabellen:";
$a->strings["Show SQL-statements"] = "SQL-Anweisungen anzeigen";
$a->strings["Private Calendar"] = "Privater Kalender";
$a->strings["Friendica Events: Mine"] = "Meine Friendica-Veranstaltungen";
$a->strings["Friendica Events: Contacts"] = "Friendica Veranstaltungen meiner Kontakte";
$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Ermöglicht dir, deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
$a->strings["Template URL (with {category})"] = "Vorlagen URL (mit {Kategorie})";
$a->strings["OAuth end-point"] = "OAuth end-point";
@ -1118,6 +1172,9 @@ $a->strings["How to contact the operator via email. (will be displayed obfuscate
$a->strings["Footer note"] = "Fußnote";
$a->strings["Text for the footer. You can use BBCode here."] = "Text für die Fußzeile. Du kannst BBCode verwenden.";
$a->strings["Report Bug"] = "Fehlerreport erstellen";
$a->strings["No Timeline settings updated."] = "Keine Timeline-Einstellungen aktualisiert.";
$a->strings["No Timeline Settings"] = "Keine Timeline-Einstellungen";
$a->strings["Disable Archive selector on profile wall"] = "Deaktiviere Archiv-Auswahl auf Deiner Pinnwand";
$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
@ -1136,6 +1193,12 @@ $a->strings["Tile Server URL"] = "Tile Server URL";
$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Eine Liste <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">öffentlicher Tile Server</a>";
$a->strings["Default zoom"] = "Standard Zoom";
$a->strings["The default zoom level. (1:world, 18:highest)"] = "Standard Zoomlevel (1: Welt; 18: höchstes)";
$a->strings["Post to libertree"] = "bei libertree veröffentlichen";
$a->strings["libertree Post Settings"] = "libertree Post Einstellungen";
$a->strings["Enable Libertree Post Plugin"] = "Libertree Post Plugin aktivieren";
$a->strings["Libertree API token"] = "Libertree API Token";
$a->strings["Libertree site URL"] = "Libertree URL";
$a->strings["Post to Libertree by default"] = "Standardmäßig bei libertree veröffentlichen";
$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "Mit dem MathJax Addon können mathematische Formeln, die mit LaTeX geschrieben wurden, dargestellt werden. Die Formel wird mit den üblichen $$ oder einem eqnarray Block gekennzeichnet. Formeln werden in allen Beiträgen auf deiner Pinnwand, dem Netzwerkstream sowie privaten Nachrichten gerendert.";
$a->strings["Use the MathJax renderer"] = "MathJax verwenden";
$a->strings["MathJax Base URL"] = "MathJax Basis-URL";
@ -1190,6 +1253,7 @@ $a->strings["Send public postings to StatusNet by default"] = "Veröffentliche
$a->strings["Send linked #-tags and @-names to StatusNet"] = "Sende verlinkte #-Tags und @-Namen nach StatusNet";
$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
$a->strings["API URL"] = "API-URL";
$a->strings["Infinite Improbability Drive"] = "Infinite Improbability Drive";
$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
@ -1478,7 +1542,6 @@ $a->strings["Manage other pages"] = "Andere Seiten verwalten";
$a->strings["Profiles"] = "Profile";
$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
$a->strings["Admin"] = "Administration";
$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
@ -1530,38 +1593,33 @@ $a->strings["Thank You,"] = "Danke,";
$a->strings["%s Administrator"] = "der Administrator von %s";
$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica Meldung] Neue Nachricht erhalten von %s";
$a->strings["%s sent you a new private message at %s."] = "%s hat dir eine neue private Nachricht auf %s geschrieben.";
$a->strings["%s sent you %s."] = "%s hat Dir %s geschickt";
$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s hat Dir eine neues private Nachricht geschickt auf %2\$s.";
$a->strings["%1\$s sent you %2\$s."] = "%1\$s schickte Dir %2\$s.";
$a->strings["a private message"] = "eine private Nachricht";
$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
$a->strings["%s's"] = "%s's";
$a->strings["your"] = "Dein";
$a->strings["[Friendica:Notify] Comment to conversation #%d by %s"] = "[Friendica Meldung] Kommentar zum Beitrag #%d von %s";
$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]a %3\$s[/url]";
$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]%3\$s's %4\$s[/url]";
$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]Deinen Beitrag %3\$s[/url]";
$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica Meldung] Kommentar zum Beitrag #%1\$d von %2\$s";
$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
$a->strings["%s commented on %s."] = "%s kommentierte %s.";
$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica Meldung] %s hat auf Deine Pinnwand geschrieben";
$a->strings["%s posted to your profile wall at %s"] = "%s hat auf deine Pinnwand bei %s gepostet";
$a->strings["%s posted to %s"] = "%s schrieb an %s";
$a->strings["your profile wall."] = "Deine Pinnwand";
$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s schrieb auf Deine Pinnwand auf %2\$s";
$a->strings["%1\$s posted to [url=%2s]your wall[/url]"] = "%1\$s schrieb auf [url=%2s]Deine Pinnwand[/url]";
$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica Meldung] %s hat Dich erwähnt";
$a->strings["%s tagged you at %s"] = "%s hat dich auf %s erwähnt";
$a->strings["%s %s."] = "%s %s.";
$a->strings["tagged you"] = "erwähnte Dich";
$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s erwähnte Dich auf %2\$s";
$a->strings["%1\$s [url=%2s]tagged you[/url]."] = "%1\$s [url=%2s]erwähnte Dich[/url].";
$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica Meldung] %s markierte Deinen Beitrag";
$a->strings["%s tagged your post at %s"] = "%s hat deinen Beitrag auf %s getaggt";
$a->strings["%s tagged %s"] = "%s markierte %s";
$a->strings["your post"] = "deinen Beitrag";
$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s erwähnte Deinen Beitrag auf %2\$s";
$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s erwähnte [url=%2\$s]Deinen Beitrag[/url]";
$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica Meldung] Kontaktanfrage erhalten";
$a->strings["You've received an introduction from '%s' at %s"] = "Du hast eine Kontaktanfrage von '%s' auf %s erhalten";
$a->strings["You've received %s from %s."] = "Du hast %s von %s erhalten.";
$a->strings["an introduction"] = "eine Kontaktanfrage";
$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Du hast eine Kontaktanfrage erhalten von '%1\$s' auf %2\$s";
$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Kontaktanfrage[/url] erhalten von %2\$s.";
$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica Meldung] Kontaktvorschlag erhalten";
$a->strings["You've received a friend suggestion from '%s' at %s"] = "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s";
$a->strings["You've received %s for %s from %s."] = "Du hast %s für %s von %s erhalten.";
$a->strings["a friend suggestion"] = "ein Freunde Vorschlag";
$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Du hast einen Freunde-Vorschlag erhalten von '%1\$s' auf %2\$s";
$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Du hast einen [url=%1\$s]Freunde-Vorschlag[/url] erhalten %2\$s von %3\$s.";
$a->strings["Name:"] = "Name:";
$a->strings["Photo:"] = "Foto:";
$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
@ -1579,6 +1637,7 @@ $a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinfo
$a->strings["following"] = "folgen";
$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
$a->strings["Archives"] = "Archiv";
$a->strings["image/photo"] = "Bild/Foto";
$a->strings["link"] = "Verweis";
$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";

View File

@ -18,8 +18,12 @@
<div id="photo-edit-tags-end"></div>
<div id="photo-edit-rotate-wrapper">
<div id="photo-edit-rotate-label">$rotate</div>
<input type="checkbox" name="rotate" value="1" />
<div id="photo-edit-rotate-label">
$rotatecw<br>
$rotateccw
</div>
<input type="radio" name="rotate" value="1" /><br>
<input type="radio" name="rotate" value="2" />
</div>
<div id="photo-edit-rotate-end"></div>

View File

@ -0,0 +1,9 @@
<div id="datebrowse-sidebar" class="widget">
<h3>$title</h3>
<script>function dateSubmit(dateurl) { window.location.href = dateurl; } </script>
<select id="posted-date-selector" name="posted-date-select" onchange="dateSubmit($(this).val());" size="$size">
{{ for $dates as $d }}
<option value="$url/$d.1/$d.2" >$d.0</option>
{{ endfor }}
</select>
</div>

View File

@ -1,4 +1,4 @@
<a name="$item.id" />
<a name="$item.id" ></a>
<div class="wall-item-outside-wrapper$item.indent$item.previewing" id="wall-item-outside-wrapper-$item.id" >
<div class="wall-item-content-wrapper$item.indent" id="wall-item-content-wrapper-$item.id" >
<div class="wall-item-info" id="wall-item-info-$item.id">

View File

@ -151,6 +151,10 @@ blockquote {
overflow: none;
}
.editicon:hover {
background-color: #ccc;
.editicon {
background-color: #333;
}
#datebrowse-sidebar select {
color:#99CCFF !important;
}

View File

@ -149,4 +149,8 @@ blockquote {
/* This seems okay to me...we might not need a new iconset, lets see how people react */
.editicon {
background-color: #333;
}
#datebrowse-sidebar select {
color:#99CCFF !important;
}

View File

@ -16,6 +16,8 @@
</div>
{{ endfor }}
<div id="conversation-end"></div>
{{ if $dropping }}
<div class="delete-checked">
<a href="#" onclick="deleteCheckedItems();return false;"><span class="icon delete"></span><span class="s22 text" onmouseover="imgbright(this);" onmouseout="imgdull(this);">$dropping</span></a>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -14,9 +14,9 @@
height="200"
id="svg3403"
version="1.1"
inkscape:version="0.48+devel r"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="icons.svg"
inkscape:export-filename="/var/www3/kisikew.org/portal/pub/fd/view/theme/dispy-dark/icons.png"
inkscape:export-filename="/var/www3/kisikew.org/portal/pub/fd/view/theme/dispy/dark/icons.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
@ -52,8 +52,8 @@
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1.9403009"
inkscape:cx="95.950174"
inkscape:cy="115.58345"
inkscape:cx="127.81563"
inkscape:cy="128.63003"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
@ -1127,16 +1127,16 @@
inkscape:connector-curvature="0"
id="path4319"
d="m -44.467884,1107.2152 0,17.7252 1.161165,3.7983 c 1.200046,4.2782 1.065706,4.1105 2.322331,0 l 1.161165,-3.7983 0,-17.7252 z"
style="fill:none;stroke:#999999;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:none;stroke:#e6e6e6;stroke-width:0.66930836000000005;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,313.68781)" />
<path
inkscape:connector-curvature="0"
id="path4321"
d="m -44.467884,1124.9404 4.644661,0"
style="fill:none;stroke:#999999;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
style="fill:none;stroke:#e6e6e6;stroke-width:0.66930836000000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,313.68781)" />
<path
style="fill:none;stroke:#999999;stroke-width:0.66930836;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
style="fill:none;stroke:#e6e6e6;stroke-width:0.66930836000000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
d="m -42.239747,1107.2336 0,17.6813"
id="path4323"
inkscape:connector-curvature="0"
@ -1146,7 +1146,7 @@
inkscape:connector-curvature="0"
id="path4325"
d="m -43.348187,1128.4959 c 1.108441,-0.8952 1.929509,-0.3581 2.381097,0.045 -0.328428,1.1191 -1.190549,3.9391 -1.190549,3.9391 z"
style="fill:#999999;stroke:#999999;stroke-width:0.66930836;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
style="fill:#999999;stroke:#e6e6e6;stroke-width:0.66930836000000005;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,313.68781)" />
<rect
ry="0.42804927"
@ -1156,7 +1156,7 @@
height="1.8614606"
width="5.1800866"
id="rect4327"
style="fill:#999999;fill-opacity:1;stroke:#999999"
style="fill:#999999;fill-opacity:1;stroke:#e6e6e6"
transform="matrix(0.52823691,0.52823691,-0.52823691,0.52823691,773.22931,313.68781)" />
<path
style="fill:none;stroke:#e6e6e6;stroke-width:0.66930836;stroke-miterlimit:4;stroke-dasharray:none"

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

View File

@ -78,16 +78,19 @@ h6{font-size:xx-small;}
#login_openid label{width:180px !important;}
nav{height:60px;background-color:#1d1f1d;color:#eeeeee;position:relative;padding:20px 20px 10px 95px;}nav a{text-decoration:none;color:#eeeeee;border:0px;}nav a:hover{text-decoration:none;color:#eeeeee;border:0px;}
nav #banner{display:block;position:absolute;left:51px;top:25px;}nav #banner #logo-text a{font-size:40px;font-weight:bold;margin-left:3px;}
ul#user-menu-popup{display:none;position:absolute;background-color:#555753;width:100%;padding:10px 0px;margin:0px;top:20px;left:0;font-size:small;line-height:1;-o-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-ms-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-moz-box-shadow:5px 5px 10px 0px #111111;-o-box-shadow:5px 5px 10px 0px #111111;-webkit-box-shadow:5px 5px 10px 0px #111111;-ms-box-shadow:5px 5px 10px 0px #111111;box-shadow:5px 5px 10px 0px #111111;z-index:10000;}ul#user-menu-popup li{display:block;}ul#user-menu-popup li a{display:block;padding:5px;color:#eeeeee;background-color:#555753;}ul#user-menu-popup li a:hover{color:#2e2f2e;background-color:#eeeeee;}
#site-location{font-weight:bold;font-style:italic;font-size:small;width:30em;position:relative;left:-3.5em;top:3em;}
ul#user-menu-popup{display:none;position:absolute;background-color:#555753;width:100%;padding:10px 0px;margin:3px 0 0;top:20px;left:0;font-size:small;line-height:1;-o-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-ms-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-moz-box-shadow:5px 5px 10px 0px #111111;-o-box-shadow:5px 5px 10px 0px #111111;-webkit-box-shadow:5px 5px 10px 0px #111111;-ms-box-shadow:5px 5px 10px 0px #111111;box-shadow:5px 5px 10px 0px #111111;z-index:10000;}ul#user-menu-popup li{display:block;}ul#user-menu-popup li a{display:block;padding:5px;color:#eeeeee;background-color:#555753;}ul#user-menu-popup li a:hover{color:#2e2f2e;background-color:#eeeeee;}
ul#user-menu-popup li a.nav-sep{border-top:1px solid #2e302e;}
nav .nav-link{display:inline-block;width:22px;height:22px;overflow:hidden;margin:0px 5px 5px;text-indent:50px;background:transparent url(dark/icons.png) 0 0 no-repeat;}
#nav-admin-link{background-position:0 -154px;}#nav-admin-link:hover{background-position:-22px -154px;}
#nav-apps-link{background-position:0 -66px;}#nav-apps-link:hover{background-position:-22px -66px;}
#nav-community-link,#nav-contacts-link{background-position:0 -22px;}#nav-community-link:hover,#nav-contacts-link:hover{background-position:-22px -22px;}
#nav-directory-link{background-position:-44px -154px;}#nav-directory-link:hover{background-position:-66px -154px;}
#nav-help-link{background-position:0 -110px;}#nav-help-link:hover{background-position:-22px -110px;}
#nav-home-link{background-position:-44px -132px;}#nav-home-link:hover{background-position:-66px -132px;}
#nav-intro-link{background-position:0px -190px;}#nav-intro-link:hover{background-position:-44px -190px;}
#nav-intro-link{background-position:0px -88px;}#nav-intro-link:hover{background-position:-22px -88px;}
#nav-login-link,#nav-logout-link{background-position:0 -88px;}#nav-login-link:hover,#nav-logout-link:hover{background-position:-22px -88px;}
#nav-manage-link{background-position:0px -22px;}#nav-manage-link:hover{background-position:-22px -22px;}
#nav-messages-link{background-position:-44px -88px;}#nav-messages-link:hover{background-position:-66px -88px;}
#nav-notify-link,#nav-notifications-linkmenu{background-position:-44px -110px;}
#nav-notify-link:hover{background-position:-66px -110px;}
@ -105,14 +108,15 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify,nav #nav-notifications-linkm
#notifications{width:170px;height:20px;font-size:small;top:-19px;left:4px;position:absolute;}
#nav-floater{position:fixed;top:20px;right:1%;padding:5px;background:#1d1f1d;color:transparent;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;z-index:100;width:270px;height:60px;}
#nav-buttons{clear:both;list-style:none;padding:0px;margin:0px;height:25px;}#nav-buttons>li{padding:0;display:inline-block;margin:0px -4px 0px 0px;}
#nav-buttons-2{clear:both;list-style:none;padding:0px;margin:0px;left:136px;top:-20px;position:relative;width:6em;height:25px;}#nav-buttons-2>li{padding:0;display:inline-block;margin:0px -4px 0px 0px;}
.floaterflip{display:block;position:fixed;z-index:110;top:56px;right:19px;width:22px;height:22px;overflow:hidden;margin:0px;background:transparent url(dark/icons.png) -190px -60px no-repeat;}
.search-box{display:inline-block;margin:5px;position:fixed;right:0px;bottom:0px;z-index:100;background:#1d1f1d;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;}
#search-text,#mini-search-text{background:white;color:#2e2f2e;}
#search-text{border:1px solid #eeeeee;margin:5px 0;}
#mini-search-text{font-size:8pt;height:14px;width:10em;margin:5px;}
#scrollup{position:fixed;right:5px;bottom:40px;z-index:100;}#scrollup a:hover{text-decoration:none;border:0;}
#user-menu{-moz-box-shadow:5px 0 10px 0 #111111;-o-box-shadow:5px 0 10px 0 #111111;-webkit-box-shadow:5px 0 10px 0 #111111;-ms-box-shadow:5px 0 10px 0 #111111;box-shadow:5px 0 10px 0 #111111;display:block;width:80%;margin:3px 0 0 0;position:relative;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-color:#555753;background-image:url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAIAAwDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAIhAAAQMEAgIDAAAAAAAAAAAAAQIDBAAFBhESIQdBMVFh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAABAAIR/9oADAMBAAIRAxEAPwCXiHO8dbsEi35BEhIehNlbUhxhBU82O+G9bKgToD2D+VlmZX9OWZBJuAiMxGlni0w0gJCED4HXv7pSi6eFML//2Q==");background-position:98% center;background-repeat:no-repeat;clear:both;top:4px;left:10px;padding:2px;}#user-menu>a{vertical-align:top;outline:0 none;}
#user-menu-label{font-size:small;padding:3px 20px 9px 5px;height:10px;}
#user-menu{-moz-box-shadow:5px 0 10px 0 #111111;-o-box-shadow:5px 0 10px 0 #111111;-webkit-box-shadow:5px 0 10px 0 #111111;-ms-box-shadow:5px 0 10px 0 #111111;box-shadow:5px 0 10px 0 #111111;display:block;width:35%;margin:5px 0 0 0;position:relative;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-color:#555753;background-image:url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAIAAwDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAIhAAAQMEAgIDAAAAAAAAAAAAAQIDBAAFBhESIQdBMVFh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAABAAIR/9oADAMBAAIRAxEAPwCXiHO8dbsEi35BEhIehNlbUhxhBU82O+G9bKgToD2D+VlmZX9OWZBJuAiMxGlni0w0gJCED4HXv7pSi6eFML//2Q==");background-position:98% center;background-repeat:no-repeat;top:4px;left:7px;padding:2px;}#user-menu>a{vertical-align:top;outline:0 none;}
#user-menu-label{font-size:small;padding:0px 20px 10px 5px;height:10px;display:block;}
.nav-ajax-update,.nav-ajax-left{width:30px;height:19px;background:transparent url(dark/notifications.png) 0 0 no-repeat;color:#111111;font-weight:bold;font-size:0.8em;padding-top:0.2em;text-align:center;float:left;margin:0 -1px 0 3px;display:block;visibility:hidden;}
.nav-ajax-update.show,.nav-ajax-left.show{visibility:visible;}
#net-update{background-position:0px 0px;}

File diff suppressed because it is too large Load Diff

View File

@ -78,16 +78,19 @@ h6{font-size:xx-small;}
#login_openid label{width:180px !important;}
nav{height:60px;background-color:#2e3436;color:#eeeeec;position:relative;padding:20px 20px 10px 95px;}nav a{text-decoration:none;color:#eeeeec;border:0px;}nav a:hover{text-decoration:none;color:#eeeeec;border:0px;}
nav #banner{display:block;position:absolute;left:51px;top:25px;}nav #banner #logo-text a{font-size:40px;font-weight:bold;margin-left:3px;}
ul#user-menu-popup{display:none;position:absolute;background-color:#555753;width:100%;padding:10px 0px;margin:0px;top:20px;left:0;font-size:small;line-height:1;-o-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-ms-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-moz-box-shadow:5px 5px 10px 0px #111111;-o-box-shadow:5px 5px 10px 0px #111111;-webkit-box-shadow:5px 5px 10px 0px #111111;-ms-box-shadow:5px 5px 10px 0px #111111;box-shadow:5px 5px 10px 0px #111111;z-index:10000;}ul#user-menu-popup li{display:block;}ul#user-menu-popup li a{display:block;padding:5px;color:#eeeeec;background-color:#555753;}ul#user-menu-popup li a:hover{color:#eeeeec;background-color:#111111;}
#site-location{font-weight:bold;font-style:italic;font-size:small;width:30em;position:relative;left:-3.5em;top:3em;}
ul#user-menu-popup{display:none;position:absolute;background-color:#555753;width:100%;padding:10px 0px;margin:3px 0 0;top:20px;left:0;font-size:small;line-height:1;-o-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-ms-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-moz-box-shadow:5px 5px 10px 0px #111111;-o-box-shadow:5px 5px 10px 0px #111111;-webkit-box-shadow:5px 5px 10px 0px #111111;-ms-box-shadow:5px 5px 10px 0px #111111;box-shadow:5px 5px 10px 0px #111111;z-index:10000;}ul#user-menu-popup li{display:block;}ul#user-menu-popup li a{display:block;padding:5px;color:#eeeeec;background-color:#555753;}ul#user-menu-popup li a:hover{color:#eeeeec;background-color:#111111;}
ul#user-menu-popup li a.nav-sep{border-top:1px solid #2e302e;}
nav .nav-link{display:inline-block;width:22px;height:22px;overflow:hidden;margin:0px 5px 5px;text-indent:50px;background:transparent url(light/icons.png) 0 0 no-repeat;}
#nav-admin-link{background-position:0 -154px;}#nav-admin-link:hover{background-position:-22px -154px;}
#nav-apps-link{background-position:0 -66px;}#nav-apps-link:hover{background-position:-22px -66px;}
#nav-community-link,#nav-contacts-link{background-position:0 -22px;}#nav-community-link:hover,#nav-contacts-link:hover{background-position:-22px -22px;}
#nav-directory-link{background-position:-44px -154px;}#nav-directory-link:hover{background-position:-66px -154px;}
#nav-help-link{background-position:0 -110px;}#nav-help-link:hover{background-position:-22px -110px;}
#nav-home-link{background-position:-44px -132px;}#nav-home-link:hover{background-position:-66px -132px;}
#nav-intro-link{background-position:0px -190px;}#nav-intro-link:hover{background-position:-44px -190px;}
#nav-intro-link{background-position:0px -88px;}#nav-intro-link:hover{background-position:-22px -88px;}
#nav-login-link,#nav-logout-link{background-position:0 -88px;}#nav-login-link:hover,#nav-logout-link:hover{background-position:-22px -88px;}
#nav-manage-link{background-position:0px -22px;}#nav-manage-link:hover{background-position:-22px -22px;}
#nav-messages-link{background-position:-44px -88px;}#nav-messages-link:hover{background-position:-66px -88px;}
#nav-notify-link,#nav-notifications-linkmenu{background-position:-44px -110px;}
#nav-notify-link:hover{background-position:-66px -110px;}
@ -105,14 +108,15 @@ nav #nav-notifications-linkmenu.on .icon.s22.notify,nav #nav-notifications-linkm
#notifications{width:170px;height:20px;font-size:small;top:-19px;left:4px;position:absolute;}
#nav-floater{position:fixed;top:20px;right:1%;padding:5px;background:#2e3436;color:transparent;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;z-index:100;width:270px;height:60px;}
#nav-buttons{clear:both;list-style:none;padding:0px;margin:0px;height:25px;}#nav-buttons>li{padding:0;display:inline-block;margin:0px -4px 0px 0px;}
#nav-buttons-2{clear:both;list-style:none;padding:0px;margin:0px;left:136px;top:-20px;position:relative;width:6em;height:25px;}#nav-buttons-2>li{padding:0;display:inline-block;margin:0px -4px 0px 0px;}
.floaterflip{display:block;position:fixed;z-index:110;top:56px;right:19px;width:22px;height:22px;overflow:hidden;margin:0px;background:transparent url(light/icons.png) -190px -60px no-repeat;}
.search-box{display:inline-block;margin:5px;position:fixed;right:0px;bottom:0px;z-index:100;background:#2e3436;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;}
#search-text,#mini-search-text{background:white;color:#111111;}
#search-text{border:1px solid #999999;margin:5px 0;}
#mini-search-text{font-size:8pt;height:14px;width:10em;margin:5px;}
#scrollup{position:fixed;right:5px;bottom:40px;z-index:100;}#scrollup a:hover{text-decoration:none;border:0;}
#user-menu{-moz-box-shadow:5px 0 10px 0 #111111;-o-box-shadow:5px 0 10px 0 #111111;-webkit-box-shadow:5px 0 10px 0 #111111;-ms-box-shadow:5px 0 10px 0 #111111;box-shadow:5px 0 10px 0 #111111;display:block;width:80%;margin:3px 0 0 0;position:relative;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-color:#555753;background-image:url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAIAAwDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAIhAAAQMEAgIDAAAAAAAAAAAAAQIDBAAFBhESIQdBMVFh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAABAAIR/9oADAMBAAIRAxEAPwCXiHO8dbsEi35BEhIehNlbUhxhBU82O+G9bKgToD2D+VlmZX9OWZBJuAiMxGlni0w0gJCED4HXv7pSi6eFML//2Q==");background-position:98% center;background-repeat:no-repeat;clear:both;top:4px;left:10px;padding:2px;}#user-menu>a{vertical-align:top;outline:0 none;}
#user-menu-label{font-size:small;padding:3px 20px 9px 5px;height:10px;}
#user-menu{-moz-box-shadow:5px 0 10px 0 #111111;-o-box-shadow:5px 0 10px 0 #111111;-webkit-box-shadow:5px 0 10px 0 #111111;-ms-box-shadow:5px 0 10px 0 #111111;box-shadow:5px 0 10px 0 #111111;display:block;width:35%;margin:5px 0 0 0;position:relative;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-color:#555753;background-image:url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gATQ3JlYXRlZCB3aXRoIEdJTVD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAIAAwDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMH/8QAIhAAAQMEAgIDAAAAAAAAAAAAAQIDBAAFBhESIQdBMVFh/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAABAAIR/9oADAMBAAIRAxEAPwCXiHO8dbsEi35BEhIehNlbUhxhBU82O+G9bKgToD2D+VlmZX9OWZBJuAiMxGlni0w0gJCED4HXv7pSi6eFML//2Q==");background-position:98% center;background-repeat:no-repeat;top:4px;left:7px;padding:2px;}#user-menu>a{vertical-align:top;outline:0 none;}
#user-menu-label{font-size:small;padding:0px 20px 10px 5px;height:10px;display:block;}
.nav-ajax-update,.nav-ajax-left{width:30px;height:19px;background:transparent url(light/notifications.png) 0 0 no-repeat;color:#111111;font-weight:bold;font-size:0.8em;padding-top:0.2em;text-align:center;float:left;margin:0 -1px 0 3px;display:block;visibility:hidden;}
.nav-ajax-update.show,.nav-ajax-left.show{visibility:visible;}
#net-update{background-position:0px 0px;}

File diff suppressed because it is too large Load Diff

View File

@ -1,56 +1,57 @@
<nav id="pagenav">
<span id="banner">$banner</span>
<div id="banner">$banner</div>
<div id="site-location">$sitelocation</div>
<a name="top" id="top"></a>
<div id="nav-floater">
<ul id="nav-buttons">
{{ if $nav.login }}
<li><a id="nav-login-link" class="nav-login-link $nav.login.2"
href="$nav.login.0" title="$nav.login.3" >$nav.login.1</a></li>
href="$nav.login.0" title="$nav.login.3" >$nav.login.1</a></li>
{{ endif }}
{{ if $nav.home }}
<li><a id="nav-home-link" class="nav-link $nav.home.2"
href="$nav.home.0" title="$nav.home.1">$nav.home.1</a></li>
href="$nav.home.0" title="$nav.home.1">$nav.home.1</a></li>
{{ endif }}
{{ if $nav.network }}
<li><a id="nav-network-link" class="nav-link $nav.network.2"
href="$nav.network.0" title="$nav.network.1">$nav.network.1</a></li>
href="$nav.network.0" title="$nav.network.1">$nav.network.1</a></li>
{{ endif }}
{{ if $nav.notifications }}
<li><a id="nav-notifications-linkmenu" class="nav-link $nav.notifications.2"
href="$nav.notifications.0"
rel="#nav-notifications-menu" title="$nav.notifications.1">$nav.notifications.1</a></li>
<ul id="nav-notifications-menu" class="menu-popup">
<li id="nav-notifications-see-all"><a href="$nav.notifications.all.0">$nav.notifications.all.1</a></li>
<li id="nav-notifications-mark-all"><a href="#" onclick="notifyMarkAll(); return false;">$nav.notifications.mark.1</a></li>
<li class="empty">$emptynotifications</li>
</ul>
href="$nav.notifications.0"
rel="#nav-notifications-menu" title="$nav.notifications.1">$nav.notifications.1</a></li>
<ul id="nav-notifications-menu" class="menu-popup">
<li id="nav-notifications-see-all"><a href="$nav.notifications.all.0">$nav.notifications.all.1</a></li>
<li id="nav-notifications-mark-all"><a href="#" onclick="notifyMarkAll(); return false;">$nav.notifications.mark.1</a></li>
<li class="empty">$emptynotifications</li>
</ul>
{{ endif }}
{{ if $nav.messages }}
<li><a id="nav-messages-link" class="nav-link $nav.messages.2"
href="$nav.messages.0" title="$nav.messages.1">$nav.messages.1</a></li>
href="$nav.messages.0" title="$nav.messages.1">$nav.messages.1</a></li>
{{ endif }}
{{ if $nav.community }}
<li><a id="nav-community-link" class="nav-link $nav.community.2"
href="$nav.community.0" title="$nav.community.1">$nav.community.1</a></li>
href="$nav.community.0" title="$nav.community.1">$nav.community.1</a></li>
{{ endif }}
<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>
href="$nav.directory.0" title="$nav.directory.1">$nav.directory.1</a></li>
<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>
href="$nav.search.0" title="$nav.search.1">$nav.search.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>
href="$nav.apps.0" title="$nav.apps.1">$nav.apps.1</a></li>
{{ endif }}
{{ if $nav.help }}
<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>
href="$nav.help.0" title="$nav.help.1">$nav.help.1</a></li>
{{ endif }}
</ul>
</ul>
<div id="user-menu">
<a id="user-menu-label" onclick="openClose('user-menu-popup'); return false;" href="$nav.home.0">$sitelocation</a>
<div id="user-menu">
<a id="user-menu-label" onclick="openClose('user-menu-popup'); return false;" href="$nav.home.0"><span class="">User Menu</span></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)">
@ -63,21 +64,12 @@
{{ if $nav.contacts }}
<li><a id="nav-contacts-link" class="nav-commlink $nav.contacts.2" href="$nav.contacts.0" title="$nav.contacts.1">$nav.contacts.1</a></li>
{{ endif }}
{{ if $nav.introductions }}
<li><a id="nav-intro-link" class="nav-commlink $nav.introductions.2 $sel.introductions" href="$nav.introductions.0" title="$nav.introductions.3" >$nav.introductions.1</a></li>
{{ endif }}
{{ if $nav.profiles }}
<li><a id="nav-profiles-link" class="nav-commlink $nav.profiles.2" href="$nav.profiles.0" title="$nav.profiles.1">$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" title="$nav.settings.1">$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" title="$nav.manage.1">$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" title="$nav.admin.1">$nav.admin.1</a></li>
{{ endif }}
{{ if $nav.login }}
<li><a id="nav-login-link" class="nav-commlink $nav.login.2" href="$nav.login.0" title="$nav.login.1">$nav.login.1</a></li>
{{ endif }}
@ -87,12 +79,24 @@
</ul>
</div>
<ul id="nav-buttons-2">
{{ if $nav.introductions }}
<li><a id="nav-intro-link" class="nav-link $nav.introductions.2 $sel.introductions" href="$nav.introductions.0" title="$nav.introductions.3" >$nav.introductions.1</a></li>
{{ endif }}
{{ if $nav.admin }}
<li><a id="nav-admin-link" class="nav-link $nav.admin.2" href="$nav.admin.0" title="$nav.admin.1">$nav.admin.1</a></li>
{{ endif }}
{{ if $nav.manage }}
<li><a id="nav-manage-link" class="nav-link $nav.manage.2" href="$nav.manage.0" title="$nav.manage.1">$nav.manage.1</a></li>
{{ endif }}
</ul>
{{ if $userinfo }}
<ul id="nav-user-menu" class="menu-popup">
{{ for $nav.usermenu as $usermenu }}
<li>
<a class="$usermenu.2" href="$usermenu.0" title="$usermenu.3">$usermenu.1</a>
</li>
<a class="$usermenu.2" href="$usermenu.0" title="$usermenu.3">$usermenu.1</a>
</li>
{{ endfor }}
</ul>
{{ endif }}
@ -110,9 +114,9 @@
{{ if $nav.messages }}
<a id="mail-update" class="nav-ajax-left" href="$nav.messages.0" title="$nav.messages.1"></a>
{{ endif }}
{{if $nav.introductions }}
<a id="intro-update" class="nav-ajax-left" href="$nav.introductions.0"></a>
{{ endif }}
{{if $nav.introductions }}
<a id="intro-update" class="nav-ajax-left" href="$nav.introductions.0"></a>
{{ endif }}
</div>
</div>
<a href="#" class="floaterflip"></a>
@ -124,18 +128,18 @@ $langselector
<div id="scrollup">
<a href="#top"><img src="view/theme/dispy/icons/scroll_top.png"
alt="back to top" title="Back to top" /></a>
alt="back to top" title="Back to top" /></a>
</div>
<div class="search-box">
<form method="get" action="$nav.search.0">
<input id="mini-search-text" class="nav-menu-search" type="search" placeholder="Search" value="" id="search" name="search" />
</form>
<form method="get" action="$nav.search.0">
<input id="mini-search-text" class="nav-menu-search" type="search" placeholder="Search" value="" id="search" name="search" />
</form>
</div>
<ul id="nav-notifications-template" style="display:none;" rel="template">
<li class="{4}">
<a href="{0}"><img src="{1}" height="24" width="24" alt="" />{2} <span class="notif-when">{3}</span></a>
</li>
<li class="{4}">
<a href="{0}"><img src="{1}" height="24" width="24" alt="" />{2} <span class="notif-when">{3}</span></a>
</li>
</ul>

View File

@ -1,4 +1,4 @@
<a name="$item.id" />
<a name="$item.id" ></a>
<div class="wall-item-outside-wrapper$item.indent$item.previewing" id="wall-item-outside-wrapper-$item.id" >
<div class="wall-item-content-wrapper$item.indent" id="wall-item-content-wrapper-$item.id" >
<div class="wall-item-info" id="wall-item-info-$item.id">

View File

@ -1,4 +1,4 @@
<a name="$item.id" />
<a name="$item.id" ></a>
<div class="wall-item-outside-wrapper$item.indent$item.previewing wallwall" id="wall-item-outside-wrapper-$item.id" >
<div class="wall-item-content-wrapper$item.indent" id="wall-item-content-wrapper-$item.id" >
<div class="wall-item-info wallwall" id="wall-item-info-$item.id">
@ -88,6 +88,7 @@ class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick
<div class="wall-item-wrapper-end"></div>
<div class="wall-item-like" id="wall-item-like-$item.id">$item.like</div>
<div class="wall-item-dislike" id="wall-item-dislike-$item.id">$item.dislike</div>
<div class="wall-item-comment-separator"></div>
<div class="wall-item-comment-wrapper">
$item.comment
</div>

View File

@ -1608,7 +1608,7 @@ input#dfrn-url {
.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
#block-message, #ignore-message, #archive-message {
#block-message, #ignore-message, #archive-message, #lost-contact-message {
color: #FF0000;
}
@ -3226,3 +3226,7 @@ ul.menu-popup {
.autocomplete { color:#000; border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px; _margin:0; _overflow-x:hidden; }
.autocomplete .selected { background:#F0F0F0; }
.autocomplete div { padding:2px 5px; white-space:nowrap; overflow:hidden; }
#datebrowse-sidebar select {
margin-left: 25px;
}

View File

@ -16,6 +16,8 @@
</div>
{{ endfor }}
<div id="conversation-end"></div>
{{ 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>

View File

@ -1,6 +1,8 @@
{{ for $threads as $thread }}
<div id="tread-wrapper-$thread.id" class="tread-wrapper">
{{ for $thread.items as $item }}
{{if $mode == display}}
{{ else }}
{{if $item.comment_firstcollapsed}}
<div class="hide-comments-outer">
<span id="hide-comments-total-$thread.id" class="hide-comments-total">$thread.num_comments</span> <span id="hide-comments-$thread.id" class="hide-comments fakelink" onclick="showHideComments($thread.id);">$thread.hide_text</span>
@ -8,7 +10,8 @@
<div id="collapsed-comments-$thread.id" class="collapsed-comments" style="display: none;">
{{endif}}
{{if $item.comment_lastcollapsed}}</div>{{endif}}
{{ endif }}
{{ if $item.type == tag }}
{{ inc wall_item_tag.tpl }}{{ endinc }}
{{ else }}
@ -19,8 +22,26 @@
</div>
{{ endfor }}
<div id="conversation-end"></div>
{{ if $dropping }}
<a href="#" onclick="deleteCheckedItems();return false;">
<span class="icon s22 delete text">$dropping</span>
</a>
{{ endif }}
<script>
// jquery color plugin from https://raw.github.com/gist/1891361/17747b50ad87f7a59a14b4e0f38d8f3fb6a18b27/gistfile1.js
(function(d){d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(f,e){d.fx.step[e]=function(g){if(!g.colorInit){g.start=c(g.elem,e);g.end=b(g.end);g.colorInit=true}g.elem.style[e]="rgb("+[Math.max(Math.min(parseInt((g.pos*(g.end[0]-g.start[0]))+g.start[0]),255),0),Math.max(Math.min(parseInt((g.pos*(g.end[1]-g.start[1]))+g.start[1]),255),0),Math.max(Math.min(parseInt((g.pos*(g.end[2]-g.start[2]))+g.start[2]),255),0)].join(",")+")"}});function b(f){var e;if(f&&f.constructor==Array&&f.length==3){return f}if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return[parseInt(e[1]),parseInt(e[2]),parseInt(e[3])]}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return[parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55]}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}if(e=/rgba\(0, 0, 0, 0\)/.exec(f)){return a.transparent}return a[d.trim(f).toLowerCase()]}function c(g,e){var f;do{f=d.curCSS(g,e);if(f!=""&&f!="transparent"||d.nodeName(g,"body")){break}e="backgroundColor"}while(g=g.parentNode);return b(f)}var a={transparent:[255,255,255]}})(jQuery);
var colWhite = {backgroundColor:'#EFF0F1'};
var colShiny = {backgroundColor:'#FCE94F'};
</script>
{{ if $mode == display }}
<script>
var id = window.location.pathname.split("/").pop();
$(window).scrollTop($('#item-'+id).position().top);
$('#item-'+id).animate(colWhite, 1000).animate(colShiny).animate(colWhite, 2000);
</script>
{{ endif }}

View File

@ -59,6 +59,8 @@ nav #site-location {
-moz-border-radius: 3px;
opacity: 0.3;
filter:alpha(opacity=30);
margin-left: 5px;
margin-top: 5px;
}
#events-reminder.birthday-today, #events-reminder.event-today {
@ -71,6 +73,8 @@ nav #site-location {
opacity: 1.0;
filter:alpha(opacity=100);
box-shadow: 4px 4px 3px 0 #444444;
margin-left: 0px;
margin-top: 0px;
}
.fc-event-skin {
@ -88,6 +92,31 @@ nav #site-location {
box-shadow: 4px 4px 3px 0 #444444;
}
#datebrowse-sidebar select {
margin-left: 25px;
border-radius: 3px;
-moz-border-radius: 3px;
opacity: 0.3;
filter:alpha(opacity=30);
}
#datebrowse-sidebar select:hover {
opacity: 1.0;
filter:alpha(opacity=100);
}
#posted-date-selector {
margin-left: 30px !important;
margin-top: 5px !important;
}
#posted-date-selector:hover {
box-shadow: 4px 4px 3px 0 #444444;
margin-left: 25px !important;
margin-top: 0px !important;
}
.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo, .profile-jot-text, .group-selected, .nets-selected, .fileas-selected, #profile-jot-submit, .categories-selected {
border-radius: 3px;
-moz-border-radius: 3px;
@ -99,6 +128,11 @@ nav #site-location {
box-shadow: 4px 4px 3px 0 #444444;
}
#sidebar-page-list .label {
margin-left: 5px;
}
.photo {
border: 1px solid #AAAAAA;
}

View File

@ -16,6 +16,8 @@
</div>
{{ endfor }}
<div id="conversation-end"></div>
{{ 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>

View File

@ -1,4 +1,4 @@
<a name="$item.id" />
<a name="$item.id" ></a>
<div class="wall-item-outside-wrapper$item.indent$item.previewing" id="wall-item-outside-wrapper-$item.id" >
<div class="wall-item-content-wrapper$item.indent" id="wall-item-content-wrapper-$item.id" >
<div class="wall-item-info" id="wall-item-info-$item.id">

View File

@ -1,4 +1,4 @@
<a name="$item.id" />
<a name="$item.id" ></a>
<div class="wall-item-outside-wrapper$item.indent$item.previewing wallwall" id="wall-item-outside-wrapper-$item.id" >
<div class="wall-item-content-wrapper$item.indent" id="wall-item-content-wrapper-$item.id" >
<div class="wall-item-info wallwall" id="wall-item-info-$item.id">
@ -77,7 +77,7 @@
<div class="wall-item-like" id="wall-item-like-$item.id">$item.like</div>
<div class="wall-item-dislike" id="wall-item-dislike-$item.id">$item.dislike</div>
<div class="wall-item-comment-separator"></div>
<div class="wall-item-comment-wrapper" >
<div class="wall-item-comment-wrapper">
$item.comment
</div>