diff --git a/boot.php b/boot.php
index 5b7b60480..49247eb23 100644
--- a/boot.php
+++ b/boot.php
@@ -4,7 +4,7 @@ set_time_limit(0);
ini_set('pcre.backtrack_limit', 250000);
-define ( 'FRIENDIKA_VERSION', '2.2.1011' );
+define ( 'FRIENDIKA_VERSION', '2.2.1012' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1063 );
diff --git a/include/conversation.php b/include/conversation.php
index 9ffcbe157..0d3123831 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -114,6 +114,8 @@ function conversation(&$a, $items, $mode, $update) {
$noshare_tpl = get_markup_template('like_noshare.tpl');
$tpl = get_markup_template('wall_item.tpl');
$wallwall = get_markup_template('wallwall_item.tpl');
+ $droptpl = get_markup_template('wall_item_drop.tpl');
+ $fakedrop = get_markup_template('wall_fake_drop.tpl');
$alike = array();
$dlike = array();
@@ -126,7 +128,6 @@ function conversation(&$a, $items, $mode, $update) {
// - just loop through the items and format them minimally for display
$tpl = get_markup_template('search_item.tpl');
- $droptpl = get_markup_template('wall_fake_drop.tpl');
foreach($items as $item) {
@@ -171,14 +172,7 @@ function conversation(&$a, $items, $mode, $update) {
}
$drop = '';
- $dropping = false;
- if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user()))
- $dropping = true;
-
- $drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$delete' => t('Delete')));
-
- //
localize_item($item);
$drop = replace_macros($droptpl,array('$id' => $item['id']));
@@ -390,7 +384,16 @@ function conversation(&$a, $items, $mode, $update) {
? ''
: '');
- $drop = replace_macros(get_markup_template('wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
+
+
+ $drop = '';
+ $dropping = false;
+
+ if((intval($item['contact-id']) && $item['contact-id'] == remote_user()) || ($item['uid'] == local_user()))
+ $dropping = true;
+
+ $drop = replace_macros((($dropping)? $droptpl : $fakedrop), array('$id' => $item['id'], '$delete' => t('Delete')));
+
$photo = $item['photo'];
$thumb = $item['thumb'];
@@ -477,6 +480,7 @@ function conversation(&$a, $items, $mode, $update) {
'$comment' => $comment
));
+
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
@@ -491,6 +495,9 @@ function conversation(&$a, $items, $mode, $update) {
if($blowhard_count >= 3)
$o .= '';
+ if($dropping)
+ $o .= '
' . t('Delete Selected Items') . '
';
+
return $o;
}
diff --git a/include/items.php b/include/items.php
index dc177c468..a003b84bb 100644
--- a/include/items.php
+++ b/include/items.php
@@ -1772,3 +1772,129 @@ function item_expire($uid,$days) {
}
+
+function drop_items($items) {
+ $uid = 0;
+
+ if(count($items)) {
+ foreach($items as $item) {
+ $owner = drop_item($item,false);
+ if($owner && ! $uid)
+ $uid = $owner;
+ }
+ }
+
+ // multiple threads may have been deleted, send an expire notification
+
+ if($uid)
+ proc_run('php',"include/notifier.php","expire","$uid");
+}
+
+
+function drop_item($id,$interactive = true) {
+
+ $a = get_app();
+
+ // locate item to be deleted
+
+ $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
+ intval($id)
+ );
+
+ if(! count($r)) {
+ if(! $interactive)
+ return 0;
+ notice( t('Item not found.') . EOL);
+ goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
+ }
+
+ $item = $r[0];
+
+ $owner = $item['uid'];
+
+ // check if logged in user is either the author or owner of this item
+
+ if((local_user() == $item['uid']) || (remote_user() == $item['contact-id'])) {
+
+ // delete the item
+
+ $r = q("UPDATE `item` SET `deleted` = 1, `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($item['id'])
+ );
+
+ // If item is a link to a photo resource, nuke all the associated photos
+ // (visitors will not have photo resources)
+ // This only applies to photos uploaded from the photos page. Photos inserted into a post do not
+ // generate a resource-id and therefore aren't intimately linked to the item.
+
+ if(strlen($item['resource-id'])) {
+ q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ",
+ dbesc($item['resource-id']),
+ intval($item['uid'])
+ );
+ // ignore the result
+ }
+
+ // If item is a link to an event, nuke the event record.
+
+ if(intval($item['event-id'])) {
+ q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($item['event-id']),
+ intval($item['uid'])
+ );
+ // ignore the result
+ }
+
+
+ // If it's the parent of a comment thread, kill all the kids
+
+ if($item['uri'] == $item['parent-uri']) {
+ $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = ''
+ WHERE `parent-uri` = '%s' AND `uid` = %d ",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($item['parent-uri']),
+ intval($item['uid'])
+ );
+ // ignore the result
+ }
+ else {
+ // ensure that last-child is set in case the comment that had it just got wiped.
+ q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ",
+ dbesc(datetime_convert()),
+ dbesc($item['parent-uri']),
+ intval($item['uid'])
+ );
+ // who is the last child now?
+ $r = q("SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d ORDER BY `edited` DESC LIMIT 1",
+ dbesc($item['parent-uri']),
+ intval($item['uid'])
+ );
+ if(count($r)) {
+ q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
+ intval($r[0]['id'])
+ );
+ }
+ }
+ $drop_id = intval($item['id']);
+
+ // send the notification upstream/downstream as the case may be
+
+ if(! $interactive)
+ return $owner;
+
+ proc_run('php',"include/notifier.php","drop","$drop_id");
+ goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
+ //NOTREACHED
+ }
+ else {
+ if(! $interactive)
+ return 0;
+ notice( t('Permission denied.') . EOL);
+ goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
+ //NOTREACHED
+ }
+
+}
\ No newline at end of file
diff --git a/include/main.js b/include/main.js
index 34045f57f..18cb55328 100644
--- a/include/main.js
+++ b/include/main.js
@@ -47,26 +47,6 @@
$('#pause').html('');
}
}
-// // F8 - show/hide language selector
-// if(event.keyCode == '119') {
-// if(langSelect) {
-// langSelect = false;
-// $('#language-selector').hide();
-// }
-// else {
-// langSelect = true;
-// $('#language-selector').show();
-// }
-// }
-//
-// this is shift-home on FF, but $ on IE, disabling until I figure out why the diff.
-// update: incompatible usage of onKeyDown vs onKeyPress
-// if(event.keyCode == '36' && event.shiftKey == true) {
-// if(homebase !== undefined) {
-// event.preventDefault();
-// document.location = homebase;
-// }
-// }
});
});
diff --git a/mod/item.php b/mod/item.php
index 776c0dcc2..98f4ff90c 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -22,6 +22,15 @@ function item_post(&$a) {
$uid = local_user();
+ if(x($_POST,'dropitems')) {
+ require_once('include/items.php');
+ $arr_drop = explode(',',$_POST['dropitems']);
+ drop_items($arr_drop);
+ $json = array('success' => 1);
+ echo json_encode($json);
+ killme();
+ }
+
call_hooks('post_local_start', $_POST);
$parent = ((x($_POST,'parent')) ? intval($_POST['parent']) : 0);
@@ -735,102 +744,8 @@ function item_content(&$a) {
require_once('include/security.php');
- $uid = local_user();
-
if(($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) {
-
- // locate item to be deleted
-
- $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
- intval($a->argv[2])
- );
-
- if(! count($r)) {
- notice( t('Item not found.') . EOL);
- goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
- }
- $item = $r[0];
-
- // check if logged in user is either the author or owner of this item
-
- if(($_SESSION['visitor_id'] == $item['contact-id']) || ($_SESSION['uid'] == $item['uid'])) {
-
- // delete the item
-
- $r = q("UPDATE `item` SET `deleted` = 1, `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($item['id'])
- );
-
- // If item is a link to a photo resource, nuke all the associated photos
- // (visitors will not have photo resources)
- // This only applies to photos uploaded from the photos page. Photos inserted into a post do not
- // generate a resource-id and therefore aren't intimately linked to the item.
-
- if(strlen($item['resource-id'])) {
- q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ",
- dbesc($item['resource-id']),
- intval($item['uid'])
- );
- // ignore the result
- }
-
- // If item is a link to an event, nuke the event record.
-
- if(intval($item['event-id'])) {
- q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item['event-id']),
- intval($item['uid'])
- );
- // ignore the result
- }
-
-
- // If it's the parent of a comment thread, kill all the kids
-
- if($item['uri'] == $item['parent-uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = ''
- WHERE `parent-uri` = '%s' AND `uid` = %d ",
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($item['parent-uri']),
- intval($item['uid'])
- );
- // ignore the result
- }
- else {
- // ensure that last-child is set in case the comment that had it just got wiped.
- q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ",
- dbesc(datetime_convert()),
- dbesc($item['parent-uri']),
- intval($item['uid'])
- );
- // who is the last child now?
- $r = q("SELECT `id` FROM `item` WHERE `parent-uri` = '%s' AND `type` != 'activity' AND `deleted` = 0 AND `uid` = %d ORDER BY `edited` DESC LIMIT 1",
- dbesc($item['parent-uri']),
- intval($item['uid'])
- );
- if(count($r)) {
- q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
- intval($r[0]['id'])
- );
- }
- }
- $drop_id = intval($item['id']);
-
- // send the notification upstream/downstream as the case may be
-
- proc_run('php',"include/notifier.php","drop","$drop_id");
-// We seem to lose the return url occasionally. Have not been able to reliably duplicate
-// logger('drop_return_url: ' . $_SESSION['return_url']);
- goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
- //NOTREACHED
- }
- else {
- notice( t('Permission denied.') . EOL);
- goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
- //NOTREACHED
- }
+ require_once('include/items.php');
+ drop_item($a->argv[2]);
}
}
diff --git a/mod/photos.php b/mod/photos.php
index 717800364..e52f67008 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -1274,7 +1274,7 @@ function photos_content(&$a) {
$drop = '';
if(($item['contact-id'] == remote_user()) || ($item['uid'] == local_user()))
- $drop = replace_macros(get_markup_template('wall_item_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
+ $drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
$comments .= replace_macros($template,array(
diff --git a/mod/profile.php b/mod/profile.php
index aeb21f077..587ac6288 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -261,11 +261,8 @@ function profile_content(&$a, $update = 0) {
if($is_owner && ! $update)
$o .= get_birthdays();
-
-
$o .= conversation($a,$r,'profile',$update);
-
if(! $update) {
$o .= paginate($a);
diff --git a/view/jot-header.tpl b/view/jot-header.tpl
index 77e5bc4bc..61c80702e 100644
--- a/view/jot-header.tpl
+++ b/view/jot-header.tpl
@@ -109,6 +109,22 @@ tinyMCE.init({
});
+ function deleteCheckedItems() {
+ var checkedstr = '';
+
+ $('.item-select').each( function() {
+ if($(this).is(':checked')) {
+ if(checkedstr.length != 0)
+ checkedstr = checkedstr + ',' + $(this).val();
+ else
+ checkedstr = $(this).val();
+ }
+ });
+ $.post('item', { dropitems: checkedstr }, function(data) {
+ window.location.reload();
+ });
+ }
+
function jotGetLink() {
reply = prompt("$linkurl");
if(reply && reply.length) {
diff --git a/view/photo_drop.tpl b/view/photo_drop.tpl
new file mode 100644
index 000000000..b4ea62b45
--- /dev/null
+++ b/view/photo_drop.tpl
@@ -0,0 +1,4 @@
+
+
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css
index 155641463..3bf78346f 100644
--- a/view/theme/duepuntozero/style.css
+++ b/view/theme/duepuntozero/style.css
@@ -2489,8 +2489,32 @@ a.mail-list-link {
margin-top: 10px;
}
+.item-select {
+ opacity: 0.3;
+ filter:alpha(opacity=30);
+ float: right;
+ margin-right: 10px;
+}
+.item-select:hover {
+ opacity: 1;
+ filter:alpha(opacity=100);
+}
+#item-delete-selected {
+ margin-top: 30px;
+}
+
+#item-delete-selected-end {
+ clear: both;
+}
+#item-delete-selected-icon, #item-delete-selected-desc {
+ float: left;
+ margin-right: 5px;
+}
+#item-delete-selected-desc:hover {
+ text-decoration: underline;
+}
#lang-select-icon {
cursor: pointer;
diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css
index d70968a84..c07ef045a 100644
--- a/view/theme/loozah/style.css
+++ b/view/theme/loozah/style.css
@@ -2518,6 +2518,33 @@ a.mail-list-link {
}
+.item-select {
+ opacity: 0.3;
+ filter:alpha(opacity=30);
+ float: right;
+ margin-right: 10px;
+
+}
+.item-select:hover {
+ opacity: 1;
+ filter:alpha(opacity=100);
+}
+
+#item-delete-selected {
+ margin-top: 30px;
+}
+
+#item-delete-selected-end {
+ clear: both;
+}
+#item-delete-selected-icon, #item-delete-selected-desc {
+ float: left;
+ margin-right: 5px;
+}
+#item-delete-selected-desc:hover {
+ text-decoration: underline;
+}
+
#lang-select-icon {
cursor: pointer;
position: absolute;
diff --git a/view/wall_item_drop.tpl b/view/wall_item_drop.tpl
index b4ea62b45..b10c21093 100644
--- a/view/wall_item_drop.tpl
+++ b/view/wall_item_drop.tpl
@@ -1,4 +1,6 @@
+