Add URL field to events.
authorJan Schneider <jan@horde.org>
Thu, 10 Dec 2009 23:07:53 +0000 (00:07 +0100)
committerJan Schneider <jan@horde.org>
Thu, 10 Dec 2009 23:08:19 +0000 (00:08 +0100)
19 files changed:
kronolith/docs/CHANGES
kronolith/js/kronolith.js
kronolith/lib/Driver/Sql.php
kronolith/lib/Event.php
kronolith/lib/Event/Sql.php
kronolith/lib/View/Event.php
kronolith/scripts/sql/kronolith.mssql.sql
kronolith/scripts/sql/kronolith.mysql.sql
kronolith/scripts/sql/kronolith.oci8.sql
kronolith/scripts/sql/kronolith.pgsql.sql
kronolith/scripts/sql/kronolith.sql
kronolith/scripts/sql/kronolith.xml
kronolith/scripts/upgrades/2009-12-09_add_url.mssql.sql [new file with mode: 0644]
kronolith/scripts/upgrades/2009-12-09_add_url.oci8.sql [new file with mode: 0644]
kronolith/scripts/upgrades/2009-12-09_add_url.sql [new file with mode: 0644]
kronolith/templates/edit/edit.inc
kronolith/templates/edit/javascript.inc
kronolith/templates/index/edit.inc
kronolith/templates/view/view.inc

index dc0779c..6d5155c 100644 (file)
@@ -2,6 +2,7 @@
 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.
index d2b91b3..29b9a2d 100644 (file)
@@ -3221,6 +3221,7 @@ KronolithCore = {
         $('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);
index 0818a67..a48503f 100644 (file)
@@ -118,31 +118,15 @@ class Kronolith_Driver_Sql extends Kronolith_Driver
         $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)) {
@@ -154,7 +138,6 @@ class Kronolith_Driver_Sql extends Kronolith_Driver
                 $cond .= $binds;
             }
         }
-
         if (!empty($query->creatorID)) {
             $binds = Horde_SQL::buildClause($this->_db, 'event_creator_id', '=', $query->creatorID, true);
             if (is_array($binds)) {
@@ -313,7 +296,7 @@ class Kronolith_Driver_Sql extends Kronolith_Driver
     {
         $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,' .
@@ -426,7 +409,7 @@ class Kronolith_Driver_Sql extends Kronolith_Driver
 
         $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,' .
@@ -467,7 +450,7 @@ class Kronolith_Driver_Sql extends Kronolith_Driver
     {
         $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,' .
index 9ba48e4..0bee658 100644 (file)
@@ -487,6 +487,11 @@ abstract class Kronolith_Event
             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');
 
@@ -1106,6 +1111,7 @@ abstract class Kronolith_Event
      * - id: event id
      * - ty: calendar type (driver)
      * - l: location
+     * - u: url
      * - sd: formatted start date
      * - st: formatted start time
      * - ed: formatted end date
@@ -1162,6 +1168,7 @@ abstract class Kronolith_Event
             $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');
@@ -1748,6 +1755,53 @@ abstract class Kronolith_Event
         $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));
 
index 11b10de..cfbd753 100644 (file)
@@ -107,6 +107,9 @@ class Kronolith_Event_Sql extends Kronolith_Event
         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']);
         }
@@ -141,6 +144,7 @@ class Kronolith_Event_Sql extends Kronolith_Event
         $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()));
index 020e8e5..d3a84ed 100644 (file)
@@ -75,6 +75,7 @@ class Kronolith_View_Event {
         $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());
index 91e0e17..2ce2c44 100644 (file)
@@ -5,6 +5,7 @@ CREATE TABLE kronolith_events (
     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),
@@ -93,4 +94,4 @@ CREATE TABLE kronolith_resources (
 );
 
 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);
index 25a1000..9570ac7 100644 (file)
@@ -5,6 +5,7 @@ CREATE TABLE kronolith_events (
     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,
index 2a6c23e..f91794a 100644 (file)
@@ -5,6 +5,7 @@ CREATE TABLE kronolith_events (
     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),
@@ -94,4 +95,4 @@ CREATE TABLE kronolith_resources (
 );
 
 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);
index 198e409..7a90ca7 100644 (file)
@@ -5,6 +5,7 @@ CREATE TABLE kronolith_events (
     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,
@@ -93,4 +94,4 @@ CREATE TABLE kronolith_resources (
 );
 
 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);
index 08e7fab..d96bc79 100644 (file)
@@ -5,6 +5,7 @@ CREATE TABLE kronolith_events (
     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,
index ecdb090..4007c48 100644 (file)
    </field>
 
    <field>
+    <name>event_url</name>
+    <type>clob</type>
+   </field>
+
+   <field>
     <name>event_status</name>
     <type>integer</type>
     <default>0</default>
diff --git a/kronolith/scripts/upgrades/2009-12-09_add_url.mssql.sql b/kronolith/scripts/upgrades/2009-12-09_add_url.mssql.sql
new file mode 100644 (file)
index 0000000..4dbc1ae
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE kronolith_events ADD event_url VARCHAR(MAX);
diff --git a/kronolith/scripts/upgrades/2009-12-09_add_url.oci8.sql b/kronolith/scripts/upgrades/2009-12-09_add_url.oci8.sql
new file mode 100644 (file)
index 0000000..098ee8b
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE kronolith_events ADD event_url VARCHAR2(4000);
diff --git a/kronolith/scripts/upgrades/2009-12-09_add_url.sql b/kronolith/scripts/upgrades/2009-12-09_add_url.sql
new file mode 100644 (file)
index 0000000..73ce7a2
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE kronolith_events ADD event_url TEXT;
index 902f2f7..6ae2548 100644 (file)
@@ -232,6 +232,20 @@ if ($event->alarm) {
  </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')">
index 4f3284b..c674532 100644 (file)
@@ -278,6 +278,7 @@ KronolithEventForm.toggleSection = function(section)
 Event.observe(window, 'load', function() {
     KronolithEventForm.toggleSection('alarm');
     KronolithEventForm.toggleSection('description');
+    KronolithEventForm.toggleSection('url');
     KronolithEventForm.toggleSection('attendees');
     KronolithEventForm.toggleSection('recurrence');
     KronolithEventForm.toggleSection('tags');
index 155330c..a8da2f1 100644 (file)
 </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">
index 86dfb72..17bfa70 100644 (file)
@@ -8,6 +8,14 @@
 </tr>
 <?php endif; ?>
 
+<?php if (!$private && strlen($eventurl)): ?>
+<!-- url -->
+<tr>
+ <td class="rightAlign"><strong><?php echo _("URL") ?>&nbsp;&nbsp;</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") ?>&nbsp;&nbsp;</strong></td>
@@ -135,6 +143,7 @@ if ($this->event->isInitialized() && $this->event->alarm > 0):
      <td colspan="2"><?php echo $tags?></td>
     </tr>
 <?php endif;?>
+
 <?php if (!$private && !empty($description)): ?>
 <!-- description -->
 <tr>
@@ -149,7 +158,7 @@ if ($this->event->isInitialized() && $this->event->alarm > 0):
 
 <?php if (!empty($attendees)): ?>
 <table cellspacing="0">
-<!-- attendees -->
+ <!-- attendees -->
  <tr>
   <td colspan="3" class="control"><strong><?php echo _("Attendees") ?></strong></td>
  </tr>
@@ -165,7 +174,7 @@ if ($this->event->isInitialized() && $this->event->alarm > 0):
   <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>