<%
'SUBROUTINES DEFINED:
'"""""""""""""""""""
'SetupSessionVariables(AuthUser)		Sets up the session variables
'GetSessionStatusStr()					Returns the error string associated with the session error code
'SetError(Message)						Sets the text of the main error message
'SetReason(Message)						Sets the text of the reason paragraph
'AddFix(Message)						Adds an item to the bulleted list of suggestions
'Check_Browser_Capabilities()			Sets error if the Client browser lacks Tables and JavaScript support
'Invalid_Password()						Sets an error due to an invalid password
'IsConfID()								Sets error if the Conference ID is not set (inConfID)
'ValidateMeetingID()					Sets error if the DCS Meeting ID is not valid (inMeetingID)
'Verify_ConfLocator()					Verifies ConfLocator points to the Conference Locator
'DisplayErrorPage()						Setup the error page when we have an error
'
'FUNCTIONS DEFINED:
'"""""""""""""""""
'CheckSetError(Source, Description) Checks for error values in Result/Err and adds error messages if appropriate
'
' ================================ CONSTANTS =================================================
'ERROR CONSTANTS:
'C++ returns HRESULTS as 4-byte signed ints, so the bit pattern
'0x81000203 comes out as a negative number.
'VBScript also uses 4-byte signed ints, so assigning the bit patterns
'as below makes for better readability while still giving the 
'same negative numbers.
'If VBScript ever changes to use ints larger than 4 bytes, the
'bit patterns below will be interpreted as positive numbers and
'will have to be changed to explicitly reference the negative
'number returned by C++.
CONST E_CMS_EVENTMANAGER_NOT_INITIALIZED                = &H8004100A
CONST E_CMS_CONFERENCE_NOT_SCHEDULED                    = &H8004100B
CONST E_CMS_CONFERENCE_NOT_STARTED                      = &H8004100C
CONST E_CMS_CONFERENCE_NOT_RUNNING                      = &H8004100D
CONST E_CMS_CONFERENCE_NOT_FOUND                        = &H8004100E
CONST E_CMS_INVALID_CONFERENCE_PASSWORD                 = &H8004100F
CONST E_CMS_ANONYMOUS_USER_DENIED_ACCESS                = &H80041010
CONST E_CMS_USER_DENIED_ACCESS                          = &H80041011
CONST E_CMS_CTP_JOIN_REQUEST_FAILED                     = &H80041012
CONST E_CMS_PROVIDER_NOT_INITIALIZED                    = &H80041013
CONST E_CMS_PROVIDER_NOT_FOUND                          = &H80041014
CONST E_CMS_E_CONFERENCE_NOT_EXIST                      = &H80041015
CONST E_CMS_RECURRING_CONFERENCE_NOT_FOUND              = &H80041016
CONST E_CMS_NOT_HOST_SERVER                             = &H80041017
CONST E_CMS_RECURRING_INSTANCE_NOT_WITHIN_TIME_BOUND    = &H80041018
CONST E_CMS_AMBIGUOUS_RECURRING_JOIN                    = &H80041019
CONST E_CMS_TIME_EXTENSIONS_NOT_ALLOWED                 = &H8004101B
CONST E_CMS_RESOURCE_EXTENSIONS_NOT_ALLOWED             = &H8004101C
CONST E_CMS_SERVER_NOT_INITIALIZED                      = &H80041037
CONST E_CMS_PROFILE_STORE_NOT_INITIALIZED               = &H80041038
CONST E_CMS_SHUTTING_DOWN                               = &H4101E

CONST E_DCS_NO_MCUS_AVAILABLE                           = &H8004F001
CONST E_DCS_CONFERENCE_NOT_RUNNING                      = &H8004F002
CONST E_DCS_CONFERENCE_ALREADY_ENDED                    = &H8004F003
CONST E_DCS_ACCESS_DENIED_CAPACITY_LIMIT                = &H8004F004
CONST E_DCS_NO_PROXY_MCUS_AVAILABLE                     = &H8004F005
CONST E_DCS_NO_INTERNET_MCUS_AVAILABLE                  = &H8004F006
CONST E_DCS_NOT_RUNNING                                 = &H8004F007
CONST E_DCS_NOT_INIT                                    = &H8004F008

CONST E_NETMEETING_ERRORS_MASK                          = &H80040300
CONST E_NETMEETING_INVITE_FAILURE                       = &H8004036A
CONST E_NETMEETING_INVITE_TIMEOUT                       = &H80040372

CONST E_PKCS7_NO_CERT_STORE                             = &H80043000
CONST E_SESSION_UNAVAILABLE                             = &H80043001
CONST E_NO_DISPLAY_STATE                                = &H80043002
CONST E_UNSUPPORTED_TABLES_BROWSER                      = &H80043003
CONST E_UNSUPPORTED_JAVASCRIPT_BROWSER                  = &H80043004

CONST E_ACCESS_DENIED                                   = 70 '&H80070005 comes across as error 70 if returned
CONST E_ACCESS_DENIED_HRESULT                           = &H80070005 'if passed back as a result
CONST E_SERVER_CREATE_OBJECT                            = &H800401F3 'Server.CreateObject() error
CONST NM_E_NOT_ACTIVE                                   = &H81000203 'NetMeeting was closed since last use
CONST E_NO_GLOBAL_CONF_CALENDAR                         = &H80010105
CONST E_DSGETSITENAME_NO_SITE                           = &H8007077F
CONST E_MANUAL_JOIN_INSTRUCTIONS                        = &H80040100
CONST E_CMS_RESTARTED                                   = &H1CE

CONST E_MCU_HANG                                        = &H800706BA
CONST E_MCU_NO_SERVER_CERTIFICATE                       = &H80070546

'DISPLAY STATE CONTANTS:
'These define the various display states that can be used
'The quotes are required because the state is passed as a string
'The DCS programmatically uses {0,7,8} so those cannot easily be changed
CONST DISPLAY_JOIN                      = "0"
CONST DISPLAY_JOIN_PASSWORD             = "6"
CONST DISPLAY_PREJOIN                   = "7"
CONST DISPLAY_POSTJOIN                  = "8"
CONST DISPLAY_NO_MADCAP_SERVERS         = "9"
CONST DISPLAY_TOO_MANY_USERS            = "10"
CONST DISPLAY_ALL_MADCAP_SERVERS_FAILED = "11"
CONST DISPLAY_NO_MADCAP_SERVERS_MATCH_SCOPE = "12"
CONST DISPLAY_NO_MADCAP_SCOPES_FOUND    = "13"
CONST DISPLAY_NO_SCOPES_IN_RESOURCE     = "14"
CONST DISPLAY_MAX_JOIN_TYPES            = "14"
CONST DISPLAY_MULTICAST_CLIENT          = "15"
CONST DISPLAY_H323_CLIENT               = "16"
CONST DISPLAY_OLDER_H323_CLIENT         = "51"
CONST DISPLAY_NO_AUDIOVIDEO_CLIENT      = "52"
CONST DISPLAY_NO_AUDIOVIDEO_ACTIVEX     = "53"

CONST DISPLAY_WELCOME                   = "11"
CONST DISPLAY_RECURRING                 = "14"
CONST DISPLAY_AGENDA                    = "17"
CONST DISPLAY_MODIFY                    = "18"
CONST DISPLAY_MAX_NO_JOIN_TYPES         = "19"

CONST DISPLAY_MIN_ERR_TYPES             = "20"
CONST DISPLAY_ERR_CONFID                = "22"
CONST DISPLAY_ERR_CTP_STARTUP           = "23"
CONST DISPLAY_ERR_VALUE                 = "38"
CONST DISPLAY_MAX_ERR_TYPES             = "39"

