diff --git a/README b/README new file mode 100644 index 000000000..e75d6319b --- /dev/null +++ b/README @@ -0,0 +1,3 @@ +This is my personal fork of https://github.com/friendica/friendica + +If you want to have a stable version of friendica please look there. diff --git a/boot.php b/boot.php index 79a925961..8b78c0ee5 100755 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once('include/nav.php'); require_once('include/cache.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '2.3.1259' ); +define ( 'FRIENDICA_VERSION', '2.3.1260' ); define ( 'DFRN_PROTOCOL_VERSION', '2.22' ); define ( 'DB_UPDATE_VERSION', 1123 ); @@ -309,8 +309,12 @@ class App { . 'library/phpsec' . PATH_SEPARATOR . '.' ); - if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") + if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") { $this->query_string = substr($_SERVER['QUERY_STRING'],2); + // removing trailing / - maybe a nginx problem + if (substr($this->query_string, 0, 1) == "/") + $this->query_string = substr($this->query_string, 1); + } if(x($_GET,'q')) $this->cmd = trim($_GET['q'],'/\\'); diff --git a/doc/Groups-and-Privacy.md b/doc/Groups-and-Privacy.md old mode 100755 new mode 100644 index 61da25a21..7e93fb9d0 --- a/doc/Groups-and-Privacy.md +++ b/doc/Groups-and-Privacy.md @@ -22,7 +22,7 @@ But wait, there's more... If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles. -These private conversations work best when your friends are Freindika members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others. +These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others. This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends. diff --git a/include/api.php b/include/api.php index 04f95ebd9..013f4b97a 100755 --- a/include/api.php +++ b/include/api.php @@ -99,6 +99,10 @@ **************************/ function api_call(&$a){ GLOBAL $API, $called_api; + + // preset + $type="json"; + foreach ($API as $p=>$info){ if (strpos($a->query_string, $p)===0){ $called_api= explode("/",$p); @@ -109,14 +113,14 @@ load_contact_links(local_user()); - logger('API call for ' . $a->user['username'] . ': ' . $a->query_string); + logger('API call for ' . $a->user['username'] . ': ' . $a->query_string); logger('API parameters: ' . print_r($_REQUEST,true)); - $type="json"; + $type="json"; if (strpos($a->query_string, ".xml")>0) $type="xml"; if (strpos($a->query_string, ".json")>0) $type="json"; if (strpos($a->query_string, ".rss")>0) $type="rss"; - if (strpos($a->query_string, ".atom")>0) $type="atom"; - + if (strpos($a->query_string, ".atom")>0) $type="atom"; + $r = call_user_func($info['func'], $a, $type); if ($r===false) return; @@ -126,8 +130,8 @@ header ("Content-Type: text/xml"); return ''."\n".$r; break; - case "json": - //header ("Content-Type: application/json"); + case "json": + //header ("Content-Type: application/json"); foreach($r as $rr) return json_encode($rr); break; @@ -139,19 +143,20 @@ header ("Content-Type: application/atom+xml"); return ''."\n".$r; break; - + } //echo "
"; var_dump($r); die(); } } + logger('API call not implemented: '.$a->query_string." - ".print_r($_REQUEST,true)); $r = ''; switch($type){ case "xml": header ("Content-Type: text/xml"); return ''."\n".$r; break; - case "json": - header ("Content-Type: application/json"); + case "json": + header ("Content-Type: application/json"); return json_encode(array('error' => 'not implemented')); break; case "rss": @@ -162,7 +167,6 @@ header ("Content-Type: application/atom+xml"); return ''."\n".$r; break; - } } @@ -453,7 +457,49 @@ return null; } - // TODO - media uploads +/*Waitman Gobble Mod*/ + function api_statuses_mediap(&$a, $type) { + if (local_user()===false) { + logger('api_statuses_update: no user'); + return false; + } + $user_info = api_get_user($a); + + $_REQUEST['type'] = 'wall'; + $_REQUEST['profile_uid'] = local_user(); + $_REQUEST['api_source'] = true; + $txt = urldecode(requestdata('status')); + + require_once('library/HTMLPurifier.auto.php'); + require_once('include/html2bbcode.php'); + + if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) { + $txt = html2bb_video($txt); + $config = HTMLPurifier_Config::createDefault(); + $config->set('Cache.DefinitionImpl', null); + $purifier = new HTMLPurifier($config); + $txt = $purifier->purify($txt); + } + $txt = html2bbcode($txt); + + $a->argv[1]=$user_info['screen_name']; //should be set to username? + + $_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo + require_once('mod/wall_upload.php'); + $bebop = wall_upload_post($a); + + //now that we have the img url in bbcode we can add it to the status and insert the wall item. + $_REQUEST['body']=$txt."\n\n".$bebop; + require_once('mod/item.php'); + item_post($a); + + // this should output the last post (the one we just posted). + return api_status_show($a,$type); + } + api_register_func('api/statuses/mediap','api_statuses_mediap', true); +/*Waitman Gobble Mod*/ + + function api_statuses_update(&$a, $type) { if (local_user()===false) { logger('api_statuses_update: no user'); diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index c26b0c334..70d4bec9a 100755 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -8,35 +8,54 @@ require_once('include/html2bbcode.php'); // we don't want to support a bbcode specific markdown interpreter // and the markdown library we have is pretty good, but provides HTML output. -// So we'll use that to convert to HTML, then convert the HTML back to bbcode, +// So we'll use that to convert to HTML, then convert the HTML back to bbcode, // and then clean up a few Diaspora specific constructs. function diaspora2bb($s) { + // for testing purposes: Collect raw markdown articles + $file = tempnam("/tmp/friendica/", "markdown"); + file_put_contents($file, $s); + $s = html_entity_decode($s,ENT_COMPAT,'UTF-8'); - $s = str_replace("\r","\n",$s); + + // Too many new lines. So deactivated the following line + // $s = str_replace("\r","\n",$s); + // Simply remove cr. + $s = str_replace("\r","",$s); + + // not implemented
is invalid. Replace it with the valid expression + $s = str_replace("
","
",$s); $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s); - $s = preg_replace('/\#([^\s\#])/','\\#$1',$s); + // Escaping the hash tags - doesn't always seem to work + // $s = preg_replace('/\#([^\s\#])/','\\#$1',$s); + // This seems to work + $s = preg_replace('/\#([^\s\#])/','#$1',$s); $s = Markdown($s); - $s = str_replace('#','#',$s); - $s = str_replace("\n",'
',$s); + $s = str_replace('#','#',$s); + + $s = str_replace("\n",'
',$s); $s = html2bbcode($s); // $s = str_replace('*','*',$s); + // Convert everything that looks like a link to a link + $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3]$2$3[/url]',$s); - $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s); - $s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s); - $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s); - $s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s); - $s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url]$2$3$4[/url]',$s); + //$s = preg_replace("/([^\]\=]|^)(https?\:\/\/)(vimeo|youtu|www\.youtube|soundcloud)([a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1[url=$2$3$4]$2$3$4[/url]',$s); + $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/url\]/ism",'[youtube]$2[/youtube]',$s); + $s = preg_replace("/\[url\=https?:\/\/www.youtube.com\/watch\?v\=(.*?)\].*?\[\/url\]/ism",'[youtube]$1[/youtube]',$s); + $s = preg_replace("/\[url\=?(.*?)\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/url\]/ism",'[vimeo]$2[/vimeo]',$s); + $s = preg_replace("/\[url\=https?:\/\/vimeo.com\/([0-9]+)\](.*?)\[\/url\]/ism",'[vimeo]$1[/vimeo]',$s); // remove duplicate adjacent code tags $s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s); - $s = scale_diaspora_images($s); + + // Don't show link to full picture (until it is fixed) + $s = scale_diaspora_images($s, false); return $s; } diff --git a/include/bbcode.php b/include/bbcode.php index cae867eb8..32053b4ec 100755 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -12,20 +12,20 @@ function stripcode_br_cb($s) { function tryoembed($match){ $url = ((count($match)==2)?$match[1]:$match[2]); // logger("tryoembed: $url"); - + $o = oembed_fetch_url($url); //echo ""; var_dump($match, $url, $o); killme(); if ($o->type=="error") return $match[0]; - + $html = oembed_format_object($o); return $html; //oembed_iframe($html,$o->width,$o->height); - + } -// [noparse][i]italic[/i][/noparse] turns into -// [noparse][ i ]italic[ /i ][/noparse], +// [noparse][i]italic[/i][/noparse] turns into +// [noparse][ i ]italic[ /i ][/noparse], // to hide them from parser. function bb_spacefy($st) { @@ -36,7 +36,7 @@ function bb_spacefy($st) { return $new_str; } -// The previously spacefied [noparse][ i ]italic[ /i ][/noparse], +// The previously spacefied [noparse][ i ]italic[ /i ][/noparse], // now turns back and the [noparse] tags are trimed // returning [i]italic[/i] @@ -59,8 +59,8 @@ function bbcode($Text,$preserve_nl = false) { $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text); - // Extract a single private image which uses data url's since preg has issues with - // large data sizes. Stash it away while we do bbcode conversion, and then put it back + // Extract a single private image which uses data url's since preg has issues with + // large data sizes. Stash it away while we do bbcode conversion, and then put it back // in after we've done all the regex matching. We cannot use any preg functions to do this. $saved_image = ''; @@ -71,13 +71,13 @@ function bbcode($Text,$preserve_nl = false) { $start_fragment = substr($Text,0,$img_start); $img_start += strlen('[img]'); $saved_image = substr($Text,$img_start,$img_end - $img_start); - $end_fragment = substr($Text,$img_end + strlen('[/img]')); + $end_fragment = substr($Text,$img_end + strlen('[/img]')); // logger('saved_image: ' . $saved_image,LOGGER_DEBUG); $Text = $start_fragment . '[$#saved_image#$]' . $end_fragment; } // If we find any event code, turn it into an event. - // After we're finished processing the bbcode we'll + // After we're finished processing the bbcode we'll // replace all of the event code with a reformatted version. $ev = bbtoevent($Text); @@ -105,7 +105,7 @@ function bbcode($Text,$preserve_nl = false) { // Perform URL Search $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1$2', $Text); - + $Text = preg_replace_callback("/\[bookmark\=([^\]]*)\].*?\[\/bookmark\]/ism",'tryoembed',$Text); $Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$Text); @@ -118,7 +118,7 @@ function bbcode($Text,$preserve_nl = false) { // Perform MAIL Search $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '$1', $Text); $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '$2', $Text); - + // Check for bold text $Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'$1',$Text); @@ -149,21 +149,20 @@ function bbcode($Text,$preserve_nl = false) { $Text = str_replace("[*]", "
$1'; + $QuoteLayout = '
$1'; // Check for [quote] text - $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text); + // handle nested quotes + $endlessloop = 0; + while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote]") !== false and (++$endlessloop < 20)) + $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text); // Check for [quote=Author] text $t_wrote = t('$1 wrote:'); - $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", - "
" . $t_wrote . " $2", - $Text); + // handle nested quotes + $endlessloop = 0; + while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote=") !== false and (++$endlessloop < 20)) + $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", + "
" . $t_wrote . " $2", + $Text); // [img=widthxheight]image source[/img] $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '', $Text); diff --git a/include/diaspora.php b/include/diaspora.php index a8e02e509..92f3500f2 100755 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -451,7 +451,7 @@ function diaspora_request($importer,$xml) { // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. - if($contact['rel'] == CONTACT_IS_FOLLOWER) { + if($contact['rel'] == CONTACT_IS_FOLLOWER && $importer['page-flags'] != PAGE_COMMUNITY) { q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1", intval(CONTACT_IS_FRIEND), intval($contact['id']), @@ -619,6 +619,18 @@ function diaspora_request($importer,$xml) { return; } +function diaspora_post_allow($importer,$contact) { + if(($contact['blocked']) || ($contact['readonly'])) + return false; + if($contact['rel'] == CONTACT_IS_SHARING || $contact['rel'] == CONTACT_IS_FRIEND) + return true; + if($contact['rel'] == CONTACT_IS_FOLLOWER) + if($importer['page-flags'] == PAGE_COMMUNITY) + return true; + return false; +} + + function diaspora_post($importer,$xml) { $a = get_app(); @@ -629,7 +641,7 @@ function diaspora_post($importer,$xml) { if(! $contact) return; - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(! diaspora_post_allow($importer,$contact)) { logger('diaspora_post: Ignoring this author.'); return 202; } @@ -748,7 +760,7 @@ function diaspora_reshare($importer,$xml) { if(! $contact) return; - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(! diaspora_post_allow($importer,$contact)) { logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true)); return 202; } @@ -900,7 +912,7 @@ function diaspora_asphoto($importer,$xml) { if(! $contact) return; - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(! diaspora_post_allow($importer,$contact)) { logger('diaspora_asphoto: Ignoring this author.'); return 202; } @@ -1001,7 +1013,7 @@ function diaspora_comment($importer,$xml,$msg) { return; } - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(! diaspora_post_allow($importer,$contact)) { logger('diaspora_comment: Ignoring this author.'); return 202; } @@ -1446,7 +1458,7 @@ function diaspora_photo($importer,$xml,$msg) { return; } - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(! diaspora_post_allow($importer,$contact)) { logger('diaspora_photo: Ignoring this author.'); return 202; } @@ -1503,7 +1515,7 @@ function diaspora_like($importer,$xml,$msg) { return; } - if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { + if(! diaspora_post_allow($importer,$contact)) { logger('diaspora_like: Ignoring this author.'); return 202; } diff --git a/include/html2bbcode.php b/include/html2bbcode.php index 8025c336b..4297ff2f9 100755 --- a/include/html2bbcode.php +++ b/include/html2bbcode.php @@ -1,127 +1,286 @@ (.*?)\<\/pre\>/is', - '/\
/is',
- '/\<\/p\>/is',
- '/\(.*?)\<\/b\>/is',
- '/\(.*?)\<\/i\>/is',
- '/\(.*?)\<\/u\>/is',
- '/\ $value $backlink(.*?)\<\/ul\>/is',
- '/\
/is',
- '/\(.*?)\<\/strong\>/is',
- '/\(.*?)\<\/a\>/is',
- '/\(.*?)\<\/code\>/is',
- '/\(.*?)\<\/span\>/is',
- '/\(.*?)\<\/span\>/is',
- '/\
";
@@ -821,7 +815,7 @@ class Markdown_Parser {
\]
)
- }xs',
+ }xs',
array(&$this, '_doImages_reference_callback'), $text);
#
@@ -835,18 +829,18 @@ class Markdown_Parser {
\]
\s? # One optional whitespace character
\( # literal paren
- [ ]*
+ [ \n]*
(?:
<(\S*)> # src url = $3
|
('.$this->nested_url_parenthesis_re.') # src url = $4
)
- [ ]*
+ [ \n]*
( # $5
([\'"]) # quote char = $6
(.*?) # title = $7
\6 # matching quote
- [ ]*
+ [ \n]*
)? # title is optional
\)
)
@@ -906,7 +900,7 @@ class Markdown_Parser {
# Setext-style headers:
# Header 1
# ========
- #
+ #
# Header 2
# --------
#
@@ -936,7 +930,7 @@ class Markdown_Parser {
# Terrible hack to check we haven't found an empty list item.
if ($matches[2] == '-' && preg_match('{^-(?: |$)}', $matches[1]))
return $matches[0];
-
+
$level = $matches[2]{0} == '=' ? 1 : 2;
$block = "(.*?)\<\/blockquote\>/is',
- '/\
content,
+ # These leading spaces cause problem with
content,
# so we need to fix that:
- $bq = preg_replace_callback('{(\s*
.+?
)}sx',
- array(&$this, '_DoBlockQuotes_callback2'), $bq);
+ $bq = preg_replace_callback('{(\s*.+?
)}sx',
+ array(&$this, '_doBlockQuotes_callback2'), $bq);
return "\n". $this->hashBlock("\n$bq\n
")."\n\n";
}
@@ -1386,7 +1389,7 @@ class Markdown_Parser {
// # We can't call Markdown(), because that resets the hash;
// # that initialization code should be pulled into its own sub, though.
// $div_content = $this->hashHTMLBlocks($div_content);
-//
+//
// # Run document gamut methods on the content.
// foreach ($this->document_gamut as $method => $priority) {
// $div_content = $this->$method($div_content);
@@ -1414,11 +1417,11 @@ class Markdown_Parser {
$text = str_replace('"', '"', $text);
return $text;
}
-
-
+
+
function encodeAmpsAndAngles($text) {
#
- # Smart processing for ampersands and angle brackets that need to
+ # Smart processing for ampersands and angle brackets that need to
# be encoded. Valid character entities are left alone unless the
# no-entities mode is set.
#
@@ -1427,7 +1430,7 @@ class Markdown_Parser {
} else {
# Ampersand-encoding based entirely on Nat Irons's Amputator
# MT plugin:
)
# Comments and Processing Instructions.
@@ -2146,22 +2145,22 @@ class MarkdownExtra_Parser extends Markdown_Parser {
if ($tag{1} == '/') $depth--;
else if ($tag{strlen($tag)-2} != '/') $depth++;
}
-
+
#
# Check for `markdown="1"` attribute and handle it.
#
- if ($md_attr &&
+ if ($md_attr &&
preg_match($markdown_attr_re, $tag, $attr_m) &&
preg_match('/^1|block|span$/', $attr_m[2] . $attr_m[3]))
{
# Remove `markdown` attribute from opening tag.
$tag = preg_replace($markdown_attr_re, '', $tag);
-
+
# Check if text inside this tag must be parsed in span mode.
$this->mode = $attr_m[2] . $attr_m[3];
$span_mode = $this->mode == 'span' || $this->mode != 'block' &&
preg_match('{^<(?:'.$this->contain_span_tags_re.')\b}', $tag);
-
+
# Calculate indent before tag.
if (preg_match('/(?:^|\n)( *?)(?! ).*?$/', $block_text, $matches)) {
$strlen = $this->utf8_strlen;
@@ -2169,44 +2168,44 @@ class MarkdownExtra_Parser extends Markdown_Parser {
} else {
$indent = 0;
}
-
+
# End preceding block with this tag.
$block_text .= $tag;
$parsed .= $this->$hash_method($block_text);
-
+
# Get enclosing tag name for the ParseMarkdown function.
# (This pattern makes $tag_name_re safe without quoting.)
preg_match('/^<([\w:$]*)\b/', $tag, $matches);
$tag_name_re = $matches[1];
-
+
# Parse the content using the HTML-in-Markdown parser.
list ($block_text, $text)
- = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
+ = $this->_hashHTMLBlocks_inMarkdown($text, $indent,
$tag_name_re, $span_mode);
-
+
# Outdent markdown text.
if ($indent > 0) {
- $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
+ $block_text = preg_replace("/^[ ]{1,$indent}/m", "",
$block_text);
}
-
+
# Append tag content to parsed text.
if (!$span_mode) $parsed .= "\n\n$block_text\n\n";
else $parsed .= "$block_text";
-
+
# Start over a new block.
$block_text = "";
}
else $block_text .= $tag;
}
-
+
} while ($depth > 0);
-
+
#
# Hash last block text that wasn't processed inside the loop.
#
$parsed .= $this->$hash_method($block_text);
-
+
return array($parsed, $text);
}
@@ -2214,87 +2213,12 @@ class MarkdownExtra_Parser extends Markdown_Parser {
function hashClean($text) {
#
# Called whenever a tag must be hashed when a function insert a "clean" tag
- # in $text, it pass through this function and is automaticaly escaped,
+ # in $text, it pass through this function and is automaticaly escaped,
# blocking invalid nested overlap.
#
return $this->hashPart($text, 'C');
}
- function _doAnchors_inline_callback($matches) {
- // $whole_match = $matches[1];
- $link_text = $this->runSpanGamut($matches[2]);
- $url = $matches[3] == '' ? $matches[4] : $matches[3];
- $title =& $matches[7];
-
- $url = $this->encodeAttribute($url);
-
- $result = "encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
-
- if ($this->el_enable && preg_match('/^https?\:\/\//', $url) && !preg_match('/^https?\:\/\/'.$this->el_local_domain.'/', $url)) {
- if ($this->el_new_window) {
- $result .= ' target="_blank"';
- }
-
- if ($this->el_css_class) {
- $result .= ' class="'.$this->el_css_class.'"';
- }
- }
-
- $link_text = $this->runSpanGamut($link_text);
- $result .= ">$link_text";
-
- return $this->hashPart($result);
- }
-
- function _doAnchors_reference_callback($matches) {
- $whole_match = $matches[1];
- $link_text = $matches[2];
- $link_id =& $matches[3];
- $result = '';
-
- if ($link_id == "") {
- # for shortcut links like [this][] or [this].
- $link_id = $link_text;
- }
-
- # lower-case and turn embedded newlines into spaces
- $link_id = strtolower($link_id);
- $link_id = preg_replace('{[ ]?\n}', ' ', $link_id);
-
- if (isset($this->urls[$link_id])) {
- $url = $this->urls[$link_id];
- $url = $this->encodeAttribute($url);
-
- $result = "titles[$link_id] ) ) {
- $title = $this->titles[$link_id];
- $title = $this->encodeAttribute($title);
- $result .= " title=\"$title\"";
- }
-
- if ($this->el_enable && preg_match('/^https?\:\/\//', $url) && !preg_match('/^https?\:\/\/'.$this->el_local_domain.'/', $url)) {
- if ($this->el_new_window) {
- $result .= ' target="_blank"';
- }
-
- if ($this->el_css_class) {
- $result .= ' class="'.$this->el_css_class.'"';
- }
- }
-
- $link_text = $this->runSpanGamut($link_text);
- $result .= ">$link_text";
- $result = $this->hashPart($result);
- }
- else {
- $result = $whole_match;
- }
- return $result;
- }
function doHeaders($text) {
#
@@ -2303,7 +2227,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
# Setext-style headers:
# Header 1 {#header1}
# ========
- #
+ #
# Header 2 {#header2}
# --------
#
@@ -2345,36 +2269,15 @@ class MarkdownExtra_Parser extends Markdown_Parser {
return $matches[0];
$level = $matches[3]{0} == '=' ? 1 : 2;
$attr = $this->_doHeaders_attr($id =& $matches[2]);
- $body = $this->runSpanGamut($matches[1]);
- $body = $this->_doHeaders_selflink($id, $body);
-
- $block = "\n";
$text .= "\n";
@@ -2481,20 +2384,20 @@ class MarkdownExtra_Parser extends Markdown_Parser {
$text .= "
";
-
+
return $this->hashBlock($text) . "\n";
}
-
+
function doDefLists($text) {
#
# Form HTML definition lists.
@@ -2552,7 +2455,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
function _doDefLists_callback($matches) {
# Re-usable patterns to match list item bullets and number markers:
$list = $matches[1];
-
+
# Turn double returns into triple returns, so that we can make a
# paragraph for the last item in a list, if necessary:
$result = trim($this->processDefListItems($list));
@@ -2567,7 +2470,7 @@ class MarkdownExtra_Parser extends Markdown_Parser {
# into individual term and definition list items.
#
$less_than_tab = $this->tab_width - 1;
-
+
# trim trailing blank lines:
$list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
@@ -2576,11 +2479,11 @@ class MarkdownExtra_Parser extends Markdown_Parser {
(?>\A\n?|\n\n+) # leading line
( # definition terms = $1
[ ]{0,'.$less_than_tab.'} # leading whitespace
- (?![:][ ]|[ ]) # negative lookahead for a definition
+ (?![:][ ]|[ ]) # negative lookahead for a definition
# mark (colon) or more whitespace.
- (?> \S.* \n)+? # actual term (not whitespace).
- )
- (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
+ (?> \S.* \n)+? # actual term (not whitespace).
+ )
+ (?=\n?[ ]{0,3}:[ ]) # lookahead for following line feed
# with a definition mark.
}xm',
array(&$this, '_processDefListItems_callback_dt'), $list_str);
@@ -2596,33 +2499,20 @@ class MarkdownExtra_Parser extends Markdown_Parser {
(?= \n+ # stop at next definition mark,
(?: # next term or end of text
[ ]{0,'.$less_than_tab.'} [:][ ] |
- ".$this->runSpanGamut(trim($header))." \n";
$text .= "\n";
$text .= "\n";
-
+
# Split content by row.
$rows = explode("\n", trim($content, "\n"));
-
+
$text .= "\n";
foreach ($rows as $row) {
- # Parsing span elements, including code spans, character escapes,
+ # Parsing span elements, including code spans, character escapes,
# and inline HTML tags, so that pipes inside those gets ignored.
$row = $this->parseSpan($row);
-
+
# Split row by cell.
$row_cells = preg_split('/ *[|] */', $row, $col_count);
$row_cells = array_pad($row_cells, $col_count, '');
-
+
$text .= "\n";
foreach ($row_cells as $n => $cell)
$text .= " \n";
$text .= "".$this->runSpanGamut(trim($cell))." \n";
@@ -2502,11 +2405,11 @@ class MarkdownExtra_Parser extends Markdown_Parser {
}
$text .= "
empty_element_suffix",
+ return str_repeat("
empty_element_suffix",
strlen($matches[0]));
}
@@ -2698,19 +2588,19 @@ class MarkdownExtra_Parser extends Markdown_Parser {
# work in the middle of a word.
#
var $em_relist = array(
- '' => '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? '(?:(? '(?<=\S)(? '(?<=\S)(? '(?:(? '(?<=\S|^)(? '(?<=\S|^)(? $value) {
$value = trim($this->runSpanGamut($value));
-
+
# Check if this should be enclosed in a paragraph.
# Clean tag hashes & block tag hashes are left alone.
$is_p = !preg_match('/^B\x1A[0-9]+B|^C\x1A[0-9]+C$/', $value);
-
+
if ($is_p) {
$value = "
empty_element_suffix ."\n";
$text .= "\n\n";
-
+
$attr = " rev=\"footnote\"";
if ($this->fn_backlink_class != "") {
$class = $this->fn_backlink_class;
@@ -2823,20 +2713,20 @@ class MarkdownExtra_Parser extends Markdown_Parser {
$attr .= " title=\"$title\"";
}
$num = 0;
-
+
while (!empty($this->footnotes_ordered)) {
$footnote = reset($this->footnotes_ordered);
$note_id = key($this->footnotes_ordered);
unset($this->footnotes_ordered[$note_id]);
-
+
$footnote .= "\n"; # Need to append newline before parsing.
- $footnote = $this->runBlockGamut("$footnote\n");
- $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
+ $footnote = $this->runBlockGamut("$footnote\n");
+ $footnote = preg_replace_callback('{F\x1Afn:(.*?)\x1A:}',
array(&$this, '_appendFootnotes_callback'), $footnote);
-
+
$attr = str_replace("%%", ++$num, $attr);
$note_id = $this->encodeAttribute($note_id);
-
+
# Add backlink to last paragraph; create new paragraph if needed.
$backlink = "↩";
if (preg_match('{$}', $footnote)) {
@@ -2844,12 +2734,12 @@ class MarkdownExtra_Parser extends Markdown_Parser {
} else {
$footnote .= "\n\n
\n";
$text .= "
";
+
+/* mod Waitman Gobble NO WARRANTY */
+
+//if we get the signal then return the image url info in BBCODE, otherwise this outputs the info and bails (for the ajax image uploader on wall post)
+ if ($_REQUEST['hush']!='yeah') {
+
+ /*existing code*/
+ if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+ echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]\n\n";
+ else
+ echo '
";
+ /*existing code*/
+
+ } else {
+ $m = '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]";
+ return($m);
+ }
+/* mod Waitman Gobble NO WARRANTY */
killme();
// NOTREACHED
diff --git a/view/de/friend_complete_eml.tpl b/view/de/friend_complete_eml.tpl
index f6e0adf4c..908d0df40 100755
--- a/view/de/friend_complete_eml.tpl
+++ b/view/de/friend_complete_eml.tpl
@@ -1,5 +1,5 @@
-Lieber $username,
+Liebe/r $username,
großartige Neuigkeiten... '$fn' von '$dfrn_url' hat deine Kontaktaufnahme auf
'$sitename' bestätigt.
diff --git a/view/de/intro_complete_eml.tpl b/view/de/intro_complete_eml.tpl
index 46ffc8781..ff9b8a379 100755
--- a/view/de/intro_complete_eml.tpl
+++ b/view/de/intro_complete_eml.tpl
@@ -1,5 +1,5 @@
-Lieber $username,
+Liebe/r $username,
'$fn' von '$dfrn_url' hat deine Kontaktanfrage auf '$sitename' bestätigt.
diff --git a/view/de/lostpass_eml.tpl b/view/de/lostpass_eml.tpl
index 91b9b4c50..4c06d0c8d 100755
--- a/view/de/lostpass_eml.tpl
+++ b/view/de/lostpass_eml.tpl
@@ -1,5 +1,5 @@
-Lieber $username,
+Liebe/r $username,
wir haben gerade eine Anfrage erhalten dein Passwort auf $sitename zu ändern.
Um diese Anfrage zu bestätigen folge bitte dem Bestätigungslink oder kopiere
ihn in die Adresszeile deines Browsers.
diff --git a/view/de/passchanged_eml.tpl b/view/de/passchanged_eml.tpl
index 894fd4e88..d5e8d9048 100755
--- a/view/de/passchanged_eml.tpl
+++ b/view/de/passchanged_eml.tpl
@@ -1,5 +1,5 @@
-Lieber $username,
+Liebe/r $username,
dein Passwort wurde wie gewünscht geändert. Bitte hebe diese Informationen
für deine Unterlagen auf (oder ändere das Passwort augenblicklich in etwas
das du dir merken kannst).
diff --git a/view/de/register_open_eml.tpl b/view/de/register_open_eml.tpl
index ab7fed18c..d27c3c743 100755
--- a/view/de/register_open_eml.tpl
+++ b/view/de/register_open_eml.tpl
@@ -1,5 +1,5 @@
-Lieber $username,
+Liebe/r $username,
danke für die Registrierung bei $sitename. Dein neuer Account wurde angelegt.
Die Anmeldedetails sind die Folgenden.
diff --git a/view/de/request_notify_eml.tpl b/view/de/request_notify_eml.tpl
index 15b83f64f..55fa98e96 100755
--- a/view/de/request_notify_eml.tpl
+++ b/view/de/request_notify_eml.tpl
@@ -1,5 +1,5 @@
-Lieber $myname,
+Liebe/r $myname,
du hast gerade eine Kontaktanfrage von '$requestor' auf $sitename erhalten.
diff --git a/view/theme/vier/calendar.png b/view/theme/vier/calendar.png
new file mode 100755
index 000000000..705a75b8a
Binary files /dev/null and b/view/theme/vier/calendar.png differ
diff --git a/view/theme/vier/style.css b/view/theme/vier/style.css
index 96233c1da..89dd98146 100644
--- a/view/theme/vier/style.css
+++ b/view/theme/vier/style.css
@@ -122,6 +122,17 @@
.next { background-position: -110px -60px;}
.tagged { background-position: -130px -60px;}
+.attachtype {
+ display: block; width: 20px; height: 23px;
+ background-image: url('../../../images/content-types.png');
+}
+
+.type-video { background-position: 0px 0px; }
+.type-image { background-position: -20px 0px; }
+.type-audio { background-position: -40px 0px; }
+.type-text { background-position: -60px 0px; }
+.type-unkn { background-position: -80px 0px; }
+
.icon.drop, .icon.drophide {
float: left;
}
@@ -200,9 +211,9 @@
.icon.s16.delete {
background-image: url("../../../images/icons/16/delete.png");
}
-.icon.s16.edit {
+/*.icon.s16.edit {
background-image: url("../../../images/icons/16/edit.png");
-}
+}*/
.icon.s16.star {
background-image: url("../../../images/icons/16/star.png");
}
@@ -913,7 +924,7 @@ section {
}
.wall-item-container .wall-item-actions-tools {
float: right;
- width: 60px;
+ width: 80px;
}
.wall-item-container .wall-item-actions-tools a {
float: right;
@@ -1028,7 +1039,13 @@ section {
/* contacts menu */
.contact-photo-wrapper {
position: relative;
+ width: 80px;
}
+
+.contact-photo-wrapper.wwto {
+ width: 25px;
+}
+
.contact-photo {
width: 48px;
height: 48px;
@@ -1390,9 +1407,34 @@ ul.tabs li .active {
.field.radio .field_help {
margin-left: 0px;
}
-#profile-edit-links li {
- list-style: none;
+
+#profile-edit-links-end {
+ clear: both;
+ margin-bottom: 15px;
}
+
+#profile-edit-links ul { margin: 20px; padding-bottom: 20px; list-style: none; }
+
+#profile-edit-links li {
+ float: left;
+ list-style: none;
+ margin-left: 10px;
+}
+
+.profile-edit-side-div {
+ display: none;
+}
+
+#register-form label,
+#profile-edit-form label {
+ width: 300px; float: left;
+}
+
+.required {
+ display: inline;
+ color: #B20202;
+}
+
/* oauth */
.oauthapp {
height: auto;
@@ -1449,3 +1491,433 @@ footer {
height: 100px;
display: table-row;
}
+
+blockquote {
+ border-left: 1px solid #D2D2D2;
+ padding-left: 9px;
+ margin: 0 0 0 .8ex;
+}
+
+/* ================== */
+/* = Contacts Block = */
+/* ================== */
+
+.contact-block-img {
+ width: 42px;
+ height: 42px;
+ padding-right: 2px;
+}
+.contact-block-div {
+ float: left;
+}
+
+.contact-block-textdiv { width: 150px; height: 34px; float: left; }
+#contact-block-end { clear: both; }
+
+#group-edit-wrapper {
+ margin-bottom: 10px;
+}
+
+#group-members-end {
+ clear: both;
+}
+
+/*
+#group-separator,
+#prof-separator { display: none;}
+*/
+
+#prvmail-wrapper, .mail-conv-detail, .mail-list-detail {
+ position: relative;
+ width: 500px;
+ padding: 50px;
+ margin: 20px auto;
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+}
+
+#prvmail-wrapper:before, #prvmail-wrapper:after, .mail-conv-detail:before, .mail-conv-detail:after, .mail-list-detail:before, .mail-list-detail:after {
+ position: absolute;
+ width: 40%;
+ height: 10px;
+ content: ' ';
+ left: 12px;
+ bottom: 12px;
+ background: transparent;
+ -webkit-transform: skew(-5deg) rotate(-5deg);
+ -moz-transform: skew(-5deg) rotate(-5deg);
+ -ms-transform: skew(-5deg) rotate(-5deg);
+ -o-transform: skew(-5deg) rotate(-5deg);
+ transform: skew(-5deg) rotate(-5deg);
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ z-index: -1;
+}
+
+#prvmail-wrapper:after, .mail-conv-detail:after, .mail-list-detail:after {
+ left: auto;
+ right: 12px;
+ -webkit-transform: skew(5deg) rotate(5deg);
+ -moz-transform: skew(5deg) rotate(5deg);
+ -ms-transform: skew(5deg) rotate(5deg);
+ -o-transform: skew(5deg) rotate(5deg);
+ transform: skew(5deg) rotate(5deg);
+}
+
+.prvmail-text {
+ width: 100%;
+}
+
+.mail-list-outside-wrapper {
+ margin-top: 20px;
+}
+
+.mail-list-sender {
+ float: left;
+ padding: 5px;
+ background-color: #efefef;
+ border: 2px dotted #eeeeee;
+ -moz-box-shadow: 3px 3px 4px #959494;
+ -webkit-box-shadow: 3px 3px 4px #959494;
+ box-shadow: 3px 3px 4px #959494;
+}
+
+.mail-list-detail {
+ margin-left: 100px;
+ width: 300px;
+ min-height: 70px;
+ padding: 20px;
+ padding-top:10px;
+ border: 1px solid #dddddd;
+ }
+
+.mail-list-sender-name {
+ font-size: 1.1em;
+ display: inline;
+ font-variant:small-caps;
+}
+
+.mail-list-date {
+ float: right;
+ clear: block;
+ display: inline;
+ font-size: 0.9em;
+ padding-left: 10px;
+ font-stretch:ultra-condensed;
+ font-variant:small-caps;
+}
+
+.mail-list-subject {
+ clear: block;
+ font-size: 1.2em;
+ padding-top: 20px;
+ padding-right: 50px;
+}
+
+.mail-list-subject a {
+ color: #626262;
+}
+
+.mail-list-delete-wrapper { float: right;}
+.mail-list-outside-wrapper-end {
+ clear: both;
+}
+
+.mail-conv-outside-wrapper {
+ margin-bottom: 10px;
+}
+
+.mail-conv-sender {float: left; margin: 0px 5px 5px 0px; }
+.mail-conv-sender-photo {
+ width: 64px;
+ height: 64px;
+}
+
+.mail-conv-sender-name { float: left; font-variant:small-caps; font-style: bold; }
+.mail-conv-date { float: right; font-variant:small-caps; }
+.mail-conv-subject { clear: right; font-weight: bold; font-size: 1.2em }
+.mail-conv-body {
+ clear: both;
+}
+
+.mail-conv-detail {
+ width: 500px;
+ padding: 30px;
+ padding-bottom: 10px;
+ margin-left: 20px;
+ margin-bottom: 0px;
+ vertical-align: middle;
+ margin: auto;
+ border: 1px solid #dddddd;
+}
+.mail-conv-break { display: none; border: none;}
+.mail-conv-delete-wrapper { padding-top: 10px; width: 510px; text-align: right; }
+
+/* ========== */
+/* = Events = */
+/* ========== */
+
+.clear { clear: both; }
+.eventcal {
+ float: left;
+ font-size: 20px;
+ padding: 20px;
+}
+
+.vevent {
+ position: relative;
+ width: 400px;
+ padding: 20px;
+ padding-top: 10px;
+ margin: 0 0px;
+ margin-bottom: 10px;
+ background-color: #fff;
+ -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.2), inset 0 0 50px rgba(0, 0, 0, 0.1);
+}
+
+.vevent:before, .vevent:after {
+ position: absolute;
+ width: 40%;
+ height: 10px;
+ content: ' ';
+ left: 12px;
+ bottom: 12px;
+ background: transparent;
+ -webkit-transform: skew(-5deg) rotate(-5deg);
+ -moz-transform: skew(-5deg) rotate(-5deg);
+ -ms-transform: skew(-5deg) rotate(-5deg);
+ -o-transform: skew(-5deg) rotate(-5deg);
+ transform: skew(-5deg) rotate(-5deg);
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3);
+ z-index: -1;
+}
+
+.vevent:after {
+ left: auto;
+ right: 12px;
+ -webkit-transform: skew(5deg) rotate(5deg);
+ -moz-transform: skew(5deg) rotate(5deg);
+ -ms-transform: skew(5deg) rotate(5deg);
+ -o-transform: skew(5deg) rotate(5deg);
+ transform: skew(5deg) rotate(5deg);
+}
+
+.vevent .event-description {
+ margin-left: 10px;
+ margin-right: 10px;
+ text-align:center;
+ font-size: 1.2em;
+ font-weight:bolder;
+}
+
+ .vevent .event-location{
+ margin-left: 10px;
+ margin-right: 10px;
+ font-size: 1em;
+ font-style: oblique;
+ text-align: center;
+
+}
+
+.vevent .event-start, .vevent .event-end {
+ margin-left: 20px;
+ margin-right: 20px;
+ margin-bottom: 2px;
+ margin-top: 2px;
+ font-size: 0.9em;
+ font-variant: small-caps;
+ text-align: left;
+}
+
+#new-event-link{
+ width: 130px;
+ padding: 7px;
+ margin-bottom: 10px;
+ margin-left: 170px; ;
+ -moz-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ -webkit-box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ box-shadow:inset 0px 1px 0px 0px #cfcfcf;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bdbdbd), color-stop(1, #a2a2a2) );
+ background:-moz-linear-gradient( center top, #bdbdbd 5%, #a2a2a2 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bdbdbd', endColorstr='#a2a2a2');
+ background-color:#bdbdbd;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ color: #efefef;
+}
+
+#new-event-link:hover {
+ color: #efefef;
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #b20202), color-stop(1, #d60808) );
+ background:-moz-linear-gradient( center top, #b20202 5%, #d60808 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b20202', endColorstr='#d60808');
+ background-color:#b20202;
+}
+
+#new-event-link:active {
+ background-color: #b20202;
+ position:relative;
+ top:1px;
+}
+
+#new-event-link a {
+ color: #efefef;
+ text-align: center;
+}
+
+.edit-event-link, .plink-event-link {
+ float: left;
+ margin-top: 4px;
+ margin-right: 4px;
+ margin-bottom: 15px;
+}
+
+.event-description:before {
+ content: url('calendar.png');
+ margin-right: 15px;
+ vertical-align: middle;
+}
+
+.event-start, .event-end {
+ margin-left: 10px;
+ width: 330px;
+}
+
+.event-start .dtstart, .event-end .dtend {
+ float: right;
+}
+
+.event-list-date {
+ color: #626262;
+ margin-bottom: 10px;
+ font-variant:small-caps;
+ font-stretch:condensed;
+}
+
+.prevcal, .nextcal {
+ float: left;
+ margin-left: 32px;
+ margin-right: 32px;
+ margin-top: 64px;
+}
+
+.event-calendar-end {
+ clear: both;
+}
+
+.calendar {
+ width: 300px;
+ font-family: Helvetica, Arial, sans-serif;
+ background-color: #f1f1f1;
+ border: 1px solid #dedede;
+ margin-bottom: 10px;
+ -moz-box-shadow: 5px 5px 8px #959494;
+ -webkit-box-shadow: 5px 5px 8px #959494;
+ box-shadow: 5px 5px 8px #959494;
+}
+
+.calendar caption{
+ background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #d60808), color-stop(1, #b20202) );
+ background:-moz-linear-gradient( center top, #d60808 5%, #b20202 100% );
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d60808', endColorstr='#b20202');
+ background-color: #b20202;
+ padding: 10px 0px 10px 0px;
+ width: 300px;
+ color: #ffffff;
+ font-weight: bold;
+ text-align:center;
+ font-variant:small-caps;
+ -moz-box-shadow: 5px 2px 8px #959494;
+ -webkit-box-shadow: 5px 2px 8px #959494;
+ box-shadow: 5px 2px 8px #959494;
+}
+
+tr {
+ border: 1px solid #eeeeee;
+}
+
+.calendar td {
+ font-size: 14px;
+ text-align: center;
+ padding: 3px 0px;
+}
+
+.calendar td > a {
+ background-color: #cdcdcd;
+ padding: 2px;
+ color: #000;
+}
+
+.calendar th {
+ font-size: 16px;
+}
+
+.today {
+ font-weight: bold;
+ text-align: center;
+ background-color: #b20202;
+ color: #fff;
+}
+
+#event-start-text,
+#event-finish-text {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+
+#event-nofinish-checkbox,
+#event-nofinish-text,
+#event-adjust-checkbox,
+#event-adjust-text,
+#event-share-checkbox {
+ float: left;
+}
+
+#event-datetime-break {
+ margin-bottom: 10px;
+}
+
+#event-nofinish-break,
+#event-adjust-break,
+#event-share-break {
+ clear: both;
+}
+
+#event-desc-text,
+#event-location-text {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+
+#event-submit {
+ margin-top: 10px;
+}
+
+/* ============= */
+/* = Directory = */
+/* ============= */
+
+.directory-item {
+ float: left;
+ margin: 50px 50px 0px 0px;
+}
+
+.directory-details {
+ font-size: 0.9em;
+ font-variant: small-caps;
+ width: 160px;
+}
+
+.directory-name {
+ font-size: 1em;
+ font-variant: small-caps;
+ width: 150px;
+}