diff --git a/include/diaspora.php b/include/diaspora.php index 04588dffe..b70cffdc3 100755 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -785,12 +785,21 @@ function diaspora_is_redmatrix($url) { } function diaspora_plink($addr, $guid) { - $r = q("SELECT `url`, `nick` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr); + $r = q("SELECT `url`, `nick`, `network` FROM `fcontact` WHERE `addr`='%s' LIMIT 1", $addr); // Fallback if (!$r) return 'https://'.substr($addr,strpos($addr,'@')+1).'/posts/'.$guid; + // Friendica contacts are often detected as Diaspora contacts in the "fcontact" table + // So we try another way as well. + $s = q("SELECT `network` FROM `gcontact` WHERE `nurl`='%s' LIMIT 1", dbesc(normalise_link($r[0]["url"]))); + if ($s) + $r[0]["network"] = $s[0]["network"]; + + if ($r[0]["network"] == NETWORK_DFRN) + return(str_replace("/profile/".$r[0]["nick"]."/", "/display/".$guid, $r[0]["url"]."/")); + if (diaspora_is_redmatrix($r[0]["url"])) return $r[0]["url"]."/?f=&mid=".$guid; @@ -833,12 +842,19 @@ function diaspora_post($importer,$xml,$msg) { $body = diaspora2bb($xml->raw_message); - // Add OEmbed and other information to the body - if (!diaspora_is_redmatrix($contact['url'])) - $body = add_page_info_to_body($body, false, true); - $datarray = array(); + $datarray["object"] = json_encode($xml); + + if($xml->photo->remote_photo_path AND $xml->photo->remote_photo_name) + $datarray["object-type"] = ACTIVITY_OBJ_PHOTO; + else { + $datarray['object-type'] = ACTIVITY_OBJ_NOTE; + // Add OEmbed and other information to the body + if (!diaspora_is_redmatrix($contact['url'])) + $body = add_page_info_to_body($body, false, true); + } + $str_tags = ''; $cnt = preg_match_all('/@\[url=(.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER); @@ -872,7 +888,10 @@ function diaspora_post($importer,$xml,$msg) { $datarray['author-avatar'] = $contact['thumb']; $datarray['body'] = $body; $datarray['tag'] = $str_tags; - $datarray['app'] = 'Diaspora'; + if ($xml->provider_display_name) + $datarray["app"] = unxmlify($xml->provider_display_name); + else + $datarray['app'] = 'Diaspora'; // if empty content it might be a photo that hasn't arrived yet. If a photo arrives, we'll make it visible. @@ -921,6 +940,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) { $author = $item["author"]; $guid = $item["guid"]; $private = $item["private"]; + $object = $item["object"]; + $objecttype = $item["object-type"]; $message_id = $author.':'.$guid; $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1", @@ -954,6 +975,8 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) { $datarray['tag'] = $str_tags; $datarray['app'] = $app; $datarray['visible'] = ((strlen($body)) ? 1 : 0); + $datarray['object'] = $object; + $datarray['object-type'] = $objecttype; if ($datarray['contact-id'] == 0) return false; @@ -1001,11 +1024,14 @@ function diaspora_fetch_message($guid, $server, $level = 0) { $item["guid"] = unxmlify($source_xml->post->status_message->guid); $item["private"] = (unxmlify($source_xml->post->status_message->public) == 'false'); + $item["object"] = json_encode($source_xml->post); if(strlen($source_xml->post->asphoto->objectId) && ($source_xml->post->asphoto->objectId != 0) && ($source_xml->post->asphoto->image_url)) { + $item["object-type"] = ACTIVITY_OBJ_PHOTO; $body = '[url=' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '][img]' . notags(unxmlify($source_xml->post->asphoto->objectId)) . '[/img][/url]' . "\n"; $body = scale_external_images($body,false); } elseif($source_xml->post->asphoto->image_url) { + $item["object-type"] = ACTIVITY_OBJ_PHOTO; $body = '[img]' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '[/img]' . "\n"; $body = scale_external_images($body); } elseif($source_xml->post->status_message) { @@ -1015,18 +1041,25 @@ function diaspora_fetch_message($guid, $server, $level = 0) { if($source_xml->post->status_message->photo->remote_photo_path AND $source_xml->post->status_message->photo->remote_photo_name) { + $item["object-type"] = ACTIVITY_OBJ_PHOTO; + $remote_photo_path = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_path)); $remote_photo_name = notags(unxmlify($source_xml->post->status_message->photo->remote_photo_name)); $body = '[img]'.$remote_photo_path.$remote_photo_name.'[/img]'."\n".$body; logger('embedded picture link found: '.$body, LOGGER_DEBUG); - } + } else + $item["object-type"] = ACTIVITY_OBJ_NOTE; $body = scale_external_images($body); // Add OEmbed and other information to the body - $body = add_page_info_to_body($body, false, true); + // To-Do: It could be a repeated redmatrix item + // Then we shouldn't add further data to it + if ($item["object-type"] == ACTIVITY_OBJ_NOTE) + $body = add_page_info_to_body($body, false, true); + } elseif($source_xml->post->reshare) { // Reshare of a reshare return diaspora_fetch_message($source_xml->post->reshare->root_guid, $server, ++$level); @@ -1081,16 +1114,17 @@ function diaspora_reshare($importer,$xml,$msg) { $orig_author = notags(unxmlify($xml->root_diaspora_id)); $orig_guid = notags(unxmlify($xml->root_guid)); + $orig_url = $a->get_baseurl()."/display/".$orig_guid; $create_original_post = false; // Do we already have this item? - $r = q("SELECT `body`, `tag`, `app`, `created`, `author-link`, `plink` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1", + $r = q("SELECT `body`, `tag`, `app`, `created`, `plink`, `object`, `object-type`, `uri` FROM `item` WHERE `guid` = '%s' AND `visible` AND NOT `deleted` AND `body` != '' LIMIT 1", dbesc($orig_guid), dbesc(NETWORK_DIASPORA) ); if(count($r)) { - logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system: '.$orig_url); + logger('reshared message '.$orig_guid." reshared by ".$guid.' already exists on system.'); // Maybe it is already a reshared item? // Then refetch the content, since there can be many side effects with reshared posts from other networks or reshares from reshares @@ -1102,9 +1136,10 @@ function diaspora_reshare($importer,$xml,$msg) { $str_tags = $r[0]["tag"]; $app = $r[0]["app"]; $orig_created = $r[0]["created"]; - $orig_author = $r[0]["author-link"]; - $create_original_post = ($body != ""); - $orig_url = $a->get_baseurl()."/display/".$orig_guid; + $orig_plink = $r[0]["plink"]; + $orig_uri = $r[0]["uri"]; + $object = $r[0]["object"]; + $objecttype = $r[0]["object-type"]; } } @@ -1113,8 +1148,6 @@ function diaspora_reshare($importer,$xml,$msg) { $str_tags = ""; $app = ""; - $orig_url = 'https://'.substr($orig_author,strpos($orig_author,'@')+1).'/posts/'.$orig_guid; - $server = 'https://'.substr($orig_author,strpos($orig_author,'@')+1); logger('1st try: reshared message '.$orig_guid." reshared by ".$guid.' will be fetched from original server: '.$server); $item = diaspora_fetch_message($orig_guid, $server); @@ -1142,11 +1175,16 @@ function diaspora_reshare($importer,$xml,$msg) { $orig_created = $item["created"]; $orig_author = $item["author"]; $orig_guid = $item["guid"]; + $orig_plink = diaspora_plink($orig_author, $orig_guid); + $orig_uri = $orig_author.':'.$orig_guid; $create_original_post = ($body != ""); - $orig_url = $a->get_baseurl()."/display/".$orig_guid; + $object = $item["object"]; + $objecttype = $item["object-type"]; } } + $plink = diaspora_plink($diaspora_handle, $guid); + $person = find_diaspora_person_by_handle($orig_author); $created = unxmlify($xml->created_at); @@ -1154,8 +1192,6 @@ function diaspora_reshare($importer,$xml,$msg) { $datarray = array(); - $plink = diaspora_plink($diaspora_handle, $guid); - $datarray['uid'] = $importer['uid']; $datarray['contact-id'] = $contact['id']; $datarray['wall'] = 0; @@ -1184,6 +1220,9 @@ function diaspora_reshare($importer,$xml,$msg) { $datarray['body'] = $body; } + $datarray["object"] = json_encode($xml); + $datarray['object-type'] = $objecttype; + $datarray['tag'] = $str_tags; $datarray['app'] = $app; @@ -1199,9 +1238,10 @@ function diaspora_reshare($importer,$xml,$msg) { $datarray2['uid'] = 0; $datarray2['contact-id'] = get_contact($person['url'], 0); $datarray2['guid'] = $orig_guid; - $datarray2['uri'] = $datarray2['parent-uri'] = $orig_author.':'.$orig_guid; + $datarray2['uri'] = $datarray2['parent-uri'] = $orig_uri; $datarray2['changed'] = $datarray2['created'] = $datarray2['edited'] = $datarray2['commented'] = $datarray2['received'] = datetime_convert('UTC','UTC',$orig_created); - $datarray2['plink'] = diaspora_plink($orig_author, $orig_guid); + $datarray2['parent'] = 0; + $datarray2['plink'] = $orig_plink; $datarray2['author-name'] = $person['name']; $datarray2['author-link'] = $person['url']; @@ -1210,6 +1250,7 @@ function diaspora_reshare($importer,$xml,$msg) { $datarray2['owner-link'] = $datarray2['author-link']; $datarray2['owner-avatar'] = $datarray2['author-avatar']; $datarray2['body'] = $body; + $datarray2["object"] = $object; DiasporaFetchGuid($datarray2); $message_id = item_store($datarray2); @@ -1295,6 +1336,8 @@ function diaspora_asphoto($importer,$xml,$msg) { $datarray['author-link'] = $contact['url']; $datarray['author-avatar'] = $contact['thumb']; $datarray['body'] = $body; + $datarray["object"] = json_encode($xml); + $datarray['object-type'] = ACTIVITY_OBJ_PHOTO; $datarray['app'] = 'Diaspora/Cubbi.es'; @@ -1464,6 +1507,8 @@ function diaspora_comment($importer,$xml,$msg) { $datarray['author-link'] = $person['url']; $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']); $datarray['body'] = $body; + $datarray["object"] = json_encode($xml); + $datarray["object-type"] = ACTIVITY_OBJ_COMMENT; // We can't be certain what the original app is if the message is relayed. if(($parent_item['origin']) && (! $parent_author_signature)) @@ -1790,7 +1835,7 @@ function diaspora_message($importer,$xml,$msg) { dbesc($person['name']), dbesc($person['photo']), dbesc($person['url']), - intval($contact['id']), + intval($contact['id']), dbesc($conversation['subject']), dbesc($body), 0, @@ -2059,7 +2104,7 @@ function diaspora_like($importer,$xml,$msg) { $activity = ACTIVITY_LIKE; $post_type = (($parent_item['resource-id']) ? t('photo') : t('status')); - $objtype = (($parent_item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE ); + $objtype = (($parent_item['resource-id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE ); $link = xmlify('' . "\n") ; $body = $parent_item['body']; @@ -2878,7 +2923,7 @@ function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) { $target_type = (($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment'); } else { - + $tpl = get_markup_template('diaspora_signed_retract.tpl'); $target_type = 'StatusMessage'; } @@ -2924,7 +2969,7 @@ function diaspora_send_mail($item,$owner,$contact) { $body = bb2diaspora($item['body']); $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C'); - + $signed_text = $item['guid'] . ';' . $cnv['guid'] . ';' . $body . ';' . $created . ';' . $myaddr . ';' . $cnv['guid']; diff --git a/include/items.php b/include/items.php index 85d02ab60..b463e6ed1 100644 --- a/include/items.php +++ b/include/items.php @@ -464,12 +464,27 @@ function get_atom_elements($feed, $item, $contact = array()) { // look for a photo. We should check media size and find the best one, // but for now let's just find any author photo + // Additionally we look for an alternate author link. On OStatus this one is the one we want. + + // Search for ostatus conversation url + $authorlinks = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["author"][0]["child"]["http://www.w3.org/2005/Atom"]["link"]; + if (is_array($authorlinks)) { + foreach ($authorlinks as $link) { + $linkdata = array_shift($link["attribs"]); + + if ($linkdata["rel"] == "alternate") + $res["author-link"] = $linkdata["href"]; + }; + } $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author'); if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) { $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']; foreach($base as $link) { + if($link['attribs']['']['rel'] === 'alternate') + $res['author-link'] = unxmlify($link['attribs']['']['href']); + if(!x($res, 'author-avatar') || !$res['author-avatar']) { if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar') $res['author-avatar'] = unxmlify($link['attribs']['']['href']); @@ -828,7 +843,7 @@ function get_atom_elements($feed, $item, $contact = array()) { logger('get_atom_elements: Looking for status.net repeated message'); $message = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["content"][0]["data"]; - $orig_uri = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["id"][0]["data"]; + $orig_id = ostatus_convert_href($child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["id"][0]["data"]); $author = $child[SIMPLEPIE_NAMESPACE_ATOM_10]["author"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]; $uri = $author["uri"][0]["data"]; $name = $author["name"][0]["data"]; @@ -836,10 +851,10 @@ function get_atom_elements($feed, $item, $contact = array()) { $avatar = $avatar["href"]; if (($name != "") and ($uri != "") and ($avatar != "") and ($message != "")) { - logger('get_atom_elements: fixing sender of repeated message.'); + logger('get_atom_elements: fixing sender of repeated message. '.$orig_id, LOGGER_DEBUG); if (!intval(get_config('system','wall-to-wall_share'))) { - $prefix = share_header($name, $uri, $avatar, "", "", $orig_uri); + $prefix = share_header($name, $uri, $avatar, "", "", $orig_link); $res["body"] = $prefix.html2bbcode($message)."[/share]"; } else { @@ -864,8 +879,11 @@ function get_atom_elements($feed, $item, $contact = array()) { $conversation = array_shift($link["attribs"]); if ($conversation["rel"] == "ostatus:conversation") { - $res["ostatus_conversation"] = $conversation["href"]; + $res["ostatus_conversation"] = ostatus_convert_href($conversation["href"]); logger('get_atom_elements: found conversation url '.$res["ostatus_conversation"]); + } elseif ($conversation["rel"] == "alternate") { + $res["plink"] = $conversation["href"]; + logger('get_atom_elements: found plink '.$res["plink"]); } }; } @@ -1090,6 +1108,14 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa unset($arr['dsprsig']); } + // Converting the plink + if ($arr['network'] == NETWORK_OSTATUS) { + if (isset($arr['plink'])) + $arr['plink'] = ostatus_convert_href($arr['plink']); + elseif (isset($arr['uri'])) + $arr['plink'] = ostatus_convert_href($arr['uri']); + } + // if an OStatus conversation url was passed in, it is stored and then // removed from the array. $ostatus_conversation = null; @@ -1115,7 +1141,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa /* check for create date and expire time */ $uid = intval($arr['uid']); - $r = q("SELECT expire FROM user WHERE uid = %d", $uid); + $r = q("SELECT expire FROM user WHERE uid = %d", intval($uid)); if(count($r)) { $expire_interval = $r[0]['expire']; if ($expire_interval>0) { @@ -1141,6 +1167,19 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa } } + // If there is no guid then take the same guid that was taken before for the same plink + if ((trim($arr['guid']) == "") AND (trim($arr['plink']) != "")) { + logger('item_store: checking for an existing guid for plink '.$arr['plink'], LOGGER_DEBUG); + $r = q("SELECT `guid` FROM `item` WHERE `plink` = '%s' AND `guid` != '' LIMIT 1", + dbesc(trim($arr['plink'])) + ); + + if(count($r)) { + $arr['guid'] = $r[0]["guid"]; + logger('item_store: found guid '.$arr['guid'].' for plink '.$arr['plink'], LOGGER_DEBUG); + } + } + // Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin. // Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<" //if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false)) @@ -1347,12 +1386,36 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa } } - $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", + $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1", dbesc($arr['uri']), + dbesc($arr['network']), intval($arr['uid']) ); if($r && count($r)) { - logger('item-store: duplicate item ignored. ' . print_r($arr,true)); + logger('duplicated item with the same uri found. ' . print_r($arr,true)); + return 0; + } + + $r = q("SELECT `id` FROM `item` WHERE `plink` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1", + dbesc($arr['plink']), + dbesc($arr['network']), + intval($arr['uid']) + ); + if($r && count($r)) { + logger('duplicated item with the same plink found. ' . print_r($arr,true)); + return 0; + } + + // Check for an existing post with the same content. There seems to be a problem with OStatus. + $r = q("SELECT `id` FROM `item` WHERE `body` = '%s' AND `network` = '%s' AND `created` = '%s' AND `contact-id` = %d AND `uid` = %d LIMIT 1", + dbesc($arr['body']), + dbesc($arr['network']), + dbesc($arr['created']), + intval($arr['contact-id']), + intval($arr['uid']) + ); + if($r && count($r)) { + logger('duplicated item with the same body found. ' . print_r($arr,true)); return 0; } @@ -2167,6 +2230,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) return; } + // Test - remove before flight +// if ($contact['network'] === NETWORK_OSTATUS) { +// $tempfile = tempnam(get_temppath(), "ostatus"); +// file_put_contents($tempfile, $xml); +// } + $feed = new SimplePie(); $feed->set_raw_data($xml); if($datedir) @@ -4745,6 +4814,18 @@ function drop_item($id,$interactive = true) { // ignore the result } + // If item has attachments, drop them + + foreach(explode(",",$item['attach']) as $attach){ + preg_match("|attach/(\d+)|", $attach, $matches); + q("DELETE FROM `attach` WHERE `id` = %d AND `uid` = %d", + intval($matches[1]), + local_user() + ); + // ignore the result + } + + // clean up item_id and sign meta-data tables /* @@ -4821,6 +4902,7 @@ function drop_item($id,$interactive = true) { // Add a relayable_retraction signature for Diaspora. store_diaspora_retract_sig($item, $a->user, $a->get_baseurl()); } + $drop_id = intval($item['id']); // send the notification upstream/downstream as the case may be diff --git a/include/ostatus_conversation.php b/include/ostatus_conversation.php index 667f7dde4..f40c4827b 100644 --- a/include/ostatus_conversation.php +++ b/include/ostatus_conversation.php @@ -1,8 +1,33 @@ time()) { + if ($next > time()) { logger('poll interval not reached'); return; } @@ -36,7 +61,7 @@ function check_conversations() { complete_conversation($id, $url); } - logger(' cron_end'); + logger('cron_end'); set_config('system','ostatus_last_poll', time()); } @@ -44,6 +69,8 @@ function check_conversations() { function complete_conversation($itemid, $conversation_url, $only_add_conversation = false) { global $a; + $conversation_url = ostatus_convert_href($conversation_url); + if (intval(get_config('system','ostatus_poll_interval')) == -2) return; @@ -107,12 +134,16 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio $items = array_reverse($items); foreach ($items as $single_conv) { - // status.net changed the format of the activity streams. This is a quick fix. - if (@is_string($single_conv->object->id)) + if (isset($single_conv->object->id)) $single_conv->id = $single_conv->object->id; - if (@!$single_conv->id AND $single_conv->provider->url AND $single_conv->statusnet_notice_info->local_id) - $single_conv->id = $single_conv->provider->url."notice/".$single_conv->statusnet_notice_info->local_id; + logger("Got id ".$single_conv->id, LOGGER_DEBUG); + + $plink = ostatus_convert_href($single_conv->id); + if (isset($single_conv->object->url)) + $plink = ostatus_convert_href($single_conv->object->url); + + logger("Got url ".$plink, LOGGER_DEBUG); if (@!$single_conv->id) continue; @@ -120,8 +151,9 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio if ($first_id == "") { $first_id = $single_conv->id; - $new_parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1", - intval($message["uid"]), dbesc($first_id)); + $new_parents = q("SELECT `id`, `uri`, `contact-id`, `type`, `verb`, `visible` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1", + intval($message["uid"]), dbesc($first_id), + dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); if ($new_parents) { $parent = $new_parents[0]; logger('adopting new parent '.$parent["id"].' for '.$itemid); @@ -136,12 +168,21 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio else $parent_uri = $parent["uri"]; - $message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1", - intval($message["uid"]), dbesc($single_conv->id)); + $message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `plink` = '%s' AND `network` IN ('%s','%s') LIMIT 1", + intval($message["uid"]), dbesc($plink), + dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); + + if (!$message_exists) + $message_exists = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s','%s') LIMIT 1", + intval($message["uid"]), dbesc($single_conv->id), + dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN)); + if ($message_exists) { if ($parent["id"] != 0) { $existing_message = $message_exists[0]; + logger('updating id '.$existing_message["id"].' to parent '.$parent["id"].' uri '.$parent["uri"].' thread '.$parent_uri, LOGGER_DEBUG); + // This is partly bad, since the entry in the thread table isn't updated $r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `thr-parent` = '%s' WHERE `id` = %d", intval($parent["id"]), @@ -152,21 +193,32 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio continue; } + $actor = $single_conv->actor->id; + if (isset($single_conv->actor->url)) + $actor = $single_conv->actor->url; + $contact = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` != '%s'", - $message["uid"], normalise_link($single_conv->actor->id), NETWORK_STATUSNET); + $message["uid"], normalise_link($actor), NETWORK_STATUSNET); if (count($contact)) { - logger("Found contact for url ".$single_conv->actor->id, LOGGER_DEBUG); + logger("Found contact for url ".$actor, LOGGER_DEBUG); $contact_id = $contact[0]["id"]; } else { - logger("No contact found for url ".$single_conv->actor->id, LOGGER_DEBUG); + logger("No contact found for url ".$actor, LOGGER_DEBUG); + + // Adding a global contact + // To-Do: Use this data for the post + $global_contact_id = get_contact($actor, 0); + + logger("Global contact ".$global_contact_id." found for url ".$actor, LOGGER_DEBUG); + $contact_id = $parent["contact-id"]; } $arr = array(); $arr["network"] = NETWORK_OSTATUS; $arr["uri"] = $single_conv->id; - $arr["plink"] = $single_conv->id; + $arr["plink"] = $plink; $arr["uid"] = $message["uid"]; $arr["contact-id"] = $contact_id; if ($parent["id"] != 0) @@ -182,17 +234,26 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio if ($arr["owner-name"] == '') $arr["owner-name"] = $single_conv->actor->displayName; - $arr["owner-link"] = $single_conv->actor->id; + $arr["owner-link"] = $actor; $arr["owner-avatar"] = $single_conv->actor->image->url; //$arr["author-name"] = $single_conv->actor->contact->displayName; //$arr["author-name"] = $single_conv->actor->contact->preferredUsername; $arr["author-name"] = $arr["owner-name"]; - $arr["author-link"] = $single_conv->actor->id; + $arr["author-link"] = $actor; $arr["author-avatar"] = $single_conv->actor->image->url; $arr["body"] = html2bbcode($single_conv->content); - $arr["app"] = strip_tags($single_conv->statusnet_notice_info->source); - if ($arr["app"] == "") + + if (isset($single_conv->status_net->notice_info->source)) + $arr["app"] = strip_tags($single_conv->status_net->notice_info->source); + elseif (isset($single_conv->statusnet->notice_info->source)) + $arr["app"] = strip_tags($single_conv->statusnet->notice_info->source); + elseif (isset($single_conv->statusnet_notice_info->source)) + $arr["app"] = strip_tags($single_conv->statusnet_notice_info->source); + elseif (isset($single_conv->provider->displayName)) $arr["app"] = $single_conv->provider->displayName; + else + $arr["app"] = "OStatus"; + $arr["verb"] = $parent["verb"]; $arr["visible"] = $parent["visible"]; $arr["location"] = $single_conv->location->displayName; @@ -206,6 +267,8 @@ function complete_conversation($itemid, $conversation_url, $only_add_conversatio $newitem = item_store($arr); + logger('Stored new item '.$plink.' under id '.$newitem, LOGGER_DEBUG); + // Add the conversation entry (but don't fetch the whole conversation) complete_conversation($newitem, $conversation_url, true); diff --git a/mod/allfriends.php b/mod/allfriends.php index f675b8e29..c32a05a2c 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -20,13 +20,15 @@ function allfriends_content(&$a) { intval(local_user()) ); - $a->page['aside'] .= '
' - . '
' . $c[0]['name'] . '
' - . '
' - . '' . $c[0]['name'] . '
' - . '
'; - + $vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array( + '$name' => $c[0]['name'], + '$photo' => $c[0]['photo'], + 'url' => z_root() . '/contacts/' . $cid + )); + + if(! x($a->page,'aside')) + $a->page['aside'] = ''; + $a->page['aside'] .= $vcard_widget; if(! count($c)) return; diff --git a/mod/common.php b/mod/common.php index 617b5b670..a4320f9eb 100644 --- a/mod/common.php +++ b/mod/common.php @@ -28,13 +28,15 @@ function common_content(&$a) { ); } - $a->page['aside'] .= '
' - . '
' . $c[0]['name'] . '
' - . '
' - . '' . $c[0]['name'] . '
' - . '
'; - + $vcard_widget .= replace_macros(get_markup_template("vcard-widget.tpl"),array( + '$name' => $c[0]['name'], + '$photo' => $c[0]['photo'], + 'url' => z_root() . '/contacts/' . $cid + )); + + if(! x($a->page,'aside')) + $a->page['aside'] = ''; + $a->page['aside'] .= $vcard_widget; if(! count($c)) return; diff --git a/mod/crepair.php b/mod/crepair.php index 55231faf7..457a06685 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -22,11 +22,12 @@ function crepair_init(&$a) { if($contact_id) { $a->data['contact'] = $r[0]; - $o .= '
'; - $o .= '
' . $a->data['contact']['name'] . '
'; - $o .= '
' . $a->data['contact']['name'] . '
'; - $o .= '
'; - $a->page['aside'] .= $o; + $tpl = get_markup_template("vcard-widget.tpl"); + $vcard_widget .= replace_macros($tpl, array( + '$name' => $a->data['contact']['name'], + '$photo' => $a->data['contact']['photo'] + )); + $a->page['aside'] .= $vcard_widget; } } diff --git a/mod/events.php b/mod/events.php index ec6d73863..e9e1af05d 100644 --- a/mod/events.php +++ b/mod/events.php @@ -59,21 +59,30 @@ function events_post(&$a) { // and we'll waste a bunch of time responding to it. Time that // could've been spent doing something else. - if(strcmp($finish,$start) < 0) - $finish = $start; - $summary = escape_tags(trim($_POST['summary'])); $desc = escape_tags(trim($_POST['desc'])); $location = escape_tags(trim($_POST['location'])); $type = 'event'; + $action = ($event_id == '') ? 'new' : "event/" . $event_id; + $onerror_url = $a->get_baseurl() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish"; + + if(strcmp($finish,$start) < 0 && !$nofinish) { + notice( t('Event can not end before it has started.') . EOL); + if(intval($_REQUEST['preview'])) { + echo( t('Event can not end before it has started.')); + killme(); + } + goaway($onerror_url); + } + if((! $summary) || (! $start)) { notice( t('Event title and start time are required.') . EOL); if(intval($_REQUEST['preview'])) { echo( t('Event title and start time are required.')); killme(); } - goaway($a->get_baseurl() . '/events/new'); + goaway($onerror_url); } $share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0); diff --git a/mod/photos.php b/mod/photos.php index f8bba01b0..ebb88c739 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -30,10 +30,14 @@ function photos_init(&$a) { $a->data['user'] = $r[0]; - $o .= '
'; - $o .= '
' . $a->data['user']['username'] . '
'; - $o .= '
' . $a->data['user']['username'] . '
'; - $o .= '
'; + $profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg'); + + $tpl = get_markup_template("vcard-widget.tpl"); + + $vcard_widget .= replace_macros($tpl, array( + '$name' => $a->data['user']['username'], + '$photo' => $profilephoto + )); $sql_extra = permissions_sql($a->data['user']['uid']); @@ -72,6 +76,7 @@ function photos_init(&$a) { if(! x($a->page,'aside')) $a->page['aside'] = ''; + $a->page['aside'] .= $vcard_widget; $a->page['aside'] .= $o; diff --git a/mod/search.php b/mod/search.php index 67702ac09..5fc961785 100644 --- a/mod/search.php +++ b/mod/search.php @@ -177,9 +177,9 @@ function search_content(&$a) { if($tag) - $o .= '

Items tagged with: ' . $search . '

'; + $o .= '

' . sprintf( t('Items tagged with: %s'), $search) . '

'; else - $o .= '

Search results for: ' . $search . '

'; + $o .= '

' . sprintf( t('Search results for: %s'), $search) . '

'; logger("Start Conversation for '".$search."'", LOGGER_DEBUG); $o .= conversation($a,$r,'search',false); diff --git a/mod/videos.php b/mod/videos.php index 0f29e631b..943a9d09f 100644 --- a/mod/videos.php +++ b/mod/videos.php @@ -28,10 +28,14 @@ function videos_init(&$a) { $a->data['user'] = $r[0]; - $o .= '
'; - $o .= '
' . $a->data['user']['username'] . '
'; - $o .= '
' . $a->data['user']['username'] . '
'; - $o .= '
'; + $profilephoto = $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/' . $a->data['user']['uid'] . '.jpg'); + + $tpl = get_markup_template("vcard-widget.tpl"); + + $vcard_widget = replace_macros($tpl, array( + '$name' => $a->data['user']['username'], + '$photo' => $profilephoto + )); /*$sql_extra = permissions_sql($a->data['user']['uid']); @@ -43,12 +47,12 @@ function videos_init(&$a) { if(count($albums)) { $a->data['albums'] = $albums; - $albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true); + $albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true); if($albums_visible) { $o .= '
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 024e63f5f..34d7f1c25 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -22,7 +22,7 @@ a:hover {text-decoration: underline; } input { border: 1px solid #666666; -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; padding: 3px; } @@ -50,7 +50,7 @@ code { background: #EEE; color: #444; padding: 10px; - margin-top: 20px; + margin-top: 20px; } blockquote { @@ -91,7 +91,7 @@ nav { display: block; margin: 0px 10%; border-bottom: 1px solid #babdb6; - position: relative; + position: relative; } nav #site-location { color: #888a85; @@ -151,9 +151,9 @@ nav #banner #logo-text a:hover { text-decoration: none; } border: 1px solid #babdb6; border-bottom: 0px; background-color: #aec0d3; - color: #565854; + color: #565854; -moz-border-radius: 3px 3px 0px 0px; - border-radius: 3px 3px 0px 0px; + border-radius: 3px 3px 0px 0px; } nav .nav-link { float: right; @@ -173,7 +173,7 @@ nav .nav-link { .nav-ajax-left { font-size: 0.8em; float: left; - margin-top: 62px; + margin-top: 62px; } @@ -228,12 +228,12 @@ section { background-position: top right; background-repeat: no-repeat; min-height: 112px; - + } .tabs { height: 27px; background-image: url(head.jpg); - background-repeat: repeat-x; + background-repeat: repeat-x; background-position: 0px -20px; border-bottom: 1px solid #babdb6; padding:0px; @@ -248,7 +248,7 @@ section { } .tab.active { font-weight: bold; - + } @@ -278,14 +278,14 @@ div.wall-item-content-wrapper.shiny { } /* from default */ -#jot-perms-icon, +#jot-perms-icon, #profile-location, #profile-nolocation, -#profile-youtube, -#profile-video, +#profile-youtube, +#profile-video, #profile-audio, #profile-link, -#profile-title, +#profile-title, #wall-image-upload, #wall-file-upload, #profile-upload-wrapper, @@ -313,13 +313,13 @@ div.wall-item-content-wrapper.shiny { #jot-category::-webkit-input-placeholder{font-weight: normal;} #jot-title:-moz-placeholder{font-weight: normal;} #jot-category:-moz-placeholder{font-weight: normal;} - - + + #jot-title:hover, #jot-title:focus, #jot-category:hover, #jot-category:focus { - border: 1px solid #cccccc; + border: 1px solid #cccccc; } .jothidden { display:none; } @@ -343,7 +343,7 @@ div.wall-item-content-wrapper.shiny { .group-selected, .nets-selected, .fileas-selected, .categories-selected { padding: 3px; -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; border: 1px solid #CCCCCC; background: #F8F8F8; font-weight: bold; @@ -352,7 +352,7 @@ div.wall-item-content-wrapper.shiny { .settings-widget .selected { padding: 3px; -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; border: 1px solid #CCCCCC; background: #F8F8F8; font-weight: bold; @@ -813,7 +813,7 @@ input#dfrn-url { clear: left; color: #666666; display: block; - margin-bottom: 20px + margin-bottom: 20px } #profile-edit-profile-name-end, @@ -944,7 +944,7 @@ input#dfrn-url { border: 1px solid #CCC; position: relative; -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; } .tread-wrapper .tread-wrapper { @@ -987,7 +987,7 @@ input#dfrn-url { display: block; position: absolute; background-image: url("photo-menu.jpg"); - background-position: top left; + background-position: top left; background-repeat: no-repeat; margin: 0px; padding: 0px; width: 16px; @@ -996,7 +996,7 @@ input#dfrn-url { overflow: hidden; text-indent: 40px; display: none; - + } .wall-item-photo-menu { width: auto; @@ -1047,7 +1047,7 @@ input#dfrn-url { /*margin-top: 10px;*/ left: 105px; position: absolute; - top: 1px; + top: 1px; } .comment .wall-item-lock { left: 65px; @@ -1100,11 +1100,11 @@ input#dfrn-url { } .star-item { margin-left: 10px; - float: left; + float: left; } .tag-item { margin-left: 10px; - float: left; + float: left; } .filer-item { @@ -1141,7 +1141,7 @@ input#dfrn-url { border: none; } .comment .wall-item-photo { - width: 50px !important; + width: 50px !important; height: 50px !important; } .wall-item-content { @@ -1240,7 +1240,7 @@ blockquote.shared_content { .comment .wall-item-tools { background:none; -} +} .comment-edit-wrapper { margin-top: 15px; @@ -1270,7 +1270,7 @@ blockquote.shared_content { float: left; margin-top: 10px; -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; border: 1px solid #cccccc; padding: 3px 1px 1px 3px; } @@ -1676,7 +1676,7 @@ blockquote.shared_content { .contact-photo-menu-button { position: absolute; background-image: url("photo-menu.jpg"); - background-position: top left; + background-position: top left; background-repeat: no-repeat; margin: 0px; padding: 0px; width: 16px; @@ -1685,7 +1685,7 @@ blockquote.shared_content { overflow: hidden; text-indent: 40px; display: none; - + } .contact-photo-menu { width: auto; @@ -1723,7 +1723,7 @@ blockquote.shared_content { border: 1px solid #cccccc; padding: 3px 0px 0px 5px; -moz-border-radius: 3px; - border-radius: 3px; + border-radius: 3px; } @@ -1777,7 +1777,7 @@ blockquote.shared_content { overflow: auto; } #acl-list-content { - + } .acl-list-item { display: block; @@ -1794,7 +1794,7 @@ blockquote.shared_content { margin: 4px; } .acl-list-item p { height: 12px; font-size: 10px; margin: 0px; padding: 2px 0px 1px; overflow: hidden;} -.acl-list-item a { +.acl-list-item a { font-size: 8px; display: block; width: 40px; @@ -2111,15 +2111,15 @@ aside input[type='text'] { margin-top: 15px; margin-right: 15px; margin-left: 15px; -/* width: 200px; height: 200px; - overflow: hidden; +/* width: 200px; height: 200px; + overflow: hidden; position: relative; */ } .photo-album-image-wrapper .caption { - display: none; + display: none; width: 100%; /* position: absolute; */ - bottom: 0px; + bottom: 0px; padding: 0.5em 0.5em 0px 0.5em; background-color: rgba(245, 245, 255, 0.8); border-bottom: 2px solid #CCC; @@ -2141,14 +2141,14 @@ aside input[type='text'] { margin-right: 15px; margin-left: 15px; margin-bottom: 15px; -/* width: 200px; height: 200px; +/* width: 200px; height: 200px; overflow: hidden; */ } .photo-top-album-name { width: 100%; min-height: 2em; /* position: absolute; */ - bottom: 0px; + bottom: 0px; padding: 0px 3px; padding-top: 0.5em; background-color: rgb(255, 255, 255); @@ -2236,7 +2236,7 @@ aside input[type='text'] { } #profile-jot-banner-end { - /* clear: both; */ + /* clear: both; */ } #photos-upload-select-files-text { @@ -2464,7 +2464,7 @@ aside input[type='text'] { } /* end from default */ - + .fn { padding: 0px 0px 5px 12px; @@ -2483,7 +2483,7 @@ aside input[type='text'] { #birthday-title { float: left; - font-weight: bold; + font-weight: bold; } #birthday-adjust { @@ -2607,7 +2607,7 @@ aside input[type='text'] { clear: both; } - + .calendar { font-family: Courier, monospace; } @@ -2791,7 +2791,7 @@ aside input[type='text'] { #netsearch-box { - margin-top: 20px; + margin-top: 20px; } #netsearch-box #search-submit { @@ -2898,7 +2898,7 @@ aside input[type='text'] { .settings-heading { border-bottom: 1px solid #babdb6; } - + /** * Form fields @@ -2924,7 +2924,7 @@ aside input[type='text'] { display: block; margin-left: 200px; color: #666666; - + } @@ -2972,7 +2972,7 @@ aside input[type='text'] { font-weight: bold; background-color: #FF0000; padding: 0em 0.3em; - + } #adminpage dl { clear: left; @@ -3027,7 +3027,7 @@ aside input[type='text'] { /* * UPDATE */ -.popup { +.popup { width: 100%; height: 100%; top:0px; left:0px; position: absolute; @@ -3048,7 +3048,7 @@ aside input[type='text'] { border: 4px solid #000000; background-color: #FFFFFF; } -.popup .panel .panel_text { display: block; overflow: auto; height: 80%; } +.popup .panel .panel_text { display: block; overflow: auto; height: 80%; } .popup .panel .panel_in { width: 100%; height: 100%; position: relative; } .popup .panel .panel_actions { width: 100%; bottom: 4px; left: 0px; position: absolute; } .panel_text .progress { width: 50%; overflow: hidden; height: auto; border: 1px solid #cccccc; margin-bottom: 5px} @@ -3061,7 +3061,7 @@ aside input[type='text'] { height: auto; overflow: auto; border-bottom: 2px solid #cccccc; padding-bottom: 1em; - margin-bottom: 1em; + margin-bottom: 1em; } .oauthapp img { float: left; @@ -3365,7 +3365,7 @@ ul.menu-popup { } #recip { - + } .autocomplete-w1 { background: #ffffff; no-repeat bottom right; position:absolute; top:0px; left:0px; margin:6px 0 0 6px; /* IE6 fix: */ _background:none; _margin:1px 0 0 0; } .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; } @@ -3400,10 +3400,10 @@ ul.menu-popup { } @media all and (max-width: 760px) { body { background-image: none; } - nav, aside, section, footer { - margin: 0px; - float: none; - position: relative; + nav, aside, section, footer { + margin: 0px; + float: none; + position: relative; width: 100%; padding: 0.5em; height: auto; @@ -3416,11 +3416,11 @@ ul.menu-popup { aside { overflow: hidden; min-height: 0; height: 1em;} aside:hover, aside:focus { height: auto; } - nav .nav-link { + nav .nav-link { float: left; width: 23%; min-width: 100px; - height: 15px; + height: 15px; display: block; margin: 0.4em 2px 0 0; @@ -3431,11 +3431,11 @@ ul.menu-popup { background-color: rgb(174, 192,211)!important; } .nav-commlink.selected, - .nav-commlink { + .nav-commlink { border-bottom: 0px; padding: 6px 3px; min-width: 100px; - float: left; + float: left; margin-top: 0.4em; width: 23%; bottom: auto; @@ -3446,3 +3446,25 @@ ul.menu-popup { ul.menu-popup { left: 0px; top 20px; } } + +/* videos page */ +.videos .video-top-wrapper { + width: 300px; + float: left; + margin: 0px 10px 10px 0px; + position: relative; +} +.videos .video-top-wrapper .video-js { + width: 300px!important; + height: 232px!important; +} +.videos .video-top-wrapper .video-delete { + position: absolute; + opacity: 0; + right: 0px; + top: 0px; + transition: opacity 0.5s; +} +.videos .video-top-wrapper:hover .video-delete { + opacity: 1; +} diff --git a/view/theme/quattro/dark/style.css b/view/theme/quattro/dark/style.css index 1ec672d22..c8bd7d406 100644 --- a/view/theme/quattro/dark/style.css +++ b/view/theme/quattro/dark/style.css @@ -1965,6 +1965,27 @@ ul.tabs li .active { width: 50px; float: left; } +/* videos page */ +.videos .video-top-wrapper { + width: 200px; + float: left; + margin: 0px 10px 10px 0px; + position: relative; +} +.videos .video-top-wrapper .video-js { + width: 200px!important; + height: 132px!important; +} +.videos .video-top-wrapper .video-delete { + position: absolute; + opacity: 0; + right: 0px; + top: 0px; + transition: opacity 0.5s; +} +.videos .video-top-wrapper:hover .video-delete { + opacity: 1; +} /* photo albums */ #photo-edit-link-wrap { margin-bottom: 10px; diff --git a/view/theme/quattro/green/style.css b/view/theme/quattro/green/style.css index 89dc3dad8..9c18771ff 100644 --- a/view/theme/quattro/green/style.css +++ b/view/theme/quattro/green/style.css @@ -1965,6 +1965,27 @@ ul.tabs li .active { width: 50px; float: left; } +/* videos page */ +.videos .video-top-wrapper { + width: 200px; + float: left; + margin: 0px 10px 10px 0px; + position: relative; +} +.videos .video-top-wrapper .video-js { + width: 200px!important; + height: 132px!important; +} +.videos .video-top-wrapper .video-delete { + position: absolute; + opacity: 0; + right: 0px; + top: 0px; + transition: opacity 0.5s; +} +.videos .video-top-wrapper:hover .video-delete { + opacity: 1; +} /* photo albums */ #photo-edit-link-wrap { margin-bottom: 10px; diff --git a/view/theme/quattro/lilac/style.css b/view/theme/quattro/lilac/style.css index 11adc44b9..97cf540fc 100644 --- a/view/theme/quattro/lilac/style.css +++ b/view/theme/quattro/lilac/style.css @@ -1965,6 +1965,27 @@ ul.tabs li .active { width: 50px; float: left; } +/* videos page */ +.videos .video-top-wrapper { + width: 200px; + float: left; + margin: 0px 10px 10px 0px; + position: relative; +} +.videos .video-top-wrapper .video-js { + width: 200px!important; + height: 132px!important; +} +.videos .video-top-wrapper .video-delete { + position: absolute; + opacity: 0; + right: 0px; + top: 0px; + transition: opacity 0.5s; +} +.videos .video-top-wrapper:hover .video-delete { + opacity: 1; +} /* photo albums */ #photo-edit-link-wrap { margin-bottom: 10px; diff --git a/view/theme/quattro/quattro.less b/view/theme/quattro/quattro.less index dded1514a..fbfb4bcb3 100644 --- a/view/theme/quattro/quattro.less +++ b/view/theme/quattro/quattro.less @@ -36,7 +36,7 @@ h4 { font-size: 1.1em } -o-transition: all @d ease-in-out; -ms-transition: all @d ease-in-out; transition: all @d ease-in-out; -} +} a, a:link { color: @Link; text-decoration: none; } @@ -56,7 +56,7 @@ blockquote { padding: 1em; margin-left: 1em; border-left: 1em solid @BlockquoteBorderColor; - + } code { @@ -68,7 +68,7 @@ code { background: #EEE; color: #444; padding: 10px; - margin-top: 20px; + margin-top: 20px; } #panel { @@ -81,12 +81,14 @@ code { list-style: none; border: 3px solid @MenuBorder; z-index: 100000; - - .shadow(); + + .shadow(); } + /* tool */ + .tool { height: auto; overflow: auto; .label { float: left;} @@ -95,6 +97,8 @@ code { } + + /* popup notifications */ #jGrowl.top-right { top: 30px; @@ -130,7 +134,7 @@ header { #site-location { display: none; } - + #banner { overflow: hidden; text-align: center; @@ -140,9 +144,8 @@ header { #logo-text { font-size: 22px } } } - /* nav */ -nav { +nav { width: 100%; height: 32px; position: fixed; left: 0px; top: 0px; padding: 0px; @@ -156,13 +159,13 @@ nav { ul { margin: 0px; padding: 0px 20px; - li { - list-style: none; + li { + list-style: none; margin: 0px; padding: 0px; float: left; .menu-popup{ left: 0px; right: auto; } } - + } .nav-menu-icon { @@ -171,11 +174,11 @@ nav { padding: 5px; margin: 0px 10px; .roundtop(); - + &.selected { background-color: @NavbarSelectedBg; } - + img { width: 22px; height: 22px; } .nav-notify { top: 3px; } } @@ -190,7 +193,7 @@ nav { &.selected { border-bottom: 3px solid @NavbarSelectedBorder; } - + } .nav-notify { @@ -204,26 +207,26 @@ nav { right: -10px; min-width: 15px; text-align: right; - + &.show{ display: block; } } - - + + #nav-help-link, #nav-search-link, #nav-directory-link, #nav-apps-link, - #nav-site-linkmenu { + #nav-site-linkmenu { float: right; .menu-popup{ right: 0px; left: auto; } } - + #nav-notifications-linkmenu.on .icon.s22.notify, #nav-notifications-linkmenu.selected .icon.s22.notify { background-image: url("../../../images/icons/22/notify_on.png") } #nav-introductions-link.on .icon.s22.intro, #nav-introductions-link.selected .icon.s22.intro { background-image: url("icons/contacts_on.png") } #nav-messages-link.on .icon.s22.mail, - #nav-messages-link.selected .icon.s22.mail { background-image: url("icons/messages_on.png") } + #nav-messages-link.selected .icon.s22.mail { background-image: url("icons/messages_on.png") } #nav-apps-link.selected { background-color: @NavbarSelectedBg; } } @@ -239,9 +242,9 @@ ul.menu-popup { list-style: none; border: 3px solid @MenuBorder; z-index: 100000; - + .shadow(); - + a { display: block; color: @MenuItem; padding: 5px 10px; text-decoration: none;} a:hover { background-color: @MenuItemHoverBg; } .menu-sep { border-top: 1px solid @MenuItemSeparator; } @@ -253,12 +256,12 @@ ul.menu-popup { color: @MenuEmpty; } .toolbar { - background-color: @MenuEmpty; + background-color: @MenuEmpty; height: auto; overflow: auto; a { float: right; } a:hover { background-color: @MenuBg; } } - + } /* autocomplete popup */ @@ -272,7 +275,7 @@ ul.menu-popup { z-index:100000; .shadow(); } -.autocomplete > div, +.autocomplete > div, .acpopupitem { color: @MenuItem; padding: 4px; clear:left; @@ -299,8 +302,10 @@ ul.menu-popup { } + + /* aside 230px*/ -aside { +aside { display: table-cell; vertical-align: top; width: 200px; @@ -315,7 +320,7 @@ aside { dl { height: auto; overflow: auto; } dt {float: left; margin-left: 0px; width: 35%; text-align: right; color: @VCardLabelColor; } dd {float: left; margin-left: 4px; width: 60%;} - + } #profile-extra-links { @@ -332,7 +337,7 @@ aside { text-transform:uppercase; padding: 4px 2px 2px 35px; margin-top: 3px; - + &:hover { text-decoration: none; background-color: @AsideConnectHoverBg; } } #dfrn-request-link { @@ -343,12 +348,12 @@ aside { font-weight: bold; text-transform:uppercase; padding: 4px 2px 2px 35px; - + &:hover { text-decoration: none; background-color: @AsideConnectHoverBg; } } #profiles-menu { width: 20em; } - + .posted-date-selector-months { margin-left: 10px; } } @@ -415,11 +420,11 @@ aside { width: 60px; height: 60px; }*/ - + /* widget */ .widget { margin-bottom: 2em; - + h3 { padding: 0px; margin: 2px;} .action { .opaque(0.1); } input.action { .opaque(0.5); } @@ -429,14 +434,14 @@ aside { ul { padding: 0px;} ul li {padding-left: 16px; min-height: 16px; list-style: none; } - + .tool.selected { background: url('../../../images/selected.png') no-repeat left center; } - + /*.action .s10 { width: 10px; overflow: hidden; padding: 0px;} .action .s16 { width: 16px; overflow: hidden; padding: 0px;}*/ - + } /* widget: search */ @@ -447,7 +452,7 @@ aside { /* section 800px */ -section { +section { display: table-cell; vertical-align: top; width: 770px; @@ -459,7 +464,7 @@ section { } /* wall item */ -.tread-wrapper { +.tread-wrapper { background-color: @ThreadBackgroundColor; position: relative; padding: 10px; @@ -473,10 +478,10 @@ section { .wall-item-container { display: table; width: 750px; - + .wall-item-item, .wall-item-bottom { display: table-row; } - + .wall-item-bottom { .opaque(0.5); } &:hover .wall-item-bottom { .opaque(1); } .wall-item-info { @@ -484,8 +489,8 @@ section { vertical-align: top; text-align: left; width: 60px; - - } + + } .wall-item-location { word-wrap: break-word; width: 50px; @@ -498,45 +503,45 @@ section { } .wall-item-content img { max-width: 700px; } .wall-item-links, - .wall-item-actions { - display: table-cell; - vertical-align: middle; - + .wall-item-actions { + display: table-cell; + vertical-align: middle; + .icon { .opaque(0.5); } .icon:hover { .opaque(1.0); - } + } } - + .wall-item-ago { padding-right: 40px; } .wall-item-name { font-weight: bold; } - + .wall-item-actions-author { float: left; width: 20em; margin-top: 0.5em; } .wall-item-actions-social { float: left; margin-top: 0.5em; a { margin-right: 3em; } } - .wall-item-actions-tools { float: right; width: 15%; + .wall-item-actions-tools { float: right; width: 15%; a { float: right; } input { float: right; } } - + } .wall-item-container.comment { .contact-photo-wrapper { margin-left: 16px; } - .contact-photo { - width: 32px; height: 32px; + .contact-photo { + width: 32px; height: 32px; } - + .contact-photo-menu-button { top: 15px !important; left: 0px !important; } .wall-item-links { padding-left: 12px; } - + .commentbox { height: 0px; overflow: hidden; @@ -546,7 +551,7 @@ section { } .transition(); } - + &:hover .commentbox { height:auto; overflow: visible; .wall-item-comment-wrapper { @@ -563,9 +568,9 @@ section { .opaque(0.5); } .contact-photo-wrapper { margin-left: 32px; } - .contact-photo { + .contact-photo { width: 16px; height: 16px; - } + } .contact-photo-menu-button { top: 15px !important; left: 15px !important; @@ -576,8 +581,8 @@ section { .wall-item-comment-wrapper { margin: 1em 2em 1em 60px; .comment-edit-photo { display: none; } - - textarea { + + textarea { height: 1em; width: 100%; font-size: 10px; color: @CommentBoxEmptyColor; border: 1px solid @CommentBoxEmptyBorderColor; @@ -588,7 +593,7 @@ section { color: @CommentBoxFullColor; border: 1px solid @CommentBoxFullBorderColor; } - + &.photo { margin: 1em 2em 1em 0px; } @@ -601,10 +606,10 @@ section { border: 1px solid @Grey5; margin-top: 10px; background-color: @JotPreviewBackgroundColor; - + .contact-photo { width: 32px; height: 32px; margin-left: 16px; /*background: url(../../../images/icons/22/user.png) no-repeat center center;*/ - } + } .contact-photo-menu-button { top: 15px !important; left: 15px !important; @@ -612,8 +617,8 @@ section { .wall-item-links { padding-left: 12px; } .wall-item-container { width: 90%; } - .tread-wrapper { - width: 90%; padding: 0; margin: 10px 0; + .tread-wrapper { + width: 90%; padding: 0; margin: 10px 0; background-color: @JotPreviewBackgroundColor; border-bottom: 0px; } @@ -659,7 +664,7 @@ section { opacity: 0.5; }*/ -.wwto { +.wwto { position: absolute !important; background: #FFFFFF; border: 2px solid @Metalic3; @@ -688,7 +693,7 @@ section { float: none; margin-right: 0px; } - + } .type-link { blockquote { @@ -728,7 +733,7 @@ blockquote.shared_content { .oembed.video { - > a.embed_video { + > a.embed_video { display: block; float: none; > div { @@ -746,45 +751,45 @@ blockquote.shared_content { .children { margin-top: 1em; .hide-comments-outer { margin-left:60px; } - + .wwto { display: none; } - + .comment-edit-preview { width: 660px; .wall-item-container { width: 610px; } } - + & .children { - + margin-left: 40px; .wall-item-container { width: 710px; } .comment-edit-preview { width: 620px; .wall-item-container { width: 620px; } } - + & .children { .wall-item-container { width: 670px; } - .comment-edit-preview { width: 580px; + .comment-edit-preview { width: 580px; .wall-item-container { width: 580px; } } - + & .children { .wall-item-container { width: 630px; } - .comment-edit-preview { width: 540px; + .comment-edit-preview { width: 540px; .wall-item-container { width: 540px; } } & .children { .wall-item-container { width: 590px; } - .comment-edit-preview { width: 500px; + .comment-edit-preview { width: 500px; .wall-item-container { width: 500px; } } - + .children { margin-left: 0px; .hide-comments-outer { margin-left: 0px; } } } - } + } } } } @@ -813,8 +818,8 @@ span[id^="showmore-wrap"] { .contact-select { position: absolute; top:64px; left:64px; display:none; } .contact-select:checked, .contact-photo:hover .contact-select { display:block; } -#contacts-actions { - position: absolute; +#contacts-actions { + position: absolute; left: 800px; width: 200px; background-color: @MenuBg; @@ -838,12 +843,12 @@ span[id^="showmore-wrap"] { #contacts-actions { left: 40px; } } -.contact-photo { +.contact-photo { width: 48px; height: 48px; img { width: 48px; height: 48px; } overflow: hidden; display: block; - } + } .contact-photo-menu-button { display: none; position: absolute; @@ -857,30 +862,30 @@ span[id^="showmore-wrap"] { height: 90px; padding-right: 10px; margin: 0 10px 10px 0px; - .contact-photo-wrapper { - float: left; + .contact-photo-wrapper { + float: left; margin-right: 10px; } - .contact-photo { + .contact-photo { width: 80px; height: 80px; img { width: 80px; height: 80px; } } .contact-photo-menu-button { left: 0px; top: 63px; - } + } } .directory-item { float: left; width: 200px; height: 200px; - .contact-photo { + .contact-photo { width: 175px; height: 175px; img { width: 175px; height: 175px; } } } .contact-name { font-weight: bold; padding-top: 15px; } -.contact-details { +.contact-details { color: @Grey3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -891,8 +896,8 @@ span[id^="showmore-wrap"] { #jot { width: 100%; - margin: 0px 2em 20px 0px; - + margin: 0px 2em 20px 0px; + .profile-jot-text { height: 1em; width: 99%; font-size: 10px; color: @CommentBoxEmptyColor; @@ -939,7 +944,7 @@ span[id^="showmore-wrap"] { border-left: 10px solid @JotPermissionLockBackgroundColor; background-color: @JotPermissionLockBackgroundColor; } - + } li.submit { float: right; @@ -985,12 +990,12 @@ span[id^="showmore-wrap"] { &:-moz-placeholder { font-weight: normal; - } - + } + &:hover { border: 1px solid @CommentBoxEmptyBorderColor } &:focus { border: 1px solid @CommentBoxEmptyBorderColor } } - + #character-counter { width: 40px; float: right; @@ -999,7 +1004,7 @@ span[id^="showmore-wrap"] { line-height: 20px; padding-right: 20px; } - + #jot-category { border: 0px; margin: 0px; @@ -1031,6 +1036,7 @@ span[id^="showmore-wrap"] { } + #acl-wrapper { width: 690px; float:left; @@ -1067,7 +1073,7 @@ span[id^="showmore-wrap"] { overflow: auto; } #acl-list-content { - + } .acl-list-item { display: block; @@ -1084,7 +1090,7 @@ span[id^="showmore-wrap"] { margin: 4px; } .acl-list-item p { height: 12px; font-size: 10px; margin: 0px; padding: 2px 0px 1px; overflow: hidden;} -.acl-list-item a { +.acl-list-item a { font-size: 8px; display: block; width: 40px; @@ -1129,12 +1135,12 @@ ul.tabs { li { float: left; margin-left: 20px; - + .active { border-bottom: 1px solid @LinkVisited; } } - + } @@ -1143,7 +1149,7 @@ ul.tabs { #group-update-wrapper{ height: auto; overflow: auto; #group { - width:300px; + width:300px; float:left; margin-right:20px; } @@ -1172,6 +1178,7 @@ ul.tabs { overflow: auto; width: 100%; + label { float: left; width: 200px; @@ -1184,15 +1191,16 @@ ul.tabs { input[type="checkbox"], input[type="radio"]{ width: auto; } - + textarea { height: 100px; } .field_help { display: block; margin-left: 200px; color: @FieldHelpColor; - + } + .onoff { float: left; width: 80px; @@ -1264,7 +1272,7 @@ ul.tabs { } #profile-edit-profile-name, #profile-edit-name, -#gender-select, +#gender-select, #profile-edit-pdesc, #profile-edit-gender, #profile-edit-dob, @@ -1289,7 +1297,7 @@ ul.tabs { height: auto; overflow: auto; border-bottom: 2px solid #cccccc; padding-bottom: 1em; - margin-bottom: 1em; + margin-bottom: 1em; } .oauthapp img { float: left; @@ -1310,11 +1318,37 @@ ul.tabs { width: 50px; float: left; } +/* videos page */ +.videos { + .video-top-wrapper { + width: 200px; float: left; + margin: 0px 10px 10px 0px; + position: relative; + + .video-js { + width: 200px!important; + height: 132px!important; + } + + .video-delete { + position: absolute; + opacity: 0; + right: 0px; + top: 0px; + transition: opacity 0.5s; + } + + &:hover .video-delete { + opacity: 1; + } + } +} + /* photo albums */ @photosize: 150px; #photo-edit-link-wrap { margin-bottom: 10px; } - + #album-edit-link { border-right: 1px solid @MenuBorder; float: left; @@ -1347,21 +1381,21 @@ ul.tabs { width:@photosize; height: @photosize; position: relative; overflow: hidden; - + img { width: @photosize; } - + .photo-top-album-name, .caption{ position: absolute; color: @Menu; background-color: @MenuBg; - + width: 100%; .shadow(0px, 5px); .transition(0.5s); bottom: -@photosize; } - + &:hover .photo-top-album-name, &:hover .caption { bottom: 0px; @@ -1381,8 +1415,8 @@ ul.tabs { background: url("../../../images/icons/22/image.png") no-repeat top left; padding-left: 23px; min-height: 22px; - padding-top: 6px; - /* a { display: block;}*/ + padding-top: 6px; + /* a { display: block;}*/ } #photo-caption { @@ -1430,14 +1464,14 @@ ul.tabs { top: 10px; left: -10px; } - .contact-photo { + .contact-photo { width: 80px; height: 80px; img { width: 80px; height: 80px; } } .contact-photo-menu-button { left: 0px; top: 63px; - } + } } /* messages */ @@ -1458,10 +1492,10 @@ ul.tabs { background-color: @MailListBackgroundColor; margin-bottom: 5px; width: 100%; height: auto; overflow: hidden; - + span { display: block; float: left; width: 20%; overflow: hidden;} - - .mail-subject { + + .mail-subject { width: 30%; padding:4px 0px 0px 4px; a { display: block; } @@ -1470,7 +1504,7 @@ ul.tabs { .mail-date { padding: 4px 4px 0px 4px; } .mail-from { padding: 4px 4px 0px 4px; } .mail-count { padding: 4px 4px 0px 4px; text-align: right;} - + .mail-delete { float: right; } } @@ -1482,7 +1516,7 @@ ul.tabs { span { float: left; overflow: hidden; padding: 4px 0px 0px 10px;} .mail-delete { float: right; .opaque(0.5);} &:hover .mail-delete { .opaque(1); } - + } /* theme screenshot */ @@ -1511,7 +1545,7 @@ footer { height: 100px; display: table-row; } font-weight: bold; background-color: #FF0000; padding: 0em 0.3em; - + } #adminpage { dl { @@ -1558,25 +1592,26 @@ footer { height: 100px; display: table-row; } } table { width:100%; - border-bottom: 1px solid #000000; + border-bottom: 1px solid #000000; margin: 5px 0px; - th { + th { text-align: left; } - td .icon { + td .icon { float: left; } - tr:hover { + tr:hover { background-color: #bbc7d7; } } - table#users img { - width: 16px; height: 16px; + table#users img { + width: 16px; height: 16px; } .selectall { text-align: right; } } /* edit buttons for comments */ + .icon.dim { opacity: 0.3;filter:alpha(opacity=30); } .comment-edit-bb { list-style: none; @@ -1660,3 +1695,4 @@ footer { height: 100px; display: table-row; } border: 0px; color: @FieldHelpColor; } + diff --git a/view/theme/vier/style.css b/view/theme/vier/style.css index e75934c8c..e36bad4e3 100644 --- a/view/theme/vier/style.css +++ b/view/theme/vier/style.css @@ -7,7 +7,7 @@ @import url("css/font-awesome.css") all; @import url("css/font2.css") all; -img { +img { border: 0px; } @@ -32,7 +32,7 @@ img { } .admin.linklist { - border: 0px; + border: 0px; padding: 0px; list-style: none; margin-top: 0px; @@ -135,7 +135,7 @@ img { padding: 1px; color: #999; vertical-align: text-top; -} +} .icon:hover { text-decoration: none; @@ -201,8 +201,8 @@ div.pager a { margin-left: 5px; margin-right: 5px; } - -span.pager_first a, span.pager_n a, + +span.pager_first a, span.pager_n a, span.pager_last a, span.pager_prev a, span.pager_next a, span.scroll_loader_text { color: darkgray; @@ -389,7 +389,7 @@ code { opacity: 1; } -.sidebar-group-li:hover, #sidebar-new-group:hover, #hide-forum-list:hover, +.sidebar-group-li:hover, #sidebar-new-group:hover, #hide-forum-list:hover, #sidebar-ungrouped:hover, .side-link:hover, .nets-ul li:hover, #forum-list div:hover, .nets-all:hover, .saved-search-li:hover, li.tool:hover, .admin.link:hover, aside h4 a:hover, #message-new:hover { /* background-color: #ddd; */ @@ -1466,7 +1466,7 @@ section.minimal { } #profile-jot-form #jot-title, #profile-jot-form #jot-category { - + border-radius: 5px 5px 5px 5px; font-weight: bold; height: 20px; @@ -1966,13 +1966,13 @@ ul.tabs a { margin-bottom: 2px; } -#event-notice:hover, #birthday-notice:hover, ul.tabs li .active, +#event-notice:hover, #birthday-notice:hover, ul.tabs li .active, .comment-edit-submit-wrapper .fakelink:hover { color: black; } -span.pager_current, span.pager_n a:hover, -span.pager_first a:hover, span.pager_last a:hover, +span.pager_current, span.pager_n a:hover, +span.pager_first a:hover, span.pager_last a:hover, span.pager_prev a:hover, span.pager_next a:hover, ul.tabs a:hover { border-bottom: 2px solid #244C5E; @@ -2092,7 +2092,7 @@ aside form .field label { .profile-edit-side-div { /* display: none; */ - float: right; + float: right; } /* aside div.clear { @@ -2169,9 +2169,9 @@ aside form .field label { .contact-photo-menu-button { position: relative; background-image: url("../../../images/icons/16/menu.png"); - background-position: top left; + background-position: top left; background-repeat: no-repeat; - margin: 0px 0px -16px 0px; + margin: 0px 0px -16px 0px; padding: 0px; width: 16px; height: 16px; @@ -2179,7 +2179,7 @@ aside form .field label { overflow: hidden; text-indent: 40px; display: none; - + } .contact-photo-menu { width: 11em; @@ -2194,13 +2194,13 @@ aside form .field label { } .contact-photo-menu ul { margin:0px; padding: 0px; list-style: none } .contact-photo-menu li a { - display: block; - padding: 5px 10px; + display: block; + padding: 5px 10px; color: #2d2d2d; text-decoration: none; } .contact-photo-menu li a:hover { - background-color: #bdcdd4; + background-color: #bdcdd4; } /* page footer */ @@ -2237,7 +2237,7 @@ blockquote { } .contact-block-textdiv { width: 150px; height: 34px; float: left; } -#contact-block-end { clear: both; } +#contact-block-end { clear: both; } #group-edit-wrapper { margin-bottom: 10px; @@ -2426,7 +2426,7 @@ a.mail-list-link { clear: both; } - + .calendar { font-family: Courier, monospace; } @@ -2574,14 +2574,14 @@ a.mail-list-link { float: left; margin-top: 15px; margin-right: 15px; - width: 200px; height: 200px; - overflow: hidden; + width: 200px; height: 200px; + overflow: hidden; } .photo-top-album-name { width: 100%; min-height: 2em; - position: absolute; - bottom: 0px; + position: absolute; + bottom: 0px; padding: 0px 3px; padding-top: 0.5em; background-color: rgb(255, 255, 255); @@ -2612,15 +2612,15 @@ a.mail-list-link { .menu-profile-list-item{ padding-left: 5px; vertical-align: middle; - } -.menu-profile-list-item:hover{ + } +.menu-profile-list-item:hover{ text-decoration: none; } .autocomplete { width: 350px; - color: black; - border: 1px solid rgb(210, 210, 210); + color: black; + border: 1px solid rgb(210, 210, 210); background-color: white; cursor: pointer; text-align: left; @@ -2628,7 +2628,7 @@ a.mail-list-link { overflow: auto; display: block; background-position: initial initial; - background-repeat: initial initial; + background-repeat: initial initial; } .mail-list-wrapper { background-color: #f6f7f8; @@ -2828,3 +2828,24 @@ a.mail-list-link { .profile-view-actions{ float:right; } +/* videos page */ +.videos .video-top-wrapper { + width: 300px; + float: left; + margin: 0px 10px 10px 0px; + position: relative; +} +.videos .video-top-wrapper .video-js { + width: 300px!important; + height: 232px!important; +} +.videos .video-top-wrapper .video-delete { + position: absolute; + opacity: 0; + right: 0px; + top: 0px; + transition: opacity 0.5s; +} +.videos .video-top-wrapper:hover .video-delete { + opacity: 1; +}