<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en"><title type="text">Het Bijstere Spoor</title><link rel="alternate" type="text/html" href="http://www.rooftopsolutions.nl/" /><subtitle type="html">Latest headlines for Het Bijstere Spoor</subtitle><updated>1970-01-01T00:00:00+00:00</updated><generator>SabreTooth5 (Feed generator library 0.2). http://www.rooftopsolutions.nl</generator><geo:lat>43.636417</geo:lat><geo:long>-79.424651</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.5/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><title type="text">SabreDAV reaches 1.0</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/zZkdBiWjB-8/256" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-11-02T12:45:02-08:00</updated><id>http://www.rooftopsolutions.nl/article/256</id><content type="html">&lt;p&gt;After lots of testing, coding and integrating SabreDAV in a few systems, SabreDAV has reached 1.0.&lt;/p&gt;

&lt;h3&gt;What's that?&lt;/h3&gt;

&lt;p&gt;For those of you randomly stumbling on this blog, SabreDAV is a tool I've been working on to allow easy integration of PHP and WebDAV. While looking at WebDAV implementions out there for PHP, there weren't really any standards-compliant and flexible solutions out there, so I decided to write my own.&lt;/p&gt;

&lt;p&gt;Since then it has gained some popularity, and the beta version has been tested and implemented in a number of places. It's open source (under the BSD license), so anybody can grab it and use it.&lt;/p&gt;

&lt;p&gt;If you don't really know what WebDAV is, it is basically a filesystem protocol that works on top of HTTP. By implementing WebDAV (or SabreDAV specifically) you are able to expose your web application as if it was a filesystem to the users. WebDAV is supported by any major operating system.&lt;/p&gt;

&lt;p&gt;If you're interested in SabreDAV, check out the &lt;a href="http://code.google.com/p/sabredav/source/browse/trunk/examples/fileserver.php"&gt;example&lt;/a&gt;, or &lt;a href="http://code.google.com/p/sabredav/wiki/GettingStarted"&gt;tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;

