Skip to content

UserDefaults

Helge Heß edited this page Nov 20, 2024 · 17 revisions

UserDefaults are a configuration mechanism used by OGo/SOPE that is part of the Objective-C Foundation library (e.g. gnustep-base, libFoundation or the Apple Foundation).

They can be written in a persistent way using the defaults tool, like:

defaults write NSGlobalDomain WOUseWatchDog NO

or specified as transient arguments, like:

ogo-webui-5.5 -WOUseWatchDog NO

They are scoped using "domains", e.g. NSGlobalDomain applies to all processes. But settings can also be written on a per program basis, like:

defaults write ogo-webui-5.5 WOUseWatchDog NO

The "default" defaults are often in the Defaults.plist file contained in bundles. E.g. BaseUI/Defaults.plist.

Shortcuts

OGoWebUI has -s, -sa shortcuts:

  if ([[ud objectForKey:@"s"] boolValue])
    [sn enableAdaptorDebugging];
  if ([[ud objectForKey:@"sa"] boolValue])
    [LSBaseCommand setDebuggingEnabled:YES];

WatchDog

The watch dog is part of NGObjWeb WOWatchDogApplicationMain.

  • WOLogFile - - for stdin/out?
  • WONoDetach YES
    • do not invoke w/ watchdog
  • WOPidFile
  • WORespawnDelay (5)
  • WOUseWatchDog (YES)

Bundle Manager

OGo has most of the functionality implemented in so called "bundles". Bundles combine a shared library w/ associated resources. In addition SOPE has the NGBundleManager which implements bundle discovery and manages dependencies between them.

  • NGBundleManagerDebugEnabled NO
    • similar to a Java CLASSPATH

Resource Manager

  • WEResourceManagerDebugEnabled NO
  • WEResourceManagerComponentDebugEnabled NO
  • WOApplicationSuffix (e.g. woa)
  • WOResourcePrefix
  • OGoResourceManagerDebugEnabled NO
  • OGoResourceManagerComponentDebugEnabled NO

OGoContextManager

  • LSOfficeModel - bundle containing the EOModel
  • LSAdapter - database driver, e.g. "PostgreSQL"
  • LSAdapter - connection dictionary for database
    • userName (def "OGo")
    • databaseName (def "OGo")
    • port (def 5432)
    • hostName (e.g. dbserver.local, def: 127.0.0.1)
  • LSTimeZones - array of timezones, e.g. ( "MET", "GMT", "PST" )
    • this varies between the Foundation libraries
  • OGoBundlePathSpecifier (e.g. "OpenGroupware.org-5.5")
  • OGoFHSBundleSubPath (e.g. "lib/opengroupware.org-5.5")
  • LSSessionAccountLogEnabled (def YES)
    • I think this says whether all logins are tracked in the OGo table for that

