from basemodel import ListStage, EntryStage, Stage, NotifyStage, YesNoStage, EntryNumberStage, PhoneBookEntryStage, SearchStage
from model import PhoneListBase
import ui, baseui, runtime, uiconfig
import config, status, utils
from phonedb import phonedb
from speeddb import speeddb
from setting import setting
from roxiadebug import *
import entry,controls
import errorcode

NAME, GROUP, PRIORITY, HOME, MOBILE, OFFICE, EMAIL, SPEED, MELODY, SNAPSHOT = range(10)

class PhonebookNotifyStage(NotifyStage):
	def __init__(self, message, cb=None):
		icon = uiconfig.baloon_phonebook_icon
		NotifyStage.__init__(self, message, icon, cb)

class FindStage(EntryStage):
	def __init__(self, flag=False, org_stage=''): # flag  Insert phone number ¿ëÀ¸·Î Ãß°¡
		EntryStage.__init__(self, _('Name'), _('SEARCH'), left=_('OK'), right=_('BACK'))
		self.ui.set_max(config.max_pb_name)
# KA: [20070831] hangul lvp-2000 
#ka...hangul add 2007.01.25
#		self.ui.set_automata('multitap','lower')
#		if setting.lang == 'Korean':
#			self.ui.set_automata('hangul', False)
#		else:
#			self.ui.set_automata('multitap', 'lower')
# --- End of adding
		# vpark 2006.08.28 automata	
		self.ui.set_fixed_automata(None, False)
# KA: [20070831] hangul lvp-2000 
		self.flag = flag
		self.org_stage = org_stage

	def activate_stage(self, focus):
		if phonedb.is_empty():
			if config.stage_debug:
				print self, 'phonedb is empty'
			return PhoneBookEmptyStage()
		else:
			#ka...modify 2006.10.16
			if self.flag == True:
				if focus:
					return InsertPhoneListStage(focus, self.org_stage)
				else:
					return InsertPhoneListStage(0, self.org_stage)
			else:
				if focus:
					return PhoneListStage(focus)
				else:
					return PhoneListStage(0)

	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):
		# 'Find'
		text = self.ui.get_text()
		stage = self.activate_stage(text)
		runtime.manager.change_stage(stage)

	def activate_menu2(self):
		runtime.manager.back_stage()
		status.assign_melody = ''
		status.assign_image = ''

	def destroy(self):
		EntryStage.destroy(self)


class FindForCallStage(FindStage):
	# idle¿¡¼­ Down key¿¡ÀÇÇØ ³ª¿À´Â È­¸é
	def __init__(self, include_all=False, _isemergency=False):
		FindStage.__init__(self)
		self.include_all = include_all
		self._isemergency = _isemergency

	def activate_stage(self, focus):
		if self._isemergency:
			return PhoneDialListStage(focus, not self.include_all)
		else:
			if phonedb.is_empty():
				if config.stage_debug:
					print self, 'phonedb is empty'
				return PhoneBookEmptyStage()
			return PhoneDialListStage(focus, not self.include_all)

def VIPStage():
	if status.phone_item.vip == 'true':
		def yes():
			status.phone_item.vip = ''
			phonedb.save()
			stage = NotifyStage(_('Deleted from VIP list'), uiconfig.baloon_pbook_vip_icon)
			runtime.manager.change_stage(stage)
		def no():
			runtime.manager.back_stage()
		icon = uiconfig.baloon_pbook_vip_icon
		stage = YesNoStage(_('Already in VIP list.') + '\n' + _('Remove?'), yes, no, '', icon)
	else:
		status.phone_item.vip = 'true'
		stage = NotifyStage(_('Set as VIP.'), uiconfig.baloon_pbook_vip_icon)
	return stage


def AssignSnapshotStage():
	import images
	return images.ImagesForPhonebookStage()


class AddLastStage(ListStage):
	name = 'add last'
	icon = uiconfig.phonebook_icon

	def __init__(self):
		self.title = _('ADD NEW')

		if status.phonebook_in_calling:
			self.choice = _('Save'), _('Set as VIP')
		else:
			self.choice = _('Save'), _('Assign melody'), _('Set as VIP'), _('Assign image')
		ListStage.__init__(self, self.choice)
		status.save_callback_other = self.save_callback

	def activate(self, index):
		if self.choice[index] == _('Save'):
			# Page 46
			if not status.phone_item.is_valid():
				stage = PhonebookNotifyStage(_('No data'))
				runtime.manager.change_stage(stage)
				return
			phonedb.insert_item(status.phone_item)
			emptystage = runtime.manager.find_stage('phonebook empty')
			if emptystage:
				runtime.manager.back_stage('phonebook empty')
				runtime.manager.change_stage(PhoneBookStage)
				stage = PhonebookNotifyStage(_('Entry saved!'))
				stage.ui.set_title(_('ADD NEW - SAVE'))
				runtime.manager.stack_stage(stage)
			else:
				pbstage = runtime.manager.find_stage('phonebook')
				if pbstage:
					runtime.manager.back_stage('phonebook')
					stage = PhoneListStage(0)
					runtime.manager.stack_stage(stage)
				else:
					pass
				stage = PhonebookNotifyStage(_('Entry saved!'))
				stage.ui.set_title(_('ADD NEW - SAVE'))
				runtime.manager.stack_stage(stage)
			return
		elif self.choice[index] == _('Assign melody'):
			runtime.manager.stack_stage(MelodyNewStage)
		elif self.choice[index] == _('Set as VIP'):
			runtime.manager.stack_stage(VIPStage)
		elif self.choice[index] ==_('Assign image'):
			runtime.manager.stack_stage(AssignSnapshotStage)

	def save_callback(self):
		phonedb.insert_item(status.phone_item)
		return (_('Entry saved in phonebook.'), uiconfig.baloon_phonebook_icon)

	def destroy(self):
		status.save_callback_other = None
		ListStage.destroy(self)

class AddEntryStage(PhoneBookEntryStage):
	# name, number, mobile, email, fax
	names = _('Name'), _('Number'), _('Mobile'), _('Company'),_('Email'), _('Fax number')
	# KA: [20071019] TI IMS number
	automata = (None, False), (None, False), (None, False), (None, False), ('123', False)
	max = 50, 50, 50, 50, 50
	name = 'add entry'

	def __init__(self):
		#add word ÇÑ ÈÄ¿¡ left menu °¡ ¾ø¾îÁö´Â °Í ¼öÁ¤
		PhoneBookEntryStage.__init__(self, _('Name'), _('ADD NEW'))
		self.level = 0
		status.phone_item = phonedb.new_item()
		self.update_automata()
		self.ui.set_left('')

	def show(self):
		PhoneBookEntryStage.show(self)
		if self.level == 0:
			if len(self.ui.get_text().replace(' ', '')) <= 0 :
				self.ui.set_left(' ')

	def handle_key(self, key):
		if key == config.Red:
			self.activate_menu2()
			return True
		elif key == config.Menu2:
			if self.ui.handle_key(key):
				if self.level == 0 and self.ui.right == _('BACK'):
					self.ui.set_left('')
				if self.level == 0 and len(self.ui.get_text().replace(' ', '')) <= 0:
					self.ui.set_left('')
				return True
			if self.ui.right == _('BACK'):
				self.activate_menu2()
				return True
		ret = PhoneBookEntryStage.handle_key(self, key)
		if ret and self.is_active():
			if self.ui.get_text() == '':
				if self.level == 0:
					#Name
					self.ui.set_left('')
				else:
					self.ui.set_left(_('NEXT'))
			else:
				if self.level == 0:
					if len(self.ui.get_text().replace(' ', '')) > 0:
						self.ui.set_left(_('OK'))
					else:
						self.ui.set_left('')
				else:
					self.ui.set_left(_('OK'))
		return ret

	def update_automata(self):
		name = self.names[self.level]

		if name == _('Email'):
			self.ui.entry_1.email_mode = True
		else:
			self.ui.entry_1.email_mode = False

		automata = self.automata[self.level]
		max_len = self.max[self.level]

		self.set_fixed_automata(automata[0],automata[1])

		if max_len > 0:
			self.ui.set_max(max_len)

	def activate_menu1(self):
		text = self.ui.get_text()
		if self.level == 0 and (not text or len(text.replace(' ', '')) <= 0):
			return

		status.phone_item[self.level] = text

		if self.level == 0:
			status.save_callback_other = self.save_callback
			if phonedb.has_name(text):
				# name complict
				status.phonebook_save_stage_name = 'add entry'
				stage = NameConflictStage()
				runtime.manager.stack_stage(stage)
				return
		if self.level == 3 and text and not self.is_valid_email():
			runtime.manager.stack_stage(PhonebookNotifyStage(_('Not valid Email address')))
			return

		self.ui.set_left(_('NEXT'))
		self.level += 1

		if self.level > 4:
			stage = AddLastStage
			runtime.manager.stack_stage(stage)
			self.level = 4
		else:
			self.ui.set_subtitle(self.names[self.level])
			self.ui.set_text(status.phone_item[self.level])
			self.update_automata()

	def activate_menu2(self):
		self.level -= 1
		if self.level == 0:
			status.save_callback_other = None
		if self.level >= 0:
			self.ui.set_subtitle(self.names[self.level])
			text = status.phone_item[self.level]
			self.ui.set_text(text)
			self.update_automata()
			if text:
				self.ui.set_right(_('DELETE'))
				self.ui.set_left(_('OK'))
			elif self.level == 0:
				self.ui.set_left('')
			else:
				self.ui.set_left(_('NEXT'))
		else:
			runtime.manager.back_stage()

	def save_callback(self):
		text = self.ui.get_text()
		status.phone_item[self.level] = text
		if not phonedb.has_name(text):
			phonedb.insert_item(status.phone_item)
			return (_('Entry saved in phonebook.'), uiconfig.baloon_phonebook_icon)
		return (None, None)

	def destroy(self):
		status.save_callback_other = None
		PhoneBookEntryStage.destroy(self)

class ModifyEntryStage(EntryStage):
# KA: [20070831] hangul lvp-2000
#ka...hangul add 2007.01.25
#	automata = ('t9', 'lower', 50), ('123', 'lower', 50), ('123', 'lower', 50), ('multitap', 'lower', 50), ('123','lower', 50)
#	if setting.lang == 'Korean':
#		automata = ('hangul', 'lower', 50), ('123', 'lower', 50), ('123', 'lower', 50), ('hangul', 'lower', 50), ('123','lower', 50)
#	else:
#		automata = ('t9', 'lower', 50), ('123', 'lower', 50), ('123', 'lower', 50), ('multitap', 'lower', 50), ('123','lower', 50)
	automata = (None, False, 50), (None, 'lower', 50), (None, 'lower', 50), (None, False, 50), ('123','lower', 50)
# -- End of Adding
# KA: [20070831] hangul lvp-2000 == 

	name = 'modify entry'
	def __init__(self, entry_kind):
		title = phonedb.get_sym_name(status.editing_phone_number_index)
		title = _('MODIFY')+' - ' + title
		max_len = 0
		if entry_kind == 0:
			subtitle = _('Name')
			change_message = _('Name modified')
		if entry_kind == 1:
			subtitle = _('Number')
			change_message = _('Number modified')
		elif entry_kind == 2:
			subtitle = _('Mobile')
			change_message = _('Mobile modified')
		elif entry_kind == 3:
			subtitle = _('Email')
			change_message = _('Email modified')
		elif entry_kind == 4:
			subtitle = _('Fax')
			change_message = _('Fax modified')
		self.entry_kind = entry_kind
		EntryStage.__init__(self, subtitle, title)
		if self.automata[entry_kind][2] > 0:
			self.ui.set_max(self.automata[entry_kind][2])
		self.change_message = change_message

		if entry_kind == 3:
			self.ui.entry.email_mode = True
		else:
			self.ui.entry.email_mode = False

# KA: [2007081] hangul lvp-2000 
		# vpark 2007.08.28	
		self.set_fixed_automata(self.automata[entry_kind][0], self.automata[entry_kind][1])	
#		if self.automata[entry_kind][0] == '123':
#			self.set_fixed_automata(self.automata[entry_kind][0], self.automata[entry_kind][1])
#		else:
#			if entry_kind == 0:
#				self.ui.set_automata(self.automata[3][0], self.automata[3][1])
#			else:
#				self.ui.set_automata(self.automata[entry_kind][0], self.automata[entry_kind][1])
# KA: [2007081] hangul lvp-2000 ==
		self.orig_value = phonedb.get_item(status.editing_phone_number_index)[entry_kind]
		self.ui.set_text(self.orig_value)
		self.ui.set_left(_('OK'))

	def show(self):
		EntryStage.show(self)
		if self.entry_kind in (0, 3):
			new_value = self.ui.get_text()
			if self.orig_value == new_value:
				self.ui.set_left(_('OK'))
			elif len(new_value.replace(' ', '')) <= 0 and self.entry_kind == 0:
				self.ui.set_left(' ')
			else:
				self.ui.set_left(_('SAVE'))

	def handle_key(self, key):
		ret = EntryStage.handle_key(self, key)
		if ret and self.is_active() and not self.ui.is_t9_add_word_mode():
			new_value = self.ui.get_text()
			if self.entry_kind == 0 and (new_value == '' or len(new_value.replace(' ', '')) <= 0):
				#Name
				self.ui.set_left('')
			else:
				if self.orig_value == new_value:
					self.ui.set_left(_('OK'))
				else:
					self.ui.set_left(_('SAVE'))
		return ret

	def activate_menu1(self):
		new_value = self.ui.get_text()
		if self.entry_kind == 0 and (new_value == '' or len(new_value.replace(' ', '')) <= 0):
			return

		if self.entry_kind == 3 and new_value and not self.is_valid_email():
			runtime.manager.stack_stage(PhonebookNotifyStage(_('Not valid Email address')))
			return

		if self.orig_value == new_value:
			stage = PhonebookNotifyStage(_('No change'))
		else:
			# name Áßº¹ Ã¼Å©
			if self.entry_kind == 0 and new_value.lower() != self.orig_value.lower() and phonedb.has_name(new_value):
				status.phonebook_save_stage_name = 'modify entry'
				item = phonedb.get_item(status.editing_phone_number_index)
				status.phone_item = phonedb.new_item(item)
				status.phone_item.name = new_value
				stage = NameConflictStage()
				runtime.manager.stack_stage(stage)
				return

			item = phonedb.get_item(status.editing_phone_number_index)
			item[self.entry_kind] = new_value

			# ¹«Á¶°Ç refresh
			list_stage = runtime.manager.find_stage('phone list')
			list_stage = list_stage or runtime.manager.find_stage('modify list')
			phonedb.sort()
			if list_stage:
				list_stage.refresh_lists()
			status.editing_phone_number_index = phonedb.find_by_item(item)
			#assert(status.editing_phone_number_index >= 0)
			phonedb.save()

			stage = PhonebookNotifyStage(self.change_message)
		runtime.manager.change_stage(stage)

class ModifyCallTypeStage(ListStage):
	def __init__(self, focus):
		self.title = _('MODIFY CALL TYPE')
		self.choice = _('Voice call'), _('Video call'), _('INT Voice call'), _('INT Video call')

		ListStage.__init__(self)
		self.ui.create_icon_column(uiconfig.pb_list_icon_x, uiconfig.list_icon_calltypes)
		self.ui.set_focus(focus)
	def activate(self, index):
		item = phonedb.get_item(status.editing_phone_number_index)
		call_type = int(item.call_type or '0')
		if index != call_type:
			message = _('Call type modified!')
			item.call_type = str(index)
			phonedb.save()
			liststage = runtime.manager.find_stage('phone list') or runtime.manager.find_stage('modify list')
			if liststage: liststage.refresh_lists()
			# refresh_lists ÈÄ¿¡ 0ÀÌ µÈ index ¸¦ ´Ù½Ã ¼¼ÆÃ
			status.editing_phone_number_index = phonedb.find_by_item(item)
		else:
			message = _('No change')
		stage = PhonebookNotifyStage(message)
		runtime.manager.change_stage(stage)

