diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..505c017
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,263 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ var Ext = {};
+ var Zarafa = {};
+ var container = {};
+ var _ = function(key, domain) {};
+ var dgettext = function(domain, msgid) {};
+ var dngettext = function(domain, msgid, msgid_plural, count) {};
+ var dnpgettext = function(domain, msgctxt, msgid, msgid_plural, count) {};
+ var dpgettext = function(domain, msgctxt, msgid) {};
+ var ngettext = function(msgid, msgid_plural, count) {};
+ var npgettext = function(msgctxt, msgid, msgid_plural, count) {};
+ var pgettext = function(msgctxt, msgid) {};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Processing manifest.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/changelog.txt b/changelog.txt
index 8a9b996..bb7cf86 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,10 +1,14 @@
+calendarimporter 1.2:
+ - New timezone management
+ - more imported fields (Busystatus, importance, label, class, organizer, reminder)
+ - smaller improvements
+ - deploy/build script
+
calendarimporter 1.1 final:
- ics exporter
- improved ics fileparser
- fixed ExtJS Problem in chrome
-KNOWN PROBLEMS:
- - importer ignores some fields (priority, status...)
+KNOWN PROBLEMS:
- attechments are ignored
- - timezone handling is not perfect
- recurrent events are not handled properly (im/export)
\ No newline at end of file
diff --git a/config.php b/config.php
index de30025..c03312e 100644
--- a/config.php
+++ b/config.php
@@ -5,5 +5,5 @@
define('PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE_EXPORT', false);
/** The default calendar to import to*/
- define('PLUGIN_CALENDARIMPORTER_DEFAULT', "Default");
+ define('PLUGIN_CALENDARIMPORTER_DEFAULT', "calendar");
?>
diff --git a/js/data/timezones.js b/js/data/timezones.js
index 49fa342..ea2bbb9 100644
--- a/js/data/timezones.js
+++ b/js/data/timezones.js
@@ -736,7 +736,7 @@ Zarafa.plugins.calendarimporter.data.Timezones = Ext.extend(Object, {
getOffset: function(timezone) {
/* find timezone, this needs to be optimized ;) */
timezone = this.unMap(timezone);
-
+ var i = 0;
for(i = 0; i < this.store.length; i++) {
if(this.store[i][0] == timezone) {
return (this.store[i][2] * 60000);
diff --git a/js/dialogs/ImportPanel.js b/js/dialogs/ImportPanel.js
index 5371669..a0917b8 100644
--- a/js/dialogs/ImportPanel.js
+++ b/js/dialogs/ImportPanel.js
@@ -101,10 +101,16 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
}
if(eventdata !== null) {
- var parsedData = new Array(eventdata.events.length);
-
- for(var i=0; i < eventdata.events.length; i++) {
- parsedData[i] = new Array(eventdata.events[i]["SUMMARY"], new Date(parseInt(eventdata.events[i]["DTSTART"]) + local_tz_offset + tz_offset), new Date(parseInt(eventdata.events[i]["DTEND"]) + local_tz_offset + tz_offset), eventdata.events[i]["LOCATION"], eventdata.events[i]["DESCRIPTION"]);
+ parsedData = new Array(eventdata.events.length);
+ var i = 0;
+ for(i = 0; i < eventdata.events.length; i++) {
+ var trigger = null;
+
+ if(eventdata.events[i]["VALARM"]) {
+ trigger = eventdata.events[i]["VALARM"]["TRIGGER"];
+ trigger = new Date(parseInt(trigger) + local_tz_offset + tz_offset);
+ }
+ parsedData[i] = new Array(eventdata.events[i]["SUMMARY"], new Date(parseInt(eventdata.events[i]["DTSTART"]) + local_tz_offset + tz_offset), new Date(parseInt(eventdata.events[i]["DTEND"]) + local_tz_offset + tz_offset), eventdata.events[i]["LOCATION"], eventdata.events[i]["DESCRIPTION"],eventdata.events[i]["PRIORITY"],eventdata.events[i]["X-ZARAFA-LABEL"],eventdata.events[i]["X-MICROSOFT-CDO-BUSYSTATUS"],eventdata.events[i]["CLASS"],eventdata.events[i]["ORGANIZER"],trigger);
}
} else {
return null;
@@ -113,11 +119,17 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
// create the data store
var store = new Ext.data.ArrayStore({
fields: [
- {name: 'title'},
- {name: 'start'},
- {name: 'end'},
- {name: 'location'},
- {name: 'description'}
+ {name: 'title'},
+ {name: 'start'},
+ {name: 'end'},
+ {name: 'location'},
+ {name: 'description'},
+ {name: 'priority'},
+ {name: 'label'},
+ {name: 'busy'},
+ {name: 'privatestate'},
+ {name: 'organizer'},
+ {name: 'trigger'}
],
data: parsedData
});
@@ -142,7 +154,13 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
{header: 'Start', width: 150, sortable: true, dataIndex: 'start', renderer : Zarafa.common.ui.grid.Renderers.datetime},
{header: 'End', width: 150, sortable: true, dataIndex: 'end', renderer : Zarafa.common.ui.grid.Renderers.datetime},
{header: 'Location', width: 150, sortable: true, dataIndex: 'location'},
- {header: 'Description', width: 150, sortable: true, dataIndex: 'description'}
+ {header: 'Description', width: 150, sortable: true, dataIndex: 'description'},
+ {header: "Priority", dataIndex: 'priority', hidden: true},
+ {header: "Label", dataIndex: 'label', hidden: true},
+ {header: "Busystatus", dataIndex: 'busy', hidden: true},
+ {header: "Privacystatus", dataIndex: 'privatestate', hidden: true},
+ {header: "Organizer", dataIndex: 'organizer', hidden: true},
+ {header: "Alarm", dataIndex: 'trigger', hidden: true, renderer : Zarafa.common.ui.grid.Renderers.datetime}
]
}),
sm: new Ext.grid.RowSelectionModel({multiSelect:true})
@@ -150,10 +168,10 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
},
createSelectBox: function() {
- ctx = container.getContextByName('calendar');
- model = ctx.getModel();
- defaultFolder = model.getDefaultFolder(); // @type: Zarafa.hierarchy.data.MAPIFolderRecord
- subFolders = defaultFolder.getChildren();
+ var ctx = container.getContextByName('calendar');
+ var model = ctx.getModel();
+ var defaultFolder = model.getDefaultFolder(); // @type: Zarafa.hierarchy.data.MAPIFolderRecord
+ var subFolders = defaultFolder.getChildren();
var myStore = new Ext.data.ArrayStore({
fields: ['calendar_id', 'calendar_displayname'],
@@ -172,12 +190,12 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
displayname: defaultFolder.getDisplayName()
});
myStore.add(myNewRecord);
-
- for(i=0;i 0) {
// call export function here!
var responseHandler = new Zarafa.plugins.calendarimporter.data.ResponseHandler({
@@ -548,8 +617,7 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
* @param {Object} response
* @private
*/
- downLoadICS : function(response)
- {
+ downLoadICS : function(response) {
Zarafa.common.dialogs.MessageBox.hide();
if(response.status === true) {
// needs to be window.open, document.location.href kills the extjs response handler...
@@ -561,48 +629,60 @@ Zarafa.plugins.calendarimporter.dialogs.ImportPanel = Ext.extend(Ext.Panel, {
importCheckedEvents: function () {
//receive existing calendar store
- var selIndex = this.calendarselector.selectedIndex;
var calValue = this.calendarselector.value;
- if(selIndex == -1) { // no calendar choosen
- Ext.MessageBox.show({
+ if(calValue == undefined) { // no calendar choosen
+ Zarafa.common.dialogs.MessageBox.show({
title : _('Error'),
msg : _('You have to choose a calendar!'),
- icon : Ext.MessageBox.ERROR,
- buttons : Ext.MessageBox.OK
+ icon : Zarafa.common.dialogs.MessageBox.ERROR,
+ buttons : Zarafa.common.dialogs.MessageBox.OK
});
} else {
+ var calexist = true;
if(this.eventgrid.selModel.getCount() < 1) {
- Ext.MessageBox.show({
+ Zarafa.common.dialogs.MessageBox.show({
title : _('Error'),
msg : _('You have to choose at least one event to import!'),
- icon : Ext.MessageBox.ERROR,
- buttons : Ext.MessageBox.OK
+ icon : Zarafa.common.dialogs.MessageBox.ERROR,
+ buttons : Zarafa.common.dialogs.MessageBox.OK
});
} else {
var calendarStore = new Zarafa.calendar.AppointmentStore();
var calendarFolder = container.getHierarchyStore().getDefaultFolder('calendar');
if(calValue != "calendar") {
var subFolders = calendarFolder.getChildren();
-
+ var i = 0;
for(i=0;i
-
- 1.1
- calendarimporter
- ICS Calendar Importer/Exporter
- Christoph Haas
- http://www.sprinternet.at
- Import a ICS file to the zarafa calendar
-
-
- config.php
-
-
-
-
-
- php/plugin.calendarimporter.php
- php/module.calendarexporter.php
-
-
- js/data/timezones.js
- js/plugin.calendarimporter.js
- js/data/ResponseHandler.js
- js/dialogs/ImportContentPanel.js
- js/dialogs/ImportPanel.js
-
- js/data/timezones.js
- js/plugin.calendarimporter.js
- js/data/ResponseHandler.js
- js/dialogs/ImportContentPanel.js
- js/dialogs/ImportPanel.js
-
-
- resources/css/calendarimporter.css
- resources/css/calendarimporter.css
-
-
-
-
+
+ 1.2
+ calendarimporter
+ ICS Calendar Importer/Exporter
+ Christoph Haas
+ http://www.sprinternet.at
+ Import or Export a ICS file to/from the zarafa calendar
+
+
+ config.php
+
+
+
+
+
+ php/plugin.calendarimporter.php
+ php/module.calendarexporter.php
+
+
+ js/calendarimporter.js
+ js/calendarimporter-debug.js
+
+ js/data/timezones.js
+ js/plugin.calendarimporter.js
+ js/data/ResponseHandler.js
+ js/dialogs/ImportContentPanel.js
+ js/dialogs/ImportPanel.js
+
+
+ resources/css/calendarimporter-min.css
+ resources/css/calendarimporter.css
+ resources/css/calendarimporter-main.css
+
+
+
+
diff --git a/php/ical/calendar.txt b/php/ical/calendar.txt
index cbe61bc..fe9c004 100644
--- a/php/ical/calendar.txt
+++ b/php/ical/calendar.txt
@@ -4,11 +4,11 @@ VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Testkalender
-X-WR-TIMEZONE:America/Detroit
+X-WR-TIMEZONE:Europe/Berlin
X-WR-CALDESC:Nur zum testen vom Google Kalender
BEGIN:VEVENT
-DTSTART:20121227T150000Z
-DTEND:20121227T160000Z
+DTSTART;TZID="W. Europe":20121227T100000
+DTEND;TZID="W. Europe":20121227T120000
DTSTAMP:20110121T195741Z
UID:1koigufm110c5hnq6ln57murd4@google.com
CREATED:20110119T142901Z
diff --git a/php/ical/class.icalparser.php b/php/ical/class.icalparser.php
index 85fec1b..f1c8cd2 100644
--- a/php/ical/class.icalparser.php
+++ b/php/ical/class.icalparser.php
@@ -9,7 +9,7 @@
* @author Christoph Haas
* @modified 17.11.2012 by Christoph Haas (original at http://code.google.com/p/ics-parser/)
* @license http://www.opensource.org/licenses/mit-license.php MIT License
- * @version SVN: 16
+ * @version SVN: 62
* @example $ical = new ical('calendar.ics');
* print_r( $ical->events() );
*/
@@ -26,6 +26,9 @@ class ICal {
/* How many events are in this ical? */
public /** @type {int} */ $event_count = 0;
+
+ /* Currently editing an alarm? */
+ private /** @type {int} */ $isalarm = false;
/* The parsed calendar */
public /** @type {Array} */ $cal;
@@ -74,7 +77,12 @@ class ICal {
$this->todo_count++;
$type = "VTODO";
break;
-
+
+ case "BEGIN:VALARM":
+ //echo "vevent gematcht";
+ $this->isalarm=true;
+ $type = "VEVENT";
+ break;
// http://www.kanzaki.com/docs/ical/vevent.html
case "BEGIN:VEVENT":
//echo "vevent gematcht";
@@ -91,13 +99,17 @@ class ICal {
$type = $value;
break;
case "END:VTODO": // end special text - goto VCALENDAR key
- case "END:VEVENT":
+ case "END:VEVENT":
case "END:VCALENDAR":
case "END:DAYLIGHT":
case "END:VTIMEZONE":
case "END:STANDARD":
$type = "VCALENDAR";
- break;
+ break;
+ case "END:VALARM":
+ $this->isalarm=false;
+ $type = "VEVENT";
+ break;
default:
$this->addCalendarComponentWithKeyAndValue($type, $keyword, $value, $prop, $propvalue);
break;
@@ -122,13 +134,16 @@ class ICal {
switch ($component) {
case 'VEVENT':
- if (stristr($keyword, "DTSTART") or stristr($keyword, "DTEND")) {
+ if (stristr($keyword, "DTSTART") or stristr($keyword, "DTEND") or stristr($keyword, "TRIGGER")) {
$ts = $this->iCalDateToUnixTimestamp($value, $prop, $propvalue);
$value = $ts * 1000;
}
$value = str_replace("\\n", "\n", $value);
- $value = $this->cal[$component][$this->event_count - 1]
- [$keyword].$value;
+ if(!$this->isalarm) {
+ $value = $this->cal[$component][$this->event_count - 1][$keyword].$value;
+ } else {
+ $value = $this->cal[$component][$this->event_count - 1]["VALARM"][$keyword].$value;
+ }
break;
case 'VTODO' :
$value = $this->cal[$component][$this->todo_count - 1]
@@ -154,14 +169,19 @@ class ICal {
//$this->cal[$component][$this->todo_count]['Unix'] = $unixtime;
break;
case "VEVENT":
- if (stristr($keyword, "DTSTART") or stristr($keyword, "DTEND")) {
+ if (stristr($keyword, "DTSTART") or stristr($keyword, "DTEND") or stristr($keyword, "TRIGGER")) {
$ts = $this->iCalDateToUnixTimestamp($value, $prop, $propvalue);
$value = $ts * 1000;
}
$value = str_replace("\\n", "\n", $value);
- $this->cal[$component][$this->event_count - 1][$keyword] = $value;
+
+ if(!$this->isalarm) {
+ $this->cal[$component][$this->event_count - 1][$keyword] = $value;
+ } else {
+ $this->cal[$component][$this->event_count - 1]["VALARM"][$keyword] = $value;
+ }
break;
- default:
+ default:
$this->cal[$component][$keyword] = $value;
break;
}
@@ -176,7 +196,7 @@ class ICal {
* @return {array} array("VCALENDAR", "Begin", "Optional Props")
*/
public function keyValueFromString($text) {
- preg_match("/(^[^a-z:;]+)([;a-zA-Z]*)[=]*([a-zA-Z\/\"\'\.\s]*)[:]([\w\W]*)/", $text, $matches);
+ preg_match("/(^[^a-z:;]+)[;]*([a-zA-Z]*)[=]*(.*)[:]([\w\W]*)/", $text, $matches);
if (count($matches) == 0) {
return false;
@@ -200,7 +220,7 @@ class ICal {
if($prop) {
$pos = strpos("TZIDtzid", $prop);
- if($pos !== false && $propvalue) {
+ if($pos !== false && $propvalue != false) {
$timezone = str_replace('"', '', $propvalue);
$timezone = str_replace('\'', '', $timezone);
}
@@ -239,14 +259,34 @@ class ICal {
if(!$utc) {
$tz = $this->default_timezone;
- if($timezone) {
+ if($timezone != false) {
$tz = $timezone;
}
- $this_tz = new DateTimeZone($tz);
- $tz_now = new DateTime("now", $this_tz);
- $tz_offset = $this_tz->getOffset($tz_now);
- $timestamp_utc = $timestamp - $tz_offset;
+ $error = false;
+ $this_tz = false;
+
+ try {
+ $this_tz = new DateTimeZone($tz);
+ } catch(Exception $e) {
+ error_log($e->getMessage());
+ $error = true;
+ }
+
+ if($error) {
+ try { // Try using the default calendar timezone
+ $this_tz = new DateTimeZone($this->default_timezone);
+ } catch(Exception $e) {
+ error_log($e->getMessage());
+ $timestamp_utc = $timestamp; // if that fails, we cannot do anymore
+ }
+ }
+
+ if($this_tz != false) {
+ $tz_now = new DateTime("now", $this_tz);
+ $tz_offset = $this_tz->getOffset($tz_now);
+ $timestamp_utc = $timestamp - $tz_offset;
+ }
} else {
$timestamp_utc = $timestamp;
}
diff --git a/php/plugin.calendarimporter.php b/php/plugin.calendarimporter.php
index 6dd4c37..9210eff 100644
--- a/php/plugin.calendarimporter.php
+++ b/php/plugin.calendarimporter.php
@@ -48,7 +48,7 @@ class Plugincalendarimporter extends Plugin {
'calendarimporter' => Array(
'enable' => PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE,
'enable_export' => PLUGIN_CALENDARIMPORTER_USER_DEFAULT_ENABLE_EXPORT,
- 'default_calendar' => PLUGIN_CALENDARIMPORTER_DEFAULT // currently not used, maybe in next release
+ 'default_calendar' => PLUGIN_CALENDARIMPORTER_DEFAULT
)
)
)
diff --git a/resources/css/calendarimporter.css b/resources/css/calendarimporter-main.css
similarity index 100%
rename from resources/css/calendarimporter.css
rename to resources/css/calendarimporter-main.css