<%
'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 Conferencing"
CONST L_ErrorPage_HTMLTitle  = "Microsoft Exchange Conferencing - エラー"
CONST L_TryTheFollowing_Text = "次の操作を実行してください:"

'Session debugging/status information strings (must stay the same as global.asa)
CONST L_OK_Text                 = "OK"
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 = "データ会議サービスは、Microsoft NetMeeting などの T.120 データ会議クライアント プログラムに会議への参加を依頼できません。"
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 によって制御されています。それ以外の場合では、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 Conferencing サービスは開始されていますが、この処理は完了していません。"
            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 Conferencing Server が初期化されていません。"
            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 Conferencing サービスによってスケジュールされませんでした。"
            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 = "パスワードが無効なため、Conference Management サービスにより要求が拒否されました。"
            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   = "識別できるユーザーとしてネットワークにログインしているかどうかを確認してください。"

            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   = "出席を依頼されていないプライベートな会議に参加しようとしていないかどうかを確認してください。元の会議出席依頼を参照し、[外部の参加者を許可する] チェックボックスがオンになっていることを確認してください。さらに、自分のユーザー名が宛先または CC に存在し、サーバーのユーザーとして認証されていることを確認してください。"
            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 Data Conferencing Server は、現在プライベートな会議を開催できません。"
            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 Conferencing Web サーバーでエラーが発生しました。ディレクトリ サーバーのホスト名を解決できませんでした。"
                    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 Conferencing Web サーバーでエラーが発生しました。ディレクトリ サーバーにアクセスするための十分なアクセス許可がありません。既定の 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 Conferencing Web サーバーでエラーが発生しました。見つからないサイトのゾーンをサービスが参照しようとしました。"
                    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 Conferencing Web サーバーを使用できません。"
                    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  = "Web サーバーの構成にエラーがあります"
            CONST L_ServerCreateObjectReason_ErrorMessage = "接続しようとした Web サーバーは、Exchange Conferencing サービス コンポーネントが動作するように構成されていません。"
            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  = "Java スクリプトをサポートしている必要があります"
            CONST L_JavaScriptRequiredReason_ErrorMessage = "このページを表示するには、Internet Explorer 5.0 などの Java スクリプトをサポートしているブラウザが必要です。"
            CONST L_JavaScriptRequiredFix1_ErrorMessage   = "<A HREF=""http://www.microsoft.com/japan/ie"">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/japan/ie"">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 Conferencing サービスとの接続中にエラーが発生しました"
            CONST L_CMSRestartedReason_ErrorMessage = "Exchange Conferencing サービスは現在使用できません。"
            CONST L_CMSRestartedFix1_ErrorMessage   = "ブラウザを閉じ、新たに Exchange Conferencing サービスに接続してください。"
            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 Conferencing サービスによりエラーが検出されました。"
            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 Conferencing サービスの構成が正しくありません"
            CONST L_NoGlobalConfCalReason_ErrorMessage = "Exchange Conferencing サービス用に定義された既定の会議メールボックスがない可能性があります。"
            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 Conferencing サービスは 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 Conferencing サービスにより、サーバー エラーが検出されました。"
            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 %>