class ModifyImageOptionStage(ListStage):
	icon = uiconfig.phonebook_icon

	def __init__(self):
		self.title = _('OPTIONS')
		self.choice = _('Replace'), _('Delete')
	
		ListStage.__init__(self)

	def activate(self, index):
		if index == 0:
			import images
			runtime.manager.stack_stage(images.ImagesForPhonebookStage)
		else:
			def yes():
				def cb():
					runtime.manager.back_stage('modify kind')
				item = phonedb.get_item(status.editing_phone_number_index)
				phonedb.update_snapshot(item, '')
				phonedb.save()
				stage = PhonebookNotifyStage(_('No image assigned'), cb)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Remove this image?'), yes, no, '', uiconfig.baloon_phonebook_icon)
			runtime.manager.stack_stage(stage)

class ModifyImageGalleryStage(Stage):
	# FIXME: ÀÌ °ÍÀº ½ÇÁ¦·Î Gallery°¡ ¾Æ´Ï¶ó ÇÑ ±×¸²¸¸ º¸¿©ÁÖ´Â È­¸éÀÓ.
	# Phase2 13
	def __init__(self, photo_type, image_file):
		title = _('CURRENT IMAGE')
		fname = image_file.split('/')[-1]
		fname = fname[:fname.rfind('.')]
		fname = fname.replace('taken_', '')
		fname = fname.replace('wallpaper_', '')
		fname = fname.replace('picture_', '')
		size = utils.get_size_kb(image_file)
		fileinfo = fname + "[%dKB]" % size
		self.ui = baseui.GalleryUI(_('OPTIONS'), _('BACK'), title, fileinfo)
		self.ui.set_preview(image_file)
		self.ui.window_title.text = fileinfo
		self.ui.show_arrow(False)

	def handle_key(self, key):
		if key == config.Menu1:
			runtime.manager.stack_stage(ModifyImageOptionStage)
			return True
		elif key == config.Menu2:
			def cb():
				runtime.manager.back_stage()
			stage = NotifyStage(_('No change'), uiconfig.baloon_phonebook_icon, cb)
			runtime.manager.change_stage(stage)
			return True
		return False

import sounds
class MelodyNewStage(sounds.SoundsStage):
	title = _('ASSIGN MELODY')
	def __init__(self):
		status.melody_editing = True
		sounds.SoundsStage.__init__(self)
		status.supervision_not_allowed = 1
	def destroy(self):
		status.melody_editing = False
		sounds.SoundsStage.destroy(self)
		status.supervision_not_allowed = 0

class CurrentMelodyOptionStage(ListStage):
	icon = uiconfig.phonebook_icon
	
	def __init__(self):
		self.title = _('OPTIONS')
		self.choice = _('Replace'), _('Delete')
	
		ListStage.__init__(self)
	
	def activate(self, index):
		if index == 0:
			stage = MelodyNewStage()
			runtime.manager.stack_stage(stage)
		else:
			def yes():
				def cb():
					runtime.manager.back_stage('modify kind')
				stage = NotifyStage(_('No melody assigned'), uiconfig.baloon_phonebook_icon, cb)
				item = phonedb.get_item(status.editing_phone_number_index)
				item.melody = ''
				phonedb.save()
				runtime.manager.stack_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Remove this melody?'), yes, no, '', uiconfig.baloon_phonebook_icon)
			runtime.manager.stack_stage(stage)

class _CurrentMelodyStage(Stage):
	#Phase2 page 14
	def __init__(self, melody):
		status.supervision_not_allowed = 1
		self.player_pid = None
		audio_type = utils.audio_type(melody)
		title = {'ring':_("VIDEOPHONE'S MELODIES"), 'recorded':_("AUDIO GALLERY"),
		         'poly': _("POLYPHONIC MELODIES"), 'other': _("OTHER MELODY")}[audio_type]
		name = melody.split('/')[-1]
		last_dot = name.rfind('.')
		if last_dot:
			name = name[:last_dot]
		name = "%s [%dKB]" % (name, utils.get_size_kb(melody))
		name, font = utils.resize_text(name, uiconfig.current_melody_text_width, uiconfig.current_melody_font2, True)
		self.ui = ui.CurrentMelodyUI(title, name, font)
		self.melody = melody

	def handle_key(self, key):
		if key == config.Menu1:
			stage = CurrentMelodyOptionStage
			runtime.manager.stack_stage(stage)
		elif key == config.Menu2:
			def cb():
				runtime.manager.back_stage('modify kind')
			stage = NotifyStage(_('No change'), uiconfig.baloon_phonebook_icon, cb)
			runtime.manager.change_stage(stage)
		else:
			return False
		return True

	def show(self):
		if status.phone_status == status.Disconnected:
			#ÅëÈ­Áß¿¡´Â state°¡ ²¿ÀÎ´Ù
			self.player_pid = utils.player.play(self.melody)
		Stage.show(self)

	def destroy(self):
		if status.phone_status == status.Disconnected:
			utils.player.stop(self.player_pid)
		Stage.destroy(self)
		status.supervision_not_allowed = 0

	def hide(self):
		if status.phone_status == status.Disconnected:
			utils.player.stop(self.player_pid)
		Stage.hide(self)

def CurrentMelodyStage():
	item = phonedb.get_item(status.editing_phone_number_index)
	if item.melody:
		melody = item.melody
		import os
		if os.access(melody, os.R_OK):
			stage = _CurrentMelodyStage(melody)
			return stage
		item.melody = ''
		phonedb.save()
		liststage = runtime.manager.find_stage('phone list') or runtime.manager.find_stage('modify list')
	stage = MelodyNewStage()
	return stage


def CurrentSnapshotStage():
	item = phonedb.get_item(status.editing_phone_number_index)
	if item.snapshot:
		snapshot = item.snapshot

		# ¾Ë ¼ö ¾ø´Â ÀÌÀ¯·Î ÀÎÇÑ ÆÄÀÏÀÌ Á¸Àç ÇÏÁö ¾ÊÀ»¶§
		# assign µÇ¾î ÀÖ´Â Á¤º¸¸¦ Áö¿ì°í assign µÇÁö ¾ÊÀº °ÍÃ³·³
		import os
		if not os.access(snapshot, os.R_OK):
			item.snapshot = ''
			phonedb.save()
			import images
			return images.ImagesForPhonebookStage()

		fname = snapshot[snapshot.rfind('/')+1:]
		image_type = fname.split('_')[0]
		return ModifyImageGalleryStage(image_type, snapshot)
	import images
	return images.ImagesForPhonebookStage()


class ModifyKindStage(ListStage):
	#Phase2 Page 11
	name = 'modify kind'
	def __init__(self):
		self.title = _('MODIFY')

		if status.phonebook_in_calling:
			self.choice = _('Name'),_('Number'),_('Mobile'),_('Email'), _('Fax'), _('VIP')
		else:
			self.choice = _('Name'),_('Number'),_('Mobile'),_('Email'), _('Fax'), _('Melody'), _('VIP'), _('Image')
		ListStage.__init__(self)

		if status.phonebook_in_calling:
			self.ui.create_icon_column( uiconfig.pb_list_icon_x, (uiconfig.list_icon_name, uiconfig.list_icon_normal, \
									uiconfig.list_icon_mobile, uiconfig.list_icon_email, \
									uiconfig.list_icon_fax, uiconfig.list_icon_vip) )
		else:
			self.ui.create_icon_column( uiconfig.pb_list_icon_x, (uiconfig.list_icon_name, uiconfig.list_icon_normal, \
									uiconfig.list_icon_mobile, uiconfig.list_icon_email, \
									uiconfig.list_icon_fax, uiconfig.list_icon_melody, \
									uiconfig.list_icon_vip, uiconfig.list_icon_image, None) )

	def show(self):
		title = phonedb.get_sym_name(status.editing_phone_number_index)
		title = _('MODIFY')+' - ' + title
		self.ui.set_title(title)
		ListStage.show(self)

	def activate(self, index):
		if index in (0, 1, 2, 3, 4):
			stage = ModifyEntryStage(index)
			runtime.manager.stack_stage(stage)
		elif index == 5:
			if status.phonebook_in_calling:
				self.handle_vip_menu()
				return
			self.handle_melody_menu()
		elif index == 6:
			self.handle_vip_menu()
		elif index == 7:
			self.handle_image_menu()

	def handle_image_menu(self):
		stage = CurrentSnapshotStage()
		runtime.manager.stack_stage(stage)
	def handle_melody_menu(self):
		stage = CurrentMelodyStage()
		runtime.manager.stack_stage(stage)
	def handle_call_type_menu(self):
		item = phonedb.get_item(status.editing_phone_number_index)
		call_type = int(item.call_type or '0')
		stage = ModifyCallTypeStage(call_type)
		runtime.manager.stack_stage(stage)
	def handle_vip_menu(self):
		# Phase2 Page 15
		item = phonedb.get_item(status.editing_phone_number_index)
		if item.vip:
			def yes():
				item.vip = ''
				phonedb.save()
				liststage = runtime.manager.find_stage('phone list') or runtime.manager.find_stage('modify list')
				stage = NotifyStage(_('Deleted from VIP list'), uiconfig.baloon_pbook_vip_icon)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			icon = uiconfig.baloon_pbook_vip_icon
			stage = YesNoStage(_('Already in VIP list.')+'\n' +_('Remove?'),\
				yes, no, '', icon)
		else:
			item.vip = 'true'
			phonedb.save()
			liststage = runtime.manager.find_stage('phone list') or runtime.manager.find_stage('modify list')
			stage = NotifyStage(_('Set as VIP.'), uiconfig.baloon_pbook_vip_icon)
		runtime.manager.stack_stage(stage)

class CallHistoryStage(ListStage):
	def __init__(self):
		self.title = _('CALL HISTORY')
		self.choice = _('Received call'), _('Dialed call'), _('Missed call'), _('Delete all calls')

		ListStage.__init__(self)
	def activate(self, index):
		import calllog
		if index == 3:
			stage = calllog.CallDeleteYesNoStage(index=3)
			runtime.manager.stack_stage(stage)
			return
		stage = calllog.get_stage(index)
		runtime.manager.stack_stage(stage)
		return

class ModifyStage(EntryStage):
	#Phase2 Page 11
	def __init__(self):
		EntryStage.__init__(self, _('Name'), _('MODIFY'), left=_('OK'))
		self.ui.set_max(config.max_pb_name)
# KA: [20070831] hangul lvp-2000
		# vpark 2006.08.28 automata
		self.ui.set_fixed_automata(None, False)
#ka...hangul add 2007.01.25
#		self.ui.set_automata('multitap', 'lower')
#		if setting.lang == 'Korean':
#			self.ui.set_automata('hangul', False)
#		else:
#			self.ui.set_automata('multitap', 'lower')
# --- End of Adding
# KA: [20070831] hangul lvp-2000 ==

	def activate_menu1(self):
		# 'Find'
		text = self.ui.get_text()
		focus = phonedb.find_by_name_near(text)
		stage = ModifyListStage(focus)
		runtime.manager.change_stage(stage)

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

	def handle_key(self, key):
		if key == 'Up':
			stage = ModifyListStage(0)
			runtime.manager.change_stage(stage)
			return True
		elif key == 'Down':
			stage = ModifyListStage(-1)
			runtime.manager.change_stage(stage)
			return True
		else:
			return EntryStage.handle_key(self, key)

class DeleteListStage(PhoneListBase):
	title = _('PHONEBOOK')
	def __init__(self, focus):
		PhoneListBase.__init__(self, focus)
		self.ui.set_left(_('DELETE'))
		self.ui.set_right(_('BACK'))

	def get_phonelist(self):
		return range(phonedb.count()), phonedb.get_names()

	def activate(self, index):
		status.editing_phone_number_index = index
		def yes():
			phonedb.remove(index)
			stage = PhonebookNotifyStage(_('Entry deleted'))
			if phonedb.is_empty():
				if status.phonebook_in_calling:
					pbstage = runtime.manager.find_stage('phonebook')
					if pbstage:
						runtime.manager.back_stage('phonebook')
						runtime.manager.stack_stage(stage)
					else:
						phonelist = runtime.manager.find_stage('phone list')
						if phonelist:
							runtime.manager.back_stage('phone list')
							runtime.manager.back_stage()
							runtime.manager.stack_stage(stage)
						else:
							runtime.manager.stack_stage(stage)
				else:
					if config.stage_debug:
						print self,'now list is empty'
						print 'current back stage', runtime.manager.back
					pbstage = runtime.manager.find_stage('phonebook')
					if pbstage:
						if config.stage_debug:
							print self, 'got previous phonebook'
						runtime.manager.back_stage('phonebook')
						runtime.manager.change_stage(PhoneBookEmptyStage)
						runtime.manager.stack_stage(stage)
					else:
						phonelist = runtime.manager.find_stage('phone list')
						if phonelist:
							if config.stage_debug:
								print self, '***********got phone list stage'
							runtime.manager.back_stage('phone list')
							runtime.manager.back_stage()
							runtime.manager.stack_stage(stage)
						else:
							if config.stage_debug:
								print self, '*************entry deleted but not phonebook  not phonelist stage'
							runtime.manager.stack_stage(stage)
			else:
				runtime.manager.change_stage(stage)
				self.refresh_lists()
		def no():
			runtime.manager.back_stage()
			status.editing_phone_number_index = -1
		icon = uiconfig.baloon_phonebook_icon

		stage = YesNoStage(_('Delete this entry?'), yes, no, \
			'', icon)
		runtime.manager.stack_stage(stage)

class PhonebookDeleteStage(EntryStage):
	#Phase2 Page 16
	def __init__(self):
		EntryStage.__init__(self, _('Name'), _('DELETE'), left=_('OK'))
		self.ui.set_max(config.max_pb_name)
# KA: [20070831] hangul lvp-2000
		# vpark 2006.08.28 automata
		self.ui.set_fixed_automata(None, False)
#ka...hangul add 2007.01.25
#		self.ui.set_automata('multitap', 'lower')
#		if setting.lang == 'Korean':
#			self.ui.set_automata('hangul', False)
#		else:
#			self.ui.set_automata('multitap', 'lower')
# --- End of Adding
# KA: [20070831] hangul lvp-2000 ==

	def activate_menu1(self):
		# 'Find'
		text = self.ui.get_text()
		focus = phonedb.find_by_name_near(text)
		stage = DeleteListStage(focus)
		runtime.manager.change_stage(stage)

	def handle_key(self, key):
		if key == 'Up':
			stage = DeleteListStage(0)
			runtime.manager.change_stage(stage)
			return True
		elif key == 'Down':
			stage = DeleteListStage(-1)
			runtime.manager.change_stage(stage)
			return True
		else:
			return EntryStage.handle_key(self, key)

class VIPEmptyStage(Stage):
	# Phase2 Page 17
	def __init__(self):
		self.ui = baseui.BaloonMessageUI(_('ADD'), _('BACK'), '', uiconfig.baloon_pbook_vip_icon, _('VIP list empty'))

	def handle_key(self, key):
		if key == config.Menu1:
			stage = VIPAddStage
			runtime.manager.change_stage(stage)
		elif key == config.Menu2:
			runtime.manager.back_stage()
		else:
			return False
		return True
		
