from basemodel import Stage, ListStage, YesNoStage, EntryStage, EntryNumberStage, \
	PINInputStage, NotifyStage
from model import StartCallnotPrefixStage
import runtime, config, uiconfig, ui, time
import status
from setting import setting
import os

dspg = runtime.dspg

class InfoProGenPub(StartCallnotPrefixStage):
	number = '1004'
	service_name = _('Information professionals and general public')
class BreakAtt(StartCallnotPrefixStage):
	number = '1002'
	service_name = _('Breakdown attention')

class Universal(StartCallnotPrefixStage):
	number = '11818'
	service_name = _('National information (universal service)')

class AddedVal(StartCallnotPrefixStage):
	number = '11822'
	service_name = _('National information added value')

class InternationInfo(StartCallnotPrefixStage):
	number = '11825'
	service_name = _('International information')

class TimeInfo(StartCallnotPrefixStage):
	number = '093'
	service_name = _('Time information')

class NewsRadio(StartCallnotPrefixStage):
	number = '095'
	service_name = _('News Radio Nacional de Espana')

class Wakeup(StartCallnotPrefixStage):
	number = '096'
	service_name = _('Wake-up service')

class SportInfo(StartCallnotPrefixStage):
	number = '097'
	service_name = _('Sport information')

class GenInfo(StartCallnotPrefixStage):
	number = '098'
	service_name = _('General information')

class SpeedDial8SettingStage(EntryStage):
	name = 'SpeedDial8Setting'
	title = _('SPEED DIAL 8 SETTING')

	def __init__(self):
		EntryStage.__init__(self, _('Speed dial (2~9)'), title=self.title, left=_('OK'), right=_('BACK'))
		self.ui.set_max(1)
		self.ui.set_fixed_automata('123', False)

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('No number inserted') ) )
		elif focus == '*' or focus == '#':
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('Invalid entry') ) )
		elif int(focus) < 2:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('Out of range') ) )
		else:
			runtime.manager.stack_stage(SpeedDial8SetStage(focus))

	def handle_key(self, key):
		if not self.ui.get_text():
			if key == 'Up':
				stage = self.activate_stage(0);
				runtime.manager.change_stage(stage)
				return True
			elif key == 'Down':
				stage = self.activate_stage(-1);
				runtime.manager.change_stage(stage)
				return True
		return EntryStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)


	def activate_menu2(self):
		runtime.manager.back_stage()

class SpeedDial8SetStage(EntryStage):
	name = 'SpeedDial8Set'
	title = _('SPEED DIAL 8 SETTING')

	def __init__(self, speed_dial):
		EntryStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('BACK'))
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False)
		self.speed_dial = speed_dial

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('No number inserted') ) )
		else:
			#eicho modify 06.04.11
			#FAC = config.FAC_SPEED_DIAL_8 + self.speed_dial + '*' + focus + '#'
			FAC = config.FAC_SPEED_DIAL_8_SET + self.speed_dial + focus
			status.service_name = _('Speed dial 8: set') + ' ' + self.speed_dial
			runtime.manager.start_call(FAC)

	def handle_key(self, key):
		if not self.ui.get_text():
			if key == 'Up':
				stage = self.activate_stage(0);
				runtime.manager.change_stage(stage)
				return True
			elif key == 'Down':
				stage = self.activate_stage(-1);
				runtime.manager.change_stage(stage)
				return True
		return EntryStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)


	def activate_menu2(self):
		runtime.manager.back_stage()

