diff -crB mythfrontend//playbackbox.cpp /daten/mythfrontend//playbackbox.cpp
*** mythfrontend//playbackbox.cpp	2011-02-18 04:30:17.000000000 +0100
--- /daten/mythfrontend//playbackbox.cpp	2011-06-17 00:55:40.324032891 +0200
***************
*** 35,40 ****
--- 35,48 ----
  #include "util.h"
  #include "tv.h"
  
+ // MythUI
+ #include "mythuitext.h"
+ #include "mythuibuttonlist.h"
+ #include "mythuibutton.h"
+ #include "mythuihelper.h"
+ #include "mythscreenstack.h"
+ #include "mythmainwindow.h"
+ 
  //  Mythfrontend
  #include "playbackboxlistitem.h"
  #include "customedit.h"
***************
*** 356,362 ****
        m_needUpdate(false),
        // Other
        m_player(NULL),
!       m_helper(this)
  {
      for (uint i = 0; i < sizeof(m_artImage) / sizeof(MythUIImage*); i++)
      {
--- 364,373 ----
        m_needUpdate(false),
        // Other
        m_player(NULL),
!       m_helper(this),
! 
!      // A-Z Selector
!      m_alphabetList(NULL)
  {
      for (uint i = 0; i < sizeof(m_artImage) / sizeof(MythUIImage*); i++)
      {
***************
*** 455,460 ****
--- 466,488 ----
      }
  }
  
+ void PlaybackBox::initAlphabetList(void)
+ {
+     // A-Z
+     for (int charNum = 65; charNum < 91; ++charNum)
+         {
+ 		new MythUIButtonListItem(m_alphabetList, QString((char)charNum));
+ 	}
+     // 0-9 
+     for (int charNum = 48; charNum < 58; ++charNum)
+         {
+ 		new MythUIButtonListItem(m_alphabetList, QString((char)charNum));
+ 	}
+     // @ 
+     new MythUIButtonListItem(m_alphabetList, QString('@'));
+ }
+ 
+ 
  bool PlaybackBox::Create()
  {
      if (m_type == kDeleteBox &&
***************
*** 464,469 ****
--- 492,500 ----
          if (!LoadWindowFromXML("recordings-ui.xml", "watchrecordings", this))
              return false;
  
+     // Add A-Z Selector
+ //    UIUtilE::Assign(this, m_alphabetList, "alphabet");
+     m_alphabetList  = dynamic_cast<MythUIButtonList *> (GetChild("alphabet"));
      m_recgroupList  = dynamic_cast<MythUIButtonList *> (GetChild("recgroups"));
      m_groupList     = dynamic_cast<MythUIButtonList *> (GetChild("groups"));
      m_recordingList = dynamic_cast<MythUIButtonList *> (GetChild("recordings"));
***************
*** 495,500 ****
--- 526,536 ----
              SLOT(PlayFromBookmark(MythUIButtonListItem*)));
      connect(m_recordingList, SIGNAL(itemVisible(MythUIButtonListItem*)),
              SLOT(ItemVisible(MythUIButtonListItem*)));
+     
+     connect(m_alphabetList, SIGNAL(itemSelected(MythUIButtonListItem*)),
+ 	            SLOT(UpdateUIGroupList(MythUIButtonListItem*)));
+     connect(m_alphabetList, SIGNAL(itemClicked(MythUIButtonListItem*)),
+                 SLOT(SwitchList()));
  
      // connect up timers...
      connect(m_artTimer[kArtworkFan],   SIGNAL(timeout()), SLOT(fanartLoad()));
***************
*** 537,542 ****
--- 573,582 ----
  
      if (!gCoreContext->GetNumSetting("PlaybackBoxStartInTitle", 0))
          SetFocusWidget(m_recordingList);
+ 
+ // Init Alphabet
+ initAlphabetList();
+ 
  }
  
  void PlaybackBox::SwitchList()
***************
*** 545,550 ****
--- 585,592 ----
          SetFocusWidget(m_recordingList);
      else if (GetFocusWidget() == m_recordingList)
          SetFocusWidget(m_groupList);
+     else if (GetFocusWidget() == m_alphabetList)
+     	SetFocusWidget(m_groupList);
  }
  
  void PlaybackBox::displayRecGroup(const QString &newRecGroup)
***************
*** 581,590 ****
  }
  
  void PlaybackBox::updateGroupInfo(const QString &groupname,
!                                   const QString &grouplabel)
  {
      InfoMap infoMap;
      int countInGroup;
  
      if (groupname.isEmpty())
      {
--- 623,635 ----
  }
  
  void PlaybackBox::updateGroupInfo(const QString &groupname,
!                                   const QString &grouplabel,
! 				  MythUIButtonListItem *sel_item)
! 
  {
      InfoMap infoMap;
      int countInGroup;
+     QString desc;
  
      if (groupname.isEmpty())
      {
***************
*** 595,605 ****
      }
      else
      {
!         countInGroup = m_progLists[groupname].size();
!         infoMap["title"] = QString("%1 - %2").arg(m_groupDisplayName)
!                                              .arg(grouplabel);
!         infoMap["group"] = m_groupDisplayName;
!         infoMap["show"]  = grouplabel;
      }
  
      if (m_artImage[kArtworkFan])
--- 640,675 ----
      }
      else
      {
! 	if (GetFocusWidget() == m_alphabetList)
! 	{
!       		countInGroup = m_groupList->GetCount();
! 		infoMap["title"] = "Display Group(s) with specific inital letter";
! 		infoMap["group"] = "group";
! 		infoMap["show"]  = "show";
! 
! 		QChar alphabetName = sel_item->GetText().at(0);
! 		QString complete = "There is/are ";
! 		QString temp2 = " display group(s) starting with ";
! 		QString temp1;
! 		temp1.setNum(countInGroup);
! 		complete.append(temp1);
! 		complete.append(temp2);
! 		complete.append(alphabetName);
! 
! 		desc = complete;
! 
! 	}
! 	else
! 	{
!         	countInGroup = m_progLists[groupname].size();
!         	infoMap["title"] = QString("%1").arg(grouplabel);
! 	        infoMap["group"] = m_groupDisplayName;
! 	        infoMap["show"]  = grouplabel;
! 
! 		desc = tr("There is/are %n recording(s) in this display group", "", countInGroup);
! 
! 
! 	}
      }
  
      if (m_artImage[kArtworkFan])
***************
*** 631,639 ****
          }
      }
  
