[browser] fixed the plugin for using on the SD skin.
[vuplus_dvbapp] / lib / python / Plugins / Extensions / HbbTV / plugin.py
index d0ca15f..d6ed07b 100644 (file)
@@ -7,7 +7,9 @@ from Screens.MessageBox import MessageBox
 from Screens.InfoBarGenerics import InfoBarNotifications
 from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.HelpMenu import HelpableScreen
 from Screens.InfoBarGenerics import InfoBarNotifications
 from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.HelpMenu import HelpableScreen
+from Screens.ChannelSelection import service_types_tv
 
 
+from Components.Language import language
 from Components.PluginComponent import plugins
 from Components.Button import Button
 from Components.Sources.StaticText import StaticText
 from Components.PluginComponent import plugins
 from Components.Button import Button
 from Components.Sources.StaticText import StaticText
@@ -20,17 +22,21 @@ from Components.VolumeControl import VolumeControl
 from Components.Pixmap import Pixmap
 from Components.config import config, ConfigSubsection, ConfigPosition, getConfigListEntry, ConfigBoolean, ConfigInteger, ConfigText, ConfigSelection, configfile, getCharValue
 
 from Components.Pixmap import Pixmap
 from Components.config import config, ConfigSubsection, ConfigPosition, getConfigListEntry, ConfigBoolean, ConfigInteger, ConfigText, ConfigSelection, configfile, getCharValue
 
-from enigma import eTimer, eConsoleAppContainer, getDesktop, eServiceReference, iPlayableService, iServiceInformation, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode, eRCInput, fbClass
+from enigma import eTimer, eConsoleAppContainer, getDesktop, eServiceReference, iPlayableService, iServiceInformation, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode, eRCInput, fbClass, eServiceCenter
 
 from bookmark import BookmarkManager, BookmarkData, CategoryData
 
 import os, struct, threading, stat, select, time, socket, select
 
 
 from bookmark import BookmarkManager, BookmarkData, CategoryData
 
 import os, struct, threading, stat, select, time, socket, select
 
+from __init__ import _
+
 strIsEmpty = lambda x: x is None or len(x) == 0
 
 HBBTVAPP_PATH = "/usr/local/hbb-browser"
 COMMAND_PATH = '/tmp/.sock.hbbtv.cmd'
 
 strIsEmpty = lambda x: x is None or len(x) == 0
 
 HBBTVAPP_PATH = "/usr/local/hbb-browser"
 COMMAND_PATH = '/tmp/.sock.hbbtv.cmd'
 
+_g_helper = None
+
 class GlobalValues:
        command_util   = None
        command_server = None
 class GlobalValues:
        command_util   = None
        command_server = None
@@ -51,8 +57,43 @@ class GlobalValues:
 
        need_restart = False
        plugin_browser = None
 
        need_restart = False
        plugin_browser = None
+
+       resX = 0
+       resY = 0
+       def UpdateInfoBar(self):
+               if self.resX == 1024 and self.resY == 720:
+                       return
+               try:
+                       infobar = InfoBar.instance
+                       if infobar._InfoBarShowHide__state != 3:
+                               return
+                       infobar.doTimerHide()
+                       infobar.serviceStarted()
+               except: pass
+       
 __gval__ = GlobalValues()
 
 __gval__ = GlobalValues()
 
+def setDefaultResolution(x, y):
+       global __gval__
+       __gval__.resX = x
+       __gval__.resY = y
+
+def setResolution(xres, yres):
+       global __gval__
+       if __gval__.resX == 1280 and __gval__.resY == 720:
+               return
+       from enigma import gMainDC
+       gMainDC.getInstance().setResolution(xres, yres)
+
+def restoreResolution():
+       global __gval__
+       setResolution(1280, 720)
+       setResolution(__gval__.resX, __gval__.resY)
+
+       if __gval__.resX == 1280 and __gval__.resY == 720:
+               return
+       __gval__.UpdateInfoBar()
+
 def setPluginBrowser(browser=None):
        global __gval__
        __gval__.plugin_browser = browser
 def setPluginBrowser(browser=None):
        global __gval__
        __gval__.plugin_browser = browser
@@ -189,6 +230,7 @@ class OpCodeSet:
                        ,"OP_HBBTV_FULLSCREEN"          : 0x0005
                        ,"OP_HBBTV_TITLE"               : 0x0006
                        ,"OP_HBBTV_RETRY_OPEN_URL"      : 0x0009
                        ,"OP_HBBTV_FULLSCREEN"          : 0x0005
                        ,"OP_HBBTV_TITLE"               : 0x0006
                        ,"OP_HBBTV_RETRY_OPEN_URL"      : 0x0009
+                       ,"OP_HBBTV_CHANGE_CHANNEL"      : 0x000A
                        ,"OP_OIPF_GET_CHANNEL_INFO_URL" : 0x0101
                        ,"OP_OIPF_GET_CHANNEL_INFO_AIT" : 0x0102
                        ,"OP_OIPF_GET_CHANNEL_INFO_LIST": 0x0103
                        ,"OP_OIPF_GET_CHANNEL_INFO_URL" : 0x0101
                        ,"OP_OIPF_GET_CHANNEL_INFO_AIT" : 0x0102
                        ,"OP_OIPF_GET_CHANNEL_INFO_LIST": 0x0103
@@ -209,6 +251,7 @@ class OpCodeSet:
                        ,"OP_BROWSER_VKBD_PASTE_MOUSE"  : 0x030D
                        ,"OP_BROWSER_MENU_REQ"          : 0x030E
                        ,"OP_BROWSER_MENU_RES"          : 0x030F
                        ,"OP_BROWSER_VKBD_PASTE_MOUSE"  : 0x030D
                        ,"OP_BROWSER_MENU_REQ"          : 0x030E
                        ,"OP_BROWSER_MENU_RES"          : 0x030F
+                       ,"OP_BROWSER_NEED_RELOAD_KEYMAP": 0x0313
                        ,"OP_DVBAPP_VOL_UP"             : 0x0401
                        ,"OP_DVBAPP_VOL_DOWN"           : 0x0402
                        ,"OP_SYSTEM_OUT_OF_MEMORY"      : 0x0501
                        ,"OP_DVBAPP_VOL_UP"             : 0x0401
                        ,"OP_DVBAPP_VOL_DOWN"           : 0x0402
                        ,"OP_SYSTEM_OUT_OF_MEMORY"      : 0x0501
@@ -223,6 +266,7 @@ class OpCodeSet:
                        ,0x0005 : "OP_HBBTV_FULLSCREEN"
                        ,0x0006 : "OP_HBBTV_TITLE"
                        ,0x0009 : "OP_HBBTV_RETRY_OPEN_URL"
                        ,0x0005 : "OP_HBBTV_FULLSCREEN"
                        ,0x0006 : "OP_HBBTV_TITLE"
                        ,0x0009 : "OP_HBBTV_RETRY_OPEN_URL"
+                       ,0x000A : "OP_HBBTV_CHANGE_CHANNEL"
                        ,0x0101 : "OP_OIPF_GET_CHANNEL_INFO_URL"
                        ,0x0102 : "OP_OIPF_GET_CHANNEL_INFO_AIT"
                        ,0x0103 : "OP_OIPF_GET_CHANNEL_INFO_LIST"
                        ,0x0101 : "OP_OIPF_GET_CHANNEL_INFO_URL"
                        ,0x0102 : "OP_OIPF_GET_CHANNEL_INFO_AIT"
                        ,0x0103 : "OP_OIPF_GET_CHANNEL_INFO_LIST"
@@ -243,6 +287,7 @@ class OpCodeSet:
                        ,0x030D : "OP_BROWSER_VKBD_PASTE_MOUSE"
                        ,0x030E : "OP_BROWSER_MENU_REQ"
                        ,0x030F : "OP_BROWSER_MENU_RES"
                        ,0x030D : "OP_BROWSER_VKBD_PASTE_MOUSE"
                        ,0x030E : "OP_BROWSER_MENU_REQ"
                        ,0x030F : "OP_BROWSER_MENU_RES"
+                       ,0x0313 : "OP_BROWSER_NEED_RELOAD_KEYMAP"
                        ,0x0401 : "OP_DVBAPP_VOL_UP"
                        ,0x0402 : "OP_DVBAPP_VOL_DOWN"
                        ,0x0501 : "OP_SYSTEM_OUT_OF_MEMORY"
                        ,0x0401 : "OP_DVBAPP_VOL_UP"
                        ,0x0402 : "OP_DVBAPP_VOL_DOWN"
                        ,0x0501 : "OP_SYSTEM_OUT_OF_MEMORY"
