Browse Source

Merge remote-tracking branch 'upstream/master'

Conflicts:
	mod/crepair.php
pull/884/head
Michael Vogel 7 years ago
parent
commit
aed28a24f1
35 changed files with 8812 additions and 8211 deletions
  1. +1
    -1
      boot.php
  2. +2
    -1
      include/Contact.php
  3. +8
    -2
      include/acl_selectors.php
  4. +2
    -2
      include/api.php
  5. +3
    -0
      include/conversation.php
  6. +1
    -0
      include/features.php
  7. +0
    -1
      include/network.php
  8. +5
    -0
      include/ostatus_conversation.php
  9. +55
    -7
      js/acl.js
  10. +1
    -1
      js/fk.autocomplete.js
  11. +2
    -2
      library/slinky.php
  12. +3
    -1
      mod/admin.php
  13. +116
    -35
      mod/contacts.php
  14. +4
    -2
      mod/crepair.php
  15. +14
    -8
      mod/parse_url.php
  16. +13
    -1
      mods/readme.txt
  17. +667
    -624
      util/messages.po
  18. +668
    -625
      view/de/messages.po
  19. +12
    -1
      view/de/strings.php
  20. +5524
    -5372
      view/pl/messages.po
  21. +1518
    -1488
      view/pl/strings.php
  22. +3
    -6
      view/templates/acl_selector.tpl
  23. +1
    -0
      view/templates/admin_site.tpl
  24. +4
    -8
      view/templates/contact_template.tpl
  25. +35
    -6
      view/templates/contacts-template.tpl
  26. +4
    -6
      view/templates/crepair.tpl
  27. +67
    -1
      view/theme/duepuntozero/style.css
  28. +13
    -0
      view/theme/quattro/dark/style.css
  29. +13
    -0
      view/theme/quattro/green/style.css
  30. +13
    -0
      view/theme/quattro/lilac/style.css
  31. +6
    -1
      view/theme/quattro/quattro.less
  32. +1
    -5
      view/theme/quattro/templates/contact_template.tpl
  33. +31
    -2
      view/theme/vier/style.css
  34. +1
    -1
      view/theme/vier/templates/threaded_conversation.tpl
  35. +1
    -1
      view/theme/vier/templates/wall_thread.tpl

+ 1
- 1
boot.php View File

@ -12,7 +12,7 @@ require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/features.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.2.1745' );
define ( 'FRIENDICA_VERSION', '3.2.1747' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1169 );
define ( 'EOL', "<br />\r\n" );


+ 2
- 1
include/Contact.php View File