class SpeedDial8Stage(EntryStage):
	name = 'SpeedDial8'
	title = _('SPEED DIAL 8')

	def __init__(self):
		EntryStage.__init__(self, _('Speed dial (2~9)'), title=self.title, left=_('OK'), right=_('BACK'))
		self.ui.set_max(1)
		self.ui.set_fixed_automata('123','lower')

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('No number inserted') ) )
		elif focus == '*' or focus == '#':
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('Invalid entry') ) )
		elif int(focus) < 2:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('Out of range') ) )
		else:
			FAC = focus
			status.service_name = _('Speed dial 8') + ':' + focus
			runtime.manager.start_call(FAC)

	def handle_key(self, key):
		if not self.ui.get_text():
			if key == 'Up':
				stage = self.activate_stage(0);
				runtime.manager.change_stage(stage)
				return True
			elif key == 'Down':
				stage = self.activate_stage(-1);
				runtime.manager.change_stage(stage)
				return True
		return EntryStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)


	def activate_menu2(self):
		runtime.manager.back_stage()

class CallerIDBlockingStage(EntryStage):
	name = 'CallerIDBlocking'
	title = _('CALLER ID BLOCKING PER CALL')

	def __init__(self):
		EntryStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('BACK'))
#ka...slim phone numberÃÑ±æÀÌ´Â 50 (067+47) 2007.05.17
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False)

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('No number inserted') ) )
		else:
			FAC = config.FAC_CALLER_ID_BLOCKING_PER_CALL + focus
			status.service_name = _('Caller ID blocking:') +focus
			runtime.manager.start_call(FAC)
	def handle_key(self, key):
		if not self.ui.get_text():
			if key == 'Up':
				stage = self.activate_stage(0);
				runtime.manager.change_stage(stage)
				return True

			elif key == 'Down':
				stage = self.activate_stage(-1);
				runtime.manager.change_stage(stage)
				return True
		return EntryStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)


	def activate_menu2(self):
		runtime.manager.back_stage()


class CallerIDUnblockingStage(EntryStage):
	name = 'CallerIDUnblocking'
	title = _('CALLER ID DELIVERY PER CALL')

	def __init__(self):
		EntryStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('BACK'))
#ka...slim phone numberÃÑ±æÀÌ´Â 50 (067+47) 2007.05.17
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False)

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('No number inserted') ) )
		else:
			FAC = config.FAC_CALLER_ID_UNBLOCKING_PER_CALL + focus
			status.service_name = _('Caller ID delivery:') +focus
			runtime.manager.start_call(FAC)
	def handle_key(self, key):
		if not self.ui.get_text():
			if key == 'Up':
				stage = self.activate_stage(0);
				runtime.manager.change_stage(stage)
				return True

			elif key == 'Down':
				stage = self.activate_stage(-1);
				runtime.manager.change_stage(stage)
				return True
		return EntryStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)


	def activate_menu2(self):
		runtime.manager.back_stage()

class DoNotDisturbStage(ListStage):
	name = 'DoNotDisturb'
	icon = uiconfig.voip_icon

	def __init__(self):
		self.title = _('DO NOT DISTURB')
		self.choice = _('Enable'), _('Disable')

		ListStage.__init__(self, choice=self.choice, title=self.title)

	def activate(self, index):
		import profile
		if profile.ip_mode == 0:	# PSTN
			FAC = (config.FAC_DO_NOT_DISTURB_PSTN_ENABLE, config.FAC_DO_NOT_DISTURB_PSTN_DISABLE)[index]
		else:			# IP mode
			FAC = (config.FAC_DO_NOT_DISTURB_ENABLE, config.FAC_DO_NOT_DISTURB_DISABLE)[index]
		status.service_name = (_('Do not disturb: Enable'), _('Do not disturb: Disable') )[index]
		
		#runtime.manager.start_call(FAC, notPrefix=True)
		# eicho add 06.10.12
		runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)


# KA: [20071030] KT DEMO
class PrePayStage(EntryNumberStage):
	name = 'Pre-Pay'
	title = _('PRE-PAY')

	def __init__(self):
		EntryNumberStage.__init__(self, _('Card')+ ' ' +_('Number'), title=self.title, left=_('OK'), right=_('BACK'), org_stage=0)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False)

	#ka...added 2006.10.12
	def set_text(self, text):
		self.ui.set_text(text)
		#self.update_left()

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		card_number = self.ui.get_text()
		if len(card_number) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage(_('No number inserted')))
		else:
			runtime.manager.stack_stage(PrePayStageNumberEditStage(card_number))

	def activate_menu2(self):
		runtime.manager.back_stage()