&lt;p&gt;The last round of changes since 0.12.1 are mostly cleanups, but the most important are the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/sabredav/wiki/SimpleDirectory"&gt;SimpleDirectory class&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Authentication plugin is no longer included. The plugin was not yet production ready, and in order to allow myself to make API changes, I needed to remove it for 1.0. This &lt;strong&gt;does not&lt;/strong&gt; mean you can no longer use the &lt;a href="http://code.google.com/p/sabredav/wiki/Authentication"&gt;recommended way&lt;/a&gt; to implement authentication.&lt;/li&gt;
  &lt;li&gt;The unknownProperties event was removed, replaced by the afterGetPropertiesEvent (&lt;a href="http://code.google.com/p/sabredav/wiki/WritingPlugins"&gt;docs&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;Addition of &lt;a href="http://code.google.com/p/sabredav/wiki/WritingPlugins"&gt;more events&lt;/a&gt; for plugin writers.&lt;/li&gt;
  &lt;li&gt;Lots of cleaning up, unittests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://code.google.com/p/sabredav/source/browse/trunk/ChangeLog"&gt;Full changelog&lt;/a&gt; and &lt;a href="http://code.google.com/p/sabredav/downloads/list"&gt;download&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Future plans&lt;/h3&gt;

&lt;p&gt;Although the 1.0 version should be a bit of a milestone, the release had actually been sitting ready for a while. So while 1.0 is cool and all, I've already spent a great deal of time implementing &lt;a href="http://www.ietf.org/rfc/rfc3744.txt"&gt;RFC 3744 a.k.a. ACL extensions for WebDAV&lt;/a&gt;. Support for ACL will be added as a separate module in the future.&lt;/p&gt;

&lt;p&gt;While these changes are going on, no backwards compatibility breaking changes should be made to the API's. For more details on the BC and versioning policy, check &lt;a href="http://code.google.com/p/sabredav/wiki/VersionPolicy"&gt;here&lt;/a&gt;.

&lt;h3&gt;Thanks!&lt;/h3&gt;

&lt;p&gt;It's been a lot of hard work to get here, but seeing some uptake is very rewarding. I would probably have given up on this if it weren't for the people asking questions, making suggestions and filing reports. Thanks for that, it makes it worth it!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/zZkdBiWjB-8" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/256</feedburner:origLink></entry><entry><title type="text">Comments are back!</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/ONxrGQzI3eA/255" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-10-13T07:46:47-07:00</updated><id>http://www.rooftopsolutions.nl/article/255</id><content type="html">&lt;p&gt;Thanks to a suggestion from Mohammad Lahlouh, all deleted comments are restored. Thanks!&lt;/p&gt;

&lt;p&gt;I was able to do this with the mysql binlog, which is a binary log containing all statements executed on the server. If you face a similar problem, here are the steps to restore the DB:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;See if you're actually storing binlogs. For me this happened to be the case, although I never actually payed attention (My friend Jens Meijer is so kind to provide hosting for me). In my case they were stored in /var/log/mysql.&lt;/li&gt;
  &lt;li&gt;Grab your latest backup. In my case it was from October 2008.&lt;/li&gt;
  &lt;li&gt;Make sure you also create a new backup, just in case this process goes wrong.&lt;/li&gt;
  &lt;li&gt;Restore your old back.&lt;/li&gt;
  &lt;li&gt;Find the binlog that corresponds to the date of your backup. I did a simple copy of the ~300 binlogs to a different directory.&lt;/li&gt;
  &lt;li&gt;Run the binlog through 'mysqlbinlog' and pipe into a new file. I had to append the --database argument, because I wasn't interested in all the other databases. The full command for me was &lt;i&gt;mysqlbinlog mysql-bin.* --database evert2 &amp;gt; commentsbinlog.sql&lt;/i&gt;&lt;/li&gt;.
  &lt;li&gt;Open the new file, and make sure the first queries are correct. Likely there are some updates/inserts/deletes on top of the file that were already part of your last backup.&lt;/li&gt;
  &lt;li&gt;Go all the way to the bottom of the file, and remove the offending queries. In my case I had to remove the query that deleted all my comments.&lt;/li&gt;
  &lt;li&gt;Apply the sql file to your database: &lt;i&gt;mysql -u root -p evert2 &amp;lt; &lt; commentsbinlog.sql&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's wise to assure nobody can access the DB while you are doing this. I hope this helps anyone else with this problem.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/ONxrGQzI3eA" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/255</feedburner:origLink></entry><entry><title type="text">Deleted all comments by accident</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/nIRWY0OFqK8/254" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-10-12T15:49:01-07:00</updated><id>http://www.rooftopsolutions.nl/article/254</id><content type="html">&lt;p&gt;I just accidentally deleted all comments made on this blog.&lt;/p&gt;

&lt;p&gt;This blog is homegrown and hand-made. It has a very simple spamfilter that catches most spam comments. The few that make it through though, I've been deleting myself using the mysql console.&lt;/p&gt;

&lt;p&gt;I tend to write simple queries, ending in: &lt;strong&gt;.. AND id = 1234&lt;/strong&gt;, but today I forgot the &lt;strong&gt;id =&lt;/strong&gt;. I had a backup from October 2008, so some old comments are back now, but I'm still pretty sad.&lt;/p&gt;

&lt;p&gt;Lesson from today: make backups! I'm pretty good with things I do for clients, but I tend to not uphold the same standards for my own projects.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/nIRWY0OFqK8" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/254</feedburner:origLink></entry><entry><title type="text">Upgrading to Snow Leopard adventures</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/WCyb4dG-lko/253" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-09-15T10:41:51-07:00</updated><id>http://www.rooftopsolutions.nl/article/253</id><content type="html">&lt;p&gt;I just got my copy of snow leopard in the mail, so I decided to upgrade my laptop. After doing a full backup, I didn't turn out to be as easy as I thought.&lt;/p&gt;

&lt;p&gt;The installation process quickly showed a little yellow triangle, indicating I didn't have any startup disks. I quickly remembered I had a dual boot to Ubuntu, and used &lt;a href="http://refit.sourceforge.net/"&gt;Refit&lt;/a&gt;, which is basically an alternative boot menu, to get into Linux and the likes.&lt;/p&gt;

&lt;p&gt;So I looked up the &lt;a href="http://refit.sourceforge.net/doc/c1s3_remove.html"&gt;removal instructions&lt;/a&gt;, but unfortunately this didn't change the situation. I then read that OS/X will restore the standard EFI loader (if that's the correct terminology), by opening the Disk Utility, and making the partition slightly smaller and bigger again. Trying this I got an odd error, namely "MediaKit reports no such partition". No dice.&lt;/p&gt;