LDAP Settings

  • LSAuthLDAPServer (def "")
  • LSAuthLDAPServerRoot (def "c=DE"`)
  • LSAuthLDAPServerPort (def 389)
  • LSLDAPLoginField (def uid) @"OGoModel", @"LSOfficeModel", OGO_DBADAPTOR, @"LSAdaptor", timeZoneNames, @"LSTimeZones", condict, @"LSConnectionDictionary", bps, @"OGoBundlePathSpecifier", fsp, @"OGoFHSBundleSubPath", [NSNumber numberWithBool:YES], @"LSSessionAccountLogEnabled",

Byte Buffer

  • ProfileByteBufferEnabled

HTTP Adapter

  • WOCoreOnHTTPAdaptorException (bool)
  • WOHTTPAdaptorCapitalizeHeaders (bool)
  • WOHttpAdaptor_LogStream (bool)
  • WOAdaptorLogPath (string)
  • WOHttpTransactionUseSimpleParser (bool, e.g. YES)
    • used by ZideStore
    • TODO: check what the difference is, might not be necessary anymore

WOComponent

  • WODebugComponentAwake
  • WODebugTakeValues
  • WOCoreOnAwakeComponentInCtxDealloc

WOApplication

  • WOProjectDirectory ("rapid turn-around path")
  • WOApplicationSuffix
  • WOProfileApplication
  • WOPageCacheSize
  • WOPermanentPageCacheSize
  • WOPageRefreshOnBacktrack
  • WOExpirationTimeInterval
  • WOLogDefaultsOnStartup
  • WOComponentRequestHandlerKey (string)
  • WODirectActionRequestHandlerKey (string)
  • WOResourceRequestHandlerKey (string)
  • WODefaultSessionTimeOut
  • WOCachingEnabled (bool)
  • WODebuggingEnabled (bool)
  • WOCGIAdaptorURL (string)
  • WOAutoOpenInBrowser (bool)
  • WOApplicationBaseURL
  • WOFrameworksBaseURL

WOSession

  • WOProfileComponents
  • WOLogPageCache
  • WORunMultithreaded
  • WODefaultLanguages

Links between objects

OGo can store links between arbitrary objects using the OGoObjectLinkTypeMap default. It is a WebUI level map, as it maps a label to an actual OGo WOComponent class name, e.g. OGoPersonLinkEditor.

Example:

{ CustomerOf = OGoPersonLinkEditor; 
  Mother = OGoPersonLinkEditor; }

Note: Those are labels global and available on all objects, they cannot be restricted to input types right now.

Links are stored in the obj_link database table.

TODO

  • skyrix_id (e.g. "OGo@power1")
  • LSAttachmentPath (e.g. "/Users/helge/Library/OGoDocs")
    • this is where blobs are stored, directory has to exist
    • should be mapped to a volume w/ running in a Docker
  • LSNewsImagesPath (e.g. "/Users/helge/Library/OGoNews")
    • similar to the LSAttachmentPath, just for the news app
  • WOHttpAllowHost - array of hosts that are allowed to connect
    • '(shire.in.skyrix.com, groove.in.skyrix.com, 127.0.0.1, localhost, power1 )'
  • scheduler_participantRolesEnabled - YES
    • I think this is stuff like ORGANIZER vs ATTENDEE
    • TODO: figure out what this affects
  • OGoMinimumActiveSessionCount YES
    • TODO: check what this does
  • WOMinimumActiveSessionCount 0
    • TODO: check what this does
  • ImapLogEnabled NO
  • MailConfigEnabled YES
    • whether to enable the Postfix(?) config panels
  • SkyShowPageTimings YES
    • I think this shows the rendering performance in a footer of the web frontend
  • SkyDockablePagesOrdering (array of strings)
    • Apparently one can put projects into the dock?
  • SkyDockLogo
  • SkyDockLogoLink
  • SkyDockLogoMenuAlignment (gets lowercased)
  • OGoStringTableManagerDebugEnabled (bool)
  • PGDebugEnabled (bool)
  • LSSessionChannelTimeOut (default 300, seconds)
  • SkyCommandProfileFilename (filename, can write command performances)
  • LSDebuggingEnabled (bool)
  • OGoExtendedAptAttributes
  • LSPageRefreshOnBacktrack (YES)
    • I think this sets a cache header so that the page is refreshed if the user presses back?
  • LSLoginPageExpireTimeout (1200)
  • SkyLogoutURL
  • OGoLogNotifications (bool)
  • LSCoreOnCommandException (bool)
  • WOUseGlobalCookiePath
  • LSTimeZones (array of tz IDs, e.g. ( CET, GMT ))

BaseUI

  /* SkyButtonFrame/SkyButton dynamic element */

  SkyButtonInactiveButtonTextColor = "#AAAAAA";
  SkyButtonActiveButtonTextColor   = "black";

  SkyButtonTextMode = NO;

  /* SkyButtonRow dynamic element */

  SkyButtonRowDefaultButtonsLeft  = NO;
  SkyButtonRowHideInactiveButtons = YES;
  SkyButtonRowOrdering = ( clip, mail, delete, edit, move, new );

  /* ordering of dockable pages */

  SkyDockablePagesOrdering = (
    "Registration",
    "UserManager",
    "News",
    "Persons",
    "Enterprises",
    "Projects",
    "Scheduler2",
    "Jobs",
    "Imap"
  );

  SkyDockTextMode          = NO;
  SkyDockShowBookmarks     = YES;
  SkyDockShowDesktop       = YES;
  SkyDockLogo              = "skyrix_logo.gif";
  SkyDockLogoLink          = "http://www.skyrix.com";
  SkyDockLogoMenuAlignment = "right";
  mail_editor_type         = "internal";
  mail_send_type           = "plain";  
  
  SkyPageRefreshTimeout = 300;
  SkyEditorPageTimeOut  = 3600;
  SkyShowPageTimings    = NO;
  OGoDebugDnD           = NO;
  OGoDebugPageRefresh   = NO;
  
  /* the maximum width of a dock label, used by SkyDockedProjects */
  OGoDockLabelWidth     = 18;

  OGoWindowFrameFocusScriptTemplate = "<script language='JavaScript'>
<!-- hide, generated by OGoWindowFrame
  if (document.$formName$) {
    if (document.$formName$.$fieldName$) {
      document.$formName$.$fieldName$.focus();
      document.$formName$.$fieldName$.select();
    } 
  }
// -->
</script>";

NGObjWeb

{
  NGObjWeb_doc_                         = "NSUserDefaults for NGObjWeb";

  NGLogDefaultAppenderClass             = "NGLogStderrAppender";
  NGLogDefaultLogLevel                  = "INFO";
  NGLogDefaultLogEventFormatterClass    = "NGLogEventDetailedFormatter";
  WOAdaptor                             = "WOHttpAdaptor";
  WOAdaptorLogPath                      = "";
  WOAdditionalAdaptors                  = ( );
  WOApplicationBaseURL                  = "/WebObjects";
  WOApplicationSuffix                   = ".woa";
  WOAutoOpenInBrowser                   = NO;
  WOCGIAdaptorURL                       = "http://localhost/cgi-bin/WebObjects";
  WOCachingEnabled                      = YES;
  WOComponentExtensions                 = ( wo );
  WOComponentLoadWOOFiles               = NO;
  WOComponentRequestHandlerKey          = "wo";
  WOCompoundElementPool                 = NO;
  WOContextClass                        = WOContext;
  WOCoreOnApplicationException          = NO;
  WOCoreOnAwakeComponentInCtxDealloc    = NO;
  WOCoreOnHTTPAdaptorException          = NO;
  WOCoreOnRecursiveSubcomponents        = NO;
  WOCoreOnXmlRpcFault                   = NO;
  WODebugActions                        = NO;
  WODebugComponentAwake                 = NO;
  WODebugComponentDefinition            = NO;
  WODebugComponentLookup                = NO;
  WODebugCursor                         = NO;
  WODebugHttpTransaction                = NO;
  WODebugKeyPathAssociation             = NO;
  WODebugResourceLookup                 = NO;
  WODebugStaticLinkProcessing           = NO;
  WODebugTakeValues			= NO;
  WODebugZipResponse                    = NO;
  WODebuggingEnabled                    = NO;
  WODefaultResourceManager              = "WOResourceManager";
  WODefaultSessionTimeOut               = 3600;
  WODefaultLanguages = ( 
    English, 
    German, 
    Danish, 
    Dutch,
    French, 
    Spanish, 
    Italian, 
    Portuguese, 
    ptBR
  );
  WODescriptiveElementIDs               = NO;
  WODirectActionRequestHandlerKey       = "x";
  WODontZipResponse                     = NO;
  WOEnableComponentsWithoutClasses      = NO;
  WOExpirationTimeInterval              = 120;
  WOFormAlwaysPassDown                  = YES;
  WOFrameworksBaseURL                   = "/WebObjects/Frameworks";
  WOGenerateMissingResourceLinks        = NO;
  WOHttpAdaptorForkCount                = 0;
  WOHttpAdaptorReceiveTimeout           = 120;
  WOHttpAdaptorSendTimeout              = 120;
  WOHttpAdaptor_LogStream               = NO;
  WOHttpAllowHost                       = ();
  WOHttpTransactionUseSimpleParser      = NO;
  WOHttpTransactionLoggerConfig         = {
    "Appenders" = (
        {
            "Class"     = "NGLogStdoutAppender";
            "Formatter" = {
               "Class" = "NGLogEventDetailedFormatter";
            };
        },
    );
  };
  WOIncludeCommentsInResponse           = YES;
  WOIsRedirectionEnabled                = NO;
  WOKeyPathAssociationsCacheSize        = 200;
  WOListenQueueSize                     = 5;
  WOLogComponents                       = NO;
  WOLogDefaultsOnStartup                = NO;
  WOLogPageCache                        = NO;
  WOLogScriptDealloc                    = NO;
  WOLogScriptInit                       = NO;
  WOLogScriptKVC                        = NO;
  WOLogXmlRpcSelectorMapping            = NO;
  WONoProxySuffixes                     = ( );
  WONoSelectionString                   = "WONoSelectionString";
  WOOutputValidationEnabled             = NO;
  WOPageCacheSize                       = 30;
  WOPageRefreshOnBacktrack              = YES;
  WOPageRequestHandlerDebugEnabled      = NO;
  WOParsersUseUTF8                      = NO;
  WOPermanentPageCacheSize              = 30;
  WOPort                                = 20000;
  WOProfileApplication                  = NO;
  WOProfileComponents                   = NO;
  WOProfileDirectActionRequestHandler   = NO;
  WOProfileElements                     = NO;
  WOProfileHttpAdaptor                  = NO;
  WOProfileLoading                      = NO;
  WOProfileResponse                     = NO;
  WOProjectSearchPath                   = ();
  WORedirectURISafetySuffix             = "/view/view/view/view";
  WOResourceRequestHandlerKey           = "y";
  WOResourceURLAssociationDebugEnabled  = NO;
  WORunMultithreaded                    = NO;
  WOSMTPHost                            = "mail";
  WOSendMail                            = "/usr/lib/sendmail";
  WOSessionStore                        = "WOServerSessionStore";
  WOSimpleHTTPParserDebugEnabled        = NO;
  WOSimpleHTTPParserFileIOBoundary      = 16384;
  WOSimpleHTTPParserHeavyDebugEnabled   = NO;
  WOSimpleHTTPParserMaxUploadSizeInKB   = 262144;
  WOStatsStylesheetName                 = "WOStats.xsl";
  WOSubmitButtonEnableValueSync         = NO;
  WOWatchDogRequestTimeout              = 10;
  WOUseRelativeURLs                     = YES;
  WOUseGlobalCookiePath                 = YES;
  WOValueAssociationsCacheSize          = 200;
  WOWorkerThreadCount                   = 0;
  WOxFileExtensions                     = ( wox, xtmpl, xhtml );
  WOxElemBuilder_LogAssociationMapping  = NO;
  WOxElemBuilder_LogAssociationCreation = NO;
  WOxComponentElemBuilderDebugEnabled   = NO;
  WOxLogBuilderQueue                    = NO;
  WOxBuilderClasses = ( 
    WOxTalElemBuilder,
    WOxControlElemBuilder,
    WOxMiscElemBuilder,
    WOxHTMLElemBuilder,
    WOxXULElemBuilder,
    WExCalElemBuilder,
    WExDnDElemBuilder,
    WExExtElemBuilder,
    WOxExtElemBuilder,
    WOxComponentElemBuilder
  );
  WOxAssociationClassMapping = {
    "http://www.skyrix.com/od/binding"    = WOKeyPathAssociation;
    "http://www.skyrix.com/od/constant"   = WOValueAssociation;
    "http://www.skyrix.com/od/javascript" = WOScriptAssociation;
    "http://www.skyrix.com/od/so-lookup"  = SoLookupAssociation;
    "OGo:bind"                            = WOKeyPathAssociation;
    "OGo:value"                           = WOValueAssociation;
    "OGo:script"                          = WOScriptAssociation;
    "OGo:url"                             = WOResourceURLAssociation;
    "OGo:label"                           = WOLabelAssociation;
    "OGo:bool"                            = WOBoolAssociation;
    "OGo:path"                            = SoLookupAssociation;
  };
  SoClassRegistryDebugEnabled          = NO;
  SoDebugKeyLookup                     = NO;
  SoDebugTraversal                     = NO;
  SoDebugProductLoading                = NO;
  SoDebugProductRegistry               = NO;
  SoDebugRequestClassification         = NO;
  SoLogSecurityDeclarations            = NO;
  SoOFSDebugFactory                    = NO;
  SoOFSDebugPlistObject                = NO;
  SoOFSDebugRestore                    = NO;
  SoOFSDebugNegotiate                  = NO;
  SoOFSDebugAuthLookup                 = NO;
  SoOFSWebMethodDebugEnabled           = NO;
  SoOFSResourceManagerDebugEnabled     = NO;
  SoObjCClassDebugEnabled              = NO;
  SoObjectDAVDispatcherDebugEnabled    = NO;
  SoObjectXmlRpcDispatcherDebugEnabled = NO;
  SoObjectSOAPDispatcherDebugEnabled   = NO;
  SoObjectDataSourceDebugEnabled       = NO;
  SoObjectRequestHandlerDebugEnabled   = NO;
  SoObjectMethodDispatcherDebugEnabled = NO;
  SoPageInvocationDebugEnabled         = NO;
  SoProductResourceManagerDebugEnabled = NO;
  SoRendererDebugEnabled               = NO;
  SoRedirectToDefaultMethods           = YES;
  SoSecurityManagerDebugEnabled        = NO;
  SoPreferredNamespacePrefixes = {
    "DAV:" = "D";
    "http://www.skyrix.com/od/binding"            = "var";
    "http://www.skyrix.com/od/constant"           = "const";
    "http://www.skyrix.com/od/javascript"         = "js";
    "http://www.w3.org/1999/xhtml"                = "html";
    "http://www.w3.org/TR/REC-html40"             = "html4";
    "http://www.w3.org/1999/xlink"                = "xlink";
    "http://www.w3.org/1999/XSL/Transform"        = "xsl";
    "http://www.w3.org/1999/02/22-rdf-syntax-ns#" = "RDF";
    "http://www.wapforum.org/DTD/wml_1.2.xml"     = "wml";
    "http://schemas.microsoft.com/hotmail/"       = "hm";
    "http://schemas.microsoft.com/exchange/"      = "X";
    "urn:schemas:contacts:"                       = "A";
    "urn:schemas:calendar:"                       = "C";
    "http://schemas.microsoft.com/mapi/proptag/"  = "pt";
    "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" = "xul";
    "http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-01.txt" =
      "xcal";
    "http://apache.org/dav/props/" = "ap";
    "http://webdav.org/cadaver/custom-properties/" = "cdv";
  };
  SoDefaultWebDAVPropertyNames = (
    "{DAV:}creationdate",
    "{DAV:}getcontentlength",
    "{DAV:}getlastmodified",
    "{DAV:}getetag",
    "{DAV:}resourcetype",
    "{DAV:}getcontenttype",
    "{DAV:}displayname",
    "{DAV:}href",
    "{http://apache.org/dav/props/}executable"
  );
  SoWebDAVFormatOutput = NO;
  DAVParserDebugProp = NO;
  
  SoWebDAVDisableCrossHostMoveCheck = NO;
  
  SoWebDAVDefaultAllowMethods = (
    GET, HEAD, POST, OPTIONS, MKCOL, MKCALENDAR, DELETE, PUT,
    LOCK, UNLOCK, COPY, MOVE, REPORT
    /* , NOTIFY, POLL, SUBSCRIBE, UNSUBSCRIBE */
  );

  SoWebDAVDetectionMethods = (
    OPTIONS,
    MKCOL,
    MKCALENDAR,
    PROPFIND,
    PROPPATCH,
    DELETE,
    PUT,
    LOCK,
    UNLOCK,
    COPY,
    MOVE,
    
    /* WebStore specialties */
    SEARCH,
    NOTIFY,
    POLL,
    SUBSCRIBE,
    UNSUBSCRIBE,
    BCOPY,
    BDELETE,
    BMOVE,
    BPROPFIND,
    BPROPPATCH
  );
  
  SoRequestDispatcherRules = (
    "context.soRequestType='WebDAV'  => renderer = 'SoWebDAVRenderer' ; high",
    "context.soRequestType='XML-RPC' => renderer = 'SoXmlRpcRenderer' ; high",
    "context.soRequestType='SOAP'    => renderer = 'SoSOAPRenderer' ;   high",
    "*true* => renderer = 'SoDefaultRenderer' ; fallback",
    
    "request.isSoSOAPRequest=YES   => dispatcher = 'SoObjectSOAPDispatcher'",
    "request.isSoWebDAVRequest=YES => dispatcher = 'SoObjectWebDAVDispatcher'",
    "request.isSoXmlRpcRequest=YES => dispatcher = 'SoObjectXmlRpcDispatcher'",
    "*true* => dispatcher = 'SoObjectMethodDispatcher'; fallback",
    
    "request.isSoSOAPRequest=YES   => requestType = 'SOAP'",
    "request.isSoWebDAVRequest=YES => requestType = 'WebDAV'",
    "request.isSoXmlRpcRequest=YES => requestType = 'XML-RPC'",
    "*true*                        => requestType = 'METHOD'; fallback",
    
    "request.isSoWebDAVRequest=YES => useAcquisition = NO",
    "headers.translate='f'         => useAcquisition = NO; high",
    "method='GET'                  => useAcquisition = YES; low",
    "method='HEAD'                 => useAcquisition = YES; low",
    "method='POST'                 => useAcquisition = YES; low",
    "*true*                        => useAcquisition = NO; fallback",
  );
}

Contacts

Persons and companies ("Enterprises" in the DB) can have extended attributes (stored in the company_value table), they are stored in those defaults:

  • SkyPublicExtendedPersonAttributes (def: email1, email2, email3, job_title, other_title1, other_title2)
  • SkyPrivateExtendedPersonAttributes (def: empty)
  • SkyPublicExtendedEnterpriseAttributes (def: email2, email3, job_title, other_title1, other_title2)
  • SkyPrivateExtendedEnterpriseAttributes

Example (default):

SkyPublicExtendedPersonAttributes = (
  { key = "email1"; type = 3; }, // email
  { key = "email2"; type = 3; }, // email
  { key = "email3"; type = 3; }, // email
  { key = "job_title"; }, // string
  { key = "other_title1"; }, // string
  { key = "other_title2"; } // string
);

Phone numbers and address types can be configured:

  • LSAddressType
  • LSTeleType

Examples (default:

LSAddressType = {
  Enterprise = ( "ship", "bill" );
  Person = ( "private", "mailing", "location" );
};
LSTeleType = {
  Enterprise = ( "01_tel", "02_tel", "10_fax" );
  Person = ( "01_tel", "02_tel", "03_tel_funk", "05_tel_private", "10_fax", "15_fax_private" );
};
  • (Snippets Address Defaults)[http://www.opengroupware.org/en/users/docs/snippets/Configurations/Address_Defaults]

OGoScheduler

  • SkyScheduler_defaultAppointmentTypes
  • SkyScheduler_customAppointmentTypes

Custom types:

SkyScheduler_customAppointmentTypes = (
  { type = "mycustomtype0"; label = "my label for this type";
    icon = "myCustomIcon.gif"; }
);

Custom Attributes, same thing like in persons/companies:

  OGoExtendedAptAttributes = (
    { key = "EMail";    type = 3; },
    { key = "Color";    },
    { key = "Billable"; type = 2; },
  );
{
  // TODO: a lot of DUPs between this and OGoSchedulerViews!

  scheduler_hide_new_proposal_on_rescat    = YES;
  scheduler_selectPanel_showAptTypes       = YES;
  scheduler_memberteams_only               = NO;


  scheduler_daychart_maxaptinfolength      = 14;
  scheduler_weekchart_maxaptinfolength     = 7;
  scheduler_weekchart_starthour            = 8;
  scheduler_weekchart_endhour              = 21;
  scheduler_weekchart_columnsperday        = 24;
  scheduler_daychart_columnsperday         = 60;
  scheduler_first_day_of_week              = 1; // monday
  scheduler_monthoverview_maxaptperday     = 20;
  scheduler_monthoverview_maxaptinfolength = 14;
  scheduler_dayoverview_timeinterval       = 3600; // in seconds
  scheduler_dayoverview_daystart           = 480;  // minutes after 0:00
  scheduler_dayoverview_dayend             = 1080; // minutes after 0:00
  scheduler_additional_popup_entries       = 20;
  scheduler_overview_short_info            = YES;
  scheduler_overview_with_resources        = YES;

  // holidays
  scheduler_show_holiday_shrovetide       = NO;  // Fastnacht
  scheduler_show_holiday_ascension        = YES;  // Christi Himmelfahrt
  scheduler_show_holiday_mothersDay       = NO;  // Muttertag
  scheduler_show_holiday_corpusChristi    = NO;  // Fronleichnam
  scheduler_show_holiday_summertimeChange = YES; // Sommerzeitumstellung
  scheduler_show_holiday_wintertimeChange = YES; // Winterzeitumstellung
  scheduler_show_holiday_christmasEve     = YES; // Weihnachtsabend
  scheduler_show_holiday_newYearsEve      = YES; // Silvester
  scheduler_show_holiday_deathsSunday     = NO;  // Totensonntag
  scheduler_show_holiday_newYear          = YES;
  scheduler_show_holiday_holyThreeKings   = YES;  
  scheduler_show_holiday_goodFriday       = YES;
  scheduler_show_holiday_easter           = YES;
  scheduler_show_holiday_firstMay         = YES;
  scheduler_show_holiday_whitsun          = YES;
  scheduler_show_holiday_germanUnityDay   = YES;
  scheduler_show_holiday_reformationsDay  = YES;
  scheduler_show_holiday_allSaintsDay     = YES;
  scheduler_show_holiday_christmasDay     = YES;
  scheduler_show_holiday_boxingDay        = YES;
  scheduler_show_holiday_firstAdvent      = NO;
  scheduler_show_holiday_secondAdvent     = NO;
  scheduler_show_holiday_thirdAdvent      = NO;
  scheduler_show_holiday_fourthAdvent     = NO;
  scheduler_show_holiday_dayOfPrayerAndRepetance = YES;


  scheduler_show_holiday_holidaygroup_bay    = NO;  // Bayern
  scheduler_show_holiday_holidaygroup_ber    = NO;  // Berlin
  scheduler_show_holiday_holidaygroup_bra    = NO;  // Brandenburg
  scheduler_show_holiday_holidaygroup_bre    = NO;  // Bremen
  scheduler_show_holiday_holidaygroup_bwb    = NO;  // Baden-Wuertt.
  scheduler_show_holiday_holidaygroup_hes    = NO;  // Hessen
  scheduler_show_holiday_holidaygroup_hh     = NO;  // Hamburg
  scheduler_show_holiday_holidaygroup_mvp    = NO;  // Meck.-P.
  scheduler_show_holiday_holidaygroup_nrw    = NO;  // Nordrein-W.
  scheduler_show_holiday_holidaygroup_nsa    = NO;  // Niedersachsen
  scheduler_show_holiday_holidaygroup_rpf    = NO;  // Rheinland-Pf.
  scheduler_show_holiday_holidaygroup_saa    = NO;  // Saarland
  scheduler_show_holiday_holidaygroup_sac    = NO;  // Sachsen
  scheduler_show_holiday_holidaygroup_sah    = YES; // Sachsen-Anhalt
  scheduler_show_holiday_holidaygroup_thu    = NO;  // Thueringen
  scheduler_show_holiday_holidaygroup_slh    = NO;  // Schleswig H.
  scheduler_show_holiday_holidaygroup_bylaw  = YES; // Gesetzl. Feiert.
  scheduler_show_holiday_holidaygroup_advent = NO;  // Advent

  scheduler_show_holiday_holidaygroup_custom_all = YES; // benutzerdefinierte
  scheduler_show_holiday_holidaygroup_custom_private = YES; // Ereignisse

  // holidays not bound in groups
  scheduler_available_holidays = (
    "shrovetide", "mothersDay", 
    "summertimeChange", "wintertimeChange", "christmasEve",
    "deathsSunday", "newYearsEve"
  );

  // school holidays
  scheduler_school_holidays = {
    // Bayern
    holidaygroup_bay = "";
    // Berlin
    holidaygroup_ber = "";
    // Brandenburg 
    holidaygroup_bra = "";
    // Bremen 
    holidaygroup_bre = "";
    // Baden-Wuerttemberg 
    holidaygroup_bwb = "";
    // Hessen 
    holidaygroup_hes = "";
    // Hamburg 
    holidaygroup_hh = "";
    // Meckl. V.
    holidaygroup_mvp = "";
    // Nordrein-W.
    holidaygroup_nrw = "";
    // Rheinland-Pf.
    holidaygroup_rpf = "";
    // Saarland
    holidaygroup_saa = "";
    // Sachsen
    holidaygroup_sac = "";
    // Niedersachsen
    holidaygroup_nsa = "";
    // Sachsen-Anhalt
    holidaygroup_sah = "";
    // Thueringen
    holidaygroup_thu = "";
    // Schleswig-H.
    holidaygroup_slh = "";
  }; 
 
  // grouped holidays
  scheduler_holiday_groups = {
    // Advent-Feiertage
    holidaygroup_advent = "";
    // Gesetzliche Feiertage
    holidaygroup_bylaw = "";
    // Benutzerdefinierte Feiertage
    holidaygroup_custom_all = "";
    // Privat Feiertage
    holidaygroup_custom_private = "";
  };

  schedulerpage_tab      = "weekoverview";
  schedulerpage_weekview = "overview";
  schedulerpage_dayview  = "overview";

  scheduler_show_jobs       = NO;
  scheduler_show_palm_dates = YES;
  scheduler_popup_maxlength = 25;

  schedulerselect_fetchkeys = (
    title, location, aptType, startDate, endDate, globalID, ownerId, 
    accessTeamId, permissions, resourceNames,
    "participants.companyId", "participants.globalID",
    "participants.login",     "participants.firstname",
    "participants.name",      "participants.description",
    "participants.isTeam",    "participants.isAccount"
  );
  schedulerselect_teamfetchkeys   = ( description );
  schedulerselect_personfetchkeys = ( 
    name, firstname, isAccount, login, companyId, globalID
  );
  schedulerselect_months = (
    January, February, March, April, May, June, July, August, September, 
    October, November, December
  );
  
  schedulerconflicts_fetchkeys = (
    title, location, startDate, endDate, globalID
  );
  schedulerconflicts_conflictkeys = (
    companyId, partStatus, role,
    team.isTeam, team.description,
    person.name, person.firstname
  );
  
  /*
    Those are keys fetched from the backend and are then mapped to the
    bindings dictionary available for formletters.
  */
  schedulerformletter_aptkeys = (
    startDate, endDate, resourceNames, keywords, title, cycleEndDate,
    location, type, dateId, globalID, objectVersion, aptType, busyType, fbtype,
    ownerId, comment,
    
    participants.isAccount, participants.isTeam, // those are required!
    
    participants.emailAlias, participants.office, participants.assistantName,
    participants.number, participants.sex, participants.keywords,
    participants.contactId, participants.salutation, participants.nameAffix,
    participants.firstname, participants.companyId,
    participants.anniversary, participants.priority, participants.occupation,
    participants.partnerName, participants.description,
    participants.degree, participants.middlename, participants.objectVersion,
    participants.freebusyUrl, participants.department,
    participants.birthday, participants.bossName, participants.name,
    participants.url, participants.imAddress, participants.nameTitle,
    participants.dirServer,
    participants.comment,
    participants.extendedAttributes
  );

  OGoSchedulerFormLetterDebugEnabled = NO;
  OGoSchedulerFormLetterTypes = {
    OOo = {
      filename           = "OOoFormLetter.csv";
      contenttype        = "text/plain";
      //contentdisposition = "attachment; filename=\"OOoFormLetter.csv\"";

      fieldSeparator = "\t";
      lineSeparator  = "\n";
      quoteFields    = "\"";
      doubleQuoteQuote = YES;

      /* dateformat     = "%d.%m.%Y"; */
      preamble = (
        "Title", "First Name", "Last Name", "Company Name",
        "Address Line 1", "Address Line 2",
        "City", "State", "ZIP", "Country",
        "Telephone private", "Telephone business",
        "E-mail Address", "Gender",

        "Appointment"
      );
      line = (
        "$salutation$", "$firstname$", "$name$", "",
        "$mailing_name1$", "$mailing_name2$",
        "$mailing_city$", "$mailing_state$", "$mailing_zip$",
        "$mailing_country$",
        "", "",
        "$email1$", "$sex$",
        "$title$ - $location$ ($startDate$ - $endDate$)"
      );
    };

    FrameMaker = {
      filename    = "FrameMaker_FormLetter.txt";
      contenttype = "text/plain";

      lineSeparator = "";
      line = "$mailing_name1$\n$mailing_name2$\n$mailing_name3$\n$degree$ $firstname$ $name$\n\n$mailing_street$\n$mailing_zip$ $mailing_city$\n\n\n\n\n\n$salutation$ $name$,\n\n";
    };

    WinWord = {
      filename    = "WordFormLetter.csv";
      contenttype = "text/plain";

      fieldSeparator = ";";
      lineSeparator  = "\n";
      line = (
        "$salutation$",
        "$sex$",
        "$degree$",
        "$firstname$",
        "$name$",
        "$mailing_name1$",
        "$mailing_name2$",
        "$mailing_name3$",
        "$mailing_street$",
        "$mailing_zip$",
        "$mailing_city$",
        "",
        "$email1$",

        "$title$ - $location$ ($startDate$ - $endDate$)"
      );
    };
  };
  
  scheduler_mailsubject_template = "$label_apt$: '$title$' $label_action$";
  scheduler_mail_template             = "";
  //scheduler_mail_template             = "Appointment data:\n\nTitle: $title$\nLocation: $location$\nStart: $startDate$\nEnd: $endDate$\nCreator: $creator$\nParticipants: $participants$\nResources: $resourceNames$\nComment: $comment$\n\n";
  scheduler_mail_template_date_format = "%Y-%m-%d %H:%M %Z";

  scheduler_mailsubject_template_for_type = {
    birthday = {
      English = "Happy Birthday: '$title$' $label_action$";
      German  = "Geburtstag: '$title$' $label_action$";
    };
    duedate = "!!$label_apt$: '$title$' $label_action$!!";
  };

  // also available: scheduler_mail_template_for_type
}

Links