-     QString desc = tr("There is/are %n recording(s) in this display group",
-                       "", countInGroup);
- 
      if (m_type == kDeleteBox && countInGroup > 1)
      {
          ProgramList  group     = m_progLists[groupname];
--- 701,706 ----
***************
*** 1194,1202 ****
  
              item->SetText(groupname, "name");
              item->SetText(groupname);
  
!             int count = m_progLists[groupname.toLower()].size();
!             item->SetText(QString::number(count), "reccount");
          }
  
          m_needUpdate = true;
--- 1261,1272 ----
  
              item->SetText(groupname, "name");
              item->SetText(groupname);
+ 	    
+        	int count = m_progLists[groupname.toLower()].size();
+        	item->SetText(QString::number(count), "reccount");
  
! 	    
! 	    
          }
  
          m_needUpdate = true;
***************
*** 1208,1223 ****
              updateRecList(m_groupList->GetItemCurrent());
      }
  }
  
  void PlaybackBox::updateRecList(MythUIButtonListItem *sel_item)
  {
!     if (!sel_item)
          return;
  
      QString groupname = sel_item->GetData().toString();
      QString grouplabel = sel_item->GetText();
  
!     updateGroupInfo(groupname, grouplabel);
  
      if ((m_currentGroup == groupname) && !m_needUpdate)
          return;
--- 1278,1353 ----
              updateRecList(m_groupList->GetItemCurrent());
      }
  }
