Ctrl K
ComunidadGuías…

tine20/Calendar/Config.php

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
<?php
/**
 * @package     Calendar
 * @subpackage  Config
 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
 * @author      Cornelius Weiss <c.weiss@metaways.de>
 * @copyright   Copyright (c) 2011-2022 Metaways Infosystems GmbH (http://www.metaways.de)
 */

/**
 * calendar config class
 * 
 * @package     Calendar
 * @subpackage  Config
 */
class Calendar_Config extends Tinebase_Config_Abstract
{
    const APP_NAME = 'Calendar';

    /**
     * Fixed Calendars
     * 
     * @var string
     */
    const FIXED_CALENDARS = 'fixedCalendars';

    /**
     * ALLOW_GENERIC_CALDAV_CLIENT
     *
     * Enables all CalDAV clients.
     * Note: Use at your own risk. Non-official clients are not supported.
     */
    const ALLOW_GENERIC_CALDAV_CLIENT = 'allowGenericCalDAVClient';

    /**
     * Event Status Available
     *
     * @var string
     */
    const EVENT_STATUS = 'eventStatus';

    /**
     * Event Transparencies Available
     *
     * @var string
     */
    const EVENT_TRANSPARENCIES = 'eventTransparencies';

    /**
     * Event Classes Available
     *
     * @var string
     */
    const EVENT_CLASSES = 'eventClasses';

    /**
     * Attendee Status Available
     * 
     * @var string
     */
    const ATTENDEE_STATUS = 'attendeeStatus';
    
    /**
     * Attendee Roles Available
     * 
     * @var string
     */
    const ATTENDEE_ROLES = 'attendeeRoles';

    /**
     * Resource Types Available
     *
     * @var string
     */
    const RESOURCE_TYPES = 'resourceTypes';

    /**
     * FreeBusy Types Available
     *
     * @var string
     */
    const FREEBUSY_TYPES = 'freebusyTypes';

    /**
     * which information does the grant freebusy reveal
     *
     * @var string
     */
    const FREEBUSY_INFO_ALLOWED = 'freebusyInfoAllowed';

    /**
     * Crop days view
     *
     * @var string
     */
    const CROP_DAYS_VIEW = 'daysviewcroptime';

    /**
     * Days view mouse wheel increment
     *
     * @var integer
     */
    const DAYS_VIEW_MOUSE_WHEEL_INCREMENT = 'daysviewwheelincrement';
    
    /**
     * Allow events outside the definition created by the edit dialog
     * 
     * @var string
     */
    const CROP_DAYS_VIEW_ALLOW_ALL_EVENTS = 'daysviewallowallevents';

    /**
     * MAX_FILTER_PERIOD_CALDAV
     * 
     * @var string
     */
    const MAX_FILTER_PERIOD_CALDAV = 'maxfilterperiodcaldav';

    /**
     * MAX_FILTER_PERIOD_CALDAV_SYNCTOKEN
     *
     * @var string
     */
    const MAX_FILTER_PERIOD_CALDAV_SYNCTOKEN = 'maxfilterperiodcaldavsynctoken';

    /**
     * MAX_NOTIFICATION_PERIOD_FROM
     * 
     * @var string
     */
    const MAX_NOTIFICATION_PERIOD_FROM = 'maxnotificationperiodfrom';
    
    /**
     * MAX_JSON_DEFAULT_FILTER_PERIOD_FROM
     * 
     * @var string
     */
    const MAX_JSON_DEFAULT_FILTER_PERIOD_FROM = 'maxjsondefaultfilterperiodfrom';
    
    /**
     * MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL
     * 
     * @var string
     */
    const MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL = 'maxjsondefaultfilterperioduntil';
    
    /**
     * DISABLE_EXTERNAL_IMIP
     *
     * @var string
     */
    const DISABLE_EXTERNAL_IMIP = 'disableExternalImip';

    /**
     * DISABLE_EXTERNAL_IMIP_NOTIFICATION
     *
     * @var string
     */
    const DISABLE_EXTERNAL_NOTIFICATIONS = 'disableExternalNotifications';
    
    /**
     * SKIP_DOUBLE_EVENTS
     *
     * @var string
     */
    const SKIP_DOUBLE_EVENTS = 'skipdoubleevents';

    /**
     * FEATURE_SPLIT_VIEW
     *
     * @var string
     */
    const FEATURE_SPLIT_VIEW = 'featureSplitView';

    /**
     * FEATURE_YEAR_VIEW
     *
     * @var string
     */
    const FEATURE_YEAR_VIEW = 'featureYearView';