'SESSION VARIABLE CONSTANTS
CONST SESSION_CONFPROFILE            = "ConfProfile"
CONST SESSION_CONFLOCATOR            = "ConfLocator"
CONST SESSION_CMSZONE                = "CMSZone"
CONST SESSION_CMSCONFIG              = "CMSConfig"
CONST SESSION_MEETINGID              = "MeetingID"
CONST SESSION_RESULT                 = "Result"
CONST SESSION_ERRNUMBER              = "ErrNumber"
CONST SESSION_ERRSOURCE              = "ErrSource"
CONST SESSION_ERRDESCRIPTION         = "ErrDescription"
CONST SESSION_STATUS                 = "Status"
CONST SESSION_ATTENDEE               = "Attendee"
CONST SESSION_PASSWORD				 = "Password"

CONST L_Page_HTMLTitle       = "Microsoft Exchange-Konferenzen"
CONST L_ErrorPage_HTMLTitle  = "Fehler bei einer Microsoft Exchange-Konferenz"
CONST L_TryTheFollowing_Text = "Bitte probieren Sie Folgendes aus:"

'Session debugging/status information strings (must stay the same as global.asa)
CONST L_OK_Text                 = "OK"
CONST L_GetConfLocator_Text     = "Fehler beim Beziehen des Konferenzlocators aus der Konferenzverwaltungszone"
CONST L_GetZone_Text            = "Fehler beim Lokalisieren der Zone des Konfigurationsobjekts der Konferenzverwaltung"
CONST L_CreateObject_Text       = "Fehler beim Initialisieren des Konfigurationsobjekts der Konferenzverwaltung"
CONST L_Unknown_Text            = "Unbekannt"
CONST L_Uninitialized_Text      = "Nicht initialisiert"

'Common strings
CONST L_MCUProxyInvite_ErrorMessage     = "Wenn Sie versuchen, sich der Konferenz über einen Proxyserver anzuschließen, kann der Datenkonferenzdienst möglicherweise keine Verbindung zu Ihrem Clientprogramm aufbauen. Um Ihren Datenkonferenzclient manuell zu verbinden, verwenden Sie die folgenden Informationen:"
CONST L_ManualJoinServer_ErrorMessage   = "Datenkonferenzserver: "
CONST L_ManualJoinID_ErrorMessage       = "Konferenz-ID: "
CONST L_ManualJoinPassword_ErrorMessage = "Konferenzkennwort: "
CONST L_NetMeetingInviteTitle_ErrorMessage  = "Einladungsfehler bei Datenkonferenz"
CONST L_NetMeetingInviteReason_ErrorMessage = "Der Datenkonferenzdienst war nicht in der Lage, Ihr T.120-Clientprogramm (zum Beispiel Microsoft NetMeeting) zur Konferenz einzuladen."
CONST L_NetMeetingInviteFix1_ErrorMessage   = "Stellen Sie sicher, dass Sie Ihren Client gestartet haben, und versuchen Sie dann erneut, sich der Konferenz anzuschließen."
CONST L_LinkToConferenceListsFix_ErrorMessage  = "Wählen Sie eine aktuelle Konferenz aus der "
CONST L_LinkToConferenceListsFix2_ErrorMessage = "Liste der verfügbaren Besprechungen aus."

CONST PR_SUBJECT             = "subject"   'Defines the subject property code for user properties
CONST PR_BODY                = "268435487" 'Defines the body text property code for user properties
CONST PR_BODY_HTML           = "269680670" 'Defines the body text (in HTML) property code for user properties
CONST MAPI_RESOURCE          = "MAPI"      'Defines the resource used when getting user properties

CONST CONF_ID_CODED_LENGTH   = 255 'Length of the Base-64 encoded conference ID
CONST CONF_ID_DECODED_LENGTH = 22 'Conference ID must be 22 digits

' ================================ VARIABLES =================================================
'ERROR VARIABLES:
DIM ErrorMsg        'Holds the main error message (displayed at the top of the error page)
DIM Reason          'Holds the paragraph description of the error (displayed below the main message)
DIM Fixes()         'Holds the suggested remedies (displayed in the bulleted list below the paragraph)
DIM HiddenError     'Holds the system-level error message (displayed in small print at the bottom)
DIM ErrorCount      'Counts the errors encountered (0 or 1)
DIM Result          'Global variable used for function return values
DIM SessionErr(5)   'Holds the error messages that are defined in the session variables code to allow localization

' =============================== INITIALIZATION ==============================================
ErrorMsg        = ""
HiddenError     = ""
Reason          = ""
ErrorCount      = 0
Result          = 0
SessionErr(0)   = L_OK_Text
SessionErr(1)   = L_GetConfLocator_Text
SessionErr(2)   = L_GetZone_Text
SessionErr(3)   = L_CreateObject_Text
SessionErr(4)   = L_Unknown_Text
SessionErr(5)   = L_Uninitialized_Text
REDIM Fixes(0)                          'Puts the array Fixes in a known state

' ================================ FUNCTIONS =================================================
'== SUB: Sets up the session variables (GetSessionStatusStr() is used for SESSION_STATUS strings)
SUB SetupSessionVariables(AuthUser)
    ON ERROR RESUME NEXT

    DIM CMSConfiguration
    DIM CMSZone
    DIM ConfLocator
    
    Session(SESSION_RESULT)          = 0
    Session(SESSION_ERRNUMBER)       = 0
    Session(SESSION_ERRSOURCE)       = 0
    Session(SESSION_ERRDESCRIPTION)  = 0
    Session(SESSION_STATUS)          = 5 'L_Uninitialized_Text
    
    'Create the CMS Configuration object (dllhost will create this from xcmsadm)
    SET CMSConfiguration = Server.CreateObject("XCMSCOM.CMSConfiguration")
    
    IF (0 <> Err.Number) THEN
        Session(SESSION_ERRNUMBER)      = Err.Number
        Session(SESSION_ERRSOURCE)      = Err.Source
        Session(SESSION_ERRDESCRIPTION) = Err.Description
        Err.Clear()
        Session(SESSION_STATUS)         = 3 'L_CreateObject_Text
        EXIT SUB
    END IF
    
    SET Session(SESSION_CMSCONFIG) = CMSConfiguration 'Save the singleton CMSConfig for up to 20 mins
    
    'Create the CMS Zone object (dllhost will create this from xcmsadm)
    CALL CMSConfiguration.GetZone("", CMSZone)
    
    IF (0 <> Err.Number) THEN
        Session(SESSION_RESULT)         = Err.Number
        Session(SESSION_ERRNUMBER)      = Err.Number
        Session(SESSION_ERRSOURCE)      = Err.Source
        Session(SESSION_ERRDESCRIPTION) = Err.Description
        Err.Clear()
        Session(SESSION_STATUS)         = 2 'L_GetZone_Text
        EXIT SUB
    END IF
    
    SET Session(SESSION_CMSZONE) = CMSZone 'Save the CMS Zone object for use later
    
    'Create the Conference Locator object (dllhost will create this from the xconfmgr service)
    CALL CMSZone.GetConferenceLocator(ConfLocator)
    
    IF (0 <> Err.Number) THEN
        Session(SESSION_RESULT)         = Err.Number
        Session(SESSION_ERRNUMBER)      = Err.Number
        Session(SESSION_ERRSOURCE)      = Err.Source
        Session(SESSION_ERRDESCRIPTION) = Err.Description
        Err.Clear()
        Session(SESSION_STATUS)         = 1 'L_GetConfLocator_Text
        EXIT SUB
    END IF

	Session(SESSION_ATTENDEE)		 = AuthUser
	    
    SET Session(SESSION_CONFLOCATOR) = ConfLocator 'Save the Conference Locator for use later
    Session(SESSION_STATUS)          = 0 'L_OK_Text