+ void PlaybackBox::UpdateUIGroupList(MythUIButtonListItem *sel_item)
+ {
+     m_groupList->Reset();
+ 
+     if (!m_titleList.isEmpty())
+     {
+         int best_pref = INT_MAX, sel_idx = 0;
+         QStringList::iterator it;
+         for (it = m_titleList.begin(); it != m_titleList.end(); ++it)
+         {
+             QString groupname = (*it).simplified();
+ 
+ 	    // check if groupname begins with selected button (char)
+ 	    if (sel_item)
+ 	    {
+ 	    	QString alphabetName = sel_item->GetText();
+ 	
+ 	    if (groupname.startsWith(alphabetName, Qt::CaseInsensitive))
+ 	    {
+ 
+             MythUIButtonListItem *item =
+                 new MythUIButtonListItem(
+                     m_groupList, "", qVariantFromValue(groupname.toLower()));
+ 
+ //            int pref = groupPreferences.indexOf(groupname.toLower());
+ //            if ((pref >= 0) && (pref < best_pref))
+ //            {
+ //                best_pref = pref;
+ //                sel_idx = m_groupList->GetItemPos(item);
+ //                m_currentGroup = groupname.toLower();
+ //            }
+ 
+             if (groupname.isEmpty())
+                 groupname = m_groupDisplayName;
+ 
+             item->SetText(groupname, "name");
+             item->SetText(groupname);
+ 
+             	int count = m_progLists[groupname.toLower()].size();
+             	item->SetText(QString::number(count), "reccount");
+ 	    }
+ 	    }
+         }
+ 
+         m_needUpdate = true;
+         m_groupList->SetItemCurrent(sel_idx);
+         // We need to explicitly call updateRecList in this case,
+         // since 0 is selected by default, and we need updateRecList
+         // to be called with m_needUpdate set.
+     //    if (!sel_idx)
+             updateRecList(m_groupList->GetItemCurrent());
+     }
+ }
  
  void PlaybackBox::updateRecList(MythUIButtonListItem *sel_item)
  {
! 	if (!sel_item)
! 	{
! 	InfoMap infoMap;
! 	 infoMap["description"] = "";
! 	 SetTextFromMap(infoMap);
! 	 m_recordingList->Reset();
          return;
+ 	}
  
      QString groupname = sel_item->GetData().toString();
      QString grouplabel = sel_item->GetText();
  
!     updateGroupInfo(groupname, grouplabel, sel_item);
! 	
  
      if ((m_currentGroup == groupname) && !m_needUpdate)
          return;
diff -crB mythfrontend//playbackbox.h /daten/mythfrontend//playbackbox.h
*** mythfrontend//playbackbox.h	2011-02-18 04:30:17.000000000 +0100
--- /daten/mythfrontend//playbackbox.h	2011-06-17 00:55:38.835120969 +0200
***************
*** 147,152 ****
--- 147,155 ----
      void deleteSelected(MythUIButtonListItem *item);
  
      void SwitchList(void);
+     void UpdateUIGroupList(MythUIButtonListItem *item);
+     void UpdateUIGroupList(const QStringList &groupPreferences);
+ 
  
      void ShowGroupPopup(void);
      void customEdit();
***************
*** 258,266 ****
      void bannerLoad(void);
      void coverartLoad(void);
  
    private:
      bool UpdateUILists(void);
!     void UpdateUIGroupList(const QStringList &groupPreferences);
      void UpdateUIRecGroupList(void);
  
      void UpdateProgressBar(void);
--- 261,271 ----
      void bannerLoad(void);
      void coverartLoad(void);
  
+     virtual void initAlphabetList(void);
+ 
    private:
      bool UpdateUILists(void);
! 
      void UpdateUIRecGroupList(void);
  
      void UpdateProgressBar(void);
***************
*** 303,309 ****
  
      void updateIcons(const ProgramInfo *pginfo = NULL);
      void UpdateUsageUI(void);
!     void updateGroupInfo(const QString &groupname, const QString &grouplabel);
  
      void SetItemIcons(MythUIButtonListItem *item, ProgramInfo* pginfo);
      void UpdateUIListItem(
--- 308,314 ----
  
      void updateIcons(const ProgramInfo *pginfo = NULL);
      void UpdateUsageUI(void);
!     void updateGroupInfo(const QString &groupname, const QString &grouplabel, MythUIButtonListItem *sel_item);
  
      void SetItemIcons(MythUIButtonListItem *item, ProgramInfo* pginfo);
      void UpdateUIListItem(
***************
*** 332,337 ****
--- 337,343 ----
      QRegExp m_prefixes;   ///< prefixes to be ignored when sorting
      QRegExp m_titleChaff; ///< stuff to remove for search rules
  
+     MythUIButtonList *m_alphabetList;
      MythUIButtonList *m_recgroupList;
      MythUIButtonList *m_groupList;
      MythUIButtonList *m_recordingList;
