v3.0-git
--------
+[jan] Add URL field to events.
[jan] Add task management capabilities to the Ajax interface.
[jan] Manage holidays like any other calendar driver.
[mjr] Add support for resource scheduling.
$('kronolithEventTarget').setValue(ev.ty + '|' + ev.c);
$('kronolithEventTitle').setValue(ev.t);
$('kronolithEventLocation').setValue(ev.l);
+ $('kronolithEventUrl').setValue(ev.u);
$('kronolithEventAllday').setValue(ev.al);
this.toggleAllDay(ev.al);
$('kronolithEventStartDate').setValue(ev.sd);
$cond = '((';
$values = array();
- if (!empty($query->title)) {
- $binds = Horde_SQL::buildClause($this->_db, 'event_title', 'LIKE', $this->convertToDriver($query->title), true);
- if (is_array($binds)) {
- $cond .= $binds[0] . ' AND ';
- $values = array_merge($values, $binds[1]);
- } else {
- $cond .= $binds;
- }
- }
- if (!empty($query->location)) {
- $binds = Horde_SQL::buildClause($this->_db, 'event_location', 'LIKE', $this->convertToDriver($query->location), true);
- if (is_array($binds)) {
- $cond .= $binds[0] . ' AND ';
- $values = array_merge($values, $binds[1]);
- } else {
- $cond .= $binds;
- }
- }
- if (!empty($query->description)) {
- $binds = Horde_SQL::buildClause($this->_db, 'event_description', 'LIKE', $this->convertToDriver($query->description), true);
- if (is_array($binds)) {
- $cond .= $binds[0] . ' AND ';
- $values = array_merge($values, $binds[1]);
- } else {
- $cond .= $binds;
+ foreach (array('title', 'location', 'url', 'description') as $field) {
+ if (!empty($query->$field)) {
+ $binds = Horde_SQL::buildClause($this->_db, 'event_' . $field, 'LIKE', $this->convertToDriver($query->$field), true);
+ if (is_array($binds)) {
+ $cond .= $binds[0] . ' AND ';
+ $values = array_merge($values, $binds[1]);
+ } else {
+ $cond .= $binds;
+ }
}
}
if (isset($query->status)) {
$cond .= $binds;
}
}
-
if (!empty($query->creatorID)) {
$binds = Horde_SQL::buildClause($this->_db, 'event_creator_id', '=', $query->creatorID, true);
if (is_array($binds)) {
{
$q = 'SELECT event_id, event_uid, event_description, event_location,' .
' event_private, event_status, event_attendees,' .
- ' event_title, event_recurcount,' .
+ ' event_title, event_recurcount, event_url,' .
' event_recurtype, event_recurenddate, event_recurinterval,' .
' event_recurdays, event_start, event_end, event_allday,' .
' event_alarm, event_alarm_methods, event_modified,' .
$query = 'SELECT event_id, event_uid, event_description,' .
' event_location, event_private, event_status, event_attendees,' .
- ' event_title, event_recurcount,' .
+ ' event_title, event_recurcount, event_url,' .
' event_recurtype, event_recurenddate, event_recurinterval,' .
' event_recurdays, event_start, event_end, event_allday,' .
' event_alarm, event_alarm_methods, event_modified,' .
{
$query = 'SELECT event_id, event_uid, calendar_id, event_description,' .
' event_location, event_private, event_status, event_attendees,' .
- ' event_title, event_recurcount,' .
+ ' event_title, event_recurcount, event_url,' .
' event_recurtype, event_recurenddate, event_recurinterval,' .
' event_recurdays, event_start, event_end, event_allday,' .
' event_alarm, event_alarm_methods, event_modified,' .
if (!empty($this->location)) {
$vEvent->setAttribute('LOCATION', $v1 ? $this->location : Horde_String::convertCharset($this->location, Horde_Nls::getCharset(), 'utf-8'));
}
+
+ // URL
+ if (!empty($this->url)) {
+ $vEvent->setAttribute('URL', $this->url);
+ }
}
$vEvent->setAttribute('CLASS', $this->isPrivate() ? 'PRIVATE' : 'PUBLIC');
* - id: event id
* - ty: calendar type (driver)
* - l: location
+ * - u: url
* - sd: formatted start date
* - st: formatted start time
* - ed: formatted end date
$json->ty = $this->_calendarType;
$json->d = $this->getDescription();
$json->l = $this->getLocation();
+ $json->u = $this->url;
$json->sd = $this->start->strftime('%x');
$json->st = $this->start->format($time_format);
$json->ed = $this->end->strftime('%x');
$this->setLocation(Horde_Util::getFormData('location', $this->location));
$this->setPrivate(Horde_Util::getFormData('private'));
+ // URL.
+ $url = Horde_Util::getFormData('eventurl', $this->url);
+ if (strlen($url)) {
+ // Analyze and re-construct.
+ $url = @parse_url($url);
+ if ($url) {
+ if (function_exists('http_build_url')) {
+ $url = http_build_url($url);
+ } else {
+ $new_url = '';
+ if (isset($url['scheme'])) {
+ $new_url .= $url['scheme'] . '://';
+ }
+ if (isset($url['user'])) {
+ $new_url .= $url['user'];
+ if (isset($url['pass'])) {
+ $new_url .= ':' . $url['pass'];
+ }
+ $new_url .= '@';
+ }
+ if (isset($url['host'])) {
+ // Convert IDN hosts to ASCII.
+ if (Horde_Util::extensionExists('idn')) {
+ $old_error = error_reporting(0);
+ $url['host'] = idn_to_ascii(Horde_String::convertCharset($url['host'], Horde_Nls::getCharset(), 'UTF-8'));
+ error_reporting($old_error);
+ } elseif (Horde_Mime::is8bit($url['host'])) {
+ //throw new Kronolith_Exception(_("Invalid character in URL."));
+ $url['host'] = '';
+ }
+ $new_url .= $url['host'];
+ }
+ if (isset($url['path'])) {
+ $new_url .= $url['path'];
+ }
+ if (isset($url['query'])) {
+ $new_url .= '?' . $url['query'];
+ }
+ if (isset($url['fragment'])) {
+ $new_url .= '#' . $url['fragment'];
+ }
+ $url = $new_url;
+ }
+ }
+ }
+ $this->url = $url;
+
// Status.
$this->setStatus(Horde_Util::getFormData('status', $this->status));
if (isset($SQLEvent['event_location'])) {
$this->location = $driver->convertFromDriver($SQLEvent['event_location']);
}
+ if (isset($SQLEvent['event_url'])) {
+ $this->url = $SQLEvent['event_url'];
+ }
if (isset($SQLEvent['event_private'])) {
$this->private = (bool)($SQLEvent['event_private']);
}
$this->_properties['event_title'] = $driver->convertToDriver($this->title);
$this->_properties['event_description'] = $driver->convertToDriver($this->getDescription());
$this->_properties['event_location'] = $driver->convertToDriver($this->getLocation());
+ $this->_properties['event_url'] = $this->url;
$this->_properties['event_private'] = (int)$this->isPrivate();
$this->_properties['event_status'] = $this->getStatus();
$this->_properties['event_attendees'] = serialize($driver->convertToDriver($this->getAttendees()));
$creatorId = $this->event->getCreatorId();
$description = $this->event->getDescription();
$location = $this->event->getLocation();
+ $eventurl = $this->event->url;
$private = $this->event->isPrivate() && $creatorId != Horde_Auth::getAuth();
$owner = Kronolith::getUserName($creatorId);
$status = Kronolith::statusToString($this->event->getStatus());
event_creator_id VARCHAR(255) NOT NULL,
event_description VARCHAR(MAX),
event_location VARCHAR(MAX),
+ event_url VARCHAR(MAX),
event_status INT DEFAULT 0,
event_attendees VARCHAR(MAX),
event_resources VARCHAR(MAX),
);
CREATE INDEX kronolith_resources_type_idx ON kronolith_resources (resource_type);
-CREATE INDEX kronolith_resources_calendar_idx ON kronolith_resources (resource_calendar);
\ No newline at end of file
+CREATE INDEX kronolith_resources_calendar_idx ON kronolith_resources (resource_calendar);
event_creator_id VARCHAR(255) NOT NULL,
event_description TEXT,
event_location TEXT,
+ event_url TEXT,
event_status INT DEFAULT 0,
event_attendees TEXT,
event_resources TEXT,
event_creator_id VARCHAR2(255) NOT NULL,
event_description VARCHAR2(4000),
event_location VARCHAR2(4000),
+ event_url VARCHAR2(4000),
event_status NUMBER(8) DEFAULT 0,
event_attendees VARCHAR2(4000),
event_resources VARCHAR2(4000),
);
CREATE INDEX kronolith_resources_type_idx ON kronolith_resources (resource_type);
-CREATE INDEX kronolith_resources_calendar_idx ON kronolith_resources (resource_calendar);
\ No newline at end of file
+CREATE INDEX kronolith_resources_calendar_idx ON kronolith_resources (resource_calendar);
event_creator_id VARCHAR(255) NOT NULL,
event_description TEXT,
event_location TEXT,
+ event_url TEXT,
event_status INT DEFAULT 0,
event_attendees TEXT,
event_resources TEXT,
);
CREATE INDEX kronolith_resources_type_idx ON kronolith_resources (resource_type);
-CREATE INDEX kronolith_resources_calendar_idx ON kronolith_resources (resource_calendar);
\ No newline at end of file
+CREATE INDEX kronolith_resources_calendar_idx ON kronolith_resources (resource_calendar);
event_creator_id VARCHAR(255) NOT NULL,
event_description TEXT,
event_location TEXT,
+ event_url TEXT,
event_status INT DEFAULT 0,
event_attendees TEXT,
event_resources TEXT,
</field>
<field>
+ <name>event_url</name>
+ <type>clob</type>
+ </field>
+
+ <field>
<name>event_status</name>
<type>integer</type>
<default>0</default>
--- /dev/null
+ALTER TABLE kronolith_events ADD event_url VARCHAR(MAX);
--- /dev/null
+ALTER TABLE kronolith_events ADD event_url VARCHAR2(4000);
--- /dev/null
+ALTER TABLE kronolith_events ADD event_url TEXT;
</td>
</tr>
+<!-- url -->
+<tr>
+ <td colspan="5" class="control toggle" onclick="KronolithEventForm.toggleSection('url')">
+ <?php echo Horde::img('tree/blank.png', '', array('id' => 'toggle_url'), $GLOBALS['registry']->getImageDir('horde')) . ' <strong>' . Horde::label('url', _("URL")) ?></strong>
+ <span class="extra" id="extra_url"><?php echo htmlspecialchars($event->url) ?></span>
+</td>
+</tr>
+<tr id="section_url">
+ <td class="rightAlign"><strong><?php echo Horde::label('url', _("URL")) ?></strong></td>
+ <td colspan="4">
+ <input type="text" name="eventurl" id="url" value="<?php echo htmlspecialchars($event->url) ?>" size="40" maxlength="2048" />
+ </td>
+</tr>
+
<!-- attendees/resources -->
<tr>
<td colspan="5" class="control toggle" onclick="KronolithEventForm.toggleSection('attendees')">
Event.observe(window, 'load', function() {
KronolithEventForm.toggleSection('alarm');
KronolithEventForm.toggleSection('description');
+ KronolithEventForm.toggleSection('url');
KronolithEventForm.toggleSection('attendees');
KronolithEventForm.toggleSection('recurrence');
KronolithEventForm.toggleSection('tags');
</div>
<div id="kronolithEventTabUrl" class="kronolithTabsOption" style="display:none">
- <input type="text" name="url" id="kronolithEventUrl" class="kronolithLongField" value="http://" />
+ <input type="text" name="eventurl" id="kronolithEventUrl" class="kronolithLongField" value="http://" />
</div>
<div id="kronolithEventTabAttendees" class="kronolithTabsOption" style="display:none">
</tr>
<?php endif; ?>
+<?php if (!$private && strlen($eventurl)): ?>
+<!-- url -->
+<tr>
+ <td class="rightAlign"><strong><?php echo _("URL") ?> </strong></td>
+ <td><?php echo Horde_Text_Filter::filter($eventurl, 'linkurls') ?></td>
+</tr>
+<?php endif; ?>
+
<!-- status -->
<tr>
<td width="10%" class="rightAlign"><strong><?php echo _("Status") ?> </strong></td>
<td colspan="2"><?php echo $tags?></td>
</tr>
<?php endif;?>
+
<?php if (!$private && !empty($description)): ?>
<!-- description -->
<tr>
<?php if (!empty($attendees)): ?>
<table cellspacing="0">
-<!-- attendees -->
+ <!-- attendees -->
<tr>
<td colspan="3" class="control"><strong><?php echo _("Attendees") ?></strong></td>
</tr>
<td><?php echo Kronolith::responseToString($status['response']) ?></td>
</tr>
<?php endforeach; ?>
- <!-- Resources -->
+ <!-- resources -->
<tr>
<td colspan="3" class="control"><strong><?php echo _("Resources") ?></strong></td>
</tr>