&lt;p&gt;So I ended up booting an Ubuntu Live CD, removing the linux ext3 and swap partitions there. After this was done, I was able to resize the main OS/X partition, which eventually fixed the problem.&lt;/p&gt;

&lt;p&gt;If you ran into similar problems, I'm hoping there's enough keywords in here for you to find this solution :).&lt;/p&gt;

&lt;p&gt;After all that installing Snow Leopard is a bit of an anti-climax. As advertised, not a lot changed, and I've yet to see a noticeable speed difference. The OS is using less disk-space, but 29 euro is still a high price for a glorified 'rm' statement.&lt;/p&gt;

&lt;p&gt;I do notice small notification improvements here and there, and Address Book.app now supports CardDAV, which is nice.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/WCyb4dG-lko" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/253</feedburner:origLink></entry><entry><title type="text">OS/X internet sharing defaults to 192.168.2.* range.</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/R7f2TUqYgbM/251" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-09-14T11:49:25-07:00</updated><id>http://www.rooftopsolutions.nl/article/251</id><content type="html">&lt;p&gt;I was stumped, I was trying to hook up a second computer on the internet through ethernet. Normally it's easy enough to just turn on internet sharing. It turns out OS/X always uses 192.168.2.*, which happened to be in the same subnet as the WiFi network.&lt;/p&gt;

&lt;p&gt;OS/X provides no way to change this as far as I could tell. Thankfully I was able to change the router's settings.
 If you ever get into this situation and you're not able to make this change, &lt;a href="http://www.macosxhints.com/article.php?story=20050331194834746&amp;query=internet%2Bsharing"&gt;here's&lt;/a&gt; a simple guide to setup internet sharing using the console.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/R7f2TUqYgbM" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/251</feedburner:origLink></entry><entry><title type="text">CalDAV - it's hard!</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/2wY4AZFNQ6g/250" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-09-13T14:35:48-07:00</updated><id>http://www.rooftopsolutions.nl/article/250</id><content type="html">&lt;p&gt;Over the past little while I've been working on a &lt;a href="http://tools.ietf.org/html/rfc4791"&gt;CalDAV&lt;/a&gt; library, and it's tough!&lt;/p&gt;

&lt;p&gt;It appears that the spec is very much implemented with the client, rather than the server in mind. The spec writers have left no stone unturned, and it's technically possible to query the server for any odd dataset you might need. Aside from that the authors made absolutely sure there were no duplicated efforts, and built heavily upon the existing &lt;a href="http://webdav.org/specs/rfc4918.html"&gt;WebDAV&lt;/a&gt;, &lt;a href="http://webdav.org/specs/rfc3744.html"&gt;WebDAV ACL extensions&lt;/a&gt; and &lt;a href="http://tools.ietf.org/html/rfc2445"&gt;iCalendar&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While I generally agree it's a wise thing to not reinvent the wheel, I'm a bit of a pragmatist and feel the complexity of all these layers make it hard to understand, and must have played/will play a factor in the arguably slow adoption rate.&lt;/p&gt;

&lt;p&gt;To keep it short, I feel the authors have over-engineered/abstracted the specification. Instead of making simple API's that work for 90% of the usecases, they have gone a much more generic route. This makes it very hard to predict how CalDAV clients will be using the server. Also, it makes it quite difficult to optimize and fit in a simple relational database or existing calendaring software. CalDAV should IMHO just have been a simple &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; system. Advanced features and reports could have been made optional, and should have been specialized for common usecases.&lt;/p&gt;

