Tutkin taas vähän lisää iCalia, Lightningia ja myös Zimbraa, joka on mielenkiintoinen Exchangen korvikkeeksi tarkoitettu open source -kokonaisjärjestelmä. Olen yrittänyt löytää jotain taikakeinoa integroida nämä kaikki toistensa ja iPhonen kalenterin kanssa. Mieluiten vielä Google Calendarinkin kanssa.

Perusongelma nykyisessä kalenterien jaossa on se, että iCalendar-kalentereita voi kyllä julkaista ja tilata (publish & subscribe) kaikkien järjestelmien välillä, mutta synkronointi ei onnistu. Googlella on mainio Private Address -mekanismi, jonka ansiosta oma kalenteri on helppo tilata mihin tahansa muuhun järjestelmään (ja jopa synkronoida iPhoneen), mutta silloin kalenterimerkinnät on pakko tehdä Googlen kautta. Ei voi hyväksyä.

Yleispätevä ratkaisu edellyttää siis yhä keskitettyä kalenteria CalDAV-palvelimella. Tätä viimeksi kokeillessani tuli ongelmaksi, että iPhone ei suostunut synkronoimaan puhelimessa tehtyjä merkintöjä takaisin CalDAV-kalenteriin. Keksin tähän eräänlaisen ratkaisun: iPhone-merkinnät voi synkronoida ensin paikalliseen kalenteriin, ja sitten siirtää ne AppleScriptillä verkossa olevaan CalDAV-kalenteriin:

set sourceCalName to "iPhone"
set destCalName to "Private"
tell application "iCal"
    set i to 0
    set sourceCal to (first calendar whose name is sourceCalName)
    set destCal to (first calendar whose name is destCalName)
    repeat while (number of events of sourceCal > 0) and (i < 10)
        set oldEvent to first event of sourceCal
        set oldProp to properties of oldEvent
        if url of oldProp is equal to missing value then set url of oldProp to ""
        set newEvent to make event at end of events of destCal with properties {description:description of oldProp, start date:start date of oldProp, end date:end date of oldProp, recurrence:recurrence of oldProp, excluded dates:excluded dates of oldProp, status:status of oldProp, summary:summary of oldProp, location:location of oldProp, url:url of oldProp}
        set allday event of newEvent to allday event of oldProp
        repeat with oldAlarm in (every display alarm of oldEvent)
            set newAlarm to make display alarm at end of display alarms of newEvent
            if trigger interval of oldAlarm is not equal to missing value then
                set trigger interval of newAlarm to trigger interval of oldAlarm
            else
                set trigger date of newAlarm to trigger date of oldAlarm
            end if
        end repeat
        delete oldEvent
        set i to i + 1
    end repeat
end tell

Nyt ollaan siis jo pitkällä. Harmi kyllä, iPhone asettaa vielä toisen rajoituksen: CalDAV-palvelimelta synkronoituja kalenterimerkintöjä ei voi muokata puhelimessa. Uusia voi tehdä, mutta vanhat ovat read-only. Tähän en vielä keksinyt parannuskeinoa. Periaatteessa merkinnät voisi siirtää AppleScriptillä aina ensin paikalliseen kalenteriin synkronoinnin ajaksi ja sitten takaisin CalDAV-kalenteriin, mutta tämä olisi hankalaa käytännössä ja hajoaisi varmaan käsiin.

Tuli muuten samalla kokeiltua, että Outlook 2007:lla saa vihdoinkin tallennettua Exchange-kalenterinsa nätisti iCalendar-muotoisiksi tiedostoiksi. Ne on helppo siirtää muihin, avoimempiin kalenterijärjestelmiin. Itse olen ottanut tavaksi arkistoida vanhat kalenterit vuosi kerrallaan tiedostoiksi, ja pitää varsinaisessa kalenterijärjestelmässä vain kuluvaa vuotta esillä.