END SUB

'== SUB: Creates the session status string that we use on the bottom of the error pages
FUNCTION GetSessionStatusStr(errVal)
    IF (errVal >= 0 AND errVal <= 5) THEN
        GetSessionStatusStr = SessionErr(errVal)
    ELSE
        GetSessionStatusStr = errVal
    END IF
END FUNCTION

'== SUB: Sets the text of the main error message
SUB SetError(Message, Value, Source, Description)
    IF (0 = ErrorCount) THEN
        ErrorCount  = ErrorCount + 1
        ErrorMsg    = ErrorMsg & Message
        HiddenError = HiddenError & Source & " Error #" & Hex(Value) & ": " & Description & vbNewLine
    END IF
END SUB

'== SUB: Sets the text of the reason paragraph
SUB SetReason(Message)
    Reason = Message
END SUB

'== SUB: Adds an item to the bulleted list of suggestions
SUB AddFix(Message)
    DIM NewSize
    
    NewSize = UBound(Fixes) + 1
    REDIM PRESERVE Fixes(NewSize)
    
    Fixes(NewSize) = Message
END SUB

'== FUNCTION: Checks for error values in Result/Err and adds error messages if appropriate
FUNCTION CheckSetError(ResultSource, ResultDescription)
    DIM Value, Source, Description
    
    IF (0 <> Err.Number) THEN
        Value       = Err.Number
        Source      = Err.Source & " / [" & ResultSource & "]"
        Description = Err.Description & " / [" & ResultDescription & "]"
        Err.Clear()
    ELSEIF (0 <> Result) THEN
        IF (IsNumeric(Result)) THEN
            Value = CDbl(Result)
        ELSE
            Value = Result
        END IF
        Source      = ResultSource
        Description = ResultDescription
        Result      = 0
    ELSE
        CheckSetError = FALSE
        EXIT FUNCTION
    END IF

    'Bitwise-AND to detect all NetMeeting errors
    IF (E_NETMEETING_ERRORS_MASK = (E_NETMEETING_ERRORS_MASK AND Value)) THEN

        IF (E_NETMEETING_INVITE_FAILURE = Value) THEN
            
            CALL SetError(L_NetMeetingInviteTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NetMeetingInviteReason_ErrorMessage)
            CALL AddFix(L_NetMeetingInviteFix1_ErrorMessage)
            CALL AddFix(L_MCUProxyInvite_ErrorMessage)
            CALL AddFix(L_ManualJoinServer_ErrorMessage & Session("MCUAddress"))
            CALL AddFix(L_ManualJoinID_ErrorMessage & Request.QueryString("ID"))
            CALL AddFix(L_ManualJoinPassword_ErrorMessage & Session(SESSION_PASSWORD))
        ELSEIF (E_NETMEETING_INVITE_TIMEOUT = Value) THEN
            CONST L_NetMeetingInviteTimeoutTitle_ErrorMessage  = "Einladungstimeout für Datenkonferenz"
            CONST L_NetMeetingInviteTimeoutReason_ErrorMessage = "Die vom Datenkonferenzserver gesendete Einladung ist abgelaufen, während der Server versuchte, Ihren Client (zum Beispiel, Microsoft NetMeeting) zur Konferenz einzuladen."
            CONST L_NetMeetingInviteTimeoutFix1_ErrorMessage   = "Treten Sie der Konferenz erneut bei, und akzeptieren Sie die Einladung des Servers. Sie müssen die Einladung möglicherweise in den Vordergrund einblenden, da sie hinter dem aktiven Fenster auf Ihrem Desktop verborgen sein kann."
            
            CALL SetError(L_NetMeetingInviteTimeoutTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NetMeetingInviteTimeoutReason_ErrorMessage)
            CALL AddFix(L_NetMeetingInviteTimeoutFix1_ErrorMessage)
            CALL AddFix(L_MCUProxyInvite_ErrorMessage)
            CALL AddFix(L_ManualJoinServer_ErrorMessage & Session("MCUAddress"))
            CALL AddFix(L_ManualJoinID_ErrorMessage & Request.QueryString("ID"))
            CALL AddFix(L_ManualJoinPassword_ErrorMessage & Session(SESSION_PASSWORD))
        ELSE
            CONST L_NetMeetingMaskTitle_ErrorMessage  = "NetMeeting-Konflikt"
            CONST L_NetMeetingMaskReason_ErrorMessage = "NetMeeting übernimmt die Steuerung der Ressourcen auf Ihrem Computer oder funktioniert auf andere Weise nicht einwandfrei."
            CONST L_NetMeetingMaskFix1_ErrorMessage   = "Bitte fahren Sie andere Programme herunter, die einen Konflikt mit NetMeeting hervorrufen könnten (Video-/Audio-/Netzwerkprogramme)."
            
            CALL SetError(L_NetMeetingMaskTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NetMeetingMaskReason_ErrorMessage)
            CALL AddFix(L_NetMeetingMaskFix1_ErrorMessage)
            CALL AddFix(L_MCUProxyInvite_ErrorMessage)
            CALL AddFix(L_ManualJoinServer_ErrorMessage & Session("MCUAddress"))
            CALL AddFix(L_ManualJoinID_ErrorMessage & Request.QueryString("ID"))
            CALL AddFix(L_ManualJoinPassword_ErrorMessage & Session(SESSION_PASSWORD))
        END IF

        EXIT FUNCTION
    END IF

    SELECT CASE Value
        CASE E_CMS_EVENTMANAGER_NOT_INITIALIZED,E_CMS_SERVER_NOT_INITIALIZED
            CONST L_EventManagerNotInitializedTitle_ErrorMessage  = "Der Server wurde nicht initialisiert."
            CONST L_EventManagerNotInitializedReason_ErrorMessage = "Der Exchange-Konferenzdienst wird gerade gestartet und hat diesen Prozess noch nicht abgeschlossen."
            CONST L_EventManagerNotInitializedFix1_ErrorMessage   = "Warten Sie einige Minuten, und versuchen Sie es dann erneut."
            
            CALL SetError(L_EventManagerNotInitializedTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_EventManagerNotInitializedReason_ErrorMessage)
            CALL AddFix(L_EventManagerNotInitializedFix1_ErrorMessage)
        
        CASE E_CMS_PROFILE_STORE_NOT_INITIALIZED
            CONST L_ServerOrProfileStoreNotInitializedTitle_ErrorMessage    = "Serverspeicher nicht initialisiert"
            CONST L_ServerOrProfileStoreNotInitializedReason_ErrorMessage   = "Exchange Conferencing Server  wurde nicht initialisiert."
            CONST L_ProfileStoreNotInitializedFix1_ErrorMessage             = "Wenden Sie sich an Ihren Systemadministrator. Das globale Kalenderpostfach ist eventuell nicht verfügbar."
                        
            CALL SetError(L_ServerOrProfileStoreNotInitializedTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ServerOrProfileStoreNotInitializedReason_ErrorMessage)
            CALL AddFix(L_ProfileStoreNotInitializedFix1_ErrorMessage)

        CASE E_CMS_CONFERENCE_NOT_RUNNING
            CONST L_ConferenceNotRunningCMSTitle_ErrorMessage  = "Die Konferenz wird nicht ausgeführt."
            CONST L_ConferenceNotRunningCMSReason_ErrorMessage = "Entweder ist die Konferenz, der Sie sich anschließen wollten, nicht bereit, oder ein Konferenztechnologieanbieter hat den Beginn der Konferenz nicht gestattet."
            CONST L_ConferenceNotRunningCMSFix1_ErrorMessage   = "Warten Sie einige Minuten, und versuchen Sie es dann erneut."
            
            CALL SetError(L_ConferenceNotRunningCMSTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConferenceNotRunningCMSReason_ErrorMessage)
            CALL AddFix(L_ConferenceNotRunningCMSFix1_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")

        CASE E_CMS_CONFERENCE_NOT_SCHEDULED
            CONST L_ConferenceNotScheduledTitle_ErrorMessage  = "Ungeplante Konferenz."
            CONST L_ConferenceNotScheduledReason_ErrorMessage = "Diese Konferenz (definiert durch die Treff-ID des URLs) wurde vom Exchange-Konferenzdienst nicht eingeplant."
            CONST L_ConferenceNotScheduledFix1_ErrorMessage   = "Die Konferenz wurde möglicherweise gelöscht, oder die Konferenz-ID ist beschädigt."
            CONST L_ConferenceNotScheduledFix2_ErrorMessage   = "Wenden Sie sich an den Organisator der Konferenz oder an Ihren Systemadministrator."
            
            CALL SetError(L_ConferenceNotScheduledTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConferenceNotScheduledReason_ErrorMessage)
            CALL AddFix(L_ConferenceNotScheduledFix1_ErrorMessage)
            CALL AddFix(L_ConferenceNotScheduledFix2_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")
        
        CASE E_CMS_CONFERENCE_NOT_STARTED
            CONST L_ConferenceNotStartedTitle_ErrorMessage  = "Die Konferenz wurde nicht gestartet."
            CONST L_ConferenceNotStartedReason_ErrorMessage = "Die Konferenz befindet sich in der Startphase, hat den Startvorgang jedoch noch nicht abgeschlossen."
            CONST L_ConferenceNotStartedFix1_ErrorMessage   = "Warten Sie einige Minuten, und versuchen Sie es dann erneut."
            
            CALL SetError(L_ConferenceNotStartedTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConferenceNotStartedReason_ErrorMessage)
            CALL AddFix(L_ConferenceNotStartedFix1_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")

        CASE E_CMS_CONFERENCE_NOT_FOUND,E_CMS_RECURRING_INSTANCE_NOT_WITHIN_TIME_BOUND,E_CMS_AMBIGUOUS_RECURRING_JOIN,E_CMS_E_CONFERENCE_NOT_EXIST,1 'S_FALSE
            CONST L_ConferenceNotFoundTitle_ErrorMessage  = "Die Konferenz wurde nicht gefunden."
            CONST L_ConferenceNotFoundReason_ErrorMessage = "Der Konferenzverwaltungsdienst kann die Konferenz nicht finden, der Sie sich anschließen möchten."
            CONST L_ConferenceNotFoundFix1_ErrorMessage   = "Wenn die Konferenz kurz zuvor eingeplant worden ist, warten Sie einige Minuten, und versuchen Sie es dann erneut."
            CONST L_ConferenceNotFoundFix2_ErrorMessage   = "Wenden Sie sich an den Konferenzorganisator. Die Konferenz ist möglicherweise abgesagt worden."
            CONST L_ConferenceNotFoundFix3_ErrorMessage   = "Prüfen Sie nach, ob die im URL des Browsers angezeigte Treff-ID mit der Treff-ID Ihrer Konferenz identisch ist."
            CONST L_ConferenceNotFoundFix4_ErrorMessage   = "Wenn es sich um eine wiederkehrende Konferenz handelt, gab es möglicherweise Probleme beim Auflösen der einzelnen Vorkommen."
            
            CALL SetError(L_ConferenceNotFoundTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConferenceNotFoundReason_ErrorMessage)
            CALL AddFix(L_ConferenceNotFoundFix1_ErrorMessage)
            CALL AddFix(L_ConferenceNotFoundFix2_ErrorMessage)
            CALL AddFix(L_ConferenceNotFoundFix3_ErrorMessage)
            CALL AddFix(L_ConferenceNotFoundFix4_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")

        CASE E_CMS_SHUTTING_DOWN
            CONST L_ConfServerShuttingDownTitle_ErrorMessage  = "Konferenzverwaltungsdienst wird heruntergefahren"
            CONST L_ConfServerShuttingDownReason_ErrorMessage = "Der Konferenzverwaltungsdienst wird heruntergefahren."
            CONST L_ConfServerShuttingDownFix1_ErrorMessage   = "Warten Sie einige Minuten, bis der Dienst neu gestartet worden ist, damit die Konferenz fortgesetzt werden kann."
            CONST L_ConfServerShuttingDownFix2_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_ConfServerShuttingDownTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConfServerShuttingDownReason_ErrorMessage)
            CALL AddFix(L_ConfServerShuttingDownFix1_ErrorMessage)
            CALL AddFix(L_ConfServerShuttingDownFix2_ErrorMessage)

        CASE E_CMS_INVALID_CONFERENCE_PASSWORD
            CONST L_InvalidConferencePasswordTitle_ErrorMessage  = "Ungültiges Konferenzkennwort"
            CONST L_InvalidConferencePasswordReason_ErrorMessage = "Der Konferenzverwaltungsdienst hat Ihre Anforderung, sich der Konferenz anzuschließen, aufgrund eines ungültigen Kennworts zurückgewiesen."
            CONST L_InvalidConferencePasswordFix1_ErrorMessage   = "Prüfen Sie nach, ob Sie das richtige Konferenzkennwort eingegeben haben."

            CALL SetError(L_InvalidConferencePasswordTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_InvalidConferencePasswordReason_ErrorMessage)
            CALL AddFix(L_InvalidConferencePasswordFix1_ErrorMessage)
        
        CASE E_CMS_ANONYMOUS_USER_DENIED_ACCESS
            CONST L_AnonymousUserDeniedAccessTitle_ErrorMessage  = "Anonymer Zugriff verweigert."
            CONST L_AnonymousUserDeniedAccessReason_ErrorMessage = "Der Konferenzverwaltungsdienst hat Ihre Anforderung, sich der Konferenz anzuschließen, zurückgewiesen, weil Sie nicht identifiziert werden können."
            CONST L_AnonymousUserDeniedAccessFix1_ErrorMessage   = "Stellen Sie sicher, dass Sie nicht versuchen, Zugang zu einer privaten Konferenz zu erhalten, zu der Sie nicht eingeladen worden sind."
            CONST L_AnonymousUserDeniedAccessFix2_ErrorMessage   = "Stellen Sie sicher, dass Sie sich mit ihrer eigenen Identität an das Netzwerk angemeldet haben, damit Sie identifiziert werden können."

            CALL SetError(L_AnonymousUserDeniedAccessTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_AnonymousUserDeniedAccessReason_ErrorMessage)
            CALL AddFix(L_AnonymousUserDeniedAccessFix1_ErrorMessage)
            CALL AddFix(L_AnonymousUserDeniedAccessFix2_ErrorMessage)
        
        CASE E_CMS_USER_DENIED_ACCESS
            CONST L_UserDeniedAccessTitle_ErrorMessage  = "Zugriff verweigert."
            CONST L_UserDeniedAccessReason_ErrorMessage = "Der Konferenzverwaltungsdienst hat Ihre Anforderung, an der Konferenz teilzunehmen, zurückgewiesen, weil Sie nicht über eine für die Teilnahme erforderliche Berechtigung verfügen. "
            CONST L_UserDeniedAccessFix1_ErrorMessage   = "Stellen Sie sicher, dass Sie nicht versuchen, Zugang zu einer privaten Konferenz zu erhalten, zu der Sie nicht eingeladen worden sind. Sehen Sie sich die Originaleinladung zu der Besprechung an, und stellen Sie sicher, dass 'Externe Teilnehmer zulassen' aktiviert ist. Stellen Sie außerdem sicher, dass sich Ihr Benutzername in der 'An'- oder 'CC'-Liste der Einladung befindet und dass Sie als dieser Benutzer für den Server authentifiziert sind."
            CONST L_UserDeniedAccessFix2_ErrorMessage   = "Die Berechtigungen des virtuellen Stammverzeichnisses der Konferenz sind möglicherweise falsch festgelegt worden, oder der Konferenzverwaltungsdienst erzwingt Clientauthentifizierung für private Konferenzen (dies bedeutet, dass die Einstellung 'Zugriff auf private Besprechungsseiten authentifizieren' aktiviert ist)."

            CALL SetError(L_UserDeniedAccessTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_UserDeniedAccessReason_ErrorMessage & Request.ServerVariables("AUTH_USER"))
            CALL AddFix(L_UserDeniedAccessFix1_ErrorMessage)
            CALL AddFix(L_UserDeniedAccessFix2_ErrorMessage)

        CASE E_CMS_CTP_JOIN_REQUEST_FAILED
            CONST L_CTPJoinRequestFailedTitle_ErrorMessage  = "CTP-Beitrittsanforderung fehlgeschlagen"
            CONST L_CTPJoinRequestFailedReason_ErrorMessage = "Das Konferenzverwaltungssystem hat Ihre Anforderung zurückgewiesen, weil der Konferenztechnologieanbieter den Beitritt zur Konferenz nicht gestattet hat."
            CONST L_CTPJoinRequestFailedFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."

            CALL SetError(L_CTPJoinRequestFailedTitle_ErrorMessage, Value, Replace(Request.QueryString("PNAME"), "+"," "), Description)
            CALL SetReason(L_CTPJoinRequestFailedReason_ErrorMessage)
            CALL AddFix(L_CTPJoinRequestFailedFix1_ErrorMessage)
        
        CASE E_CMS_PROVIDER_NOT_INITIALIZED
            CONST L_ProviderNotInitializedTitle_ErrorMessage  = "Der Anbieter wurde nicht initialisiert."
            CONST L_ProviderNotInitializedReason_ErrorMessage = "Das Konferenzverwaltungssystem hat Ihre Anforderung zurückgewiesen, weil die Initialisierung des Konferenztechnologieanbieters noch nicht abgeschlossen ist."
            CONST L_ProviderNotInitializedFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."

            CALL SetError(L_ProviderNotInitializedTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ProviderNotInitializedReason_ErrorMessage)
            CALL AddFix(L_ProviderNotInitializedFix1_ErrorMessage)
        
        CASE E_CMS_PROVIDER_NOT_FOUND
            CONST L_ProviderNotFoundTitle_ErrorMessage  = "Der Anbieter wurde nicht gefunden."
            CONST L_ProviderNotFoundReason_ErrorMessage = "Das Konferenzverwaltungssystem hat Ihre Anforderung zurückgewiesen, weil ein Konferenztechnologieanbieter nicht erreicht werden kann."
            CONST L_ProviderNotFoundFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."

            CALL SetError(L_ProviderNotFoundTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ProviderNotFoundReason_ErrorMessage)
            CALL AddFix(L_ProviderNotFoundFix1_ErrorMessage)
        
        CASE E_CMS_RECURRING_CONFERENCE_NOT_FOUND
            CONST L_RecurringConferenceNotFoundTitle_ErrorMessage  = "Die wiederkehrende Konferenz wurde nicht gefunden."
            CONST L_RecurringConferenceNotFoundReason_ErrorMessage = "Der Konferenzverwaltungsdienst hat Ihre Anforderung zurückgewiesen, weil er die gewünschte wiederkehrende Konferenz nicht finden kann."
            CONST L_RecurringConferenceNotFoundFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."

            CALL SetError(L_RecurringConferenceNotFoundTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_RecurringConferenceNotFoundReason_ErrorMessage)
            CALL AddFix(L_RecurringConferenceNotFoundFix1_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")
        
        CASE E_CMS_NOT_HOST_SERVER
            CONST L_NotHostServerTitle_ErrorMessage  = "Ungültiger Host-URL."
            CONST L_NotHostServerReason_ErrorMessage = "Der Konferenzverwaltungsdienst hat Ihre Anforderung zurückgewiesen, weil es sich bei diesem Server nicht um den Hostserver handelt."
            CONST L_NotHostServerFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."

            CALL SetError(L_NotHostServerTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NotHostServerReason_ErrorMessage)
            CALL AddFix(L_NotHostServerFix1_ErrorMessage)

        CASE E_DCS_NO_MCUS_AVAILABLE
            CONST L_NoAvailableMCUsTitle_ErrorMessage  = "Kein T.120-MCU-Server verfügbar"
            CONST L_NoAvailableMCUsReason_ErrorMessage = "Der Datenkonferenzdienst ist nicht verfügbar oder aber so konfiguriert, dass er keine T.120 MCU-Serververbindung mit Ihrer Adresse zulässt. Um einer Konferenz beizutreten, muss Ihr Datenkonferenzclient (zum Beispiel NetMeeting) eine Verbindung zu einem T.120 MCU-Server herstellen."
            CONST L_NoAvailableMCUsFix1_ErrorMessage   = "Wenn das Problem fortbesteht, wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_NoAvailableMCUsTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NoAvailableMCUsReason_ErrorMessage)
            CALL AddFix(L_NoAvailableMCUsFix1_ErrorMessage)

        CASE E_DCS_NO_PROXY_MCUS_AVAILABLE
            CONST L_NoAvailableProxyMCUsTitle_ErrorMessage  = "Kein Proxy-T.120-MCU-Server verfügbar"
            CONST L_NoAvailableProxyMCUsReason_ErrorMessage = "Die Konferenz, der Sie sich anschließen möchten, ist entweder nicht verfügbar oder aber so konfiguriert, dass er von Ihrem Windows 2000-Standort aus keine T.120 MCU-Proxyserververbindung  zulässt.  Für die Herstellung einer Verbindung zu einer Konferenz an einem anderen Standort ist eine Verbindung zu einem T.120 MCU-Proxyserver erforderlich."
            CONST L_NoAvailableProxyMCUsFix1_ErrorMessage   = "Wenn das Problem fortbesteht, wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_NoAvailableProxyMCUsTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NoAvailableProxyMCUsReason_ErrorMessage)
            CALL AddFix(L_NoAvailableProxyMCUsFix1_ErrorMessage)

        CASE E_DCS_NO_INTERNET_MCUS_AVAILABLE
            CONST L_NoAvailableInternetMCUsTitle_ErrorMessage  = "Kein Internet-T.120-MCU-Server verfügbar"
            CONST L_NoAvailableInternetMCUsReason_ErrorMessage = "Die Datenkonferenz, der Sie sich anschließen möchten, ist entweder nicht verfügbar oder aber so konfiguriert, dass sie keine T.120 MCU-Internetserververbindung von außerhalb der Organisation zulässt. Für die Herstellung einer Verbindung zu einer Konferenz in einer anderen Organisation ist eine Verbindung zu einem T.120MCU-Internetserver erforderlich."
            CONST L_NoAvailableInternetMCUsFix1_ErrorMessage   = "Wenn das Problem fortbesteht, wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_NoAvailableInternetMCUsTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NoAvailableInternetMCUsReason_ErrorMessage)
            CALL AddFix(L_NoAvailableInternetMCUsFix1_ErrorMessage)

        CASE E_DCS_CONFERENCE_NOT_RUNNING
            CONST L_ConferenceNotRunningDCSTitle_ErrorMessage  = "Die Konferenz wird nicht ausgeführt."
            CONST L_ConferenceNotRunningDCSReason_ErrorMessage = "Die Konferenz wird zurzeit nicht auf dem T.120-MCU-Server ausgeführt."
            CONST L_ConferenceNotRunningDCSFix1_ErrorMessage   = "Wenn das Problem fortbesteht, wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_ConferenceNotRunningDCSTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConferenceNotRunningDCSReason_ErrorMessage)
            CALL AddFix(L_ConferenceNotRunningDCSFix1_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")
            
        CASE E_DCS_CONFERENCE_ALREADY_ENDED
            CONST L_ConferenceAlreadyEndedTitle_ErrorMessage  = "Die Konferenz ist beendet."
            CONST L_ConferenceAlreadyEndedReason_ErrorMessage = "Die Datenkonferenz, der Sie sich anschließen wollten, findet nicht mehr statt."
            CONST L_ConferenceAlreadyEndedFix1_ErrorMessage   = "Wenn das Problem fortbesteht, wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_ConferenceAlreadyEndedTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ConferenceAlreadyEndedReason_ErrorMessage)
            CALL AddFix(L_ConferenceAlreadyEndedFix1_ErrorMessage)
            CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")
            
        CASE E_DCS_ACCESS_DENIED_CAPACITY_LIMIT
            CONST L_CapacityLimitTitle_ErrorMessage  = "Kapazitätsgrenze der Datenkonferenz"
            CONST L_CapacityLimitReason_ErrorMessage = "Die Kapazität der Datenkonferenz ist erschöpft, im Moment können keine neuen Benutzer angenommen werden."
            CONST L_CapacityLimitFix1_ErrorMessage   = "Warten Sie einige Minuten, und versuchen Sie dann erneut, sich der Konferenz anzuschließen. Möglicherweise haben andere Benutzer die Konferenz verlassen und Platz freigegeben."
            CONST L_CapacityLimitFix2_ErrorMessage   = "Wenden Sie sich an die Besprechungsplanung."
            
            CALL SetError(L_CapacityLimitTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_CapacityLimitReason_ErrorMessage)
            CALL AddFix(L_CapacityLimitFix1_ErrorMessage)
            CALL AddFix(L_CapacityLimitFix2_ErrorMessage)

        CASE E_DCS_NOT_RUNNING
            CONST L_DCSNotRunningTitle_ErrorMessage  = "Der Datenkonferenzdienst wird nicht ausgeführt."
            CONST L_DCSNotRunningReason_ErrorMessage = "Der Datenkonferenzdienst wird im Moment nicht ausgeführt."
            CONST L_DCSNotRunningFix1_ErrorMessage   = "Warten Sie einige Minuten, und versuchen Sie dann erneut, sich der Konferenz anzuschließen. Der Dienst wird möglicherweise neu gestartet."
            CONST L_DCSNotRunningFix2_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_DCSNotRunningTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_DCSNotRunningReason_ErrorMessage)
            CALL AddFix(L_DCSNotRunningFix1_ErrorMessage)
            CALL AddFix(L_DCSNotRunningFix2_ErrorMessage)

        CASE E_DCS_NOT_INIT
            CONST L_DCSNotInitTitle_ErrorMessage  = "Der Datenkonferenzdienst wurde nicht initialisiert."
            CONST L_DCSNotInitReason_ErrorMessage = "Die Initialisierung des Datenkonferenzdienstes ist noch nicht abgeschlossen."
            CONST L_DCSNotInitFix1_ErrorMessage   = "Warten Sie einige Minuten, und versuchen Sie dann erneut, sich der Konferenz anzuschließen."
            CONST L_DCSNotInitFix2_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_DCSNotInitTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_DCSNotInitReason_ErrorMessage)
            CALL AddFix(L_DCSNotInitFix1_ErrorMessage)
            CALL AddFix(L_DCSNotInitFix2_ErrorMessage)

        CASE E_PKCS7_NO_CERT_STORE
            CONST L_NoCertStoreTitle_ErrorMessage    = "Fehler beim Öffnen des Zertifikatspeichers"
            CONST L_NoCertStoreReason_ErrorMessage   = "Beim Öffnen des Zertifikatspeichers auf dem Konferenzverwaltungsserver, dem Sie sich anschließen möchten, ist ein Fehler aufgetreten."
            CONST L_NoCertStoreFix1_ErrorMessage     = "Wenden Sie sich an Ihren Systemadministrator."

            CALL SetError(L_NoCertStoreTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NoCertStoreReason_ErrorMessage)
            CALL AddFix(L_NoCertStoreFix1_ErrorMessage)
        
        CASE E_MCU_NO_SERVER_CERTIFICATE
            CONST L_NoServerCertificateTitle_ErrorMessage    = "Kein Datenkonferenzserver-Zertifikat vorhanden"
            CONST L_NoServerCertificateReason_ErrorMessage   = "Der Exchange-Datenkonferenzserver kann zurzeit keine privaten Konferenzen bereitstellen."
            CONST L_NoServerCertificateFix1_ErrorMessage     = "Wenden Sie sich an Ihren Systemadministrator, um sicherzustellen, dass auf dem Datenkonferenzserver ein Computerzertifikat installiert ist."

            CALL SetError(L_NoServerCertificateTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NoServerCertificateReason_ErrorMessage)
            CALL AddFix(L_NoServerCertificateFix1_ErrorMessage)

        CASE E_MANUAL_JOIN_INSTRUCTIONS            
            CONST L_ManualJoinInstructionsTitle_ErrorMessage  = "Teilnahmeanweisungen"
            CALL SetError(L_ManualJoinInstructionsTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NetMeetingInviteReason_ErrorMessage)
            CALL AddFix(L_MCUProxyInvite_ErrorMessage)
            CALL AddFix(L_ManualJoinServer_ErrorMessage & Session("MCUAddress"))
            CALL AddFix(L_ManualJoinID_ErrorMessage & Request.QueryString("ID"))
            CALL AddFix(L_ManualJoinPassword_ErrorMessage & Session(SESSION_PASSWORD))


        CASE E_SESSION_UNAVAILABLE
        
            SELECT CASE Session(SESSION_RESULT)

                CASE &H8007000E
                    CONST L_SessionUnavailableResoveHostTitle_ErrorMessage    = "Host kann nicht aufgelöst werden."
                    CONST L_SessionUnavailableResoveHostReason_ErrorMessage   = "Auf dem Exchange-Konferenzserver ist ein Fehler aufgetreten. Der Server konnte den Hostnamen des Verzeichnisservers nicht auflösen."
                    CONST L_SessionUnavailableResoveHostFix1_ErrorMessage     = "Wenden Sie sich an Ihren Systemadministrator."

                    CALL SetError(L_SessionUnavailableResoveHostTitle_ErrorMessage, Value, Source, Description)
                    CALL SetReason(L_SessionUnavailableResoveHostReason_ErrorMessage)
                    CALL AddFix(L_SessionUnavailableResoveHostFix1_ErrorMessage)

                CASE &H8000FFFF
                    CONST L_SessionUnavailableNoRightsTitle_ErrorMessage    = "Unzureichende Berechtigung"
                    CONST L_SessionUnavailableNoRightsReason_ErrorMessage   = "Fehler auf dem Exchange-Konferenzserver. Sie verfügen über keine ausreichende Berechtigung, um auf den Verzeichnisserver zuzugreifen. Die standardmäßigen IIS-Kontoeinstellungen oder die Sicherheitseinstellungen des Verzeichnisservers sind eventuell falsch konfiguriert."
                    CONST L_SessionUnavailableNoRightsFix1_ErrorMessage     = "Wenden Sie sich an Ihren Systemadministrator."

                    CALL SetError(L_SessionUnavailableNoRightsTitle_ErrorMessage, Value, Source, Description)
                    CALL SetReason(L_SessionUnavailableNoRightsReason_ErrorMessage)
                    CALL AddFix(L_SessionUnavailableNoRightsFix1_ErrorMessage)

                CASE &H800704E1
                    CONST L_SessionUnavailableBadSiteTitle_ErrorMessage    = "Ungültige Site"
                    CONST L_SessionUnavailableBadSiteReason_ErrorMessage   = "Fehler auf dem Exchange-Konferenzwebserver. Der Dienst hat versucht, eine Zone nach einer Site zu durchsuchen, die nicht gefunden werden konnte."
                    CONST L_SessionUnavailableBadSiteFix1_ErrorMessage     = "Wenden Sie sich an Ihren Systemadministrator."

                    CALL SetError(L_SessionUnavailableBadSiteTitle_ErrorMessage, Value, Source, Description)
                    CALL SetReason(L_SessionUnavailableBadSiteReason_ErrorMessage)
                    CALL AddFix(L_SessionUnavailableBadSiteFix1_ErrorMessage)
            
                CASE ELSE
                    CONST L_SessionUnavailableTitle_ErrorMessage    = "Server nicht verfügbar"
                    CONST L_SessionUnavailableReason_ErrorMessage   = "Der Exchange-Konferenzwebserver ist nicht verfügbar."
                    CONST L_SessionUnavailableFix1_ErrorMessage     = "Schließen Sie Ihren Browser, und versuchen Sie die Operation erneut."
                    CONST L_SessionUnavailableFix2_ErrorMessage     = "Wenden Sie sich an Ihren Systemadministrator."

                    CALL SetError(L_SessionUnavailableTitle_ErrorMessage, Value, Source, Description)
                    CALL SetReason(L_SessionUnavailableReason_ErrorMessage)
                    CALL AddFix(L_SessionUnavailableFix1_ErrorMessage)
                    CALL AddFix(L_SessionUnavailableFix2_ErrorMessage)
        
            END SELECT
        
        CASE E_SERVER_CREATE_OBJECT
            CONST L_ServerCreateObjectTitle_ErrorMessage  = "Konfigurationsfehler auf dem Webserver"
            CONST L_ServerCreateObjectReason_ErrorMessage = "Der Webserver, zu dem Sie eine Verbindung herstellen möchten, ist nicht für die Zusammenarbeit mit den Komponenten des Exchange-Konferenzdienstes konfiguriert."
            CONST L_ServerCreateObjectFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_ServerCreateObjectTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_ServerCreateObjectReason_ErrorMessage)
            CALL AddFix(L_ServerCreateObjectFix1_ErrorMessage)

        CASE E_UNSUPPORTED_JAVASCRIPT_BROWSER
            CONST L_JavaScriptRequiredTitle_ErrorMessage  = "Unterstützung für JavaScript erforderlich"
            CONST L_JavaScriptRequiredReason_ErrorMessage = "Um diese Seite anzuzeigen, müssen Sie einen JavaScript-kompatiblen Browser wie Internet Explorer 5.0 verwenden."
            CONST L_JavaScriptRequiredFix1_ErrorMessage   = "<A HREF=""http://www.microsoft.com/ie"">Internet Explorer installieren</A>."
        
            CALL SetError(L_JavaScriptRequiredTitle_ErrorMessage, 0, "Browser", "Browser doesn't support javascript")
            CALL SetReason(L_JavaScriptRequiredReason_ErrorMessage)
            CALL AddFix(L_JavaScriptRequiredFix1_ErrorMessage)

        CASE E_UNSUPPORTED_TABLES_BROWSER
            CONST L_TablesRequiredTitle_ErrorMessage  = "Unterstützung für Tabellen erforderlich"
            CONST L_TablesRequiredReason_ErrorMessage = "Um diese Seite anzuzeigen, müssen Sie einen Browser verwenden, der Tabellen unterstützt, zum Beispiel Internet Explorer 5.0."
            CONST L_TablesRequiredFix1_ErrorMessage   = "<A HREF=""http://www.microsoft.com/ie"">Internet Explorer installieren</A>."
        
            CALL SetError(L_TablesRequiredTitle_ErrorMessage, 0, "Browser", "Browser doesn't support tables")
            CALL SetReason(L_TablesRequiredReason_ErrorMessage)
            CALL AddFix(L_TablesRequiredFix1_ErrorMessage)

        CASE E_ACCESS_DENIED
            CONST L_AccessDeniedTitle_ErrorMessage  = "Zugriff verweigert."
            CONST L_AccessDeniedReason_ErrorMessage = "Der Konferenzverwaltungsdienst hat Ihre Anforderung aufgrund einer fehlenden Berechtigung zurückgewiesen."
            CONST L_AccessDeniedFix1_ErrorMessage   = "Prüfen Sie nach, ob Sie das richtige Kennwort verwenden, wenn die Konferenz eines benötigt."
            CONST L_AccessDeniedFix2_ErrorMessage   = "Stellen Sie sicher, dass Sie nicht versuchen, Zugang zu einer privaten Konferenz zu erhalten, zu der Sie nicht eingeladen worden sind."
            CONST L_AccessDeniedFix3_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."

            Err.Number = E_ACCESS_DENIED_HRESULT 'Set for better display
            CALL SetError(L_AccessDeniedTitle_ErrorMessage, Value, Source, Description)
            Err.Number = E_ACCESS_DENIED 'Reset for no complications
            CALL SetReason(L_AccessDeniedReason_ErrorMessage)
            CALL AddFix(L_AccessDeniedFix1_ErrorMessage)
            CALL AddFix(L_AccessDeniedFix2_ErrorMessage)
            CALL AddFix(L_AccessDeniedFix3_ErrorMessage)

        CASE E_CMS_RESTARTED
            CONST L_CMSRestartedTitle_ErrorMessage  = "Fehler beim Herstellen einer Verbindung mit dem Exchange-Konferenzdienst."
            CONST L_CMSRestartedReason_ErrorMessage = "Der Exchange-Konferenzdienst ist zurzeit nicht verfügbar."
            CONST L_CMSRestartedFix1_ErrorMessage   = "Schließen Sie Ihren Browser, und öffnen Sie eine neue Verbindung mit dem Exchange-Konferenzdienst."
            CONST L_CMSRestartedFix2_ErrorMessage   = "Wenden Sie sich an Ihren Administrator, wenn Sie immer noch keine Verbindung herstellen können. Der Dienst wird möglicherweise nicht ausgeführt."
            
            CALL SetError(L_CMSRestartedTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_CMSRestartedReason_ErrorMessage)
            CALL AddFix(L_CMSRestartedFix1_ErrorMessage)
            CALL AddFix(L_CMSRestartedFix2_ErrorMessage)
        
        CASE E_MCU_HANG
            CONST L_MCUHangTitle_ErrorMessage  = "Fehler beim Herstellen einer Verbindung mit dem Datenkonferenzserver."
            CONST L_MCUHangReason_ErrorMessage = "Fehler im Exchange-Konferenzdienst bei der Arbeit mit dem Datenkonferenzserver."
            CONST L_MCUHangFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_MCUHangTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_MCUHangReason_ErrorMessage)
            CALL AddFix(L_MCUHangFix1_ErrorMessage)

        CASE E_NO_GLOBAL_CONF_CALENDAR
            CONST L_NoGlobalConfCalTitle_ErrorMessage  = "Exchange-Konferenzdienst fehlerhaft konfiguriert."
            CONST L_NoGlobalConfCalReason_ErrorMessage = "Für den Exchange-Konferenzdienst ist möglicherweise kein standardmäßiges Konferenzpostfach definiert worden,"
            CONST L_NoGlobalConfCalFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_NoGlobalConfCalTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_NoGlobalConfCalReason_ErrorMessage)
            CALL AddFix(L_NoGlobalConfCalFix1_ErrorMessage)

        CASE E_DSGETSITENAME_NO_SITE
            CONST L_DsGetSiteNameTitle_ErrorMessage  = "Die Site wurde nicht gefunden."
            CONST L_DsGetSiteNameReason_ErrorMessage = "Der Exchange-Konferenzdienst ist nicht dazu in der Lage, seinen Active Directory-Server zu lokalisieren."
            CONST L_DsGetSiteNameFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_DsGetSiteNameTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_DsGetSiteNameReason_ErrorMessage)
            CALL AddFix(L_DsGetSiteNameFix1_ErrorMessage)

        CASE ELSE 'OTHER ERRORS
                    
            CONST L_DefaultTitle_ErrorMessage  = "Serverfehler"
            CONST L_DefaultReason_ErrorMessage = "Der Exchange-Konferenzdienst wurde mit einem Serverfehler konfrontiert."
            CONST L_DefaultFix1_ErrorMessage   = "Wenden Sie sich an Ihren Systemadministrator."
            
            CALL SetError(L_DefaultTitle_ErrorMessage, Value, Source, Description)
            CALL SetReason(L_DefaultReason_ErrorMessage)
            CALL AddFix(L_DefaultFix1_ErrorMessage)

    END SELECT

    CheckSetError = Value