&lt;h3&gt;Incomplete view of Web/CalDAV dependencies&lt;/h3&gt;

&lt;p&gt;&lt;img src="http://www.rooftopsolutions.nl/resources/images/posts/webdavrfc.png" alt="DAV dependencies" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;This was a graph I used in an earlier post. There's actually a few more specs that are relevant to the implementor.&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;GroupDAV&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://www.groupdav.org/"&gt;GroupDAV&lt;/a&gt; deserves a mention here, as it attempts to address most of the issues I have. What it lacks is adoption from ICal, Sunbird and MS Outlook. The only issue I have is the frowned upon use of the PUT method (&lt;a href="http://www.groupdav.org/draft-hess-groupdav-01.txt"&gt;spec&lt;/a&gt;), where POST really should have been used.&lt;/p&gt;

&lt;h3&gt;Some examples&lt;/h3&gt;

&lt;p&gt;These will be highly uninteresting unless you have an intimate knowledge of the specs.&lt;/p&gt;

&lt;p&gt;New calendars/events/todo's are created using PUT. This means the client now determines the unique id given to any of these objects. Most people will want to integrate CalDAV with systems which already have a different primary key, these people will be required maintaining 2 different id's and ensure there are never any duplicates. The id generated by the client can be any url encoded string. Note that this wouldn't have to be a problem if some POST statement would have been used.&lt;/p&gt;

&lt;p&gt;CalDAV requires support for the expand-properties report from &lt;a href="http://tools.ietf.org/html/rfc3253#section-3.8"&gt;rfc 3253&lt;/a&gt;. In a nutshell the expand-properties report will look for WebDAV properties containing &amp;lt;DAV:href&amp;gt;url&amp;lt;DAV:/href&amp;gt;, follow these locally and add specified properties from these resources to the DOM. The benefit of this REPORT query is that less HTTP requests/roundtrips have to be made to make this work. The usecase for CalDAV specifically might be a lot simpler though, as it could mean something like 'get me the information of the user owning this calendar'. If it was instead simply required to add functionality that meets exactly that (and a few other usecases), it would be reasonably easy for me to write an optimized SQL query for those cases. Now I should support these lookup queries everywhere, because there's no good way to restrict how clients might use it.&lt;/p&gt;

&lt;p&gt;CalDAV also requires fully implementing the ACL spec. The main usecase for this is calendar sharing. While the ACL specification will give you infinite complexity in how to setup your access control, it's quite a bit of work to even send back all the appropriate information and error messaging if you're not actually interested in this feature. Making ACL an optional extension to CalDAV would have been easier for implementers IMHO.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/2wY4AZFNQ6g" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/250</feedburner:origLink></entry><entry><title type="text">SabreDAV 0.12</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/c3OIakeR3Tg/249" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-09-10T09:38:05-07:00</updated><id>http://www.rooftopsolutions.nl/article/249</id><content type="html">&lt;p&gt;I just released a new version of SabreDAV, 0.12. I've skipped on posting for the last few versions, because I didn't want to get too spammy on this blog.&lt;/p&gt;