@@ -342,9 +387,12 @@ class StreamServer:
 class ServerFactory:
        def doListenUnixTCP(self, name, handler):
                def destroy(name):
 class ServerFactory:
        def doListenUnixTCP(self, name, handler):
                def destroy(name):
-                       if os.path.exists(name):
-                               os.unlink(name)
-                               print "Removed ", name
+                       import os
+                       try:
+                               if os.path.exists(name):
+                                       os.unlink(name)
+                                       print "Removed ", name
+                       except: pass
                destroy(name)
 
                params = SocketParams()
                destroy(name)
 
                params = SocketParams()
@@ -441,6 +489,7 @@ class HandlerHbbTV(Handler):
                         0x0001 : self._cb_handleCloseHbbTVBrowser
                        ,0x0006 : self._cb_handleSetPageTitle
                        ,0x0009 : self._cb_handleHbbTVRetryOpen
                         0x0001 : self._cb_handleCloseHbbTVBrowser
                        ,0x0006 : self._cb_handleSetPageTitle
                        ,0x0009 : self._cb_handleHbbTVRetryOpen
+                       ,0x000A : self._cb_handleHbbTVChangeChannel
                        ,0x0101 : self._cb_handleGetChannelInfoForUrl
                        ,0x0102 : self._cb_handleGetChannelInfoForAIT
                        ,0x0103 : self._cb_handleGetChannelInfoList
                        ,0x0101 : self._cb_handleGetChannelInfoForUrl
                        ,0x0102 : self._cb_handleGetChannelInfoForAIT
                        ,0x0103 : self._cb_handleGetChannelInfoList
@@ -504,8 +553,22 @@ class HandlerHbbTV(Handler):
                self._on_set_title_cb = None
                return self.doPack(opcode, params, reserved)
 
                self._on_set_title_cb = None
                return self.doPack(opcode, params, reserved)
 
+       def _cb_handleHbbTVChangeChannel(self, opcode, data):
+               self._handle_dump(self._cb_handleHbbTVChangeChannel, opcode, data)
+               global _g_helper
+               if _g_helper is None: 
+                       return (0, "NOK")
+               dataItems = data.split(":")
+               sid  = dataItems[0]
+               tsid = dataItems[1]
+               if not _g_helper.doChangeChannel(sid, tsid):
+                       return (0, "NOK")
+               return (0, "OK")
+
        def _cb_handleBrowserMenuReq(self, opcode, data):
                self._handle_dump(self._cb_handleBrowserMenuReq, opcode, data)
        def _cb_handleBrowserMenuReq(self, opcode, data):
                self._handle_dump(self._cb_handleBrowserMenuReq, opcode, data)
+               restoreResolution()
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                browser = getPluginBrowser()
                if browser is not None:
                eRCInput.getInstance().unlock()
                browser = getPluginBrowser()
                if browser is not None:
@@ -546,11 +609,15 @@ class HandlerHbbTV(Handler):
                return (0, "OK")
 
        def _cb_virtualKeyboardClosed(self, data=None):
                return (0, "OK")
 
        def _cb_virtualKeyboardClosed(self, data=None):
+               fbClass.getInstance().lock()
                eRCInput.getInstance().lock()
                eRCInput.getInstance().lock()
+               setResolution(1280, 720)
                command_util = getCommandUtil()
                command_util.sendCommand('OP_BROWSER_VKBD_RES', data)
        def _cb_handleShowVirtualKeyboard(self, opcode, data):
                self._handle_dump(self._cb_handleShowVirtualKeyboard, opcode, data)
                command_util = getCommandUtil()
                command_util.sendCommand('OP_BROWSER_VKBD_RES', data)
        def _cb_handleShowVirtualKeyboard(self, opcode, data):
                self._handle_dump(self._cb_handleShowVirtualKeyboard, opcode, data)
+               restoreResolution()
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                if data == 0 or strIsEmpty(data):
                        data = ""
                eRCInput.getInstance().unlock()
                if data == 0 or strIsEmpty(data):
                        data = ""
@@ -646,7 +713,7 @@ class HandlerHbbTV(Handler):
                return (channel_list_size, struct.pack('!IIII', sid, onid, tsid, namelen) + name)
 
        def _cb_handleSetPageTitle(self, opcode, data):
                return (channel_list_size, struct.pack('!IIII', sid, onid, tsid, namelen) + name)
 
        def _cb_handleSetPageTitle(self, opcode, data):
-               self._handle_dump(self._cb_handleCloseHbbTVBrowser, opcode, data)
+               self._handle_dump(self._cb_handleSetPageTitle, opcode, data)
                if data.startswith('file://') or data.startswith('http://'):
                        return "OK"
                if self._on_set_title_cb is not None:
                if data.startswith('file://') or data.startswith('http://'):
                        return "OK"
                if self._on_set_title_cb is not None:
@@ -681,6 +748,8 @@ class HandlerHbbTV(Handler):
                if before_service is not None:
                        self._session.nav.playService(before_service)
                        self._vod_uri = None
                if before_service is not None:
                        self._session.nav.playService(before_service)
                        self._vod_uri = None
+
+               restoreResolution()
                return (0, "OK")
 
        def _cb_handleVODPlayerURI(self, opcode, data):
                return (0, "OK")
 
        def _cb_handleVODPlayerURI(self, opcode, data):
@@ -756,6 +825,8 @@ class HbbTVWindow(Screen, InfoBarNotifications):
                """
        def __init__(self, session, url=None, cbf=None, useAIT=False, profile=0):
                self._session = session
                """
        def __init__(self, session, url=None, cbf=None, useAIT=False, profile=0):
                self._session = session
+               setResolution(1280, 720)
+               fbClass.getInstance().lock()
                eRCInput.getInstance().lock()
 
                Screen.__init__(self, session)
                eRCInput.getInstance().lock()
 
                Screen.__init__(self, session)
@@ -825,9 +896,13 @@ class HbbTVWindow(Screen, InfoBarNotifications):
                        print ErrMsg
 
        def _serviceEOF(self):
                        print ErrMsg
 
        def _serviceEOF(self):
+               (position,length) = self.getVodPlayTime()
+               self._ssm.setStatus(length, length, 1)
+               print "service EOF"
                self._currentServicePositionTimer.stop()
 
        def _layoutFinished(self):
                self._currentServicePositionTimer.stop()
 
        def _layoutFinished(self):
+               self.setTitle(_('HbbTV Plugin'))
                command_util = getCommandUtil()
                profile = self._profile
                (sid, onid, tsid, name, orgid) = getChannelInfos()
                command_util = getCommandUtil()
                profile = self._profile
                (sid, onid, tsid, name, orgid) = getChannelInfos()
@@ -859,6 +934,8 @@ class HbbTVWindow(Screen, InfoBarNotifications):
                        if self._cb_closed_func is not None:
                                self._cb_closed_func()
                except: pass
                        if self._cb_closed_func is not None:
                                self._cb_closed_func()
                except: pass
+               restoreResolution()
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                self.close()
 
                eRCInput.getInstance().unlock()
                self.close()
 
@@ -884,12 +961,12 @@ class HbbTVHelper(Screen):
                __gval__.command_server = ServerFactory().doListenUnixTCP('/tmp/.sock.hbbtv.url', __gval__.hbbtv_handelr)
 
                self._urls = None
                __gval__.command_server = ServerFactory().doListenUnixTCP('/tmp/.sock.hbbtv.url', __gval__.hbbtv_handelr)
 
                self._urls = None
-               #self._stop_opera()
-               #self._start_opera()
-               self._restart_opera()
 
                Screen.__init__(self, session)
                self._session = session
 
                Screen.__init__(self, session)
                self._session = session
+
+               self._restart_opera()
+
                self._timer_infobar = eTimer()
                self._timer_infobar.callback.append(self._cb_registrate_infobar)
                self._timer_infobar.start(1000)
                self._timer_infobar = eTimer()
                self._timer_infobar.callback.append(self._cb_registrate_infobar)
                self._timer_infobar.start(1000)