    /**
     * FEATURE_EXTENDED_EVENT_CONTEXT_ACTIONS
     *
     * @var string
     */
    const FEATURE_EXTENDED_EVENT_CONTEXT_ACTIONS = 'featureExtendedEventContextActions';

    /**
     * FEATURE_COLOR_BY
     *
     * @var string
     */
    const FEATURE_COLOR_BY = 'featureColorBy';

    /**
     * FEATURE_POLLS
     *
     * @var string
     */
    const FEATURE_POLLS = 'featurePolls';

    /**
     * FEATURE_EVENT_TYPE
     *
     * @var string
     */
    const FEATURE_EVENT_TYPE = 'featureEventType';

    /**
     * EVENT_VIEW
     *
     * @var string
     */
    const EVENT_VIEW = 'eventView';
    
    /**
     * FEATURE_RECUR_EXCEPT
     *
     * @var string
     */
    const FEATURE_RECUR_EXCEPT = 'featureRecurExcept';

    /**
     * @var string
     */
    const FEATURE_EVENT_NOTIFICATION_CONFIRMATION = 'featureEventNotificationConfirmation';

    const FEATURE_CLOUD_CALENDAR_SYNC = 'featureCloudCalendarSync';

    /**
     * @var string
     */
    const ORGANIZER_IMPLICIT_EDIT_GRANT = 'organizerImplicitEditGrant';

    /**
     * @var string
     */
    const TENTATIVE_NOTIFICATIONS = 'tentativeNotifications';

    /**
     * @var string
     */
    const TENTATIVE_NOTIFICATIONS_ENABLED = 'enabled';

    /**
     * @var string
     */
    const TENTATIVE_NOTIFICATIONS_DAYS = 'days';

    /**
     * @var string
     */
    const TENTATIVE_NOTIFICATIONS_FILTER = 'filter';

    const ASSIGN_ORGANIZER_MEETING_STATUS_ON_EDIT_GRANT = 'assignOrgMeetingStatusOnEditGrant';

    /**
     * @var string
     */
    const POLL_MUTE_ALTERNATIVES_NOTIFICATIONS = 'pollMuteAlternativesNotifications';

    /**
     * @var string
     */
    const POLL_GTC = 'pollGTC';

    const SEARCH_ATTENDERS_FILTER = 'searchAttendersFilter';
    const SEARCH_ATTENDERS_FILTER_USER = 'user';
    const SEARCH_ATTENDERS_FILTER_GROUP = 'group';
    const SEARCH_ATTENDERS_FILTER_RESOURCE = 'resource';

    const FREEBUSY_INFO_ALLOW_DATETIME = 10;
    const FREEBUSY_INFO_ALLOW_ORGANIZER = 20;
    const FREEBUSY_INFO_ALLOW_RESOURCE_ATTENDEE = 30;
    const FREEBUSY_INFO_ALLOW_CALENDAR = 40;
    const FREEBUSY_INFO_ALLOW_CLASS = 45;
    const FREEBUSY_INFO_ALLOW_ALL_ATTENDEE = 50;

    const FLOORPLANS = 'floorplans';