&lt;p&gt;These were mostly bugfixes, and a few added features. SabreDAV is also a PEAR-package again, so installing is as simple as 'pear install SabreDAV-0.12.0.tgz'.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://code.google.com/p/sabredav/downloads/list"&gt;Download it here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Full list of changes&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Added: Experimental PDO backend for Locks Manager.&lt;/li&gt;
  &lt;li&gt;Fixed: Sending Content-Length: 0 for every empty response. This improves NGinx compatibility.&lt;/li&gt;
  &lt;li&gt;Fixed: Last modification time is reported in UTC timezone. This improves Finder compatibility.&lt;/li&gt;
  &lt;li&gt;Fixed: &lt;a href="http://code.google.com/p/sabredav/issues/detail?id=13"&gt;Issue 13&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Added: now a PEAR-compatible package again, thanks to Michael Gauthier.&lt;/li&gt;
  &lt;li&gt;Added: Plugin to automatically map GET requests to non-files to PROPFIND (Sabre_DAV_Browser_MapGetToPropFind). This should allow easier debugging of complicated WebDAV setups.&lt;/li&gt;
  &lt;li&gt;Added: Ability to choose to use auth-int, auth or both for HTTP Digest authentication. (&lt;a href="http://code.google.com/p/sabredav/issues/detail?id=11"&gt;Issue 11&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fixed: TemporaryFileFilter plugin now intercepts HTTP LOCK requests to non-existant files. (&lt;a href="http://code.google.com/p/sabredav/issues/detail?id=12"&gt;Issue 12&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Updated: Browser plugin now shows multiple {DAV:}resourcetype values if available.&lt;/li&gt;
  &lt;li&gt;Added: generatePropfindResponse now takes a baseUri argument.&lt;/li&gt;
  &lt;li&gt;Added: ResourceType property can now contain multiple resourcetypes.&lt;/li&gt;
  &lt;li&gt;Added: Sabre_DAV_Property_Href class. For future use.&lt;/li&gt;
  &lt;li&gt;Changed: Made more methods in Sabre_DAV_Server public.&lt;/li&gt;
  &lt;li&gt;Added: Central list of defined xml namespace prefixes. This can reduce Bandwidth and improve legibility for xml bodies with user-defined namespaces.&lt;/li&gt;
  &lt;li&gt;Changed: moved default copy and move logic from ObjectTree to Tree class.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/c3OIakeR3Tg" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/249</feedburner:origLink></entry><entry><title type="text">Converting ICalendar to XML</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/Ru0VdyxdZNQ/248" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-09-02T08:25:45-07:00</updated><id>http://www.rooftopsolutions.nl/article/248</id><content type="html">&lt;p&gt;I've started working on a &lt;a href="http://tools.ietf.org/html/rfc4791"&gt;CalDAV&lt;/a&gt; implementation, which also requires analysis of &lt;a href="http://tools.ietf.org/html/rfc2445"&gt;ICalendar (rfc 2554)&lt;/a&gt; objects.&lt;/p&gt;

&lt;p&gt;ICalendar objects have properties, components (such as VEVENT, VTODO) and attributes. This is awfully familiar to XML. So instead of trying to come up with a complicated parser and object structure, I decided to just convert it to XML and use PHP's &lt;a href="http://nl3.php.net/manual/en/book.simplexml.php"&gt;simplexml&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is my current script:&lt;/p&gt;

&lt;code&gt;&lt;span style="color: #000000"&gt;
&lt;span style="color: #0000BB"&gt;&amp;lt;?php
&lt;br /&gt;
&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;iCalendarToXML&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$icalendarData&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;Detecting&amp;nbsp;line&amp;nbsp;endings
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strpos&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$icalendarData&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\r\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lb&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\r\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elseif&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strpos&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$icalendarData&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lb&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lb&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\r\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;Splitting&amp;nbsp;up&amp;nbsp;items&amp;nbsp;per&amp;nbsp;line
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lb&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$icalendarData&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;Properties&amp;nbsp;can&amp;nbsp;be&amp;nbsp;folded&amp;nbsp;over&amp;nbsp;2&amp;nbsp;lines.&amp;nbsp;In&amp;nbsp;this&amp;nbsp;case&amp;nbsp;the&amp;nbsp;second
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;line&amp;nbsp;will&amp;nbsp;be&amp;nbsp;preceeded&amp;nbsp;by&amp;nbsp;a&amp;nbsp;space&amp;nbsp;or&amp;nbsp;tab.
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;]==&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;"&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;||&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;]==&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\t"&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines2&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;count&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines2&lt;/span&gt;&lt;span style="color: #007700"&gt;)-&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;].=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;substr&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines2&lt;/span&gt;&lt;span style="color: #007700"&gt;[]=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;?xml&amp;nbsp;version="1.0"?&amp;gt;'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$spaces&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$lines2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$matches&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;This&amp;nbsp;matches&amp;nbsp;PROPERTYNAME;ATTRIBUTES:VALUE
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;preg_match&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/^([^:^;]*)(?:;([^:]*))?:(.*)$/'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$matches&lt;/span&gt;&lt;span style="color: #007700"&gt;))&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$propertyName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strtoupper&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$matches&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;]);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attributes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$matches&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;];
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$matches&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;3&lt;/span&gt;&lt;span style="color: #007700"&gt;];
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;If&amp;nbsp;the&amp;nbsp;line&amp;nbsp;was&amp;nbsp;in&amp;nbsp;the&amp;nbsp;format&amp;nbsp;BEGIN:COMPONENT&amp;nbsp;or&amp;nbsp;END:COMPONENT,&amp;nbsp;we&amp;nbsp;need&amp;nbsp;to&amp;nbsp;special&amp;nbsp;case&amp;nbsp;it.
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$propertyName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'BEGIN'&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_repeat&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$spaces&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strtoupper&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;gt;\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$spaces&lt;/span&gt;&lt;span style="color: #007700"&gt;+=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;elseif&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$propertyName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'END'&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$spaces&lt;/span&gt;&lt;span style="color: #007700"&gt;-=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_repeat&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$spaces&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;/'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strtoupper&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;gt;\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_repeat&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$spaces&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$propertyName&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attributes&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;There&amp;nbsp;can&amp;nbsp;be&amp;nbsp;multiple&amp;nbsp;attributes
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attributes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;';'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attributes&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attributes&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$att&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attName&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attValue&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'='&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$att&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;);
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;nbsp;'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'="'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;htmlspecialchars&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$attValue&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'"'&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;.=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;gt;'&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;htmlspecialchars&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$value&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&amp;lt;/'&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$propertyName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;gt;\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$xml&lt;/span&gt;&lt;span style="color: #007700"&gt;;
&lt;br /&gt;
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/code&gt;