class PrePayStageNumberEditStage(EntryNumberStage):
	name = 'PrePayStageNumberEdit'
	title = _('PRE-PAY')
	
	def __init__(self, card_number):
		self.card_number = card_number
		EntryNumberStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('PHONEBOOK'), org_stage=0)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False, right_field='PHONEBOOK')

	def activate_stage(self, number):
		if len(number) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage(_('No number inserted')))
		else:
			FAC = config.FAC_PRE_PAY_CARD + self.card_number + '#' + number + '#'
			status.service_name = _('Pre-pay service')

			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	#ka...added 2006.10.12
	def set_text(self, text):
		self.ui.set_text(text)
		#self.update_left()

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)

	def activate_menu2(self):
		runtime.manager.back_stage()




class AutoAnswerStage(ListStage):
	name = 'AutoAnswer'
	icon = uiconfig.voip_icon

	def __init__(self):
		self.title = _('AUTO ANSWER')
		self.choice = _('Basic'), _('SMS enable'), _('SMS disable')

		ListStage.__init__(self, choice=self.choice, title=self.title)

	def activate(self, index):
		if index == 0:
			FAC = config.FAC_AUTO_ANSWER_BASIC
			status.service_name = _('Auto answer: Basic')
		elif index ==1:
			runtime.manager.stack_stage(AutoAnswerNumberEditStage)
		else:
			FAC = config.FAC_AUTO_ANSWER_SMS_DISABLE
			status.service_name = _('Auto answer: Cancel receiving SMS')

		runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)
		
		
class AutoAnswerNumberEditStage(EntryNumberStage):
	name = 'AutoAnswerNumberEdit'
	title = _('AUTO ANSWER')

	def __init__(self):
		EntryNumberStage.__init__(self, _('SMS receiving')+' '+_('Number'), title=self.title, left=_('OK'), right=_('PHONEBOOK'), org_stage=0)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False, right_field='PHONEBOOK')

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage(_('No number inserted')))
		else:
			FAC = config.FAC_AUTO_ANSWER_SMS_ENABLE + focus + '*'
			status.service_name = _('Auto answer: Receiving SMS')

			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	#ka...added 2006.10.12
	def set_text(self, text):
		self.ui.set_text(text)
		#self.update_left()

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)

	def activate_menu2(self):
		runtime.manager.back_stage()


class CallForwardingStage(ListStage):
	name = 'CallForwarding'
	icon = uiconfig.voip_icon

	def __init__(self):
		self.title = _('CALL FORWARDING')
		self.choice = _('Always'), _('Busy /No answer')

		ListStage.__init__(self, choice=self.choice, title=self.title)

	def activate(self, index):
		runtime.manager.stack_stage(CallForwardingChangeStage(index))

class CallForwardingChangeStage(ListStage):
	name = 'CallForwardingChange'
	icon = uiconfig.voip_icon

	def __init__(self, selected_option):
		self.title = _('CALL FORWARDING')
		self.choice = _('Enable'), _('Disable'), _('confirm')

		self.selected_option = selected_option
		ListStage.__init__(self, choice=self.choice, title=self.title)
		# hcryoo : [20071107_1] : ¿µ»ó ±âº» ºÎ°¡ ¼­ºñ½º¸¦ À§ÇÑ ¿µ»ó ¼­ºñ½º ¼³Á¤
		status.in_service = True
		# hcryoo : [20071107_1] : ¿µ»ó ±âº» ºÎ°¡ ¼­ºñ½º¸¦ À§ÇÑ ¿µ»ó ¼­ºñ½º ¼³Á¤==

	def activate(self, index):
		if index == 0: # enable
			runtime.manager.stack_stage(CallForwardingNumberEditStage(self.selected_option, index))
		elif index ==1:
			if self.selected_option == 0:
				FAC = config.FAC_CALL_FORWARDING_ALWAYS_DISABLE
				status.service_name = _('Call forwarding: Disable (Always)')
			elif self.selected_option == 1:
				FAC = config.FAC_CALL_FORWARDING_BUSY_DISABLE
				status.service_name = _('Call forwarding: Disable (Busy/No answer)')
