void AlarmDialog::save( const KCalCore::Alarm::Ptr &alarm ) const
{
  // Offsets
  int offset = mUi->mAlarmOffset->value() * 60; // minutes
  int offsetunit = mUi->mOffsetUnit->currentIndex();
  if ( offsetunit >= 1 ) {
    offset *= 60; // hours
  }
  if ( offsetunit >= 2 ) {
    offset *= 24; // days
  }
  if ( offsetunit >= 3 ) {
    offset *= 7; // weeks
  }

  const int beforeafterpos = mUi->mBeforeAfter->currentIndex();
  if ( beforeafterpos % 2 == 0 ) { // before -> negative
    offset = -offset;
  }

  // Note: if this triggers, fix the logic at the place causing it. It really makes
  // no sense to have both disabled.
  Q_ASSERT( mAllowBeginReminders || mAllowEndReminders );

  // TODO: Add possibility to specify a given time for the reminder
  if ( mAllowBeginReminders && beforeafterpos == 0 ) { // before start
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  } else if ( mAllowBeginReminders && beforeafterpos == 1 ) { // after start
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  }

  // We assume that if mAllowBeginReminders is not set, that mAllowBeginReminders
  // is set.
  if ( !mAllowBeginReminders && beforeafterpos == 0 ) { // before end
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  } else if ( !mAllowBeginReminders && beforeafterpos == 1 ) { // after end
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  } else if ( beforeafterpos == 2 ) { // before end
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  } else if ( beforeafterpos == 3 ) { // after end
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  }

  if ( beforeafterpos / 2 == 0 ) { // start offset
    alarm->setStartOffset( KCalCore::Duration( offset ) );
  } else {
    alarm->setEndOffset( KCalCore::Duration( offset ) );
  }

  // Repeating
  if ( mUi->mRepeats->isChecked() ) {
    alarm->setRepeatCount( mUi->mRepeatCount->value() );
    alarm->setSnoozeTime( mUi->mRepeatInterval->value() * 60 ); // convert back to seconds
  } else {
    alarm->setRepeatCount( 0 );
  }

  if ( mUi->mTypeCombo->currentIndex() == 1 ) { // Audio
    alarm->setAudioAlarm( mUi->mSoundFile->url().toLocalFile() );
  } else if ( mUi->mTypeCombo->currentIndex() == 2 ) { // Application / script
    alarm->setProcedureAlarm( mUi->mApplication->url().toLocalFile(),
                              mUi->mAppArguments->text() );
  } else if ( mUi->mTypeCombo->currentIndex() == 3 ) { // Email
    QStringList addresses = KPIMUtils::splitAddressList( mUi->mEmailAddress->text() );
    KCalCore::Person::List add;
    for ( QStringList::Iterator it = addresses.begin(); it != addresses.end(); ++it ) {
      add << KCalCore::Person::fromFullName( *it );
    }
    // TODO: Add a subject line and possibilities for attachments
    alarm->setEmailAlarm( QString(), mUi->mEmailText->toPlainText(), add );
  } else { // Display
    alarm->setDisplayAlarm( mUi->mDisplayText->toPlainText() );
  }
}