class AddressStage(ListStage):	
	name = 'address'
	icon = uiconfig.ico_PB_address
	#titleimage = uiconfig.Third_title_PB_address
	
	def __init__(self):
		self.title = _('ADDRESS')
		self.choice =_('Addressbook sync'), _('Address upload'), _('Address download'), _('Mobilephone address download')

		ListStage.__init__(self)
		self.connection = True
		self.timer = None
		self.result = False
		
	def activate(self, index):
		if status.get_regstatus() == 0:
			msg = _('Cannot connect download server') + '\n' + _('Please use after register to server')
			stage = NotifyStage(msg, uiconfig.setting_voip_icon)
			runtime.manager.change_stage(stage)
			return	

		from syncHandler import sync
		sync.set_sync_type(index)
		if index == 0:
			#msg = _('Phonebook sync...')
			msg = _('Syncing phonebook...')
		elif index == 1:
			#msg = _('Uploading phonebook...')
			msg = _('Uploading phonebook')
		elif index == 2:
			#msg = _('Downloading phonebook...')
			msg = _('Downloading phonebook')
		else:
			if (status.get_regstatus_mmi() == 0) and (config.myann_test_flag == False):
				stage = NotifyStage(_('Please use after register to server'), icon = uiconfig.video_call_connect_icon)
				runtime.manager.stack_stage(stage)
				return

			cur_profile=profile.profile.get_profile()
			if (cur_profile == 1 and not runtime.peek_lanlink()) or \
						(cur_profile == 2 and not runtime.peek_wifilink()):	
				msg = _('Check network connection.')
				stage = NotifyStage(msg, icon = uiconfig.video_call_connect_icon)
				runtime.manager.stack_stage(stage)
				return True
				
			if runtime.myannapp:
				import myannapp
				if not runtime.myannapp.is_running():
					runtime.manager.stack_stage(myannapp.MyAnnStage(config.PHONEBOOK_URL))
					from eaHandler import EaHandler
					runtime.eaHandler.activateApplication_browser(destination=EaHandler.BROWSER)
			return			

		stage = SyncStage(msg)
		runtime.manager.stack_stage(stage)
		runtime.evas.render_now()
		return
		

class SyncStage(Stage):
	def __init__(self, message='', error=False):
		icon = uiconfig.setting_voip_icon
		if error:
			message = _('Checking phonebook sync')
			self.start_timer = utils.Timer(1000, self.sync_result)
		else:
			self.start_timer = utils.Timer(500, self.sync_start)			
		self.result = -1
		self.result_timer = None	
		self.cnt = 0
		self.ui = baseui.NotifyUI(message, icon)
		
	def sync_start(self):
		self.start_timer = None
		print '[SYNC] sync start'
		# temporary time check
		from phonedb import phonedb
		count = phonedb.count()
		time = 3*1000
		# temporary time check ==
		from syncHandler import sync
		self.result = sync.sync_start_phonebook()
		self.result_timer = utils.Timer(time, self.sync_result)
		
		
	def sync_result(self): ## ¼º°øÀÌµç ½ÇÆÐµç syncDB¸¦ ÀÏ´Ü ´Ù¿î ¹Þ°í »óÅÂ¸¦ report 		
		from syncHandler import sync
		self.result = sync.get_syncResult()
		self.cnt += 1
		if self.result == 1:# goback timer
			if not self.cnt > 20:			
				return True
			
		self.result_timer = None
		code = sync.get_sync_type()

		if int(code) == 200:
			preMsg = _('phonebook Syncing ')
		elif int(code) == 203:
			preMsg = _('Uploading phonebook')
		else:
			preMsg =  _('Downloading phonebook')
			
		if self.result == 0:
			msg = preMsg + '\n'  + _('succeeded!')
			self.sync_success_result(msg)
			status.sync_result = True			
		else: # self.result == -1:
			msg = preMsg + '\n' + _('failed!')
			self.sync_success_result(msg)
			status.sync_result = False

		self.sync_success_result(msg)
	
	def sync_success_result(self, msg):
		setting.set_sync_complete(0) # -- True complete
		print '[SYNC] sync complete'
		stage = NotifyStage(msg, uiconfig.setting_voip_icon)
		runtime.manager.change_stage(stage)
		return	

	def handle_key(self, key):
		if key == config.Red:
			return False
		elif key == 'CLR':
			runtime.manager.back_stage()
		return True
		
	def destroy(self):
		Stage.destroy(self)
		self.start_timer = None
		self.result_timer = None
		

	
class PhoneListStage(PhoneListBase):
	title = _('PHONEBOOK')
	name = 'phone list'
	def __init__(self, focus=0):
		self.emergency_number = '112'
		if status.phonelist_activate or status.phonebook_in_calling:
			status.phonebook_emergency = False
		else:
			status.phonebook_emergency = True
		PhoneListBase.__init__(self, focus)
		if status.phonelist_activate or status.phonebook_in_calling:
			self.ui.set_left(_('OK'))
		else:
			self.ui.set_left(_('OPTIONS'))
		self.ui.set_right(_('BACK'))

	def isemergency(self):
		if status.phonelist_activate or status.phonebook_in_calling:
			return False
		else:
			return True

	def get_phonelist(self):
		return range(phonedb.count()), phonedb.get_names()

	def activate(self, index):
		if status.phonelist_activate:
			status.phonelist_activate(self, index)
		elif self.ui.get_focus() == 0 and not status.phonebook_in_calling and not status.phonelist_activate:
			if status.phone_status == status.Disconnected:
#Roxia Begin yhcho 06.02.06
				status.set_service_name(_('Emergency'))
#Roxia End yhcho
				status.set_dial_number(self.emergency_number)
				runtime.manager.start_call(self.emergency_number)
		else:
			stage = ItemOptionStage
			runtime.manager.stack_stage(stage)

	def show(self):
		if status.phonelist_activate or status.phonebook_in_calling:
			status.phonebook_emergency = False
		else:
			status.phonebook_emergency = True
		PhoneListBase.show(self)
		if self.isemergency():
			self.ui.set_focus(status.editing_phone_number_index+1)
		else:
			self.ui.set_focus(status.editing_phone_number_index)
		if status.phonelist_activate:
			self.ui.set_left(_('OK'))
		elif self.ui.get_focus() == 0 and not status.phonebook_in_calling and not status.phonelist_activate:
			self.ui.set_left(_('CALL'))
		else:
			self.ui.set_left(_('OPTIONS'))

	def hide(self):
		status.phonebook_emergency = False
		PhoneListBase.hide(self)

	def destroy(self):
		status.phonebook_emergency = False
		PhoneListBase.destroy(self)
		status.phonelist_activate = None

	def handle_key(self, key):
		if key in ('Up', 'Down'):
			ret = PhoneListBase.handle_key(self, key)
			if status.phonelist_activate:
				self.ui.set_left(_('OK'))
			elif self.ui.get_focus() == 0 and not status.phonebook_in_calling and not status.phonelist_activate:
				self.ui.set_left(_('CALL'))
			else:
				self.ui.set_left(_('OPTIONS'))
			return ret
		elif key == config.OffHook:
			if self.ui.get_focus() == 0:
#Roxia Begin yhcho 06.02.06
				status.set_service_name(_('Emergency'))
#Roxia End yhcho
				status.emergency_call_number = self.emergency_number
			else:
				status.emergency_call_number = None
			return False
		elif key == config.Green:
			if self.ui.get_focus() == 0 and status.phone_status == status.Disconnected:
#Roxia Begin yhcho 06.02.06
				status.set_service_name(_('Emergency'))
#Roxia End yhcho
				status.set_dial_number(self.emergency_number)
				runtime.manager.start_call(self.emergency_number)
				return True
			return PhoneListBase.handle_key(self, key)
		else:
			return PhoneListBase.handle_key(self, key)

class VIPAddStage(PhoneListBase):
	# Phase2 Page 18
	title = _('ADD VIP')
	def __init__(self, focus = 0):
		PhoneListBase.__init__(self, focus)

		self.ui.set_left(_('ADD'))
		self.ui.set_right(_('BACK'))

	def get_phonelist(self):
		return phonedb.get_not_vip_list()

	def activate(self, index):
		item = self.get_phonedb_item(index)
		if item.vip == 'true':
			def yes():
				item.vip = ''
				stage = NotifyStage(_('Deleted from VIP list'), uiconfig.baloon_pbook_vip_icon)
				runtime.manager.change_stage(stage)
				phonedb.save()
				self.refresh_lists(False)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Already in VIP list.')+'\n'+_('Remove?'), yes, no, '', uiconfig.baloon_pbook_vip_icon)
			runtime.manager.stack_stage(stage)
		else:
			item.vip = 'true'
			phonedb.save()
			self.refresh_lists(False)
			stage = NotifyStage(_('VIP added'), uiconfig.baloon_pbook_vip_icon)
			runtime.manager.change_stage(stage)

class VIPListShowStage(PhoneListBase):
	title = _('VIP LIST')
	def __init__(self):
		PhoneListBase.__init__(self, 0)
		self.ui.set_left(_('DELETE'))

	def get_phonelist(self):
		return phonedb.get_vip_list()

	def activate(self, index):
		def yes():
			item = self.get_phonedb_item(index)
			item.vip = ''
			phonedb.save()
			self.index_list, vip_lists = phonedb.get_vip_list()
			if len(vip_lists) == 0:
				def cb():
					runtime.manager.queue_backward(2)
			else:
				def cb():
					runtime.manager.back_stage()
				self.refresh_lists(vip_lists)
			stage = NotifyStage(_('Deleted from VIP list'), uiconfig.baloon_pbook_vip_icon, cb)
			runtime.manager.change_stage(stage)
		def no():
			runtime.manager.back_stage()
		stage = YesNoStage(_('Delete from VIP list?'), yes, no, '', uiconfig.baloon_pbook_vip_icon)
		runtime.manager.stack_stage(stage)

class VIPListStage(ListStage):
	# Phase2 Page 17
	icon = uiconfig.pbook_vip_icon

	def __init__(self):
		self.title = _('VIP LIST')
		self.choice = _('Show VIP'), _('Add VIP'), _('Delete list')
		
		ListStage.__init__(self)
		
	def activate(self, index):
		if index == 0:
			# Show VIP
			if phonedb.get_vip_list()[1]:
				'Show VIP list'
				stage = VIPListShowStage()
			else:
				stage = VIPEmptyStage
			runtime.manager.stack_stage(stage)
		elif index == 1:
			if not phonedb.get_not_vip_list()[1]:
				stage = NotifyStage(_('Every entry is VIP'), uiconfig.baloon_pbook_vip_icon)
			else:
				stage = VIPAddStage(0)
			runtime.manager.stack_stage(stage)
		elif index == 2:
			def yes():
				phonedb.delete_vip_list()
				def cb():
					runtime.manager.queue_backward(2)
				stage = NotifyStage(_('List deleted'), uiconfig.baloon_pbook_vip_icon, cb)
				runtime.manager.change_stage(stage)
			def no():
				runtime.manager.back_stage()
			stage = YesNoStage(_('Delete all VIPs?'), yes, no, '', uiconfig.baloon_pbook_vip_icon)
			runtime.manager.stack_stage(stage)

class ItemOptionStage(ListStage):
	name = 'ItemOption'
	# Phase2 page 6
	icon = uiconfig.phonebook_icon

	def __init__(self):
		self.title = _('OPTIONS')

		self.tag_invite = 0
		#self.choice = _('Voice call'), _('Video call'), _('Details'), _('Modify'), _('Delete')
		self.choice = _('Edit'), _('Group search'), _('Send message'), _('Delete')

		ListStage.__init__(self, self.choice)
#NAME, GROUP, PRIORITY, HOME, MOBILE, OFFICE, EMAIL, SPEED, MELODY, SNAPSHOT = range(10)
	def activate(self, index):
		if index == 0:
			runtime.manager.stack_stage(AddPhoneBookStage)
		elif index == 1:
			runtime.manager.stack_stage(GroupStage)
		elif index == 2:
			return
		elif index == 3:
			self.delete_item()

	def delete_item(self):
		def yes():
			# Delete This Item
			name = phonedb.get_sym_name(status.editing_phone_number_index)
			phonedb.remove(status.editing_phone_number_index)
#			stage = runtime.manager.find_stage('phone list')
#			stage.refresh_lists()
			stage = PhonebookNotifyStage(_('Entry deleted'))
			runtime.manager.back_stage()
			runtime.manager.change_stage(stage)
			return

			
			if not phonedb.is_empty():
				runtime.manager.back_stage('phone list')
				runtime.manager.stack_stage(stage)
				return
			if status.phonebook_in_calling:
				pbstage = runtime.manager.find_stage('phonebook')
				if pbstage:
					runtime.manager.back_stage('phonebook')
					runtime.manager.stack_stage(stage)
				else:
					phonelist = runtime.manager.find_stage('phone list')
					if phonelist:
						runtime.manager.back_stage('phone list')
						runtime.manager.back_stage()
						runtime.manager.stack_stage(stage)
					else:
						runtime.manager.stack_stage(stage)
			else:
				if config.stage_debug:
					print self,'now list is empty'
					print 'current back stage', runtime.manager.back
				pbstage = runtime.manager.find_stage('phonebook')
				if pbstage:
					if config.stage_debug:
						print self, 'got previous phonebook'
					runtime.manager.back_stage('phonebook')
					runtime.manager.change_stage(PhoneBookEmptyStage)
					runtime.manager.stack_stage(stage)
				else:
					phonelist = runtime.manager.find_stage('phone list')
					if phonelist:
						if config.stage_debug:
							print self, 'got phone list stage'
						runtime.manager.back_stage('phone list')
						runtime.manager.back_stage()
						runtime.manager.stack_stage(stage)
					else:
						if config.stage_debug:
							print self, 'entry deleted but not phonebook  not phonelist stage'
						runtime.manager.stack_stage(stage)
		def no():
			runtime.manager.back_stage()
		stage = YesNoStage(_('Delete this entry?'), yes, no, '', uiconfig.baloon_phonebook_icon)
		runtime.manager.stack_stage(stage)

#	def handle_key(self, key):
#		if key == config.Menu1 and self.tag_invite:
#			return True
#		else:
#			return ListStage.handle_key(self, key)


class ModifyListStage(PhoneListBase):
	#Phase2 Page 11
	title = _('PHONEBOOK')
	name = 'modify list'
	def __init__(self, focus):
		PhoneListBase.__init__(self, focus)

		self.ui.set_left(_('MODIFY'))
		self.ui.set_right(_('BACK'))

	def get_phonelist(self):
		return range(phonedb.count()), phonedb.get_names()

	def activate(self, index):
		#assert status.editing_phone_number_index == index
		stage = ModifyKindStage
		runtime.manager.stack_stage(stage)