#			else: # self.selected_option == 2
#				FAC = config.FAC_CALL_FORWARDING_NO_ANSWER_DISABLE
#				status.service_name = _('Call forwarding: Disable (No answer)')
		else:
			if self.selected_option == 0:
				FAC = config.FAC_CALL_FORWARDING_ALWAYS_CONFIRM
				status.service_name = _('Call forwarding: Confirm (Always)')
			elif self.selected_option == 1:
				FAC = config.FAC_CALL_FORWARDING_BUSY_CONFIRM
				status.service_name = _('Call forwarding: Confirm (Busy/No answer)')
			# eicho add 06.10.12
		# hcryoo : [20071107_1] : ¿µ»ó ±âº» ºÎ°¡ ¼­ºñ½º¸¦ À§ÇÑ ¿µ»ó ¼­ºñ½º ¸ðµå ÁöÁ¤
		runtime.manager.start_call(FAC, video_call=True, notPrefix=True, supplementary=True)
		# hcryoo : [20071107_1] : ¿µ»ó ±âº» ºÎ°¡ ¼­ºñ½º¸¦ À§ÇÑ ¿µ»ó ¼­ºñ½º ¸ðµå ÁöÁ¤==

class CallForwardingNumberEditStage(EntryNumberStage):
	name = 'CallForwardingNumberEdit'
	title = _('CALL FORWARDING')

	def __init__(self, selected_option, disable):
		self.selected_option = selected_option
		self.disable = disable
		EntryNumberStage.__init__(self, _('Forwaring')+' '+_('Number'), title=self.title, left=_('OK'), right=_('PHONEBOOK'), org_stage=0)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False, right_field='PHONEBOOK')

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage(_('No number inserted')))
		else:
			if self.selected_option == 0:
				if self.disable:
					FAC = config.FAC_CALL_FORWARDING_ALWAYS_DISABLE
					status.service_name = _('Call forwarding: Disable (Always)')
				else:
					FAC = config.FAC_CALL_FORWARDING_ALWAYS_ENABLE + focus + '*'
					status.service_name = _('Call forwarding: Enable (Always)')
			elif self.selected_option == 1:
				if self.disable:
					FAC = config.FAC_CALL_FORWARDING_BUSY_DISABLE
					status.service_name = _('Call forwarding: Disable (Busy/No answer)')
				else:
					FAC = config.FAC_CALL_FORWARDING_BUSY_ENABLE + focus + '*'
					status.service_name = _('Call forwarding: Enable (Busy/No answer)')
#			else: # self.selected_option == 2
#				if self.disable:
#					FAC = config.FAC_CALL_FORWARDING_NO_ANSWER_DISABLE
#					status.service_name = _('Call forwarding: Disable (No answer)')
#				else:
#					FAC = config.FAC_CALL_FORWARDING_NO_ANSWER_ENABLE + focus + '#'
#					status.service_name = _('Call forwarding: Enable (No answer)')
			# eicho add 06.10.12
			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	#ka...added 2006.10.12
	def set_text(self, text):
		self.ui.set_text(text)
		#self.update_left()

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)

	def activate_menu2(self):
		runtime.manager.back_stage()



class NumberEntryNotifyStage(NotifyStage):

	def __init__(self, message,cb=None):
		icon = uiconfig.baloon_message_voip_icon
		NotifyStage.__init__(self, message, icon, cb)