&lt;p&gt;This will convert:&lt;/p&gt;

&lt;code&gt;&lt;span style="color: #000000"&gt;
BEGIN:VCALENDAR
&lt;br /&gt;VERSION:2.0
&lt;br /&gt;PRODID:-//Example&amp;nbsp;Corp.//CalDAV&amp;nbsp;Client//EN
&lt;br /&gt;BEGIN:VTIMEZONE
&lt;br /&gt;LAST-MODIFIED:20040110T032845Z
&lt;br /&gt;TZID:US/Eastern
&lt;br /&gt;BEGIN:DAYLIGHT
&lt;br /&gt;DTSTART:20000404T020000
&lt;br /&gt;RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
&lt;br /&gt;TZNAME:EDT
&lt;br /&gt;TZOFFSETFROM:-0500
&lt;br /&gt;TZOFFSETTO:-0400
&lt;br /&gt;END:DAYLIGHT
&lt;br /&gt;BEGIN:STANDARD
&lt;br /&gt;DTSTART:20001026T020000
&lt;br /&gt;RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
&lt;br /&gt;TZNAME:EST
&lt;br /&gt;TZOFFSETFROM:-0400
&lt;br /&gt;TZOFFSETTO:-0500
&lt;br /&gt;END:STANDARD
&lt;br /&gt;END:VTIMEZONE
&lt;br /&gt;BEGIN:VEVENT
&lt;br /&gt;DESCRIPTION:Hello&amp;nbsp;Im&amp;nbsp;evert
&lt;br /&gt;&amp;nbsp;Next&amp;nbsp;line&amp;nbsp;also
&lt;br /&gt;&amp;nbsp;&amp;nbsp;Blabla
&lt;br /&gt;ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
&lt;br /&gt;ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
&lt;br /&gt;DTSTAMP:20060206T001220Z
&lt;br /&gt;DTSTART;TZID=US/Eastern:20060104T100000
&lt;br /&gt;DURATION:PT1H
&lt;br /&gt;LAST-MODIFIED:20060206T001330Z
&lt;br /&gt;ORGANIZER:mailto:cyrus@example.com
&lt;br /&gt;SEQUENCE:1
&lt;br /&gt;STATUS:TENTATIVE
&lt;br /&gt;SUMMARY:Event&amp;nbsp;#3
&lt;br /&gt;UID:DC6C50A017428C5216A2F1CD@example.com
&lt;br /&gt;X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
&lt;br /&gt;END:VEVENT
&lt;br /&gt;END:VCALENDAR
&lt;br /&gt;&lt;/span&gt;
&lt;/code&gt;

