private static Type GetControlType(XmlNode controlNode)
    {
      //XmlNode typeText = controlNode.SelectSingleNodeFast("type/text()");
      XmlNode typeText = controlNode.SelectByNameFromChildren("type");
      // this does the same without requiring full XPATH and doc parsing
      if (typeText == null || typeText.InnerText == "")
      {
        return null;
      }
      string xmlTypeName = typeText.InnerText;
      switch (xmlTypeName)
      {
        case ("image"):
          return typeof (GUIImage);
        case ("imagelist"):
          return typeof (GUIImageList);
        case ("slider"):
          return typeof (GUISliderControl);
        case ("fadelabel"):
          return typeof (GUIFadeLabel);
        case ("label"):
          return typeof (GUILabelControl);
        case ("button"):
          return typeof (GUIButtonControl);
        case ("updownbutton"):
          return typeof (GUIUpDownButton);
        case ("button3part"):
          return typeof (GUIButton3PartControl);
        case ("statusbar"):
          return typeof (GUIStatusbarControl);
        case ("progress"):
          return typeof (GUIProgressControl);
        case ("tvprogress"):
          return typeof (GUITVProgressControl);
        case ("hscrollbar"):
          return typeof (GUIHorizontalScrollbar);
        case ("vscrollbar"):
          return typeof (GUIVerticalScrollbar);
        case ("textbox"):
          return typeof (GUITextControl);
        case ("textboxscrollup"):
          return typeof (GUITextScrollUpControl);
        case ("thumbnailpanel"):
          return typeof (GUIThumbnailPanel);
        case ("spincontrol"):
          return typeof (GUISpinControl);
        case ("spinbutton"):
          return typeof (GUISpinButton);
        case ("menubutton"):
          return typeof(GUIMenuButton);
        case ("checkmark"):
          return typeof (GUICheckMarkControl);
        case ("checkbutton"):
          return typeof (GUICheckButton);
        case ("selectbutton"):
          return typeof (GUISelectButtonControl);
        case ("listcontrol"):
          return typeof (GUIListControl);
        case ("updownlistcontrol"):
          return typeof (GUIUpDownListControl);
        case ("checklistcontrol"):
          return typeof (GUICheckListControl);
        case ("group"):
          return typeof (GUIGroup);
        case ("videowindow"):
          return typeof (GUIVideoControl);
        case ("facadeview"):
          return typeof (GUIFacadeControl);
        case ("filmstrip"):
          return typeof (GUIFilmstripControl);
        case ("sortbutton"):
          return typeof (GUISortButtonControl);
        case ("volumebar"):
          return typeof (GUIVolumeBar);
        case ("multiimage"):
          return typeof (GUIMultiImage);
        case ("animation"):
          return typeof (GUIAnimation);
        case ("playlistbutton"):
          return typeof (GUIPlayListButtonControl);
        case ("playlistcontrol"):
          return typeof (GUIPlayListItemListControl);
        case ("gridcontrol"):
          return typeof (GUIGridControl);
        case ("actiongroup"):
          return typeof (GUIActionGroup);
        case ("menu"):
          return typeof (GUIMenuControl);
        case ("standardKeyboard"):
          return typeof (GUIStandardKeyboard);
        case ("coverflow"):
          return typeof (GUICoverFlow);
        default:
          Type t = (Type)m_hashCustomControls[xmlTypeName];

          if (t == null)
          {
            Log.Info("ERROR: unknown control:<{0}>", xmlTypeName);
            return null;
          }

          return t;
      }
    }