END FUNCTION

'== SUB: Verifies ConfLocator points to the Conference Locator
SUB Verify_ConfLocator()
    ON ERROR RESUME NEXT

	DIM AuthUser
    
	AuthUser	=  Request.ServerVariables("AUTH_USER")
    IF (L_OK_Text <> GetSessionStatusStr(Session(SESSION_STATUS)) OR 0 <> Session(SESSION_ERRNUMBER) OR NOT IsObject(Session(SESSION_CONFLOCATOR)) OR NOT IsObject(Session(SESSION_CMSZONE)) OR (AuthUser <> "" AND LCase(AuthUser) <> LCase(Session(SESSION_ATTENDEE)))) THEN
        CALL SetupSessionVariables(AuthUser)
    END IF
    
    IF (L_OK_Text <> GetSessionStatusStr(Session(SESSION_STATUS)) AND 0 <> Session(SESSION_ERRNUMBER)) THEN
        Err.Number      = Session(SESSION_ERRNUMBER)
        Err.Description = Session(SESSION_ERRDESCRIPTION)
        Err.Source      = Session(SESSION_ERRSOURCE)
    ELSEIF (L_OK_Text <> GetSessionStatusStr(Session(SESSION_STATUS)) OR NOT IsObject(Session(SESSION_CONFLOCATOR)) OR NOT IsObject(Session(SESSION_CMSZONE))) THEN
        Result          = E_SESSION_UNAVAILABLE
    END IF