To:

&lt;code&gt;&lt;span style="color: #000000"&gt;
&lt;span style="color: #0000BB"&gt;&amp;lt;?xml&amp;nbsp;version&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"1.0"&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;
&lt;br /&gt;&lt;/span&gt;&amp;lt;VCALENDAR&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;VERSION&amp;gt;2.0&amp;lt;/VERSION&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;PRODID&amp;gt;-//Example&amp;nbsp;Corp.//CalDAV&amp;nbsp;Client//EN&amp;lt;/PRODID&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;VTIMEZONE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;LAST-MODIFIED&amp;gt;20040110T032845Z&amp;lt;/LAST-MODIFIED&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZID&amp;gt;US/Eastern&amp;lt;/TZID&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DAYLIGHT&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DTSTART&amp;gt;20000404T020000&amp;lt;/DTSTART&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;RRULE&amp;gt;FREQ=YEARLY;BYDAY=1SU;BYMONTH=4&amp;lt;/RRULE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZNAME&amp;gt;EDT&amp;lt;/TZNAME&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZOFFSETFROM&amp;gt;-0500&amp;lt;/TZOFFSETFROM&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZOFFSETTO&amp;gt;-0400&amp;lt;/TZOFFSETTO&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/DAYLIGHT&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;STANDARD&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DTSTART&amp;gt;20001026T020000&amp;lt;/DTSTART&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;RRULE&amp;gt;FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10&amp;lt;/RRULE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZNAME&amp;gt;EST&amp;lt;/TZNAME&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZOFFSETFROM&amp;gt;-0400&amp;lt;/TZOFFSETFROM&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TZOFFSETTO&amp;gt;-0500&amp;lt;/TZOFFSETTO&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/STANDARD&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/VTIMEZONE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;VEVENT&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DESCRIPTION&amp;gt;Hello&amp;nbsp;Im&amp;nbsp;evertNext&amp;nbsp;line&amp;nbsp;also&amp;nbsp;Blabla&amp;lt;/DESCRIPTION&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ATTENDEE&amp;nbsp;PARTSTAT="ACCEPTED"&amp;nbsp;ROLE="CHAIR"&amp;gt;mailto:cyrus@example.com&amp;lt;/ATTENDEE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ATTENDEE&amp;nbsp;PARTSTAT="NEEDS-ACTION"&amp;gt;mailto:lisa@example.com&amp;lt;/ATTENDEE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DTSTAMP&amp;gt;20060206T001220Z&amp;lt;/DTSTAMP&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DTSTART&amp;nbsp;TZID="US/Eastern"&amp;gt;20060104T100000&amp;lt;/DTSTART&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DURATION&amp;gt;PT1H&amp;lt;/DURATION&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;LAST-MODIFIED&amp;gt;20060206T001330Z&amp;lt;/LAST-MODIFIED&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ORGANIZER&amp;gt;mailto:cyrus@example.com&amp;lt;/ORGANIZER&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SEQUENCE&amp;gt;1&amp;lt;/SEQUENCE&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;STATUS&amp;gt;TENTATIVE&amp;lt;/STATUS&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SUMMARY&amp;gt;Event&amp;nbsp;#3&amp;lt;/SUMMARY&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;UID&amp;gt;DC6C50A017428C5216A2F1CD@example.com&amp;lt;/UID&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;X-ABC-GUID&amp;gt;E1CX5Dr-0007ym-Hz@example.com&amp;lt;/X-ABC-GUID&amp;gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/VEVENT&amp;gt;
&lt;br /&gt;&amp;lt;/VCALENDAR&amp;gt;
&lt;br /&gt;&lt;/span&gt;
&lt;/code&gt;