@@ -904,6 +981,8 @@ class HbbTVHelper(Screen):
                        _g_ssm_ = SimpleSharedMemory()
                        _g_ssm_.doConnect()
 
                        _g_ssm_ = SimpleSharedMemory()
                        _g_ssm_.doConnect()
 
+               self._callbackStartStop = None
+
        def _cb_registrate_infobar(self):
                if InfoBar.instance:
                        self._timer_infobar.stop()
        def _cb_registrate_infobar(self):
                if InfoBar.instance:
                        self._timer_infobar.stop()
@@ -939,8 +1018,8 @@ class HbbTVHelper(Screen):
 
        def _cb_hbbtv_activated(self, title=None, url=None):
                if not self._is_browser_running():
 
        def _cb_hbbtv_activated(self, title=None, url=None):
                if not self._is_browser_running():
-                       message = "HbbTV Browser was not running.\nPlease running browser before start HbbTV Application."
-                       self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
+                       message = _("HbbTV Browser was not running.\nPlease running browser before start HbbTV Application.")
+                       self._session.open(MessageBox, message, MessageBox.TYPE_INFO)
                        return
                service = self._session.nav.getCurrentlyPlayingServiceReference()
                setBeforeService(service)
                        return
                service = self._session.nav.getCurrentlyPlayingServiceReference()
                setBeforeService(service)
@@ -980,6 +1059,7 @@ class HbbTVHelper(Screen):
                        global HBBTVAPP_PATH
                        start_command = '%s/launcher start'%(HBBTVAPP_PATH)
                        os.system(start_command)
                        global HBBTVAPP_PATH
                        start_command = '%s/launcher start'%(HBBTVAPP_PATH)
                        os.system(start_command)
+               return True
 
        def _stop_opera(self):
                global HBBTVAPP_PATH
 
        def _stop_opera(self):
                global HBBTVAPP_PATH
@@ -990,6 +1070,7 @@ class HbbTVHelper(Screen):
                global HBBTVAPP_PATH
                try:    os.system('%s/launcher restart'%(HBBTVAPP_PATH))
                except: pass
                global HBBTVAPP_PATH
                try:    os.system('%s/launcher restart'%(HBBTVAPP_PATH))
                except: pass
+               return True
 
        def getStartHbbTVUrl(self):
                url, self._urls, self._profile = None, None, 0
 
        def getStartHbbTVUrl(self):
                url, self._urls, self._profile = None, None, 0
@@ -1011,7 +1092,7 @@ class HbbTVHelper(Screen):
                if self.getStartHbbTVUrl():
                        for x in self._urls:
                                applications.append((x[1], x))
                if self.getStartHbbTVUrl():
                        for x in self._urls:
                                applications.append((x[1], x))
-               else: applications.append(("No detected HbbTV applications.", None))
+               else: applications.append((_("No detected HbbTV applications."), None))
                self._session.openWithCallback(self._application_selected, ChoiceBox, title=_("Please choose an HbbTV application."), list=applications)
 
        def _application_selected(self, selected):
                self._session.openWithCallback(self._application_selected, ChoiceBox, title=_("Please choose an HbbTV application."), list=applications)
 
        def _application_selected(self, selected):
@@ -1020,18 +1101,21 @@ class HbbTVHelper(Screen):
                        self._cb_hbbtv_activated(selected[1][1], selected[1][2])
                except Exception, ErrMsg: print ErrMsg
 
                        self._cb_hbbtv_activated(selected[1][1], selected[1][2])
                except Exception, ErrMsg: print ErrMsg
 
-       def showBrowserConfigBox(self):
+       def showBrowserConfigBox(self, callback=None):
                start_stop_mode = []
                start_stop_mode = []
+               self._callbackStartStop = callback
                if self._is_browser_running():
                if self._is_browser_running():
-                       start_stop_mode.append(('Stop',None))
-               else:   start_stop_mode.append(('Start',None))
+                       start_stop_mode.append((_('Stop'),'Stop'))
+               else:   start_stop_mode.append((_('Start'),'Start'))
                self._session.openWithCallback(self._browser_config_selected, ChoiceBox, title=_("Please choose one."), list=start_stop_mode)
 
        def _browser_config_selected(self, selected):
                if selected is None:
                        return
                self._session.openWithCallback(self._browser_config_selected, ChoiceBox, title=_("Please choose one."), list=start_stop_mode)
 
        def _browser_config_selected(self, selected):
                if selected is None:
                        return
+               if self._callbackStartStop is not None:
+                       self._callbackStartStop()
                try:
                try:
-                       mode = selected[0]
+                       mode = selected[1]
                        if mode == 'Start':
                                if not self._is_browser_running():
                                        self._start_opera()
                        if mode == 'Start':
                                if not self._is_browser_running():
                                        self._start_opera()
@@ -1048,34 +1132,76 @@ class HbbTVHelper(Screen):
                        print "Check Browser Running ERR :", ErrMsg
                return False
 
                        print "Check Browser Running ERR :", ErrMsg
                return False
 
+       def doChangeChannel(self, _sid, _tsid):
+               root = eServiceReference(service_types_tv)
+               if root is None:
+                       return False
+               serviceList = eServiceCenter.getInstance().list(root)
+               if serviceList is None:
+                       return False    
+               while True:
+                       service = serviceList.getNext()
+                       if service is None or not service.valid():
+                               break
+
+                       #1:0:19:2840:3FB:1:C00000:0:0:0:
+                       serviceRef = service.toString()
+                       if strIsEmpty(serviceRef):
+                               continue
+                       serviceRefItems = serviceRef.split(":")
+                       if len(serviceRefItems) < 5:
+                               continue
+
+                       sid  = serviceRefItems[3]
+                       tsid = serviceRefItems[4]
+                       if sid == _sid and tsid == _tsid:
+                               self._session.nav.playService(eServiceReference(serviceRef))
+                               service = self._session.nav.getCurrentlyPlayingServiceReference()
+                               setBeforeService(service)
+                               return True
+               return False
+
 class OperaBrowserSetting:
        def __init__(self):
                self._settingFileName = '/usr/local/hbb-browser/home/setting.ini'
                self._start = None
 class OperaBrowserSetting:
        def __init__(self):
                self._settingFileName = '/usr/local/hbb-browser/home/setting.ini'
                self._start = None
+               self._type  = None
+               self._keymap = None
                self._read()
        def _read(self):
                f = open(self._settingFileName)
                for line in f.readlines():
                        if line.startswith('start='):
                self._read()
        def _read(self):
                f = open(self._settingFileName)
                for line in f.readlines():
                        if line.startswith('start='):
-                               self._start = line[6:len(line)-1]
+                               tmp = line[6:len(line)-1].split()
+                               self._start = tmp[0]
+                               if len(tmp) > 1:
+                                       self._type = int(tmp[1])
+                               else:   self._type = 0
+                       elif line.startswith('keymap='):
+                               self._keymap = line[7:len(line)-1]
                f.close()
        def _write(self):
                tmpstr = []
                f.close()
        def _write(self):
                tmpstr = []
-               tmpstr.append('start=%s\n' % (self._start))
+               tmpstr.append('start=%s %d\n' % (self._start, self._type))
+               tmpstr.append('keymap=%s\n' % (self._keymap))
                f = open(self._settingFileName, 'w')
                f.writelines(tmpstr)
                f.close()
                f = open(self._settingFileName, 'w')
                f.writelines(tmpstr)
                f.close()
-       def setData(self, start):
+       def setData(self, start, types=0, keymap="us-rc"):
                self._start = start
                self._start = start