class MWINotifyStage(Stage):
	def __init__(self):
		status.mwi_notification_window = 0
		self.ui = ui.MWINotificationUI(status.mwi_normal_new, status.mwi_normal_old, status.mwi_urgent_new, status.mwi_urgent_old)

	def handle_key(self, key):
		if key == config.Menu1:
			status.service_name = _('Access to automatic answering device')
			runtime.manager.start_call(config.FAC_ACCESS_TO_AUTOMATIC_ANSWERING_DEVICE)
		elif key == config.Menu2:
			if runtime.manager.stage.get_name() == 'AudioCallTerminated':
				runtime.manager.change_stage(IdleStage, True)
			else:
				runtime.manager.back_stage()
		elif key == config.Red:
			if runtime.manager.stage.get_name() == 'AudioCallTerminated':
				runtime.manager.change_stage(IdleStage, True)
			else:
				runtime.manager.back_stage()
		return

	def destroy(self):
		Stage.destroy(self)

# all classes related to supervision are moved from menu.py
class VideoSupervisionPINCheckStage(PINInputStage):
	def __init__(self):
		PINInputStage.__init__(self, _('PIN')+':', _('VIDEO SUPERVISION'), _('Insert PIN'))

	def activate(self, pin):
		if setting.pin == pin:
			stage = VideoSupervisionOptionStage
			runtime.manager.change_stage(stage)
		else:
			self.ui.pin = ''
			self.ui.update()

			stage = NotifyStage(_('Wrong PIN'), uiconfig.baloon_TdE_video_supervision_icon)

			runtime.manager.stack_stage(stage)


class VideoSupervisionOptionStage(ListStage):
	name = 'VideoSupervisionOption'

	icon = uiconfig.TdE_video_supervision_icon


	def __init__(self):
		self.title = _('VIDEO SUPERVISION')
		self.choice = _('Disable'), _('Number')
	
		ListStage.__init__(self)

	def show(self):

		if setting.video_supervision_enable:
			choice = (_('Disable'), _('Number'))
		else:
			choice = (_('Enable'), _('Number'))

		self.change_choice(choice)
		ListStage.show(self)

	def activate(self, index):

		if index == 0:

			if setting.video_supervision_enable:
				stage = YesNoStage(_('Video supervision enabled.')+'\n'+_('Disable?'), self.disabled_cb, self.no_cb, '', uiconfig.baloon_TdE_video_supervision_icon)
				runtime.manager.stack_stage(stage)

			else:

				runtime.manager.stack_stage(YesNoStage(_('Video supervision disabled.')+'\n'+_('Enable?'), self.enabled_cb, self.no_cb, '', uiconfig.baloon_TdE_video_supervision_icon))
		else:
			runtime.manager.stack_stage(VideoSupervisionNumberListStage)

	def no_cb(self):
		runtime.manager.back_stage()

	def disabled_cb(self):
		setting.video_supervision_enable = 0
		runtime.manager.change_stage(NotifyStage(_('Video supervision disabled.'),uiconfig.baloon_TdE_video_supervision_icon))

	def enabled_cb(self):
		setting.video_supervision_enable = 1
		runtime.manager.change_stage(NotifyStage(_('Video supervision enabled.'), uiconfig.baloon_TdE_video_supervision_icon))


class VideoSupervisionNumberListStage(ListStage):
	name = 'VideoSupervisionNumberList'
	def __init__(self):
		self.title = _('VIDEO SUPERVISION')
		self.choice = [_('Number') + ' 1', _('Number') + ' 2', _('Number') + ' 3']

		i = 0
		for k in setting.supervision_number:
			if k != '':
				self.choice[i] = setting.supervision_number[i]
			i+=1
		icon = uiconfig.TdE_video_supervision_icon
		ListStage.__init__(self, self.choice)

	def activate(self, index):
		runtime.manager.stack_stage(VideoSupervisionNumberEditStage(index))

	def update(self):
		i = 0
		for k in setting.supervision_number:
			if k == '':
				self.choice[i] =  _('Number') + ' '+ str(i+1)
			else:
				self.choice[i] = setting.supervision_number[i]
			i+=1
		self.change_choice(self.choice)