END SUB

'== SUB: Sets error if the Client browser lacks Tables and JavaScript support
SUB Check_Browser_Capabilities()
    DIM Browscap
    
    SET Browscap = Server.CreateObject("MSWC.BrowserType")

    ' No longer trying to detect javascript from the browser (wasn't working with Navigator)
    'IF (0 = Browscap.JavaScript) THEN
    '    displayState = DISPLAY_ERR_VALUE
    '    Err.Number   = E_UNSUPPORTED_JAVASCRIPT_BROWSER
    'ELSE
    IF (0 = Browscap.tables) THEN
        displayState = DISPLAY_ERR_VALUE
        Err.Number   = E_UNSUPPORTED_TABLES_BROWSER
    END IF
END SUB

'== SUB: Sets an error due to an invalid password
SUB Invalid_Password()
    CONST L_IncorrectPasswordTitle_ErrorMessage  = "Falsches Kennwort"
    CONST L_IncorrectPasswordReason_ErrorMessage = "Sie haben nicht das Kennwort eingegeben, das für den Beitritt zu dieser Konferenz erforderlich ist. Wenn Sie den oben angegebenen URL eingegeben haben, überprüfen Sie Ihre Eingaben. Möglicherweise haben Sie das Kennwort falsch eingegeben."
    CONST L_IncorrectPasswordFix1_ErrorMessage   = "Überprüfen Sie Ihre Eingaben."
    CONST L_IncorrectPasswordFix2_ErrorMessage   = "Wenden Sie sich an den Konferenzorganisator oder an Ihren Systemadministrator."
        
    CALL SetError(L_IncorrectPasswordTitle_ErrorMessage, 0, "Security", "Invalid Password")
    CALL SetReason(L_IncorrectPasswordReason_ErrorMessage)
    CALL AddFix(L_IncorrectPasswordFix1_ErrorMessage)
    CALL AddFix(L_IncorrectPasswordFix2_ErrorMessage)