+               self._type = types
+               self._keymap = keymap
                self._write()
        def getData(self):
                return {
                self._write()
        def getData(self):
                return {
-                       'start':self._start
+                       'start':self._start,
+                       'type':self._type,
+                       'keymap':self._keymap,
                }
 
 class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
        skin=   """
                }
 
 class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
        skin=   """
-               <screen position="center,center" size="600,350" title="Proference">
+               <screen position="center,120" size="600,350" title="Preference">
                        <widget name="url" position="5,0" size="590,100" valign="center" font="Regular;20" />
                        <widget name="config" position="0,100" size="600,200" scrollbarMode="showOnDemand" />
 
                        <widget name="url" position="5,0" size="590,100" valign="center" font="Regular;20" />
                        <widget name="config" position="0,100" size="600,200" scrollbarMode="showOnDemand" />
 
@@ -1107,15 +1233,12 @@ class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
                if self._currentPageUrl is None:
                        self._currentPageUrl = ''
                self._startPageUrl   = None
                if self._currentPageUrl is None:
                        self._currentPageUrl = ''
                self._startPageUrl   = None
-
+               self._keymapType = None
                self.makeMenuEntry()
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
                self.makeMenuEntry()
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
-               try:
-                       self._startPageUrl = OperaBrowserSetting().getData()['start']
-               except: self._startPageUrl = 'http://vuplus.com'
-               self.updateStartPageUrl()
+               self.setTitle(_('Preference'))
 
        def updateStartPageUrl(self):
                if self.menuItemStartpage.value == "startpage":
 
        def updateStartPageUrl(self):
                if self.menuItemStartpage.value == "startpage":
@@ -1128,9 +1251,15 @@ class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
        def keyGreen(self):
                url = self["url"].getText()
                if strIsEmpty(url):
        def keyGreen(self):
                url = self["url"].getText()
                if strIsEmpty(url):
-                       self.session.open(MessageBox, 'Invalid URL!!(Empty)\nPlease, Input to the URL.', type = MessageBox.TYPE_INFO)
+                       self.session.open(MessageBox, _('Invalid URL!!(Empty)\nPlease, Input to the URL.'), type = MessageBox.TYPE_INFO)
                        return
                        return
-               OperaBrowserSetting().setData(url)
+               mode = 0
+               if url.find('/usr/local/manual') > 0:
+                       mode = 1
+               self._keymapType = self.menuItemKeyboardLayout.value
+               OperaBrowserSetting().setData(url, mode, self._keymapType)
+               command_util = getCommandUtil()
+               command_util.sendCommand('OP_BROWSER_NEED_RELOAD_KEYMAP')
                self.close()
 
        def keyRed(self):
                self.close()
 
        def keyRed(self):
@@ -1142,7 +1271,7 @@ class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
                                return
                        self["url"].setText(data)
                if self.menuItemStartpage.value == "direct":
                                return
                        self["url"].setText(data)
                if self.menuItemStartpage.value == "direct":
-                       self.session.openWithCallback(_cb_directInputUrl, VirtualKeyBoard, title=("Please enter URL here"), text='http://')
+                       self.session.openWithCallback(_cb_directInputUrl, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
 
        def keyLeft(self):
                ConfigListScreen.keyLeft(self)
 
        def keyLeft(self):
                ConfigListScreen.keyLeft(self)
@@ -1152,6 +1281,16 @@ class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
                ConfigListScreen.keyRight(self)
                self.updateStartPageUrl()
 
                ConfigListScreen.keyRight(self)
                self.updateStartPageUrl()
 
+       def getKeymapTypeList(self):
+               types = []
+               for f in os.listdir("/usr/local/hbb-browser/keymap"):
+                       filesplit = f.split('.')
+                       if len(filesplit) < 2:
+                               continue
+                       types.append((filesplit[1], filesplit[1]))
+               types.sort()
+               return types
+
        def makeMenuEntry(self):
                l = []
                l.append(("startpage", _("Start Page")))
        def makeMenuEntry(self):
                l = []
                l.append(("startpage", _("Start Page")))
@@ -1160,11 +1299,27 @@ class OperaBrowserPreferenceWindow(ConfigListScreen, Screen):
                l.append(("direct", _("Direct Input")))
                self.menuItemStartpage  = ConfigSelection(default="startpage", choices = l)
                self.menuEntryStartpage = getConfigListEntry(_("Startpage"), self.menuItemStartpage)
                l.append(("direct", _("Direct Input")))
                self.menuItemStartpage  = ConfigSelection(default="startpage", choices = l)
                self.menuEntryStartpage = getConfigListEntry(_("Startpage"), self.menuItemStartpage)
+
+               kl = self.getKeymapTypeList()
+
+               try:
+                       d = OperaBrowserSetting().getData()
+                       self._startPageUrl = d['start']
+                       self._keymapType = d['keymap']
+                       #d['type']
+               except: self._startPageUrl = 'http://vuplus.com'
+               self.updateStartPageUrl()
+
+               if self._keymapType is None or len(self._keymapType) == 0:
+                       self._keymapType = "us-rc"
+               self.menuItemKeyboardLayout = ConfigSelection(default=self._keymapType, choices = kl)
+               self.menuEntryKeyboardLayout = getConfigListEntry(_("Keyboard Layout"), self.menuItemKeyboardLayout)
                self.resetMenuList()
 
        def resetMenuList(self):
                self.menulist = []
                self.menulist.append(self.menuEntryStartpage)
                self.resetMenuList()
 
        def resetMenuList(self):
                self.menulist = []
                self.menulist.append(self.menuEntryStartpage)
+               self.menulist.append(self.menuEntryKeyboardLayout)
 
                self["config"].list = self.menulist
                self["config"].l.setList(self.menulist)
 
                self["config"].list = self.menulist
                self["config"].l.setList(self.menulist)
@@ -1189,7 +1344,7 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
                self.mMode = _mode
                self.mType = _type
                self.mData = _data
                self.mMode = _mode
                self.mType = _type
                self.mData = _data
-                self.session = session
+                self.mSession = session
                self.mBookmarkManager = _bm
 
                if _data is not None:
                self.mBookmarkManager = _bm
 
                if _data is not None:
@@ -1215,45 +1370,85 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
                self.menuItemUrl   = None
                self.menuItemName  = None
 
                self.menuItemUrl   = None
                self.menuItemName  = None
 
+               self.menuEntryName = None
+               self.menuEntryTitle = None
+               self.menuEntryUrl = None
+
                self.makeConfigList()
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
                self.makeConfigList()
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
-               self.setTitle('Bookmark ' + self.mMode)
+               self.setTitle(_('Bookmark') + ' ' + self.mMode)
+
+       def selectedItem(self):
+               currentPosition = self["config"].getCurrent()
+               if self.mType == BookmarkEditWindow.CATEGORY:
+                       return (_("Name"), self.menuItemName)
+               else:
+                       if currentPosition == self.menuEntryTitle:
+                               return (_("Title"), self.menuItemTitle)
+                       elif currentPosition == self.menuEntryUrl:
+                               return (_("Url"), self.menuItemUrl)
+               return None
+
+       def showMessageBox(self, text):
+               msg = _("Invalid ") + text + _("!!(Empty)\nPlease, Input to the ") + text + "."
+               self.mSession.openWithCallback(self.showVKeyWindow, MessageBox, msg, MessageBox.TYPE_INFO)
+               return False
+
+       def showVKeyWindow(self, data=None):
+               itemTitle = ""
+               itemValue = ""
+               selected = self.selectedItem()
+               if selected is not None:
+                       itemValue = selected[1].value
+                       if strIsEmpty(itemValue):
+                               itemValue = ""
+                       itemTitle = selected[0]
+
+               self.session.openWithCallback(self.cbVKeyWindow, VirtualKeyBoard, title=itemTitle, text=itemValue)
+
+       def cbVKeyWindow(self, data=None):
+               if data is not None:
+                       selected = self.selectedItem()
+                       if selected is not None:
+                               selected[1].setValue(data)
+
        def saveData(self):
                if self.mType == BookmarkEditWindow.CATEGORY:
        def saveData(self):
                if self.mType == BookmarkEditWindow.CATEGORY:
-                       if self.mMode == 'Add':
+                       if self.mMode == _('Add'):
                                categoryName = self.menuItemName.value
                                if strIsEmpty(categoryName):
                                categoryName = self.menuItemName.value
                                if strIsEmpty(categoryName):
-                                       msg = "Invalid Category Name!!(Empty)\nPlease, Input to the Category Name."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       return self.showMessageBox(_("Category Name"))
                                self.mBookmarkManager.addCategory(categoryName)
                        else:
                                if strIsEmpty(self.menuItemName.value):
                                self.mBookmarkManager.addCategory(categoryName)
                        else:
                                if strIsEmpty(self.menuItemName.value):
-                                       msg = "Invalid Category Name!!(Empty)\nPlease, Input to the Category Name."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       return self.showMessageBox(_("Category Name"))
                                self.mData.mName = self.menuItemName.value
                                self.mBookmarkManager.updateCategory(self.mData)
                else:
                                self.mData.mName = self.menuItemName.value
                                self.mBookmarkManager.updateCategory(self.mData)
                else:
-                       if self.mMode == 'Add':
+                       if self.mMode == _('Add'):
                                bookmarkTitle = self.menuItemTitle.value
                                bookmarkUrl   = self.menuItemUrl.value
                                if strIsEmpty(bookmarkTitle):
                                bookmarkTitle = self.menuItemTitle.value
                                bookmarkUrl   = self.menuItemUrl.value
                                if strIsEmpty(bookmarkTitle):
-                                       msg = "Invalid Bookmark Title!!(Empty)\nPlease input to the Bookmark Title."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
-                               self.mBookmarkManager.addBookmark(bookmarkTitle, bookmarkUrl, self.mData.mParent)
+                                       self["config"].setCurrentIndex(0)
+                                       return self.showMessageBox(_("Bookmark Title"))
+                               if strIsEmpty(bookmarkUrl):
+                                       self["config"].setCurrentIndex(1)
+                                       return self.showMessageBox(_("Bookmark URL"))
+                               self.mBookmarkManager.addBookmark(bookmarkTitle, bookmarkUrl, self.mData.mParent, 0)
                        else:
                                if strIsEmpty(self.menuItemTitle.value):
                        else:
                                if strIsEmpty(self.menuItemTitle.value):
-                                       msg = "Invalid Bookmark Title!!(Empty)\nPlease input to the Bookmark Title."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       self["config"].setCurrentIndex(0)
+                                       return self.showMessageBox(_("Bookmark Title"))
+                               if strIsEmpty(self.menuItemUrl.value):
+                                       self["config"].setCurrentIndex(1)
+                                       return self.showMessageBox(_("Bookmark URL"))
                                self.mData.mTitle = self.menuItemTitle.value
                                self.mData.mUrl   = self.menuItemUrl.value
                                self.mBookmarkManager.updateBookmark(self.mData)
                return True
                                self.mData.mTitle = self.menuItemTitle.value
                                self.mData.mUrl   = self.menuItemUrl.value
                                self.mBookmarkManager.updateBookmark(self.mData)
                return True
+
        def keyGreen(self):
                if not self.saveData():
                        return
        def keyGreen(self):
                if not self.saveData():
                        return
@@ -1269,22 +1464,26 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
 
                if self.mType == BookmarkEditWindow.CATEGORY:
                        self.menuItemName = ConfigText(default=self.mData.mName, visible_width=65, fixed_size=False)
 
                if self.mType == BookmarkEditWindow.CATEGORY:
                        self.menuItemName = ConfigText(default=self.mData.mName, visible_width=65, fixed_size=False)
-                       menuEntryName  = getConfigListEntry(_("Name"), self.menuItemName)
-                       self.menulist.append(menuEntryName)
+
+                       self.menuEntryName  = getConfigListEntry(_("Name"), self.menuItemName)
+
+                       self.menulist.append(self.menuEntryName)
                else:
                        self.menuItemTitle = ConfigText(default=self.mData.mTitle, visible_width=65, fixed_size=False)
                        self.menuItemUrl   = ConfigText(default=self.mData.mUrl, visible_width=65, fixed_size=False)
                else:
                        self.menuItemTitle = ConfigText(default=self.mData.mTitle, visible_width=65, fixed_size=False)
                        self.menuItemUrl   = ConfigText(default=self.mData.mUrl, visible_width=65, fixed_size=False)
-                       menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
-                       menuEntryUrl   = getConfigListEntry(_("Url"), self.menuItemUrl)
-                       self.menulist.append(menuEntryTitle)
-                       self.menulist.append(menuEntryUrl)
+
+                       self.menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
+                       self.menuEntryUrl   = getConfigListEntry(_("Url"), self.menuItemUrl)
+
+                       self.menulist.append(self.menuEntryTitle)
+                       self.menulist.append(self.menuEntryUrl)
                        
                self["config"].list = self.menulist
                self["config"].l.setList(self.menulist)
 
 class OperaBrowserBookmarkWindow(Screen):
        skin =  """
                        
                self["config"].list = self.menulist
                self["config"].l.setList(self.menulist)
 
 class OperaBrowserBookmarkWindow(Screen):
        skin =  """
-               <screen name="HbbTVBrowserBookmarkWindow" position="center,center" size="600,400" title="Bookmark" >
+               <screen name="HbbTVBrowserBookmarkWindow" position="center,120" size="600,400" title="Bookmark" >
                        <widget name="bookmarklist" position="0,0" size="600,200" zPosition="10" scrollbarMode="showOnDemand" />
 
                        <ePixmap pixmap="skin_default/buttons/key_0.png" position="556,330" size="35,30" alphatest="on" />
                        <widget name="bookmarklist" position="0,0" size="600,200" zPosition="10" scrollbarMode="showOnDemand" />
 
                        <ePixmap pixmap="skin_default/buttons/key_0.png" position="556,330" size="35,30" alphatest="on" />
@@ -1327,6 +1526,11 @@ class OperaBrowserBookmarkWindow(Screen):
                self.mBookmarkList = self.setBookmarkList()
                self["bookmarklist"] = MenuList(self.mBookmarkList)
 
                self.mBookmarkList = self.setBookmarkList()
                self["bookmarklist"] = MenuList(self.mBookmarkList)
 
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(_('Bookmark'))
+
        def setBookmarkList(self):
                l = []
                #self.mBookmarkManager.dump()
        def setBookmarkList(self):
                l = []
                #self.mBookmarkManager.dump()
@@ -1364,15 +1568,15 @@ class OperaBrowserBookmarkWindow(Screen):
        def keyNumber(self):
                data = self["bookmarklist"].getCurrent()[1]
                if strIsEmpty(data.mUrl):
        def keyNumber(self):
                data = self["bookmarklist"].getCurrent()[1]
                if strIsEmpty(data.mUrl):
-                       msg = "Invalid URL. Please check again!!"
+                       msg = _("Invalid URL. Please check again!!")
                        self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
                        return
                def cbSetStartpage(ret=None):
                        if ret is None: return
                        if ret:
                                data = self["bookmarklist"].getCurrent()[1]
                        self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
                        return
                def cbSetStartpage(ret=None):
                        if ret is None: return
                        if ret:
                                data = self["bookmarklist"].getCurrent()[1]
-                               OperaBrowserSetting().setData(data.mUrl)
-               msg = "Do you want to set selected url to the Startpage?"
+                               OperaBrowserSetting().setData(data.mUrl, data.mType)
+               msg = _("Do you want to set selected url to the Startpage?")
                self.mSession.openWithCallback(cbSetStartpage, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
 
        def keyGreen(self):
                self.mSession.openWithCallback(cbSetStartpage, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
 
        def keyGreen(self):
@@ -1385,29 +1589,29 @@ class OperaBrowserBookmarkWindow(Screen):
                                        return
                                if strIsEmpty(self.mTitle):
                                        return
                                        return
                                if strIsEmpty(self.mTitle):
                                        return
-                               retAdd = self.mBookmarkManager.addBookmark(self.mTitle, self.mUrl, parent.mId)
+                               retAdd = self.mBookmarkManager.addBookmark(self.mTitle, self.mUrl, parent.mId, 0)
                                if not retAdd:
                                if not retAdd:
-                                       msg = "Current page is already exist."
+                                       msg = _("Current page is already exist.")
                                        self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
                                self.cbEditWindow(True)
                        elif data[1] == 2:
                                parent = self.getParentCategory()
                                if parent is None:
                                        return
                                        self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
                                self.cbEditWindow(True)
                        elif data[1] == 2:
                                parent = self.getParentCategory()
                                if parent is None:
                                        return
-                               b = BookmarkData(0, '', '', parent.mId)
-                               self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, 'Add', BookmarkEditWindow.BOOKMARK, b, self.mBookmarkManager)
+                               b = BookmarkData(0, '', '', parent.mId, 0)
+                               self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.BOOKMARK, b, self.mBookmarkManager)
                        elif data[1] == 3:
                                c = CategoryData(0, '')
                        elif data[1] == 3:
                                c = CategoryData(0, '')
-                               self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, 'Add', BookmarkEditWindow.CATEGORY, c, self.mBookmarkManager)
+                               self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Add'), BookmarkEditWindow.CATEGORY, c, self.mBookmarkManager)
                if strIsEmpty(self.mUrl):
                if strIsEmpty(self.mUrl):
-                       l = [('Direct Input(Bookmark)',2,), ('Direct Input(Category)',3,)]
-               else:   l = [('Currentpage(Bookmark)',1,), ('Direct Input(Bookmark)',2,), ('Direct Input(Category)',3,)]
+                       l = [(_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
+               else:   l = [(_('Currentpage(Bookmark)'),1,), (_('Direct Input(Bookmark)'),2,), (_('Direct Input(Category)'),3,)]
                self.mSession.openWithCallback(cbGreen, ChoiceBox, title=_("Please choose."), list=l)
        def keyYellow(self):
                data = self["bookmarklist"].getCurrent()[1]
                if self.isCategoryItem():
                self.mSession.openWithCallback(cbGreen, ChoiceBox, title=_("Please choose."), list=l)
        def keyYellow(self):
                data = self["bookmarklist"].getCurrent()[1]
                if self.isCategoryItem():
-                       self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, 'Edit', BookmarkEditWindow.CATEGORY, data, self.mBookmarkManager)
-               else:   self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, 'Edit', BookmarkEditWindow.BOOKMARK, data, self.mBookmarkManager)
+                       self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.CATEGORY, data, self.mBookmarkManager)
+               else:   self.mSession.openWithCallback(self.cbEditWindow, BookmarkEditWindow, _('Edit'), BookmarkEditWindow.BOOKMARK, data, self.mBookmarkManager)
        def keyBlue(self):
                def cbBlue(ret=None):
                        if not ret: return
        def keyBlue(self):
                def cbBlue(ret=None):
                        if not ret: return
