import qualified Data.Map as M
import qualified XMonad.StackSet as W

import XMonad
import XMonad.Actions.FocusNth
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.NoBorders
import XMonad.Layout.Tabbed
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.TwoPane
import XMonad.Prompt
import XMonad.Prompt.Shell

ompConfig = defaultConfig {
	layoutHook =
		toggleLayouts (noBorders Full) (noBorders ompTabbed) |||
		toggleLayouts ompTwoPane ompTiled |||
		toggleLayouts (Mirror ompTwoPane) (Mirror ompTiled),

	normalBorderColor  = "#666666",
	focusedBorderColor = "#ffffff",

	modMask    = mod4Mask,
	terminal   = "urxvt",
	keys       = newKeys
}
	where
		-- layout
		ompTiled   = Tall 1 (3/100) (1/2)
		ompTwoPane = TwoPane (3/100) (1/2)
		ompTabbed  = tabbedAlways shrinkText defaultTheme {
			activeColor = "#333333",
			activeTextColor = "#cc3333",
			activeBorderColor = "#000000",
			inactiveColor = "#222222",
			inactiveTextColor = "#666666",
			inactiveBorderColor = "000000",
			urgentColor = "#442222",
			urgentTextColor = "#666666",
			urgentBorderColor = "#000000"
		}

		-- key bindings
		defKeys    = keys defaultConfig
		delKeys x  = foldr M.delete           (defKeys x) (toRemove x)
		newKeys x  = foldr (uncurry M.insert) (delKeys x) (toAdd    x)
		toRemove x =
			[(modMask x, xK_p), (modMask x .|. shiftMask, xK_p),
			 (modMask x, xK_w), (modMask x .|. shiftMask, xK_w),
			 (modMask x, xK_e), (modMask x .|. shiftMask, xK_e),
			 (modMask x, xK_r), (modMask x .|. shiftMask, xK_r),
			 (modMask x, xK_b),
			 (modMask x, xK_Tab), (modMask x .|. shiftMask, xK_Tab)]
		toAdd x    =
			[((modMask x, k), focusNth i) | (i, k) <- zip [0 .. 8] [xK_1 ..]] ++
			[((modMask x .|. controlMask, k), (windows $ W.greedyView i)) |
			 (i,k) <- zip (workspaces defaultConfig) [xK_1 .. xK_9]] ++
			[((modMask x, xK_x), shellPrompt defaultXPConfig),
			 ((modMask x .|. controlMask, xK_space), sendMessage ToggleLayout)]

main = xmonad $ withUrgencyHook NoUrgencyHook $ ompConfig
