public void ChangeChannel(string ID)
    {
      if (_started)
        StopPlaying();

      System.Threading.Thread.Sleep(100);

      ErrorLog("Zap to " + ID);
      // zapto ID
      func = new DboxFunctions(server, username, password, boxtype);
      func.Zapto(ID);

      cGlobal.currentID = ID;

      System.Threading.Thread.Sleep(1000);
      ErrorLog("Zap and waited " + ID);

      // get group/channel
      ActBouquetNo = 1;
      for (int i = 0; i < _TV_Bouquets.Rows.Count; i++)
      {
        if (_TV_Bouquets.Rows[i]["ID"].ToString() == cGlobal.currentID)
        {
          ActBouquetNo = Convert.ToInt16(_TV_Bouquets.Rows[i]["BouqNo"].ToString());

          ActBouquet = _TV_Bouquets.Rows[i]["BouqName"].ToString();
          ActChannel = _TV_Bouquets.Rows[i]["Name"].ToString();

          ErrorLog("Actual group " + ActBouquet + " actual channel " + ActChannel);
        }
      }

    }
    public override bool Init()
    {
      bool result = Load(GUIGraphicsContext.Skin + @"\mydboxmain.xml");
      Mydbox.GUILocalizeStrings.Load(GUI.Library.GUILocalizeStrings.CurrentLanguage());

      LoadSettings();

      Data dboxdata = new Data(server, username, password, boxtype);
      dboxdata.loadEPGdata(); //load epg data from file

      if (File.Exists(LogPathName)) File.Delete(LogPathName);
      ErrorLog("Init plugin");

      SelChan = new ArrayList();

      // get bouquets
      ParseXML();
      ErrorLog("XML parsed " + _TV_Bouquets.Rows.Count);

      recDirectory.AddExtension(".dat");
      recDirectory.ShowFilesWithoutExtension = false;

      Share share2 = new Share();
      share2.Name = "Recordings";
      share2.Path = RecDir;
      recDirectory.IsRootShare(RecDir);

      if (ah == null) ah = new OnActionHandler(OnAction2);

      #region get some data from box
      try
      {
        // get actual ID
        func = new DboxFunctions(server, username, password, boxtype);
        func.wakeup();
        cGlobal.currentID = func.getID();
        if (cGlobal.currentID != "")
        {
          ErrorLog("Actual ID " + cGlobal.currentID);
          func.setSPTS();
          ErrorLog("SetSPTS has been set");
          ErrorLog("Version=> " + func.getInfo());
          func.showMessage("Mediaportal%20connected");
          // looks box is working
          BoxConn = true;
        }
        else
        {
          ErrorLog("Receiver is not reachable ?");
        }
      }

      catch
      {
        ErrorLog("Receiver is not reachable ?");
      }

      // get group/channel
      ActBouquetNo = 1;
      for (int i = 0; i < _TV_Bouquets.Rows.Count; i++)
      {
        if (_TV_Bouquets.Rows[i]["ID"].ToString() == cGlobal.currentID)
        {
          ActBouquetNo = Convert.ToInt16(_TV_Bouquets.Rows[i]["BouqNo"].ToString());

          ActBouquet = _TV_Bouquets.Rows[i]["BouqName"].ToString();
          ActChannel = _TV_Bouquets.Rows[i]["Name"].ToString();

          ErrorLog("Actual group " + ActBouquet + " actual channel " + ActChannel);
        }
      }

      #endregion

      return result;
    }
    public void OnAction2(Action action)
    {
      Debug.WriteLine("Action2:" + action.wID.ToString());

      if (GUIWindowManager.ActiveWindowEx == (int)GUIWindow.Window.WINDOW_DIALOG_MENU) return;
      //bool actionTaken = true;

      //Debug.WriteLine(action.wID.ToString());

      object key;
      switch (action.wID)
      {
        case Action.ActionType.ACTION_EXIT:
          { // prepare for exit
            OnPageDestroy(0);
            break;
          }
        case Action.ActionType.ACTION_PREVIOUS_MENU:
          {
            if (_isFullScreen)
            {
              if (t_Chan > 0) t_Chan = 0; // channel osd is up, kill it
              else if (t_OSD > 0) t_OSD = 0; // epg is up, kill it
              else if (t_Info > 0)
              {
                t_Info = 0;
                t_OSD = 2; // info is up, go back to epg
              }
              else                            // no osd is up, exit fullscreen
              {
                _isFullScreen = false;
                _wasFullscreen = true;
                SetWindows();
              }
            }
            break;
          }
        case Action.ActionType.ACTION_MOVE_LEFT:
          if ((_isFullScreen == true) && (cGlobal.VLC_Live == true))
          {
            if (t_Chan > 0)
            { // only if already visible
              ActBouquetNo--;
            }

            if (ActBouquetNo == 0)
              ActBouquetNo = MaxBouq;

            t_Chan = 10;
            t_OSD = 0;
            chan.DisplayBouq(ActBouquetNo.ToString(), "0");
          }
          break;
        case Action.ActionType.ACTION_MOVE_RIGHT:
          if ((_isFullScreen == true) && (cGlobal.VLC_Live == true))
          {
            if (t_Chan > 0)
            { // only if already visible
              ActBouquetNo++;
            }
            if (ActBouquetNo > MaxBouq)
              ActBouquetNo = 1;

            t_Chan = 10;
            t_OSD = 0;
            chan.DisplayBouq(ActBouquetNo.ToString(), "-1");
          }
          break;
        case Action.ActionType.ACTION_MOVE_DOWN:
        case Action.ActionType.ACTION_MOVE_UP:
          if ((_isFullScreen == true) && (cGlobal.VLC_Live == true))
          {
            t_Chan = 10;
            t_OSD = 0;
          }
          break;
        case Action.ActionType.ACTION_VOLUME_MUTE:
          DboxFunctions func = new DboxFunctions(server, username, password, boxtype);
          func.toggleMute();
          break;
        case Action.ActionType.ACTION_FORWARD:
        case Action.ActionType.ACTION_MUSIC_FORWARD:
          key = vlcControl.Player.getVariable("key-faster");
          vlcControl.Player.setVariable("key-pressed", key);
          break;
        case Action.ActionType.ACTION_MUSIC_REWIND:
        case Action.ActionType.ACTION_REWIND:
          key = vlcControl.Player.getVariable("key-slower");
          vlcControl.Player.setVariable("key-pressed", key);
          break;
        case Action.ActionType.ACTION_PREV_CHANNEL:
          OnPreviousChannel();
          PlayCurrentChannel();
          break;
        case Action.ActionType.ACTION_PAGE_DOWN:
          OnPreviousChannel();
          PlayCurrentChannel();
          break;
        case Action.ActionType.ACTION_NEXT_CHANNEL:
          OnNextChannel();
          PlayCurrentChannel();
          break;
        case Action.ActionType.ACTION_PAGE_UP:
          OnNextChannel();
          PlayCurrentChannel();
          break;
        case Action.ActionType.ACTION_PLAY:
        case Action.ActionType.ACTION_MUSIC_PLAY:
          PlayCurrentChannel();
          break;
        case Action.ActionType.ACTION_STOP:
          StopPlaying();
          btnTVOnOff.Selected = false;
          break;
        case Action.ActionType.ACTION_PAUSE:
          if (_started)
          {
            if (!vlcControl.Player.Playing)
            {
              _paused = false;
              vlcControl.Player.play();
            }
            else
            {
              _paused = true;
              vlcControl.Player.pause();
            }
          }
          break;
        case (Action.ActionType.ACTION_RECORD):
          if (btnRecord.Selected)
          {
            btnRecord.Selected = false;
            imgRecord.Visible = false;
          }
          else
          {
            btnRecord.Selected = true;
            imgRecord.Visible = true;
            OnRecord();
          }
          break;
        case (Action.ActionType.ACTION_SHOW_FULLSCREEN):
          SetWindows();
          break;
        case (Action.ActionType.ACTION_SHOW_GUI):
          if (_isFullScreen == false)
          {
            //vlcControl.Player.fullscreen(); 
            _isFullScreen = true;
            SetWindows();
          }
          else
          {
            if (chan.Visible == false)
            {
              //vlcControl.Player.fullscreen(); 
              _isFullScreen = false;
              SetWindows();
            }
            else
            {

            }
          }
          break;
        case Action.ActionType.ACTION_SELECT_ITEM:
          string t = chan.GetChannel(ActBouquet);
          if ((t != "") && (_isFullScreen == true))
          {
            if (t_Chan > 0)
            {
              t_Chan = 0;
              ChangeChannel(t);
              PlayCurrentChannel();
            }
          }
          break;
        case (Action.ActionType.ACTION_CONTEXT_MENU):
          if (t_OSD > 0)
          {
            if (cGlobal.VLC_Live == true)
            {
              t_OSD = 0;
              t_Info = 10;
            }
            else
              t_OSD = 0;
          }
          else
          {
            t_OSD = 10;
            t_Info = 0;
            t_Chan = 0;
          }
          break;
        case Action.ActionType.ACTION_KEY_PRESSED:
          if (cGlobal.VLC_Live == true)
          {
            switch (action.m_key.KeyChar)
            {
              case '1':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "1";
                SelStr = callSelect(SelStr);
                break;
              case '2':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "2";
                SelStr = callSelect(SelStr);
                break;
              case '3':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "3";
                SelStr = callSelect(SelStr);
                break;
              case '4':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "4";
                SelStr = callSelect(SelStr);
                break;
              case '5':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "5";
                SelStr = callSelect(SelStr);
                break;
              case '6':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "6";
                SelStr = callSelect(SelStr);
                break;
              case '7':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "7";
                SelStr = callSelect(SelStr);
                break;
              case '8':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "8";
                SelStr = callSelect(SelStr);
                break;
              case '9':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "9";
                SelStr = callSelect(SelStr);
                break;
              case '0':
                t_Sel = 2;
                t_Info = 0;
                SelStr = SelStr + "0";
                SelStr = callSelect(SelStr);
                break;
              case '#':
                if ((SelStr != "....") & (SelStr != "") & (SelStr.Length > 0) & (t_Sel > 0))
                {
                  int x = Convert.ToInt16(SelStr) - 1;
                  try
                  {
                    t_Sel = 0;
                    ChangeChannel(_TV_Bouquets.Rows[x]["ID"].ToString());
                    PlayCurrentChannel();
                  }
                  catch
                  {
                  }
                }
                break;
            }
          }
          break;
        case (Action.ActionType.ACTION_ASPECT_RATIO):
          if ((SelStr != "....") & (SelStr != "") & (SelStr.Length > 0) & (t_Sel > 0))
          {
            int x = Convert.ToInt16(SelStr) - 1;
            try
            {
              t_Sel = 0;
              ChangeChannel(_TV_Bouquets.Rows[x]["ID"].ToString());
              PlayCurrentChannel();
            }
            catch
            {
            }
          }
          break;

        default:
          //actionTaken = false;
          break;
      }
    }
    public void PlayCurrentChannel()
    {
      if (!btnTVOnOff.Selected)
        return;
      string url;
      // get LiveURL
      func = new DboxFunctions(server, username, password, boxtype);

      if (cGlobal.currentID.Contains("rootX"))
      { // workaround for e1 internal hdd movieplaying
        url = cGlobal.currentID;
        cGlobal.VLC_Live = false; // kill the live flag, don't want epg and such
      }
      else
      { // normally this is the code we use
        url = func.getLiveUrl();
        cGlobal.VLC_Live = true;
      }
      ErrorLog("Get live url = " + url);



      if (url == null)
      {
        ErrorLog("ERROR: NOTHING TO PLAY !");
        GUIDialogOK dlg = (GUIDialogOK)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_OK);
        dlg.SetHeading("Error nothing to play");
        dlg.SetLine(1, "Channel is not playable !");
        dlg.SetLine(2, String.Empty);
        dlg.SetLine(3, String.Empty);
        dlg.DoModal(GUIWindowManager.ActiveWindow);
      }

      if (url != null)
      {

        //GUIGraphicsContext.IsFullScreenVideo = false;

        cGlobal.VLC_File = url;
        cGlobal.VLC_StartPlay = true;
        ErrorLog("SetStartPlay " + url);
      }
    }