#ka...added 2006.10.12
class DetailInsertStage(ListStage):
	name = 'insert list detail'
	def __init__(self, item, org_stage=''):
		self.item = item
		self.org_stage = org_stage
		name = item[0] or item[1] or item[2] or item[3]
		ListStage.__init__(self, item[1:5], name)

		self.ui.create_icon_column( uiconfig.pb_list_icon_x, (uiconfig.list_icon_normal, uiconfig.list_icon_mobile, uiconfig.list_icon_email, uiconfig.list_icon_fax) )

		if item.vip:
			self.ui.create_icon_column( uiconfig.pb_detail_icon_vip_x, (uiconfig.pb_detail_icon_vip, None, None, None))

		if item.melody:
			self.ui.create_icon_column( uiconfig.pb_detail_icon_melody_x, (uiconfig.pb_detail_icon_melody, None, None, None) )

		if item.snapshot:
			self.ui.create_icon_column( uiconfig.pb_detail_icon_snapshot_x, (uiconfig.pb_detail_icon_snapshot, None, None, None))

		self.phonebook_hide_index = None
		

	def handle_key(self, key):
		if key in ('Up', 'Down'):
			ret = ListStage.handle_key(self, key)
			focus = self.ui.get_focus()
			if focus == 0 or focus == 1:
				self.left_name = _('OK')
				self.ui.set_left(self.left_name)
			else:
				self.ui.set_left('')
			return ret
		elif key == config.Menu1:
			focus = self.ui.get_focus()
			if focus == 0:
				number = self.item[1]
			elif focus ==1:
				number = self.item[2]
			else: return True

			if self.org_stage == 0: stage = 'CallForwardingNumberEdit'
			elif self.org_stage == 1: stage = 'HideID'
			elif self.org_stage == 2: stage = 'SelectiveRejectionNumberEdit'
			else: stage = 'DeregisterSelectiveRejectionNumberEdit'
			
			dest = runtime.manager.find_stage(stage)
			dest.set_text(number)
			runtime.manager.back_stage(stage)
		else:
			status.editing_phone_number_index = None
			return ListStage.handle_key(self, key)

class DetailDialStage(ListStage):
	## Phase2 Page 147
	name = 'dial list detail'
	def __init__(self, item, call_only=False, isvideocall=False):
		self.tag_invite = 0
		self.left_name = ''
		self.isvideocall = isvideocall
		self.call_ready = False
		offhook_stage = runtime.manager.find_stage('offhook')
		enblock_fstage = runtime.manager.find_stage('enblock edit')
		if offhook_stage or enblock_fstage:
			self.call_ready = True
		self.cb = None
		name = item[0] or item[1] or item[2] or item[3]
		ListStage.__init__(self, item[1:5], name)

		self.item = item
		self.call_only = call_only

		import profile
		if profile.ip_mode == 0: # pstn
			if status.AnalogOption == True:
				if status.videocall_mode == status.VideoCallConnected:
					self.left_name = ''
					self.ui.set_left('')
				elif status.business_call_status == status.OneCallConnected or \
					status.business_call_status == status.TwoCallOneDialing:
					if item[1]:
						self.left_name = _('CALL')
						self.ui.set_left(self.left_name)
					elif name:
						self.left_name = _('CALL')
						self.ui.set_left('')
					else:
						self.left_name = ''
						self.ui.set_left('')
				else:
					self.left_name = ''
					self.ui.set_left('')
			else:
				if item[1]:
					self.left_name = _('CALL')
					self.ui.set_left(self.left_name)
				elif name:
					self.left_name = _('CALL')
					self.ui.set_left('')
				else:
					self.left_name = ''
					self.ui.set_left('')
		else:
			if status.first_video_mode == status.VideoIdle and \
				status.second_video_mode == status.VideoIdle:
				if item[1]:
					self.left_name = _('CALL')
					self.ui.set_left(self.left_name)
				elif name:
					self.left_name = _('CALL')
					self.ui.set_left('')
				else:
					self.left_name = ''
					self.ui.set_left('')

			elif status.first_video_mode != status.VideoIdle and \
				status.second_video_mode != status.VideoIdle:
				self.left_name = ''
				self.ui.set_left('')

			elif status.get_video_mode(status.active_call_index) < 7: # Video
				self.left_name = ''
				self.ui.set_left('')

			else:
				if item[1]:
					self.left_name = _('CALL')
					self.ui.set_left(self.left_name)
				elif name:
					self.left_name = _('CALL')
					self.ui.set_left('')
				else:
					self.left_name = ''
					self.ui.set_left('')

		self.ui.create_icon_column( uiconfig.pb_list_icon_x, (uiconfig.list_icon_normal, uiconfig.list_icon_mobile, uiconfig.list_icon_email, uiconfig.list_icon_fax) )

		if item.vip:
			self.ui.create_icon_column( uiconfig.pb_detail_icon_vip_x, (uiconfig.pb_detail_icon_vip, None, None, None))

		if item.melody:
			self.ui.create_icon_column( uiconfig.pb_detail_icon_melody_x, (uiconfig.pb_detail_icon_melody, None, None, None) )

		if item.snapshot:
			self.ui.create_icon_column( uiconfig.pb_detail_icon_snapshot_x, (uiconfig.pb_detail_icon_snapshot, None, None, None))

		self.phonebook_hide_index = None

	def show(self):
		if self.phonebook_hide_index:
			status.editing_phone_number_index = self.phonebook_hide_index
		ListStage.show(self)

	def handle_key(self, key):
		if key == config.Menu1 and self.tag_invite:
			return True

		# eicho add 06.04.12
		if key == config.OffHook and status.screensaver_activated_byhook :
			#status.screensaver_activated_byhook = False
			print 'BLOCKING CALL during SCREENSAVER!!! (3)'
			return False	
		# eicho end.
		
		roxia_event('video_mode@@@@@@@@@', status.first_video_mode, status.second_video_mode)
		import profile
		if (profile.ip_mode == 0 and status.AnalogOption == 0) or \
			(profile.ip_mode == 1 and status.first_video_mode == status.VideoIdle and \
				status.second_video_mode == status.VideoIdle):
			# Green key, OffHook ¸¦ ´©¸¦ ½Ã¿¡ call ¸Þ´º¸¦ ´©¸¥ °Í°ú µ¿ÀÛÀÌ °°À½
			if key in (config.Green, config.Video) and self.left_name == _('CALL') and self.ui.left == _('CALL'):
				if key == config.Video:
					status.videocall_byuser = True
				else:
					status.videocall_byuser = False
				if self.cb:
					return False
				self.activate(self.ui.get_focus())
				return True
			elif key == config.OffHook and self.left_name == _('CALL') and self.ui.left == _('CALL'):
				if self.cb:
					return False

				if status.modem_audio_state == status.SPK:
					runtime.dspg.change_to_handset()
				status.set_modem_audio_state(status.HS)
				if profile.ip_mode == 0:
					runtime.dspg.set_state(runtime.dspg.ST_HS_OFFHK)
				self.activate(self.ui.get_focus())
				return True
			elif key == config.OffHook:

				if not self.call_ready:
					status.videocall_byuser = False
					status.editing_phone_number_index = -1
				return False
			elif key in (config.Green, config.Video) and self.call_ready:
				if status.modem_audio_state == status.SPK:
					return True
				else:
					return False
			elif key in (config.Green, config.Video):
				status.editing_phone_number_index = -1

			ret = ListStage.handle_key(self, key)

			if key in ('Up', 'Down'):
				focus = self.ui.get_focus()

				if focus in (0, 1) and self.item[focus+1]:
					self.ui.set_left(self.left_name)
				elif focus == 2 and self.item[focus+1] and not self.call_only:
					from profile import profile
					if 0 != profile.get_profile() and not self.call_ready:
						self.ui.set_left(_('WRITE'))
					else:
						self.ui.set_left('')
				else:
					self.ui.set_left('')
			return ret
		else:
			if key == config.Menu1 and self.left_name == _('CALL'):
				roxia_event('video_mode@@@@@@@@@', status.first_video_mode, status.second_video_mode)

				if profile.ip_mode == 0:
					if status.videocall_mode == status.VideoCallConnected:
						return True
					elif status.business_call_status == status.TwoCallOneDialing or \
						status.business_call_status == status.OneCallConnected:
						self.activate(self.ui.get_focus())
						return True
					else:
						return True
				else:

					if (status.first_video_mode != status.VideoIdle and \
						status.second_video_mode != status.VideoIdle):
						return True
					else:
						self.activate(self.ui.get_focus())
						return True

			elif key == config.Menu2:
				return ListStage.handle_key(self, key)

			ret = ListStage.handle_key(self, key)

			if key in ('Up', 'Down'):
				focus = self.ui.get_focus()

				if focus in (0, 1) and self.item[focus+1]:
					self.ui.set_left(self.left_name)

				elif focus == 2 and self.item[focus+1] and not self.call_only:

					from profile import profile
					if 0 != profile.get_profile() and not self.call_ready:
						self.ui.set_left(_('WRITE'))
					else:
						self.ui.set_left('')
				else:
					self.ui.set_left('')

				return ret
		return False


	def activate(self, index):
		roxia_event('DetailDialStage.activate()')
		if self.left_name == '': # wrong one!
			return
		#ka...slim 2007.05.22 CallHeld´çÇÏ¸é NewCallÀ» ÇÒ ¼ö ¾ø´Ù. 
		if status.get_held_flag(status.active_call_index) == True and index in (0, 1) and self.item[index+1]:
			stage = NotifyStage(_('Service not available.'), icon = uiconfig.baloon_terminated_icon)
			runtime.manager.stack_stage(stage)
			return
		#ka...slim 2007.05.18 CallConnectedµÈ »ó´ë¿¡°Ô´Â call ÇÒ ¼ö ¾øµµ·Ï
		self.held_number = status.display_caller_number(status.active_call_index)
		if self.item[index+1] == self.held_number:
			import options
			runtime.manager.stack_stage(options.NotifyMessageBackToOneCallStage(_('Cannot dial connected number.')))
			return
	
		import profile
		if profile.ip_mode == 0 and status.AnalogOption == 1 and \
			(status.business_call_status == status.TwoCallOneDialing or \
			status.business_call_status == status.OneCallConnected):
			if index in (0, 1) and self.item[index+1]:
				roxia_event('DetailDialStage.activate(), index(0,1)')
				status.editing_phone_number_index = -1
				number = self.item[index+1]
				if status.videocall_mode == status.VideoCallConnected:
					return
				elif status.business_call_status == status.OneCallConnected:
						status.save_current_call_status()
						status.toggle_active_call()
						status.clear_current_call_status()
						status.dial_number = number
						status.save_current_call_status()
						import options
						runtime.manager.stack_stage(options.PSTNTwoCallOneHoldStage)
				elif status.business_call_status == status.TwoCallOneDialing:
						status.dial_number = number
						import options
						runtime.manager.stack_stage(options.PSTNSecondCallEnblockEditStage)
						runtime.manager.stage.auto_dial()
			return

		if profile.ip_mode == 0 and status.phone_status not in (status.Disconnected, status.Dialing):
			roxia_event('DetailDialStage.activate(), phone_status check1')

			if status.phone_status != status.VoiceConnected:
				roxia_event('DetailDialStage.activate(), phone_status != VoiceConnected')
				return

			if index in (0, 1) and self.item[index+1]:
				roxia_event('DetailDialStage.activate(), index(0,1)')
				status.editing_phone_number_index = -1
				number = self.item[index+1]
				if status.dial_number:
					roxia_event('DetailDialStage.activate(), dial_number TRUE, set_dial_number')
					status.set_dial_number(status.dial_number + number)
				runtime.dspg.send_dtmf(number, False)
				runtime.manager.back_stage('connected')
				runtime.manager.stage.update_number()
			return



		if index in (0, 1) and self.item[index+1]:
			roxia_event('DetailDialStage.activate(), start_call')
			status.editing_phone_number_index = -1
			if self.isvideocall:
				runtime.manager.start_call(self.item[index+1], None, True)
				return
			else:
				from vdcisetting import vdci_setting
				tel_num = status.telnum or vdci_setting.tel_num
				if status.first_video_mode == status.VideoIdle and \
						status.second_video_mode == status.VideoIdle:
					if self.item[index+1] == tel_num:
						from model import CannotDialNotifyStage
						runtime.manager.stack_stage(CannotDialNotifyStage)
						return

					runtime.manager.start_call(self.item[index+1])

				elif status.business_call_status == status.TwoCallOneDialing:
					# second call dialing stage
					if self.item[index+1] == tel_num:
						from model import CannotDialNotifyStage
						runtime.manager.stack_stage(CannotDialNotifyStage)
						return

					status.dial_number = self.item[index+1]
					if runtime.manager.check_call_barring(status.dial_number, False):
						status.set_current_call_status()
						import options
						runtime.manager.stack_stage(options.NotifyMessageBackToOneCallStage(_('Number blocked.')))
					else:
						import options
						runtime.manager.stack_stage(options.SecondCallConnectingStage)
					return
				else:
					status.clear_current_call_status()
					if self.item[index+1] == tel_num:
						status.set_current_call_status()
						from model import CannotDialNotifyStage
						runtime.manager.stack_stage(CannotDialNotifyStage)
						return

					status.dial_number = self.item[index+1]
					if runtime.manager.check_call_barring(status.dial_number, False):
						status.set_current_call_status()
						import options
						runtime.manager.stack_stage(options.NotifyMessageBackToOneCallStage(_('Number blocked.')))
					else:
						self.invite_request()
					return

		elif index == 2 and self.item[index+1] and not self.call_only and not self.call_ready:
			# RHC / [20061121_1]
			if status.now_sending_email == True:
				runtime.manager.stack_stage(NotifyStage(_('Sending IP email')+'...',  uiconfig.baloon_email_icon))
				return
			# RHC / [20061121_1]--
			from ipemailstage import IpEmailStage
			from message import IpEmailInputPassEdit, UserAccountSelectListStage
			from profile import profile
			if 0 != profile.get_profile():
				status.email_address = self.item[index+1]
				if 1 < len(setting.email_account):
					stage = UserAccountSelectListStage
				else:
					if 1 == len(setting.email_account):
						setting.set_defaultaccount(0)
						if setting.email_password:
							stage = IpEmailStage
						else:
							stage = IpEmailInputPassEdit
					else:
						self.phonebook_hide_index = status.editing_phone_number_index
						status.editing_phone_number_index = -1
						stage = IpEmailStage

				runtime.manager.stack_stage(stage)

	def invite_request(self):
		status.business_option_status = status.CallHoldOption
		self.tag_invite = utils.Timer(config.timeoutInvite, self.invite_error)
		status.release_audio_mute() # vpark 06.02.09
		# hcryoo : [20070518_2]
		status.set_hold_flag(status.active_call_index)
		# hcryoo : [20070518_2]==
		runtime.vdci_send_mesg(code1=config.MESG_CALL_HOLD, code2=config.MESG_CALL_HOLD_ACTIVATE)

	def invite_sucessed(self):
		self.tag_invite = 0
		import options
		runtime.manager.stack_stage(options.SecondCallConnectingStage)

	def invite_error(self):
		self.tag_invite = 0
		# hang up
		import options
		stage = options.HangupStage(_('Server not responding.')+'\n'+_('Audio call terminated.'))
		runtime.manager.stack_stage(stage)

	# RHC / [20061118_5] 
	def destroy(self):
		status.email_address = None
		ListStage.destroy(self)
	# RHC / [20061118_5] --
		