END SUB

'== SUB: Sets error if the Conference ID is not set
SUB IsConfID()
    IF ("" = inConfID OR CONF_ID_CODED_LENGTH < Len(inConfID)) THEN
        displayState = DISPLAY_ERR_CONFID
    END IF
END SUB

'== SUB: Sets error if the DCS Meeting ID is not valid
SUB ValidateMeetingID()
    IF (CONF_ID_DECODED_LENGTH <> Len(inMeetingID)) THEN
        CONST L_NoConferenceIDTitle_ErrorMessage  = "Konferenzzugangs-URL ungültig"
        CONST L_NoConferenceIDReason_ErrorMessage = "Sie können sich einer Konferenz nur von einem  gültigen Konferenzzugangs-URL aus anschließen."
        CONST L_NoConferenceIDFix1_ErrorMessage   = "Wenn Sie den URL kopiert haben, überprüfen Sie Ihre Eingaben. Oder schließen Sie sich einer Konferenz an, zu der Sie per E-Mail eingeladen worden sind."

        Err.Number      = Len(inMeetingID)
        Err.Description = "Invalid conference ID"
        Err.Source      = "Exchange Conferencing Service"
        CALL SetError(L_NoConferenceIDTitle_ErrorMessage, 0, "Validate Meeting ID", "Invalid Conference ID")
        CALL SetReason(L_NoConferenceIDReason_ErrorMessage)
        CALL AddFix(L_NoConferenceIDFix1_ErrorMessage)
        CALL AddFix(L_LinkToConferenceListsFix_ErrorMessage & "<A HREF=""list.asp"">" & L_LinkToConferenceListsFix2_ErrorMessage & "</A>")
    END IF
