diff of cdae79034ce2af1ee72edd0443a8d59578f57159

cdae79034ce2af1ee72edd0443a8d59578f57159
diff --git a/elm-frontti/src/FeedView.elm b/elm-frontti/src/FeedView.elm
index ca46bce..469adb0 100644
--- a/elm-frontti/src/FeedView.elm
+++ b/elm-frontti/src/FeedView.elm
@@ -2,6 +2,7 @@ module FeedView exposing (..)
 
 import DateFormat as Df
 import Feeds exposing (NewFeed)
+import Dict 
 import Time
 import Message exposing (..)
 import Html exposing (..)
@@ -10,6 +11,7 @@ import Html.Events exposing (onInput, onClick)
 import Button exposing (murja_button)
 import UUID
 import Article_view exposing (formatDateTime)
+import Tab exposing (tabs)
 
 import Random
 
@@ -46,17 +48,17 @@ perFeedView settings zone fs new_feed_state =
                     , value new_feed_state.url
                     , type_ "text"] []
             , murja_button [ onClick (AddFeed new_feed_state)] [ text "Add a feed"]]]
+
+readerState_str state =
+    case state of
+        PerFeed -> "PerFeed"
+        SingleFeed -> "SingleFeed"
+                             
 feeds feedReaderState settings zone fs new_feed  =
     let new_feed_state = Maybe.withDefault (NewFeed "" "") new_feed
     in
-        div []
-            [ span [] [ input [ id "feed_state_per_feed"
-                              , type_ "checkbox"
-                              , onClick SetPerFeedView
-                              , checked <| feedReaderState == PerFeed] []
-                      , label [ for "feed_state_per_feed"] [ text "Show rss per feed?"] ]
-            
-                    
-            , case feedReaderState of
-                  PerFeed -> perFeedView settings zone fs new_feed_state
-                  SingleFeed -> div [] [ text "NotImplemented" ]]
+        tabs "rss-feed-tab" (readerState_str feedReaderState)
+            (Dict.fromList [ ("PerFeed", "Group by feed")
+                           , ("SingleFeed", "Show all in a feed")])
+            (Dict.fromList [ ("PerFeed", perFeedView settings zone fs new_feed_state)
+                           , ("SingleFeed", div [] [ text "NotImplemented" ])])
diff --git a/elm-frontti/src/Main.elm b/elm-frontti/src/Main.elm
index 1aa945d..dfb1530 100644
--- a/elm-frontti/src/Main.elm
+++ b/elm-frontti/src/Main.elm
@@ -609,6 +609,19 @@ update msg model =
                                          PerFeed -> SingleFeed
                                          SingleFeed -> PerFeed}
             , Cmd.none)
+        SelectTab tab_id selected_tab ->
+            case tab_id of 
+                "rss-feed-tab" ->
+                    case (str_to_readerState selected_tab) of
+                        Just readerstate -> 
+                            ({ model
+                                 | feedReaderState = readerstate}
+                            , Cmd.none)
+                        Nothing ->
+                            ( model
+                            , alert <| "Unknown selected tab " ++ selected_tab)
+                _ -> ( model
+                     , alert <| "Unknown tab " ++ tab_id)
 
                     
 doGoHome_ model other_cmds =
diff --git a/elm-frontti/src/Message.elm b/elm-frontti/src/Message.elm
index 689f07c..ec3cc0c 100644
--- a/elm-frontti/src/Message.elm
+++ b/elm-frontti/src/Message.elm
@@ -66,7 +66,13 @@ type alias PostEditorSettings =
 type FeedReaderState
     = PerFeed
     | SingleFeed
-    
+      
+str_to_readerState str =
+    case str of
+        "PerFeed" -> Just PerFeed
+        "SingleFeed" -> Just SingleFeed
+        _ -> Nothing
+             
 type alias Model =
     { view_state : ViewState
     , settings : Maybe Settings.Settings
@@ -156,6 +162,7 @@ type Msg
   | AddFeed Feeds.NewFeed
   | FeedAdded (Result Http.Error ())
   | SetPerFeedView
+  | SelectTab String String
 
 -- ports
 port reallySetupAce : String -> Cmd msg
diff --git a/elm-frontti/src/Tab.elm b/elm-frontti/src/Tab.elm
new file mode 100644
index 0000000..695a9e5
--- /dev/null
+++ b/elm-frontti/src/Tab.elm
@@ -0,0 +1,21 @@
+module Tab exposing (..)
+
+import Dict exposing (Dict)
+import Html exposing (..)
+import Html.Attributes exposing (..)
+import Html.Events exposing (..)
+import Message exposing (..)
+
+-- tabs: String -> comparable -> Dict comparable String -> Dict comparable (Html msg) -> Html msg
+tabs tab_id selected_tab_key titles tabkey_to_page =
+    div [ class "tabs"
+        , id tab_id]
+        [ ul [ class "tab-headers" ]
+              (  titles
+              |> Dict.map
+                     (\k -> \title -> li [ class <| if selected_tab_key == k then "tab-header tab-selected" else "tab-header"
+                                         , onClick (SelectTab tab_id k)] [ text title])
+              |> Dict.values)
+        ,  (  Dict.get selected_tab_key tabkey_to_page
+           |> Maybe.withDefault (div [] [ text <| "Invalid selected tab key " ++ (Debug.toString selected_tab_key)]))]
+              
diff --git a/resources/css/murja.css b/resources/css/murja.css
index 43237f5..5f1d7bc 100644
--- a/resources/css/murja.css
+++ b/resources/css/murja.css
@@ -316,6 +316,25 @@ header {
     margin-left: 2em;
 }
 
+.tabs {
+    width: 100%;
+}
+
+.tab-headers {
+    display: flex;
+    justify-content: space-evenly;
+    list-style: none;
+    flex-direction: row;
+}
+
+.tab-header {
+    border-bottom: 2px solid;
+}
+
+.tab-selected {
+    border-bottom: 2px solid #00F;
+}
+
 @media only screen and (max-device-width:480px)
 {
     body {