    /**
     * (non-PHPdoc)
     * @see tine20/Tinebase/Config/Definition::$_properties
     */
    protected static $_properties = array(
        self::FIXED_CALENDARS => array(
            //_('Fixed Calendars')
            'label'                 => 'Fixed Calendars',
            //_('Calendars always selected regardless of all filter parameters. A valid use case could be to force the display of an certain holiday calendar.')
            'description'           => 'Calendars always selected regardless of all filter parameters. A valid use case could be to force the display of an certain holiday calendar.',
            'type'                  => 'array',
            'contents'              => 'string', // in fact this are ids of Tinebase_Model_Container of app Calendar and we might what to have te ui to autocreate pickers panel here? x-type? -> later
            'clientRegistryInclude' => TRUE
        ),
        self::ALLOW_GENERIC_CALDAV_CLIENT => array(
            //_('Allow generic CalDAV clients')
            'label'                 => 'Allow generic CalDAV clients',
            //_('Enables all CalDAV clients. Note: Use at your own risk. Non-official clients are not supported.')
            'description'           => 'Enables all CalDAV clients. Note: Use at your own risk. Non-official clients are not supported.',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => false,
            'setByAdminModule'      => true,
            'setBySetupModule'      => false,
            'default'               => false

        ),
        self::CROP_DAYS_VIEW => array(
                                   //_('Crop Days')
            'label'                 => 'Crop Days',
                                   //_('Crop the calendar view to the configured start and end time.')
            'description'           => 'Crop the calendar view to the configured start and end time.',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => true,
            'setByAdminModule'      => false,
            'setBySetupModule'      => false,
            'default'               => false
        
        ),
        self::CROP_DAYS_VIEW_ALLOW_ALL_EVENTS => array(
                                   //_('Crop Days Limit Override')
            'label'                 => 'Crop Days Limit Override',
                                   //_('Allow events outside the defined start and end times.')
            'description'           => 'Allow events outside the defined start and end times.',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => true,
            'setByAdminModule'      => false,
            'setBySetupModule'      => false,
            'default'               => false
        
        ),
        self::DAYS_VIEW_MOUSE_WHEEL_INCREMENT => array(
                                    //_('Week View Mouse Wheel Increment')
            'label'                 => 'Week View Mouse Wheel Increment',
            //_('Crop the calendar view to the configured start and end time.')
            'description'           => 'Number of pixels to scroll per mouse wheel',
            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
            'clientRegistryInclude' => true,
            'setByAdminModule'      => false,
            'setBySetupModule'      => false,
            'default'               => 50

        ),
        self::EVENT_VIEW => array(
            //_('Default View for the Events')
            'label'                 => 'Default View for the Events',
            //_('Default View for the Events')
            'description'           => 'Default View for the Events ("organizer" or "attendee")',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD,
            'options'               => array(
                'records' => array(
                    array('id' => 'attendee',  'value' => 'Attendee'), //_('Attendee')
                    array('id' => 'organizer', 'value' => 'Organizer'), //_('Organizer')
                ),
            ),
            'clientRegistryInclude' => true,
            'setByAdminModule'      => TRUE,
            'setBySetupModule'      => FALSE,
            'default'               => 'attendee',
        ),
        self::EVENT_STATUS => [
            //_('Available Event Statuses')
            'label'                 => 'Available Event Statuses',
            //_('Available Event Statuses. Please note that additional event statuses may impact other calendar systems during export or synchronization.')
            'description'           => 'Available Event Statuses. Please note that additional event statuses may impact other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'clientRegistryInclude' => true,
            'setByAdminModule'      => false,
            'default'               => [
                'records' => [
                    ['id' => 'CONFIRMED',    'value' => 'Confirmed',   'icon' => 'images/icon-set/icon_ok.svg',                          'system' => true], //_('Confirmed')
                    ['id' => 'TENTATIVE',    'value' => 'Tentative',   'icon' => 'images/icon-set/icon_calendar_attendee_tentative.svg', 'system' => true], //_('Tentative')
                    ['id' => 'CANCELLED',    'value' => 'Canceled',    'icon' => 'images/icon-set/icon_calendar_attendee_cancle.svg',    'system' => true], //_('Canceled')
                ],
                'default' => 'CONFIRMED'
            ]
        ],
        self::EVENT_CLASSES => [
            //_('Available Event Classes')
            'label'                 => 'Available Event Classes',
            //_('Available Event Classes. Please note that additional event classes may impact other calendar systems during export or synchronization.')
            'description'           => 'Available Event Classes. Please note that additional event classes may impact other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'clientRegistryInclude' => true,
            'setByAdminModule'      => false,
            'default'               => [
                'records' => [
                    ['id' => 'PUBLIC',       'value' => 'Public',       'system' => true], //_('Public')
                    ['id' => 'PRIVATE',      'value' => 'Private',      'system' => true], //_('Private')
//                    ['id' => 'CONFIDENTIAL', 'value' => 'Confidential', 'system' => true], //_('Confidential')
                ],
                'default' => 'PUBLIC'
            ]
        ],
        self::EVENT_TRANSPARENCIES => [
            //_('Available Event Transparencies')
            'label'                 => 'Available Event Transparencies',
            //_('Available Event Transparencies. Please note that additional event transparencies may impact other calendar systems during export or synchronization.')
            'description'           => 'Available Event Transparencies. Please note that additional event transparencies may impact other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'clientRegistryInclude' => true,
            'setByAdminModule'      => false,
            'default'               => [
                'records' => [
                    ['id' => 'TRANSPARENT', 'value' => 'Transparent', 'system' => true], //_('Transparent')
                    ['id' => 'OPAQUE',      'value' => 'Opaque',      'system' => true], //_('Opaque')
                ],
                'default' => 'OPAQUE'
            ]
        ],
        self::ATTENDEE_STATUS => array(
                                   //_('Available Attendee Statuses')
            'label'                 => 'Available Attendee Statuses',
                                   //_('Available Event Attendee Statuses. Please note that additional attendee statuses may impact other calendar systems during export or synchronization.')
            'description'           => 'Available Event Attendee Statuses. Please note that additional attendee statuses may impact other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'options'               => array('recordModel' => 'Calendar_Model_AttendeeStatus'),
            'clientRegistryInclude' => TRUE,
            'setByAdminModule'      => TRUE,
            'default'               => array(
                'records' => array(
                    array('id' => 'NEEDS-ACTION', 'value' => 'No response', 'icon' => 'images/icon-set/icon_invite.svg',                      'system' => true), //_('No response')
                    array('id' => 'ACCEPTED',     'value' => 'Accepted',    'icon' => 'images/icon-set/icon_calendar_attendee_accepted.svg',                          'system' => true), //_('Accepted')
                    array('id' => 'DECLINED',     'value' => 'Declined',    'icon' => 'images/icon-set/icon_calendar_attendee_cancle.svg',    'system' => true), //_('Declined')
                    array('id' => 'TENTATIVE',    'value' => 'Tentative',   'icon' => 'images/icon-set/icon_calendar_attendee_tentative.svg', 'system' => true), //_('Tentative')
                ),
                'default' => 'NEEDS-ACTION'
            )
        ),
        self::ATTENDEE_ROLES => array(
                                   //_('Available Attendee Roles')
            'label'                 => 'Available Attendee Roles',
                                   //_('Available Event Attendee Roles. Please note that additional attendee roles may impact other calendar systems during export or synchronization.')
            'description'           => 'Available Event Attendee Roles. Please note that additional attendee roles may impact other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'options'               => array('recordModel' => Calendar_Model_AttendeeRole::class),
            'clientRegistryInclude' => TRUE,
            'setByAdminModule'      => TRUE,
            'default'               => array(
                'records' => array(
                    array('id' => 'REQ', 'value' => 'Required', 'system' => true, 'order' => 0, 'color' => '#FF0000'), //_('Required')
                    array('id' => 'OPT', 'value' => 'Optional', 'system' => true, 'order' => 1, 'color' => '#0000FF'), //_('Optional')
                ),
                'default' => 'REQ'
            )
        ),
        self::ORGANIZER_IMPLICIT_EDIT_GRANT => [
            //_('Organizer has implicit edit grant')
            'label'                 => 'Organizer has implicit edit grant',
            'description'           => 'Organizer has implicit edit grant',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => false,
            'setByAdminModule'      => false,
            'setBySetupModule'      => true,
            'default'               => true,
        ],
        self::RESOURCE_TYPES => array(
            //_('Available Resource Types')
            'label'                 => 'Available Resource Types',
            //_('Available Resource Types. Please note that adding custom resource types may affect compatibility with other calendar systems during export or synchronization.')
            'description'           => 'Available Resource Types. Please note that adding custom resource types may affect compatibility with other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'options'               => array('recordModel' => Calendar_Model_ResourceType::class),
            'clientRegistryInclude' => TRUE,
            'setByAdminModule'      => TRUE,
            'default'               => array(
                'records' => array(
                    array('id' => 'RESOURCE', 'is_location' => 0, 'value' => 'Resource', 'icon' => 'images/icon-set/icon_resource.svg', 'system' => true), //_('Resource') @todo default resource icon!
                    array('id' => 'ROOM', 'is_location' => 1, 'value' => 'Room', 'icon' => 'images/icon-set/icon_resource_room1.svg', 'system' => true), //_('Room')
                    array('id' => 'BOARD', 'is_location' => 0, 'value' => 'Board', 'icon' => 'images/icon-set/icon_resource_board.svg', 'system' => true), //_('Board')
                    array('id' => 'CABLE', 'is_location' => 0, 'value' => 'Cable', 'icon' => 'images/icon-set/icon_resource_cable.svg', 'system' => true), //_('Cable')
                    array('id' => 'CAR', 'is_location' => 1, 'value' => 'Car', 'icon' => 'images/icon-set/icon_resource_car.svg', 'system' => true), //_('Car')
                    array('id' => 'COFFEE', 'is_location' => 0, 'value' => 'Coffee', 'icon' => 'images/icon-set/icon_resource_coffee.svg', 'system' => true), //_('Coffee')
                    array('id' => 'HOMEOFFICE', 'is_location' => 1, 'value' => 'Homeoffice', 'icon' => 'images/icon-set/icon_resource_homeoffice.svg', 'system' => true), //_('Homeoffice')
                    array('id' => 'LAMP', 'is_location' => 0, 'value' => 'Lamp', 'icon' => 'images/icon-set/icon_resource_lamp.svg', 'system' => true), //_('Lamp')
                    array('id' => 'LAPTOP', 'is_location' => 0, 'value' => 'Laptop', 'icon' => 'images/icon-set/icon_resource_laptop.svg', 'system' => true), //_('Laptop')
                    array('id' => 'MATERIAL', 'is_location' => 0, 'value' => 'Material', 'icon' => 'images/icon-set/icon_resource_material.svg', 'system' => true), //_('Material')
                    array('id' => 'PROJECTOR', 'is_location' => 0, 'value' => 'Projector', 'icon' => 'images/icon-set/icon_resource_projector.svg', 'system' => true), //_('Projector')
                    array('id' => 'TRAVEL', 'is_location' => 1, 'value' => 'Travel', 'icon' => 'images/icon-set/icon_resource_trolly.svg', 'system' => true), //_('Travel')
                    array('id' => 'TRAILER' , 'is_location' => 1, 'value' => 'Trailer', 'icon' => 'images/icon-set/icon_car-trailer.svg', 'system' => true), //_('Trailer')
                ),
                'default' => 'RESOURCE'
            )
        ),
        self::FREEBUSY_TYPES => array(
            //_('Available Free/Busy Types')
            'label'                 => 'Available Free/Busy Types',
            //_('Available Free/Busy Types. Please note that adding custom types may affect compatibility with other calendar systems during export or synchronization.')
            'description'           => 'Available Free/Busy Types. Please note that adding custom types may affect compatibility with other calendar systems during export or synchronization.',
            'type'                  => Tinebase_Config_Abstract::TYPE_KEYFIELD_CONFIG,
            'clientRegistryInclude' => TRUE,
            'setByAdminModule'      => TRUE,
            'default'               => array(
                'records' => array(
                    array('id' => Calendar_Model_FreeBusy::FREEBUSY_FREE, 'value' => 'Free', 'system' => true), //_('Free')
                    array('id' => Calendar_Model_FreeBusy::FREEBUSY_BUSY, 'value' => 'Busy', 'system' => true), //_('Busy')
                    array('id' => Calendar_Model_FreeBusy::FREEBUSY_BUSY_TENTATIVE, 'value' => 'Tentative', 'system' => true), //_('Tentative')
                    array('id' => Calendar_Model_FreeBusy::FREEBUSY_BUSY_UNAVAILABLE, 'value' => 'Unavailable', 'system' => true), //_('Unavailable')
                ),
                'default' => Calendar_Model_FreeBusy::FREEBUSY_BUSY
            )
        ),
        self::MAX_FILTER_PERIOD_CALDAV => array(
        //_('Filter timeslot for CalDAV events')
            'label'                 => 'Filter timeslot for events',
        //_('How many months in the past the events should be synchronized.')
            'description'           => 'How many months in the past the events should be synchronized.',
            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
            'clientRegistryInclude' => FALSE,
            'setByAdminModule'      => FALSE,
            'setBySetupModule'      => TRUE,
            'default'               => 2,
        ),
        self::MAX_FILTER_PERIOD_CALDAV_SYNCTOKEN => array(
            //_('Filter timeslot for CalDAV events with SyncToken')
            'label'                 => 'Filter timeslot for CalDAV events with SyncToken',
            //_('How many months in the past the events should be synchronized.')
            'description'           => 'How many months in the past the events should be synchronized.',
            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
            'clientRegistryInclude' => FALSE,
            'setByAdminModule'      => FALSE,
            'setBySetupModule'      => TRUE,
            'default'               => 100,
        ),
        self::MAX_NOTIFICATION_PERIOD_FROM => array(
        //_('Timeslot for the Event Notifications')
            'label'                 => 'Timeslot for the Event Notifications',
        //_('How many weeks in the past event notifications should be sent.')
            'description'           => 'How many weeks in the past event notifications should be sent.',
            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
            'clientRegistryInclude' => FALSE,
            'setByAdminModule'      => FALSE,
            'setBySetupModule'      => TRUE,
            'default'               => 1, // 1 week is default
        ),
        self::MAX_JSON_DEFAULT_FILTER_PERIOD_FROM => array(
        //_('Default filter start date for the events fetched via JSON API')
            'label'                 => 'Default filter start date for the events fetched via JSON API',
        //_('How many months in the past the events should be fetched.')
            'description'           => 'How many months in the past the events should be fetched.',
            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
            'clientRegistryInclude' => FALSE,
            'setByAdminModule'      => FALSE,
            'setBySetupModule'      => TRUE,
            'default'               => 0,
        ),
        self::MAX_JSON_DEFAULT_FILTER_PERIOD_UNTIL => array(
        //_('Default filter end date for the events fetched via JSON API')
            'label'                 => 'Default filter end date for the events fetched via JSON API',
        //_('For how many months in the future the events should be fetched.')
            'description'           => 'For how many months in the future the events should be fetched.',
            'type'                  => Tinebase_Config_Abstract::TYPE_INT,
            'clientRegistryInclude' => FALSE,
            'setByAdminModule'      => FALSE,
            'setBySetupModule'      => TRUE,
            'default'               => 1,
        ),
        self::DISABLE_EXTERNAL_IMIP => array(
        //_('Disable iMIP for external organizers')
            'label'                 => 'Disable iMIP for external organizers',
        //_('Disable iMIP for external organizers')
            'description'           => 'Disable iMIP for external organizers',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => false,
            'setByAdminModule'      => true,
            'setBySetupModule'      => true,
            'default'               => false,
        ),
        self::DISABLE_EXTERNAL_NOTIFICATIONS => array(
            //_('Disable notification for external attendee')
            'label'                 => 'Disable notification for external attendee',
            //_('Disable notification for external attendee')
            'description'           => 'Disable notification for external attendee',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => false,
            'setByAdminModule'      => true,
            'setBySetupModule'      => true,
            'default'               => false,
        ),
        self::SKIP_DOUBLE_EVENTS => array(
            //_('(CalDAV) Skip double events from personal or shared calendar')
            'label'                 => '(CalDAV) Skip double events from personal or shared calendar',
            //_('(CalDAV) Skip double events from personal or shared calendar ("personal" > Skip events from personal calendar or "shared" > Skip events from shared calendar)')
            'description'           => '(CalDAV) Skip double events from personal or shared calendar ("personal" > Skip events from personal calendar or "shared" > Skip events from shared calendar)',
            'type'                  => Tinebase_Config_Abstract::TYPE_STRING,
            'clientRegistryInclude' => FALSE,
            'setByAdminModule'      => FALSE,
            'setBySetupModule'      => FALSE,
            'default'               => '',
        ),
        self::FLOORPLANS => [
            //_('Floorplans')
            self::LABEL                 => 'Floorplans',
            //_('List of floorplans with their resource configurations.')
            self::DESCRIPTION           => 'List of floorplans with their resource configurations.',
            self::TYPE                  => self::TYPE_ARRAY,
            self::CLIENTREGISTRYINCLUDE => false,
            self::SETBYADMINMODULE      => false,
            self::SETBYSETUPMODULE      => false,
            self::DEFAULT_STR           => []
        ],
        self::ENABLED_FEATURES => [
            //_('Enabled Features')
            self::LABEL                 => 'Enabled Features',
            //_('Enabled Features in Calendar Application.')
            self::DESCRIPTION           => 'Enabled Features in Calendar Application.',
            self::TYPE                  => self::TYPE_OBJECT,
            self::CLASSNAME             => Tinebase_Config_Struct::class,
            self::CLIENTREGISTRYINCLUDE => true,
            self::CONTENT               => [

                self::FEATURE_SPLIT_VIEW => [
                    self::LABEL             => 'Calendar Split View',
                    //_('Calendar Split View')
                    self::DESCRIPTION       => 'Split day and week views by attendee',
                    //_('Split day and week views by attendee')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => true,
                ],
                self::FEATURE_YEAR_VIEW => [
                    self::LABEL             => 'Calendar Year View',
                    //_('Calendar Year View')
                    self::DESCRIPTION       => 'Adds year view to Calendar',
                    //_('Adds year view to Calendar')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => false,
                ],
                self::FEATURE_EXTENDED_EVENT_CONTEXT_ACTIONS => [
                    self::LABEL             => 'Calendar Extended Context Menu Actions',
                    //_('Calendar Extended Context Menu Actions')
                    self::DESCRIPTION       => 'Adds extended actions to event context menus',
                    //_('Adds extended actions to the event context menus')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => true,
                ],
                self::FEATURE_COLOR_BY => [
                    self::LABEL             => 'Color Events by',
                    //_('Color Events by')
                    self::DESCRIPTION       => 'Choose event color by different criteria',
                    //_('Choose event color by different criteria')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => true,
                ],
                self::FEATURE_RECUR_EXCEPT => [
                    self::LABEL             => 'Recurring Events Except',
                    //_('Recurring Events Except')
                    self::DESCRIPTION       => 'Recurring events, except on certain dates.',
                    //_('Recurring events, except on certain dates.')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => false,
                ],
                self::FEATURE_POLLS => array(
                    self::LABEL             => 'Activate Poll for the Events',
                    //_('Activate Poll for the Events')
                    self::DESCRIPTION       =>
                        'Create alternative events and allow users as well as externals to vote for the best option.',
                    //_('Create alternative events and allow users as well as externals to vote for the best option.')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => true,
                ),
                self::FEATURE_EVENT_TYPE => array(
                    self::LABEL             => 'Activate Event Types for the Events',
                    //_('Activate Event Types for the Events')
                    self::DESCRIPTION       =>
                        'Activate Event Types for the Events.',
                    //_('Activate Event Types for the Events.')
                    self::TYPE              => self::TYPE_BOOL,
                    self::DEFAULT_STR       => false,
                ),
                self::FEATURE_EVENT_NOTIFICATION_CONFIRMATION  => [
                    self::LABEL         => 'Event Notification Confirmation', //_('Event Notification Confirmation')
                    self::DESCRIPTION   => 'Event Notification Confirmation',
                    self::TYPE          => self::TYPE_BOOL,
                    self::DEFAULT_STR   => false,
                ],
                self::FEATURE_CLOUD_CALENDAR_SYNC => [
                    self::LABEL         => 'Enable Cloud Calendar Sync',
                    self::TYPE          => self::TYPE_BOOL,
                    self::DEFAULT_STR   => false,
                ],
            ],
            self::DEFAULT_STR => [],
        ],
        self::TENTATIVE_NOTIFICATIONS => array(
            'label'                 => 'Send Tentative Notifications', //_('Send Tentative Notifications')
            'description'           => 'Send notifications to event organizers of tentative events a certain number of days before the event is due.', //_('Send notifications to event organizers of tentative events a certain number of days before the event is due.')
            'type'                  => 'object',
            'class'                 => 'Tinebase_Config_Struct',
            'clientRegistryInclude' => TRUE,
            'setBySetupModule'      => false,
            'setByAdminModule'      => true,
            'content'               => array(
                self::TENTATIVE_NOTIFICATIONS_ENABLED   => array(
                    'label'         => 'Enabled', //_('Enabled')
                    'description'   => 'Enabled', //_('Enabled')
                    'type'          => Tinebase_Config_Abstract::TYPE_BOOL,
                    'default'       => false,
                ),
                self::TENTATIVE_NOTIFICATIONS_DAYS      => array(
                    'label'         => 'Days Before Due Date', //_('Days Before Due Date')
                    'description'   => 'How many days before the event\'s due date should notifications be sent.', //_('How many days before the event\'s due date should notifications be sent.')
                    'type'          => Tinebase_Config_Abstract::TYPE_INT,
                    'default'       => 5,
                ),
                self::TENTATIVE_NOTIFICATIONS_FILTER    => array(
                    'label'         => 'Additional Filter', //_('Additional Filter')
                    'description'   => 'Additional filter to limit which events notifications should be sent for.', //_('Additional filter to limit which events notifications should be sent for.')
                    'type'          => Tinebase_Config_Abstract::TYPE_ARRAY,
                    'default'       => [],
                ),
            ),
            'default'               => array(),
        ),
        self::POLL_MUTE_ALTERNATIVES_NOTIFICATIONS => array(
            //_('Mute Event Notifications for Polls')
            'label'                 => 'Mute Event Notifications for Polls',
            //_('Do not send invitation notifications for alternative events in an active poll.')
            'description'           => 'Do not send invitation notifications for alternative events in an active poll.',
            'type'                  => Tinebase_Config_Abstract::TYPE_BOOL,
            'clientRegistryInclude' => false,
            'setBySetupModule'      => false,
            'setByAdminModule'      => true,
            'default'               => true
        ),
        self::POLL_GTC => array(
            //_('GTCs for polls')
            'label'                 => 'GTCs for polls',
            //_('GTCs for polls')
            'description'           => 'GTCs for polls',
            'type'                  => Tinebase_Config_Abstract::TYPE_STRING,
            'clientRegistryInclude' => false,
            'setBySetupModule'      => false,
            'setByAdminModule'      => true,
            'default'               => '',
        ),
        self::FREEBUSY_INFO_ALLOWED => [
            //_('Free/Busy Info')
            self::LABEL             => 'Free/Busy Info',
            //_('What data the free/busy grant reveals')
            self::DESCRIPTION       => 'What data the free/busy grant reveals',
            self::TYPE              => self::TYPE_KEYFIELD,
                self::OPTIONS           => [
                    'records'               => [
                        ['id' => Calendar_Config::FREEBUSY_INFO_ALLOW_DATETIME,  'value' => 'only date & time'], //_('only date & time')
                        ['id' => Calendar_Config::FREEBUSY_INFO_ALLOW_ORGANIZER,  'value' => 'and organizer'], //_('and organizer')
                        ['id' => Calendar_Config::FREEBUSY_INFO_ALLOW_RESOURCE_ATTENDEE,  'value' => 'and resources'], //_('and resources')
                        ['id' => Calendar_Config::FREEBUSY_INFO_ALLOW_CALENDAR,  'value' => 'and calendar'], //_('and calendar')
                        ['id' => Calendar_Config::FREEBUSY_INFO_ALLOW_CLASS,  'value' => 'and the classification'], //_('and classification')
                        ['id' => Calendar_Config::FREEBUSY_INFO_ALLOW_ALL_ATTENDEE,  'value' => 'and other attendees'], //_('and other attendees')
                    ],
                ],
            self::CLIENTREGISTRYINCLUDE => true,
            self::SETBYADMINMODULE      => true,
            self::SETBYSETUPMODULE      => false,
            self::DEFAULT_STR           => 10,
        ],
        self::SEARCH_ATTENDERS_FILTER => [
            //_('Search Attenders Additional Filters')
            self::LABEL             => 'Search Attenders Additional Filters',
            //_('Search Attenders Additional Filters')
            self::DESCRIPTION       => 'Search Attenders Additional Filters',
            self::TYPE              => self::TYPE_OBJECT,
            self::CLASSNAME         => Tinebase_Config_Struct::class,
            self::CONTENT           => [
                self::SEARCH_ATTENDERS_FILTER_USER      => [
                    //_('User Additional Filters')
                    self::LABEL                 => 'User Additional Filters',
                    //_('User Additional Filters')
                    self::DESCRIPTION           => 'User Additional Filters',
                    self::TYPE                  => self::TYPE_ARRAY,
                    self::CLIENTREGISTRYINCLUDE => false,
                    self::SETBYADMINMODULE      => true,
                    self::SETBYSETUPMODULE      => false,
                    self::DEFAULT_STR           => [],
                ],
                self::SEARCH_ATTENDERS_FILTER_GROUP     => [
                    //_('Group Additional Filters')
                    self::LABEL                 => 'Group Additional Filters',
                    //_('Group Additional Filters')
                    self::DESCRIPTION           => 'Group Additional Filters',
                    self::TYPE                  => self::TYPE_ARRAY,
                    self::CLIENTREGISTRYINCLUDE => false,
                    self::SETBYADMINMODULE      => true,
                    self::SETBYSETUPMODULE      => false,
                    self::DEFAULT_STR           => [],
                ],
                self::SEARCH_ATTENDERS_FILTER_RESOURCE  => [
                    //_('Resource Additional Filters')
                    self::LABEL                 => 'Resource Additional Filters',
                    //_('Resource Additional Filters')
                    self::DESCRIPTION           => 'Resource Additional Filters',
                    self::TYPE                  => self::TYPE_ARRAY,
                    self::CLIENTREGISTRYINCLUDE => false,
                    self::SETBYADMINMODULE      => true,
                    self::SETBYSETUPMODULE      => false,
                    self::DEFAULT_STR           => [],
                ],
            ],
            self::CLIENTREGISTRYINCLUDE => false,
            self::SETBYADMINMODULE      => true,
            self::SETBYSETUPMODULE      => false,
            self::DEFAULT_STR           => [],
        ],
        self::ASSIGN_ORGANIZER_MEETING_STATUS_ON_EDIT_GRANT => [
            self::LABEL                 => 'Assign organizer meeting status on editGrant',
            //_('Assign organizer meeting status on editGrant')
            self::DESCRIPTION           => 'Assign organizer meeting status on editGrant',
            //_('Assign organizer meeting status on editGrant')
            self::TYPE                  => self::TYPE_BOOL,
            self::DEFAULT_STR           => false,
            self::CLIENTREGISTRYINCLUDE => false,
            self::SETBYSETUPMODULE      => false,
            self::SETBYADMINMODULE      => false,
        ],
    );
    
    /**
     * (non-PHPdoc)
     * @see tine20/Tinebase/Config/Abstract::$_appName
     */
    protected $_appName = 'Calendar';
    
    /**
     * holds the instance of the singleton
     *
     * @var Tinebase_Config
     */
    private static $_instance = NULL;
    
    /**
     * the constructor
     *
     * don't use the constructor. use the singleton 
     */    
    private function __construct() {}
    
    /**
     * the constructor
     *
     * don't use the constructor. use the singleton 
     */    
    private function __clone() {}
    
    /**
     * Returns instance of Tinebase_Config
     *
     * @return Tinebase_Config
     */
    public static function getInstance() 
    {
        if (self::$_instance === NULL) {
            self::$_instance = new self();
        }
        
        return self::$_instance;
    }
    
    /**
     * (non-PHPdoc)
     * @see tine20/Tinebase/Config/Abstract::getProperties()
     */
    public static function getProperties()
    {
        return self::$_properties;
    }
}