class PhoneDialListStage(PhoneListBase):
	### Phase2 147: offhook¿¡¼­ phonebookÀ» ºÒ·¶À»¶§ ³ª¿À´Â È­¸é
	### Phase2 149: Down key¿¡ÀÇÇØ »ý±â´Â °Í
	title = _('PHONEBOOK')
	name = 'dial list'
	def __init__(self, focus, for_call=True):
		self.for_call = for_call
		status.phonebook_emergency = True
		self.call_ready = False
		fstage1 = runtime.manager.find_stage('offhook')
		fstage2 = runtime.manager.find_stage('enblock edit')
		if fstage1 or fstage2:
			self.call_ready = True
		PhoneListBase.__init__(self, focus)
		self.ui.set_left(_('DETAILS'))
		self.ui.set_right(_('BACK'))
		self.update_caption()
		self.emergency_number = '112'

	def isemergency(self):
		return True

	def hide(self):
		status.phonebook_emergency = False
		PhoneListBase.hide(self)

	def destroy(self):
		status.phonebook_emergency = False
		PhoneListBase.destroy(self)

	def show(self):
		status.phonebook_emergency = True
		status.videocall_byuser = False
		PhoneListBase.show(self)

	def get_phonelist(self):
		if self.for_call:
			return phonedb.get_list_for_call()
		else:
			choice = phonedb.get_names()
			index_lists = range(len(choice))
			return index_lists, choice

	def update_caption(self):
		if len(self.phonedb_indexes) == 0 or not self.for_call:
			return
		if self.ui.get_focus() == 0:
			self.ui.set_left(_('CALL'))
		elif not self.call_ready:
			self.ui.set_left(_('DETAILS'))
		else:
			item = phonedb.get_item(status.editing_phone_number_index)
			if item[1] and item[2]:
				self.ui.set_left(_('DETAILS'))
			else:
				self.ui.set_left(_('CALL'))

	def handle_key(self, key):
		if self.ui.get_focus() != 0:
			item = phonedb.get_item(status.editing_phone_number_index)
		if key == config.OffHook:
			if self.ui.get_focus() == 0:
#Roxia Begin yhcho 06.02.06
				status.set_service_name(_('Emergency'))
#Roxia End yhcho
				status.emergency_call_number = self.emergency_number
			else:
				status.emergency_call_number = None
			return False
		if key in (config.Green, config.Video) and self.ui.get_focus() == 0:
			if key == config.Video:
				return True
			if status.phone_status == status.Disconnected:
#Roxia Begin yhcho 06.02.06
				status.set_service_name(_('Emergency'))
#Roxia End yhcho
				runtime.manager.start_call('112')
				return True
		# MMI p5: ¿©·¯ ¹øÈ£¸¦ °¡Áö°í ÀÖÀ»½Ã¿¡´Â green ÀÇ µ¿ÀÛÀÌ menu1 ÀÌ¶û °°´Ù.
		if key in (config.Green, config.Video) and not self.call_ready:
			return True
		if key in (config.Green, config.Video) and self.call_ready:# and item[1] and item[2]:
			if key == config.Video:
				status.videocall_byuser = True
			else:
				status.videocall_byuser = False
			self.activate(0)
			return True

		ret = PhoneListBase.handle_key(self, key)
		if ret and key in ('Up', 'Down'):
			self.update_caption()
		return ret

	def activate(self, index):
		if self.ui.get_focus() == 0:
#Roxia Begin yhcho 06.02.06
			status.set_service_name(_('Emergency'))
#Roxia End yhcho
			runtime.manager.start_call('112')
		elif not self.call_ready:
			#assert status.editing_phone_number_index == self.phonedb_indexes[self.ui.get_focus()]
			item = phonedb.get_item(status.editing_phone_number_index)
			status.phonebook_emergency = False
			stage = DetailDialStage(item, call_only=False)
			runtime.manager.stack_stage(stage)
		else:
			#assert status.editing_phone_number_index == self.phonedb_indexes[self.ui.get_focus()]
			item = phonedb.get_item(status.editing_phone_number_index)
			if item[1] and item[2]:
				if status.phone_status == status.Disconnected:
					# idle »óÅÂ¿¡¼­ downÅ°·Î µé¾î¿Â °æ¿ì call_only °¡ ¾Æ´Ï´Ù.
					status.phonebook_emergency = False
					stage = DetailDialStage(item, call_only=False)
				else:
					status.phonebook_emergency = False
					stage = DetailDialStage(item, call_only=True)
				runtime.manager.stack_stage(stage)
			else:
				runtime.manager.start_call(item[1] or item[2])

class GroupStage(ListStage):
	name = 'groupstage'
	icon = uiconfig.ico_group
	#titleimage = uiconfig.title_group
#	choice = _('Undefined'), _('Family'), _('Relatives'), _('Friend'), _('Office'), _('School'), _('Etc')
	def __init__(self, vm_flag = False):
		self.title = _('GROUP')

		self.vm_flag = vm_flag
		if vm_flag:
			self.left = ''
		else:
			self.left=_('ADD')
		self.numbers = 0
		self.index = 0
		self.right = ''
		self.menu3=''
		self.names = []
		self.load_group()
		ListStage.__init__(self, choice = tuple(self.choice), left=self.left, right=self.right, menu3=self.menu3)
		
	def load_group(self):
		to_enable_translation = _('Family'), _('Relative'), _('Friend'), _('Office'), _('School'), _('Others') # don't delete this line, this is to help translation system.
		self.choice= []
		from groupdb import groupdb
		names = groupdb.get_group_list()
		numbers = groupdb.get_group_total_members()

		for i in range(len(names)):
			info = "%s [%d]"%(runtime.evas.pre_parse(names[i]), numbers[i])
			self.choice.append(info)
		
		self.numbers = numbers
		self.names = names

	def activate(self, index):
		self.index = index
		self.ui.set_focus(self.index)

		if self.index in range(7):
			self.right = ''
			self.menu3=''
		else:
			self.right = _('EDIT')
			self.menu3=_('DELETE')	
			
		self.ui.set_right(self.right)
		self.ui.set_menu3(self.menu3)
	
	def show(self):
		self.load_group()
		self.change_choice(self.choice)
		ListStage.show(self)

		# for index
		if self.index > len(self.ui.list.labels) -1:
			self.index = 0
			self.right = ''
			self.menu3=''
		self.ui.set_focus(self.index)
		self.ui.set_right(self.right)
		self.ui.set_menu3(self.menu3)

	def handle_key(self, key):
		if key in ('Up', 'Down'):
			ret = ListStage.handle_key(self, key)
			self.index = self.ui.get_focus()
			if self.index in range(7):
				self.right = ''
				self.menu3=''
			else:
				if self.vm_flag:
					self.right = _('EDIT')
					self.menu3=_('DELETE')
				else:
					self.right = _('EDIT')
					self.menu3=_('DELETE')					
			self.ui.set_right(self.right)
			self.ui.set_menu3(self.menu3)
			return ret	
			
		if self.numbers[self.index] == 0: # check the number of members in group
			block_flag = True
		else:
			block_flag = False			
		if key == config.Menu1 and self.left == _('ADD'):
			#stage = OptionsGroupStage(self.index)
			from groupdb import groupdb
			if len(groupdb.db) >= 20:
				utils.player.play_effect(config.SETTING_FAILED)
				stage = PhonebookNotifyStage(_('Group db is full.'))
				runtime.manager.stack_stage(stage)
			else:
				stage = EditGroupStage(-1)
				runtime.manager.stack_stage(stage)	
		elif key == config.Menu2 and self.right == _('EDIT'):
			stage = EditGroupStage(self.index)
			runtime.manager.stack_stage(stage)	
		elif (key == config.Menu3 and self.menu3 == _('DELETE')): # and not block_flag:
			#stage = SearchStage(self.index)
			stage = DeleteGroupStage(self.index)
			runtime.manager.stack_stage(stage)
		elif key == 'OK' and block_flag:
			stage = PhonebookNotifyStage(_('Group is empty'))
			runtime.manager.stack_stage(stage)
		elif key == 'OK' and not block_flag:
			if self.vm_flag:
				stage = SearchStage(self.index, vm_flag=True)
			else:
				#stage = SearchStage(group_index=self.index, call_flag=True)
				stage = SearchStage(self.index)
			runtime.manager.stack_stage(stage)
		elif key in (config.Menu4, config.Red, config.CLEAR) and self.vm_flag:
			runtime.manager.back_stage()
			runtime.eaHandler.closePhonebook()
		elif key in (config.Menu4, config.Red) and not self.vm_flag:
			return ListStage.handle_key(self, key)
		else:
			ret = ListStage.handle_key(self, key)
			return ret
		return True
	
class OptionsGroupStage(ListStage):
	name = 'group option'
	titleimage = uiconfig.title_phonebook

	def __init__(self, index):
		self.title = _('GROUP OPTIONS')

		self.index = index
		if self.index in range(7):
			self.default_group = True
			self.choice = _('Create'),
		else:
			self.default_group = False
			self.choice = _('Create'), _('Delete'), _('Edit')
		ListStage.__init__(self, choice = tuple(self.choice))

	def activate(self, index):
		if index == 0:
			stage = EditGroupStage(-1)
		elif index == 1 and not self.default_group:
			#stage = YesNoUpdateStage()
			stage = DeleteGroupStage(self.index)
			runtime.manager.stack_stage(stage)	
			return True
		elif index == 2 and not self.default_group:
			stage = EditGroupStage(self.index)
		else:
			return False

		runtime.manager.stack_stage(stage)
		
class DeleteGroupStage(YesNoStage): # ListStage
	def __init__(self, index):
		self.index = index
		YesNoStage.__init__(self, _('Delete group?'), self.yes_cb, self.no_cb, '', uiconfig.baloon_phonebook_icon)

	def yes_cb(self):
		from groupdb import groupdb
		groupdb.remove(self.index)

		from phonedb import phonedb
		phonedb.set_group(self.index, 0)
		
		stage = PhonebookNotifyStage(_('Group deleted'))
		runtime.manager.change_stage(stage)
	def no_cb(self):
		runtime.manager.back_stage()


		
class PhonebookCopyStage(ListStage):
	name = 'copyfilestage'
	icon = uiconfig.phonebook_icon

	def __init__(self):
		self.title = _('COPY')
		self.choice = _('Copy from SIM'), _('Copy to SIM'), _('Copy to bluetooth')
	
		ListStage.__init__(self)

	def activate(self, index):
		import sim

		if index == 2:
			import phonesetting
			runtime.btapp.set_default()
			runtime.btapp.send_message('20|i')
			runtime.manager.stack_stage(phonesetting.BluetoothSearchStage(2))
		else:
			stage = (sim.CopyFromSIMStage, sim.CopyToSIMStage)[index]
			runtime.manager.stack_stage(stage)

#ka...added 2006.10.12
class SearchPhoneBookStage(ListStage):
	icon = uiconfig.phonebook_icon
	name = 'search phonebook'

	def __init__(self, org_stage=''):
		self.title = _('PHONEBOOK')
		self.choice = _('List'), _('Search')

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

	def activate(self, index):
		stage = (InsertPhoneListStage, FindStage)[index]
		if stage == FindStage:
			runtime.manager.stack_stage(FindStage(True, self.org_stage))
		else:
			runtime.manager.stack_stage(InsertPhoneListStage(org_stage=self.org_stage))

class InsertPhoneListStage(PhoneListBase):
	title = _('PHONEBOOK')
	name = 'phone list'
	def __init__(self, focus=0, org_stage=''):
		PhoneListBase.__init__(self, focus)
		self.org_stage = org_stage
		self.ui.set_left(_('OK'))
		self.ui.set_right(_('BACK'))

	def get_phonelist(self):
		#return range(phonedb.count()), phonedb.get_names()
		#ka...phonebook 2006.11.02
		return phonedb.get_list_for_call()
		
	def show(self):
		PhoneListBase.show(self)
		#self.ui.set_focus(status.editing_phone_number_index)

	def hide(self):
		PhoneListBase.hide(self)

	def destroy(self):
		PhoneListBase.destroy(self)

	def handle_key(self, key):
		if key in ('Up', 'Down'):
			ret = PhoneListBase.handle_key(self, key)
			return ret
		elif key == config.Menu1:
			from phonedb import phonedb
			item = phonedb.get_item(status.editing_phone_number_index)
			if item[1] and item[2]:
				# multi choice
				runtime.manager.stack_stage(DetailInsertStage(item, self.org_stage))
			else:
				number = item[1] or item[2]
				# number °¡ ÇÏ³ªµµ ¾øÀ» ½Ã¿¡´Â insert  ÇÏÁö ¾ÊÀ½
				if not number:
					return
				if self.org_stage == 0: stage = 'CallForwardingNumberEdit'
				elif self.org_stage == 1: stage = 'HideID'
				elif self.org_stage == 2: stage = 'SelectiveRejectionNumberEdit'
				else: stage = 'DeregisterSelectiveRejectionNumberEdit'
				
				dest = runtime.manager.find_stage(stage)
				dest.set_text(number)
				runtime.manager.back_stage(stage)
		else:
			status.editing_phone_number_index = None
			return PhoneListBase.handle_key(self, key)


class PhoneBookStage(ListStage):
	
	icon = uiconfig.phonebook_icon
	#titleimage = uiconfig.title_phonebook 
	name = 'phonebook'

	def __init__(self):
		self.title = _('PHONEBOOK')
		#self.choice = _('Phonebook search'), _('Phonebook new'), _('Group setting'), _('Call history'), _('Phonebook delete all')
		self.choice = _('Search contacts'), _('New contacts'), _('Group setting'), _('Call log'), _('Delete all')

		ListStage.__init__(self, self.choice)

	def activate(self, index):
		# phonedb max size check
		if index == 1 and phonedb.count() >= config.phone_db_size:
			stage = PhonebookNotifyStage(_('Memory full'))
			runtime.manager.stack_stage(stage)
			return
		if phonedb.is_empty() and index in (0,5):
			runtime.manager.stack_stage(NotifyStage(_('Phonebook empty'), uiconfig.baloon_phonebook_icon))
			return
		if index == 4:
			import menu
			stage = menu.CheckPasswordStage(6)
			runtime.manager.stack_stage(stage)
			return
		if index == 3:
			import calldb
			missed_lists = calldb.get_list('missed')
			dialed_lists = calldb.get_list('dialed')
			received_lists = calldb.get_list('received')
			if (len(missed_lists) == 0) and (len(dialed_lists) == 0) and (len(received_lists) == 0):
				stage = NotifyStage(_('Empty call history'), uiconfig.baloon_call_log_icon)
				runtime.manager.stack_stage(stage)
				return
		#stage = (SearchStage, AddPhoneBookStage, AddressStage, GroupStage, CallHistoryStage, PhonebookDeleteStage)[index]
		import calllog, callhistory
		if index ==3:
			stage = callhistory.CallHistoryStage('recent')
		else:
			#stage = (SearchStage, AddPhoneBookStage, AddressStage, GroupStage, None, DeletePhoneBookStage)[index]
			stage = (SearchStage, AddPhoneBookStage, GroupStage, None, DeletePhoneBookStage)[index]
		runtime.manager.stack_stage(stage)
		

class PhoneBookEmptyStage(ListStage):
	icon = uiconfig.phonebook_icon
	name = 'phonebook empty'
	def __init__(self):
		self.title = _('PHONEBOOK')
		self.choice = (_('Emergency(112)'),)

		status.phonebook_emergency = True
		status.phonebook_isempty = True
		self.number = '112'
		ListStage.__init__(self)
		self.ui.set_left(_('ADD'))
		self.ui.set_right(_('BACK'))

	def handle_key(self, key):
		if key == config.Menu1:
			runtime.manager.stack_stage(PhoneBookAddStage)
		elif key == config.Menu2:
			runtime.manager.back_stage()
		elif key == config.Green:
			if status.phone_status == status.VoiceConnected:
				if status.dial_number:
					status.set_dial_number(status.dial_number + self.number)
				runtime.dspg.send_dtmf(self.number, False)
				runtime.manager.back_stage('connected')
				runtime.manager.stage.update_number()
				return
#Roxia Begin yhcho 06.02.06
			status.set_service_name(_('Emergency'))
#Roxia End yhcho
			runtime.manager.start_call(self.number)

		elif key == config.OffHook:
#Roxia Begin yhcho 06.02.06
			status.set_service_name(_('Emergency'))
