<%
'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 회의"
CONST L_ErrorPage_HTMLTitle  = "Microsoft Exchange 회의 - 오류"
CONST L_TryTheFollowing_Text = "다음을 시도해 보십시오."

'Session debugging/status information strings (must stay the same as global.asa)
CONST L_OK_Text                 = "확인"
CONST L_GetConfLocator_Text     = "회의 관리 영역에서 회의 로케이터를 가져올 수 없습니다."
CONST L_GetZone_Text            = "회의 관리 구성 개체에서 영역을 찾을 수 없습니다."
CONST L_CreateObject_Text       = "회의 관리 구성 개체를 초기화할 수 없습니다."
CONST L_Unknown_Text            = "알 수 없음"
CONST L_Uninitialized_Text      = "초기화 안됨"

'Common strings
CONST L_MCUProxyInvite_ErrorMessage     = "프록시 서버를 통해 회의에 참가하려는 경우 데이터 회의 서비스에서 클라이언트 프로그램을 연결하지 못할 수도 있습니다. 데이터 회의 클라이언트에 수동으로 연결하려면 다음 정보를 사용하십시오."
CONST L_ManualJoinServer_ErrorMessage   = "데이터 회의 서버: "
CONST L_ManualJoinID_ErrorMessage       = "회의 ID: "
CONST L_ManualJoinPassword_ErrorMessage = "회의 암호: "
CONST L_NetMeetingInviteTitle_ErrorMessage  = "데이터 회의 초대 오류"
CONST L_NetMeetingInviteReason_ErrorMessage = "데이터 회의 서비스가 T.120 데이터 회의용 클라이언트 프로그램(예, Microsoft NetMeeting)을 회의에 초대할 수 없습니다."
CONST L_NetMeetingInviteFix1_ErrorMessage   = "회의용 클라이언트 프로그램을 시작했는지 확인한 후 회의 참가를 다시 시도하십시오."
CONST L_LinkToConferenceListsFix_ErrorMessage  = "가능한 모임 목록에서 현재 회의를 "
CONST L_LinkToConferenceListsFix2_ErrorMessage = "선택하십시오."

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  = "데이터 회의 초대 시간 초과"
            CONST L_NetMeetingInviteTimeoutReason_ErrorMessage = "데이터 회의 서버가 회의용 클라이언트 프로그램(예, Microsoft NetMeeting)을 회의에 초대하려고 시도하는 중 데이터 회의 서버가 보낸 초대장이 만료되었습니다."
            CONST L_NetMeetingInviteTimeoutFix1_ErrorMessage   = "다시 회의에 참가하여 서버의 초대를 수락하십시오. 초대장을 맨 앞으로 가져와야 합니다. 초대장은 바탕 화면의 활성 창 뒤에 숨겨져 있습니다."
            
            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 충돌"
            CONST L_NetMeetingMaskReason_ErrorMessage = "NetMeeting이 시스템 리소스를 제어하고 있거나 제대로 작동하지 않습니다."
            CONST L_NetMeetingMaskFix1_ErrorMessage   = "NetMeeting과 충돌을 일으키는 다른 비디오, 오디오, 네트워크 프로그램을 종료하십시오."
            
            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  = "서버가 초기화되지 않았습니다."
            CONST L_EventManagerNotInitializedReason_ErrorMessage = "Exchange 회의 서비스가 시작 중이며 아직 이 프로세스가 완료되지 않았습니다."
            CONST L_EventManagerNotInitializedFix1_ErrorMessage   = "잠시 기다린 후 다시 시도하십시오."
            
            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    = "서버 저장소가 초기화되지 않았습니다."
            CONST L_ServerOrProfileStoreNotInitializedReason_ErrorMessage   = "Exchange 회의 서버가 초기화되지 않았습니다."
            CONST L_ProfileStoreNotInitializedFix1_ErrorMessage             = "시스템 관리자에게 문의하십시오. 회의 일정 사서함 저장소를 사용하지 못할 수도 있습니다."
                        
            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  = "회의가 실행되고 있지 않습니다."
            CONST L_ConferenceNotRunningCMSReason_ErrorMessage = "액세스하려고 하는 회의가 현재 준비되지 않았거나 회의 기술 공급자가 회의 시작을 허용하지 않습니다."
            CONST L_ConferenceNotRunningCMSFix1_ErrorMessage   = "잠시 기다린 후 다시 시도하십시오."
            
            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  = "회의가 예약되지 않았습니다."
            CONST L_ConferenceNotScheduledReason_ErrorMessage = "URL의 회의 ID에 의해 지정된 이 회의는 Exchange 회의 서비스에 의해 예약되지 않았습니다."
            CONST L_ConferenceNotScheduledFix1_ErrorMessage   = "회의가 삭제되었거나, 회의 ID가 손상되었을 수 있습니다."
            CONST L_ConferenceNotScheduledFix2_ErrorMessage   = "모임 이끌이나 시스템 관리자에게 문의하십시오."
            
            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  = "회의가 시작되지 않았습니다."
            CONST L_ConferenceNotStartedReason_ErrorMessage = "회의를 시작 중이며 아직 시작 과정이 완료되지 않았습니다."
            CONST L_ConferenceNotStartedFix1_ErrorMessage   = "잠시 기다린 후 다시 시도하십시오."
            
            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  = "회의를 찾을 수 없습니다."
            CONST L_ConferenceNotFoundReason_ErrorMessage = "회의 관리 서비스에서 사용자가 참가하려고 하는 회의를 찾을 수 없습니다."
            CONST L_ConferenceNotFoundFix1_ErrorMessage   = "회의를 최근에 예약했으면, 잠시 기다린 후 다시 시도하십시오."
            CONST L_ConferenceNotFoundFix2_ErrorMessage   = "회의 이끌이에게 문의하십시오. 회의가 취소되었을 수 있습니다."
            CONST L_ConferenceNotFoundFix3_ErrorMessage   = "브라우저의 URL에 표시된 모임 ID가 회의의 모임 ID와 동일한지 확인하십시오."
            CONST L_ConferenceNotFoundFix4_ErrorMessage   = "이 회의가 정기 회의인 경우 개별 항목을 확인하는 동안 문제가 있을 수 있습니다."
            
            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  = "회의 관리 서비스 종료 중"
            CONST L_ConfServerShuttingDownReason_ErrorMessage = "회의 관리 서비스를 종료하고 있습니다."
            CONST L_ConfServerShuttingDownFix1_ErrorMessage   = "서비스를 다시 시작하여 회의를 계속하려면 잠시 기다리십시오."
            CONST L_ConfServerShuttingDownFix2_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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  = "잘못된 회의 암호입니다."
            CONST L_InvalidConferencePasswordReason_ErrorMessage = "암호가 틀리므로 회의 관리 서비스가 회의 참가 요청을 거부했습니다."
            CONST L_InvalidConferencePasswordFix1_ErrorMessage   = "정확한 회의 암호를 입력했는지 확인하십시오."

            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  = "익명 액세스 거부"
            CONST L_AnonymousUserDeniedAccessReason_ErrorMessage = "확인된 사용자가 아니므로 회의 관리 서비스가 회의 참가 요청을 거부했습니다."
            CONST L_AnonymousUserDeniedAccessFix1_ErrorMessage   = "초대받지 않은 비공개 회의에 액세스하려는 것은 아닌지 확인하십시오."
            CONST L_AnonymousUserDeniedAccessFix2_ErrorMessage   = "네트워크에서 확인할 수 있는 자신의 ID로 로그온했는지 확인하십시오."

            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  = "액세스 거부"
            CONST L_UserDeniedAccessReason_ErrorMessage = "필요한 참가 권한이 없어서 회의 관리 서비스가 회의 참가 요청을 거부했습니다. 다음 사용자로 인증되었습니다. "
            CONST L_UserDeniedAccessFix1_ErrorMessage   = "초대받지 않은 비공개 회의에 참가하려는 것은 아닌지 확인하십시오. 원래 모임 초대장에서 [외부 참석자 허용]을 선택했는지, 그리고 사용자 이름이 초대장의 받는 사람 또는 참조 목록에 있는지와 해당 사용자로 서버에 인증되어 있는지 확인하십시오."
            CONST L_UserDeniedAccessFix2_ErrorMessage   = "시스템 관리자에게 문의하십시오. 회의 가상 루트 사용 권한이 제대로 설정되어 있지 않거나 회의 관리 서비스에서 비공개 회의용 클라이언트 인증을 필요로 합니다. 즉, 비공개 모임 페이지에 대한 액세스 인증 설정을 선택해야 합니다."

            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 참가 요청 실패"
            CONST L_CTPJoinRequestFailedReason_ErrorMessage = "회의 기술 공급자가 회의 참가를 허용하지 않기 때문에 회의 관리 서비스가 요청을 거부했습니다."
            CONST L_CTPJoinRequestFailedFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."

            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  = "공급자가 초기화되지 않았습니다."
            CONST L_ProviderNotInitializedReason_ErrorMessage = "회의 기술 공급자가 아직 초기화되지 않았기 때문에 회의 관리 서비스가 요청을 거부했습니다."
            CONST L_ProviderNotInitializedFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."

            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  = "공급자를 찾을 수 없습니다."
            CONST L_ProviderNotFoundReason_ErrorMessage = "회의 기술 공급자와 연결할 수 없기 때문에 회의 관리 서비스가 요청을 거부했습니다."
            CONST L_ProviderNotFoundFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."

            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  = "정기 회의를 찾을 수 없습니다."
            CONST L_RecurringConferenceNotFoundReason_ErrorMessage = "참가하려고 하는 정기 회의를 찾을 수 없기 때문에 회의 관리 서비스가 요청을 거부했습니다."
            CONST L_RecurringConferenceNotFoundFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."

            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  = "유효하지 않은 호스트 URL"
            CONST L_NotHostServerReason_ErrorMessage = "호스트 서버가 아니기 때문에 회의 관리 서비스가 요청을 거부했습니다."
            CONST L_NotHostServerFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."

            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  = "T.120 MCU 서버를 사용할 수 없습니다."
            CONST L_NoAvailableMCUsReason_ErrorMessage = "데이터 회의 서비스를 사용할 수 없거나 주소에서 T.120 MCU 서버 연결을 허용하도록 데이터 회의 서비스가 구성되어 있지 않습니다. 회의에 참가하려면, 데이터 회의 클라이언트(예, NetMeeting)를 T.120 MCU 서버에 연결해야 합니다."
            CONST L_NoAvailableMCUsFix1_ErrorMessage   = "문제가 지속되면 시스템 관리자에게 문의하십시오."
            
            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  = "프록시 T.120 MCU 서버를 사용할 수 없습니다."
            CONST L_NoAvailableProxyMCUsReason_ErrorMessage = "데이터 회의 서비스를 사용할 수 없거나 Windows 2000 사이트에서 프록시 T.120 MCU 서버 연결을 허용하도록 데이터 회의 서비스가 구성되어 있지 않습니다. 다른 사이트에서 회의에 참가하려면, 프록시 T.120 MCU 서버에 연결해야 합니다."
            CONST L_NoAvailableProxyMCUsFix1_ErrorMessage   = "문제가 지속되면 시스템 관리자에게 문의하십시오."
            
            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  = "인터넷 T.120 MCU 서버를 사용할 수 없습니다."
            CONST L_NoAvailableInternetMCUsReason_ErrorMessage = "데이터 회의 서비스를 사용할 수 없거나 조직 외부에서 인터넷 T.120 MCU 서버 연결을 허용하도록 데이터 회의 서비스가 구성되어 있지 않습니다. 다른 조직에서 회의에 참가하려면, 인터넷 T.120 MCU 서버에 연결해야 합니다."
            CONST L_NoAvailableInternetMCUsFix1_ErrorMessage   = "문제가 지속되면 시스템 관리자에게 문의하십시오."
            
            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  = "회의가 실행되고 있지 않습니다."
            CONST L_ConferenceNotRunningDCSReason_ErrorMessage = "회의가 현재 T.120 MCU 서버에서 실행 중이지 않습니다."
            CONST L_ConferenceNotRunningDCSFix1_ErrorMessage   = "문제가 지속되면 시스템 관리자에게 문의하십시오."
            
            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  = "회의가 끝났습니다."
            CONST L_ConferenceAlreadyEndedReason_ErrorMessage = "참가하려고 하는 데이터 회의가 끝났습니다."
            CONST L_ConferenceAlreadyEndedFix1_ErrorMessage   = "문제가 지속되면 시스템 관리자에게 문의하십시오."
            
            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  = "데이터 회의 용량 한도"
            CONST L_CapacityLimitReason_ErrorMessage = "이 데이터 회의의 용량이 차서 더 이상 새 사용자를 받아들일 수 없습니다."
            CONST L_CapacityLimitFix1_ErrorMessage   = "잠시 기다린 후 회의 참가를 다시 시도하십시오. 마지막 회의 참가 시도 이후에 다른 사용자가 회의에서 빠져 나갔을 수 있습니다."
            CONST L_CapacityLimitFix2_ErrorMessage   = "모임 이끌이에게 문의하십시오."
            
            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  = "데이터 회의 서비스가 실행되고 있지 않습니다."
            CONST L_DCSNotRunningReason_ErrorMessage = "데이터 회의 서비스가 현재 실행되고 있지 않습니다."
            CONST L_DCSNotRunningFix1_ErrorMessage   = "잠시 기다린 후 회의 참가를 다시 시도하십시오. 서비스가 다시 시작 중일 수 있습니다."
            CONST L_DCSNotRunningFix2_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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  = "데이터 회의 서비스가 초기화되지 않았습니다."
            CONST L_DCSNotInitReason_ErrorMessage = "데이터 회의 서비스의 초기화가 아직 완료되지 않았습니다."
            CONST L_DCSNotInitFix1_ErrorMessage   = "잠시 기다린 후 회의 참가를 다시 시도하십시오."
            CONST L_DCSNotInitFix2_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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    = "인증서 저장소를 여는 중 오류가 발생했습니다."
            CONST L_NoCertStoreReason_ErrorMessage   = "참가하려고 하는 회의 관리 서버에서 인증서 저장소를 여는 중 오류가 발생했습니다."
            CONST L_NoCertStoreFix1_ErrorMessage     = "시스템 관리자에게 문의하십시오."

            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    = "데이터 회의 서버 인증서가 없습니다."
            CONST L_NoServerCertificateReason_ErrorMessage   = "Exchange 데이터 회의 서버가 현재 비공개 회의를 제공할 수 없습니다."
            CONST L_NoServerCertificateFix1_ErrorMessage     = "시스템 관리자에게 문의하여 컴퓨터 인증서가 데이터 회의 서버에 설치되어 있는지 확인하십시오."

            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  = "참가 안내"
            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    = "호스트를 확인할 수 없습니다."
                    CONST L_SessionUnavailableResoveHostReason_ErrorMessage   = "Exchange 회의 웹 서버에서 오류가 발생했습니다. 서버가 디렉터리 서버의 호스트 이름을 확인할 수 없습니다."
                    CONST L_SessionUnavailableResoveHostFix1_ErrorMessage     = "시스템 관리자에게 문의하십시오."

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

                CASE &H8000FFFF
                    CONST L_SessionUnavailableNoRightsTitle_ErrorMessage    = "권한이 충분하지 않습니다."
                    CONST L_SessionUnavailableNoRightsReason_ErrorMessage   = "Exchange 회의 웹 서버에서 오류가 발생했습니다. 디렉터리 서버에 액세스할 권한이 충분하지 않습니다. 기본 IIS 계정 설정 또는 디렉터리 서버 보안 설정이 제대로 구성되어 있지 않을 수 있습니다."
                    CONST L_SessionUnavailableNoRightsFix1_ErrorMessage     = "시스템 관리자에게 문의하십시오."

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

                CASE &H800704E1
                    CONST L_SessionUnavailableBadSiteTitle_ErrorMessage    = "잘못된 사이트입니다."
                    CONST L_SessionUnavailableBadSiteReason_ErrorMessage   = "Exchange 회의 웹 서버에서 오류가 발생했습니다. 서비스가 찾을 수 없는 사이트 영역을 찾으려고 시도했습니다."
                    CONST L_SessionUnavailableBadSiteFix1_ErrorMessage     = "시스템 관리자에게 문의하십시오."

                    CALL SetError(L_SessionUnavailableBadSiteTitle_ErrorMessage, Value, Source, Description)
                    CALL SetReason(L_SessionUnavailableBadSiteReason_ErrorMessage)
                    CALL AddFix(L_SessionUnavailableBadSiteFix1_ErrorMessage)
            
                CASE ELSE
                    CONST L_SessionUnavailableTitle_ErrorMessage    = "서버를 사용할 수 없습니다."
                    CONST L_SessionUnavailableReason_ErrorMessage   = "Exchange 회의 웹 서버를 사용할 수 없습니다."
                    CONST L_SessionUnavailableFix1_ErrorMessage     = "브라우저를 닫고 작업을 다시 시도하십시오."
                    CONST L_SessionUnavailableFix2_ErrorMessage     = "시스템 관리자에게 문의하십시오."

                    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  = "웹 서버 구성 오류"
            CONST L_ServerCreateObjectReason_ErrorMessage = "연결하려고 하는 웹 서버가 Exchange 회의 서비스 구성 요소에 맞게 구성되지 않았습니다."
            CONST L_ServerCreateObjectFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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  = "JavaScript 지원 필요"
            CONST L_JavaScriptRequiredReason_ErrorMessage = "이 페이지를 보려면, Internet Explorer 5.0과 같이 Javascript를 지원하는 브라우저를 사용해야 합니다."
            CONST L_JavaScriptRequiredFix1_ErrorMessage   = "<A HREF=""http://www.microsoft.com/ie_intl/ko""> Internet Explorer 다운로드</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  = "테이블 지원 필요"
            CONST L_TablesRequiredReason_ErrorMessage = "이 페이지를 보려면, Internet Explorer 5.0과 같이 테이블을 지원하는 브라우저를 사용해야 합니다."
            CONST L_TablesRequiredFix1_ErrorMessage   = "<A HREF=""http://www.microsoft.com/ie_intl/ko""> Internet Explorer 다운로드</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  = "액세스 거부"
            CONST L_AccessDeniedReason_ErrorMessage = "권한이 없어서 회의 관리 서비스가 요청을 거부했습니다."
            CONST L_AccessDeniedFix1_ErrorMessage   = "회의에서 암호를 요청하면, 올바른 암호를 사용하고 있는지 확인하십시오."
            CONST L_AccessDeniedFix2_ErrorMessage   = "초대받지 않은 비공개 회의에 참가하려는 것은 아닌지 확인하십시오."
            CONST L_AccessDeniedFix3_ErrorMessage   = "시스템 관리자에게 문의하십시오."

            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  = "Exchange 회의 서비스에 연결하는 중 오류가 발생했습니다."
            CONST L_CMSRestartedReason_ErrorMessage = "Exchange 회의 서비스를 현재 사용할 수 없습니다."
            CONST L_CMSRestartedFix1_ErrorMessage   = "브라우저를 닫고 Exchange 회의 서비스에 대한 새 연결을 엽니다."
            CONST L_CMSRestartedFix2_ErrorMessage   = "계속 연결되지 않으면 관리자에게 문의하십시오. 서비스가 실행 중이지 않을 수도 있습니다."
            
            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  = "데이터 회의 서버에 연결하는 중 오류가 발생했습니다."
            CONST L_MCUHangReason_ErrorMessage = "데이터 회의 서버에 연결하는 중에 Exchange 회의 서비스에 오류가 발생했습니다."
            CONST L_MCUHangFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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 회의 서비스가 잘못 구성되었습니다."
            CONST L_NoGlobalConfCalReason_ErrorMessage = "Exchange 회의 서비스에 기본 회의 사서함이 정의되어 있지 않을 수 있습니다."
            CONST L_NoGlobalConfCalFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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  = "사이트를 찾을 수 없습니다."
            CONST L_DsGetSiteNameReason_ErrorMessage = "Exchange 회의 서비스가 Active Directory 서버를 찾을 수 없습니다."
            CONST L_DsGetSiteNameFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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  = "서버 오류"
            CONST L_DefaultReason_ErrorMessage = "Exchange 회의 서비스에서 서버 오류가 발생했습니다."
            CONST L_DefaultFix1_ErrorMessage   = "시스템 관리자에게 문의하십시오."
            
            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  = "암호가 정확하지 않습니다."
    CONST L_IncorrectPasswordReason_ErrorMessage = "이 회의에 참가하기 위해 필요한 암호를 입력하지 않았습니다. 위에 URL을 직접 입력했다면 입력 내용을 확인하십시오. 암호를 잘못 입력했을 수 있습니다."
    CONST L_IncorrectPasswordFix1_ErrorMessage   = "입력 내용을 확인하십시오."
    CONST L_IncorrectPasswordFix2_ErrorMessage   = "회의 이끌이 또는 시스템 관리자에게 문의하십시오."
        
    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  = "잘못된 회의 액세스 URL입니다."
        CONST L_NoConferenceIDReason_ErrorMessage = "회의 액세스 URL이 올바른 경우에만 회의에 참가할 수 있습니다."
        CONST L_NoConferenceIDFix1_ErrorMessage   = "URL을 복사했다면 입력 내용을 확인하십시오. 또는 전자 메일로 초대받은 회의에 참가하십시오."

        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 %>
