1
0
Fork 0

Merge remote branch 'upstream/master'

This commit is contained in:
Michael Vogel 2012-09-20 08:32:33 +02:00
commit 4c389eb73b
118 changed files with 17769 additions and 7593 deletions

3
.gitignore vendored
View file

@ -21,5 +21,6 @@ report/
.buildpath
.externalToolBuilders
.settings
#ignore OSX .DS_Store files
.DS_Store
view/theme/smoothly

View file

@ -11,9 +11,9 @@ require_once('include/cache.php');
require_once('library/Mobile_Detect/Mobile_Detect.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_VERSION', '3.0.1461' );
define ( 'FRIENDICA_VERSION', '3.0.1471' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1154 );
define ( 'DB_UPDATE_VERSION', 1156 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@ -1511,14 +1511,20 @@ if(! function_exists('current_theme')) {
$is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
if($is_mobile) {
$system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
$theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
if($theme_name === '---') {
// user has selected to have the mobile theme be the same as the normal one
if(isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
$system_theme = '';
$theme_name = '';
}
else {
$system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
$theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
if($theme_name === '---') {
// user has selected to have the mobile theme be the same as the normal one
$system_theme = '';
$theme_name = '';
}
}
}
if(!$is_mobile || ($system_theme === '' && $theme_name === '')) {
$system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
@ -1760,3 +1766,20 @@ function build_querystring($params, $name=null) {
}
return $ret;
}
/**
* Returns the complete URL of the current page, e.g.: http(s)://something.com/network
*
* Taken from http://webcheatsheet.com/php/get_current_page_url.php
*/
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80" && $_SERVER["SERVER_PORT"] != "443") {
$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;
}

View file

@ -260,6 +260,7 @@ CREATE TABLE IF NOT EXISTS `event` (
`type` char(255) NOT NULL,
`nofinish` tinyint(1) NOT NULL DEFAULT '0',
`adjust` tinyint(1) NOT NULL DEFAULT '1',
`ignore` tinyint(1) NOT NULL DEFAULT '0',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@ -271,7 +272,8 @@ CREATE TABLE IF NOT EXISTS `event` (
KEY `type` ( `type` ),
KEY `start` ( `start` ),
KEY `finish` ( `finish` ),
KEY `adjust` ( `adjust` )
KEY `adjust` ( `adjust` ),
KEY `ignore` ( `ignore` )
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
@ -590,11 +592,13 @@ CREATE TABLE IF NOT EXISTS `item` (
--
CREATE TABLE IF NOT EXISTS `item_id` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`iid` int(11) NOT NULL,
`uid` int(11) NOT NULL,
`sid` char(255) NOT NULL,
`service` char(255) NOT NULL,
PRIMARY KEY (`iid`),
PRIMARY KEY (`id`),
KEY `iid` (`iid`),
KEY `uid` (`uid`),
KEY `sid` (`sid`),
KEY `service` (`service`)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

View file

@ -46,9 +46,52 @@ class Photo {
}
$this->type = $type;
if($this->is_imagick()) {
$this->image = new Imagick();
$this->image->readImageBlob($data);
if($this->is_imagick() && $this->load_data($data)) {
return true;
} else {
// Failed to load with Imagick, fallback
$this->imagick = false;
}
return $this->load_data($data);
}
public function __destruct() {
if($this->image) {
if($this->is_imagick()) {
$this->image->clear();
$this->image->destroy();
return;
}
imagedestroy($this->image);
}
}
public function is_imagick() {
return $this->imagick;
}
/**
* Maps Mime types to Imagick formats
*/
public function get_FormatsMap() {
$m = array(
'image/jpeg' => 'JPG',
'image/png' => 'PNG',
'image/gif' => 'GIF'
);
return $m;
}
private function load_data($data) {
if($this->is_imagick()) {
$this->image = new Imagick();
try {
$this->image->readImageBlob($data);
}
catch (Exception $e) {
// Imagick couldn't use the data
return false;
}
/**
* Setup the image to the format it will be saved to
@ -85,45 +128,28 @@ class Photo {
$quality = JPEG_QUALITY;
$this->image->setCompressionQuality($quality);
}
} else {
$this->valid = false;
$this->image = @imagecreatefromstring($data);
if($this->image !== FALSE) {
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
$this->valid = true;
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
}
}
}
public function __destruct() {
if($this->image) {
if($this->is_imagick()) {
$this->image->clear();
$this->image->destroy();
return;
}
imagedestroy($this->image);
}
}
$this->width = $this->image->getImageWidth();
$this->height = $this->image->getImageHeight();
$this->valid = true;
public function is_imagick() {
return $this->imagick;
}
return true;
}
/**
* Maps Mime types to Imagick formats
*/
public function get_FormatsMap() {
$m = array(
'image/jpeg' => 'JPG',
'image/png' => 'PNG',
'image/gif' => 'GIF'
);
return $m;
}
$this->valid = false;
$this->image = @imagecreatefromstring($data);
if($this->image !== FALSE) {
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
$this->valid = true;
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
return true;
}
return false;
}
public function is_valid() {
if($this->is_imagick())
@ -637,7 +663,7 @@ function import_profile_photo($photo,$uid,$cid) {
intval($uid),
intval($cid)
);
if(count($r)) {
if(count($r) && strlen($r[0]['resource-id'])) {
$hash = $r[0]['resource-id'];
}
else {

View file

@ -215,10 +215,6 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$a = get_app();
// Move all spaces out of the tags
$Text = preg_replace("/\[(\w*)\](\s*)/ism", '$2[$1]', $Text);
$Text = preg_replace("/(\s*)\[\/(\w*)\]/ism", '[/$2]$1', $Text);
// Hide all [noparse] contained bbtags by spacefying them
// POSSIBLE BUG --> Will the 'preg' functions crash if there's an embedded image?
@ -227,6 +223,10 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
// Move all spaces out of the tags
$Text = preg_replace("/\[(\w*)\](\s*)/ism", '$2[$1]', $Text);
$Text = preg_replace("/(\s*)\[\/(\w*)\]/ism", '[/$2]$1', $Text);
// Extract the private images which use data url's since preg has issues with
// large data sizes. Stash them away while we do bbcode conversion, and then put them back
// in after we've done all the regex matching. We cannot use any preg functions to do this.

View file

@ -60,7 +60,7 @@ function item_redir_and_replace_images($body, $images, $cid) {
$search = '/\[url\=(.*?)\]\[!#saved_image([0-9]*)#!\]\[\/url\]' . '/is';
$replace = '[url=' . z_path() . '/redir/' . $cid
. '?f=1&url=' . '$1' . '][!#saved_image' . '$2' .'#!][/url]';
. '?f=1&url=' . '$1' . '][!#saved_image' . '$2' .'#!][/url]';
$newbody .= substr($origbody, 0, $pos['start']['open']);
$subject = substr($origbody, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
@ -99,7 +99,7 @@ function localize_item(&$item){
$item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){
if (activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)){
$r = q("SELECT * from `item`,`contact` WHERE
`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
@ -107,7 +107,7 @@ function localize_item(&$item){
if(count($r)==0) return;
$obj=$r[0];
$author = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
$author = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
$objauthor = '[url=' . $obj['author-link'] . ']' . $obj['author-name'] . '[/url]';
switch($obj['verb']){
@ -123,7 +123,7 @@ function localize_item(&$item){
default:
if($obj['resource-id']){
$post_type = t('photo');
$m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
$m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
@ -132,18 +132,16 @@ function localize_item(&$item){
$plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
switch($item['verb']){
case ACTIVITY_LIKE :
$bodyverb = t('%1$s likes %2$s\'s %3$s');
break;
case ACTIVITY_DISLIKE:
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
break;
if(activity_match($item['verb'],ACTIVITY_LIKE)) {
$bodyverb = t('%1$s likes %2$s\'s %3$s');
}
elseif(activity_match($item['verb'],ACTIVITY_DISLIKE)) {
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
}
$item['body'] = sprintf($bodyverb, $author, $objauthor, $plink);
}
if ($item['verb']=== ACTIVITY_FRIEND){
if (activity_match($item['verb'],ACTIVITY_FRIEND)) {
if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) return;
@ -230,14 +228,14 @@ function localize_item(&$item){
$item['body'] = sprintf($txt, $A, t($verb));
}
if ($item['verb']===ACTIVITY_TAG){
if (activity_match($item['verb'],ACTIVITY_TAG)) {
$r = q("SELECT * from `item`,`contact` WHERE
`item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
dbesc($item['parent-uri']));
if(count($r)==0) return;
$obj=$r[0];
$author = '[url=' . zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]';
$author = '[url=' . zrl($item['author-link']) . ']' . $item['author-name'] . '[/url]';
$objauthor = '[url=' . zrl($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
switch($obj['verb']){
@ -253,7 +251,7 @@ function localize_item(&$item){
default:
if($obj['resource-id']){
$post_type = t('photo');
$m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
$m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
@ -267,7 +265,7 @@ function localize_item(&$item){
$item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
}
if ($item['verb']=== ACTIVITY_FAVORITE){
if (activity_match($item['verb'],ACTIVITY_FAVORITE)){
if ($item['object-type']== "")
return;
@ -332,9 +330,8 @@ function count_descendants($item) {
if($total > 0) {
foreach($item['children'] as $child) {
if($child['verb'] === ACTIVITY_LIKE || $child['verb'] === ACTIVITY_DISLIKE) {
if(! visible_activity($child))
$total --;
}
$total += count_descendants($child);
}
}
@ -342,6 +339,17 @@ function count_descendants($item) {
return $total;
}
function visible_activity($item) {
if(activity_match($child['verb'],ACTIVITY_LIKE) || activity_match($child['verb'],ACTIVITY_DISLIKE))
return false;
if(activity_match($item['verb'],ACTIVITY_FOLLOW) && $item['object-type'] === ACTIVITY_OBJ_NOTE && $item['uid'] != local_user())
return false;
return true;
}
/**
* Recursively prepare a thread for HTML
*/
@ -362,10 +370,9 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr
$nb_items--;
$total_children --;
}
if($item['verb'] === ACTIVITY_LIKE || $item['verb'] === ACTIVITY_DISLIKE) {
if(! visible_activity($item)) {
$nb_items --;
$total_children --;
}
}
@ -375,7 +382,7 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr
continue;
}
if($item['verb'] === ACTIVITY_LIKE || $item['verb'] === ACTIVITY_DISLIKE) {
if(! visible_activity($item)) {
continue;
}
@ -467,9 +474,19 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr
$location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
$tags=array();
$hashtags = array();
$mentions = array();
foreach(explode(',',$item['tag']) as $tag){
$tag = trim($tag);
if ($tag!="") $tags[] = bbcode($tag);
if ($tag!="") {
$t = bbcode($tag);
$tags[] = $t;
if($t[0] == '#')
$hashtags[] = $t;
elseif($t[0] == '@')
$mentions[] = $t;
}
}
$like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
@ -620,7 +637,9 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr
'template' => $template,
'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
'tags' => $tags,
'tags' => template_escape($tags),
'hashtags' => template_escape($hashtags),
'mentions' => template_escape($mentions),
'body' => template_escape($body),
'text' => strip_tags(template_escape($body)),
'id' => $item['item_id'],
@ -666,6 +685,8 @@ function prepare_threads_body($a, $items, $cmnt_tpl, $page_writeable, $mode, $pr
$item_result = $arr['output'];
if($firstcollapsed) {
$item_result['num_comments'] = sprintf( tt('%d comment','%d comments',$total_children),$total_children );
$item_result['hidden_comments_num'] = $total_children;
$item_result['hidden_comments_text'] = tt('comment', 'comments', $total_children);
$item_result['hide_text'] = t('show more');
}
@ -814,6 +835,21 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$tags=array();
$hashtags = array();
$mentions = array();
foreach(explode(',',$item['tag']) as $tag){
$tag = trim($tag);
if ($tag!="") {
$t = bbcode($tag);
$tags[] = $t;
if($t[0] == '#')
$hashtags[] = $t;
elseif($t[0] == '@')
$mentions[] = $t;
}
}
$sp = false;
$profile_link = best_link_url($item,$sp);
if($profile_link === 'mailbox')
@ -869,6 +905,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
'thumb' => $profile_avatar,
'title' => template_escape($item['title']),
'body' => template_escape($body),
'tags' => template_escape($tags),
'hashtags' => template_escape($hashtags),
'mentions' => template_escape($mentions),
'text' => strip_tags(template_escape($body)),
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
@ -906,22 +945,41 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
// Normal View
$page_template = get_markup_template("threaded_conversation.tpl");
require_once('object/Conversation.php');
require_once('object/Item.php');
$conv = new Conversation($mode, $preview);
// get all the topmost parents
// this shouldn't be needed, as we should have only them in ou array
// this shouldn't be needed, as we should have only them in our array
// But for now, this array respects the old style, just in case
$threads = array();
foreach($items as $item) {
// Can we put this after the visibility check?
like_puller($a,$item,$alike,'like');
like_puller($a,$item,$dlike,'dislike');
// Only add what is visible
if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
continue;
}
if(! visible_activity($item)) {
continue;
}
if($item['id'] == $item['parent']) {
$threads[] = $item;
$item_object = new Item($item);
$conv->add_thread($item_object);
}
}
$threads = prepare_threads_body($a, $threads, $cmnt_tpl, $page_writeable, $mode, $profile_owner, $alike, $dlike, $previewing);
$threads = $conv->get_template_data($alike, $dlike);
if(!$threads) {
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
$threads = array();
}
}
}
@ -985,7 +1043,7 @@ function item_photo_menu($item){
$posts_link="";
$sparkle = false;
$profile_link = best_link_url($item,$sparkle,$ssl_state);
$profile_link = best_link_url($item,$sparkle,$ssl_state);
if($profile_link === 'mailbox')
$profile_link = '';
@ -1231,6 +1289,7 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
'$profile_uid' => $x['profile_uid'],
'$preview' => t('Preview'),
'$sourceapp' => t($a->sourcename),
'$cancel' => t('Cancel')
));

View file

@ -2061,11 +2061,20 @@ function diaspora_profile($importer,$xml,$msg) {
$image_url = unxmlify($xml->image_url);
$birthday = unxmlify($xml->birthday);
$r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ",
$handle_parts = explode("@", $diaspora_handle);
if($name === '') {
$name = $handle_parts[0];
}
if(strpos($image_url, $handle_parts[1]) === false) {
$image_url = "http://" . $handle_parts[1] . $image_url;
}
/* $r = q("SELECT DISTINCT ( `resource-id` ) FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' ",
intval($importer['uid']),
intval($contact['id'])
);
$oldphotos = ((count($r)) ? $r : null);
$oldphotos = ((count($r)) ? $r : null);*/
require_once('include/Photo.php');
@ -2098,7 +2107,7 @@ function diaspora_profile($importer,$xml,$msg) {
intval($importer['uid'])
);
if($r) {
/* if($r) {
if($oldphotos) {
foreach($oldphotos as $ph) {
q("DELETE FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `album` = 'Contact Photos' AND `resource-id` = '%s' ",
@ -2108,7 +2117,7 @@ function diaspora_profile($importer,$xml,$msg) {
);
}
}
}
} */
return;

View file

@ -1190,6 +1190,15 @@ function tag_deliver($uid,$item_id) {
// send a notification
// use a local photo if we have one
$r = q("select thumb from contact where uid = %d and nurl = '%s' limit 1",
intval($u[0]['uid']),
dbesc(normalise_link($item['author-link']))
);
$photo = (($r && count($r)) ? $r[0]['thumb'] : $item['author-avatar']);
require_once('include/enotify.php');
notification(array(
'type' => NOTIFY_TAGSELF,
@ -1202,7 +1211,7 @@ function tag_deliver($uid,$item_id) {
'link' => $a->get_baseurl() . '/display/' . $u[0]['nickname'] . '/' . $item['id'],
'source_name' => $item['author-name'],
'source_link' => $item['author-link'],
'source_photo' => $item['author-avatar'],
'source_photo' => $photo,
'verb' => ACTIVITY_TAG,
'otype' => 'item'
));
@ -1253,6 +1262,59 @@ function tag_deliver($uid,$item_id) {
function tgroup_check($uid,$item) {
$a = get_app();
$mention = false;
// check that the message originated elsewhere and is a top-level post
if(($item['wall']) || ($item['origin']) || ($item['uri'] != $item['parent-uri']))
return false;
$u = q("select * from user where uid = %d limit 1",
intval($uid)
);
if(! count($u))
return false;
$community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
$prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
$link = normalise_link($a->get_baseurl() . '/profile/' . $u[0]['nickname']);
// Diaspora uses their own hardwired link URL in @-tags
// instead of the one we supply with webfinger
$dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']);
$cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$item['body'],$matches,PREG_SET_ORDER);
if($cnt) {
foreach($matches as $mtch) {
if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) {
$mention = true;
logger('tgroup_check: mention found: ' . $mtch[2]);
}
}
}
if(! $mention)
return false;
if((! $community_page) && (! $prvgroup))
return false;
return true;
}
@ -1809,6 +1871,12 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if($pass == 1)
continue;
// not allowed to post
if($contact['rel'] == CONTACT_IS_FOLLOWER)
continue;
// Have we seen it? If not, import it.
$item_id = $item->get_id();
@ -2083,6 +2151,14 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$datarray['owner-avatar'] = $contact['thumb'];
}
// We've allowed "followers" to reach this point so we can decide if they are
// posting an @-tag delivery, which followers are allowed to do for certain
// page types. Now that we've parsed the post, let's check if it is legit. Otherwise ignore it.
if(($contact['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['uid'],$datarray)))
continue;
$r = item_store($datarray);
continue;
@ -2626,22 +2702,32 @@ function local_delivery($importer,$data) {
// Specifically, the recipient?
$is_a_remote_comment = false;
$top_uri = $parent_uri;
// POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used?
$r = q("select `item`.`id`, `item`.`uri`, `item`.`tag`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
`contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item`
LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `item`.`uri` = '%s' AND (`item`.`parent-uri` = '%s' or `item`.`thr-parent` = '%s')
AND `item`.`uid` = %d
$sql_extra
$r = q("select `item`.`parent-uri` from `item`
WHERE `item`.`uri` = '%s'
LIMIT 1",
dbesc($parent_uri),
dbesc($parent_uri),
dbesc($parent_uri),
intval($importer['importer_uid'])
dbesc($parent_uri)
);
if($r && count($r))
$is_a_remote_comment = true;
if($r && count($r)) {
$top_uri = $r[0]['parent-uri'];
// POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used?
$r = q("select `item`.`id`, `item`.`uri`, `item`.`tag`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
`contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item`
LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `item`.`uri` = '%s' AND (`item`.`parent-uri` = '%s' or `item`.`thr-parent` = '%s')
AND `item`.`uid` = %d
$sql_extra
LIMIT 1",
dbesc($top_uri),
dbesc($top_uri),
dbesc($top_uri),
intval($importer['importer_uid'])
);
if($r && count($r))
$is_a_remote_comment = true;
}
// Does this have the characteristics of a community or private group comment?
// If it's a reply to a wall post on a community/prvgroup page it's a
@ -2695,15 +2781,6 @@ function local_delivery($importer,$data) {
}
// TODO: make this next part work against both delivery threads of a community post
// if((! link_compare($datarray['author-link'],$importer['url'])) && (! $community)) {
// logger('local_delivery: received relay claiming to be from ' . $importer['url'] . ' however comment author url is ' . $datarray['author-link'] );
// they won't know what to do so don't report an error. Just quietly die.
// return 0;
// }
// our user with $importer['importer_uid'] is the owner
$own = q("select name,url,thumb from contact where uid = %d and self = 1 limit 1",
intval($importer['importer_uid'])
@ -2773,15 +2850,6 @@ function local_delivery($importer,$data) {
}
}
// if($community) {
// $newtag = '@[url=' . $a->get_baseurl() . '/profile/' . $importer['nickname'] . ']' . $importer['username'] . '[/url]';
// if(! stristr($datarray['tag'],$newtag)) {
// if(strlen($datarray['tag']))
// $datarray['tag'] .= ',';
// $datarray['tag'] .= $newtag;
// }
// }
$posted_id = item_store($datarray);
$parent = 0;
@ -2851,6 +2919,9 @@ function local_delivery($importer,$data) {
$item_id = $item->get_id();
$datarray = get_atom_elements($feed,$item);
if($importer['rel'] == CONTACT_IS_FOLLOWER)
continue;
$r = q("SELECT `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
intval($importer['importer_uid'])
@ -2945,7 +3016,7 @@ function local_delivery($importer,$data) {
if(!x($datarray['type']) || $datarray['type'] != 'activity') {
$myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
dbesc($parent_uri),
dbesc($top_uri),
intval($importer['importer_uid'])
);
@ -3085,6 +3156,9 @@ function local_delivery($importer,$data) {
$datarray['owner-avatar'] = $importer['thumb'];
}
if(($importer['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['importer_uid'],$datarray)))
continue;
$posted_id = item_store($datarray);
if(stristr($datarray['verb'],ACTIVITY_POKE)) {

View file

@ -275,7 +275,7 @@ function onepoll_run($argv, $argc){
openssl_private_decrypt(hex2bin($mailconf[0]['pass']),$password,$x[0]['prvkey']);
$mbox = email_connect($mailbox,$mailconf[0]['user'],$password);
unset($password);
logger("Mail: Connect");
logger("Mail: Connect to " . $mailconf[0]['user']);
if($mbox) {
q("UPDATE `mailacct` SET `last_check` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
dbesc(datetime_convert()),
@ -289,7 +289,7 @@ function onepoll_run($argv, $argc){
$msgs = email_poll($mbox,$contact['addr']);
if(count($msgs)) {
logger("Mail: Parsing ".count($msgs)." mails.", LOGGER_DEBUG);
logger("Mail: Parsing ".count($msgs)." mails for ".$mailconf[0]['user'], LOGGER_DEBUG);
foreach($msgs as $msg_uid) {
logger("Mail: Parsing mail ".$msg_uid, LOGGER_DATA);
@ -339,15 +339,15 @@ function onepoll_run($argv, $argc){
case 0:
break;
case 1:
logger("Mail: Deleting ".$msg_uid);
logger("Mail: Deleting ".$msg_uid." for ".$mailconf[0]['user']);
imap_delete($mbox, $msg_uid, FT_UID);
break;
case 2:
logger("Mail: Mark as seen ".$msg_uid);
logger("Mail: Mark as seen ".$msg_uid." for ".$mailconf[0]['user']);
imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
break;
case 3:
logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']);
logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']." for ".$mailconf[0]['user']);
imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
if ($mailconf[0]['movetofolder'] != "")
imap_mail_move($mbox, $msg_uid, $mailconf[0]['movetofolder'], FT_UID);
@ -377,12 +377,12 @@ function onepoll_run($argv, $argc){
$r = email_get_msg($mbox,$msg_uid, $reply);
if(! $r) {
logger("Mail: can't fetch msg ".$msg_uid);
logger("Mail: can't fetch msg ".$msg_uid." for ".$mailconf[0]['user']);
continue;
}
$datarray['body'] = escape_tags($r['body']);
logger("Mail: Importing ".$msg_uid);
logger("Mail: Importing ".$msg_uid." for ".$mailconf[0]['user']);
// some mailing lists have the original author as 'from' - add this sender info to msg body.
// todo: adding a gravatar for the original author would be cool
@ -423,15 +423,15 @@ function onepoll_run($argv, $argc){
case 0:
break;
case 1:
logger("Mail: Deleting ".$msg_uid);
logger("Mail: Deleting ".$msg_uid." for ".$mailconf[0]['user']);
imap_delete($mbox, $msg_uid, FT_UID);
break;
case 2:
logger("Mail: Mark as seen ".$msg_uid);
logger("Mail: Mark as seen ".$msg_uid." for ".$mailconf[0]['user']);
imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
break;
case 3:
logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']);
logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']." for ".$mailconf[0]['user']);
imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
if ($mailconf[0]['movetofolder'] != "")
imap_mail_move($mbox, $msg_uid, $mailconf[0]['movetofolder'], FT_UID);

View file

@ -277,18 +277,24 @@ function create_user($arr) {
require_once('include/group.php');
group_add($newuid, t('Friends'));
if(! get_config('system', 'newuser_public')) {
$r = q("SELECT id FROM `group` WHERE uid = %d AND name = '%s'",
intval($newuid),
dbesc(t('Friends'))
$r = q("SELECT id FROM `group` WHERE uid = %d AND name = '%s'",
intval($newuid),
dbesc(t('Friends'))
);
if($r && count($r)) {
$def_gid = $r[0]['id'];
q("UPDATE user SET def_gid = %d WHERE uid = %d",
intval($r[0]['id']),
intval($newuid)
);
}
if(get_config('system', 'newuser_private') && $def_gid) {
q("UPDATE user SET allow_gid = '%s' WHERE uid = %d",
dbesc("<" . $def_gid . ">"),
intval($newuid)
);
if($r) {
q("UPDATE user SET def_gid = %d, allow_gid = '%s' WHERE uid = %d",
intval($r[0]['id']),
dbesc("<" . $r[0]['id'] . ">"),
intval($newuid)
);
}
}
}

View file

@ -13,8 +13,10 @@
*/
require_once('boot.php');
require_once('object/BaseObject.php');
$a = new App;
BaseObject::set_app($a);
/**
*

View file

@ -275,7 +275,7 @@ aStates[249]="|'Adan|'Ataq|Abyan|Al Bayda'|Al Hudaydah|Al Jawf|Al Mahrah|Al Mahw
aStates[250]="|Kosovo|Montenegro|Serbia|Vojvodina";
aStates[251]="|Central|Copperbelt|Eastern|Luapula|Lusaka|North-Western|Northern|Southern|Western";
aStates[252]="|Bulawayo|Harare|ManicalandMashonaland Central|Mashonaland East|Mashonaland West|Masvingo|Matabeleland North|Matabeleland South|Midlands";
aStates[253]="|Self Hosted|Private Server|Architects Of Sleep|DFRN|Distributed Friend Network|ErrLock|Free-Beer.ch|Foojbook|Free-Haven|Friendica.eu|Friendika.me.4.it|Friendika - I Ask Questions|Frndc.com|Hikado|Hipatia|Hungerfreunde|Kaluguran Community|Kak Ste|Karl.Markx.pm|Loozah Social Club|MyFriendica.net|MyFriendNetwork|Oi!|OpenMindSpace|Optimistisch|Recolutionari.es|SilverLips|Sparkling Network|SPRACI|Styliztique|Sysfu Social Club|Trevena|theshi.re|Tumpambae|Uzmiac|Other";
aStates[253]="|Self Hosted|Private Server|Architects Of Sleep|DFRN|Distributed Friend Network|ErrLock|Free-Beer.ch|Foojbook|Free-Haven|Friendica.eu|Friendika.me.4.it|Friendika - I Ask Questions|Frndc.com|Hikado|Hipatia|Hungerfreunde|Kaluguran Community|Kak Ste|Karl.Markx.pm|Loozah Social Club|MyFriendica.net|MyFriendNetwork|Oi!|OpenMindSpace|Optimistisch|Pplsnet|Recolutionari.es|SilverLips|Sparkling Network|SPRACI|Styliztique|Sysfu Social Club|Trevena|theshi.re|Tumpambae|Uzmiac|Other";
/*
* gArCountryInfo
* (0) Country name

View file

@ -144,6 +144,29 @@
if(mail == 0) { mail = ''; $('#mail-update-li').removeClass('show') } else { $('#mail-update-li').addClass('show') }
$('#mail-update-li').html(mail);
var allevents = $(data).find('all-events').text();
if(allevents == 0) { allevents = ''; $('#allevents-update').removeClass('show') } else { $('#allevents-update').addClass('show') }
$('#allevents-update').html(allevents);
var alleventstoday = $(data).find('all-events-today').text();
if(alleventstoday == 0) { $('#allevents-update').removeClass('notif-allevents-today') } else { $('#allevents-update').addClass('notif-allevents-today') }
var events = $(data).find('events').text();
if(events == 0) { events = ''; $('#events-update').removeClass('show') } else { $('#events-update').addClass('show') }
$('#events-update').html(events);
var eventstoday = $(data).find('events-today').text();
if(eventstoday == 0) { $('#events-update').removeClass('notif-events-today') } else { $('#events-update').addClass('notif-events-today') }
var birthdays = $(data).find('birthdays').text();
if(birthdays == 0) {birthdays = ''; $('#birthdays-update').removeClass('show') } else { $('#birthdays-update').addClass('show') }
$('#birthdays-update').html(birthdays);
var birthdaystoday = $(data).find('birthdays-today').text();
if(birthdaystoday == 0) { $('#birthdays-update').removeClass('notif-birthdays-today') } else { $('#birthdays-update').addClass('notif-birthdays-today') }
var eNotif = $(data).find('notif')
if (eNotif.children("note").length==0){

View file

@ -158,6 +158,8 @@ class HTML5_TreeBuilder {
if ($this->ignore_lf_token) $this->ignore_lf_token--;
$this->ignored = false;
$token['name'] = str_replace(':', '-', $token['name']);
// indenting is a little wonky, this can be changed later on
switch ($mode) {

View file

@ -254,7 +254,7 @@ function admin_page_site_post(&$a){
$force_publish = ((x($_POST,'publish_all')) ? True : False);
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
$thread_allow = ((x($_POST,'thread_allow')) ? True : False);
$newuser_public = ((x($_POST,'newuser_public')) ? True : False);
$newuser_private = ((x($_POST,'newuser_private')) ? True : False);
$no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
$no_openid = !((x($_POST,'no_openid')) ? True : False);
$no_regfullname = !((x($_POST,'no_regfullname')) ? True : False);
@ -355,7 +355,7 @@ function admin_page_site_post(&$a){
set_config('system','directory_submit_url', $global_directory);
}
set_config('system','thread_allow', $thread_allow);
set_config('system','newuser_public', $newuser_public);
set_config('system','newuser_private', $newuser_private);
set_config('system','block_extended_register', $no_multi_reg);
set_config('system','no_openid', $no_openid);
@ -467,14 +467,14 @@ function admin_page_site(&$a) {
'$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
'$global_directory' => array('directory_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), t("URL to update the global directory. If this is not set, the global directory is completely unavailable to the application.")),
'$thread_allow' => array('thread_allow', t("Allow threaded items"), get_config('system','thread_allow'), t("Allow infinite level threading for items on this site.")),
'$newuser_public' => array('newuser_public', t("No default permissions for new users"), get_config('system','newuser_public'), t("New users will have no private permissions set for their posts by default, making their posts public until they change it.")),
'$newuser_private' => array('newuser_private', t("Private posts by default for new users"), get_config('system','newuser_private'), t("Set default post permissions for all new members to the default privacy group rather than public.")),
'$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")),
'$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
'$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), t("Display a Community page showing all recent public postings on this site.")),
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disable'), t("Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
'$diaspora_enabled' => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), t("Provide built-in Diaspora network compatibility.")),
'$dfrn_only' => array('dfrn_only', t('Only allow Friendica contacts'), get_config('system','dfrn_only'), t("All contacts must use Friendica protocols. All other built-in communication protocols disabled.")),
'$verifyssl' => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), t("If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.")),
@ -664,6 +664,7 @@ function admin_page_users(&$a){
);
function _setup_users($e){
$a = get_app();
$accounts = Array(
t('Normal Account'),
t('Soapbox Account'),
@ -674,6 +675,7 @@ function admin_page_users(&$a){
$e['register_date'] = relative_date($e['register_date']);
$e['login_date'] = relative_date($e['login_date']);
$e['lastitem_date'] = relative_date($e['lastitem_date']);
$e['is_admin'] = ($e['email'] === $a->config['admin_email']);
return $e;
}
$users = array_map("_setup_users", $users);
@ -694,6 +696,7 @@ function admin_page_users(&$a){
'$delete' => t('Delete'),
'$block' => t('Block'),
'$unblock' => t('Unblock'),
'$siteadmin' => t('Site admin'),
'$h_users' => t('Users'),
'$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Account') ),

View file

@ -584,6 +584,8 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
if (!$comments_collapsed){
$threads[$threadsid]['num_comments'] = sprintf( tt('%d comment','%d comments',$comments[$item['parent']]),$comments[$item['parent']] );
$threads[$threadsid]['hidden_comments_num'] = $comments[$item['parent']];
$threads[$threadsid]['hidden_comments_text'] = tt('comment', 'comments', $comments[$item['parent']]);
$threads[$threadsid]['hide_text'] = t('show more');
$comments_collapsed = true;
$comment_firstcollapsed = true;

View file

@ -133,6 +133,7 @@ function editpost_content(&$a) {
'$preview' => t('Preview'),
'$jotplugins' => $jotplugins,
'$sourceapp' => t($a->sourcename),
'$cancel' => t('Cancel')
));
return $o;

View file

@ -141,6 +141,20 @@ function events_content(&$a) {
return;
}
if(($a->argc > 2) && ($a->argv[1] === 'ignore') && intval($a->argv[2])) {
$r = q("update event set ignore = 1 where id = %d and uid = %d limit 1",
intval($a->argv[2]),
intval(local_user())
);
}
if(($a->argc > 2) && ($a->argv[1] === 'unignore') && intval($a->argv[2])) {
$r = q("update event set ignore = 0 where id = %d and uid = %d limit 1",
intval($a->argv[2]),
intval(local_user())
);
}
$htpl = get_markup_template('event_head.tpl');
$a->page['htmlhead'] .= replace_macros($htpl,array('$baseurl' => $a->get_baseurl()));
@ -157,6 +171,7 @@ function events_content(&$a) {
$mode = 'view';
$y = 0;
$m = 0;
$ignored = ((x($_REQUEST,'ignored')) ? intval($_REQUEST['ignored']) : 0);
if($a->argc > 1) {
if($a->argc > 2 && $a->argv[1] == 'event') {
@ -234,10 +249,11 @@ function events_content(&$a) {
} else {
$r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
`item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id`
WHERE `event`.`uid` = %d
WHERE `event`.`uid` = %d and event.ignore = %d
AND (( `adjust` = 0 AND `finish` >= '%s' AND `start` <= '%s' )
OR ( `adjust` = 1 AND `finish` >= '%s' AND `start` <= '%s' )) ",
intval(local_user()),
intval($ignored),
dbesc($start),
dbesc($finish),
dbesc($adjust_start),

View file

@ -46,7 +46,7 @@ function fbrowser_content($a){
}
$r = q("SELECT `resource-id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `desc`
FROM `photo` WHERE `uid` = %d $sql_extra
FROM `photo` WHERE `uid` = %d AND (height <= 320 AND width <= 320) $sql_extra
GROUP BY `resource-id` $sql_extra2",
intval(local_user())
);

View file

@ -373,8 +373,8 @@ function item_post(&$a) {
$match = null;
if((! $preview) && preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
$images = $match[1];
if((! $preview) && preg_match_all("/\[img([\=0-9x]*?)\](.*?)\[\/img\]/",$body,$match)) {
$images = $match[2];
if(count($images)) {
foreach($images as $image) {
if(! stristr($image,$a->get_baseurl() . '/photo/'))

View file

@ -471,7 +471,7 @@ function network_content(&$a, $update = 0) {
}
}
if((! $group) && (! $cid) && (! $update)) {
if((! $group) && (! $cid) && (! $update) && (! get_config('theme','hide_eventlist'))) {
$o .= get_birthdays();
$o .= get_events();
}

View file

@ -69,7 +69,7 @@ function newmember_content(&$a) {
$o .= '<li>' . '<a target="newmember" href="contacts">' . t('Group Your Contacts') . '</a><br />' . t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '</li>' . EOL;
if(! get_config('system', 'newuser_public')) {
if(get_config('system', 'newuser_private')) {
$o .= '<li>' . '<a target="newmember" href="help/Groups-and-Privacy">' . t("Why Aren't My Posts Public?") . '</a><br />' . t("Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above.") . '</li>' . EOL;
}

View file

@ -307,16 +307,26 @@ function parse_url_content(&$a) {
$image = "";
if(sizeof($siteinfo["images"]) > 0){
/*
Execute below code only if image is present in siteinfo
*/
foreach ($siteinfo["images"] as $imagedata)
if($textmode)
$image .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]';
if(sizeof($siteinfo["images"]) > 0){
/* Execute below code only if image is present in siteinfo */
$total_images = 0;
$max_images = get_config('system','max_bookmark_images');
if($max_images === false)
$max_images = 2;
else
$image .= '<img height="'.$imagedata["height"].'" width="'.$imagedata["width"].'" src="'.$imagedata["src"].'" alt="photo" />';
$max_images = intval($max_images);
foreach ($siteinfo["images"] as $imagedata) {
if($textmode)
$image .= '[img='.$imagedata["width"].'x'.$imagedata["height"].']'.$imagedata["src"].'[/img]' . "\n";
else
$image .= '<img height="'.$imagedata["height"].'" width="'.$imagedata["width"].'" src="'.$imagedata["src"].'" alt="photo" /><br />';
$total_images ++;
if($max_images && $max_images >= $total_images)
break;
}
}
if(strlen($text)) {
if($textmode)

View file

@ -55,6 +55,7 @@ function ping_init(&$a) {
$dislikes = array();
$friends = array();
$posts = array();
$home = 0;
$network = 0;
@ -140,6 +141,48 @@ function ping_init(&$a) {
$register = "0";
}
$all_events = 0;
$all_events_today = 0;
$events = 0;
$events_today = 0;
$birthdays = 0;
$birthdays_today = 0;
$ev = q("SELECT count(`event`.`id`) as total, type, start, adjust FROM `event`
WHERE `event`.`uid` = %d AND `start` < '%s' AND `finish` > '%s' and `ignore` = 0
ORDER BY `start` ASC ",
intval(local_user()),
dbesc(datetime_convert('UTC','UTC','now + 7 days')),
dbesc(datetime_convert('UTC','UTC','now'))
);
if($ev && count($ev)) {
$all_events = intval($ev[0]['total']);
if($all_events) {
$str_now = datetime_convert('UTC',$a->timezone,'now','Y-m-d');
foreach($ev as $x) {
$bd = false;
if($x['type'] === 'birthday') {
$birthdays ++;
$bd = true;
}
else {
$events ++;
}
if(datetime_convert('UTC',((intval($x['adjust'])) ? $a->timezone : 'UTC'), $x['start'],'Y-m-d') === $str_now) {
$all_events_today ++;
if($bd)
$birthdays_today ++;
else
$events_today ++;
}
}
}
}
function xmlize($href, $name, $url, $photo, $date, $seen, $message){
$data = array('href' => &$href, 'name' => &$name, 'url'=>&$url, 'photo'=>&$photo, 'date'=>&$date, 'seen'=>&$seen, 'messsage'=>&$message);
@ -153,9 +196,16 @@ function ping_init(&$a) {
echo "<intro>$intro</intro>
<mail>$mail</mail>
<net>$network</net>
<home>$home</home>";
<home>$home</home>\r\n";
if ($register!=0) echo "<register>$register</register>";
echo "<all-events>$all_events</all-events>
<all-events-today>$all_events_today</all-events-today>
<events>$events</events>
<events-today>$events_today</events-today>
<birthdays>$birthdays</birthdays>
<birthdays-today>$birthdays_today</birthdays-today>\r\n";
$tot = $mail+$intro+$register+count($comments)+count($likes)+count($dislikes)+count($friends)+count($posts)+count($tags);
require_once('include/bbcode.php');

View file

@ -304,7 +304,7 @@ function profile_content(&$a, $update = 0) {
$items = array();
}
if($is_owner && ! $update) {
if($is_owner && (! $update) && (! get_config('theme','hide_eventlist'))) {
$o .= get_birthdays();
$o .= get_events();
}

View file

@ -24,6 +24,20 @@ function profile_photo_post(&$a) {
if((x($_POST,'cropfinal')) && ($_POST['cropfinal'] == 1)) {
// unless proven otherwise
$is_default_profile = 1;
if($_REQUEST['profile']) {
$r = q("select id, `is-default` from profile where id = %d and uid = %d limit 1",
intval($_REQUEST['profile']),
intval(local_user())
);
if(count($r) && (! intval($r[0]['is-default'])))
$is_default_profile = 0;
}
// phase 2 - we have finished cropping
if($a->argc != 2) {
@ -57,31 +71,44 @@ function profile_photo_post(&$a) {
if($im->is_valid()) {
$im->cropImage(175,$srcX,$srcY,$srcW,$srcH);
$r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 4, 1);
$r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 4, $is_default_profile);
if($r === false)
notice ( sprintf(t('Image size reduction [%s] failed.'),"175") . EOL );
$im->scaleImage(80);
$r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 5, 1);
$r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 5, $is_default_profile);
if($r === false)
notice( sprintf(t('Image size reduction [%s] failed.'),"80") . EOL );
$im->scaleImage(48);
$r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 6, 1);
$r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 6, $is_default_profile);
if($r === false)
notice( sprintf(t('Image size reduction [%s] failed.'),"48") . EOL );
// Unset the profile photo flag from any other photos I own
// If setting for the default profile, unset the profile photo flag from any other photos I own
$r = q("UPDATE `photo` SET `profile` = 0 WHERE `profile` = 1 AND `resource-id` != '%s' AND `uid` = %d",
dbesc($base_image['resource-id']),
intval(local_user())
);
if($is_default_profile) {
$r = q("UPDATE `photo` SET `profile` = 0 WHERE `profile` = 1 AND `resource-id` != '%s' AND `uid` = %d",
dbesc($base_image['resource-id']),
intval(local_user())
);
}
else {
$r = q("update profile set photo = '%s', thumb = '%s' where id = %d and uid = %d limit 1",
dbesc($a->get_baseurl() . '/photo/' . $base_image['resource-id'] . '-4'),
dbesc($a->get_baseurl() . '/photo/' . $base_image['resource-id'] . '-5'),
intval($_REQUEST['profile']),
intval(local_user())
);
}
// we'll set the updated profile-photo timestamp even if it isn't the default profile,
// so that browsers will do a cache update unconditionally
$r = q("UPDATE `contact` SET `avatar-date` = '%s' WHERE `self` = 1 AND `uid` = %d LIMIT 1",
dbesc(datetime_convert()),
@ -201,6 +228,11 @@ function profile_photo_content(&$a) {
// go ahead as we have jus uploaded a new photo to crop
}
$profiles = q("select `id`,`profile-name` as `name`,`is-default` as `default` from profile where uid = %d",
intval(local_user())
);
if(! x($a->config,'imagecrop')) {
$tpl = get_markup_template('profile_photo.tpl');
@ -208,8 +240,10 @@ function profile_photo_content(&$a) {
$o .= replace_macros($tpl,array(
'$user' => $a->user['nickname'],
'$lbl_upfile' => t('Upload File:'),
'$lbl_profiles' => t('Select a profile:'),
'$title' => t('Upload Profile Photo'),
'$submit' => t('Upload'),
'$profiles' => $profiles,
'$form_security_token' => get_form_security_token("profile_photo"),
'$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . $a->get_baseurl() . '">' . t('skip this step') . '</a>' : '<a href="'. $a->get_baseurl() . '/photos/' . $a->user['nickname'] . '">' . t('select a photo from your photo albums') . '</a>')
));
@ -222,6 +256,7 @@ function profile_photo_content(&$a) {
$tpl = get_markup_template("cropbody.tpl");
$o .= replace_macros($tpl,array(
'$filename' => $filename,
'$profile' => intval($_REQUEST['profile']),
'$resource' => $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'],
'$image_url' => $a->get_baseurl() . '/photo/' . $filename,
'$title' => t('Crop Image'),
@ -236,7 +271,7 @@ function profile_photo_content(&$a) {
}}
if(! function_exists('_crop_ui_head')) {
if(! function_exists('profile_photo_crop_ui_head')) {
function profile_photo_crop_ui_head(&$a, $ph){
$max_length = get_config('system','max_image_length');
if(! $max_length)

17
mod/toggle_mobile.php Normal file
View file

@ -0,0 +1,17 @@
<?php
function toggle_mobile_init(&$a) {
if(isset($_GET['off']))
$_SESSION['show-mobile'] = false;
else
$_SESSION['show-mobile'] = true;
if(isset($_GET['address']))
$address = $_GET['address'];
else
$address = $a->get_baseurl();
goaway($address);
}

37
object/BaseObject.php Normal file
View file

@ -0,0 +1,37 @@
<?php
if(class_exists('BaseObject'))
return;
require_once('boot.php');
/**
* Basic object
*
* Contains what is usefull to any object
*/
class BaseObject {
private static $app = null;
/**
* Get the app
*
* Same as get_app from boot.php
*/
public function get_app() {
if(self::$app)
return self::$app;
global $a;
self::$app = $a;
return self::$app;
}
/**
* Set the app
*/
public static function set_app($app) {
self::$app = $app;
}
}
?>

162
object/Conversation.php Normal file
View file

@ -0,0 +1,162 @@
<?php
if(class_exists('Conversation'))
return;
require_once('boot.php');
require_once('object/BaseObject.php');
require_once('object/Item.php');
require_once('include/text.php');
/**
* A list of threads
*
* We should think about making this a SPL Iterator
*/
class Conversation extends BaseObject {
private $threads = array();
private $mode = null;
private $writable = false;
private $profile_owner = 0;
private $preview = false;
public function __construct($mode, $preview) {
$this->set_mode($mode);
$this->preview = $preview;
}
/**
* Set the mode we'll be displayed on
*/
private function set_mode($mode) {
if($this->get_mode() == $mode)
return;
$a = $this->get_app();
switch($mode) {
case 'network':
case 'notes':
$this->profile_owner = local_user();
$this->writable = true;
break;
case 'profile':
$this->profile_owner = $a->profile['profile_uid'];
$this->writable = can_write_wall($a,$this->profile_owner);
break;
case 'display':
$this->profile_owner = $a->profile['uid'];
$this->writable = can_write_wall($a,$this->profile_owner);
break;
default:
logger('[ERROR] Conversation::set_mode : Unhandled mode ('. $mode .').', LOGGER_DEBUG);
return false;
break;
}
$this->mode = $mode;
}
/**
* Get mode
*/
public function get_mode() {
return $this->mode;
}
/**
* Check if page is writable
*/
public function is_writable() {
return $this->writable;
}
/**
* Check if page is a preview
*/
public function is_preview() {
return $this->preview;
}
/**
* Get profile owner
*/
public function get_profile_owner() {
return $this->profile_owner;
}
/**
* Add a thread to the conversation
*
* Returns:
* _ The inserted item on success
* _ false on failure
*/
public function add_thread($item) {
$item_id = $item->get_id();
if(!$item_id) {
logger('[ERROR] Conversation::add_thread : Item has no ID!!', LOGGER_DEBUG);
return false;
}
if($this->get_thread($item->get_id())) {
logger('[WARN] Conversation::add_thread : Thread already exists ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
/*
* Only add will be displayed
*/
if($item->get_data_value('network') === NETWORK_MAIL && local_user() != $item->get_data_value('uid')) {
logger('[WARN] Conversation::add_thread : Thread is a mail ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
if($item->get_data_value('verb') === ACTIVITY_LIKE || $item->get_data_value('verb') === ACTIVITY_DISLIKE) {
logger('[WARN] Conversation::add_thread : Thread is a (dis)like ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
$item->set_conversation($this);
$this->threads[] = $item;
return end($this->threads);
}
/**
* Get data in a form usable by a conversation template
*
* We should find a way to avoid using those arguments (at least most of them)
*
* Returns:
* _ The data requested on success
* _ false on failure
*/
public function get_template_data($alike, $dlike) {
$result = array();
foreach($this->threads as $item) {
if($item->get_data_value('network') === NETWORK_MAIL && local_user() != $item->get_data_value('uid'))
continue;
$item_data = $item->get_template_data($alike, $dlike);
if(!$item_data) {
logger('[ERROR] Conversation::get_template_data : Failed to get item template data ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
$result[] = $item_data;
}
return $result;
}
/**
* Get a thread based on its item id
*
* Returns:
* _ The found item on success
* _ false on failure
*/
private function get_thread($id) {
foreach($this->threads as $item) {
if($item->get_id() == $id)
return $item;
}
return false;
}
}
?>

640
object/Item.php Normal file
View file

@ -0,0 +1,640 @@
<?php
if(class_exists('Item'))
return;
require_once('object/BaseObject.php');
require_once('include/text.php');
require_once('boot.php');
/**
* An item
*/
class Item extends BaseObject {
private $data = array();
private $template = null;
private $available_templates = array(
'wall' => 'wall_thread.tpl',
'wall2wall' => 'wallwall_thread.tpl'
);
private $comment_box_template = 'comment_item.tpl';
private $toplevel = false;
private $writable = false;
private $children = array();
private $parent = null;
private $conversation = null;
private $redirect_url = null;
private $owner_url = '';
private $owner_photo = '';
private $owner_name = '';
private $wall_to_wall = false;
private $threaded = false;
private $visiting = false;
public function __construct($data) {
$a = $this->get_app();
$this->data = $data;
$this->set_template('wall');
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
if(is_array($_SESSION['remote'])) {
foreach($_SESSION['remote'] as $visitor) {
if($visitor['cid'] == $this->get_data_value('contact-id')) {
$this->visiting = true;
break;
}
}
}
$this->writable = ($this->get_data_value('writable') || $this->get_data_value('self'));
$ssl_state = ((local_user()) ? true : false);
$this->redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $this->get_data_value('cid') ;
if(get_config('system','thread_allow') && $a->theme_thread_allow && !$this->is_toplevel())
$this->threaded = true;
// Prepare the children
if(count($data['children'])) {
foreach($data['children'] as $item) {
/*
* Only add will be displayed
*/
if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
continue;
}
if($item['verb'] === ACTIVITY_LIKE || $item['verb'] === ACTIVITY_DISLIKE) {
continue;
}
$child = new Item($item);
$this->add_child($child);
}
}
}
/**
* Get data in a form usable by a conversation template
*
* Returns:
* _ The data requested on success
* _ false on failure
*/
public function get_template_data($alike, $dlike, $thread_level=1) {
$result = array();
$a = $this->get_app();
$item = $this->get_data();
$commentww = '';
$sparkle = '';
$buttons = '';
$dropping = false;
$star = false;
$isstarred = "unstarred";
$indent = '';
$osparkle = '';
$total_children = $this->count_descendants();
$conv = $this->get_conversation();
$lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
? t('Private Message')
: false);
$shareable = ((($conv->get_profile_owner() == local_user()) && ($item['private'] != 1)) ? true : false);
if(local_user() && link_compare($a->contact['url'],$item['author-link']))
$edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit"));
else
$edpost = false;
if(($this->get_data_value('uid') == local_user()) || $this->is_visiting())
$dropping = true;
$drop = array(
'dropping' => $dropping,
'select' => t('Select'),
'delete' => t('Delete'),
);
$filer = (($conv->get_profile_owner() == local_user()) ? t("save to folder") : false);
$diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true);
$profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
if($item['author-link'] && (! $item['author-name']))
$profile_name = $item['author-link'];
$sp = false;
$profile_link = best_link_url($item,$sp);
if($profile_link === 'mailbox')
$profile_link = '';
if($sp)
$sparkle = ' sparkle';
else
$profile_link = zrl($profile_link);
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
$profile_avatar = $a->contacts[$normalised]['thumb'];
else
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($this->get_data_value('thumb')));
$locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
call_hooks('render_location',$locate);
$location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
$tags=array();
foreach(explode(',',$item['tag']) as $tag){
$tag = trim($tag);
if ($tag!="") $tags[] = bbcode($tag);
}
$like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
$dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');
/*
* We should avoid doing this all the time, but it depends on the conversation mode
* And the conv mode may change when we change the conv, or it changes its mode
* Maybe we should establish a way to be notified about conversation changes
*/
$this->check_wall_to_wall();
if($this->is_wall_to_wall() && ($this->get_owner_url() == $this->get_redirect_url()))
$osparkle = ' sparkle';
if($this->is_toplevel()) {
if($conv->get_profile_owner() == local_user()) {
$isstarred = (($item['starred']) ? "starred" : "unstarred");
$star = array(
'do' => t("add star"),
'undo' => t("remove star"),
'toggle' => t("toggle star status"),
'classdo' => (($item['starred']) ? "hidden" : ""),
'classundo' => (($item['starred']) ? "" : "hidden"),
'starred' => t('starred'),
'tagger' => t("add tag"),
'classtagger' => "",
);
}
} else {
$indent = 'comment';
}
if($conv->is_writable()) {
$buttons = array(
'like' => array( t("I like this \x28toggle\x29"), t("like")),
'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")),
);
if ($shareable) $buttons['share'] = array( t('Share this'), t('share'));
}
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
$indent .= ' shiny';
localize_item($item);
$body = prepare_body($item,true);
$tmp_item = array(
'template' => $this->get_template(),
'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
'tags' => $tags,
'body' => template_escape($body),
'text' => strip_tags(template_escape($body)),
'id' => $this->get_id(),
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $this->get_owner_name(), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
'to' => t('to'),
'wall' => t('Wall-to-Wall'),
'vwall' => t('via Wall-To-Wall:'),
'profile_url' => $profile_link,
'item_photo_menu' => item_photo_menu($item),
'name' => template_escape($profile_name),
'thumb' => $profile_avatar,
'osparkle' => $osparkle,
'sparkle' => $sparkle,
'title' => template_escape($item['title']),
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
'lock' => $lock,
'location' => template_escape($location),
'indent' => $indent,
'owner_url' => $this->get_owner_url(),
'owner_photo' => $this->get_owner_photo(),
'owner_name' => template_escape($this->get_owner_name()),
'plink' => get_plink($item),
'edpost' => $edpost,
'isstarred' => $isstarred,
'star' => $star,
'filer' => $filer,
'drop' => $drop,
'vote' => $buttons,
'like' => $like,
'dislike' => $dislike,
'comment' => $this->get_comment_box($indent),
'previewing' => ($conv->is_preview() ? ' preview ' : ''),
'wait' => t('Please wait'),
'thread_level' => $thread_level
);
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
$result = $arr['output'];
$result['children'] = array();
$children = $this->get_children();
$nb_children = count($children);
if($nb_children > 0) {
foreach($children as $child) {
$result['children'][] = $child->get_template_data($alike, $dlike, $thread_level + 1);
}
// Collapse
if(($nb_children > 2) || ($thread_level > 1)) {
$result['children'][0]['comment_firstcollapsed'] = true;
$result['children'][0]['num_comments'] = sprintf( tt('%d comment','%d comments',$total_children),$total_children );
$result['children'][0]['hidden_comments_num'] = $total_children;
$result['children'][0]['hidden_comments_text'] = tt('comment', 'comments', $total_children);
$result['children'][0]['hide_text'] = t('show more');
if($thread_level > 1) {
$result['children'][$nb_children - 1]['comment_lastcollapsed'] = true;
}
else {
$result['children'][$nb_children - 3]['comment_lastcollapsed'] = true;
}
}
}
$result['private'] = $item['private'];
$result['toplevel'] = ($this->is_toplevel() ? 'toplevel_item' : '');
if($this->is_threaded()) {
$result['flatten'] = false;
$result['threaded'] = true;
}
else {
$result['flatten'] = true;
$result['threaded'] = false;
}
return $result;
}
public function get_id() {
return $this->get_data_value('id');
}
public function is_threaded() {
return $this->threaded;
}
/**
* Add a child item
*/
public function add_child($item) {
$item_id = $item->get_id();
if(!$item_id) {
logger('[ERROR] Item::add_child : Item has no ID!!', LOGGER_DEBUG);
return false;
}
if($this->get_child($item->get_id())) {
logger('[WARN] Item::add_child : Item already exists ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
/*
* Only add what will be displayed
*/
if($item->get_data_value('network') === NETWORK_MAIL && local_user() != $item->get_data_value('uid')) {
logger('[WARN] Item::add_child : Item is a mail ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
if($item->get_data_value('verb') === ACTIVITY_LIKE || $item->get_data_value('verb') === ACTIVITY_DISLIKE) {
logger('[WARN] Item::add_child : Item is a (dis)like ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
}
$item->set_parent($this);
$this->children[] = $item;
return end($this->children);
}
/**
* Get a child by its ID
*/
public function get_child($id) {
foreach($this->get_children() as $child) {
if($child->get_id() == $id)
return $child;
}
return null;
}
/**
* Get all ou children
*/
public function get_children() {
return $this->children;
}
/**
* Set our parent
*/
protected function set_parent($item) {
$parent = $this->get_parent();
if($parent) {
$parent->remove_child($this);
}
$this->parent = $item;
$this->set_conversation($item->get_conversation());
}
/**
* Remove our parent
*/
protected function remove_parent() {
$this->parent = null;
$this->conversation = null;
}
/**
* Remove a child
*/
public function remove_child($item) {
$id = $item->get_id();
foreach($this->get_children() as $key => $child) {
if($child->get_id() == $id) {
$child->remove_parent();
unset($this->children[$key]);
// Reindex the array, in order to make sure there won't be any trouble on loops using count()
$this->children = array_values($this->children);
return true;
}
}
logger('[WARN] Item::remove_child : Item is not a child ('. $id .').', LOGGER_DEBUG);
return false;
}
/**
* Get parent item
*/
protected function get_parent() {
return $this->parent;
}
/**
* set conversation
*/
public function set_conversation($conv) {
$previous_mode = ($this->conversation ? $this->conversation->get_mode() : '');
$this->conversation = $conv;
// Set it on our children too
foreach($this->get_children() as $child)
$child->set_conversation($conv);
}
/**
* get conversation
*/
public function get_conversation() {
return $this->conversation;
}
/**
* Get raw data
*
* We shouldn't need this
*/
public function get_data() {
return $this->data;
}
/**
* Get a data value
*
* Returns:
* _ value on success
* _ false on failure
*/
public function get_data_value($name) {
if(!isset($this->data[$name])) {
logger('[ERROR] Item::get_data_value : Item has no value name "'. $name .'".', LOGGER_DEBUG);
return false;
}
return $this->data[$name];
}
/**
* Set template
*/
private function set_template($name) {
if(!x($this->available_templates, $name)) {
logger('[ERROR] Item::set_template : Template not available ("'. $name .'").', LOGGER_DEBUG);
return false;
}
$this->template = $this->available_templates[$name];
}
/**
* Get template
*/
private function get_template() {
return $this->template;
}
/**
* Check if this is a toplevel post
*/
private function is_toplevel() {
return $this->toplevel;
}
/**
* Check if this is writable
*/
private function is_writable() {
$conv = $this->get_conversation();
if($conv) {
// This will allow us to comment on wall-to-wall items owned by our friends
// and community forums even if somebody else wrote the post.
return ($this->writable || ($this->is_visiting() && $conv->get_mode() == 'profile'));
}
return $this->writable;
}
/**
* Count the total of our descendants
*/
private function count_descendants() {
$children = $this->get_children();
$total = count($children);
if($total > 0) {
foreach($children as $child) {
$total += $child->count_descendants();
}
}
return $total;
}
/**
* Get the template for the comment box
*/
private function get_comment_box_template() {
return $this->comment_box_template;
}
/**
* Get the comment box
*
* Returns:
* _ The comment box string (empty if no comment box)
* _ false on failure
*/
private function get_comment_box($indent) {
if(!$this->is_toplevel() && !get_config('system','thread_allow')) {
return '';
}
$comment_box = '';
$conv = $this->get_conversation();
$template = get_markup_template($this->get_comment_box_template());
$ww = '';
if( ($conv->get_mode() === 'network') && $this->is_wall_to_wall() )
$ww = 'ww';
if($conv->is_writable() && $this->is_writable()) {
$a = $this->get_app();
$qc = $qcomment = null;
/*
* Hmmm, code depending on the presence of a particular plugin?
* This should be better if done by a hook
*/
if(in_array('qcomment',$a->plugins)) {
$qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null);
$qcomment = (($qc) ? explode("\n",$qc) : null);
}
$comment_box = replace_macros($template,array(
'$return_path' => '',
'$threaded' => $this->is_threaded(),
'$jsreload' => (($conv->get_mode() === 'display') ? $_SESSION['return_url'] : ''),
'$type' => (($conv->get_mode() === 'profile') ? 'wall-comment' : 'net-comment'),
'$id' => $this->get_id(),
'$parent' => $this->get_id(),
'$qcomment' => $qcomment,
'$profile_uid' => $conv->get_profile_owner(),
'$mylink' => $a->contact['url'],
'$mytitle' => t('This is you'),
'$myphoto' => $a->contact['thumb'],
'$comment' => t('Comment'),
'$submit' => t('Submit'),
'$edbold' => t('Bold'),
'$editalic' => t('Italic'),
'$eduline' => t('Underline'),
'$edquote' => t('Quote'),
'$edcode' => t('Code'),
'$edimg' => t('Image'),
'$edurl' => t('Link'),
'$edvideo' => t('Video'),
'$preview' => t('Preview'),
'$indent' => $indent,
'$sourceapp' => t($a->sourcename),
'$ww' => (($conv->get_mode() === 'network') ? $ww : '')
));
}
return $comment_box;
}
private function get_redirect_url() {
return $this->redirect_url;
}
/**
* Check if we are a wall to wall item and set the relevant properties
*/
protected function check_wall_to_wall() {
$a = $this->get_app();
$conv = $this->get_conversation();
$this->wall_to_wall = false;
if($this->is_toplevel()) {
if( (! $this->get_data_value('self')) && ($conv->get_mode() !== 'profile')) {
if($this->get_data_value('wall')) {
// On the network page, I am the owner. On the display page it will be the profile owner.
// This will have been stored in $a->page_contact by our calling page.
// Put this person as the wall owner of the wall-to-wall notice.
$this->owner_url = zrl($a->page_contact['url']);
$this->owner_photo = $a->page_contact['thumb'];
$this->owner_name = $a->page_contact['name'];
$this->set_template('wall2wall');
$this->wall_to_wall = true;
}
else if($this->get_data_value('owner-link')) {
$owner_linkmatch = (($this->get_data_value('owner-link')) && link_compare($this->get_data_value('owner-link'),$this->get_data_value('author-link')));
$alias_linkmatch = (($this->get_data_value('alias')) && link_compare($this->get_data_value('alias'),$this->get_data_value('author-link')));
$owner_namematch = (($this->get_data_value('owner-name')) && $this->get_data_value('owner-name') == $this->get_data_value('author-name'));
if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
// The author url doesn't match the owner (typically the contact)
// and also doesn't match the contact alias.
// The name match is a hack to catch several weird cases where URLs are
// all over the park. It can be tricked, but this prevents you from
// seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
// well that it's the same Bob Smith.
// But it could be somebody else with the same name. It just isn't highly likely.
$this->owner_photo = $this->get_data_value('owner-avatar');
$this->owner_name = $this->get_data_value('owner-name');
$this->set_template('wall2wall');
$this->wall_to_wall = true;
// If it is our contact, use a friendly redirect link
if((link_compare($this->get_data_value('owner-link'),$this->get_data_value('url')))
&& ($this->get_data_value('network') === NETWORK_DFRN)) {
$this->owner_url = $this->get_redirect_url();
}
else
$this->owner_url = zrl($this->get_data_value('owner-link'));
}
}
}
}
if(!$this->wall_to_wall) {
$this->set_template('wall');
$this->owner_url = '';
$this->owner_photo = '';
$this->owner_name = '';
}
}
private function is_wall_to_wall() {
return $this->wall_to_wall;
}
private function get_owner_url() {
return $this->owner_url;
}
private function get_owner_photo() {
return $this->owner_photo;
}
private function get_owner_name() {
return $this->owner_name;
}
private function is_visiting() {
return $this->visiting;
}
}
?>

View file

@ -1,6 +1,6 @@
<?php
define( 'UPDATE_VERSION' , 1154 );
define( 'UPDATE_VERSION' , 1156 );
/**
*
@ -1343,3 +1343,22 @@ function update_1153() {
if(!$r) return UPDATE_FAILED;
return UPDATE_SUCCESS;
}
function update_1154() {
$r = q("ALTER TABLE `event` ADD `ignore` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `adjust` , ADD INDEX ( `ignore` )");
if(!$r) return UPDATE_FAILED;
return UPDATE_SUCCESS;
}
function update_1155() {
$r1 = q("ALTER TABLE `item_id` DROP PRIMARY KEY");
$r2 = q("ALTER TABLE `item_id` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST");
$r3 = q("ALTER TABLE `item_id` ADD INDEX ( `iid` ) ");
if($r1 && $r2 && $r3)
return UPDATE_SUCCESS;
return UPDATE_FAILED;
}

File diff suppressed because it is too large Load diff

View file

@ -76,7 +76,7 @@
{{ inc field_checkbox.tpl with $field=$dfrn_only }}{{ endinc }}
{{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$thread_allow }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$newuser_public }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$newuser_private }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -70,11 +70,20 @@
<td class='register_date'>$u.register_date</td>
<td class='login_date'>$u.login_date</td>
<td class='lastitem_date'>$u.lastitem_date</td>
<td class='login_date'>$u.page-flags</td>
<td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_$u.uid" name="user[]" value="$u.uid"/></td>
<td class='login_date'>$u.page-flags {{ if $u.is_admin }}($siteadmin){{ endif }}</td>
<td class="checkbox">
{{ if $u.is_admin }}
&nbsp;
{{ else }}
<input type="checkbox" class="users_ckbx" id="id_user_$u.uid" name="user[]" value="$u.uid"/></td>
{{ endif }}
<td class="tools">
<a href="$baseurl/admin/users/block/$u.uid?t=$form_security_token" title='{{ if $u.blocked }}$unblock{{ else }}$block{{ endif }}'><span class='icon block {{ if $u.blocked==0 }}dim{{ endif }}'></span></a>
<a href="$baseurl/admin/users/delete/$u.uid?t=$form_security_token" title='$delete' onclick="return confirm_delete('$u.name')"><span class='icon drop'></span></a>
{{ if $u.is_admin }}
&nbsp;
{{ else }}
<a href="$baseurl/admin/users/block/$u.uid?t=$form_security_token" title='{{ if $u.blocked }}$unblock{{ else }}$block{{ endif }}'><span class='icon block {{ if $u.blocked==0 }}dim{{ endif }}'></span></a>
<a href="$baseurl/admin/users/delete/$u.uid?t=$form_security_token" title='$delete' onclick="return confirm_delete('$u.name')"><span class='icon drop'></span></a>
{{ endif }}
</td>
</tr>
{{ endfor }}

View file

@ -1,10 +1,9 @@
{{ if $threaded }}
<div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-$id" style="display: block;">
{{ else }}
<div class="comment-wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
{{ if $threaded }}
<span id="hide-commentbox-$id" class="hide-commentbox fakelink" onclick="showHideCommentBox($id);">$comment</span>
<form class="comment-edit-form" style="display: none;" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
{{ else }}
{{ endif }}
<form class="comment-edit-form" style="display: block;" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
{{ endif }}
<input type="hidden" name="type" value="$type" />
<input type="hidden" name="profile_uid" value="$profile_uid" />
<input type="hidden" name="parent" value="$parent" />

View file

@ -42,6 +42,7 @@ $desc
<form action="profile_photo/$resource" id="crop-image-form" method="post" />
<input type='hidden' name='form_security_token' value='$form_security_token'>
<input type='hidden' name='profile' value='$profile'>
<input type="hidden" name="cropfinal" value="1" />
<input type="hidden" name="xstart" id="x1" />
<input type="hidden" name="ystart" id="y1" />

File diff suppressed because it is too large Load diff

View file

@ -92,6 +92,8 @@ $a->strings["or existing album name: "] = "oder existierender Albumname: ";
$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
$a->strings["Permissions"] = "Berechtigungen";
$a->strings["Edit Album"] = "Album bearbeiten";
$a->strings["Show Newest First"] = "Zeige neueste zuerst";
$a->strings["Show Oldest First"] = "Zeige älteste zuerst";
$a->strings["View Photo"] = "Fotos betrachten";
$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
$a->strings["Photo not available"] = "Foto nicht verfügbar";
@ -704,6 +706,7 @@ $a->strings["Shift-reload the page or clear browser cache if the new photo does
$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
$a->strings["Image exceeds size limit of %d"] = "Bildgröße überschreitet das Limit von %d";
$a->strings["Upload File:"] = "Datei hochladen:";
$a->strings["Select a profile:"] = "Profil auswählen";
$a->strings["Upload"] = "Hochladen";
$a->strings["skip this step"] = "diesen Schritt überspringen";
$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
@ -800,8 +803,8 @@ $a->strings["Global directory update URL"] = "URL für Updates beim weltweiten V
$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL für Update des globalen Verzeichnisses. Wenn nichts eingetragen ist, bleibt das globale Verzeichnis unerreichbar.";
$a->strings["Allow threaded items"] = "Erlaube Threads in Diskussionen";
$a->strings["Allow infinite level threading for items on this site."] = "Erlaube ein unendliches Level für Threads auf dieser Seite.";
$a->strings["No default permissions for new users"] = "Keine Standard-Zugriffsrechte für Beiträge neuer Nutzer";
$a->strings["New users will have no private permissions set for their posts by default, making their posts public until they change it."] = "Neue Benutzer werden keine Voreinstellungen für die Zugriffrechte haben, so dass ihre Beiträge öffentlich sind, bis sie es ändern.";
$a->strings["Private posts by default for new users"] = "Private Beiträge als Standard für neue Nutzer";
$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "Die Standard-Zugriffsrechte für neue Nutzer werden so gesetzt, dass als Voreinstellung in die private Gruppe gepostet wird anstelle von öffentlichen Beiträgen.";
$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";
@ -1113,6 +1116,11 @@ $a->strings["Cache Statistics"] = "Cache Statistik";
$a->strings["Number of items"] = "Anzahl der Einträge";
$a->strings["Size of the cache"] = "Größe des Caches";
$a->strings["Delete the whole cache"] = "Cache leeren";
$a->strings["Facebook Post disabled"] = "Nach Facebook senden deaktiviert";
$a->strings["Facebook Post"] = "Facebook Relai";
$a->strings["Install Facebook Post connector for this account."] = "Facebook-Connector für dieses Konto installieren.";
$a->strings["Remove Facebook Post connector"] = "Facebook-Connector entfernen";
$a->strings["Facebook Post Settings"] = "Facebook-Beitragseinstellungen";
$a->strings["%d person likes this"] = array(
0 => "%d Person mag das",
1 => "%d Leute mögen das",
@ -1132,11 +1140,10 @@ $a->strings["shag"] = "poppen";
$a->strings["shagged"] = "poppte";
$a->strings["do something obscenely biological to"] = "mit ihm/ihr etwas obszönes Körperliches machen";
$a->strings["did something obscenely biological to"] = "machte etwas obszönes Körperliches mit";
$a->strings["point out the new poke feature to"] = "die neue Anstups-Funktion zeigen";
$a->strings["pointed out the new poke feature to"] = "zeigte die neue Anstups-Funktion";
$a->strings["point out the poke feature to"] = "zeigte die neue Anstups-Funktion";
$a->strings["pointed out the poke feature to"] = "zeigte die neue Anstups-Funktion";
$a->strings["declare undying love for"] = "unterbliche Liebe verkünden";
$a->strings["declared undying love for"] = "verkündete unsterbliche Liebe für";
$a->strings["set fire to"] = "entflammt";
$a->strings["patent"] = "patentieren";
$a->strings["patented"] = "patentierte";
$a->strings["stroke beard"] = "sich den Bart kratzen";
@ -1463,6 +1470,19 @@ $a->strings["Enable InsaneJournal Post Plugin"] = "InsaneJournal Plugin aktivier
$a->strings["InsaneJournal username"] = "InsaneJournal Benutzername";
$a->strings["InsaneJournal password"] = "InsaneJournal Passwort";
$a->strings["Post to InsaneJournal by default"] = "Standardmäßig auf InsaneJournal posten.";
$a->strings["Jappix Mini addon settings"] = "Jappix Mini Addon Einstellungen";
$a->strings["Activate addon"] = "Addon aktivieren";
$a->strings["Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"] = "Füge das Jappix Mini Chat Widget <em>nicht</em> zum Webinterface hinzu";
$a->strings["Jabber username"] = "Jabber Nutzername";
$a->strings["Jabber server"] = "Jabber Server";
$a->strings["Jabber BOSH host"] = "Jabber BOSH Host";
$a->strings["Jabber password"] = "Japper Passwort";
$a->strings["Encrypt Jabber password with Friendica password (recommended)"] = "Verschlüssele das Jabber Passwort mit dem Friendica Passwort (empfohlen)";
$a->strings["Friendica password"] = "Friendica Passwort";
$a->strings["Approve subscription requests from Friendica contacts automatically"] = "Kontaktanfragen von Friendica Kontakten automatisch akzeptieren";
$a->strings["Subscribe to Friendica contacts automatically"] = "Automatisch Friendica Kontakten bei Jabber folgen";
$a->strings["Purge internal list of jabber addresses of contacts"] = "Lösche die interne Liste der Jabber Adressen der Kontakte";
$a->strings["Add contact"] = "Kontakt hinzufügen";
$a->strings["View Source"] = "Quelle ansehen";
$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
<div id="follow-sidebar" class="widget">
<h3>$connect</h3>
<div id="connect-desc">$desc</div>
<form action="follow" method="post" />
<form action="follow" method="post" >
<input id="side-follow-url" type="text" name="url" size="24" title="$hint" /><input id="side-follow-submit" type="submit" name="submit" value="$follow" />
</form>
</div>

View file

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Friendika@$nodename</ShortName>
<Description>Search in Friendika@$nodename</Description>
<Contact>http://bugs.friendika.com/</Contact>
<Image height="16" width="16" type="image/png">$baseurl/images/friendika-16.png</Image>
<Image height="64" width="64" type="image/png">$baseurl/images/friendika-64.png</Image>
<ShortName>Friendica@$nodename</ShortName>
<Description>Search in Friendica@$nodename</Description>
<Contact>http://bugs.friendica.com/</Contact>
<Image height="16" width="16" type="image/png">$baseurl/images/friendica-16.png</Image>
<Image height="64" width="64" type="image/png">$baseurl/images/friendica-64.png</Image>
<Url type="text/html"
template="$baseurl/search?search={searchTerms}"/>
<Url type="application/opensearchdescription+xml"

View file

@ -8,6 +8,13 @@
<input name="userfile" type="file" id="profile-photo-upload" size="48" />
</div>
<label id="profile-photo-profiles-label" for="profile-photo-profiles">$lbl_profiles </label>
<select name="profile" id="profile-photo-profiles" />
{{ for $profiles as $p }}
<option value="$p.id" {{ if $p.default }}selected="selected"{{ endif }}>$p.name</option>
{{ endfor }}
</select>
<div id="profile-photo-submit-wrapper">
<input type="submit" name="submit" id="profile-photo-submit" value="$submit">
</div>

View file

@ -71,3 +71,15 @@
<ul id="nav-notifications-template" style="display:none;" rel="template">
<li class="{4}"><a href="{0}"><img src="{1}" height="24" width="24" alt="" />{2} <span class="notif-when">{3}</span></a></li>
</ul>
<script>
var pagetitle = null;
$("nav").bind('nav-update', function(e,data){
if (pagetitle==null) pagetitle = document.title;
var count = $(data).find('notif').attr('count');
if (count>0) {
document.title = "("+count+") "+pagetitle;
} else {
document.title = pagetitle;
}
});
</script>

View file

@ -23,13 +23,23 @@ div.wall-item-content-wrapper.shiny { background-image: url('shiny.png'); }
nav #banner #logo-text a { color: #ffffff; }
.wall-item-content-wrapper {
border: 1px solid #444444;
background: #444;
border: 1px solid #444444;
background: #444444;
}
.wall-item-outside-wrapper.threaded > .wall-item-content-wrapper {
-moz-border-radius: 3px 3px 0px;
border-radius: 3px 3px 0px;
}
.wall-item-tools { background-color: #444444; background-image: none;}
.comment-wwedit-wrapper{ background-color: #444444; }
.toplevel_item > .wall-item-comment-wrapper > .comment-wwedit-wrapper{ background-color: #333333; }
.comment-wwedit-wrapper{
background-color: #333333;
}
.comment-wwedit-wrapper.threaded {
border: solid #444444;
border-width: 0px 3px 3px;
-moz-border-radius: 0px 0px 3px 3px;
border-radius: 0px 0px 3px 3px;
}
.comment-edit-preview{ color: #000000; }
.wall-item-content-wrapper.comment { background-color: #444444; border: 0px;}
.photo-top-album-name{ background-color: #333333; }

View file

@ -45,11 +45,19 @@ function insertFormatting(comment,BBcode,id) {
return true;
}
function cmtBbOpen(id) {
$(".comment-edit-bb-" + id).show();
function cmtBbOpen(comment, id) {
if($(comment).hasClass('comment-edit-text-full')) {
$(".comment-edit-bb-" + id).show();
return true;
}
return false;
}
function cmtBbClose(id) {
$(".comment-edit-bb-" + id).hide();
function cmtBbClose(comment, id) {
if($(comment).hasClass('comment-edit-text-empty')) {
$(".comment-edit-bb-" + id).hide();
return true;
}
return false;
}
$(document).ready(function() {

View file

@ -130,7 +130,7 @@ $(document).ready(function() {
$(".comment-edit-bb-" + id).hide();
}
$(document).ready(function(){
/*$(document).ready(function(){
var doctitle = document.title;
function checkNotify() {
if(document.getElementById("notify-update").innerHTML != "")
@ -139,7 +139,17 @@ $(document).ready(function() {
document.title = doctitle;
};
setInterval(function () {checkNotify();}, 10 * 1000);
})
})*/
</script>
<script>
var pagetitle = null;
$("nav").bind('nav-update', function(e,data){
if (pagetitle==null) pagetitle = document.title;
var count = $(data).find('notif').attr('count');
if (count>0) {
document.title = "("+count+") "+pagetitle;
} else {
document.title = pagetitle;
}
});
</script>

View file

@ -56,4 +56,16 @@ function checkNotify() {
};
setInterval(function () {checkNotify();}, 10 * 1000);
}
$(document).ready(function(){
var doctitle = document.title;
function checkNotify() {
if(document.getElementById("notify-update").innerHTML != "")
document.title = "("+document.getElementById("notify-update").innerHTML+") " + doctitle;
else
document.title = doctitle;
};
setInterval(function () {checkNotify();}, 10 * 1000);
})
</script>

View file

@ -1,10 +1,9 @@
{{ if $threaded }}
<div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-$id" style="display: block;">
{{ else }}
<div class="comment-wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
{{ if $threaded }}
<span id="hide-commentbox-$id" class="hide-commentbox fakelink" onclick="showHideCommentBox($id);">$comment</span>
<form class="comment-edit-form" style="display: none;" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
{{ else }}
{{ endif }}
<form class="comment-edit-form" style="display: block;" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
{{ endif }}
<input type="hidden" name="type" value="$type" />
<input type="hidden" name="profile_uid" value="$profile_uid" />
<input type="hidden" name="parent" value="$parent" />
@ -43,7 +42,7 @@
onclick="insertFormatting('$comment','video', $id);"></a></li>
</ul>
<div class="comment-edit-bb-end"></div>
<textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);cmtBbOpen($id);" onBlur="commentClose(this,$id);" >$comment</textarea>
<textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);cmtBbOpen(this, $id);" onBlur="commentClose(this,$id);cmtBbClose(this,$id);" >$comment</textarea>
{{ if $qcomment }}
<select id="qcomment-select-$id" name="qcomment-$id" class="qcomment" onchange="qCommentInsert(this,$id);" >
<option value=""></option>

View file

@ -932,7 +932,6 @@ input#dfrn-url {
position: relative;
-moz-border-radius: 3px;
border-radius: 3px;
}
.tread-wrapper .tread-wrapper {
@ -1196,6 +1195,10 @@ input#dfrn-url {
width: 100px;
float: left;
}
.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-photo {
width: 40px;
}
.comment-edit-photo img {
width: 25px;
}
@ -1215,6 +1218,10 @@ input#dfrn-url {
margin: 10px 0px 10px 110px;
}
.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-submit-wrapper > .comment-edit-submit {
margin-left: 50px;
}
#profile-jot-plugin-wrapper,
#profile-jot-submit-wrapper {
margin-top: 15px;
@ -1758,12 +1765,16 @@ input#dfrn-url {
.comment-edit-text-empty {
color: gray;
height: 30px;
height: 2em;
width: 175px;
overflow: auto;
margin-bottom: 10px;
}
.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-text-empty {
height: 1.5em;
}
.comment-edit-text-full {
color: black;
height: 150px;
@ -3046,7 +3057,8 @@ aside input[type='text'] {
[class^="comment-edit-bb"] {
list-style: none;
display: none;
margin: 0px 0 -5px 60px;
margin: 0px 0 -5px 0px;
padding: 0px;
width: 75%;
}
[class^="comment-edit-bb"] > li {

View file

@ -34,11 +34,19 @@ function insertFormatting(comment,BBcode,id) {
return true;
}
function cmtBbOpen(id) {
$(".comment-edit-bb-" + id).show();
function cmtBbOpen(comment, id) {
if($(comment).hasClass('comment-edit-text-full')) {
$(".comment-edit-bb-" + id).show();
return true;
}
return false;
}
function cmtBbClose(comment, id) {
$(".comment-edit-bb-" + id).hide();
// if($(comment).hasClass('comment-edit-text-empty')) {
// $(".comment-edit-bb-" + id).hide();
// return true;
// }
return false;
}
$(document).ready(function() {

View file

@ -19,4 +19,5 @@
window.allowGID = $allowgid;
window.denyCID = $denycid;
window.denyGID = $denygid;
window.aclInit = "true";
</script>

View file

@ -40,7 +40,7 @@
{{ inc field_checkbox.tpl with $field=$dfrn_only }}{{ endinc }}
{{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$thread_allow }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$newuser_public }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$newuser_private }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -21,6 +21,9 @@
<section><?php if(x($page,'content')) echo $page['content']; ?>
</section>
</div>
<footer>
<a href="<?php echo $a->get_baseurl() ?>/toggle_mobile?off=1&address=<?php echo curPageURL() ?>">toggle mobile</a>
</footer>
<?php } else { ?>
<div class='main-container'>
@ -33,7 +36,10 @@
</div>
<right_aside><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></right_aside>
<?php if( ($a->module === 'contacts') && x($page,'aside')) echo $page['aside']; ?>
<footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
<footer>
<a href="<?php echo $a->get_baseurl() ?>/toggle_mobile?off=1&address=<?php echo curPageURL() ?>">toggle mobile</a>
<?php if(x($page,'footer')) echo $page['footer']; ?>
</footer>
<!-- </div>-->
</div>
<?php } ?>

View file

@ -5,8 +5,6 @@
<script type="text/javascript">
tinyMCE.init({ mode : "none"});
</script>-->
<script type="text/javascript" src="$baseurl/js/jquery.js" ></script>
<script type="text/javascript">var $j = jQuery.noConflict();</script>
<script type="text/javascript" src="$baseurl/view/theme/frost/js/jquery.divgrow-1.3.1.min.js" ></script>
<script type="text/javascript" src="$baseurl/js/jquery.textinputs.js" ></script>
<script type="text/javascript" src="$baseurl/view/theme/frost-mobile/js/fk.autocomplete.min.js" ></script>
@ -16,5 +14,4 @@
<script type="text/javascript" src="$baseurl/view/theme/frost-mobile/js/acl.min.js" ></script>
<script type="text/javascript" src="$baseurl/js/webtoolkit.base64.min.js" ></script>
<script type="text/javascript" src="$baseurl/view/theme/frost-mobile/js/theme.min.js"></script>
<script type="text/javascript" src="$baseurl/view/theme/frost-mobile/js/main.min.js" ></script>

View file

@ -27,4 +27,7 @@
var updateInterval = $update_interval;
var localUser = {{ if $local_user }}$local_user{{ else }}false{{ endif }};
</script>
<script type="text/javascript" src="$baseurl/js/jquery.js" ></script>
<script type="text/javascript">var $j = jQuery.noConflict();</script>
<script type="text/javascript" src="$baseurl/view/theme/frost-mobile/js/main.min.js" ></script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,11 @@
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var lat = position.coords.latitude.toFixed(4);
var lon = position.coords.longitude.toFixed(4);
$j('#jot-coord').val(lat + ', ' + lon);
$j('#profile-nolocation-wrapper').show();
});
}

View file

@ -78,7 +78,7 @@
if( last_popup_menu ) {
if( '#' + last_popup_menu.attr('id') !== $j(e.target).attr('rel')) {
last_popup_menu.hide();
if (last_popup_menu.attr('id') == "nav-notifications-menu" ) $j('section').show();
if (last_popup_menu.attr('id') == "nav-notifications-menu" ) $j('.main-container').show();
last_popup_button.removeClass("selected");
last_popup_menu = null;
last_popup_button = null;
@ -100,13 +100,13 @@
if (menu.css("display") == "none") {
$j(this).parent().addClass("selected");
menu.show();
if (menu.attr('id') == "nav-notifications-menu" ) $j('section').hide();
if (menu.attr('id') == "nav-notifications-menu" ) $j('.main-container').hide();
last_popup_menu = menu;
last_popup_button = $j(this).parent();
} else {
$j(this).parent().removeClass("selected");
menu.hide();
if (menu.attr('id') == "nav-notifications-menu" ) $j('section').show();
if (menu.attr('id') == "nav-notifications-menu" ) $j('.main-container').show();
last_popup_menu = null;
last_popup_button = null;
}
@ -315,6 +315,22 @@
prev = ident;
});
var bimgs = $j(".wall-item-body > img").not(function() { return this.complete; });
var bimgcount = bimgs.length;
if (bimgcount) {
bimgs.load(function() {
bimgcount--;
if (! bimgcount) {
collapseHeight();
}
});
} else {
collapseHeight();
}
// reset vars for inserting individual items
/*prev = 'live-' + src;
@ -349,22 +365,6 @@
}
/* autocomplete @nicknames */
$j(".comment-edit-form textarea").contact_autocomplete(baseurl+"/acl");
var bimgs = $j(".wall-item-body > img").not(function() { return this.complete; });
var bimgcount = bimgs.length;
if (bimgcount) {
bimgs.load(function() {
bimgcount--;
if (! bimgcount) {
collapseHeight();
}
});
} else {
collapseHeight();
}
});
}

File diff suppressed because one or more lines are too long

View file

@ -49,7 +49,7 @@ $j(document).ready(function() {
}
}
if(typeof acl=="undefined"){
if(typeof window.aclInit !="undefined" && typeof acl=="undefined"){
acl = new ACL(
baseurl+"/acl",
[ window.allowCID,window.allowGID,window.denyCID,window.denyGID ]

File diff suppressed because one or more lines are too long

View file

@ -152,3 +152,9 @@ div.section-wrapper {
#login-submit-wrapper {
text-align: center;
}
footer {
text-align: center;
padding-top: 3em;
padding-bottom: 1em;
}

View file

@ -12,7 +12,7 @@ html {
/* width: 320px;*/
margin-left: auto;
margin-right: auto;
overflow-x:hidden;
/* overflow-x:hidden;*/
}
body {
@ -104,7 +104,7 @@ blockquote {
#panel {
background-color: ivory;
position: absolute;
z-index: 2;
/* z-index: 2;*/
width: 30%;
padding: 25px;
border: 1px solid #444;
@ -256,7 +256,7 @@ nav .nav-link {
-webkit-box-shadow: 3px 3px 5px #555;
box-shadow: 3px 3px 5px #555;
z-index: 10000;
z-index: 100;
}
#network-menu-list {
@ -393,8 +393,8 @@ section {
/* footer */
footer {
display: none;
text-align: center;
padding-bottom: 1em;
}
.birthday-today, .event-today {
@ -1206,7 +1206,7 @@ input#dfrn-url {
position: absolute;
left: 0px; top:110px;
display: none;
z-index: 10000;
/* z-index: 10000;*/
}
.wall-item-photo-menu { margin:0px; padding: 0px; list-style: none }
.wall-item-photo-menu li a { display: block; padding: 2px; }
@ -1236,7 +1236,7 @@ input#dfrn-url {
position: absolute;
left: 75px;
top: 80px;
z-index: 100;
/* z-index: 100;*/
}
.wall-item-wrapper {
margin-left:10px;
@ -1351,12 +1351,23 @@ input#dfrn-url {
}
.wall-item-content img {
display: block;
margin-top: 10px;
margin-right: auto;
margin-left: auto;
max-width: 290px;
border-radius: 7px;
/* -moz-border-radius: 7px;*/
-webkit-border-radius: 7px;
}
.wall-item-content img.smiley {
display: inline;
margin: auto;
border-radius: 0;
-webkit-border-radius: 0;
}
.comment .wall-item-content img {
max-width: 280px;
}
@ -1415,6 +1426,7 @@ input#dfrn-url {
background-repeat: repeat-x;*/
padding: 5px 5px 0px;
height: 32px;
}
.wall-item-author {
/* margin-top: 10px;*/
@ -2025,7 +2037,7 @@ input#dfrn-url {
position: absolute;
left: -30px; top: 80px;
display: none;
z-index: 10000;
z-index: 101;
/* -moz-box-shadow: 3px 3px 5px #555;*/
-webkit-box-shadow: 3px 3px 5px #555;
box-shadow: 3px 3px 5px #555;
@ -3393,6 +3405,7 @@ aside input[type='text'] {
text-decoration: none;
}
.field .onoff .off {
border-color:#666666;
padding-left: 40px;
background-position: left center;
@ -3595,7 +3608,13 @@ aside input[type='text'] {
background-image: url('images/globe.png');
background-repeat: no-repeat;
}
.noglobe { background-position: -16px -16px;}
/*.noglobe { background-position: -16px -16px;}*/
.icon.noglobe {
display: block; width: 24px; height: 24px;
background-size: 100% 100%;
background-image: url('images/noglobe.png');
background-repeat: no-repeat;
}
.no { background-position: -32px -16px;}
.pause { background-position: -48px -16px;}
.play { background-position: -64px -16px;}
@ -3810,7 +3829,7 @@ aside input[type='text'] {
max-height:150px;
background-color:#ffffff;
overflow:auto;
z-index:100000;
z-index:102;
border:1px solid #cccccc;
}
.acpopupitem {
@ -3884,16 +3903,15 @@ ul.notifications-menu-popup {
display: none;
width: 10em;
margin: 0px;
padding: 0px;
padding: 0px 0.3em;
list-style: none;
z-index: 100000;
right: -55px;
right: -60px;
}
#nav-notifications-menu {
width: 300px;
/* max-height: 400px;*/
height: auto;
overflow-y: scroll;overflow-style:scrollbar;
/* overflow-y: scroll;overflow-style:scrollbar;*/
background-color:#FFFFFF;
/* -moz-border-radius: 5px;*/
-webkit-border-radius: 5px;
@ -3902,6 +3920,7 @@ ul.notifications-menu-popup {
/* -moz-box-shadow: 3px 3px 5px #555;*/
-webkit-box-shadow: 3px 3px 5px #555;
box-shadow: 3px 3px 5px #555;
/* z-index: 103;*/
}
#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
#nav-notifications-menu img { float: left; margin-right: 5px; }

View file

@ -4,7 +4,7 @@
* Name: Frost--mobile version
* Description: Like frosted glass
* Credits: Navigation icons taken from http://iconza.com. Other icons taken from http://thenounproject.com, including: Like, Dislike, Black Lock, Unlock, Pencil, Tag, Camera, Paperclip (Marie Coons), Folder (Sergio Calcara), Chain-link (Andrew Fortnum), Speaker (Harold Kim), Quotes (Henry Ryder), Video Camera (Anas Ramadan), and Left Arrow, Right Arrow, and Delete X (all three P.J. Onori). All under Attribution (CC BY 3.0). Others from The Noun Project are public domain or No Rights Reserved (CC0).
* Version: Version 0.2.11
* Version: Version 0.2.12
* Author: Zach P <techcity@f.shmuz.in>
* Maintainer: Zach P <techcity@f.shmuz.in>
*/

View file

@ -19,4 +19,5 @@
window.allowGID = $allowgid;
window.denyCID = $denycid;
window.denyGID = $denygid;
window.aclInit = "true";
</script>

View file

@ -40,7 +40,7 @@
{{ inc field_checkbox.tpl with $field=$dfrn_only }}{{ endinc }}
{{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$thread_allow }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$newuser_public }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$newuser_private }}{{ endinc }}
<div class="submit"><input type="submit" name="page_site" value="$submit" /></div>

View file

@ -0,0 +1,84 @@
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_popup.js"></script>
<style>
.panel_wrapper div.current{.overflow: auto; height: auto!important; }
.filebrowser.path { font-family: fixed; font-size: 10px; background-color: #f0f0ee; height:auto; overflow:auto;}
.filebrowser.path a { border-left: 1px solid #C0C0AA; background-color: #E0E0DD; display: block; float:left; padding: 0.3em 1em;}
.filebrowser ul{ list-style-type: none; padding:0px; }
.filebrowser.folders a { display: block; padding: 0.3em }
.filebrowser.folders a:hover { background-color: #f0f0ee; }
.filebrowser.files.image { overflow: auto; height: auto; }
.filebrowser.files.image img { height:100px;}
.filebrowser.files.image li { display: block; padding: 5px; float: left; }
.filebrowser.files.image span { display: none;}
.filebrowser.files.file img { height:16px; vertical-align: bottom;}
.filebrowser.files a { display: block; padding: 0.3em}
.filebrowser.files a:hover { background-color: #f0f0ee; }
.filebrowser a { text-decoration: none; }
</style>
<script>
var FileBrowserDialogue = {
init : function () {
// Here goes your code for setting your custom things onLoad.
},
mySubmit : function (URL) {
//var URL = document.my_form.my_field.value;
var win = tinyMCEPopup.getWindowArg("window");
// insert information now
win.document.getElementById(tinyMCEPopup.getWindowArg("input")).value = URL;
// are we an image browser
if (typeof(win.ImageDialog) != "undefined") {
// we are, so update image dimensions...
if (win.ImageDialog.getImageData)
win.ImageDialog.getImageData();
// ... and preview if necessary
if (win.ImageDialog.showPreviewImage)
win.ImageDialog.showPreviewImage(URL);
}
// close popup window
tinyMCEPopup.close();
}
}
tinyMCEPopup.onInit.add(FileBrowserDialogue.init, FileBrowserDialogue);
</script>
</head>
<body>
<div class="tabs">
<ul >
<li class="current"><span>FileBrowser</span></li>
</ul>
</div>
<div class="panel_wrapper">
<div id="general_panel" class="panel current">
<div class="filebrowser path">
{{ for $path as $p }}<a href="$p.0">$p.1</a>{{ endfor }}
</div>
<div class="filebrowser folders">
<ul>
{{ for $folders as $f }}<li><a href="$f.0/">$f.1</a></li>{{ endfor }}
</ul>
</div>
<div class="filebrowser files $type">
<ul>
{{ for $files as $f }}
<li><a href="#" onclick="FileBrowserDialogue.mySubmit('$f.0'); return false;"><img src="$f.2"><span>$f.1</span></a></li>
{{ endfor }}
</ul>
</div>
</div>
</div>
<div class="mceActionPanel">
<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -60,6 +60,8 @@
$jotplugins
</div>
<!-- <span id="jot-display-location" style="display: none;"></span>-->
<div id="profile-rotator-wrapper" style="display: $visitor;" >
<img id="profile-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>

View file

@ -0,0 +1,11 @@
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var lat = position.coords.latitude.toFixed(4);
var lon = position.coords.longitude.toFixed(4);
$j('#jot-coord').val(lat + ', ' + lon);
$j('#profile-nolocation-wrapper').show();
});
}

View file

@ -17,7 +17,7 @@ $j(document).ready(function() {
});*/
if(typeof acl=="undefined"){
if(typeof window.aclInit !="undefined" && typeof acl=="undefined"){
acl = new ACL(
baseurl+"/acl",
[ window.allowCID,window.allowGID,window.denyCID,window.denyGID ]
@ -935,6 +935,37 @@ function jotAudioURL() {
function jotGetLocation() {
/* if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
$j.ajax({
type: 'GET',
url: 'http://nominatim.openstreetmap.org/reverse?format=json&lat='+lat+'&lon='+lng,
jsonp: 'json_callback',
contentType: 'application/json',
dataType: 'jsonp',
success: function(json) {
console.log(json);
var locationDisplay = json.address.building+', '+json.address.city+', '+json.address.state;
$j('#jot-location').val(locationDisplay);
$j('#jot-display-location').html('Location: '+locationDisplay);
$j('#jot-display-location').show();
}
});
});
}
else {
reply = prompt(window.whereAreU, $j('#jot-location').val());
if(reply && reply.length) {
$j('#jot-location').val(reply);
}
}*/
reply = prompt(window.whereAreU, $j('#jot-location').val());
if(reply && reply.length) {
$j('#jot-location').val(reply);

File diff suppressed because one or more lines are too long

View file

@ -8,7 +8,7 @@
<!-- <a id="system-menu-link" class="nav-link" href="#system-menu" title="Menu">Menu</a>-->
<div class="nav-button-container nav-menu-link" rel="#system-menu-list">
<a class="system-menu-link nav-link" href="$nav.settings.0" title="Main Menu">
<img class="system-menu-link" src="/view/theme/frost/images/menu.png">
<img class="system-menu-link" src="$baseurl/view/theme/frost/images/menu.png">
</a>
<ul id="system-menu-list" class="nav-menu-list">
{{ if $nav.login }}
@ -57,7 +57,7 @@
<!-- <a id="nav-notifications-linkmenu" class="nav-link" href="$nav.notifications.0" rel="#nav-notifications-menu" title="$nav.notifications.1">$nav.notifications.1</a>-->
<div class="nav-button-container">
<a id="nav-notifications-linkmenu" class="nav-link" href="$nav.notifications.0" rel="#nav-notifications-menu" title="$nav.notifications.1">
<img rel="#nav-notifications-menu" src="/view/theme/frost/images/notifications.png">
<img rel="#nav-notifications-menu" src="$baseurl/view/theme/frost/images/notifications.png">
</a>
<span id="notify-update" class="nav-ajax-left"></span>
<ul id="nav-notifications-menu" class="notifications-menu-popup">
@ -71,7 +71,7 @@
<!-- <a id="contacts-menu-link" class="nav-link" href="#contacts-menu" title="Contacts">Contacts</a>-->
<div class="nav-button-container nav-menu-link" rel="#contacts-menu-list">
<a class="contacts-menu-link nav-link" href="$nav.contacts.0" title="Contacts">
<img class="contacts-menu-link" src="/view/theme/frost/images/contacts.png">
<img class="contacts-menu-link" src="$baseurl/view/theme/frost/images/contacts.png">
</a>
{{ if $nav.introductions }}
<span id="intro-update" class="nav-ajax-left"></span>
@ -95,7 +95,7 @@
<!-- <a id="nav-messages-link" class="nav-link $nav.messages.2 $sel.messages nav-load-page-link" href="$nav.messages.0" title="$nav.messages.3" >$nav.messages.1</a>-->
<div class="nav-button-container">
<a id="nav-messages-link" class="nav-link $nav.messages.2 $sel.messages nav-load-page-link" href="$nav.messages.0" title="$nav.messages.3" >
<img src="/view/theme/frost/images/message.png">
<img src="$baseurl/view/theme/frost/images/message.png">
</a>
<span id="mail-update" class="nav-ajax-left"></span>
</div>
@ -104,7 +104,7 @@
<!-- <a id="network-menu-link" class="nav-link" href="#network-menu" title="Network">Network</a>-->
<div class="nav-button-container nav-menu-link" rel="#network-menu-list">
<a class="network-menu-link nav-link" href="$nav.network.0" title="Network">
<img class="network-menu-link" src="/view/theme/frost/images/network.png">
<img class="network-menu-link" src="$baseurl/view/theme/frost/images/network.png">
</a>
{{ if $nav.network }}
<span id="net-update" class="nav-ajax-left"></span>

View file

@ -1309,9 +1309,18 @@ input#dfrn-url {
}
.wall-item-content img {
display: block;
margin-top: 10px;
margin-right: auto;
margin-left: auto;
max-width: 100%;
}
.wall-item-content img.smiley {
display: inline;
margin: auto;
}
.divgrow-showmore {
display: block;
clear: both;
@ -3418,7 +3427,13 @@ aside input[type='text'] {
background-image: url('images/globe.png');
background-repeat: no-repeat;
}
.noglobe { background-position: -16px -16px;}
/*.noglobe { background-position: -16px -16px;}*/
.icon.noglobe {
display: block; width: 24px; height: 24px;
background-size: 100% 100%;
background-image: url('images/noglobe.png');
background-repeat: no-repeat;
}
.no { background-position: -32px -16px;}
.pause { background-position: -48px -16px;}
.play { background-position: -64px -16px;}

View file

@ -4,7 +4,7 @@
* Name: Frost
* Description: Like frosted glass
* Credits: Navigation icons taken from http://iconza.com. Other icons taken from http://thenounproject.com, including: Like, Dislike, Black Lock, Unlock, Pencil, Tag, Camera, Paperclip (Marie Coons), Folder (Sergio Calcara), Chain-link (Andrew Fortnum), Speaker (Harold Kim), Quotes (Henry Ryder), Video Camera (Anas Ramadan), and Left Arrow, Right Arrow, and Delete X (all three P.J. Onori). All under Attribution (CC BY 3.0). Others from The Noun Project are public domain or No Rights Reserved (CC0).
* Version: Version 0.2.9
* Version: Version 0.2.10
* Author: Zach P <techcity@f.shmuz.in>
* Maintainer: Zach P <techcity@f.shmuz.in>
*/

View file

@ -44,6 +44,7 @@ function theme_admin_post(&$a){
function quattro_form(&$a, $align, $color){
$colors = array(
"dark"=>"Quattro",
"lilac"=>"Lilac",
"green"=>"Green"
);

View file

@ -735,6 +735,22 @@ aside #profile-extra-links li {
margin: 0px;
list-style: none;
}
aside #wallmessage-link {
display: block;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
color: #ffffff;
background: #005c94 url('../../../images/connect-bg.png') no-repeat left center;
font-weight: bold;
text-transform: uppercase;
padding: 4px 2px 2px 35px;
margin-top: 3px;
}
aside #wallmessage-link:hover {
text-decoration: none;
background-color: #19aeff;
}
aside #dfrn-request-link {
display: block;
-moz-border-radius: 5px 5px 5px 5px;
@ -1140,6 +1156,9 @@ section {
opacity: 0.5;
}
.wwto {
position: absolute !important;
width: 25px;
height: 25px;
background: #FFFFFF;
border: 2px solid #364e59;
height: 25px;

View file

@ -735,6 +735,22 @@ aside #profile-extra-links li {
margin: 0px;
list-style: none;
}
aside #wallmessage-link {
display: block;
-moz-border-radius: 5px 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px 5px;
border-radius: 5px 5px 5px 5px;
color: #ffffff;
background: #009100 url('../../../images/connect-bg.png') no-repeat left center;
font-weight: bold;
text-transform: uppercase;
padding: 4px 2px 2px 35px;
margin-top: 3px;
}
aside #wallmessage-link:hover {
text-decoration: none;
background-color: #ccff42;
}
aside #dfrn-request-link {
display: block;
-moz-border-radius: 5px 5px 5px 5px;
@ -1140,6 +1156,9 @@ section {
opacity: 0.5;
}
.wwto {
position: absolute !important;
width: 25px;
height: 25px;
background: #FFFFFF;
border: 2px solid #364e59;
height: 25px;

View file

@ -0,0 +1,4 @@
##
style.css : style.less colors.less ../icons.less ../quattro.less
lessc style.less > style.css

View file

@ -0,0 +1,117 @@
// Quattro Theme LESS file
// "Echo" palette from Inkscape
@Yellow1 : #fce94f;
@Blue1:rgb(25,174,255);
@Blue2:rgb(0,132,200);
@Blue3:rgb(0,92,148);
@Red1:rgb(255,65,65);
@Red2:rgb(220,0,0);
@Red3:rgb(181,0,0);
@Orange1:rgb(255,255,62);
@Orange2:rgb(255,153,0);
@Orange3:rgb(255,102,0);
@Brown1:rgb(255,192,34);
@Brown2:rgb(184,129,0);
@Brown3:rgb(128,77,0);
@Green1:rgb(204,255,66);
@Green2:rgb(154,222,0);
@Green3:rgb(0,145,0);
@Green4:rgb(221,255,221);
@Purple1:rgb(241,202,255);
@Purple2:rgb(215,108,255);
@Purple3:rgb(186,0,255);
@Metalic1:rgb(189,205,212);
@Metalic2:rgb(158,171,176);
@Metalic3:rgb(54,78,89);
@Metalic4:rgb(14,35,46);
@Grey1:rgb(255,255,255);
@Grey2:rgb(204,204,204);
@Grey3:rgb(153,153,153);
@Grey4:rgb(102,102,102);
@Grey5:rgb(45,45,45);
@lilac: #86608e;
@lilacComp: #cbd38d;
@lilacDark: #521f5c;
@lilacBright:#c0a3c7;
@lilacVBright:#F6ECF9;
// Theme colors
@BodyBackground: @lilacVBright;
@BodyColor: @Grey5;
@Link: @lilacDark;
@LinkHover: @lilac;
@LinkVisited: @lilac;
@ButtonColor: @Grey1;
@ButtonBackgroundColor: @Grey5;
@Banner: @Grey1;
@NavbarBackground:@lilacDark;
@NavbarSelectedBg:@lilacComp;
@NavbarSelectedBorder: @Metalic2;
@NavbarNotifBg: @lilac;
@Menu: @Grey5;
@MenuBg: @Grey1;
@MenuBorder: @Metalic3;
@MenuItem: @Grey5;
@MenuItemHoverBg: @lilacBright;
@MenuItemSeparator: @Metalic2;
@MenuEmpty: @Metalic2;
@MenuItemDetail: @Metalic2;
@AsideBorder: @Metalic1;
@AsideConnect: @Grey1;
@AsideConnectBg: @lilacDark;
@AsideConnectHoverBg: @lilac;
@VCardLabelColor: @Grey3;
@InfoColor: @Grey1;
@InfoBackgroundColor: @Metalic3;
@NoticeColor: @Grey1;
@NoticeBackgroundColor: #511919;
@FieldHelpColor: @Grey3;
@ThreadBackgroundColor: #eff0f1;
@ThreadBottomBorderColor: @Grey2;
@ShinyBorderColor: @lilacBright;
@BlockquoteBackgroundColor: #FFFFFF;
@BlockquoteBorderColor: #e6e6e6;
@CommentBoxEmptyColor: @Grey3;
@CommentBoxEmptyBorderColor: @Grey3;
@CommentBoxFullColor: @Grey5;
@CommentBoxFullBorderColor: @Grey5;
@TagColor: @Grey1;
@JotToolsBackgroundColor: @lilacDark;
@JotToolsBorderColor: @Metalic2;
@JotToolsOverBackgroundColor: @lilac;
@JotToolsOverBorderColor: @Metalic1;
@JotToolsText: @Grey2;
@JotSubmitBackgroundColor: @Grey2;
@JotSubmitText: @Grey4;
@JotSubmitOverBackgroundColor: @lilacDark;
@JotSubmitOverText: @Grey4;
@JotPermissionUnlockBackgroundColor: @Grey2;
@JotPermissionLockBackgroundColor: @Grey4;
@JotLoadingBackgroundColor: @Grey1;
@JotPreviewBackgroundColor: @lilacBright;
@MessageNewBackgroundColor: @Blue1;
@MessageNewBorderColor: @Blue3;
@MessageNewColor: @Grey1;
@MailListBackgroundColor: #f6f7f8;
@MailDisplaySubjectColor: @Grey5;
@MailDisplaySubjectBackgroundColor: #f6f7f8;

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
/**
* Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
**/
// Less file http://lesscss.org/
// compile with lessc
// $ lessc style.less > style.css
@import "colors";
@import "../icons";
@import "../quattro";

View file

@ -56,6 +56,9 @@
{{ if $connect }}
<li><a id="dfrn-request-link" href="dfrn_request/$profile.nickname">$connect</a></li>
{{ endif }}
{{ if $wallmessage }}
<li><a id="wallmessage-link" href="wallmessage/$profile.nickname">$wallmessage</a></li>
{{ endif }}
</ul>
</div>
</div>

View file

@ -314,6 +314,18 @@ aside {
li { padding: 0px; margin: 0px; list-style: none; }
}
#wallmessage-link {
display: block;
.rounded();
color: @AsideConnect;
background: @AsideConnectBg url('../../../images/connect-bg.png') no-repeat left center;
font-weight: bold;
text-transform:uppercase;
padding: 4px 2px 2px 35px;
margin-top: 3px;
&:hover { text-decoration: none; background-color: @AsideConnectHoverBg; }
}
#dfrn-request-link {
display: block;
.rounded();

View file

@ -37,13 +37,22 @@ function insertFormatting(comment,BBcode,id) {
return true;
}
function cmtBbOpen(id) {
$(".comment-edit-bb-" + id).show();
function cmtBbOpen(comment, id) {
if($(comment).hasClass('comment-edit-text-full')) {
$(".comment-edit-bb-" + id).show();
return true;
}
return false;
}
function cmtBbClose(id) {
$(".comment-edit-bb-" + id).hide();
function cmtBbClose(comment, id) {
// if($(comment).hasClass('comment-edit-text-empty')) {
// $(".comment-edit-bb-" + id).hide();
// return true;
// }
return false;
}
function hidecal() {
if(editor) return;
$('.fc').hide();

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 B

View file

@ -0,0 +1,52 @@
<script type="text/javascript" src="$baseurl/view/theme/smoothly/js/jquery.autogrow.textarea.js"></script>
<script type="text/javascript">
$(document).ready(function() {
});
function tautogrow(id) {
$("textarea#comment-edit-text-" + id).autogrow();
};
function insertFormatting(comment, BBcode, id) {
var tmpStr = $("#comment-edit-text-" + id).val();
if(tmpStr == comment) {
tmpStr = "";
$("#comment-edit-text-" + id).addClass("comment-edit-text-full");
$("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
openMenu("comment-edit-submit-wrapper-" + id);
}
textarea = document.getElementById("comment-edit-text-" + id);
if (document.selection) {
textarea.focus();
selected = document.selection.createRange();
if (BBcode == "url") {
selected.text = "["+BBcode+"]" + "http://" + selected.text + "[/"+BBcode+"]";
} else {
selected.text = "["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
}
} else if (textarea.selectionStart || textarea.selectionStart == "0") {
var start = textarea.selectionStart;
var end = textarea.selectionEnd;
if (BBcode == "url") {
textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]"
+ "http://" + textarea.value.substring(start, end)
+ "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
} else {
textarea.value = textarea.value.substring(0, start)
+ "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]"
+ textarea.value.substring(end, textarea.value.length);
}
}
return true;
}
function cmtBbOpen(id) {
$(".comment-edit-bb-" + id).show();
}
function cmtBbClose(id) {
$(".comment-edit-bb-" + id).hide();
}
</script>

View file

@ -0,0 +1,12 @@
<div id="categories-sidebar" class="widget">
<h3>$title</h3>
<div id="nets-desc">$desc</div>
<ul class="categories-ul">
<li class="widget-list"><a href="$base" class="categories-link categories-all{{ if $sel_all }} categories-selected{{ endif }}">$all</a></li>
{{ for $terms as $term }}
<li class="widget-list"><a href="$base?f=&category=$term.name" class="categories-link{{ if $term.selected }} categories-selected{{ endif }}">$term.name</a></li>
{{ endfor }}
</ul>
</div>

View file

@ -0,0 +1,30 @@
<!DOCTYPE html >
<html>
<head>
<title><?php if(x($page,'title')) echo $page['title'] ?></title>
<script>var baseurl="<?php echo $a->get_baseurl() ?>";</script>
<?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
</head>
<body>
<header>
<?php if(x($page, 'header')) echo $page['header']; ?>
</header>
<?php if(x($page,'nav')) echo $page['nav']; ?>
<aside><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
<section><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
</section>
<right_aside><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></right_aside>
<footer id="footer">
<?php if(x($page, 'footer')) echo $page['footer']; ?>
</footer>
<?php if (x($page, 'bottom')) echo $page['bottom']; ?>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

View file

@ -0,0 +1,41 @@
<link rel='stylesheet' type='text/css' href='$baseurl/library/fullcalendar/fullcalendar.css' />
<script language="javascript" type="text/javascript"
src="$baseurl/library/fullcalendar/fullcalendar.min.js"></script>
<script>
// start calendar from yesterday
var yesterday= new Date()
yesterday.setDate(yesterday.getDate()-1)
function showEvent(eventid) {
$.get(
'$baseurl/events/?id='+eventid,
function(data){
$.fancybox(data);
}
);
}
$(document).ready(function() {
$('#events-reminder').fullCalendar({
firstDay: yesterday.getDay(),
year: yesterday.getFullYear(),
month: yesterday.getMonth(),
date: yesterday.getDate(),
events: '$baseurl/events/json/',
header: {
left: '',
center: '',
right: ''
},
timeFormat: 'H(:mm)',
defaultView: 'basicWeek',
height: 50,
eventClick: function(calEvent, jsEvent, view) {
showEvent(calEvent.id);
}
});
});
</script>
<br />
<div id="events-reminder"></div>
<br />

View file

@ -1,7 +1,7 @@
<div id="follow-sidebar" class="widget">
<h3>$connect</h3>
<div id="connect-desc">$desc</div>
<form action="follow" method="post" />
<form action="follow" method="post" >
<input id="side-follow-url" type="text-sidebar" name="url" size="24" title="$hint" /><input id="side-follow-submit" type="submit" name="submit" value="$follow" />
</form>
</div>

View file

@ -0,0 +1,3 @@
<div id="footerbox" style="display:none">
<a style="float:right; color:#333;margin-right:10px;display: table;margin-top: 5px;" href="friendica" title="Site Info / Impressum" >Info / Impressum</a>
</div>

View file

@ -0,0 +1,11 @@
<div class="widget{{ if $class }} $class{{ endif }}">
{{if $title}}<h3>$title</h3>{{endif}}
{{if $desc}}<div class="desc">$desc</div>{{endif}}
<ul>
{{ for $items as $item }}
<li class="widget-list"><a href="$item.url" class="{{ if $item.selected }}selected{{ endif }}">$item.label</a></li>
{{ endfor }}
</ul>
</div>

View file

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

View file

View file

@ -14,11 +14,18 @@
<input type="hidden" name="coord" id="jot-coord" value="" />
<input type="hidden" name="post_id" value="$post_id" />
<input type="hidden" name="preview" id="jot-preview" value="0" />
<div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="$placeholdertitle" value="$title" class="jothidden" style="display:none"></div>
<div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="$placeholdercategory" value="$category" class="jothidden" style="display:none" /></div>
<div id="jot-title-wrap">
<input name="title" id="jot-title" type="text" placeholder="$placeholdertitle" value="$title" class="jothidden" style="display:none">
</div>
<div id="jot-category-wrap">
<input name="category" id="jot-category" type="text" placeholder="$placeholdercategory" value="$category" class="jothidden" style="display:none" />
</div>
<div id="jot-text-wrap">
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
<textarea rows="5" cols="88" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" /><br>
<textarea rows="5" cols="80" class="profile-jot-text" id="profile-jot-text" name="body" >
{{ if $content }}$content{{ else }}$share
{{ endif }}
</textarea>
</div>
<div id="profile-upload-wrapper" class="jot-tool" style="display: none;" >
@ -47,7 +54,7 @@
<div id="profile-jot-submit-wrapper" style="display:none;padding-left: 400px;">
<input type="submit" id="profile-jot-submit" name="submit" value="$share" />
<div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" >
<div id="profile-jot-perms" class="profile-jot-perms" style="display: $pvisit;" >
<a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon $lockstate sharePerms" title="$permset"></a>$bang</div>
</div>

Some files were not shown because too many files have changed in this diff Show more