#Roxia End yhcho
			status.emergency_call_number = self.number
			return False
		else:
			return False
		return True

	def show(self):
		status.phonebook_emergency = True
		ListStage.show(self)

	def hide(self):
		status.phonebook_emergency = False
		ListStage.hide(self)

	def destroy(self):
		status.phonebook_emergency = False
		status.phonebook_isempty = False
		ListStage.destroy(self)


class PhoneBookAddStage(ListStage):
	icon = uiconfig.phonebook_icon

	def __init__(self):
		self.title = _('PHONEBOOK')
		self.choice1 = (_('Add'),)
		self.choice2 = (_('Add'),)

		if status.phone_status == status.Disconnected:
			self.choice = self.choice1
		else:
			self.choice = self.choice2
		ListStage.__init__(self)

	def activate(self, index):
		if index == 0:
			status.editing_phone_number_index = -1
			runtime.manager.stack_stage(AddEntryStage)
		elif index == 1:
			import sim
			stage = sim.CopyFromSIMStage()
			runtime.manager.stack_stage(stage)
			runtime.evas.render_now()
		elif index == 2:
			return

	def show(self):
		ListStage.show(self)
		if not phonedb.is_empty():
			runtime.manager.pop_stage().destroy()
			runtime.manager.change_stage(PhoneBookStage())

class PhoneBookTempEmptyStage(NotifyStage):
	def __init__(self, cb=None):
		icon = uiconfig.baloon_phonebook_icon
		utils.player.play_effect(config.SETTING_FAILED)
		NotifyStage.__init__(self, _('Phonebook empty!'), icon, cb)

	def handle_key(self, key):
		# empty stage °¡ ¶° ÀÖÀ» °æ¿ì¿¡´Â greenkey(handsfrees) µ¿ÀÛ ¸·À½
		# ´Ù¸¥ Å°µéÀº »ó°ü¾øÀ½
		if key == config.Green:
			return True
		else:
			return False

class PhoneBookForCallEmptyStage(NotifyStage):
	def __init__(self, cb=None):
		icon = uiconfig.baloon_phonebook_icon
		NotifyStage.__init__(self, _('Empty call list!'), icon, cb)

	def handle_key(self, key):
		# empty stage °¡ ¶° ÀÖÀ» °æ¿ì¿¡´Â greenkey(handsfrees) µ¿ÀÛ ¸·À½
		# ´Ù¸¥ Å°µéÀº »ó°ü¾øÀ½
		if key == config.Green:
			return True
		else:
			return False

def phone_item_save():
	stage_name = status.phonebook_save_stage_name
	if stage_name == 'calllog options':
		phonedb.insert_item(status.phone_item)
		stage = runtime.manager.find_stage('call list')
		stage.refresh_lists()
		stage = runtime.manager.find_stage('calllog options')
		stage.refresh_lists()
		runtime.manager.back_stage(stage_name)
	elif stage_name == 'predial options':
		phonedb.insert_item(status.phone_item)
		runtime.manager.back_stage('enblock edit')
	elif stage_name == 'add entry':
		stage = runtime.manager.find_stage(stage_name)
		stage.ui.set_text(status.phone_item.name)
		stage.activate_menu1()
		stage.ui.set_left(_('NEXT'))
		runtime.manager.back_stage(stage_name)
		return
	elif stage_name == 'modify entry':
		runtime.manager.back_stage(stage_name)
		stage = PhonebookNotifyStage(_('Name modified'))
		runtime.manager.change_stage(stage)
		item = phonedb.get_item(status.editing_phone_number_index)
		item[0] = status.phone_item.name

		list_stage = runtime.manager.find_stage('phone list')
		list_stage = list_stage or runtime.manager.find_stage('modify list')
		phonedb.sort()
		if list_stage:
			list_stage.refresh_lists()
		status.editing_phone_number_index = phonedb.find_by_item(item)
		#assert(status.editing_phone_number_index >= 0)
		phonedb.save()
		return
	elif stage_name == 'number options':
		phonedb.insert_item(status.phone_item)
		runtime.manager.back_stage(stage_name)
	elif stage_name == 'mmsusenumberstage':
		phonedb.insert_item(status.phone_item)
		runtime.manager.back_stage(stage_name)

	stage = PhonebookNotifyStage(_('Entry saved'))
	runtime.manager.stack_stage(stage)

class NameRetryStage(EntryStage):
	def __init__(self):
		title = _('SAVE IN PHONEBOOK')
		if status.phonebook_save_stage_name == 'add entry':
			title = _('ADD ENTRY')
		elif status.phonebook_save_stage_name == 'modify entry':
			title = phonedb.get_sym_name(status.editing_phone_number_index)
		EntryStage.__init__(self, _('Name'), title)
		self.ui.set_max(config.max_pb_name)
		self.orig_name = status.phone_item.name
		self.ui.set_text(self.orig_name)
		self.ui.set_left('')
		# KA: [20070831] hangul lvp-2000
		# vpark 2006.08.28 automata	
		self.ui.set_fixed_automata(None, False)

	def handle_key(self, key):
		ret = None
		if key == config.Menu1:
			if self.ui.left == '':
				return True
			new_name = self.ui.get_text()
			if new_name:
				status.phone_item.name = new_name
				# retry ÇÑ ÀÌ¸§ÀÌ ¶Ç ÆùºÏ¿¡ ÀÖ´Â °æ¿ì
				if phonedb.has_name(new_name):
					stage = NameConflictStage()
					runtime.manager.change_stage(stage)
					return True
			phone_item_save()
		else:
			ret = EntryStage.handle_key(self, key)
		if ret and self.is_active():
			new_name = self.ui.get_text()
			if self.orig_name == new_name or not new_name:
				self.ui.set_left('')
			else:
				self.ui.set_left(_('OK'))
		return ret

class PhoneItemDetailStage(Stage):
	def __init__(self, pitem):
		self.ui = ui.PhoneItemDetailUI(pitem)

	def activate_menu1(self):
		stage = NameRetryStage
		runtime.manager.change_stage(stage)

	def activate_menu2(self):
		if status.phonebook_save_stage_name == 'predial options':
			runtime.manager.back_stage('enblock edit')
		else:
			runtime.manager.queue_backward(3)

	def handle_key(self, key):
		if key == config.Menu1:
			self.activate_menu1()
			return True
		elif key == config.Menu2:
			self.activate_menu2()
			return True
		return False
		
class DeletePhoneBookStage(YesNoStage): # ListStage
	def __init__(self):
		YesNoStage.__init__(self, _('Delete all phonebook?'), self.yes_cb, self.no_cb, '', uiconfig.baloon_phonebook_icon)

	def yes_cb(self):
		from phonedb import phonedb
		phonedb.reset()
		speeddb.reset()
		utils.player.play_effect(config.SETTING_SUCCEEDED)
		stage = PhonebookNotifyStage(_('Phonebook deleted'))
		runtime.manager.change_stage(stage)
	def no_cb(self):
		runtime.manager.back_stage()


class AddPhoneBookStage(Stage): # ListStage
	name = 'addphonebook'
	def __init__(self, left=_('SAVE'), right='', menu3=_('KOR'), menu4=_('BACK'), number='', vm_flag=False):
		if len(number) > uiconfig.MAX_INPUT_TEL:
			self.number = number[:uiconfig.MAX_INPUT_TEL]
		else:
			self.number = number
		self.new_item = False
		self.vm_flag = vm_flag
		if status.editing_phone_number_index == -1:
			status.phone_item = phonedb.new_item()
			self.new_item = True

		if self.number:
			if self.is_mobile():
				status.phone_item.mobile = self.number
			else:
				status.phone_item.home = self.number
		# shchun : global automata change		
		if setting.lang == 'Korean':
			menu3=_('KOR')
		else:
			menu3=_('abc')
		# end shchun
		self.ui = baseui.AddPhoneBookUI(left, right, '', menu3, menu4)	
		self.image_dir = None
		self.lists = None
		
		# shchun : global automata change
		#self.ui.set_fixed_automata(self.ui.list.entrys[0], None, False)
		self.ui.set_automata(self.ui.list.entrys[0], 'multitap', 'lower')
		if setting.lang == 'Korean':
			self.ui.set_automata(self.ui.list.entrys[0], 'hangul', False)
		else:
			self.ui.set_automata(self.ui.list.entrys[0], 'multitap', 'lower')
		debugLogN('*__init__ automata_idx=', self.ui.automata_idx, ', automata=', self.ui.automata) 	
		self.set_menu3()
		# end shchun
		
		self.photo_index = 0
		self.preview_small()		
		self.ui.set_focus(0)
		self.re_draw = False

		self.symbol_stage_timer = None
		self.entry_refresh()
		self.prority = status.phone_item.prority

	def is_mobile(self):
		if config.global_version_flag:
			return False
			
		if self.number.startswith('010') or \
			self.number.startswith('011') or \
			self.number.startswith('016') or \
			self.number.startswith('017') or \
			self.number.startswith('018') or \
			self.number.startswith('019'):
			return True
		else:
			return False

	def destroy(self):
		self.ui.stop_audio()
		Stage.destroy(self)
		self.symbol_stage_timer = None
		
	def set_menu3(self):
		if self.ui.automata[0] == '123':		menu3 = '123'
		elif self.ui.automata[0] == 'hangul':	menu3 = _('KOR')
		elif self.ui.automata[0] == 'multitap' and self.ui.automata[1] == 'lower':			menu3 = _('abc')
		elif self.ui.automata[0] == 'multitap' and self.ui.automata[1] == 'upper':			menu3 = _('ABC')
		elif self.ui.automata[0] == 'multitap' and self.ui.automata[1] == 'first capital':	menu3 = _('Abc')
		elif self.ui.automata[0] == 't9' and self.ui.automata[1] == 'lower':			menu3 = _('T9abc')
		elif self.ui.automata[0] == 't9' and self.ui.automata[1] == 'upper':			menu3 = _('T9ABC')
		elif self.ui.automata[0] == 't9' and self.ui.automata[1] == 'first capital':	menu3 = _('T9Abc')
		else:							menu3 = _('SYMBOL')
		runtime.menu3.set_text(menu3)	
		
		if menu3 ==_('SYMBOL'):
			# shchun : global automata change
			#self.ui.set_fixed_automata(self.ui.list.entrys[0], None, False)
			self.ui.set_automata(self.ui.list.entrys[0], 'multitap', 'lower')
			if setting.lang == 'Korean':
				self.ui.set_automata(self.ui.list.entrys[0], 'hangul', False)
			else:
				self.ui.set_automata(self.ui.list.entrys[0], 'multitap', 'lower')	
			self.ui.set_automata(self.ui.list.entrys[self.ui.list.focus], *self.ui.automata)
			debugLogN('*__init__ automata_idx=', self.ui.automata_idx, ', automata=', self.ui.automata) 
			
			from basemodel import SymbolSelectionStage
			runtime.manager.stack_stage(SymbolSelectionStage(self, True))

	def update_automata(self):
		if self.ui.list.focus not in (0, 2, 3, 4, 6):
			runtime.menu3.set_text('')
			return
		if  self.ui.list.focus in (0,6):	
			#self.ui.set_fixed_automata(self.ui.list.entrys[0], None, False)
			self.ui.set_automata(self.ui.list.entrys[self.ui.list.focus], 'multitap', 'lower')
			if setting.lang == 'Korean':
				self.ui.set_automata(self.ui.list.entrys[self.ui.list.focus], 'hangul', False)
			else:
				self.ui.set_automata(self.ui.list.entrys[self.ui.list.focus], 'multitap', 'lower')
		
		elif self.ui.list.focus == 2:	self.ui.set_fixed_automata(self.ui.list.entrys[2], '123', False)	
		elif self.ui.list.focus == 3:	self.ui.set_fixed_automata(self.ui.list.entrys[3], '123', False)	
		elif self.ui.list.focus == 4:	self.ui.set_fixed_automata(self.ui.list.entrys[4], '123', False)		
		#elif self.ui.list.focus == 6:	
		#	self.ui.set_fixed_automata(self.ui.list.entrys[6], 'multitap', 'lower')	
		
		self.ui.set_automata(self.ui.list.entrys[self.ui.list.focus], *self.ui.automata)
		debugLogN('*update_automata automata_idx=', self.ui.automata_idx, ', automata=', self.ui.automata) 	
		self.set_menu3()

# insert symbol
	def insert_text(self, text):
		focus = self.ui.get_focus()
		self.ui.list.entrys[focus].insert_unicode_text(unicode(text, 'utf-8'))
		self.ui.list.entrys[focus]._automata.check_start_of_sentance()
		#self.update_entry_info()

	def delete_char(self):
		self.handle_key('\b')
		#self.update_entry_info()

	def insert_symbol(self, s):
		def back_to_symbol():
			from basemodel import SymbolSelectionStage
			runtime.manager.stack_stage(SymbolSelectionStage(self, True))
			self.symbol_stage_timer = None
			
		before_text = self.ui.get_text()
		self.insert_text(s)
		after_text = self.ui.get_text()

		if before_text == after_text:
			runtime.manager.change_stage(NotifyStage(_('Max length exceeded'), uiconfig.baloon_message_icon))
		else:
			runtime.manager.back_stage()
			#self.symbol_stage_timer = utils.Timer(uiconfig.back_to_symbol_timeout, back_to_symbol)
		