class VideoSupervisionNumberEditStage(EntryStage):
	title = _('VIDEO SUPERVISION')

	def __init__(self, index):
		self.index = index
		EntryStage.__init__(self, _('Number')+' '+str(self.index+1), self.title)
		self.ui.insert_text(setting.supervision_number[self.index])
		self.ui.set_fixed_automata('123', False)
		self.ui.set_max(config.max_phone_number)

	def activate_menu1(self):
		setting.supervision_number[self.index] = self.ui.get_text()
		setting.save()

		runtime.manager.back_stage()
		runtime.manager.stage.update()
		runtime.manager.stage.show()

class SupervisionConnectedStage(Stage):
	name = 'SupervisionConnected'
	#pid = None
	def __init__(self, current_stage_name, current_ui):
		if current_stage_name == 'idle':
			status.supervision_idle = 1

		status.dialed_by_user = False
		self.ui = current_ui

		runtime.manager.set_videocall_mode(status.VideoCallConnected)
		status.set_video_mode(status.VideoConnected)
		status.waiting = 0
		status.business_option_status = status.NotSelected
		status.business_call_status = status.OneCallConnected
		status.phone_status = status.VoiceConnected # vpark 09.26
#ka...Slim screen saver µ¿ÀÛÁß Supervision¿Íµµ No change 2007.05.15
#		setting.reset_screen_saver_timer() #(temporarily to turn off screen saver -LCD turns on when TUP loading)
#		status.screensaver_activated = False # (temporarily to turn off screen saver -LCD turns on when TUP loading)

		status.save_current_call_status()
		os.system('fb0top 1')
		os.system('fb0top 1')
		self.invite_request()

	def invite_request(self):
		status.set_modem_audio_state(status.SPK)
		runtime.dspg.set_state(runtime.dspg.ST_V_SPK_OFFHK)
#ka...3800 2007.06.06 Supervion½Ã Speaket MUTE
		setting.set_volume(0) # set speaker mute
		
# eicho add 06.11.16 as Nortel's solution.
		import time
		time.sleep(3)
# end.
		runtime.vdci_send_mesg(code1=config.MESG_INCOMING_CALL,
					code2=config.MESG_CALL_ACCEPT, mesg1=config.SUPERVISION_CALL)

	def invite_sucessed(self):
		status.supervision_call_on = 1
		# hcryoo : [20070613_1] open remote quickly
		import utils
		#self.iframe_timer =  utils.Timer(1000, self.send_iframe)
		#self.iframe_repeat = 3
		# hcryoo : [20070613_1] open remote quickly==

	# hcryoo : [20070613_1] open remote quickly
	def send_iframe(self):
		runtime.vdci_send_mesg(code1=config.MESG_SET_PARAMS, \
					code2=config.MESG_GET_INFO)
		if self.iframe_repeat > 0:
			self.iframe_repeat = self.iframe_repeat - 1
			return True
		self.iframe_timer = None
		return False
	# hcryoo : [20070613_1] open remote quickly==

	def handle_key(self, key):
		runtime.vdci_send_mesg(code1=config.MESG_HANGUP)
		self.end_supervision()
		runtime.manager.handle_key(True, key)
		return True

	def end_supervision(self):
		time.sleep(1) # since tup is not down yet, audio device is open, and if the green key is pressed, no dial tone.
		# hcryoo : [20070613_1] open remote quickly
		self.iframe_timer = None
		# hcryoo : [20070613_1] open remote quickly==
		status.supervision_call_on = 0
		status.supervision_idle = 0
		runtime.manager.set_videocall_mode(status.VideoCallDisconnected)
		status.release_channel()
		status.clear_current_call_status()
		status.reset_call_status()
		status.waiting = 0
		status.business_option_status = status.NotSelected
		status.business_call_status == status.OneCallConnected
		status.phone_status = status.Disconnected
		runtime.manager.back_stage()
		setting.set_volume(setting.speaker_volume)
		status.set_modem_audio_state(status.IDLE)
		runtime.dspg.set_state(runtime.dspg.ST_IDLE)