&lt;p&gt;I hope this is useful to anyone else.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/Ru0VdyxdZNQ" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/248</feedburner:origLink></entry><entry><title type="text">SabreDAV 0.9</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/P8t4R6lLDPo/246" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-07-20T22:02:22-07:00</updated><id>http://www.rooftopsolutions.nl/article/246</id><content type="html">&lt;p&gt;Just released the 0.9 version of SabreDAV.&lt;/p&gt;

&lt;p&gt;This release mainly contains bugfixes and some API changes that will facilitate future extensions, such as ACL and CalDAV.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/sabredav/downloads/list"&gt;download&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/sabredav/wiki/Migrating0_8to0_9"&gt;Migrating from 0.8 to 0.9&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/sabredav/source/browse/trunk/ChangeLog"&gt;Full Changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although these changes might not be relevant to most people, upgrading is recommended in order to keep a solid upgrade path. Fortunately for most people the API breaks are minimal.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/P8t4R6lLDPo" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/246</feedburner:origLink></entry><entry><title type="text">Flash ExternalInterface - Debug checklist</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/bijsterespoor/~3/GP169bkJJFk/245" /><author><name>Evert Pot</name><email>evert@rooftopsolutions.nl</email></author><updated>2009-07-10T12:24:00-07:00</updated><id>http://www.rooftopsolutions.nl/article/245</id><content type="html">&lt;p&gt;Flash' &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html"&gt;ExternalInterface&lt;/a&gt; api allows you to communicate between Javascript and Actionscript. A very useful tool, and we've used it quite a few times. Often times it just doesn't work though, and it can be difficult to get to the root of the issue. This is a list of things you should be looking out for if ExternalInterface does not work for you:&lt;/p&gt;

&lt;h3&gt;Give your &amp;lt;object&amp;gt; tag an id&lt;/h3&gt;

&lt;p&gt;In order to call your flash application, your &amp;lt;object&amp;gt; tag needs to have an id attribute. Make sure this attribute is unique.&lt;/p&gt;

&lt;h3&gt;The id cannot collide with items in the document object&lt;/h3&gt;

&lt;p&gt;Internet Explorer will add any element with an id to the document object. So if you were to, say, give your object the name 'window', 'getElementById' or anything to that respect EI will not work.&lt;/p&gt;

&lt;h3&gt;The object cannot be embedded in a &amp;lt;form&amp;gt; tag&lt;/h3&gt;

&lt;p&gt;EI will not work in IE if the object sits in a &amp;lt;form&amp;gt;-tag. For some reasons IE will treat any element within a form slightly different.&lt;/p&gt;

&lt;h3&gt;Don't use 'play' or 'stop' for method names&lt;/h3&gt;

&lt;p&gt;Another IE issue. play and stop are somehow reserved for IE. This only applies to actionscript functions you're calling from javascript.&lt;/p&gt;

&lt;h3&gt;Check your domain names&lt;/h3&gt;

&lt;p&gt;If your swf is loaded from a different domain as your html document, you need to make sure you add this domain through &lt;a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain%28%29"&gt;flash.system.Security.allowDomain&lt;/a&gt;. In our case it was fine to just add Security.allowDomain('*').&lt;/p&gt;

&lt;h3&gt;If all else fails, know how to debug.&lt;/h3&gt;

&lt;p&gt;Much like with XMLHTTPRequest, errors will not show up in &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; by default, but you can trace everything if you check everything in the Console-tab-submenu. This will also allow you to see some of the automatically generated javascript Flash produces.&lt;/p&gt;

&lt;p&gt;Most of the above issues are in IE, but thankfully Microsoft's &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2f465be0-94fd-4569-b3c4-dffdf19ccd99&amp;displaylang=en"&gt;script debugger&lt;/a&gt; will actually catch these (rather cryptic) errors, which might help you find your problem.&lt;/p&gt;

&lt;p&gt;We've run into every single one of these issues, if you have any others like this, please comment :). I figured it would be helpful to have one single source of documentation.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/bijsterespoor/~4/GP169bkJJFk" height="1" width="1"/&gt;</content><feedburner:origLink>http://www.rooftopsolutions.nl/article/245</feedburner:origLink></entry></feed>