# insert symbol ==	

	# test for text align refreshing
	def entry_refresh(self):
		self.ui.list.entrys[0].set_text(self.ui.list.entrys[0].get_text())
		self.ui.list.entrys[0].cursor_start()
		self.ui.list.entrys[0].cursor_end()
		self.ui.list.entrys[2].set_text(self.ui.list.entrys[2].get_text())
		self.ui.list.entrys[3].set_text(self.ui.list.entrys[3].get_text())
		self.ui.list.entrys[4].set_text(self.ui.list.entrys[4].get_text())
		self.ui.list.entrys[6].set_text(self.ui.list.entrys[6].get_text())

	def show(self):
		# QA:5-38 ÀÌ¸§ ÀÔ·Â½Ã ¹®ÀÚ »ðÀÔÈÄ Ä¿¼­°¡ µÚ·Î°¡´Â ¹®Á¦ ¼öÁ¤
		#self.entry_refresh() # for text align refreshing
		self.ui.show()	
		focus = self.ui.get_focus()
		if self.re_draw:
			self.ui.set_focus(focus, self.re_draw)
		for ent in self.ui.list.entrys:
			ent.lostFocus()
		self.ui.list.entrys[focus].showFocus()

		if config.mmi_debug: print '## focus =', focus

		if focus in [2,3,4]:
			runtime.rb.set_text(_('KEY SET'))
		
		# fix for QE Defect #27831

		if focus == 6:
			# symbol ¿¡¼­ ÀÚµ¿À¸·Î ÇÑ±Û°¡´Â °É ¹æÁö
			if self.ui.automata[0] == 'hangul':
				self.handle_key(config.Menu3)
			self.ui.list.entrys[2].set_text(self.ui.list.entrys[2].get_text())
			self.ui.list.entrys[2].lostFocus()
			self.ui.list.entrys[3].set_text(self.ui.list.entrys[3].get_text())
			self.ui.list.entrys[3].lostFocus()
			self.ui.list.entrys[4].set_text(self.ui.list.entrys[4].get_text())
			self.ui.list.entrys[4].lostFocus()
			self.ui.list.entrys[6].set_text(self.ui.list.entrys[6].get_text())
			self.set_menu3()		
		elif focus == 2 or focus == 3 or focus ==4:
			self.ui.list.entrys[0].set_text(self.ui.list.entrys[0].get_text())
			self.ui.list.entrys[0].lostFocus()
			self.ui.list.entrys[2].set_text(self.ui.list.entrys[2].get_text())
			self.ui.list.entrys[2].lostFocus()
			self.ui.list.entrys[3].set_text(self.ui.list.entrys[3].get_text())
			self.ui.list.entrys[3].lostFocus()
			self.ui.list.entrys[4].set_text(self.ui.list.entrys[4].get_text())
			self.ui.list.entrys[4].lostFocus()
			self.ui.list.entrys[focus].showFocus()
			runtime.menu3.set_text('123')
		elif focus == 5:
			self.ui.list.entrys[0].set_text(self.ui.list.entrys[0].get_text())
			self.ui.list.entrys[0].lostFocus()
			self.ui.list.entrys[2].set_text(self.ui.list.entrys[2].get_text())
			self.ui.list.entrys[2].lostFocus()
			self.ui.list.entrys[3].set_text(self.ui.list.entrys[3].get_text())
			self.ui.list.entrys[3].lostFocus()
			self.ui.list.entrys[4].set_text(self.ui.list.entrys[4].get_text())
			self.ui.list.entrys[4].lostFocus()
			runtime.menu3.set_text('')
		elif focus == 7 or focus == 8:
			self.ui.list.entrys[2].set_text(self.ui.list.entrys[2].get_text())
			self.ui.list.entrys[2].lostFocus()
			self.ui.list.entrys[3].set_text(self.ui.list.entrys[3].get_text())
			self.ui.list.entrys[3].lostFocus()
			self.ui.list.entrys[4].set_text(self.ui.list.entrys[4].get_text())
			self.ui.list.entrys[4].lostFocus()
			self.ui.list.entrys[6].set_text(self.ui.list.entrys[6].get_text())
			self.ui.list.entrys[6].lostFocus()
			self.ui.list.focus_up()
			self.ui.list.focus_down()
			runtime.menu3.set_text('')
		elif focus == 1 or focus == 9 or focus == 10:			
			runtime.menu3.set_text('')		

	def hide(self):
		self.re_draw = True
		self.ui.hide()
		for ent in self.ui.list.entrys:
			ent.lostFocus()	
		
	def save(self):
		#'name group prority home mobile office speed email melody snapshot cdate mdate'
		#NAME
		# GROUP
		from groupdb import groupdb
		addstage = runtime.manager.find_stage('addphonebook')
		if config.mmi_debug: print '## addstage=', addstage
		if addstage:
			index = groupdb.get_group_index(addstage.ui.list.entrys[1].get_text())
			status.phone_item.group = index
			# HOME
			#status.phone_item.home = addstage.ui.list.entrys[2].get_text()
			home = addstage.ui.list.entrys[2].get_text()
			pre_home = home
			if len(home) > 6:
				if not (home[0] == '0' or home[0] == '1'):
					pre_home = setting.prefix + home
			status.phone_item.home = pre_home
			# MOBILE
			status.phone_item.mobile = addstage.ui.list.entrys[3].get_text()
			# OFFICE
			#status.phone_item.office = addstage.ui.list.entrys[4].get_text()
			office = addstage.ui.list.entrys[4].get_text()
			pre_office = office
			if len(office) > 6:
				if not (office[0] == '0' or office[0] == '1'):
					pre_office = setting.prefix + office
			status.phone_item.office = pre_office	
			# EMAIL
			status.phone_item.email = addstage.ui.list.entrys[6].get_text()
		else:
			index = groupdb.get_group_index(self.ui.list.entrys[1].get_text())
			status.phone_item.group = index
			home = self.ui.list.entrys[2].get_text()
			pre_home = home
			if len(home) > 6:
				if not (home[0] == '0' or home[0] == '1'):
					pre_home = setting.prefix + home
			status.phone_item.home = pre_home
			status.phone_item.mobile = self.ui.list.entrys[3].get_text()			
			office = self.ui.list.entrys[4].get_text()
			pre_office = office
			if len(office) > 6:
				if not (office[0] == '0' or office[0] == '1'):
					pre_office = setting.prefix + office
			status.phone_item.office = pre_office
			status.phone_item.email = self.ui.list.entrys[6].get_text()
			
		status.phone_item.speed = self.get_speed()
		status.phone_item.melody = self.get_melody()
		#status.phone_item.snapshot = self.get_current_file()
		status.phone_item.snapshot = self.get_image()
		cdate, mdate = self.get_time()
		status.phone_item.cdate = cdate
		status.phone_item.mdate = mdate

		#if config.mmi_debug: print '## before phonedb.db=', phonedb.db
		item = status.phone_item
		if status.editing_phone_number_index != -1:
			phonedb.remove(status.editing_phone_number_index)
		phonedb.insert_item(item)
		#if config.mmi_debug: print '## after phonedb.db=', phonedb.db

		if status.phone_item.home	 != '':	speed_phone_num = status.phone_item.home
		elif status.phone_item.mobile != '':	speed_phone_num = status.phone_item.mobile
		elif status.phone_item.office != '':	speed_phone_num = status.phone_item.office
		else:							speed_phone_num = '1234'

		if self.ui.org_speed == '':
			speeddb.set_speed_tel_num(status.phone_item.speed, speed_phone_num)
		else:
			speeddb.change_speed_num(self.ui.org_speed, status.phone_item.speed)
			speeddb.set_speed_tel_num(status.phone_item.speed, speed_phone_num)

		print 'ka...............5 status.phone_item.prority=', self.prority
		if self.prority == '':
			self.prority = status.phone_item.prority
			
		if self.prority != '':
			if (self.prority == '0' and not status.phone_item.home) or \
				(self.prority == '1' and not status.phone_item.mobile) or \
				(self.prority == '2' and not status.phone_item.office):

				self.prority = status.phone_item.prority
				self.ui.update_priority_icon(self.prority)	
				print 'ka...............4 status.phone_item.prority=', status.phone_item.prority
				stage = PhonebookNotifyStage(_('Priority define please.'))
				runtime.manager.stack_stage(stage)			
				return
				
		status.phone_item.prority = self.prority


		def after_save():
			if self.vm_flag:
				runtime.manager.back_stage()
				runtime.eaHandler.closePhonebook()
			elif runtime.manager.find_stage('addphonebook'):
				if config.mmi_debug: print '## addphonbook ok'
				runtime.manager.queue_backward(2)
			else:
				runtime.manager.back_stage()
				
		stage = PhonebookNotifyStage(_('Phonebook saved'), after_save)
		runtime.manager.change_stage(stage)
		status.editing_phone_number_index = -1
		status.phone_item = None

	def get_time(self):
		import time, ntptime
		year, month, day, hour, min, sec, msec = time.localtime(ntptime.ntime())[:7]
		#cdate = str(year) + str(month) + str(day) + str(hour) + str(min) + str(sec) + str(msec) #sync¸¦ À§ÇØ msec3ÀÚ¸®·Î 
		time = "%4s%2s%2s%2s%2s%2s%3s"%(year, month, day, hour, min, sec, msec)
		time = time.replace(' ','0')

		if self.new_item:
			cdate = time
			mdate = time[:-3]
		else:
			cdate = status.phone_item.cdate 
			mdate = time[:-3]
		return cdate, mdate

	def get_speed(self):
		addstage = runtime.manager.find_stage('addphonebook')
		if addstage:
			speed_index = addstage.ui.list.entrys[5].index
		else:
			speed_index = self.ui.list.entrys[5].index

		if speed_index == 0:
			return ''
		else:
			return self.ui.speed_list[speed_index]

	def set_speed_none(self):
		addstage = runtime.manager.find_stage('addphonebook')
		if addstage:
			addstage.ui.list.entrys[5].set_index(0)
		else:
			self.ui.list.entrys[5].set_index(0)
		return True
		
	def get_melody(self):
		addstage = runtime.manager.find_stage('addphonebook')
		if addstage:
			melody_dir_index = addstage.ui.list.entrys[7].index
		else:
			melody_dir_index = self.ui.list.entrys[7].index
		if melody_dir_index:
			dir  = utils.get_ring_dir_by_index(melody_dir_index)
			if addstage:
				melody_index = addstage.ui.list.entrys[8].index
				try:
					melody = addstage.ui.ring_list[melody_index]
				except:
					melody = ''
			else:
				melody_index = self.ui.list.entrys[8].index
				try:
					melody = self.ui.ring_list[melody_index]
				except:
					melody = ''

			if melody != '':
				fname = utils.get_melody_fullname(dir, melody)
				if fname == None:
					print "[error] meoldy file [%s] not exists in [%s]"%(melody, dir)
					name = ''
				else:
					name = dir + fname
			else:
				name = ''
		else:
			name = ''

		try:
			name = unicode(name, 'utf-8').encode('euc-kr')
		except:
			pass
		return name

	def get_image(self):
		addstage = runtime.manager.find_stage('addphonebook')
		if addstage:
			image_dir_index = addstage.ui.list.entrys[9].index
		else:
			image_dir_index = self.ui.list.entrys[9].index
		if image_dir_index:
			dir  = utils.get_image_dir_by_index(image_dir_index)
			if addstage:
				image_index = addstage.ui.list.entrys[10].index
				try:
					image = addstage.ui.image_list[image_index]
				except:
					image = ''
			else:
				image_index = self.ui.list.entrys[10].index
				try:
					image = self.ui.image_list[image_index]
				except:
					image = ''
			if image != '':
				name = dir + image
			else:
				name =  '/usr/local/lgvp/photos/snapshot/no_photo.png'
		else:
			name =  '/usr/local/lgvp/photos/snapshot/no_photo.png'

		try:
			name = unicode(name, 'utf-8').encode('euc-kr')
		except:
			pass
			
		return name

	def get_snapshot(self):
		pass
		
	def get_current_file(self):
		return self.image_dir + self.lists[self.photo_index][0]	
		
	def get_current_names(self):
		names = []
		for lst in self.lists:
			name = lst[0]
			dot = name.rfind('.')
			if dot >= 0:
				name = name[:dot]
			names.append(name)
		return names
		
	def preview_small(self):		