#ka...Slim screen saver µ¿ÀÛÁß Supervision¿Íµµ No change 2007.05.15
#		status.not_screen_saver = False
#		setting.reset_screen_saver_timer()
		status.screensaver_activated = False

	def release_supervision(self):
		time.sleep(1) # since tup is not down yet, audio device is open, and if the green key is pressed, no dial tone.
		# hcryoo : [20070613_1] open remote quickly
		self.iframe_timer = None
		# hcryoo : [20070613_1] open remote quickly==
		status.supervision_call_on = 0
		status.supervision_idle = 0
		runtime.manager.set_videocall_mode(status.VideoCallDisconnected)
		status.release_channel()
		status.clear_current_call_status()
		status.reset_call_status()
		status.waiting = 0
		status.business_option_status = status.NotSelected
		status.business_call_status == status.OneCallConnected
		status.phone_status = status.Disconnected
		setting.set_volume(setting.speaker_volume)
		status.set_modem_audio_state(status.IDLE)
		runtime.dspg.set_state(runtime.dspg.ST_IDLE)
		status.not_screen_saver = False
		setting.reset_screen_saver_timer()
		status.screensaver_activated = False

	def handle_mwi_waiting(self):
		self.ui.set_mwi_waiting(setting.mwi_waiting)

	def handle_msg_waiting(self):
		self.ui.set_msg_waiting(setting.msg_waiting)

	def hide(self):
		#runtime.day.hide()
		Stage.hide(self)

	def show(self):
		'''
		if not runtime.timer.hidden:
			runtime.day.show()
		'''
		
		Stage.show(self)

	def destroy(self):
		# UI should not be destroyed.
		pass


class NetworkVoiceMailStage(ListStage):
	name = 'NetworkVoiceMail'
	icon = uiconfig.voip_icon

	def __init__(self):
		self.title = _('NETWORK VOICE MAIL')
		self.choice = _('Enable'), _('Disable'), _('Access'), _('Clear icon')

		ListStage.__init__(self, choice=self.choice, title=self.title)

	def activate(self, index):
		if index == 3:
			#ka...voice mail icon
			stage = YesNoStage(_('Do you want remove voice mail icon?'), self.yes_cb, self.no_cb, '', uiconfig.baloon_message_voip_icon)
			runtime.manager.stack_stage(stage)
			return True
		FAC = (config.FAC_NETWORK_VOICEMAIL_ENABLE, config.FAC_NETWORK_VOICEMAIL_DISABLE, config.FAC_NETWORK_VOICEMAIL_ACCESS)[index]
		status.service_name = (_('Network voice mail: Enable'), _('Network voice mail: Disable'), _('Network voice mail: Access') )[index]
		# eicho add 06.10.12
		runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	def no_cb(self):
		runtime.manager.back_stage()

	def yes_cb(self):
		setting.msg_waiting = 0
		runtime.manager.change_stage(NotifyStage(_('Voice mail icon cleared.'), uiconfig.baloon_message_voip_icon))


class HideIDStage(EntryNumberStage):
	name = 'HideID'
	title = _('HIDE ID')

	def __init__(self):
		EntryNumberStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('PHONEBOOK'), org_stage=1)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False, right_field='PHONEBOOK')

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage( _('No number inserted') ) )
		else:
			FAC = config.FAC_HIDE_ID_CODE + focus
			status.service_name = _('Hide ID:') +focus
			# eicho add 06.10.12
			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	def set_text(self, text):
		self.ui.set_text(text)

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)

	def activate_menu2(self):
		runtime.manager.back_stage()