@ -215,13 +215,14 @@ function contact_photo_menu($contact) {
$status_link = $profile_link . "?url=status";
$photos_link = $profile_link . "?url=photos";
$profile_link = $profile_link . "?url=profile";
$contact_drop_link = $a->get_baseurl() . '/contacts/' . $contact['id'] . '/drop';
$pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
}
$poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id'];
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
$posts_link = $a->get_baseurl() . '/network/0?nets=all&cid=' . $contact['id'];
$contact_drop_link = $a->get_baseurl() . "/contacts/" . $contact['id'] . '/drop?confirm=1';
$menu = Array(
'poke' => array(t("Poke"), $poke_link),


+ 8
- 2
include/acl_selectors.php View File

@ -1,6 +1,7 @@
<?php
require_once("include/contact_selectors.php");
require_once("include/features.php");
/**
*
@ -329,6 +330,9 @@ function populate_acl($user = null,$celeb = false) {
'$allowgid' => json_encode($perms['allow_gid']),
'$denycid' => json_encode($perms['deny_cid']),
'$denygid' => json_encode($perms['deny_gid']),
'$features' => array(
"aclautomention"=>(feature_enabled($user,"aclautomention")?"true":"false")
),
));
@ -474,14 +478,15 @@ function acl_lookup(&$a, $out_type = 'json') {
"name" => $g['name'],
"id" => intval($g['id']),
"uids" => array_map("intval", explode(",",$g['uids'])),
"link" => ''
"link" => '',
"forum" => '0'
);
}
}
if ($type=='' || $type=='c'){
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, forum FROM `contact`
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
$sql_extra2
ORDER BY `name` ASC ",
@ -541,6 +546,7 @@ function acl_lookup(&$a, $out_type = 'json') {
"network" => $g['network'],
"link" => $g['url'],
"nick" => ($g['attag']) ? $g['attag'] : $g['nick'],
"forum" => $g['forum']
);
}
}


+ 2
- 2
include/api.php View File

@ -74,7 +74,7 @@
logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
header('WWW-Authenticate: Basic realm="Friendica"');
header('HTTP/1.0 401 Unauthorized');
die((api_error(&$a, 'json', "This api requires login")));
die((api_error($a, 'json', "This api requires login")));
//die('This api requires login');
}
@ -174,7 +174,7 @@
}
header("HTTP/1.1 404 Not Found");
logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true));
return(api_error(&$a, $type, "not implemented"));
return(api_error($a, $type, "not implemented"));
}


+ 3
- 0
include/conversation.php View File

@ -504,6 +504,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$tpl = 'search_item.tpl';
foreach($items as $item) {
if($arr_blocked) {
$blocked = false;
foreach($arr_blocked as $b) {
@ -648,6 +649,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$tmp_item = array(
'template' => $tpl,
'id' => (($preview) ? 'P0' : $item['item_id']),
'network' => $item['item_network'],
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
'profile_url' => $profile_link,
'item_photo_menu' => item_photo_menu($item),
@ -693,6 +695,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
call_hooks('display_item', $arr);
$threads[$threadsid]['id'] = $item['item_id'];
$threads[$threadsid]['network'] = $item['item_network'];
$threads[$threadsid]['items'] = array($arr['output']);
}


+ 1
- 0
include/features.php View File

@ -30,6 +30,7 @@ function get_features() {
t('Post Composition Features'),
array('richtext', t('Richtext Editor'), t('Enable richtext editor')),
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')),
array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a fourm page is selected/deselected in ACL window.')),
),
// Network sidebar widgets


+ 0
- 1
include/network.php View File

@ -617,7 +617,6 @@ function fetch_xrd_links($url) {
if(! function_exists('validate_url')) {
function validate_url(&$url) {
// no naked subdomains (allow localhost for tests)
if(strpos($url,'.') === false && strpos($url,'/localhost/') === false)
return false;


+ 5
- 0
include/ostatus_conversation.php View File

@ -44,6 +44,11 @@ function check_conversations() {
function complete_conversation($itemid, $conversation_url, $only_add_conversation = false) {
global $a;
if ($a->last_ostatus_conversation_url == $conversation_url)
return;
$a->last_ostatus_conversation_url = $conversation_url;
//logger('complete_conversation: completing conversation url '.$conversation_url.' for id '.$itemid);
$messages = q("SELECT `uid`, `parent`, `created` FROM `item` WHERE `id` = %d LIMIT 1", intval($itemid));


+ 55
- 7
js/acl.js View File

@ -1,7 +1,8 @@
function ACL(backend_url, preset){
function ACL(backend_url, preset, automention){
that = this;
that.url = backend_url;
that.automention = automention;
that.kp_timer = null;
@ -26,10 +27,45 @@ function ACL(backend_url, preset){
$("#acl-search").keypress(that.on_search);
$("#acl-wrapper").parents("form").submit(that.on_submit);
/* add/remove mentions */
that.element = $("#profile-jot-text");
that.htmlelm = that.element.get()[0];
/* startup! */
that.get(0,100);
}
ACL.prototype.remove_mention = function(id) {
if (!that.automention) return;
var nick = that.data[id].nick;
var searchText = "@"+nick+"+"+id+" ";
if (tinyMCE.activeEditor===null) {
start = that.element.val().indexOf(searchText);
if ( start<0) return;
end = start+searchText.length;
that.element.setSelection(start,end).replaceSelectedText('').collapseSelection(false);
} else {
start = tinyMCE.activeEditor.getContent({format : 'raw'}).search( searchText );
if ( start<0 ) return;
txt = tinyMCE.activeEditor.getContent();
newtxt = txt.replace(searchText, '');
tinyMCE.activeEditor.setContent(newtxt);
}
}
ACL.prototype.add_mention = function(id) {
if (!that.automention) return;
var nick = that.data[id].nick;
var searchText = "@"+nick+"+"+id+" ";
if (tinyMCE.activeEditor===null) {
if ( that.element.val().indexOf( searchText) >= 0 ) return;
that.element.val( searchText + that.element.val() );
} else {
if ( tinyMCE.activeEditor.getContent({format : 'raw'}).search(searchText) >= 0 ) return;
tinyMCE.activeEditor.dom.add(tinyMCE.activeEditor.getBody(), 'span', {}, searchText);
}
}
ACL.prototype.on_submit = function(){
aclfileds = $("#acl-fields").html("");
$(that.allow_gid).each(function(i,v){
@ -105,7 +141,8 @@ ACL.prototype.on_button_hide = function(event){
ACL.prototype.set_allow = function(itemid){
type = itemid[0];
id = parseInt(itemid.substr(1));
id = parseInt(itemid.substr(1));
switch(type){
case "g":
if (that.allow_gid.indexOf(id)<0){
@ -118,8 +155,10 @@ ACL.prototype.set_allow = function(itemid){
case "c":
if (that.allow_cid.indexOf(id)<0){
that.allow_cid.push(id)
if (that.data[id].forum=="1") that.add_mention(id);
} else {
that.allow_cid.remove(id);
if (that.data[id].forum=="1") that.remove_mention(id);
}
if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id);
break;
@ -129,7 +168,8 @@ ACL.prototype.set_allow = function(itemid){
ACL.prototype.set_deny = function(itemid){
type = itemid[0];
id = parseInt(itemid.substr(1));
id = parseInt(itemid.substr(1));
switch(type){
case "g":
if (that.deny_gid.indexOf(id)<0){
@ -140,6 +180,7 @@ ACL.prototype.set_deny = function(itemid){
if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id);
break;
case "c":
if (that.data[id].forum=="1") that.remove_mention(id);
if (that.deny_cid.indexOf(id)<0){
that.deny_cid.push(id)
} else {
@ -151,9 +192,13 @@ ACL.prototype.set_deny = function(itemid){
that.update_view();
}
ACL.prototype.is_show_all = function() {
return (that.allow_gid.length==0 && that.allow_cid.length==0 &&
that.deny_gid.length==0 && that.deny_cid.length==0);
}
ACL.prototype.update_view = function(){
if (that.allow_gid.length==0 && that.allow_cid.length==0 &&
that.deny_gid.length==0 && that.deny_cid.length==0){
if (this.is_show_all()){
that.showall.addClass("selected");
/* jot acl */
$('#jot-perms-icon').removeClass('lock').addClass('unlock');
@ -246,17 +291,20 @@ ACL.prototype.get = function(start,count, search){
ACL.prototype.populate = function(data){
var height = Math.ceil(data.tot / that.nw) * 42;
that.list_content.height(height);
that.data = {};
$(data.items).each(function(){
html = "<div class='acl-list-item {4} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
html = html.format(this.photo, this.name, this.type, this.id, '', this.network, this.link);
html = "<div class='acl-list-item {4} {5} type{2}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
html = html.format(this.photo, this.name, this.type, this.id, (this.forum=='1'?'forum':''), this.network, this.link);
if (this.uids!=undefined) that.group_uids[this.id] = this.uids;
//console.log(html);
that.list_content.append(html);
that.data[this.id] = this;
});
$(".acl-list-item img[data-src]", that.list_content).each(function(i, el){
// Add src attribute for images with a data-src attribute
$(el).attr('src', $(el).data("src"));
});
that.update_view();
}

+ 1
- 1
js/fk.autocomplete.js View File

@ -89,7 +89,7 @@ ACPopup.prototype._search = function(){
});
}
ACPopup.prototype.add = function(label, value){
ACPopup.prototype.add = function(label, value){
var that=this;
var elm = $("<div class='acpopupitem' title='"+value+"'>"+label+"</div>");
elm.click(function(e){


+ 2
- 2
library/slinky.php View File

@ -341,7 +341,7 @@ abstract class Slinky_Service {
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Don't stress about SSL validity
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // Return the response, don't output it
curl_setopt( $ch, CURLOPT_TIMEOUT, SLINKY_TIMEOUT ); // Limit how long we'll wait for a response
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections
//curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections
$r = curl_exec( $ch );
if ( curl_errno( $ch ) ) {
return false;
@ -372,7 +372,7 @@ abstract class Slinky_Service {
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); // Don't stress about SSL validity
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); // Return the response, don't output it
curl_setopt( $ch, CURLOPT_TIMEOUT, SLINKY_TIMEOUT ); // Limit how long we'll wait for a response
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections
//curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // Allow following of redirections
$r = curl_exec( $ch );
if ( curl_errno( $ch ) ) {
return false;


+ 3
- 1
mod/admin.php View File

@ -328,6 +328,7 @@ function admin_page_site_post(&$a){
$enotify_no_content = ((x($_POST,'enotify_no_content')) ? True : False);
$private_addons = ((x($_POST,'private_addons')) ? True : False);
$disable_embedded = ((x($_POST,'disable_embedded')) ? True : False);
$allow_users_remote_self = ((x($_POST,'allow_users_remote_self')) ? True : False);
$no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
$no_openid = !((x($_POST,'no_openid')) ? True : False);
@ -453,6 +454,7 @@ function admin_page_site_post(&$a){
set_config('system','newuser_private', $newuser_private);
set_config('system','enotify_no_content', $enotify_no_content);
set_config('system','disable_embedded', $disable_embedded);
set_config('system','allow_users_remote_self', $allow_users_remote_self);
set_config('system','block_extended_register', $no_multi_reg);
set_config('system','no_openid', $no_openid);
@ -603,7 +605,7 @@ function admin_page_site(&$a) {
'$enotify_no_content' => array('enotify_no_content', t("Don't include post content in email notifications"), get_config('system','enotify_no_content'), t("Don't include the content of a post/comment/private message/etc. in the email notifications that are sent out from this site, as a privacy measure.")),
'$private_addons' => array('private_addons', t("Disallow public access to addons listed in the apps menu."), get_config('config','private_addons'), t("Checking this box will restrict addons listed in the apps menu to members only.")),
'$disable_embedded' => array('disable_embedded', t("Don't embed private images in posts"), get_config('system','disable_embedded'), t("Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while.")),
'$allow_users_remote_self' => array('allow_users_remote_self', t('Allow Users to set remote_self'), get_config('system','allow_users_remote_self'), t('With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream.')),
'$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")),
'$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
'$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")),


+ 116
- 35
mod/contacts.php View File

@ -67,11 +67,61 @@ function contacts_init(&$a) {
}
function contacts_batch_actions(&$a){
$contacts_id = $_POST['contact_batch'];
if (!is_array($contacts_id)) return;
$orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0",
implode(",", $contacts_id),
intval(local_user())
);
$count_actions=0;
foreach($orig_records as $orig_record) {
$contact_id = $orig_record['id'];
if (x($_POST, 'contacts_batch_update')) {
_contact_update($contact_id);
$count_actions++;
}
if (x($_POST, 'contacts_batch_block')) {
$r = _contact_block($contact_id, $orig_record);
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_ignore')) {
$r = _contact_ignore($contact_id, $orig_record);
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_archive')) {
$r = _contact_archive($contact_id, $orig_record);
if ($r) $count_actions++;
}
if (x($_POST, 'contacts_batch_drop')) {
_contact_drop($contact_id, $orig_record);
$count_actions++;
}
}
if ($count_actions>0) {
info ( sprintf( tt("%d contact edited.", "%d contacts edited", $count_actions), $count_actions) );
}
if(x($_SESSION,'return_url'))
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
else
goaway($a->get_baseurl(true) . '/contacts');
}
function contacts_post(&$a) {
if(! local_user())
return;
if ($a->argv[1]==="batch") {
contacts_batch_actions($a);
return;
}
$contact_id = intval($a->argv[1]);
if(! $contact_id)
return;
@ -140,6 +190,49 @@ function contacts_post(&$a) {
}
/*contact actions*/
function _contact_update($contact_id) {
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/poller.php","$contact_id");
}
function _contact_block($contact_id, $orig_record) {
$blocked = (($orig_record['blocked']) ? 0 : 1);
$r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($blocked),
intval($contact_id),
intval(local_user())
);
return $r;
}
function _contact_ignore($contact_id, $orig_record) {
$readonly = (($orig_record['readonly']) ? 0 : 1);
$r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($readonly),
intval($contact_id),
intval(local_user())
);
return $r;
}
function _contact_archive($contact_id, $orig_record) {
$archived = (($orig_record['archive']) ? 0 : 1);
$r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($archived),
intval($contact_id),
intval(local_user())
);
if ($archived) {
q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact_id), intval(local_user()));
}
return $r;
}
function _contact_drop($contact_id, $orig_record) {
require_once('include/Contact.php');
$a = get_app();
terminate_friendship($a->user,$a->contact,$orig_record);
contact_remove($orig_record['id']);
}
function contacts_content(&$a) {
@ -174,57 +267,38 @@ function contacts_content(&$a) {
}
if($cmd === 'update') {
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/poller.php","$contact_id");
_contact_update($contact_id);
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
// NOTREACHED
}
if($cmd === 'block') {
$blocked = (($orig_record[0]['blocked']) ? 0 : 1);
$r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($blocked),
intval($contact_id),
intval(local_user())
);
$r = _contact_block($contact_id, $orig_record[0]);
if($r) {
//notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL );
info( (($blocked) ? t('Contact has been blocked') : t('Contact has been unblocked')) . EOL );
}
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
return; // NOTREACHED
}
if($cmd === 'ignore') {
$readonly = (($orig_record[0]['readonly']) ? 0 : 1);
$r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($readonly),
intval($contact_id),
intval(local_user())
);
$r = _contact_ignore($contact_id, $orig_record[0]);
if($r) {
info( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL );
}
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
return; // NOTREACHED
}
if($cmd === 'archive') {
$archived = (($orig_record[0]['archive']) ? 0 : 1);
$r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($archived),
intval($contact_id),
intval(local_user())
);
if ($archived) {
q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact_id), intval(local_user()));
}
$r = _contact_archive($contact_id, $orig_record[0]);
if($r) {
//notice( t('Contact has been ') . (($archived) ? t('archived') : t('unarchived')) . EOL );
info( (($archived) ? t('Contact has been archived') : t('Contact has been unarchived')) . EOL );
}
}
goaway($a->get_baseurl(true) . '/contacts/' . $contact_id);
return; // NOTREACHED
}
@ -257,15 +331,13 @@ function contacts_content(&$a) {
}
// Now check how the user responded to the confirmation query
if($_REQUEST['canceled']) {
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
if(x($_SESSION,'return_url'))
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
else
goaway($a->get_baseurl(true) . '/contacts');
}
require_once('include/Contact.php');
terminate_friendship($a->user,$a->contact,$orig_record[0]);
contact_remove($orig_record[0]['id']);
_contact_drop($contact_id, $orig_record[0]);
info( t('Contact has been removed.') . EOL );
if(x($_SESSION,'return_url'))
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
@ -534,7 +606,7 @@ function contacts_content(&$a) {
$search_txt = dbesc(protect_sprintf(preg_quote($search)));
$searching = true;
}
$sql_extra .= (($searching) ? " AND `name` REGEXP '$search_txt' " : "");
$sql_extra .= (($searching) ? " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') " : "");
if($nets)
$sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
@ -612,6 +684,7 @@ function contacts_content(&$a) {
$tpl = get_markup_template("contacts-template.tpl");
$o .= replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
'$header' => t('Contacts') . (($nets) ? ' - ' . network_to_name($nets) : ''),
'$tabs' => $t,
'$total' => $total,
@ -621,6 +694,14 @@ function contacts_content(&$a) {
'$submit' => t('Find'),
'$cmd' => $a->cmd,
'$contacts' => $contacts,
'$contact_drop_confirm' => t('Do you really want to delete this contact?'),
'$batch_actions' => array(
'contacts_batch_update' => t('Update'),
'contacts_batch_block' => t('Block')."/".t("Unblock"),
"contacts_batch_ignore" => t('Ignore')."/".t("Unignore"),
"contacts_batch_archive" => t('Archive')."/".t("Unarchive"),
"contacts_batch_drop" => t('Delete'),
),
'$paginate' => paginate($a),
));


+ 4
- 2
mod/crepair.php View File

@ -156,7 +156,9 @@ function crepair_content(&$a) {
'$label_notify' => t('Notification Endpoint URL'),
'$label_poll' => t('Poll/Feed URL'),
'$label_photo' => t('New photo from this URL'),
'$label_self' => t('Mirror all posts to the wall?'),
'$label_remote_self' => t('Remote Self'),
'$allow_remote_self' => get_config('system','allow_users_remote_self'),
'$remote_self' => array('remote_self', t('Mirror postings from this contact'), $contact['remote_self'], t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.')),
'$contact_name' => $contact['name'],
'$contact_nick' => $contact['nick'],
'$contact_id' => $contact['id'],
@ -169,7 +171,7 @@ function crepair_content(&$a) {
'$contact_self' => array('remote_self', t('Mirror all posts to the wall?'), $contact['remote_self'],
t('Shall all posts from this contact posted like your own posts?')),
'$lbl_submit' => t('Submit')
));
));
return $o;


+ 14
- 8
mod/parse_url.php View File

@ -311,9 +311,9 @@ function parse_url_content(&$a) {
logger('parse_url: ' . $url);
if($textmode)
$template = $br . '[bookmark=%s]%s[/bookmark]%s' . $br;
$template = '[bookmark=%s]%s[/bookmark]%s' . $br;
else
$template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
$template = "<a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
$arr = array('url' => $url, 'text' => '');
@ -328,9 +328,9 @@ function parse_url_content(&$a) {
if($url && $title && $text) {
if($textmode)
$text = $br . '[quote]' . trim($text) . '[/quote]' . $br;
$text = '[quote]' . trim($text) . '[/quote]' . $br;
else
$text = '<br /><blockquote>' . trim($text) . '</blockquote><br />';
$text = '<blockquote>' . trim($text) . '</blockquote><br />';
$title = str_replace(array("\r","\n"),array('',''),$title);
@ -344,8 +344,10 @@ function parse_url_content(&$a) {
$siteinfo = parseurl_getsiteinfo($url);
$sitedata = "";
if($siteinfo["title"] == "") {
echo sprintf($template,$url,$url,'') . $str_tags;
$sitedata .= sprintf($template,$url,$url,'') . $str_tags;
killme();
} else {
$text = $siteinfo["text"];
@ -377,20 +379,24 @@ function parse_url_content(&$a) {
if(strlen($text)) {
if($textmode)
$text = $br.'[quote]'.trim($text).'[/quote]'.$br ;
$text = '[quote]'.trim($text).'[/quote]';
else
$text = '<br /><blockquote>'.trim($text).'</blockquote><br />';
$text = '<blockquote>'.trim($text).'</blockquote>';
}
if($image) {
$text = $br.$br.$image.$text;
}
$title = str_replace(array("\r","\n"),array('',''),$title);
$result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
logger('parse_url: returns: ' . $result);
echo trim($result);
$sitedata .= trim($result);
echo "[class=type-link]".$sitedata."[/class]";
killme();
}

+ 13
- 1
mods/readme.txt View File

@ -1,6 +1,18 @@
Site speed can be improved when the following indexes are set. They cannot be set through the update script because on large sites they will block the site for several minutes.
Site speed can be improved when the following indexes are set. They
cannot be set through the update script because on large sites they will
block the site for several minutes.
CREATE INDEX `uid_commented` ON `item` (`uid`, `commented`);
CREATE INDEX `uid_created` ON `item` (`uid`, `created`);
CREATE INDEX `uid_unseen` ON `item` (`uid`, `unseen`);
CREATE INDEX `resource-id` ON `item` (`resource-id`);
CREATE INDEX `uri_received` ON item(`uri`, `received`);
CREATE INDEX `received_uri` ON item(`received`, `uri`);
CREATE INDEX `contact-id_created` ON item(`contact-id`, created);
CREATE INDEX `uid_network_received` ON item(`uid`, `network`, `received`);
CREATE INDEX `uid_parent` ON item(`uid`, `parent`);
CREATE INDEX `uid_received` ON item(`uid`, `received`);
CREATE INDEX `uid_network_commented` ON item(`uid`, `network`, `commented`);
CREATE INDEX `uid_commented` ON item(`uid`, `commented`);
CREATE INDEX `uid_title` ON item(uid, `title`);
CREATE INDEX `created_contact-id` ON item(`created`, `contact-id`);

+ 667
- 624
util/messages.po
File diff suppressed because it is too large
View File


+ 668
- 625
view/de/messages.po
File diff suppressed because it is too large
View File


+ 12
- 1
view/de/strings.php View File

@ -485,6 +485,8 @@ $a->strings["Disallow public access to addons listed in the apps menu."] = "Öff
$a->strings["Checking this box will restrict addons listed in the apps menu to members only."] = "Wenn ausgewählt werden die im Apps Menü aufgeführten Addons nur angemeldeten Nutzern der Seite zur Verfügung gestellt.";
$a->strings["Don't embed private images in posts"] = "Private Bilder nicht in Beiträgen einbetten.";
$a->strings["Don't replace locally-hosted private photos in posts with an embedded copy of the image. This means that contacts who receive posts containing private photos will have to authenticate and load each image, which may take a while."] = "Ersetze lokal gehostete private Fotos in Beiträgen nicht mit einer eingebetteten Kopie des Bildes. Dies bedeutet, dass Kontakte, die Beiträge mit privaten Fotos erhalten sich zunächst auf den jeweiligen Servern authentifizieren müssen bevor die Bilder geladen und angezeigt werden, was eine gewisse Zeit dauert.";
$a->strings["Allow Users to set remote_self"] = "Nutzern erlauben das remote_self Flag zu setzen";
$a->strings["With checking this, every user is allowed to mark every contact as a remote_self in the repair contact dialog. Setting this flag on a contact causes mirroring every posting of that contact in the users stream."] = "Ist dies ausgewählt kann jeder Nutzer jeden seiner Kontakte als remote_self (entferntes Konto) im Kontakt reparieren Dialog markieren. Nach dem setzten dieses Flags werden alle Top-Level Beiträge dieser Kontakte automatisch in den Stream dieses Nutzers gepostet.";
$a->strings["Block multiple registrations"] = "Unterbinde Mehrfachregistrierung";
$a->strings["Disallow users to register additional accounts for use as pages."] = "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen.";
$a->strings["OpenID support"] = "OpenID Unterstützung";
@ -649,6 +651,9 @@ $a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsan
$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
$a->strings["Remote Self"] = "Entfernte Konten";
$a->strings["Mirror postings from this contact"] = "Spiegle Beiträge dieses Kontakts";
$a->strings["Mark this contact as remote_self, this will cause friendica to repost new entries from this contact."] = "Markiere diesen Kontakt als remote_self (entferntes Konto), dies veranlasst Friendica alle Top-Level Beiträge dieses Kontakts an all deine Kontakte zu senden.";
$a->strings["Move account"] = "Account umziehen";
$a->strings["You can import an account from another Friendica server."] = "Du kannst einen Account von einem anderen Friendica Server importieren.";
$a->strings["You need to export your account from the old server and upload it here. We will recreate your old account here with all your contacts. We will try also to inform your friends that you moved here."] = "Du musst deinen Account vom alten Server exportieren und hier hochladen. Wir stellen deinen alten Account mit all deinen Kontakten wieder her. Wir werden auch versuchen all deine Freunde darüber zu informieren, dass du hierher umgezogen bist.";
@ -708,6 +713,10 @@ $a->strings["Your Identity Address:"] = "Adresse deines Profils:";
$a->strings["Submit Request"] = "Anfrage abschicken";
$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
$a->strings["View in context"] = "Im Zusammenhang betrachten";
$a->strings["%d contact edited."] = array(
0 => "%d Kontakt bearbeitet.",
1 => "%d Kontakte bearbeitet",
);
$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
$a->strings["Contact updated."] = "Kontakt aktualisiert.";
@ -779,6 +788,7 @@ $a->strings["is a fan of yours"] = "ist ein Fan von dir";
$a->strings["you are a fan of"] = "du bist Fan von";
$a->strings["Edit contact"] = "Kontakt bearbeiten";
$a->strings["Search your contacts"] = "Suche in deinen Kontakten";
$a->strings["Update"] = "Aktualisierungen";
$a->strings["everybody"] = "jeder";
$a->strings["Account settings"] = "Kontoeinstellungen";
$a->strings["Additional features"] = "Zusätzliche Features";
@ -789,7 +799,6 @@ $a->strings["Connected apps"] = "Verbundene Programme";
$a->strings["Export personal data"] = "Persönliche Daten exportieren";
$a->strings["Remove account"] = "Konto löschen";
$a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
$a->strings["Update"] = "Aktualisierungen";
$a->strings["Failed to connect with email account using the settings provided."] = "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich.";
$a->strings["Email settings updated."] = "E-Mail Einstellungen bearbeitet.";
$a->strings["Features updated"] = "Features aktualisiert";
@ -1289,6 +1298,8 @@ $a->strings["Categories"] = "Kategorien";
$a->strings["Click here to upgrade."] = "Zum Upgraden hier klicken.";
$a->strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Obergrenze deines Abonnements.";
$a->strings["This action is not available under your subscription plan."] = "Diese Aktion ist in deinem Abonnement nicht verfügbar.";
$a->strings["User not found."] = "Nutzer nicht gefunden.";
$a->strings["There is no status with this id."] = "Es gibt keinen Status mit dieser ID.";
$a->strings["view full size"] = "Volle Größe anzeigen";
$a->strings["Starts:"] = "Beginnt:";
$a->strings["Finishes:"] = "Endet:";


+ 5524
- 5372
view/pl/messages.po
File diff suppressed because it is too large
View File


+ 1518
- 1488
view/pl/strings.php
File diff suppressed because it is too large
View File


+ 3
- 6
view/templates/acl_selector.tpl View File

@ -1,8 +1,4 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<div id="acl-wrapper">
<input id="acl-search">
<a href="#" id="acl-showall">{{$showall}}</a>
@ -24,7 +20,8 @@ $(document).ready(function() {
if(typeof acl=="undefined"){
acl = new ACL(
baseurl+"/acl",
[ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ]
[ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ],
{{$features.aclautomention}}
);
}
});


+ 1
- 0
view/templates/admin_site.tpl View File

@ -89,6 +89,7 @@
{{include file="field_checkbox.tpl" field=$enotify_no_content}}
{{include file="field_checkbox.tpl" field=$private_addons}}
{{include file="field_checkbox.tpl" field=$disable_embedded}}
{{include file="field_checkbox.tpl" field=$allow_users_remote_self}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
<h3>{{$advanced}}</h3>


+ 4
- 8
view/templates/contact_template.tpl View File

@ -1,8 +1,3 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" >
<div class="contact-entry-photo-wrapper" >
@ -12,15 +7,16 @@
<a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" {{$contact.sparkle}} alt="{{$contact.name}}" /></a>
<input type="checkbox" class="contact-select" name="contact_batch[]" value="{{$contact.id}}">
{{if $contact.photo_menu}}
<span onclick="openClose('contact-photo-menu-{{$contact.id}}');" class="fakelink contact-photo-menu-button" id="contact-photo-menu-button-{{$contact.id}}">menu</span>
<div class="contact-photo-menu" id="contact-photo-menu-{{$contact.id}}">
<ul>
{{foreach $contact.photo_menu as $c}}
{{foreach $contact.photo_menu as $k=>$c}}
{{if $c.2}}
<li><a target="redir" href="{{$c.1}}">{{$c.0}}</a></li>
<li><a class="{{$k}}" target="redir" href="{{$c.1}}">{{$c.0}}</a></li>
{{else}}
<li><a href="{{$c.1}}">{{$c.0}}</a></li>
<li><a class="{{$k}}" href="{{$c.1}}">{{$c.0}}</a></li>
{{/if}}
{{/foreach}}
</ul>


+ 35
- 6
view/templates/contacts-template.tpl View File

@ -1,8 +1,4 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<h1>{{$header}}{{if $total}} ({{$total}}){{/if}}</h1>
{{if $finding}}<h4>{{$finding}}</h4>{{/if}}
@ -18,11 +14,44 @@
{{$tabs}}
<form action="{{$baseurl}}/contacts/batch/" method="POST">
{{foreach $contacts as $contact}}
{{include file="contact_template.tpl"}}
{{/foreach}}
<div id="contact-edit-end"></div>
<div id="contats-actions">
{{foreach $batch_actions as $n=>$l}}
<input class="batch-action" name="{{$n}}" value="{{$l}}" type="submit">
{{/foreach}}
</div>
</form>
<script>
$(document).ready(function() {
// javascript dialog to batch actions
$(".batch-action").click(function(e){
if (confirm($(this).attr('value')+" ?")) {
return true;
} else {
e.preventDefault();
return false;
}
});
// add javascript confirm dialog to "drop" links. Plain html url have "?confirm=1" to show confirmation form, we need to remove it
$(".drop").each(function() {
$(this).attr('href', $(this).attr('href').replace("confirm=1","") );
$(this).click(function(e){
if (confirm("{{$contact_drop_confirm}}")) {
return true;
} else {
e.preventDefault();
return false;
}
});
});
});
</script>
{{$paginate}}


+ 4
- 6
view/templates/crepair.tpl View File

@ -1,9 +1,3 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<form id="crepair-form" action="crepair/{{$contact_id}}" method="post" >
<h4>{{$contact_name}}</h4>
@ -43,6 +37,10 @@
<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">{{$label_photo}}</label>
<input type="text" id="crepair-photo" class="crepair-input" name="photo" value="" />
<div class="clear"></div>
{{if $allow_remote_self eq 1}}
<h4>{{$label_remote_self}}</h4>
{{include file="field_checkbox.tpl" field=$remote_self}}
{{/if}}
{{include file="field_checkbox.tpl" field=$contact_self}}


+ 67
- 1
view/theme/duepuntozero/style.css View File

@ -91,6 +91,7 @@ nav {
display: block;
margin: 0px 10%;
border-bottom: 1px solid #babdb6;
position: relative;
}
nav #site-location {
color: #888a85;
@ -1616,6 +1617,9 @@ input#dfrn-url {
margin-top: 20px;
}
.contact-select { position: absolute; top: 64px; left:64px; display:none; }
.contact-select:checked,
.contact-entry-photo:hover .contact-select { display:block; }
.contact-photo-menu-button {
position: absolute;
@ -2905,6 +2909,8 @@ aside input[type='text'] {
.field.radio .field_help { margin-left: 0px; }
/**
* ADMIN
*/
@ -3252,7 +3258,7 @@ ul.menu-popup {
list-style: none;
z-index: 100000;
top: 90px;
left: 400px;
left: 200px;
}
#nav-notifications-menu {
width: 320px;
@ -3328,3 +3334,63 @@ ul.menu-popup {
.shared_header span {
margin-left: 10px;
}
/* small screens */
@media all and (max-width: 1089px) {
.field label { width: 90%; }
.field input, .field textarea, .field select { width: 90%; }
.field input[type="checkbox"],.field input[type="radio"] {
width: 2em;
}
#id_openid_url { width: 85%; }
.field_help { margin-left: 0px; }
textarea { width: 100%; }
}
@media all and (max-width: 760px) {
body { background-image: none; }
nav, aside, section, footer {
margin: 0px;
float: none;
position: relative;
width: 100%;
padding: 0.5em;
height: auto;
}
aside:before {
content: ">>";
display: block;
background-color: #eee;
}
aside { overflow: hidden; min-height: 0; height: 1em;}
aside:hover, aside:focus { height: auto; }
nav .nav-link {
float: left;
width: 23%;
min-width: 100px;
height: 15px;
display: block;
margin: 0.4em 2px 0 0;
padding: 6px 3px;
border-width: 1px 1px 0px;
border-style: solid solid none;
border-color: rgb(186, 189, 182);
background-color: rgb(174, 192,211)!important;
}
.nav-commlink.selected,
.nav-commlink {
border-bottom: 0px;
padding: 6px 3px;
min-width: 100px;
float: left;
margin-top: 0.4em;
width: 23%;
bottom: auto;
}
.nav-ajax-left {margin-left: -1em; margin-top: 0px; }
nav #site-location,
nav #banner { position: relative; clear:both; }
ul.menu-popup { left: 0px; top 20px; }
}

+ 13
- 0
view/theme/quattro/dark/style.css View File

@ -1349,6 +1349,19 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper {
position: relative;
}
.contact-select {
position: absolute;
top: 64px;
left: 64px;
display: none;
}
.contact-select:checked,
.contact-photo:hover .contact-select {
display: block;
}
#contats-actions {
clear: both;
}
.contact-photo {
width: 48px;
height: 48px;


+ 13
- 0
view/theme/quattro/green/style.css View File

@ -1349,6 +1349,19 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper {
position: relative;
}
.contact-select {
position: absolute;
top: 64px;
left: 64px;
display: none;
}
.contact-select:checked,
.contact-photo:hover .contact-select {
display: block;
}
#contats-actions {
clear: both;
}
.contact-photo {
width: 48px;
height: 48px;


+ 13
- 0
view/theme/quattro/lilac/style.css View File

@ -1349,6 +1349,19 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper {
position: relative;
}
.contact-select {
position: absolute;
top: 64px;
left: 64px;
display: none;
}
.contact-select:checked,
.contact-photo:hover .contact-select {
display: block;
}
#contats-actions {
clear: both;
}
.contact-photo {
width: 48px;
height: 48px;


+ 6
- 1
view/theme/quattro/quattro.less View File

@ -527,7 +527,8 @@ section {
.contact-photo-wrapper { margin-left: 16px; }
.contact-photo {
width: 32px; height: 32px;
}
}
.contact-photo-menu-button {
top: 15px !important;
left: 0px !important;
@ -738,6 +739,10 @@ span[id^="showmore-wrap"] {
.contact-photo-wrapper { position: relative; }
.contact-select { position: absolute; top:64px; left:64px; display:none; }
.contact-select:checked,
.contact-photo:hover .contact-select { display:block; }
#contats-actions { clear: both; }
.contact-photo {
width: 48px; height: 48px;
img { width: 48px; height: 48px; }


+ 1
- 5
view/theme/quattro/templates/contact_template.tpl View File

@ -1,8 +1,3 @@
{{*
* AUTOMATICALLY GENERATED TEMPLATE
* DO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN
*
*}}
<div class="contact-wrapper" id="contact-entry-wrapper-{{$id}}" >
<div class="contact-photo-wrapper" >
@ -12,6 +7,7 @@
<a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img src="{{$contact.thumb}}" {{$contact.sparkle}} alt="{{$contact.name}}" /></a>
<input type="checkbox" class="contact-select" name="contact_batch[]" value="{{$contact.id}}">
{{if $contact.photo_menu}}
<a href="#" rel="#contact-photo-menu-{{$contact.id}}" class="contact-photo-menu-button icon s16 menu" id="contact-photo-menu-button-{{$contact.id}}">menu</a>
<ul class="contact-photo-menu menu-popup" id="contact-photo-menu-{{$contact.id}}">


+ 31
- 2
view/theme/vier/style.css View File

@ -291,7 +291,9 @@ blockquote.shared_content {
body {
font-family: 'Lato', "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
background-color: #ffffff;
/* background-color: #ffffff; */
background-color: #FAFAFA;
/* background-color: rgb(252, 252, 252); */
color: #2d2d2d;
margin: 0px 0px 0px 0px;
display: table;
@ -1087,7 +1089,9 @@ section {
width: 766px;
max-width: 766px;
padding: 10px 10px 10px 10px;
background-color: white;
/* background-color: white; */
/* background-color: rgb(252, 252, 252); */
background-color: #FAFAFA;
border-bottom: 1px solid lightgray;
border-right: 1px solid lightgray;
border-left: 1px solid lightgray;
@ -1410,6 +1414,31 @@ border-bottom: 1px solid #D2D2D2;
padding-right: 12px; */
}
.twit {
background-color: #FFFAFA;
}
.pump {
background-color: #FAFFFA;
}
.face {
background-color: #FAFAFF;
}
.feed {
background-color: #FFFFFA;
}
.dspr {
background-color: #FFFAFF;
}
.dfrn {
background-color: #FAFFFF;
}
.stat {
background-color: #FAFAFA;
}
.mail {
background-color: #FFFFF9;
}
#profile-jot-form #profile-jot-text {
height: 2.0em;
/* width: 99%; */


+ 1
- 1
view/theme/vier/templates/threaded_conversation.tpl View File

@ -7,7 +7,7 @@
{{foreach $threads as $thread}}
<div id="tread-wrapper-{{$thread.id}}" class="tread-wrapper {{if $thread.threaded}}threaded{{/if}} {{$thread.toplevel}}">
<div id="tread-wrapper-{{$thread.id}}" class="tread-wrapper {{if $thread.threaded}}threaded{{/if}} {{$thread.toplevel}} {{$thread.network}}">
{{if $thread.type == tag}}


+ 1
- 1
view/theme/vier/templates/wall_thread.tpl View File

@ -32,7 +32,7 @@
<img id="like-rotator-{{$item.id}}" class="like-rotator" src="images/rotator.gif" alt="{{$item.wait}}" title="{{$item.wait}}" style="display: none;" />
</div>
<div class="wall-item-container {{$item.indent}} {{$item.shiny}} " id="item-{{$item.id}}">
<div class="wall-item-container {{$item.indent}} {{$item.shiny}} {{$item.network}}" id="item-{{$item.id}}">
<div class="wall-item-item">
<div class="wall-item-info">
<div class="contact-photo-wrapper mframe{{if $item.owner_url}} wwfrom{{/if}}"


Loading…
Cancel
Save