diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js
index 92c5bb35..e35cef73 100644
--- a/plugins/calendar/calendar_ui.js
+++ b/plugins/calendar/calendar_ui.js
@@ -64,10 +64,51 @@ function rcube_calendar_ui(settings)
var Q = this.quote_html;
- // php equivalent
- var nl2br = function(str)
+ var text2html = function(str, maxlen, maxlines)
{
- return String(str).replace(/\n/g, "
");
+ var html = Q(String(str));
+
+ // limit visible text length
+ if (maxlen) {
+ var morelink = ' '+rcmail.gettext('showmore','calendar')+'',
+ lines = html.split(/\r?\n/),
+ words, out = '', len = 0;
+
+ for (var i=0; i < lines.length; i++) {
+ len += lines[i].length;
+ if (maxlines && i == maxlines - 1) {
+ out += lines[i] + '\n' + morelink;
+ maxlen = html.length * 2;
+ }
+ else if (len > maxlen) {
+ len = out.length;
+ words = lines[i].split(' ');
+ for (var j=0; j < words.length; j++) {
+ len += words[j].length + 1;
+ out += words[j] + ' ';
+ if (len > maxlen) {
+ out += morelink;
+ maxlen = html.length * 2;
+ }
+ }
+ out += '\n';
+ }
+ else
+ out += lines[i] + '\n';
+ }
+
+ if (maxlen > str.length)
+ out += '';
+
+ html = out;
+ }
+
+ // simple link parser
+ return html
+ .replace(/([hf]t+ps?:\/\/[^\s\n\(\)&]+)/g, '$1')
+ .replace(/([^\s\n\(\);]+@[^\s\n\(\)\[\]\/,;?!&"']+)/g, '$1')
+ .replace(/(mailto:)([^"]+)"/g, '$1" onclick="rcmail.command(\'compose\', \'$2\');return false"')
+ .replace(/\n/g, "
");
};
// same as str.split(delimiter) but it ignores delimiters within quoted strings
@@ -260,9 +301,9 @@ function rcube_calendar_ui(settings)
$('#event-title').html(Q(event.title)).show();
if (event.location)
- $('#event-location').html('@ ' + Q(event.location)).show();
+ $('#event-location').html('@ ' + text2html(event.location)).show();
if (event.description)
- $('#event-description').show().children('.event-text').html(nl2br(Q(event.description))); // TODO: format HTML with clickable links and stuff
+ $('#event-description').show().children('.event-text').html(text2html(event.description, 300, 6));
// render from-to in a nice human-readable way
$('#event-date').html(Q(me.event_date_text(event))).show();
diff --git a/plugins/calendar/localization/de_CH.inc b/plugins/calendar/localization/de_CH.inc
index 05db20f2..35f79d20 100644
--- a/plugins/calendar/localization/de_CH.inc
+++ b/plugins/calendar/localization/de_CH.inc
@@ -65,6 +65,7 @@ $labels['parentcalendar'] = 'Übergeordneter Kalender';
$labels['searchearlierdates'] = '« Frühere Termine suchen';
$labels['searchlaterdates'] = 'Spätere Termine suchen »';
$labels['andnmore'] = '$nr weitere...';
+$labels['showmore'] = 'Mehr anzeigen...';
$labels['togglerole'] = 'Klick zum Ändern der Rolle';
// agenda view
diff --git a/plugins/calendar/localization/de_DE.inc b/plugins/calendar/localization/de_DE.inc
index 4bc2e08d..f74a45f9 100644
--- a/plugins/calendar/localization/de_DE.inc
+++ b/plugins/calendar/localization/de_DE.inc
@@ -65,6 +65,7 @@ $labels['parentcalendar'] = 'Übergeordneter Kalender';
$labels['searchearlierdates'] = '« Frühere Termine suchen';
$labels['searchlaterdates'] = 'Spätere Termine suchen »';
$labels['andnmore'] = '$nr weitere...';
+$labels['showmore'] = 'Mehr anzeigen...';
$labels['togglerole'] = 'Klick zum Ändern der Rolle';
// agenda view
diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc
index e25eb239..29458a1e 100644
--- a/plugins/calendar/localization/en_US.inc
+++ b/plugins/calendar/localization/en_US.inc
@@ -65,6 +65,7 @@ $labels['parentcalendar'] = 'Superior calendar';
$labels['searchearlierdates'] = '« Search for earlier events';
$labels['searchlaterdates'] = 'Search for later events »';
$labels['andnmore'] = '$nr more...';
+$labels['showmore'] = 'Show more...';
$labels['togglerole'] = 'Click to toggle role';
// agenda view
diff --git a/plugins/calendar/skins/default/calendar.css b/plugins/calendar/skins/default/calendar.css
index 895fd997..d8497fcf 100644
--- a/plugins/calendar/skins/default/calendar.css
+++ b/plugins/calendar/skins/default/calendar.css
@@ -262,6 +262,16 @@ div.uidialog {
text-align: center;
}
+a.morelink {
+ font-size: 90%;
+ color: #C33;
+ text-decoration: none;
+}
+
+a.morelink:hover {
+ text-decoration: underline;
+}
+
a.miniColors-trigger {
margin-top: -3px;
}