class RejectionNumberEditStage(EntryNumberStage):
	name = 'SelectiveRejectionNumberEdit'
	title = _('SELECTIVE REJECTION')

	def __init__(self, disable):
		self.disable = disable
		EntryNumberStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('PHONEBOOK'), org_stage=2)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False, right_field='PHONEBOOK')

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage(_('No number inserted')))
		else:
			FAC = config.FAC_REJECT_SELECTIVE_REGISTER + focus + '#'
			status.service_name = _('Selective rejection: Register') + ' (' + focus + ')'
			# eicho add 06.10.12
			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	def set_text(self, text):
		self.ui.set_text(text)

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)

	def activate_menu2(self):
		runtime.manager.back_stage()

class DeregisterRejectionNumberEditStage(EntryNumberStage):
	name = 'DeregisterSelectiveRejectionNumberEdit'
	title = _('SELECTIVE REJECTION')

	def __init__(self, disable):
		self.disable = disable
		EntryNumberStage.__init__(self, _('Number'), title=self.title, left=_('OK'), right=_('PHONEBOOK'), org_stage=3)
#ka...3800 2007.06.07
		self.ui.set_max(config.max_phone_number-5)
		self.ui.set_fixed_automata('123', False, right_field='PHONEBOOK')

	def activate_stage(self, focus):
		if len(focus) == 0:
			runtime.manager.stack_stage(NumberEntryNotifyStage(_('No number inserted')))
		else:
			FAC = config.FAC_REJECT_SELECTIVE_DEREGISTER + focus + '#'
			status.service_name = _('Selective rejection: Deregister') + ' (' + focus + ')'
			# eicho add 06.10.12
			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)

	def set_text(self, text):
		self.ui.set_text(text)

	def handle_key(self, key):
		return EntryNumberStage.handle_key(self, key)

	def activate_menu1(self):
		text = self.ui.get_text()
		self.activate_stage(text)

	def activate_menu2(self):
		runtime.manager.back_stage()

class RejectionCallStage(ListStage):
	name = 'RejectionCall'
	icon = uiconfig.voip_icon

	def __init__(self, _type):
		self.choice = _('Enable'), _('Disable')
		self.type = _type
		if _type == 0:
			self.title = _('REJECTION ANONYMOUS')
		elif _type == 1:
			self.title = _('SELECTIVE REJECTION')
			self.choice = _('Enable'), _('Disable'), _('Register number'), _('Deregister number')
		ListStage.__init__(self, choice=self.choice, title=self.title)

	def activate(self, index):
		if self.type == 0:
			FAC = (config.FAC_REJECT_ANONYMOUS_ENABLE, config.FAC_REJECT_ANONYMOUS_DISABLE)[index]
			status.service_name = (_('Rejection of anonymous calls: Enable'), _('Rejection of anonymous calls: Disable') )[index]
			# eicho add 06.10.12
			runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)
			#runtime.manager.start_call(FAC,  notPrefix=True)
		elif self.type == 1:
			if index == 2:	# register number to be rejected
				runtime.manager.stack_stage(RejectionNumberEditStage(index))
			elif index == 3: # de-register number vpark 11.29
				runtime.manager.stack_stage(DeregisterRejectionNumberEditStage(index))
			else:		# Selective rejection is enabled or disabled.
				FAC = (config.FAC_REJECT_SELECTIVE_ENABLE, config.FAC_REJECT_SELECTIVE_DISABLE)[index]
				status.service_name = (_('Selective rejection: Enable'), _('Selective rejection: Disable') )[index]
				#runtime.manager.start_call(FAC,  notPrefix=True)
				# eicho add 06.10.12
				runtime.manager.start_call(FAC, notPrefix=True, supplementary=True)


_stages = InfoProGenPub, BreakAtt, Universal, AddedVal, InternationInfo, TimeInfo, NewsRadio, Wakeup, SportInfo, GenInfo

def get_stage(index):
	return _stages[index]

