variables.version = "4.7";
variables.svnBuild = "499";
// Load the app config into the apps space
application.ptCalendar.appConfig = getAppConfig();
// Rebuild Views for the primary App Custom Elements if requested or they don't exist
buildView(ceName=getEventDetailsCEName());
buildView(ceName=getEventDateTimeCEName());
buildView(ceName=getEventRecurrenceCEName());
buildView(ceName=getEventCategoriesCEName());
buildView(ceName=getCalOrganizationsCEName());
if ( getEventCacheStatus() )
{
// Build out the static and recurring events and load them into the eventsCache
if ( !StructKeyExists(application,"ptCalendarCache") OR ( StructKeyExists(request.params,"rebuildCalendarCache") AND request.params.rebuildCalendarCache EQ 1) )
application.ptCalendar.calEventsCacheController.initCalendarCache();
}
else
{
application.ptCalendar.calEventsCacheController.removeEventCache();
}
// Build out the render handler file paths for the calender display views
application.ptCalendar.viewRHfilePaths = application.ptCalendar.calRenderViewDAO.getCalendarDisplayViewPathData();
application.ptCalendar.viewPageMode = getViewPageMode();
application.ptCalendar.defaultView = getDefaultDisplayView();
application.ptCalendar.viewParamName = getViewParamName();
// Set the version information
application.ptCalendar.version = variables.version;
application.ptCalendar.svnBuild = variables.svnBuild;
var retValue = "ui-lightness";
var appConfig = getAppConfig();
// Set the CFdateMask from the Config Element
if ( StructKeyExists(appConfig,'ui_theme') AND LEN(TRIM(appConfig['ui_theme'])) )
retValue = appConfig['ui_theme'];
return retValue;
var retValue = false;
var appConfig = getAppConfig();
// Get useEventToolTip option from Config Element
if ( StructKeyExists(appConfig,"calendar_app_use_event_tooltip") AND IsBoolean(appConfig['calendar_app_use_event_tooltip']) )
retValue = appConfig['calendar_app_use_event_tooltip'];
return retValue;
var retValue = "cream";
var appConfig = getAppConfig();
// Get ToolTip Style from Config Element
if ( StructKeyExists(appConfig,"calendar_app_tooltip_theme") AND LEN(TRIM(appConfig['calendar_app_tooltip_theme'])) )
retValue = appConfig['calendar_app_tooltip_theme'];
return retValue;
var retValue = "Single";
var appConfig = getAppConfig();
// Set the CFdateMask from the Config Element
if ( structKeyExists(appConfig,'calendarViewPageMode') AND LEN(TRIM(appConfig['calendarViewPageMode'])) )
retValue = appConfig['calendarViewPageMode'];
return retValue;
var retValue = "MonthGrid";
var viewName = "";
var viewTypeID = "";
var appConfig = getAppConfig();
// Set the defaultCalendarView from the Config Element
if ( structKeyExists(appConfig,'defaultCalendarView') AND LEN(TRIM(appConfig['defaultCalendarView'])) ) {
viewName = appConfig['defaultCalendarView'];
viewTypeID = application.ptCalendar.calRenderViewDAO.getCalendarViewTypeIDbyName(viewName);
if ( LEN(TRIM(viewTypeID)) )
retValue = viewTypeID;
}
return retValue;
var retValue = application.ptCalendar.calRenderViewService.getCalendarViewNameList();
var appConfig = getAppConfig();
// Set the calenderViews list from the Config Element
if ( structKeyExists(appConfig,'calenderViews') AND LEN(TRIM(appConfig['calenderViews'])) )
retValue = appConfig['calenderViews'];
// TODO: For now just strip out the spaces out... should get the TypeID values by Type name
retValue = REREPLACE(retValue,"[\s]","","all");
return retValue;
var retValue = "calview";
var appConfig = getAppConfig();
//Set the CFdateMask from the Config Element
if ( structKeyExists(appConfig,'calendarViewParamName') AND LEN(TRIM(appConfig['calendarViewParamName'])) )
retValue = appConfig['calendarViewParamName'];
return retValue;
var retValue = "m/d/yyyy";
var appConfig = getAppConfig();
// Set the CFdateMask from the Config Element
if ( structKeyExists(appConfig,"CFdateMask") AND LEN(TRIM(appConfig['CFdateMask'])) )
retValue = appConfig['CFdateMask'];
// FIX for case-senstive date format masks (eg. ACF 2021)
// Limits the use of masks that require CAPS ... but should not be a problem except in an extreme case
// TODO: the mask value coming from the Config Element should be updated to be lower case
retValue = LCASE(retValue);
return retValue;
var retValue = "dddd mmmm d, yyyy";
var appConfig = getAppConfig();
// Set the CFdateMask from the Config Element
if ( structKeyExists(appConfig,"CFdateLongMask") AND LEN(TRIM(appConfig['CFdateLongMask'])) )
retValue = appConfig['CFdateLongMask'];
return retValue;
var retValue = "h:mm tt";
var appConfig = getAppConfig();
// Set the CFtimeMask from the Config Element
if ( structKeyExists(appConfig,"CFtimeMask") AND LEN(TRIM(appConfig['CFtimeMask'])) )
retValue = appConfig['CFtimeMask'];
return retValue;
var appConfig = getAppConfig();
// Get the cache type from the config element
if ( structKeyExists(appConfig,"sortFieldOrganizations") AND LEN(TRIM(appConfig['sortFieldOrganizations'])) )
return appConfig['sortFieldOrganizations'];
else
return "Name";
var appConfig = getAppConfig();
// Get the cache type from the config element
if ( structKeyExists(appConfig,"sortFieldCategories") AND LEN(TRIM(appConfig['sortFieldCategories'])) )
return appConfig['sortFieldCategories'];
else
return "Name";
var appConfig = getAppConfig();
// Get the cache type from the config element
if ( structKeyExists(appConfig,"enableEventCache") AND isBoolean(appConfig['enableEventCache']) )
return appConfig['enableEventCache'];
else
return false;
var appConfig = getAppConfig();
// Get the cache type from the config element
if ( structKeyExists(appConfig,"calendarCacheType") AND LEN(TRIM(appConfig['calendarCacheType'])) )
return appConfig['calendarCacheType'];
else
return "NA";
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"calendarCacheDSN") AND LEN(TRIM(appConfig['calendarCacheDSN'])) )
return appConfig['calendarCacheDSN'];
else
return request.site.datasource;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"calendarCacheMaxPastEvents") AND IsNumeric(appConfig['calendarCacheMaxPastEvents']) AND appConfig['calendarCacheMaxPastEvents'] GT 0 )
return appConfig['calendarCacheMaxPastEvents'];
else
return 0; // in Years - 0 is disabled
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"calendarCacheMaxFutureYears") AND IsNumeric(appConfig['calendarCacheMaxFutureYears']) AND appConfig['calendarCacheMaxFutureYears'] GT 0 )
return appConfig['calendarCacheMaxFutureYears'];
else
return 0; // in Years - 0 is disabled
var appConfig = getAppConfig();
// Get the cache type from the config element
if ( structKeyExists(appConfig,"enableEventCacheForManagement") AND isBoolean(appConfig['enableEventCacheForManagement']) )
return appConfig['enableEventCacheForManagement'];
else
return false;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"copyEventSuffix") AND LEN(TRIM(appConfig['copyEventSuffix'])) )
return appConfig['copyEventSuffix'];
else
return "";
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"brokenRecurrenceEventSuffix") AND LEN(TRIM(appConfig['brokenRecurrenceEventSuffix'])) )
return appConfig['brokenRecurrenceEventSuffix'];
else
return "";
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"enableVerboseOutput") AND IsBoolean(appConfig['enableVerboseOutput']) )
return appConfig['enableVerboseOutput'];
else
return false;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"enableDebugOutput") AND IsBoolean(appConfig['enableDebugOutput']) )
return appConfig['enableDebugOutput'];
else
return false;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"enableEventStepLogging") AND IsBoolean(appConfig['enableEventStepLogging']) )
return appConfig['enableEventStepLogging'];
else
return true; // default should be false
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"AllOrganizationsLabel") AND LEN(TRIM(appConfig['AllOrganizationsLabel'])) )
return appConfig['AllOrganizationsLabel'];
else
return "All Organizations";
return "--[all-orgs]--";
return getAllOrganizationsValue();
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"toolTipsDescriptionMaxWordCount") AND LEN(TRIM(appConfig['toolTipsDescriptionMaxWordCount'])) )
return appConfig['toolTipsDescriptionMaxWordCount'];
else
return 50;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"iCalDescriptionMaxWordCount") AND LEN(TRIM(appConfig['iCalDescriptionMaxWordCount'])) )
return appConfig['iCalDescriptionMaxWordCount'];
else
return 50;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"collapseCurrentMonthsPastEvents") AND IsBoolean(appConfig['collapseCurrentMonthsPastEvents']) )
return appConfig['collapseCurrentMonthsPastEvents'];
else
return false;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"CS_USERS_DSN") AND LEN(TRIM(appConfig['CS_USERS_DSN'])) )
return appConfig['CS_USERS_DSN'];
else
return request.site.USERSDATASOURCE;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"FilterDefaultRangeType") AND Len(Trim(appConfig['FilterDefaultRangeType'])) )
return appConfig['FilterDefaultRangeType'];
else
return "m";
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"FilterDefaultRangeQty") AND IsNumeric(appConfig['FilterDefaultRangeQty']) )
return appConfig['FilterDefaultRangeQty'];
else
return 1;
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"ManagementFilterDefaultRangeType") AND Len(Trim(appConfig['ManagementFilterDefaultRangeType'])) )
return appConfig['ManagementFilterDefaultRangeType'];
else
return "m";
var appConfig = getAppConfig();
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"ManagementFilterDefaultRangeQty") AND IsNUmeric(appConfig['ManagementFilterDefaultRangeQty']) )
return appConfig['ManagementFilterDefaultRangeQty'];
else
return 1;
var appConfig = getAppConfig();
var retStr = "(This event occurred in the past.)";
// Get the cache datasource from the config element
if ( structKeyExists(appConfig,"PastEventDisplayText") AND LEN(TRIM(appConfig['PastEventDisplayText'])) )
retStr = appConfig['PastEventDisplayText'];
return retStr;
return application.ptCalendar.calCeViewsDAO.getCEViewSpecs(ceName=arguments.ceName);
var dbType = getCSDBType();
var cacheDataSource = getCacheDatasource();
var cacheDSNExists = verifyDSNExists(dataSource=cacheDataSource);
var dbInfoQry = QueryNew('tmp');
if ( dbInfoQry.RecordCount ) {
if ( StructKeyExists(dbInfoQry,"DATABASE_PRODUCTNAME") )
dbType = dbInfoQry.DATABASE_PRODUCTNAME[1];
// For MS SQL use the Driver Name for the DbType
if ( FindNoCase("Microsoft SQL",dbType) AND StructKeyExists(dbInfoQry,"DRIVER_NAME") )
dbType = dbInfoQry.DRIVER_NAME[1];
}
return dbType;
// Get the DB Server Type
var dbType = getCSDBType();
var charType = "VARCHAR";
// Set the specific DB dataTypes
// NOTE: switch statement below is apparently not needed for SQL Server, Oracle, or MySQL 5.1 or 5.5 on ACF 9
/* switch (dbType) {
case 'Oracle':
charType = 'VARCHAR';
break;
case 'MySQL':
charType = 'CHAR';
break;
case 'SQLServer':
charType = 'VARCHAR';
break;
} */
if (dbtype neq "MySQL" and siteDBIsUnicode())
charType = replaceNoCase(charType, "varchar", "nvarchar");
return charType;
var retStruct = StructNew();
// Get column information from the View Table
var viewQry = getViewColumnFormat(ceName=arguments.ceName,viewName=arguments.viewName);
var colMetaData = ArrayNew(1);
var colName = "";
var dataType = "";
var retStr = "";
// convert the SQL dataTypes to valid dataTypes for second parameter of the CF QueryNew() function
// - Feel free add additional datatypes from other DBs to the comma-delimited CASEs
switch(arguments.dataType)
{
case "int": case "tinyint":
retStr="integer";
break;
case "bigint":
retStr="bigint";
break;
case "decimal": case "double":
retStr="decimal";
break;
case "bit":
retStr="bit";
break;
case "time": case "timestamp":
retStr="time";
break;
case "date": case "datetime2": case "smalldatetime": case "datetime":
retStr="date";
break;
// In most cases QueryNew columns from a CE View table just needs to be "varchar"
// VARCHAR, CHAR, LONGVARCHAR, etc.
default:
retStr="varchar";
}
return retStr;
var viewQry = QueryNew("temp");
SELECT *
FROM #arguments.viewName#
WHERE 1=0
return application.ptCalendar.calCeViewsDAO.buildView(ceName=arguments.ceName,viewName=arguments.viewName);
var fieldQuery = queryNew("temp");
var rtnStruct = structNew();
var itm = 1;
var thisFieldKey = "";
var thisField = "";
var thisFieldID = 0;
var thisFieldName = "";
//var thisFieldType = "";
var extrafieldData = StructNew();
// Get the Element Query by the formID
if( arguments.formID GT 0 )
{
// get the field query for this element
fieldQuery = application.ptCalendar.ceData.getElementFieldsByFormID(arguments.formID);
// loop through the query and build the default structure
for( itm=1; itm lte fieldQuery.recordCount; itm=itm+1 )
{
thisFieldID = fieldQuery.fieldID[itm];
thisField = fieldQuery.fieldName[itm];
// Replace the FIC_ from the beginning
thisFieldName = ReplaceNoCase(thisField, "FIC_", "", "all");
//thisFieldType = fieldQuery.type[itm];
extrafieldData = application.ptCalendar.ceData.getFieldDefaultValueFromID(thisFieldID);
// add this field into the return struct
// rtnStruct[thisFieldName] = thisFieldType;
// add this field and its properties to thee return struct
rtnStruct[thisFieldName] = StructNew();
if ( StructKeyExists(extrafieldData ,"type") )
rtnStruct[thisFieldName]["type"] = extrafieldData.type;
if ( StructKeyExists(extrafieldData,"label") )
rtnStruct[thisFieldName]["label"] = extrafieldData.label;
if ( StructKeyExists(extrafieldData,"required") )
rtnStruct[thisFieldName]["required"] = extrafieldData.required;
if ( StructKeyExists(extrafieldData,"maxlength") )
rtnStruct[thisFieldName]["maxlength"] = extrafieldData.maxlength;
}
}
return rtnStruct;
var formID = 0;
var rtnStruct = structNew();
if ( LEN(TRIM(arguments.ceName)) )
formID = application.ptCalendar.ceData.getFormIDByCEName(arguments.ceName);
if ( IsNumeric(formID) AND formID GT 0 )
rtnStruct = csFieldsDataTypeStruct(formID=formID);
return rtnStruct;
var inputStr = "";
for ( key in arguments ) {
if ( key NEQ "makeUnique" AND key NEQ "delimiter" )
{
if ( LEN(TRIM(arguments.delimiter)) )
inputStr = ListAppend(inputStr,TRIM(arguments[key]),arguments.delimiter);
else
inputStr = inputStr & TRIM(arguments[key]);
}
}
return generateHashedString(str=inputStr,makeUnique=arguments.makeUnique);
var isValidUniqueID = false;
var hashedStrParts = buildHashID(arguments.strA,arguments.strB,arguments.strC,arguments.strD,arguments.strE,arguments.strF,arguments.strG,false,arguments.delimiter);
if ( TRIM(arguments.hashedID) EQ TRIM(hashedStrParts) )
isValidUniqueID = true;
return isValidUniqueID;
if ( arguments.makeUnique )
arguments.str = arguments.str & "-" & CreateUUID();
return generateEncryptedString(str=arguments.str,algorithm=arguments.algorithm,oneway=true);
var encString = "";
// Additional Algorithms can be added
// - hash: CFMX_COMPAT (default), MD5, SHA, SHA-256, SHA-384,SHA-512
// - encrypt: CFMX_COMPAT (default), AES (standard edition CF), BLOWFISH, DES, and DESEDE
var validHashAlgorithms = "CFMX_COMPAT,MD5,SHA,SHA-256,SHA-384,SHA-512";
var validEncryptAlgorithms = "CFMX_COMPAT, AES, BLOWFISH, DES, DESEDE";
// Additional Encodings can be added
var validHashEncoding = "UTF-8";
var validEncryptEncoding = "Base64,hex,UU";
var algr = TRIM(arguments.algorithm);
var encd = TRIM(arguments.encoding);
if ( arguments.oneway ) {
if ( ListFindNoCase(validHashAlgorithms,algr) EQ 0 )
algr = "SHA-256";
if ( ListFindNoCase(validHashEncoding,encd) EQ 0 )
encd = "UTF-8";
encString = hash(arguments.str, algr, encd);
}
else {
if ( ListFindNoCase(validEncryptAlgorithms,alg) EQ 0 )
algr = "AES";
if ( ListFindNoCase(validEncryptEncoding,encd) EQ 0 )
encd = "UU";
encString = encrypt(arguments.str, arguments.key, algr, encd);
}
return encString;
var verifyDSN = QueryNew('tmp');
var oracleVerifyDSN = QueryNew('tmp');
var errStruct = StructNew();
var sqlFromTable = "INFORMATION_SCHEMA.TABLES"; // SQLServer and MySQL schema table name
var oracleFromTable = "USER_TAB_COLUMNS"; // Oracle schema table name
var dataSourceExists = false;
select * from #sqlFromTable# where 1 = 2
select * from #oracleFromTable# where 1 = 2
var errorDump = "";
var logFileName = errorLogFileName(processName=arguments.processName,appName=arguments.appName);
var errorStruct = StructNew();
// Add the errorDetails to the errorStruct
errorStruct.Details = arguments.errorDetails;
// Add the processName to the errorStruct
if ( LEN(TRIM(arguments.processName)) )
errorStruct.processName = arguments.processName;
// Add the methodName to the errorStruct data
if ( LEN(TRIM(arguments.methodName)) )
errorStruct.methodName = arguments.methodName;
Server.CommonSpot.addLogEntry(arguments.errorMsg,errorStruct,false,logFileName,true,false);
var logFileName = arguments.appName & "." & arguments.processName & ".errors.log";
//var logFileName = dateFormat(now(), "yyyymmdd") & "." & request.site.name & "." & arguments.appName & "_" & arguments.processName & "_Errors.htm";
return logFileName;
var logFileName = stepLogFileName(processName=arguments.processName,appName=arguments.appName);
var logPrefix = arguments.processName & ": ";
// Prepend the processName and if exists the methodName
if ( LEN(TRIM(arguments.methodName)) )
logPrefix = logPrefix & arguments.methodName & ": ";
if ( LEN(TRIM(arguments.logMsg)) )
application.ptCalendar.utils.logAppend( msg=logPrefix & arguments.logMsg, logfile=logFileName );
doStepLogData(logFilename=logFileName,logPrefix=logPrefix,logData=arguments.logData);
if ( arguments.addBreak )
application.ptCalendar.utils.logAppend( msg='#RepeatString("-",arguments.size)#', logfile=logFileName );
var logMsg = "";
if ( !IsSimpleValue(arguments.logData) )
{
logMsg = arguments.logPrefix & "Data Output: ";
application.ptCalendar.utils.logAppend( msg=logMsg, logfile=arguments.logFileName );
}
if ( IsArray(arguments.logData) AND ArrayLen(arguments.logData) )
{
doStepLogArray(logFilename=arguments.logFileName,logPrefix=arguments.logPrefix,logData=arguments.logData);
}
else if ( IsStruct(arguments.logData) AND !StructIsEmpty(arguments.logData) )
{
doStepLogStruct(logFilename=arguments.logFileName,logPrefix=arguments.logPrefix,logData=arguments.logData);
}
else if ( IsQuery(arguments.logData) AND arguments.logData.RecordCount )
{
doStepLogQuery(logFilename=arguments.logFileName,logPrefix=arguments.logPrefix,logData=arguments.logData);
}
else if ( IsSimpleValue(arguments.logData) AND LEN(TRIM(arguments.logData)) )
application.ptCalendar.utils.logAppend( msg=arguments.logPrefix & "Value = " & arguments.logData, logfile=arguments.logFileName );
if ( !IsSimpleValue(arguments.logData) )
application.ptCalendar.utils.logAppend( msg=arguments.logPrefix & "------", logfile=arguments.logFileName );
var i = 1;
var logMsg = "";
var dataName = "";
var dataValue = "";
for ( i=1; i LTE ArrayLen(arguments.logData); i=i+1 )
{
dataName = i;
dataValue = arguments.logData[i];
if ( IsSimpleValue(dataValue) )
{
logMsg = arguments.logPrefix & "[" & dataName & "]: " & dataValue;
application.ptCalendar.utils.logAppend( msg=logMsg, logfile=arguments.logFileName );
}
else
{
logMsg = arguments.logPrefix & "[" & dataName & "]: ";
doStepLogData(logFilename=arguments.logFileName,logPrefix=logMsg,logData=dataValue);
}
}
var key = "";
var logMsg = "";
var dataName = "";
var dataValue = "";
for ( key IN arguments.logData )
{
dataName = key;
dataValue = arguments.logData[key];
if ( dataName NEQ "FieldNames" )
{
if ( IsSimpleValue(dataValue) )
{
logMsg = arguments.logPrefix & "[" & dataName & "]: " & dataValue;
application.ptCalendar.utils.logAppend( msg=logMsg, logfile=arguments.logFileName );
}
else
{
logMsg = arguments.logPrefix & "[" & dataName & "]: ";
doStepLogData(logFilename=arguments.logFileName,logPrefix=logMsg,logData=dataValue);
}
}
}
var i = 1;
var logMsg = "";
var dataName = "";
var dataValue = StructNew();
application.ptCalendar.utils.logAppend( msg="#logPrefix#: Query", logfile=arguments.logFileName );
for ( i=1; i LTE arguments.logData.RecordCount; i=i+1 )
{
dataName = "Row " & i;
dataValue = application.ptCalendar.data.queryRowToStruct(query=arguments.logData,rowNum=i);
logMsg = arguments.logPrefix & "--" & dataName & "-- ";
doStepLogStruct(logFilename=arguments.logFileName,logPrefix=logMsg,logData=dataValue);
}
var logFileName = dateFormat(now(), "yyyymmdd") & "." & request.site.name & "." & arguments.appName & "." & arguments.processName & ".step.log";
return logFileName;