@@ -1417,8 +1621,8 @@ class OperaBrowserBookmarkWindow(Screen):
                        else:   self.mBookmarkManager.deleteBookmark(data.mId)
                        self.updateBookmarkList()
                if self.isCategoryItem():
                        else:   self.mBookmarkManager.deleteBookmark(data.mId)
                        self.updateBookmarkList()
                if self.isCategoryItem():
-                       msg = "Do you want to delete the category and the bookmarks?"
-               else:   msg = "Do you want to delete the bookmark?"
+                       msg = _("Do you want to delete the category and the bookmarks?")
+               else:   msg = _("Do you want to delete the bookmark?")
                self.mSession.openWithCallback(cbBlue, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
        def keyOK(self):
                if self.isCategoryItem(): return
                self.mSession.openWithCallback(cbBlue, MessageBox, msg, MessageBox.TYPE_YESNO, default=True)
        def keyOK(self):
                if self.isCategoryItem(): return
@@ -1426,15 +1630,21 @@ class OperaBrowserBookmarkWindow(Screen):
                data = self["bookmarklist"].getCurrent()[1]
                url = data.mUrl.strip()
                if len(url) == 0:
                data = self["bookmarklist"].getCurrent()[1]
                url = data.mUrl.strip()
                if len(url) == 0:
-                       self.session.open(MessageBox, "Can't open selected bookmark.\n   - URL data is empty!!", type = MessageBox.TYPE_INFO)
+                       self.session.open(MessageBox, _("Can't open selected bookmark.\n   - URL data is empty!!"), type = MessageBox.TYPE_INFO)
                        return
                        return
-               self.close(url)
+               mode = data.mType
+               if mode:
+                       lang = language.getLanguage()
+                       if lang == 'ru_RU' and os.path.exists('/usr/local/manual/ru_RU'):
+                               url = '/usr/local/manual/ru_RU/main.html'
+                       elif lang == 'de_DE' and os.path.exists('/usr/local/manual/de_DE'):
+                               url = '/usr/local/manual/de_DE/main.html'
+               self.close((url, mode))
        def keyRed(self):
                self.keyCancel()
        def keyCancel(self):
                self.close()
 
        def keyRed(self):
                self.keyCancel()
        def keyCancel(self):
                self.close()
 
-
 class BrowserHelpWindow(Screen, HelpableScreen):
        MODE_GLOBAL,MODE_KEYBOARD,MODE_MOUSE = 1,2,3
         skin = """
 class BrowserHelpWindow(Screen, HelpableScreen):
        MODE_GLOBAL,MODE_KEYBOARD,MODE_MOUSE = 1,2,3
         skin = """
@@ -1472,6 +1682,11 @@ class BrowserHelpWindow(Screen, HelpableScreen):
                self.showHelpTimer.callback.append(self.cbShowHelpTimerClosed)
                self.showHelpTimer.start(500)
 
                self.showHelpTimer.callback.append(self.cbShowHelpTimerClosed)
                self.showHelpTimer.start(500)
 
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(_('Browser Help'))
+
        def cbShowHelpTimerClosed(self):
                self.showHelpTimer.stop()
                self.setHelpModeActions(self.MODE_GLOBAL)
        def cbShowHelpTimerClosed(self):
                self.showHelpTimer.stop()
                self.setHelpModeActions(self.MODE_GLOBAL)
@@ -1541,7 +1756,6 @@ class BrowserHelpWindow(Screen, HelpableScreen):
        def keyBlue(self):
                self.setHelpModeActions(self.MODE_KEYBOARD)
 
        def keyBlue(self):
                self.setHelpModeActions(self.MODE_KEYBOARD)
 
-_g_helper = None
 class OperaBrowser(Screen):
        MENUBAR_ITEM_WIDTH  = 150
        MENUBAR_ITEM_HEIGHT = 30
 class OperaBrowser(Screen):
        MENUBAR_ITEM_WIDTH  = 150
        MENUBAR_ITEM_HEIGHT = 30
@@ -1549,22 +1763,26 @@ class OperaBrowser(Screen):
        SUBMENULIST_HEIGHT  = 25
        SUBMENULIST_NEXT    = 2
 
        SUBMENULIST_HEIGHT  = 25
        SUBMENULIST_NEXT    = 2
 
+       # menulist->position->y : MENUBAR_ITEM_HEIGHT+30
+       # menulist->size->x     : SUBMENULIST_WIDTH
+       # submenulist->position->x : SUBMENULIST_WIDTH+50+SUBMENULIST_NEXT
+       # submenulist->position->y : MENUBAR_ITEM_HEIGHT+30
+       # submenulist->size->x  : SUBMENULIST_WIDTH
        skin =  """
        skin =  """
-               <screen name="Opera Browser" position="0,0" size="1280,720" backgroundColor="transparent" flags="wfNoBorder" title="Opera Browser">
+               <screen name="OperaBrowser" position="0,0" size="1280,720" backgroundColor="transparent" flags="wfNoBorder" title="Opera Browser">
                        <widget name="topArea" zPosition="-1" position="0,0" size="1280,60" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
                        <widget name="menuitemFile" position="30,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
                        <widget name="menuitemTool" position="180,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
                        <widget name="menuitemHelp" position="330,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
                        <widget name="topArea" zPosition="-1" position="0,0" size="1280,60" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
                        <widget name="menuitemFile" position="30,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
                        <widget name="menuitemTool" position="180,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
                        <widget name="menuitemHelp" position="330,20" size="150,30" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" foregroundColors="#9f1313,#a08500" />
-                       <widget name="menulist" position="50,%d" size="%d,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
-                       <widget name="submenulist" position="%d,%d" size="%d,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
+                       <widget name="menulist" position="50,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
+                       <widget name="submenulist" position="252,60" size="200,150" backgroundColor="#000000" zPosition="10" scrollbarMode="showOnDemand" />
                        <widget name="bottomArea" position="0,640" size="1280,80" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
                        <widget name="bottomArea" position="0,640" size="1280,80" font="Regular;20" valign="center" halign="center" backgroundColor="#000000" />
-               </screen>
-               """ % (MENUBAR_ITEM_HEIGHT+30, SUBMENULIST_WIDTH, SUBMENULIST_WIDTH+50+SUBMENULIST_NEXT, MENUBAR_ITEM_HEIGHT+30, SUBMENULIST_WIDTH)# modify menu
-
-       MENUITEMS_LIST =[[('Open Startpage', None), ('Open URL', None), ('Start/Stop',None), ('Exit', None)],
-                        [('Bookmark', None), ('Preference', None)],
-                        [('About', None), ('Help', None)]]
-       def __init__(self, session):
+               </screen>
+               """
+       MENUITEMS_LIST =[[(_('Open Startpage'), None), (_('Open URL'), None), (_('Start/Stop'),None), (_('Exit'), None)],
+                        [(_('Bookmark'), None), (_('Preference'), None)],
+                        [(_('About'), None), (_('Help'), None)]]
+       def __init__(self, session, url=None):
                Screen.__init__(self, session)
                self["actions"] = ActionMap(["DirectionActions", "MenuActions", "OkCancelActions"], {
                         "cancel"      : self.keyCancel
                Screen.__init__(self, session)
                self["actions"] = ActionMap(["DirectionActions", "MenuActions", "OkCancelActions"], {
                         "cancel"      : self.keyCancel
@@ -1604,23 +1822,29 @@ class OperaBrowser(Screen):
                self._onCloseTimer = eTimer()
                self._onCloseTimer.callback.append(self._cb_onClose)
 
                self._onCloseTimer = eTimer()
                self._onCloseTimer.callback.append(self._cb_onClose)
 
+               self.paramUrl = url
+
        def enableRCMouse(self, mode): #mode=[0|1]|[False|True]
                rcmouse_path = "/proc/stb/fp/mouse"
                if os.path.exists(rcmouse_path):
                        os.system("echo %d > %s" % (mode, rcmouse_path))
 
        def layoutFinished(self):
        def enableRCMouse(self, mode): #mode=[0|1]|[False|True]
                rcmouse_path = "/proc/stb/fp/mouse"
                if os.path.exists(rcmouse_path):
                        os.system("echo %d > %s" % (mode, rcmouse_path))
 
        def layoutFinished(self):
-               self["menuitemFile"].setText("File")# modify menu
-               self["menuitemTool"].setText("Tools")
-               self["menuitemHelp"].setText("Help")
+               self["menuitemFile"].setText(_("File"))# modify menu
+               self["menuitemTool"].setText(_("Tools"))
+               self["menuitemHelp"].setText(_("Help"))
 
                self["menulist"].hide()
                self["submenulist"].hide()
 
 
                self["menulist"].hide()
                self["submenulist"].hide()
 
-               self["bottomArea"].setText("Opera Web Browser Plugin v1.0")
-               self.setTitle("BrowserMain")
+               self["bottomArea"].setText(_("Opera Web Browser Plugin v1.0"))
+               self.setTitle(_("BrowserMain"))
                self.selectMenuitem()
 
                self.selectMenuitem()
 
+               if self.paramUrl is not None:
+                       self.keyMenu()
+                       self.cbUrlText(self.paramUrl, 1)
+
        def selectMenuitem(self):
                tmp = [self["menuitemFile"], self["menuitemTool"], self["menuitemHelp"]]# modify menu
                self["menuitemFile"].setForegroundColorNum(0)
        def selectMenuitem(self):
                tmp = [self["menuitemFile"], self["menuitemTool"], self["menuitemHelp"]]# modify menu
                self["menuitemFile"].setForegroundColorNum(0)
@@ -1637,7 +1861,7 @@ class OperaBrowser(Screen):
        def setListOnView(self):
                l = self.MENUITEMS_LIST[self.menubarCurrentIndex]
                if not self._terminatedBrowser and self.menubarCurrentIndex == 0: # running
        def setListOnView(self):
                l = self.MENUITEMS_LIST[self.menubarCurrentIndex]
                if not self._terminatedBrowser and self.menubarCurrentIndex == 0: # running
-                       l = [('Return', None)]
+                       l = [(_('Return'), None)]
                self.lvMenuItems = l #self.MENUITEMS_LIST[self.menubarCurrentIndex]     
                return self.lvMenuItems
 
                self.lvMenuItems = l #self.MENUITEMS_LIST[self.menubarCurrentIndex]     
                return self.lvMenuItems
 
@@ -1686,16 +1910,23 @@ class OperaBrowser(Screen):
                        if self._on_setPageTitle in command_server.onSetPageTitleCB:
                                command_server.onSetPageTitleCB.remove(self._on_setPageTitle)
                except Exception, ErrMsg: pass
                        if self._on_setPageTitle in command_server.onSetPageTitleCB:
                                command_server.onSetPageTitleCB.remove(self._on_setPageTitle)
                except Exception, ErrMsg: pass
-               self._on_setPageTitle('Opera Browser')
+               self._on_setPageTitle(_('Opera Browser'))
                self.enableRCMouse(False)
                self.toggleMainScreen()
                self.enableRCMouse(False)
                self.toggleMainScreen()
+               restoreResolution()
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                self._terminatedBrowser = True
                self._enableKeyEvent = True
                #if not self.toggleListViewFlag:
                #       self.keyDown()
                eRCInput.getInstance().unlock()
                self._terminatedBrowser = True
                self._enableKeyEvent = True
                #if not self.toggleListViewFlag:
                #       self.keyDown()
-               self.keyRight()
-               self.keyLeft()
+
+               self._currentPageUrl = ''
+               if self.paramUrl is not None:
+                       self.keyCancel()
+               else:
+                       self.keyRight()
+                       self.keyLeft()
 
        def _on_setPageTitle(self, title=None):
                print "Title :",title
 
        def _on_setPageTitle(self, title=None):
                print "Title :",title
@@ -1703,8 +1934,11 @@ class OperaBrowser(Screen):
                        return
                self.setTitle(title)
 
                        return
                self.setTitle(title)
 
-       def cbUrlText(self, data=None):
-               print "Inputed Url :", data
+       def cbUrlText(self, data=None, mode=0):
+               global _g_helper
+               if not _g_helper._is_browser_running():
+                       return
+               print "Inputed Url :", data, mode
                if strIsEmpty(data):
                        return
                #self.hideSubmenu()
                if strIsEmpty(data):
                        return
                #self.hideSubmenu()
@@ -1715,9 +1949,14 @@ class OperaBrowser(Screen):
                        command_server.onHbbTVCloseCB.append(self._on_close_window)
                self.toggleMainScreen()
                self.enableRCMouse(True)
                        command_server.onHbbTVCloseCB.append(self._on_close_window)
                self.toggleMainScreen()
                self.enableRCMouse(True)
+
+               fbClass.getInstance().lock()
                eRCInput.getInstance().lock()
                eRCInput.getInstance().lock()
+
+               setResolution(1280, 720)
+
                command_util = getCommandUtil()
                command_util = getCommandUtil()
-               command_util.sendCommand('OP_BROWSER_OPEN_URL', data)
+               command_util.sendCommand('OP_BROWSER_OPEN_URL', data, mode)
                self._terminatedBrowser = False
                self._enableKeyEvent = False
 
                self._terminatedBrowser = False
                self._enableKeyEvent = False
 
@@ -1727,24 +1966,33 @@ class OperaBrowser(Screen):
        def _cb_bookmarkWindowClosed(self, data=None):
                if data is None:
                        return
        def _cb_bookmarkWindowClosed(self, data=None):
                if data is None:
                        return
-               self.cbUrlText(data)
+               (url, mode) = data
+               global _g_helper
+               if not _g_helper._is_browser_running():
+                       message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
+                       self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
+                       return
+               self.cbUrlText(url, mode)
 
        def _cmd_on_OpenUrl(self):
                global _g_helper
                if not _g_helper._is_browser_running():
 
        def _cmd_on_OpenUrl(self):
                global _g_helper
                if not _g_helper._is_browser_running():
-                       message = "Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu."
+                       message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
                        self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
                        return
                        self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
                        return
-               self.session.openWithCallback(self.cbUrlText, VirtualKeyBoard, title=("Please enter URL here"), text='http://')
+               self.session.openWithCallback(self.cbUrlText, VirtualKeyBoard, title=(_("Please enter URL here")), text='http://')
        def _cmd_on_About(self):
        def _cmd_on_About(self):
-               self.session.open(MessageBox, 'Opera Web Browser Plugin v1.0', type = MessageBox.TYPE_INFO)
+               self.session.open(MessageBox, _('Opera Web Browser Plugin v1.0'), type = MessageBox.TYPE_INFO)
        def _cmd_on_Exit(self):
                self.close()
        def _cmd_on_Exit(self):
                self.close()
+       def _cb_cmdOnStartSTop(self):
+               self.keyMenu()
        def _cmd_on_StartStop(self):
                global _g_helper
                if _g_helper is None: 
                        return
        def _cmd_on_StartStop(self):
                global _g_helper
                if _g_helper is None: 
                        return
-               _g_helper.showBrowserConfigBox()
+               _g_helper.showBrowserConfigBox(self._cb_cmdOnStartSTop)
+
        def _cmd_on_Bookmark(self):
                url = self._currentPageUrl
                if url is None:
        def _cmd_on_Bookmark(self):
                url = self._currentPageUrl
                if url is None:
@@ -1759,11 +2007,19 @@ class OperaBrowser(Screen):
                        url = ''
                self.session.open(OperaBrowserPreferenceWindow, url)
        def _cmd_on_OpenStartpage(self):
                        url = ''
                self.session.open(OperaBrowserPreferenceWindow, url)
        def _cmd_on_OpenStartpage(self):
+               global _g_helper
+               if not _g_helper._is_browser_running():
+                       message = _("Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu.")
+                       self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
+                       return
+               mode = 0
                start = 'http://vuplus.com'
                try:
                start = 'http://vuplus.com'
                try:
-                       start = OperaBrowserSetting().getData()['start']
+                       d = OperaBrowserSetting().getData()
+                       start = d['start']
+                       mode = d['type']
                except: pass
                except: pass
-               self.cbUrlText(start)
+               self.cbUrlText(start, mode)
        def _cmd_on_ReturnToBrowser(self):
                self.keyCancel()
 
        def _cmd_on_ReturnToBrowser(self):
                self.keyCancel()
 
@@ -1771,22 +2027,25 @@ class OperaBrowser(Screen):
                self.session.open(BrowserHelpWindow)
 
        def doCommand(self, command):
                self.session.open(BrowserHelpWindow)
 
        def doCommand(self, command):
-               cmd_map = {# modify menu
-                        'Exit'         :self._cmd_on_Exit
-                       ,'Help'         :self._cmd_on_Help
-                       ,'About'        :self._cmd_on_About
-                       ,'Open URL'     :self._cmd_on_OpenUrl
-                       ,'Start/Stop'   :self._cmd_on_StartStop
-                       ,'Bookmark'     :self._cmd_on_Bookmark
-                       ,'Preference'   :self._cmd_on_Preference
-                       ,'Return'       :self._cmd_on_ReturnToBrowser
-                       ,'Open Startpage' :self._cmd_on_OpenStartpage
-               }
+               # modify menu
+               cmd_map = {}
+               cmd_map[_('Exit')] = self._cmd_on_Exit
+               cmd_map[_('Help')] = self._cmd_on_Help
+               cmd_map[_('About')] = self._cmd_on_About
+               cmd_map[_('Open URL')] = self._cmd_on_OpenUrl
+               cmd_map[_('Start/Stop')] = self._cmd_on_StartStop
+               cmd_map[_('Bookmark')] = self._cmd_on_Bookmark
+               cmd_map[_('Preference')] = self._cmd_on_Preference
+               cmd_map[_('Return')] = self._cmd_on_ReturnToBrowser
+               cmd_map[_('Open Startpage')] = self._cmd_on_OpenStartpage
                try:
                        cmd_map[command]()
                except Exception, ErrMsg: print ErrMsg
 
        def keyOK(self):
                try:
                        cmd_map[command]()
                except Exception, ErrMsg: print ErrMsg
 
        def keyOK(self):
+               if not self.toggleMainScreenFlag:
+                       self.keyMenu()
+                       return
                if not self.toggleListViewFlag:
                        self.keyDown()
                        return
                if not self.toggleListViewFlag:
                        self.keyDown()
                        return
@@ -1868,7 +2127,9 @@ class OperaBrowser(Screen):
        def keyCancel(self):
                if not self._terminatedBrowser:
                        #self._session.openWithCallback(self._cb_virtualKeyboardClosed, VirtualKeyBoard, title=("Please enter URL here"), text="")
        def keyCancel(self):
                if not self._terminatedBrowser:
                        #self._session.openWithCallback(self._cb_virtualKeyboardClosed, VirtualKeyBoard, title=("Please enter URL here"), text="")
+                       fbClass.getInstance().lock()
                        eRCInput.getInstance().lock()
                        eRCInput.getInstance().lock()
+                       setResolution(1280, 720)
                        if self.toggleListViewFlag:
                                self.toggleMainScreen()
                        self._currentPageUrl   = None
                        if self.toggleListViewFlag:
                                self.toggleMainScreen()
                        self._currentPageUrl   = None
@@ -1897,19 +2158,57 @@ class OperaBrowser(Screen):
                self.currentListView.pageUp()
                self.keyUp()
 
                self.currentListView.pageUp()
                self.keyUp()
 
-
-
 def auto_start_main(reason, **kwargs):
        if reason:
                command_server = getCommandServer()
                command_server.stop()
 
 def auto_start_main(reason, **kwargs):
        if reason:
                command_server = getCommandServer()
                command_server.stop()
 
+from  Screens.HelpMenu import HelpableScreen
 def session_start_main(session, reason, **kwargs):
 def session_start_main(session, reason, **kwargs):
+       fbClass.getInstance().unlock()
        eRCInput.getInstance().unlock()
        eRCInput.getInstance().unlock()
+
+       from enigma import getDesktop
+       desktopSize = getDesktop(0).size()
+       setDefaultResolution(desktopSize.width(), desktopSize.height())
+
        global _g_helper
        _g_helper = session.open(HbbTVHelper)
 
        global _g_helper
        _g_helper = session.open(HbbTVHelper)
 
+       HelpableScreen.__init__ = HelpableScreen__init__
+       HelpableScreen.session = session
+
+def HelpableScreen__init__(self):
+       if isinstance(self, HelpableScreen):
+               HelpableScreen.showManual = showManual
+
+               self["helpActions"] = ActionMap(["HelpbuttonActions"], {
+                       "help_b" : self.showHelp,
+                       "help_l" : self.showManual, 
+               }, -2)
+
 _g_clearBrowserDataTimer = eTimer()
 _g_clearBrowserDataTimer = eTimer()
+def showManual(self):
+       if not os.path.exists('/usr/local/manual'):
+               return
+
+       url = 'file:///usr/local/manual/main.html'
+       lang = language.getLanguage()
+       if lang == 'ru_RU' and os.path.exists('/usr/local/manual/ru_RU'):
+               url = 'file:///usr/local/manual/ru_RU/main.html'
+       elif lang == 'de_DE' and os.path.exists('/usr/local/manual/de_DE'):
+               url = 'file:///usr/local/manual/de_DE/main.html'
+
+       def _do_clean():
+               _g_clearBrowserDataTimer.stop()
+               try:    _g_clearBrowserDataTimer.callback.remove(_do_clean)
+               except: pass
+               setPluginBrowser(None)
+       def clearBrowserData():
+               _g_clearBrowserDataTimer.callback.append(_do_clean)
+               _g_clearBrowserDataTimer.start(50)
+       setPluginBrowser(self.session.openWithCallback(clearBrowserData, OperaBrowser, url))
+
 def plugin_start_main(session, **kwargs):
        #session.open(OperaBrowser)
        def _do_clean():
 def plugin_start_main(session, **kwargs):
        #session.open(OperaBrowser)
        def _do_clean():
@@ -1935,11 +2234,12 @@ def plugin_extension_browser_config(session, **kwargs):
        _g_helper.showBrowserConfigBox()
 
 def Plugins(path, **kwargs):
        _g_helper.showBrowserConfigBox()
 
 def Plugins(path, **kwargs):
-       return  [
-               PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=auto_start_main),
-               PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART, needsRestart=True, fnc=session_start_main, weight=-10),
-               PluginDescriptor(name="HbbTV Applications", where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=plugin_extension_start_application),
-               PluginDescriptor(name="Browser Start/Stop", where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=plugin_extension_browser_config),
-               PluginDescriptor(name="Opera Web Browser", description="start opera web browser", where=PluginDescriptor.WHERE_PLUGINMENU, needsRestart=True, fnc=plugin_start_main),
-               ]
+       l = []
+       l.append(PluginDescriptor(where=PluginDescriptor.WHERE_AUTOSTART, fnc=auto_start_main))
+       l.append(PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART, needsRestart=True, fnc=session_start_main, weight=-10))
+       l.append(PluginDescriptor(name=_("HbbTV Applications"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=plugin_extension_start_application))
+       l.append(PluginDescriptor(name=_("Browser Start/Stop"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart=True, fnc=plugin_extension_browser_config))
+       l.append(PluginDescriptor(name=_("Opera Web Browser"), description=_("start opera web browser"), where=PluginDescriptor.WHERE_PLUGINMENU, needsRestart=True, fnc=plugin_start_main))
+
+       return l