#		if self.ui.list.entrys[10].choose[0] == 'None': 
#			return True
#		self.filename = self.get_current_file()		
#		self.ui.list.entrys[11].setImage(self.filename)

		filename = self.get_image()
		self.ui.list.entrys[11].setImage(filename)

	def check_number(self, home, mobile, office):
		print '##### phonebook.check_number home =', home, 'mobile =', mobile, 'office =', office
		if home =='' and mobile =='' and office == '':
			err_stage = PhonebookNotifyStage(_('Number insert please'))
			return True, err_stage
		if (home!='' and home == mobile) or (mobile!='' and mobile == office)	or (office!='' and office == home):
			err_stage = PhonebookNotifyStage(_('Number conflict'))
			return True, err_stage

		pre_home = home
		if len(home) > 6:
			if not (home[0] == '0' or home[0] == '1'):
				pre_home = setting.prefix + home

		pre_office = office
		if len(office) > 6:
			if not (office[0] == '0' or office[0] == '1'):
				pre_office = setting.prefix + office
		if config.mmi_debug: print '##	status.editing_phone_number_index=', status.editing_phone_number_index
		if status.editing_phone_number_index == -1:
			complict_home = False
			complict_mobile = False
			complict_office = False
			if phonedb.has_number(pre_home):
				complict_home = True
			if phonedb.has_number(mobile):
				complict_mobile = True
			if phonedb.has_number(pre_office):
				complict_office = True
			if config.mmi_debug: 
				print 'complict_home(%s),complict_mobile(%s),complict_office(%s)' %(complict_home,complict_mobile,complict_office)
			if complict_home == True and complict_mobile == True and complict_office == True:
				err_stage = PhonebookNotifyStage(_('All phone numbers are duplicated.'))
				return True, err_stage
			elif complict_home != True and complict_mobile == True and complict_office == True:
				err_stage = PhonebookNotifyStage(_('Duplicated Mobile, Office phone numbers.'))
				return True, err_stage
			elif complict_home == True and complict_mobile != True and complict_office == True:
				err_stage = PhonebookNotifyStage(_('Duplicated Home, Office phone numbers.'))
				return True, err_stage
			elif complict_home == True and complict_mobile == True and complict_office != True:
				err_stage = PhonebookNotifyStage(_('Duplicated Home, Mobile phone numbers.'))				
				return True, err_stage
			elif complict_home != True and complict_mobile != True and complict_office == True:
				err_stage = PhonebookNotifyStage(_('Duplicated Office phone number.'))
				return True, err_stage
			elif complict_home != True and complict_mobile == True and complict_office != True:
				err_stage = PhonebookNotifyStage(_('Duplicated Mobile phone number.'))
				return True, err_stage
			elif complict_home == True and complict_mobile != True and complict_office != True:
				err_stage = PhonebookNotifyStage(_('Duplicated Home phone number.'))
				return True, err_stage
		else:
			if status.phone_item.home != pre_home and pre_home:
				if pre_home != status.phone_item.mobile and \
				   pre_home != status.phone_item.office and \
				   phonedb.has_number(pre_home):
					err_stage = PhonebookNotifyStage(_('Duplicated Home phone number.'))
					return True, err_stage
			elif status.phone_item.mobile != mobile and mobile:
				if mobile != status.phone_item.home and \
				   mobile != status.phone_item.office and \
				   phonedb.has_number(mobile):
					err_stage = PhonebookNotifyStage(_('Duplicated Mobile phone number.'))
					return True, err_stage
			elif status.phone_item.office != pre_office and pre_office:
				if pre_office != status.phone_item.home and \
				   pre_office != status.phone_item.mobile and \
				   phonedb.has_number(pre_office):
					err_stage = PhonebookNotifyStage(_('Duplicated Office phone number.'))
					return True, err_stage
		return False, None
		
	def handle_key(self,key):
		if self.vm_flag:
			if key in (config.Menu4, config.Red):
				runtime.manager.back_stage()
				runtime.eaHandler.closePhonebook()
				return True
			elif key in (config.OffHook, config.Green, config.Video):
				return True
			elif key == config.CLEAR:
				if self.ui.list.focus not in (0, 2, 3, 4, 6):	
					self.ui.stop_audio()
					runtime.manager.back_stage()
					runtime.eaHandler.closePhonebook()
					return True
				if len(self.ui.list.entrys[self.ui.list.focus].get_text()) > 0:
					self.ui.list.entrys[self.ui.list.focus].handle_key('\b')
				else:
					self.ui.stop_audio()
					runtime.manager.back_stage()
					runtime.eaHandler.closePhonebook()
				return True
				
		if key == config.Menu1 or key =='OK':
			self.ui.stop_audio()
			# name check
			if self.ui.list.entrys[0].get_text() == '':
				utils.player.play_effect(config.SETTING_FAILED)
				stage = PhonebookNotifyStage(_('Name insert please'))
				runtime.manager.stack_stage(stage)
				return True
			new_name = self.ui.list.entrys[0].get_text()
			if config.mmi_debug: print '## new_name=', new_name
			if new_name:				
				if config.mmi_debug: print '## status.editing_phone_number_index=', status.editing_phone_number_index
				if  status.editing_phone_number_index == -1: # »õ·Î¿î ¹øÈ£ µî·Ï½Ã 
					if phonedb.has_name(new_name):
						utils.player.play_effect(config.SETTING_FAILED)
						#stage = PhonebookNotifyStage(_('Name conflict'))
						def conflict_yes():
							status.phone_item.name = new_name
							addstage = runtime.manager.find_stage('addphonebook')
							if config.mmi_debug: print '## addstage=', addstage
							if addstage:
								home = addstage.ui.list.entrys[2].get_text()
								mobile = addstage.ui.list.entrys[3].get_text()
								office = addstage.ui.list.entrys[4].get_text()
								
								err, err_stage = self.check_number(home, mobile, office)
								if err:
									utils.player.play_effect(config.SETTING_FAILED)
									runtime.manager.change_stage(err_stage)
									return
								if self.prority != '':
									if (self.prority == '0' and not home) or \
										(self.prority == '1' and not mobile) or \
										(self.prority == '2' and not office):			
										print 'ka...............3 status.phone_item.prority=', status.phone_item.prority
										stage = PhonebookNotifyStage(_('Priority define please.'))
										runtime.manager.change_stage(stage)
										return								
								# priority check
								if self.prority == '' or self.prority not in ['0','1','2'] :
									if home:		status.phone_item.prority = '0'
									elif mobile:	status.phone_item.prority = '1'
									else:		status.phone_item.prority = '2'
								self.save()
								utils.player.play_effect(config.SETTING_SUCCEEDED)

						def conflict_no():
							runtime.manager.back_stage()

						msg = _('Name conflict.\nDo you want to save?')
						icon = uiconfig.baloon_phonebook_icon
						stage = YesNoStage(msg, conflict_yes, conflict_no, '', icon)
						runtime.manager.stack_stage(stage)
						return True
				# ±âÁ¸ ¹øÈ£ ÆíÁý½Ã 
				else:
					if status.phone_item.name == new_name:
						pass
					else:
						if phonedb.has_name(new_name):
							utils.player.play_effect(config.SETTING_FAILED)
							#stage = PhonebookNotifyStage(_('Name conflict'))
							def conflict_yes():
								status.phone_item.name = new_name
								addstage = runtime.manager.find_stage('addphonebook')
								if addstage:								
									home = addstage.ui.list.entrys[2].get_text()
									mobile = addstage.ui.list.entrys[3].get_text()
									office = addstage.ui.list.entrys[4].get_text()
									
									err, err_stage = self.check_number(home, mobile, office)
									if err:
										utils.player.play_effect(config.SETTING_FAILED)
										runtime.manager.change_stage(err_stage)
										return
									if self.prority != '':
										if (self.prority == '0' and not home) or \
											(self.prority == '1' and not mobile) or \
											(self.prority == '2' and not office):
											stage = PhonebookNotifyStage(_('Priority define please.'))
											runtime.manager.change_stage(stage)
											print 'ka...............2 status.phone_item.prority=', status.phone_item.prority
											return									
									# priority check
									if self.prority == '' or self.prority not in ['0','1','2'] :
										if home:		status.phone_item.prority = '0'
										elif mobile:	status.phone_item.prority = '1'
										else:		status.phone_item.prority = '2'
									self.save()
									utils.player.play_effect(config.SETTING_SUCCEEDED)

							def conflict_no():
								runtime.manager.back_stage()

							msg = _('Name conflict.\nDo you want to save?')
							icon = uiconfig.baloon_phonebook_icon
							stage = YesNoStage(msg, conflict_yes, conflict_no, '', icon)							
							runtime.manager.stack_stage(stage)
							return True
							
			status.phone_item.name = new_name	

			# number check
			home = self.ui.list.entrys[2].get_text()
			mobile = self.ui.list.entrys[3].get_text()
			office = self.ui.list.entrys[4].get_text()

			err, err_stage = self.check_number(home, mobile, office)
			if config.mmi_debug: print '##err=', err, 'err_stage=', err_stage
			if err:
				utils.player.play_effect(config.SETTING_FAILED)
				runtime.manager.stack_stage(err_stage)
				return True
			if self.prority != '':
				if (self.prority == '0' and not home) or \
					(self.prority == '1' and not mobile) or \
					(self.prority == '2' and not office):
					utils.player.play_effect(config.SETTING_FAILED)
					# KA:QA:4-58 [20081106]
					if status.phone_item.prority != '':
						self.prority = status.phone_item.prority
					else:
						self.prority = ''
					self.ui.update_priority_icon(self.prority)
					print 'ka...............1 status.phone_item.prority=', status.phone_item.prority

					stage = PhonebookNotifyStage(_('Priority define please.'))
					runtime.manager.stack_stage(stage)
					return				
			# priority check
			if self.prority == '' or self.prority not in ['0','1','2'] :
				#utils.player.play_effect(config.SETTING_FAILED)
				#stage = PhonebookNotifyStage(_('Prority define please'))
				if home:		status.phone_item.prority = '0'
				elif mobile:	status.phone_item.prority = '1'
				else:		status.phone_item.prority = '2'
				#runtime.manager.stack_stage(stage)
				#return True
			self.save()
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			return True
				
		elif key == config.Menu2:
			focus = self.ui.list.focus
			if focus in [2,3,4]:
				#status.phone_item.prority = str(focus - 2)
				self.prority = str(focus - 2)
				self.ui.update_priority_icon(self.prority)
				#filename = uiconfig.image_dir + uiconfig.pb_pirority_number[focus-2]
				#self.ui.list.icons[focus].changeIcon(filename)
			elif focus == 5:
				self.set_speed_none()
				if self.ui.list.entrys[5].index == 0:
					runtime.rb.set_text('')
				else:
					runtime.rb.set_text(_('DELETE'))
			# KA: [20080424] image update
			return True
			
		elif key == config.Menu3:
			if self.ui.list.focus == 0:
				if setting.lang == 'Korean':
					self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)
					self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]		
				else:	
					self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list)	
					self.ui.automata = config.automata_list[self.ui.automata_idx]	
			elif self.ui.list.focus == 6:
				#self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_mult_num_symbol)
				#self.ui.automata = config.automata_list_mult_num_symbol[self.ui.automata_idx]
				if setting.lang == 'Korean':
					self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)
					self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]		
				else:	
					self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list)	
					self.ui.automata = config.automata_list[self.ui.automata_idx]	
			debugLogN('*automata_idx=', self.ui.automata_idx, ', automata=', self.ui.automata) 
			self.ui.set_automata(self.ui.list.entrys[self.ui.list.focus], *self.ui.automata)
			self.set_menu3()
			
		elif key == config.Menu4:
			self.ui.stop_audio()
			runtime.manager.back_stage()
			return True
			
		elif key in ('Up', 'Down'):
			ret = self.ui.handle_key(key)			
			self.entry_refresh() # for text align refreshing
			for ent in self.ui.list.entrys:
				ent.lostFocus()				
			self.ui.list.entrys[self.ui.list.focus].showFocus()	
			if self.ui.list.focus in [2,3,4]:
				runtime.rb.set_text(_('KEY SET'))
			elif self.ui.list.focus == 5:
				if self.ui.list.entrys[5].index == 0:
					runtime.rb.set_text('')
				else:
					runtime.rb.set_text(_('DELETE'))
			else:
				runtime.rb.set_text('')
			self.update_automata()
			return ret
			
		elif key in ('Left', 'Right'):			
			self.ui.handle_key(key)
			if self.ui.list.focus == 5:
				if self.ui.list.entrys[5].index == 0:
					runtime.rb.set_text('')
				else:
					runtime.rb.set_text(_('DELETE'))
			# KA: [20080424] image update
			self.preview_small()
			# KA: [20080424] image update ==
			return True
			
		elif key == config.CLEAR:	
			if self.ui.list.focus not in (0, 2, 3, 4, 6):	
				self.ui.stop_audio()
				runtime.manager.back_stage()
				return True
			#self.ui.list.entrys[self.ui.list.focus].handle_key(key)
			#self.ui.list.entrys[self.ui.list.focus].handle_key('\b')
			if len(self.ui.list.entrys[self.ui.list.focus].get_text()) > 0:
			#	self.ui.list.entrys[self.ui.list.focus].backspace(1)
				self.ui.list.entrys[self.ui.list.focus].handle_key('\b')
			else:
				self.ui.stop_audio()
				runtime.manager.back_stage()
			return True
			
		elif key == config.OffHook or key == config.Green:
			self.ui.stop_audio()
			
		else:
			ret = self.ui.list.entrys[self.ui.list.focus].handle_key(key)			
			return ret
			
		return False
		

class EditGroupStage(Stage):
	name = 'EditGroup'
	def __init__(self,index):
		self.index = index
		#self.ui = baseui.EditGroupUI(index, _('SAVE'), _('CLEAR'), '', _('BACK'))
		self.ui = baseui.EditGroupUI(index, _('SAVE'), '', '', _('BACK'))
		#self.ui.set_fixed_automata(None, False)
		# shchun : global automata change
		if setting.lang == 'Korean':
			self.ui.set_automata('hangul', False)
		else:
			self.ui.set_automata('multitap', 'lower')
		# end shchun
		
		
		self.player_pid = None
		self.play_audio_timer = None

	def get_current_file(self):
		return self.ui.get_current_file()
		
	def play_audio(self):
		if status.phone_status != status.Disconnected:
			return
		audio_file = self.get_current_file()
		if audio_file != '':
			#self.player_pid = utils.player.play(audio_file)
			utils.player.play_ring(audio_file)

	def stop_audio(self):
		if status.phone_status != status.Disconnected:
			return
		#utils.player.stop(self.player_pid)
		utils.player.stop_ring()

	def get_current_name(self):
		name = self.lists[self.audio_index][0]
		dot = name.rfind('.')
		if dot >= 0:
			name = name[:dot]
		return name

	def destroy(self):
		Stage.destroy(self)		
		self.stop_audio()
		self.play_audio_timer = None

	def save_info(self):
		from groupdb import groupdb
		new_name = self.ui.entry.get_text()
		#ring = unicode(self.ring, 'euc-kr').encode('utf-8')

		if self.ui.audio_file == _('None'):
			self.ui.audio_file = ''
		
		if self.index == -1: # NEW
			#new_index = groupdb.get_group_len()
			melody = self.ui.path +self.ui.audio_file
			groupdb.insert_item(new_name, melody)
		else:
			groupdb.set_name(self.ui.item_index, new_name)
			groupdb.set_melody(self.ui.item_index, self.ui.path, self.ui.audio_file)

	def handle_key(self,key):
		if key == config.Menu1 or key == 'OK':
			if len(self.ui.entry.get_text()) <= 0:
				utils.player.play_effect(config.SETTING_FAILED)
				stage = PhonebookNotifyStage(_('Name insert please'))
				runtime.manager.stack_stage(stage)
				return True

			if self.ui.audio_dir_index != 0:
				if self.ui.audio_file == '' or self.ui.audio_file == _('None'):
					stage = NotifyStage(_('Invalid ring for external calls'), uiconfig.baloon_phonebook_icon) # CHECKME icon
					runtime.manager.stack_stage(stage)
					return True
					
			from groupdb import groupdb
			# QE-28404:20°³  Full»óÅÂ¿¡¼­ Æ¯Á¤index¸¦ ÆíÁýÈÄ ÀúÀå½Ã ¿À·ù ¼öÁ¤
			if config.mmi_debug: 
				print '## self.index = ', self.index, 'len(groupdb.db) =', len(groupdb.db) 				
			if self.index == -1 and len(groupdb.db) >= 20:
				utils.player.play_effect(config.SETTING_FAILED)
				stage = PhonebookNotifyStage(_('Group db is full.'))
				runtime.manager.change_stage(stage)
				return True
			if self.ui.entry.get_text() != self.ui.item[1]:
				if not groupdb.check_name(self.ui.entry.get_text()):
					utils.player.play_effect(config.SETTING_FAILED)
					stage = PhonebookNotifyStage(_('Name conflict.'))
					runtime.manager.stack_stage(stage)
					return True
			self.save_info()
			num_groupdb = len(groupdb.db)
			if config.mmi_debug: 
				print '## num_groupdb =', num_groupdb			
			if self.index == -1 and runtime.manager.find_stage('groupstage'):
				def back_stage_and_focusing():
					runtime.manager.back_stage('groupstage')				
					runtime.manager.stage.activate(num_groupdb-1)
				stage = PhonebookNotifyStage(_('Set is saved'), cb=back_stage_and_focusing)
			else:
				stage = PhonebookNotifyStage(_('Set is saved'))
			runtime.manager.change_stage(stage)
			utils.player.play_effect(config.SETTING_SUCCEEDED)
			return True
		elif key == config.Menu3:
			if self.ui.index == -1:
				# shchun: global input change
				if setting.lang == 'Korean':
					self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)	
					self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)
					
					self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]		
				else:	
					self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)	
					self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list)
					
					self.ui.automata = config.automata_list[self.ui.automata_idx]			
				self.ui.set_automata(*self.ui.automata)
			# end shchun
			#	self.ui.automata_idx = utils.get_automata_idx(*self.ui.automata)		
			#	self.ui.automata_idx = (self.ui.automata_idx + 1) % len(config.automata_list_hangul)	
			#	self.ui.automata = config.automata_list_hangul[self.ui.automata_idx]			
			#	self.ui.set_automata(*self.ui.automata)		
			return True
		elif key == config.Menu4:				
			runtime.manager.back_stage()
			return True
		elif key == config.CLEAR:
			if config.mmi_debug: print '## self.ui.index =', self.ui.index 
			#self.ui.entry.handle_key(key)
			if len(self.ui.entry.get_text()) > 0 and self.ui.index== -1:
				self.ui.entry.handle_key('\b')
				#self.ui.entry.backspace(1)				
			else:
				runtime.manager.back_stage()
			return True
		elif key == 'Right':
			self.play_audio_timer = None
			if self.ui.index == -1:
				self.ui.handle_key(key)
			elif self.ui.index == 0:
				self.ui.change_melody_dir(True)
				self.ui.change_melody_file(True, dir_changed=True)
			else:
				self.stop_audio()
				self.ui.change_melody_file(True)
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
			return True
		elif key == 'Left':
			self.play_audio_timer = None
			if self.ui.index == -1:
				self.ui.handle_key(key)
			elif self.ui.index == 0:
				self.ui.change_melody_dir(False)
				self.ui.change_melody_file(True, dir_changed=True)
			else:
				self.stop_audio()
				self.ui.change_melody_file(False)
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			return True
		elif key == 'Up' or key == 'Down':
			self.play_audio_timer = None
			self.ui.handle_key(key)
			if self.ui.index == -1:
				self.ui.set_fixed_automata(None, False)
				self.stop_audio()
				self.ui.remove_item_scroll_timer()
			elif self.ui.index == 1:
				self.ui.set_menu3('')
				self.stop_audio()
				self.play_audio_timer = utils.Timer(uiconfig.play_audio_delay, self.play_audio)
				#self.play_audio()
			else:
				self.ui.set_menu3('')
				self.stop_audio()
				self.ui.remove_item_scroll_timer()
			return True
		else:
			if key in "0123456789*#" and self.ui.index != -1:
				if config.mmi_debug: print '@@ Not invalid'
				return True
			self.ui.handle_key(key)
# KA: [20080406] phonebook UI- edit group
	
class NameConflictStage(Stage):
	# Page 176,
	def __init__(self):
		self.ui = ui.NameConflictUI()
		name = status.phone_item.name.lower()
		for item in phonedb.db:
			if item.name.lower() == name:
				old_item = item
				break
		self.item = old_item

	def handle_key(self, key):
		if key == config.Menu1:
			stage = NameRetryStage
			runtime.manager.stack_stage(stage)
			return True
		elif key == config.Menu2:
			runtime.manager.stack_stage(PhoneItemDetailStage(self.item))
			return True
		return False

def get_phonebook_stage():
	roxia_trace('get_phonebook_stage')
	if phonedb.is_empty():
		if status.phonebook_in_calling:
			return PhoneBookStage()
		else:
			return PhoneBookEmptyStage()

	return PhoneBookStage()


