class MemberAgreementScreen(DirectObject):
    
    def __init__(self, tcr, doneEvent):
        self.doneEvent = doneEvent
        self.tcr = tcr
        self.loginInterface = self.tcr.loginInterface
        self.legalText = Localizer.MemberAgreementScreenLegalText
        self.numPages = len(self.legalText)
        self.checkAge = config.GetBool('check-member-agreement-age', 0)
        self.fsm = FSM.FSM('MemberAgreementScreen', [
            State.State('off', self.enterOff, self.exitOff, [
                'getParents']),
            State.State('getParents', self.enterGetParents, self.exitGetParents, [
                'viewAgreement']),
            State.State('viewAgreement', self.enterViewAgreement, self.exitViewAgreement, [
                'youMustAgree']),
            State.State('youMustAgree', self.enterYouMustAgree, self.exitYouMustAgree, [
                'viewAgreement'])], 'off', 'off')
        self.fsm.enterInitialState()

    
    def load(self):
        guiButton = loader.loadModelOnce('phase_3/models/gui/quit_button')
        background = loader.loadModel('phase_3/models/gui/login-background')
        cogIcons = loader.loadModel('phase_3/models/gui/cog_icons')
        self.frame = DirectFrame(parent = aspect2d, relief = FLAT, image = background.find('**/member_agreement'))
        self.welcomeLabel = DirectLabel(parent = self.frame, relief = None, pos = (0, 0, 0.88), text = Localizer.MemberAgreementScreenWelcome, text_font = getMinnieFont(), text_scale = 0.0935, text_fg = (1, 0.5, 0.10000000000000001, 1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
        self.onYourWayLabel = DirectLabel(parent = self.frame, relief = None, pos = (0, 0, 0.79000000000000004), text = Localizer.MemberAgreementScreenOnYourWay, text_scale = 0.072499999999999995, text_fg = (1, 1, 0, 1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
        self.toontownLabel = DirectLabel(parent = self.frame, relief = None, pos = (0, 0, 0.67000000000000004), text = Localizer.MemberAgreementScreenToontown, text_font = getMinnieFont(), text_scale = 0.086999999999999994, text_fg = (1, 0.5, 0.10000000000000001, 1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
        priceColor = (0, 0.90000000000000002, 0, 1)
        if self.tcr.getCreditCardUpFront():
            priceTextScale = 0.089999999999999997
            self.pricingLabel = DirectLabel(parent = self.frame, relief = None, pos = (0, 0, 0.55800000000000005), text = Localizer.MemberAgreementScreenCCUpFrontPricing, text_scale = priceTextScale, text_fg = (1, 1, 0, 1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
            self.freeTrialDuration = DirectLabel(parent = self.pricingLabel, relief = None, pos = (-0.35999999999999999, 0, 0), text = self.tcr.accountServerConstants.getString('freeTrialPeriodInDays'), text_scale = priceTextScale, text_fg = priceColor, text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
            priceFirstMonthPos = (0.92000000000000004, 0, -0.17999999999999999)
            pricePerMonthPos = (-0.11, 0, -0.27000000000000002)
        else:
            priceTextScale = 0.10000000000000001
            self.pricingLabel = DirectLabel(parent = self.frame, relief = None, pos = (0, 0, 0.55800000000000005), text = Localizer.MemberAgreementScreenPricing, text_scale = priceTextScale, text_fg = (1, 1, 0, 1), text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
            priceFirstMonthPos = (0.52000000000000002, 0, 0)
            pricePerMonthPos = (0.84999999999999998, 0, -0.10000000000000001)
        self.priceFirstMonth = DirectLabel(parent = self.pricingLabel, relief = None, pos = priceFirstMonthPos, text = '$%s' % self.tcr.accountServerConstants.getString('priceFirstMonth'), text_scale = priceTextScale, text_fg = priceColor, text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
        self.pricePerMonth = DirectLabel(parent = self.pricingLabel, relief = None, pos = pricePerMonthPos, text = '$%s' % self.tcr.accountServerConstants.getString('pricePerMonth'), text_scale = priceTextScale, text_fg = priceColor, text_shadow = (0, 0, 0, 1), text_shadowOffset = (0.080000000000000002, 0.080000000000000002))
        self.dobEntry = DateOfBirthEntry(parent = self.frame, pos = (0, 0, 0.26000000000000001), scale = 0.095000000000000001, defaultAge = 0, curYear = self.tcr.dateObject.getYear())
        if not (self.checkAge):
            self.dobEntry.hide()
        
        self.memAgreement = MultiPageTextFrame(parent = self.frame, relief = None, textList = self.legalText, hidePageNum = 1, width = 1.8, height = 0.90000000000000002, wordWrap = 34, pos = (0, 0, -0.29999999999999999))
        self.cogIcon = DirectLabel(parent = self.memAgreement, relief = None, pos = (-0.75, 0, 0.29999999999999999), scale = 0.25, image = cogIcons.find('**/LegalIcon'))
        self.agreementTitle = DirectLabel(parent = self.memAgreement, relief = None, pos = (0.042651300000000003, 0, 0.26879399999999998), scale = 0.089999999999999997, text = Localizer.MemberAgreementScreenAgreementTitle, text_font = getSuitFont(), text_wordwrap = 10)
        self.clickNextLabel = DirectLabel(parent = self.memAgreement, relief = None, pos = (-0.32528299999999999, 0, -0.38825700000000002), scale = 0.050000000000000003, text = Localizer.MemberAgreementScreenClickNext)
        self.memAgreement.setPageChangeCallback(self._MemberAgreementScreen__handlePageChange)
        bottomButtonZ = -0.56999999999999995
        self.cancelButton = DirectButton(parent = self.memAgreement, relief = None, scale = 1.1000000000000001, image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale = (1, 1, 1), pos = (-0.5, 0, bottomButtonZ), text = Localizer.MemberAgreementScreenCancel, text_scale = 0.059999999999999998, text_pos = (0, -0.017999999999999999), command = self._MemberAgreementScreen__handleCancel)
        self.declineButton = DirectButton(parent = self.memAgreement, relief = None, scale = 1.1000000000000001, image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale = (1, 1, 1), pos = (0, 0, bottomButtonZ), text = Localizer.MemberAgreementScreenDisagree, text_scale = 0.059999999999999998, text_pos = (0, -0.017999999999999999), command = self._MemberAgreementScreen__handleDisagree)
        self.acceptButton = DirectButton(parent = self.memAgreement, relief = None, scale = 1.1000000000000001, image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale = (1, 1, 1), pos = (0.5, 0, bottomButtonZ), text = Localizer.MemberAgreementScreenAgree, text_scale = 0.059999999999999998, text_pos = (0, -0.017999999999999999), command = self._MemberAgreementScreen__handleAgree)
        self.dialogDoneEvent = 'memberAgreementDialogAck'
        self.dialog = ToontownDialog.GlobalDialog(doneEvent = self.dialogDoneEvent, message = '', style = ToontownDialog.Acknowledge)
        self.dialog.hide()
        self.mustAgreeDialog = DirectFrame(relief = None, pos = (0, 0.10000000000000001, 0), image = getDefaultDialogGeom(), image_color = GlobalDialogColor, image_scale = (1.3, 1.0, 0.80000000000000004), text = Localizer.MemberAgreementScreenYouMustAgree, text_scale = 0.080000000000000002, text_pos = (0.0, 0.20000000000000001), text_wordwrap = 15, sortOrder = NO_FADE_SORT_INDEX)
        self.mustAgreeDialog.hide()
        linePos = -0.13
        buttonImageScale = 1.1000000000000001
        buttonLineHeight = 0.112
        self.mustAgreeOkButton = DirectButton(parent = self.mustAgreeDialog, relief = None, pos = (0, 0, linePos), scale = 0.90000000000000002, image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale = buttonImageScale, text = Localizer.MemberAgreementScreenYouMustAgreeOk, text_scale = 0.059999999999999998, text_pos = (0, -0.02), command = self._MemberAgreementScreen__handleMustAgreeOk)
        linePos -= buttonLineHeight
        self.mustAgreeQuitButton = DirectButton(parent = self.mustAgreeDialog, relief = None, pos = (0, 0, linePos), scale = 0.90000000000000002, image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale = buttonImageScale, image0_color = Vec4(1, 0.10000000000000001, 0.10000000000000001, 1), image1_color = Vec4(1, 0.10000000000000001, 0.10000000000000001, 1), image2_color = Vec4(1, 1, 1, 1), text = Localizer.MemberAgreementScreenYouMustAgreeQuit, text_scale = 0.059999999999999998, text_pos = (0, -0.02), command = self._MemberAgreementScreen__handleMustAgreeQuit)
        linePos -= buttonLineHeight
        self.frame.hide()
        background.removeNode()
        guiButton.removeNode()
        cogIcons.removeNode()

    
    def unload(self):
        self.mustAgreeDialog.destroy()
        self.frame.destroy()
        self.dialog.cleanup()
        del self.frame
        del self.dialog
        del self.fsm

    
    def enter(self):
        self.frame.show()
        
        def getDOBfromEntry(self = self):
            self.dobMonth = self.dobEntry.getMonth()
            self.dobYear = self.dobEntry.getYear()
            self.dobDay = self.dobEntry.getDay()

        if self.tcr.getCreditCardUpFront():
            getDOBfromEntry()
        else:
            
            try:
                error = self.loginInterface.getAccountData(self.tcr.userName, self.tcr.password)
            except TTAccount.TTAccountException:
                error = 'exception raised'

            if not error:
                accountData = self.loginInterface.accountData
                if accountData.hasKey('dobMonth') and accountData.hasKey('dobYear'):
                    pass
                if not accountData.hasKey('dobDay'):
                    error = 1
                
            
            if error:
                getDOBfromEntry()
            else:
                
                try:
                    self.dobMonth = accountData.getInt('dobMonth')
                    self.dobYear = accountData.getInt('dobYear')
                    self.dobDay = accountData.getInt('dobDay')
                except ValueError:
                    getDOBfromEntry()

                if self.checkAge:
                    self.dobEntry.setMonth(self.dobMonth)
                    self.dobEntry.setYear(self.dobYear)
                    self.dobEntry.setDay(self.dobDay)
                
        self.age = toonbase.tcr.dateObject.getAge(self.dobMonth, self.dobYear, self.dobDay)
        self.fsm.request('getParents')

    
    def exit(self):
        self.fsm.requestFinalState()
        self.frame.hide()

    
    def enterOff(self):
        pass

    
    def exitOff(self):
        pass

    
    def enterGetParents(self):
        if self.tcr.getCreditCardUpFront() or self.age < 18:
            if self.tcr.getCreditCardUpFront():
                msg = Localizer.MemberAgreementScreenGetParentsUnconditional
            else:
                msg = Localizer.MemberAgreementScreenGetParents
            self.dialog.setMessage(msg)
            self.dialog.show()
            
            def handleGetParentsAck(self = self):
                self.dialog.hide()
                self.fsm.request('viewAgreement')

            self.acceptOnce(self.dialogDoneEvent, handleGetParentsAck)
        else:
            self.fsm.request('viewAgreement')

    
    def exitGetParents(self):
        pass

    
    def enterViewAgreement(self):
        self.memAgreement.acceptAgreementKeypresses()

    
    def exitViewAgreement(self):
        self.memAgreement.ignoreAgreementKeypresses()

    
    def enterYouMustAgree(self):
        base.transitions.fadeScreen(0.5)
        self.mustAgreeDialog.show()

    
    def _MemberAgreementScreen__handleMustAgreeOk(self):
        self.fsm.request('viewAgreement')

    
    def _MemberAgreementScreen__handleMustAgreeQuit(self):
        messenger.send(self.doneEvent, [
            {
                'mode': 'quit' }])

    
    def exitYouMustAgree(self):
        base.transitions.noTransitions()
        self.mustAgreeDialog.hide()

    
    def _MemberAgreementScreen__handleAgree(self):
        if self.checkAge:
            age = self.dobEntry.getAge()
            if age < 18:
                self.dialog.setMessage(Localizer.MemberAgreementScreenMustBeOlder)
                self.dialog.show()
                
                def handleOlderAck(self = self):
                    self.dialog.hide()
                    self.fsm.request('viewAgreement')

                self.acceptOnce(self.dialogDoneEvent, handleOlderAck)
                self.memAgreement.ignoreAgreementKeypresses()
            else:
                messenger.send(self.doneEvent, [
                    {
                        'mode': 'agree' }])
        else:
            messenger.send(self.doneEvent, [
                {
                    'mode': 'agree' }])

    
    def _MemberAgreementScreen__handleDisagree(self):
        self.fsm.request('youMustAgree')

    
    def _MemberAgreementScreen__handleCancel(self):
        messenger.send(self.doneEvent, [
            {
                'mode': 'cancel' }])

    
    def _MemberAgreementScreen__handlePageChange(self, pageNum):
        if pageNum == 0:
            self.cogIcon.show()
            self.agreementTitle.show()
            self.clickNextLabel.show()
        else:
            self.cogIcon.hide()
            self.agreementTitle.hide()
            self.clickNextLabel.hide()
class MemberAgreementScreen(DirectObject):
    __module__ = __name__

    def __init__(self, tcr, doneEvent):
        self.doneEvent = doneEvent
        self.tcr = tcr
        self.loginInterface = self.tcr.loginInterface
        self.legalText = Localizer.MemberAgreementScreenLegalText
        self.numPages = len(self.legalText)
        self.checkAge = config.GetBool('check-member-agreement-age', 0)
        self.fsm = FSM.FSM('MemberAgreementScreen', [
            State.State('off', self.enterOff, self.exitOff, ['getParents']),
            State.State('getParents', self.enterGetParents,
                        self.exitGetParents, ['viewAgreement']),
            State.State('viewAgreement', self.enterViewAgreement,
                        self.exitViewAgreement, ['youMustAgree']),
            State.State('youMustAgree', self.enterYouMustAgree,
                        self.exitYouMustAgree, ['viewAgreement'])
        ], 'off', 'off')
        self.fsm.enterInitialState()

    def load(self):
        guiButton = loader.loadModelOnce('phase_3/models/gui/quit_button')
        background = loader.loadModel('phase_3/models/gui/login-background')
        cogIcons = loader.loadModel('phase_3/models/gui/cog_icons')
        self.frame = DirectFrame(parent=aspect2d,
                                 relief=FLAT,
                                 image=background.find('**/member_agreement'))
        self.welcomeLabel = DirectLabel(
            parent=self.frame,
            relief=None,
            pos=(0, 0, 0.88),
            text=Localizer.MemberAgreementScreenWelcome,
            text_font=getMinnieFont(),
            text_scale=0.0935,
            text_fg=(1, 0.5, 0.1, 1),
            text_shadow=(0, 0, 0, 1),
            text_shadowOffset=(0.08, 0.08))
        self.onYourWayLabel = DirectLabel(
            parent=self.frame,
            relief=None,
            pos=(0, 0, 0.79),
            text=Localizer.MemberAgreementScreenOnYourWay,
            text_scale=0.0725,
            text_fg=(1, 1, 0, 1),
            text_shadow=(0, 0, 0, 1),
            text_shadowOffset=(0.08, 0.08))
        self.toontownLabel = DirectLabel(
            parent=self.frame,
            relief=None,
            pos=(0, 0, 0.67),
            text=Localizer.MemberAgreementScreenToontown,
            text_font=getMinnieFont(),
            text_scale=0.087,
            text_fg=(1, 0.5, 0.1, 1),
            text_shadow=(0, 0, 0, 1),
            text_shadowOffset=(0.08, 0.08))
        priceColor = (0, 0.9, 0, 1)
        if self.tcr.getCreditCardUpFront():
            priceTextScale = 0.09
            self.pricingLabel = DirectLabel(
                parent=self.frame,
                relief=None,
                pos=(0, 0, 0.558),
                text=Localizer.MemberAgreementScreenCCUpFrontPricing,
                text_scale=priceTextScale,
                text_fg=(1, 1, 0, 1),
                text_shadow=(0, 0, 0, 1),
                text_shadowOffset=(0.08, 0.08))
            self.freeTrialDuration = DirectLabel(
                parent=self.pricingLabel,
                relief=None,
                pos=(-0.36, 0, 0),
                text=self.tcr.accountServerConstants.getString(
                    'freeTrialPeriodInDays'),
                text_scale=priceTextScale,
                text_fg=priceColor,
                text_shadow=(0, 0, 0, 1),
                text_shadowOffset=(0.08, 0.08))
            priceFirstMonthPos = (0.92, 0, -0.18)
            pricePerMonthPos = (-0.11, 0, -0.27)
        else:
            priceTextScale = 0.1
            self.pricingLabel = DirectLabel(
                parent=self.frame,
                relief=None,
                pos=(0, 0, 0.558),
                text=Localizer.MemberAgreementScreenPricing,
                text_scale=priceTextScale,
                text_fg=(1, 1, 0, 1),
                text_shadow=(0, 0, 0, 1),
                text_shadowOffset=(0.08, 0.08))
            priceFirstMonthPos = (0.52, 0, 0)
            pricePerMonthPos = (0.85, 0, -0.1)
        self.priceFirstMonth = DirectLabel(
            parent=self.pricingLabel,
            relief=None,
            pos=priceFirstMonthPos,
            text='$%s' %
            self.tcr.accountServerConstants.getString('priceFirstMonth'),
            text_scale=priceTextScale,
            text_fg=priceColor,
            text_shadow=(0, 0, 0, 1),
            text_shadowOffset=(0.08, 0.08))
        self.pricePerMonth = DirectLabel(
            parent=self.pricingLabel,
            relief=None,
            pos=pricePerMonthPos,
            text='$%s' %
            self.tcr.accountServerConstants.getString('pricePerMonth'),
            text_scale=priceTextScale,
            text_fg=priceColor,
            text_shadow=(0, 0, 0, 1),
            text_shadowOffset=(0.08, 0.08))
        self.dobEntry = DateOfBirthEntry(parent=self.frame,
                                         pos=(0, 0, 0.26),
                                         scale=0.095,
                                         defaultAge=0,
                                         curYear=self.tcr.dateObject.getYear())
        if not self.checkAge:
            self.dobEntry.hide()
        self.memAgreement = MultiPageTextFrame(parent=self.frame,
                                               relief=None,
                                               textList=self.legalText,
                                               hidePageNum=1,
                                               width=1.8,
                                               height=0.9,
                                               wordWrap=34,
                                               pos=(0, 0, -0.3))
        self.cogIcon = DirectLabel(parent=self.memAgreement,
                                   relief=None,
                                   pos=(-0.75, 0, 0.3),
                                   scale=0.25,
                                   image=cogIcons.find('**/LegalIcon'))
        self.agreementTitle = DirectLabel(
            parent=self.memAgreement,
            relief=None,
            pos=(0.0426513, 0, 0.268794),
            scale=0.09,
            text=Localizer.MemberAgreementScreenAgreementTitle,
            text_font=getSuitFont(),
            text_wordwrap=10)
        self.clickNextLabel = DirectLabel(
            parent=self.memAgreement,
            relief=None,
            pos=(-0.325283, 0, -0.388257),
            scale=0.05,
            text=Localizer.MemberAgreementScreenClickNext)
        self.memAgreement.setPageChangeCallback(self.__handlePageChange)
        bottomButtonZ = -0.57
        self.cancelButton = DirectButton(
            parent=self.memAgreement,
            relief=None,
            scale=1.1,
            image=(guiButton.find('**/QuitBtn_UP'),
                   guiButton.find('**/QuitBtn_DN'),
                   guiButton.find('**/QuitBtn_RLVR')),
            image_scale=(1, 1, 1),
            pos=(-0.5, 0, bottomButtonZ),
            text=Localizer.MemberAgreementScreenCancel,
            text_scale=0.06,
            text_pos=(0, -0.018),
            command=self.__handleCancel)
        self.declineButton = DirectButton(
            parent=self.memAgreement,
            relief=None,
            scale=1.1,
            image=(guiButton.find('**/QuitBtn_UP'),
                   guiButton.find('**/QuitBtn_DN'),
                   guiButton.find('**/QuitBtn_RLVR')),
            image_scale=(1, 1, 1),
            pos=(0, 0, bottomButtonZ),
            text=Localizer.MemberAgreementScreenDisagree,
            text_scale=0.06,
            text_pos=(0, -0.018),
            command=self.__handleDisagree)
        self.acceptButton = DirectButton(
            parent=self.memAgreement,
            relief=None,
            scale=1.1,
            image=(guiButton.find('**/QuitBtn_UP'),
                   guiButton.find('**/QuitBtn_DN'),
                   guiButton.find('**/QuitBtn_RLVR')),
            image_scale=(1, 1, 1),
            pos=(0.5, 0, bottomButtonZ),
            text=Localizer.MemberAgreementScreenAgree,
            text_scale=0.06,
            text_pos=(0, -0.018),
            command=self.__handleAgree)
        self.dialogDoneEvent = 'memberAgreementDialogAck'
        self.dialog = ToontownDialog.GlobalDialog(
            doneEvent=self.dialogDoneEvent,
            message='',
            style=ToontownDialog.Acknowledge)
        self.dialog.hide()
        self.mustAgreeDialog = DirectFrame(
            relief=None,
            pos=(0, 0.1, 0),
            image=getDefaultDialogGeom(),
            image_color=GlobalDialogColor,
            image_scale=(1.3, 1.0, 0.8),
            text=Localizer.MemberAgreementScreenYouMustAgree,
            text_scale=0.08,
            text_pos=(0.0, 0.2),
            text_wordwrap=15,
            sortOrder=NO_FADE_SORT_INDEX)
        self.mustAgreeDialog.hide()
        linePos = -0.13
        buttonImageScale = 1.1
        buttonLineHeight = 0.112
        self.mustAgreeOkButton = DirectButton(
            parent=self.mustAgreeDialog,
            relief=None,
            pos=(0, 0, linePos),
            scale=0.9,
            image=(guiButton.find('**/QuitBtn_UP'),
                   guiButton.find('**/QuitBtn_DN'),
                   guiButton.find('**/QuitBtn_RLVR')),
            image_scale=buttonImageScale,
            text=Localizer.MemberAgreementScreenYouMustAgreeOk,
            text_scale=0.06,
            text_pos=(0, -0.02),
            command=self.__handleMustAgreeOk)
        linePos -= buttonLineHeight
        self.mustAgreeQuitButton = DirectButton(
            parent=self.mustAgreeDialog,
            relief=None,
            pos=(0, 0, linePos),
            scale=0.9,
            image=(guiButton.find('**/QuitBtn_UP'),
                   guiButton.find('**/QuitBtn_DN'),
                   guiButton.find('**/QuitBtn_RLVR')),
            image_scale=buttonImageScale,
            image0_color=Vec4(1, 0.1, 0.1, 1),
            image1_color=Vec4(1, 0.1, 0.1, 1),
            image2_color=Vec4(1, 1, 1, 1),
            text=Localizer.MemberAgreementScreenYouMustAgreeQuit,
            text_scale=0.06,
            text_pos=(0, -0.02),
            command=self.__handleMustAgreeQuit)
        linePos -= buttonLineHeight
        self.frame.hide()
        background.removeNode()
        guiButton.removeNode()
        cogIcons.removeNode()
        return

    def unload(self):
        self.mustAgreeDialog.destroy()
        self.frame.destroy()
        self.dialog.cleanup()
        del self.frame
        del self.dialog
        del self.fsm

    def enter(self):
        self.frame.show()

        def getDOBfromEntry(self=self):
            self.dobMonth = self.dobEntry.getMonth()
            self.dobYear = self.dobEntry.getYear()
            self.dobDay = self.dobEntry.getDay()

        if self.tcr.getCreditCardUpFront():
            getDOBfromEntry()
        try:
            error = self.loginInterface.getAccountData(self.tcr.userName,
                                                       self.tcr.password)
        except TTAccount.TTAccountException:
            error = 'exception raised'
        else:
            if not error:
                accountData = self.loginInterface.accountData
                if not (accountData.hasKey('dobMonth')
                        and accountData.hasKey('dobYear')
                        and accountData.hasKey('dobDay')):
                    error = 1
            if error:
                getDOBfromEntry()
            try:
                self.dobMonth = accountData.getInt('dobMonth')
                self.dobYear = accountData.getInt('dobYear')
                self.dobDay = accountData.getInt('dobDay')
            except ValueError:
                getDOBfromEntry()
            else:
                if self.checkAge:
                    self.dobEntry.setMonth(self.dobMonth)
                    self.dobEntry.setYear(self.dobYear)
                    self.dobEntry.setDay(self.dobDay)

        self.age = toonbase.tcr.dateObject.getAge(self.dobMonth, self.dobYear,
                                                  self.dobDay)
        self.fsm.request('getParents')

    def exit(self):
        self.fsm.requestFinalState()
        self.frame.hide()

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterGetParents(self):
        if self.tcr.getCreditCardUpFront() or self.age < 18:
            if self.tcr.getCreditCardUpFront():
                msg = Localizer.MemberAgreementScreenGetParentsUnconditional
            else:
                msg = Localizer.MemberAgreementScreenGetParents
            self.dialog.setMessage(msg)
            self.dialog.show()

            def handleGetParentsAck(self=self):
                self.dialog.hide()
                self.fsm.request('viewAgreement')

            self.acceptOnce(self.dialogDoneEvent, handleGetParentsAck)
        else:
            self.fsm.request('viewAgreement')

    def exitGetParents(self):
        pass

    def enterViewAgreement(self):
        self.memAgreement.acceptAgreementKeypresses()

    def exitViewAgreement(self):
        self.memAgreement.ignoreAgreementKeypresses()

    def enterYouMustAgree(self):
        base.transitions.fadeScreen(0.5)
        self.mustAgreeDialog.show()

    def __handleMustAgreeOk(self):
        self.fsm.request('viewAgreement')

    def __handleMustAgreeQuit(self):
        messenger.send(self.doneEvent, [{'mode': 'quit'}])

    def exitYouMustAgree(self):
        base.transitions.noTransitions()
        self.mustAgreeDialog.hide()

    def __handleAgree(self):
        if self.checkAge:
            age = self.dobEntry.getAge()
            if age < 18:
                self.dialog.setMessage(
                    Localizer.MemberAgreementScreenMustBeOlder)
                self.dialog.show()

                def handleOlderAck(self=self):
                    self.dialog.hide()
                    self.fsm.request('viewAgreement')

                self.acceptOnce(self.dialogDoneEvent, handleOlderAck)
                self.memAgreement.ignoreAgreementKeypresses()
            else:
                messenger.send(self.doneEvent, [{'mode': 'agree'}])
        else:
            messenger.send(self.doneEvent, [{'mode': 'agree'}])

    def __handleDisagree(self):
        self.fsm.request('youMustAgree')

    def __handleCancel(self):
        messenger.send(self.doneEvent, [{'mode': 'cancel'}])

    def __handlePageChange(self, pageNum):
        if pageNum == 0:
            self.cogIcon.show()
            self.agreementTitle.show()
            self.clickNextLabel.show()
        else:
            self.cogIcon.hide()
            self.agreementTitle.hide()
            self.clickNextLabel.hide()