aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabio Comuni <fabrix.xm@gmail.com>2011-02-01 10:17:27 +0100
committerFabio Comuni <fabrix.xm@gmail.com>2011-02-01 10:17:27 +0100
commit042aa2e169310bc23398d0558455a61fe1e86a92 (patch)
tree50ae4d8845bc16e2edfbaa916e80d8709ee3fe86
parent1151124feed13ebe1bf87bdcebf9692a5ce6233e (diff)
parent89313235d26569df5cbdabb1f85871f10056e41f (diff)
downloadvolse-hubzilla-042aa2e169310bc23398d0558455a61fe1e86a92.tar.gz
volse-hubzilla-042aa2e169310bc23398d0558455a61fe1e86a92.tar.bz2
volse-hubzilla-042aa2e169310bc23398d0558455a61fe1e86a92.zip
Merge remote branch 'friendika-master/master'
-rw-r--r--addon/oembed/oembed.php44
-rw-r--r--boot.php2
-rw-r--r--database.sql6
-rw-r--r--htconfig.php5
-rw-r--r--include/acl_selectors.php7
-rw-r--r--include/bbcode.php5
-rw-r--r--include/items.php3
-rw-r--r--include/notifier.php178
-rw-r--r--include/oembed.php97
-rw-r--r--include/poller.php4
-rw-r--r--mod/item.php31
-rw-r--r--mod/network.php2
-rw-r--r--mod/profile.php2
-rw-r--r--tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js2
-rw-r--r--tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js2
-rw-r--r--update.php8
-rw-r--r--view/de/jot.tpl6
-rw-r--r--view/en/jot-header.tpl16
-rw-r--r--view/en/jot.tpl6
-rw-r--r--view/fr/jot.tpl7
-rw-r--r--view/it/jot.tpl7
-rw-r--r--view/theme/purplezero/border.jpgbin0 -> 364 bytes
-rw-r--r--view/theme/purplezero/head.jpgbin0 -> 1109 bytes
-rw-r--r--view/theme/purplezero/shiny.pngbin0 -> 320 bytes
-rw-r--r--view/theme/purplezero/style.css27
25 files changed, 341 insertions, 126 deletions
diff --git a/addon/oembed/oembed.php b/addon/oembed/oembed.php
index 82183f3cc..4bbd75387 100644
--- a/addon/oembed/oembed.php
+++ b/addon/oembed/oembed.php
@@ -10,13 +10,11 @@
function oembed_install() {
register_hook('jot_tool', 'addon/oembed/oembed.php', 'oembed_hook_jot_tool');
register_hook('page_header', 'addon/oembed/oembed.php', 'oembed_hook_page_header');
- register_hook('bbcode', 'addon/oembed/oembed.php', 'oembed_hook_bbcode');
}
function oembed_uninstall() {
unregister_hook('jot_tool', 'addon/oembed/oembed.php', 'oembed_hook_jot_tool');
unregister_hook('page_header', 'addon/oembed/oembed.php', 'oembed_hook_page_header');
- unregister_hook('bbcode', 'addon/oembed/oembed.php', 'oembed_hook_bbcode');
}
function oembed_hook_page_header($a, &$b){
@@ -53,49 +51,7 @@ function oembed_hook_jot_tool($a, &$b) {
';
}
-function oembed_replacecb($matches){
- $embedurl=$matches[1];
- $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl);
- $txt = fetch_url($ourl);
- $j = json_decode($txt);
- $ret="<!-- oembed $embedurl -->";
- switch ($j->type) {
- case "video": {
- if (isset($j->thumbnail_url)) {
- $tw = (isset($j->thumbnail_width)) ? $j->thumbnail_width:200;
- $th = (isset($j->thumbnail_height)) ? $j->thumbnail_height:180;
- $ret = "<a href='#' onclick='this.innerHTML=unescape(\"".urlencode($j->html)."\").replace(/\+/g,\" \"); return false;' >";
- $ret.= "<img width='$tw' height='$th' src='".$j->thumbnail_url."'>";
- $ret.= "</a>";
- } else {
- $ret=$j->html;
- }
- $ret.="<br>";
- }; break;
- case "photo": {
- $ret = "<img width='".$j->width."' height='".$j->height."' src='".$j->url."'>";
- $ret.="<br>";
- }; break;
- case "link": {
- //$ret = "<a href='".$embedurl."'>".$j->title."</a>";
- }; break;
- case "rich": {
- // not so safe..
- $ret = "<blockquote>".$j->html."</blockquote>";
- }; break;
- }
-
- $embedlink = (isset($j->title))?$j->title:$embedurl;
- $ret .= "<a href='$embedurl'>$embedlink</a>";
- if (isset($j->author_name)) $ret.=" by ".$j->author_name;
- if (isset($j->provider_name)) $ret.=" on ".$j->provider_name;
- $ret.="<!-- /oembed $embedurl -->";
- return $ret;
-}
-function oembed_hook_bbcode($a, &$text){
- $text = preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", oembed_replacecb ,$text);
-}
?> \ No newline at end of file
diff --git a/boot.php b/boot.php
index 6cbb4f07c..ac010c19d 100644
--- a/boot.php
+++ b/boot.php
@@ -2,7 +2,7 @@
set_time_limit(0);
-define ( 'BUILD_ID', 1033 );
+define ( 'BUILD_ID', 1034 );
define ( 'FRIENDIKA_VERSION', '2.10.0902' );
define ( 'DFRN_PROTOCOL_VERSION', '2.0' );
diff --git a/database.sql b/database.sql
index 54950f0fd..817fd0922 100644
--- a/database.sql
+++ b/database.sql
@@ -471,4 +471,8 @@ CREATE TABLE IF NOT EXISTS `event` (
`deny_gid` MEDIUMTEXT NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8;
-
+CREATE TABLE IF NOT EXISTS 'cache' (
+ `k` CHAR( 255 ) NOT NULL PRIMARY KEY ,
+ `v` TEXT NOT NULL,
+ `updated` DATETIME NOT NULL
+) ENGINE = MYISAM DEFAULT CHARSET=utf8;
diff --git a/htconfig.php b/htconfig.php
index 13c065e69..5f5c76cbd 100644
--- a/htconfig.php
+++ b/htconfig.php
@@ -72,4 +72,7 @@ $a->config['system']['rino_encrypt'] = true;
$a->config['system']['addon'] = 'js_upload';
- \ No newline at end of file
+// Disable oembed embedding
+// This disable the conversion of [embed]$url[/embed] tag in html
+// $a->config['system']['no_oembed'] = true;
+
diff --git a/include/acl_selectors.php b/include/acl_selectors.php
index 554782a82..269dc3e34 100644
--- a/include/acl_selectors.php
+++ b/include/acl_selectors.php
@@ -17,8 +17,9 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
$selected = " selected=\"selected\" ";
else
$selected = '';
+ $trimmed = substr($rr['name'],0,12);
- $o .= "<option value=\"{$rr['id']}\" $selected >{$rr['name']}</option>\r\n";
+ $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}\" >$trimmed</option>\r\n";
}
}
@@ -66,7 +67,9 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
else
$selected = '';
- $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['url']}\" >{$rr['name']}</option>\r\n";
+ $trimmed = substr($rr['name'],0,22);
+
+ $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}|{$rr['url']}\" >$trimmed</option>\r\n";
}
}
diff --git a/include/bbcode.php b/include/bbcode.php
index 8382cc804..eb0806dc5 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -1,5 +1,5 @@
<?php
-
+require_once("include/oembed.php");
// BBcode 2 HTML was written by WAY2WEB.net
// extended to work with Mistpark/Friendika - Mike Macgirvin
@@ -93,6 +93,9 @@ function bbcode($Text) {
$Text = preg_replace("/\[youtube\]http:\/\/www.youtube.com\/watch\?v\=(.+?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text);
$Text = preg_replace("/\[youtube\](.+?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
+ // oembed tag
+ $Text = oembed_bbcode2html($Text);
+
call_hooks('bbcode',$Text);
return $Text;
diff --git a/include/items.php b/include/items.php
index a5991d663..f204745bb 100644
--- a/include/items.php
+++ b/include/items.php
@@ -1,6 +1,7 @@
<?php
require_once('bbcode.php');
+require_once('oembed.php');
function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
@@ -395,6 +396,8 @@ function get_atom_elements($feed,$item) {
$res['body'] = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
'[youtube]$1[/youtube]', $res['body']);
+ $res['body'] = oembed_html2bbcode($res['body']);
+
$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
diff --git a/include/notifier.php b/include/notifier.php
index 59e29d7d1..8442349cf 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -159,11 +159,12 @@ function notifier_run($argv, $argc){
$r = q("SELECT * FROM `contact` WHERE `id` IN ( $conversant_str ) AND `blocked` = 0 AND `pending` = 0");
- if( ! count($r)){
- return;
- }
+// if( ! count($r)){
+// return;
+// }
- $contacts = $r;
+ if(count($r))
+ $contacts = $r;
}
$feed_template = load_view_file('view/atom_feed.tpl');
@@ -255,90 +256,90 @@ function notifier_run($argv, $argc){
$recip_str = implode(', ', $recipients);
- $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 ",
+ $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ",
dbesc($recip_str)
);
- if(! count($r)){
- return;
- }
+
// delivery loop
require_once('include/salmon.php');
- foreach($r as $contact) {
- if($contact['self'])
- continue;
-
- $deliver_status = 0;
+ if(count($r)) {
+ foreach($r as $contact) {
+ if($contact['self'])
+ continue;
- switch($contact['network']) {
- case 'dfrn':
- logger('notifier: dfrndelivery: ' . $contact['name']);
- $deliver_status = dfrn_deliver($owner,$contact,$atom);
+ $deliver_status = 0;
- logger('notifier: dfrn_delivery returns ' . $deliver_status);
-
- if($deliver_status == (-1)) {
- logger('notifier: delivery failed: queuing message');
- // queue message for redelivery
- q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
- VALUES ( %d, '%s', '%s', '%s') ",
- intval($contact['id']),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($atom)
- );
- }
- break;
- case 'stat':
- if($followup && $contact['notify']) {
- logger('notifier: slapdelivery: ' . $contact['name']);
- $deliver_status = slapper($owner,$contact['notify'],$slap);
+ switch($contact['network']) {
+ case 'dfrn':
+ logger('notifier: dfrndelivery: ' . $contact['name']);
+ $deliver_status = dfrn_deliver($owner,$contact,$atom);
+ logger('notifier: dfrn_delivery returns ' . $deliver_status);
+
if($deliver_status == (-1)) {
+ logger('notifier: delivery failed: queuing message');
// queue message for redelivery
q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
VALUES ( %d, '%s', '%s', '%s') ",
intval($contact['id']),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- dbesc($slap)
+ dbesc($atom)
);
-
}
+ break;
+ case 'stat':
+ if($followup && $contact['notify']) {
+ logger('notifier: slapdelivery: ' . $contact['name']);
+ $deliver_status = slapper($owner,$contact['notify'],$slap);
+
+ if($deliver_status == (-1)) {
+ // queue message for redelivery
+ q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
+ VALUES ( %d, '%s', '%s', '%s') ",
+ intval($contact['id']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($slap)
+ );
+ }
+
- }
- else {
-
- // only send salmon if public - e.g. if it's ok to notify
- // a public hub, it's ok to send a salmon
-
- if(count($slaps) && $notify_hub) {
- logger('notifier: slapdelivery: ' . $contact['name']);
- foreach($slaps as $slappy) {
- if($contact['notify']) {
- $deliver_status = slapper($owner,$contact['notify'],$slappy);
- if($deliver_status == (-1)) {
- // queue message for redelivery
- q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
- VALUES ( %d, '%s', '%s', '%s') ",
- intval($contact['id']),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($slappy)
- );
+ }
+ else {
+
+ // only send salmon if public - e.g. if it's ok to notify
+ // a public hub, it's ok to send a salmon
+
+ if(count($slaps) && $notify_hub) {
+ logger('notifier: slapdelivery: ' . $contact['name']);
+ foreach($slaps as $slappy) {
+ if($contact['notify']) {
+ $deliver_status = slapper($owner,$contact['notify'],$slappy);
+ if($deliver_status == (-1)) {
+ // queue message for redelivery
+ q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
+ VALUES ( %d, '%s', '%s', '%s') ",
+ intval($contact['id']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($slappy)
+ );
+ }
}
}
}
}
- }
- break;
- case 'mail':
- case 'dspr':
- case 'feed':
- default:
- break;
+ break;
+ case 'mail':
+ case 'dspr':
+ case 'feed':
+ default:
+ break;
+ }
}
}
@@ -370,6 +371,55 @@ function notifier_run($argv, $argc){
}
}
+ if($notify_hub) {
+
+ /**
+ *
+ * If you have less than 150 dfrn friends and it's a public message,
+ * we'll just go ahead and push them out securely with dfrn/rino.
+ * If you've got more than that, you'll have to rely on PuSH delivery.
+ *
+ */
+
+ $max_allowed = ((get_config('system','maxpubdeliver') === false) ? 150 : intval(get_config('system','maxdeliver')));
+
+ /**
+ *
+ * Only get the bare essentials and go back for the full record.
+ * If you've got a lot of friends and we grab all the details at once it could exhaust memory.
+ *
+ */
+
+ $r = q("SELECT `id`, `name` FROM `contact`
+ WHERE `network` = 'dfrn' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+ AND `rel` != %d ",
+ intval($owner['uid']),
+ intval(REL_FAN)
+ );
+
+ if((count($r)) && (($max_allowed == 0) || (count($r) < $max_allowed))) {
+
+ foreach($r as $rr) {
+
+ /* Don't deliver to folks who have already been delivered to */
+
+ if(! in_array($rr['id'], $conversants)) {
+ $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
+ intval($rr['id'])
+ );
+
+ if(count($n)) {
+
+ logger('notifier: dfrnpubdelivery: ' . $n[0]['name']);
+ $deliver_status = dfrn_deliver($owner,$n[0],$atom);
+ }
+ }
+ else
+ logger('notifier: dfrnpubdelivery: ignoring ' . $rr['name']);
+ }
+ }
+ }
+
return;
}
diff --git a/include/oembed.php b/include/oembed.php
new file mode 100644
index 000000000..37923a877
--- /dev/null
+++ b/include/oembed.php
@@ -0,0 +1,97 @@
+<?php
+function oembed_replacecb($matches){
+ $embedurl=$matches[1];
+
+ $r = q("SELECT v FROM `cache` WHERE k='%s'",
+ dbesc($embedurl));
+ if(count($r)){
+ $txt = $r[0]['v'];
+ } else {
+ $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl);
+ $txt = fetch_url($ourl);
+ //save in cache
+ q("INSERT INTO `cache` VALUES ('%s','%s','%s')",
+ dbesc($embedurl),
+ dbesc($txt),
+ dbesc(datetime_convert()));
+ }
+ $j = json_decode($txt);
+ $ret="<span class='oembed'>";
+ switch ($j->type) {
+ case "video": {
+ if (isset($j->thumbnail_url)) {
+ $tw = (isset($j->thumbnail_width)) ? $j->thumbnail_width:200;
+ $th = (isset($j->thumbnail_height)) ? $j->thumbnail_height:180;
+ $ret = "<a href='".$embedurl."' onclick='this.innerHTML=unescape(\"".urlencode($j->html)."\").replace(/\+/g,\" \"); return false;' >";
+ $ret.= "<img width='$tw' height='$th' src='".$j->thumbnail_url."'>";
+ $ret.= "</a>";
+ } else {
+ $ret=$j->html;
+ }
+ $ret.="<br>";
+ }; break;
+ case "photo": {
+ $ret = "<img width='".$j->width."' height='".$j->height."' src='".$j->url."'>";
+ $ret.="<br>";
+ }; break;
+ case "link": {
+ //$ret = "<a href='".$embedurl."'>".$j->title."</a>";
+ }; break;
+ case "rich": {
+ // not so safe..
+ $ret = "<blockquote>".$j->html."</blockquote>";
+ }; break;
+ }
+
+ $embedlink = (isset($j->title))?$j->title:$embedurl;
+ $ret .= "<a href='$embedurl' rel='oembed'>$embedlink</a>";
+ if (isset($j->author_name)) $ret.=" by ".$j->author_name;
+ if (isset($j->provider_name)) $ret.=" on ".$j->provider_name;
+ $ret.="</span>";
+ return $ret;
+}
+
+function oembed_bbcode2html($text){
+ $stopoembed = get_config("system","no_oembed");
+ if ($stopoembed == true){
+ return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "<!-- oembed $1 --><i>". t('Embedding disabled') ." : $1</i><!-- /oembed $1 -->" ,$text);
+ }
+ return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", 'oembed_replacecb' ,$text);
+}
+
+
+function oe_build_xpath($attr, $value){
+ // http://westhoffswelt.de/blog/0036_xpath_to_select_html_by_class.html
+ return "contains( normalize-space( @$attr ), ' $value ' ) or substring( normalize-space( @$attr ), 1, string-length( '$value' ) + 1 ) = '$value ' or substring( normalize-space( @$attr ), string-length( @$attr ) - string-length( '$value' ) ) = ' $value' or @$attr = '$value'";
+}
+
+function oe_get_inner_html( $node ) {
+ $innerHTML= '';
+ $children = $node->childNodes;
+ foreach ($children as $child) {
+ $innerHTML .= $child->ownerDocument->saveXML( $child );
+ }
+ return $innerHTML;
+}
+
+/**
+ * Find <span class='oembed'>..<a href='url' rel='oembed'>..</a></span>
+ * and replace it with [embed]url[/embed]
+ */
+function oembed_html2bbcode($text) {
+ $dom = DOMDocument::loadHTML($text);
+ $xpath = new DOMXPath($dom);
+ $attr = "oembed";
+
+ $xattr = oe_build_xpath("class","oembed");
+ $entries = $xpath->query("//span[$xattr]");
+
+ $xattr = oe_build_xpath("rel","oembed");
+ foreach($entries as $e) {
+ $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue;
+ if(!is_null($href)) $e->parentNode->replaceChild(new DOMText("[embed]".$href."[embed]"), $e);
+ }
+ return oe_get_inner_html( $dom->getElementsByTagName("body")->item(0) );
+}
+
+?> \ No newline at end of file
diff --git a/include/poller.php b/include/poller.php
index 4567a5cfc..2ba285b7b 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -30,6 +30,10 @@ function poller_run($argv, $argc){
$php_path = ((x($a->config,'php_path') && strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
//proc_close(proc_open("\"$php_path\" \"include/queue.php\" &", array(), $foo));
proc_run($php_path,"include/queue.php");
+
+ // clear old cache
+ q("DELETE FROM `cache` WHERE `updated`<'%s'",
+ dbesc(datetime_convert('UTC','UTC',"now - 30 days")));
$hub_update = false;
diff --git a/mod/item.php b/mod/item.php
index cc1886c17..7125ae1f4 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -422,12 +422,39 @@ function item_post(&$a) {
logger('mod_item: notifier invoked: ' . "\"$php_path\" \"include/notifier.php\" \"$notify_type\" \"$post_id\" &");
- proc_run($php_path, "include/notifier.php", $notify_type, "$post_id");
+ proc_run($php_path, "include/notifier.php", $notify_type, "$post_id");
$datarray['id'] = $post_id;
call_hooks('post_local_end', $datarray);
-
+
+ if(strlen($emailcc) && $profile_uid == local_user()) {
+ $erecips = explode(',', $emailcc);
+ if(count($erecips)) {
+ foreach($erecips as $recip) {
+ $addr = trim($recip);
+ if(! strlen($addr))
+ continue;
+ $disclaimer = '<hr />' . t('This message was sent to you by ') . $a->user['username']
+ . t(', a member of the Friendika social network.') . '<br />';
+ $disclaimer .= t('You may visit them online at') . ' '
+ . $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '<br />';
+ $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . '<br />';
+
+ $subject = '[Friendika]' . ' ' . $a->user['username'] . ' ' . t('posted an update.');
+ $headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n";
+ $headers .= 'MIME-Version: 1.0' . "\n";
+ $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+ $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
+ $link = '<a href="' . $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '"><img src="' . $author['thumb'] . '" alt="' . $a->user['username'] . '" /></a><br /><br />';
+ $html = prepare_body($datarray);
+ $message = '<html><body>' . $link . $html . $disclaimer . '</body></html>';
+ @mail($addr, $subject, $message, $headers);
+ }
+ }
+ }
+
+
goaway($a->get_baseurl() . "/" . $_POST['return'] );
return; // NOTREACHED
diff --git a/mod/network.php b/mod/network.php
index 50d7134c1..80edca1d0 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -87,6 +87,8 @@ function network_content(&$a, $update = 0) {
'$baseurl' => $a->get_baseurl(),
'$defloc' => $a->user['default-location'],
'$visitor' => 'block',
+ '$emailcc' => t('CC: email addresses'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $lockstate,
'$acl' => populate_acl((($group) ? $group_acl : $a->user), $celeb),
'$bang' => (($group) ? '!' : ''),
diff --git a/mod/profile.php b/mod/profile.php
index c84b493c5..91c1ba6d8 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -144,6 +144,8 @@ function profile_content(&$a, $update = 0) {
'$return_path' => $a->cmd,
'$visitor' => (($is_owner || $commvisitor) ? 'block' : 'none'),
'$lockstate' => $lockstate,
+ '$emailcc' => t('CC: email addresses'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$bang' => '',
'$acl' => (($is_owner) ? populate_acl($a->user, $celeb) : ''),
'$profile_uid' => $a->profile['profile_uid'],
diff --git a/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js b/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js
index 69694b1f9..502b00817 100644
--- a/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js
@@ -36,7 +36,7 @@ link_desc:"Insert/edit link",
unlink_desc:"Unlink",
image_desc:"Insert/edit image",
cleanup_desc:"Cleanup messy code",
-code_desc:"Edit HTML Source",
+code_desc:"Edit BBcode Source",
sub_desc:"Subscript",
sup_desc:"Superscript",
hr_desc:"Insert horizontal ruler",
diff --git a/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js b/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
index 9d124d7db..ea5a6dae2 100644
--- a/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
@@ -10,7 +10,7 @@ about_version:"Version",
about_loaded:"Loaded plugins",
anchor_title:"Insert/edit anchor",
anchor_name:"Anchor name",
-code_title:"HTML Source Editor",
+code_title:"BBcode Source Editor",
code_wordwrap:"Word wrap",
colorpicker_title:"Select a color",
colorpicker_picker_tab:"Picker",
diff --git a/update.php b/update.php
index 0bd58d6d4..f7bf9da1e 100644
--- a/update.php
+++ b/update.php
@@ -320,3 +320,11 @@ function update_1031() {
function update_1032() {
q("ALTER TABLE `profile` ADD `pdesc` CHAR( 255 ) NOT NULL AFTER `name` ");
}
+
+function update_1033() {
+ q("CREATE TABLE IF NOT EXISTS `cache` (
+ `k` CHAR( 255 ) NOT NULL PRIMARY KEY ,
+ `v` TEXT NOT NULL,
+ `updated` DATETIME NOT NULL
+ ) ENGINE = MYISAM DEFAULT CHARSET=utf8;");
+}
diff --git a/view/de/jot.tpl b/view/de/jot.tpl
index f42f37156..d86d8f847 100644
--- a/view/de/jot.tpl
+++ b/view/de/jot.tpl
@@ -40,8 +40,12 @@
<div id="profile-rotator-wrapper" style="display: $visitor;" >
<img id="profile-rotator" src="images/rotator.gif" alt="Bitte warten" title="Bitte warten" style="display: none;" />
</div>
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Berechtigungseinstellungen" title="Berechtigungseinstellungen" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div>
+ <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Berechtigungseinstellungen" title="Berechtigungseinstellungen" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div>
<div id="profile-jot-perms-end"></div>
+ <div id="profile-jot-email-wrapper" style="display: none;" >
+ <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle">
+ <div id="profile-jot-email-end"></div>
+ </div>
<div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div>
</div>
diff --git a/view/en/jot-header.tpl b/view/en/jot-header.tpl
index b687f65a6..d0c956a02 100644
--- a/view/en/jot-header.tpl
+++ b/view/en/jot-header.tpl
@@ -2,17 +2,20 @@
<script language="javascript" type="text/javascript" src="$baseurl/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
+var editor;
+
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
editor_selector: /(profile-jot-text|prvmail-text)/,
- plugins : "bbcode",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect",
+ plugins : "bbcode,paste",
+ theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
theme_advanced_buttons2 : "",
theme_advanced_buttons3 : "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "center",
theme_advanced_blockformats : "blockquote,code",
+ paste_text_sticky : true,
entity_encoding : "raw",
add_unload_trigger : false,
remove_linebreaks : false,
@@ -43,8 +46,13 @@ tinyMCE.init({
$('#character-counter').addClass('red');
}
$('#character-counter').text(text);
- });
- }
+ });
+
+ ed.onInit.add(function(ed) {
+ ed.pasteAsPlainText = true;
+ });
+
+ }
});
</script>
diff --git a/view/en/jot.tpl b/view/en/jot.tpl
index de88fb84f..d2a1014e7 100644
--- a/view/en/jot.tpl
+++ b/view/en/jot.tpl
@@ -40,8 +40,12 @@
<div id="profile-rotator-wrapper" style="display: $visitor;" >
<img id="profile-rotator" src="images/rotator.gif" alt="Please wait" title="Please wait" style="display: none;" />
</div>
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div>
+ <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div>
<div id="profile-jot-perms-end"></div>
+ <div id="profile-jot-email-wrapper" style="display: none;" >
+ <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle">
+ <div id="profile-jot-email-end"></div>
+ </div>
<div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div>
</div>
diff --git a/view/fr/jot.tpl b/view/fr/jot.tpl
index 9a5c58153..7c49d771d 100644
--- a/view/fr/jot.tpl
+++ b/view/fr/jot.tpl
@@ -41,8 +41,13 @@
<div id="profile-rotator-wrapper" style="display: $visitor;" >
<img id="profile-rotator" src="images/rotator.gif" alt="Please wait" title="Please wait" style="display: none;" />
</div>
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div>
+ <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Permission Settings" title="Permission Settings" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div>
<div id="profile-jot-perms-end"></div>
+ <div id="profile-jot-email-wrapper" style="display: none;" >
+ <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle">
+ <div id="profile-jot-email-end"></div>
+ </div>
+
<div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div>
</div>
diff --git a/view/it/jot.tpl b/view/it/jot.tpl
index b0c90ddf5..7153c341c 100644
--- a/view/it/jot.tpl
+++ b/view/it/jot.tpl
@@ -40,8 +40,13 @@
<div id="profile-rotator-wrapper" style="display: $visitor;" >
<img id="profile-rotator" src="images/rotator.gif" alt="Attendi" title="Attendi" style="display: none;" />
</div>
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Impostazione permessi" title="Impostazione permessi" onClick="openClose('profile-jot-acl-wrapper');" />$bang</div>
+ <div id="profile-jot-perms" class="profile-jot-perms" style="display: $visitor;" ><img id="jot-perms-icon" src="images/$lockstate_icon.gif" alt="Impostazione permessi" title="Impostazione permessi" onClick="openClose('profile-jot-acl-wrapper'); openClose('profile-jot-email-wrapper');" />$bang</div>
<div id="profile-jot-perms-end"></div>
+ <div id="profile-jot-email-wrapper" style="display: none;" >
+ <div id="profile-jot-email-label">$emailcc</div><input type="text" name="emailcc" id="profile-jot-email" title="$emtitle">
+ <div id="profile-jot-email-end"></div>
+ </div>
+
<div id="profile-jot-acl-wrapper" style="display: none;" >$acl</div>
</div>
diff --git a/view/theme/purplezero/border.jpg b/view/theme/purplezero/border.jpg
new file mode 100644
index 000000000..66c7a6fcc
--- /dev/null
+++ b/view/theme/purplezero/border.jpg
Binary files differ
diff --git a/view/theme/purplezero/head.jpg b/view/theme/purplezero/head.jpg
new file mode 100644
index 000000000..1acd2ddb8
--- /dev/null
+++ b/view/theme/purplezero/head.jpg
Binary files differ
diff --git a/view/theme/purplezero/shiny.png b/view/theme/purplezero/shiny.png
new file mode 100644
index 000000000..d3f71ee1d
--- /dev/null
+++ b/view/theme/purplezero/shiny.png
Binary files differ
diff --git a/view/theme/purplezero/style.css b/view/theme/purplezero/style.css
new file mode 100644
index 000000000..16c9dc650
--- /dev/null
+++ b/view/theme/purplezero/style.css
@@ -0,0 +1,27 @@
+@import url('../duepuntozero/style.css');
+
+a, a:visited { color: #7433af; text-decoration: none; }
+a:hover {text-decoration: underline; }
+
+
+body { background-image: url(head.jpg); }
+aside( background-image: url(border.jpg); }
+section { background-image: url(border.jpg); }
+#profile-tabs-wrapper { background-image: url(head.jpg); }
+div.wall-item-content-wrapper.shiny { background-image: url('shiny.png'); }
+
+
+.nav-commlink, .nav-login-link {
+ background-color: #aed3b2;
+
+}
+
+.fakelink, .fakelink:visited {
+ color: #7433af;
+}
+
+.wall-item-name-link {
+ color: #7433af;
+}
+
+