END SUB

'== SUB: Setup the error page when we have an error
SUB DisplayErrorPage() %>
<TITLE><%=L_ErrorPage_HTMLTitle%></TITLE>
</HEAD>
<body BGCOLOR="#FFFFFF" BACKGROUND="filespw.gif" LEFTMARGIN="40" RIGHTMARGIN="40" TEXT="#000000" LINK="#000000" ALINK="#FFCC66" VLINK="#0080FF" STYLE="background-color:#FFFFFF; background-image:url(filespw.gif); background-attachment:fixed; background-repeat:no-repeat; background-position:bottom right;">

<center>
<table CELLSPACING="12">
<tr><td COLSPAN="2" ROWSPAN="1" ALIGN="LEFT"><b><font FACE="verdana" SIZE="+3"><%=ErrorMsg%></font></b></td></tr>
<tr><td COLSPAN="2" ROWSPAN="1" ALIGN="LEFT"><font FACE="verdana" SIZE="-1">
    <%=Reason%>
    <P><%=L_TryTheFollowing_Text%></P>
    <UL>
        <%
            DIM count
            FOR count = 1 TO UBound(Fixes)
                Response.write("<LI>" + Fixes(count) + "</LI>")
            NEXT
        %>
    </UL>
    <P>
    <SMALL>
        <%=HiddenError%>
        <BR>
        <%=L_Page_HTMLTitle%>
    </SMALL>
</font></td></tr>
</table>
</center>
</body>
</HTML>
<% END SUB %>
