Yablog (empty) → 0.0.1.1
raw patch · 47 files changed
+8269/−0 lines, 47 filesdep +basedep +blaze-builderdep +bytestringsetup-changedbinary-added
Dependencies added: base, blaze-builder, bytestring, case-insensitive, clientsession, hamlet, hjsmin, http-conduit, http-types, mime-mail, monad-control, old-locale, pandoc, pandoc-types, persistent, persistent-mongoDB, shakespeare-css, shakespeare-js, shakespeare-text, template-haskell, text, time, wai-extra, xml-conduit, xml-hamlet, yaml, yesod, yesod-auth, yesod-core, yesod-default, yesod-form, yesod-newsfeed, yesod-platform, yesod-static
Files
- Application.hs +64/−0
- Forms.hs +176/−0
- Foundation.hs +259/−0
- Handler/Blog.hs +352/−0
- Handler/Root.hs +70/−0
- Handler/User.hs +44/−0
- Import.hs +63/−0
- LICENSE +25/−0
- Markups.hs +66/−0
- Model.hs +16/−0
- Settings.hs +84/−0
- Settings/StaticFiles.hs +21/−0
- Setup.hs +2/−0
- Yablog.cabal +130/−0
- config/models +48/−0
- config/mongoDB.yml +24/−0
- config/robots.txt +1/−0
- config/routes +20/−0
- config/settings.yml +28/−0
- main.hs +8/−0
- messages/en.msg +34/−0
- messages/ja.msg +34/−0
- static/css/bootstrap-responsive.css +581/−0
- static/css/bootstrap.css +3496/−0
- static/img/glyphicons-halflings-white.png binary
- static/img/glyphicons-halflings.png binary
- static/js/bootstrap.js +1720/−0
- static/js/modernizr.js +4/−0
- templates/article-view.hamlet +40/−0
- templates/article-view.lucius +22/−0
- templates/article.hamlet +68/−0
- templates/article.lucius +9/−0
- templates/default-layout-wrapper.hamlet +94/−0
- templates/default-layout.hamlet +63/−0
- templates/default-layout.lucius +22/−0
- templates/edit-article.hamlet +34/−0
- templates/edit-article.julius +11/−0
- templates/edit-article.lucius +3/−0
- templates/homepage.hamlet +38/−0
- templates/homepage.lucius +3/−0
- templates/normalize.lucius +439/−0
- templates/post-article.hamlet +17/−0
- templates/post-article.julius +11/−0
- templates/post-article.lucius +3/−0
- templates/search.hamlet +9/−0
- templates/tag.hamlet +8/−0
- templates/user-settings.hamlet +5/−0
+ Application.hs view
@@ -0,0 +1,64 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+module Application+ ( getApplication+ , getApplicationDev+ ) where++import Import+import Settings+import Yesod.Auth+import Yesod.Default.Config+import Yesod.Default.Main+import Yesod.Default.Handlers+#if DEVELOPMENT+import Yesod.Logger (Logger, logBS)+import Network.Wai.Middleware.RequestLogger (logCallbackDev)+#else+import Yesod.Logger (Logger, logBS, toProduction)+import Network.Wai.Middleware.RequestLogger (logCallback)+#endif+import qualified Database.Persist.Store+import Network.HTTP.Conduit (newManager, def)++-- Import all relevant handler modules here.+import Handler.Root+import Handler.Blog+import Handler.User++-- This line actually creates our YesodSite instance. It is the second half+-- of the call to mkYesodData which occurs in Foundation.hs. Please see+-- the comments there for more details.+mkYesodDispatch "Yablog" resourcesYablog++-- This function allocates resources (such as a database connection pool),+-- performs initialization and creates a WAI application. This is also the+-- place to put your migrate statements to have automatic database+-- migrations handled by Yesod.+getApplication :: AppConfig DefaultEnv Extra -> Logger -> IO Application+getApplication conf logger = do+ manager <- newManager def+ s <- staticSite+ dbconf <- withYamlEnvironment "config/mongoDB.yml" (appEnv conf)+ Database.Persist.Store.loadConfig >>=+ Database.Persist.Store.applyEnv+ p <- Database.Persist.Store.createPoolConfig (dbconf :: Settings.PersistConfig)+ let foundation = Yablog conf setLogger s p manager dbconf+ app <- toWaiAppPlain foundation+ return $ logWare app+ where+#ifdef DEVELOPMENT+ logWare = logCallbackDev (logBS setLogger)+ setLogger = logger+#else+ setLogger = toProduction logger -- by default the logger is set for development+ logWare = logCallback (logBS setLogger)+#endif++-- for yesod devel+getApplicationDev :: IO (Int, Application)+getApplicationDev =+ defaultDevelApp loader getApplication+ where+ loader = loadConfig (configSettings Development)+ { csParseExtra = parseExtra+ }
+ Forms.hs view
@@ -0,0 +1,176 @@+module Forms ( articleForm, articleForm', commentDeleteForm+ , commentForm, commentForm', trackbackForm+ , trackbackDeleteForm+ ) where+import Yesod.Form+import Prelude+import Model+import Control.Applicative+import Foundation+import Yesod hiding (Route(..))+import Data.Text (Text)+import Data.Time+import Control.Monad+import Data.Maybe+import Control.Arrow+import Markups+import Yesod.Default.Config+import qualified Data.Text as T++type URL = String+articleForm :: Form (Article, [Text], [URL])+articleForm = articleForm' Nothing Nothing++articleForm' :: Maybe Article -> Maybe [Text] -> Form (Article, [Text], [URL])+articleForm' mart mtags htm = do+ Entity usrId usr <- lift requireAuth+ lift $ do+ accessible <- isAdmin usr+ unless accessible $ do+ permissionDenied "You are not in admins"+ now <- liftIO getCurrentTime+ markup <- extraMarkup . appExtra . settings <$> lift getYesod+ ident <- maybe (lift newIdent) return $ articleIdent <$> mart+ let day = utctDay now+ time = timeToTimeOfDay $ utctDayTime now+ if maybe False ((/= usrId) . articleAuthor) mart+ then lift $ permissionDenied "You cannot edit that article."+ else flip renderBootstrap htm $+ let titleSettings = FieldSettings { fsLabel = SomeMessage MsgTitle+ , fsName = Just "title"+ , fsId = Just "title"+ , fsAttrs = [("class", "span8")]+ , fsTooltip = Nothing+ }+ bodySettings = FieldSettings { fsLabel = SomeMessage MsgArticle+ , fsId = Just "src"+ , fsName = Just "src"+ , fsAttrs = [("class", "span8")]+ , fsTooltip = Nothing+ }+ tagsSettings = FieldSettings { fsLabel = SomeMessage MsgTags+ , fsId = Just "tags"+ , fsName = Just "tags"+ , fsAttrs = [("class", "span8")]+ , fsTooltip = Nothing+ }+ identSettings = FieldSettings { fsLabel = SomeMessage MsgIdentifier+ , fsId = Just "ident"+ , fsName = Just "ident"+ , fsAttrs = [("class", "span8")]+ , fsTooltip = Nothing+ }+ cDateSettings = FieldSettings { fsLabel = SomeMessage MsgCreatedDate+ , fsId = Just "created_date"+ , fsName = Just "created_date"+ , fsAttrs = []+ , fsTooltip = Nothing+ }+ cTimeSettings = FieldSettings { fsLabel = SomeMessage MsgCreatedTime+ , fsName = Just "created_time"+ , fsId = Just "created_time"+ , fsAttrs = []+ , fsTooltip = Nothing+ }+ markupSettings = FieldSettings { fsLabel = "Markup"+ , fsName = Just "markup"+ , fsId = Just "markup"+ , fsAttrs = []+ , fsTooltip = Nothing+ }+ trackbackUrls = FieldSettings { fsLabel = "Trackback(s)"+ , fsName = Just "trackbacks"+ , fsId = Just "trackbacks"+ , fsAttrs = [("class", "span8")]+ , fsTooltip = Nothing+ }+ art = Article <$> pure usrId+ <*> areq textField titleSettings (articleTitle <$> mart)+ <*> areq textField identSettings (Just ident)+ <*> aopt (selectFieldList $ map ((T.pack &&& id).fst) readers) markupSettings+ (Just $ (articleMarkup =<< mart) <|> markup)+ <*> (T.unpack . T.filter (/='\r') . unTextarea <$>+ areq textareaField bodySettings+ (Textarea . T.pack . articleBody <$> mart))+ <*> (fromEnum . fromMaybe day <$> aopt dayField cDateSettings+ (Just $ toEnum . articleCreatedDate <$> mart))+ <*> (fromEnum . timeOfDayToTime . fromMaybe time <$> aopt timeField cTimeSettings+ (Just $ timeToTimeOfDay . toEnum . articleCreatedTime <$> mart))+ <*> pure (articleModifiedAt =<< mart)+ tags = T.words . fromMaybe "" <$> aopt textField tagsSettings (Just . T.unwords <$> mtags)+ tbs = maybe [] (lines . T.unpack . unTextarea) <$> aopt textareaField trackbackUrls Nothing+ in (,,) <$> art <*> tags <*> tbs++commentDeleteForm :: ArticleId -> Form [Comment]+commentDeleteForm art html = do+ let commentSettings = FieldSettings { fsLabel = SomeMessage MsgComments+ , fsAttrs = [("class", "span8")]+ , fsName = Just "delete-contents"+ , fsId = Just "delete-contents"+ , fsTooltip = Nothing+ }+ cs <- lift $ runDB $ selectList [CommentArticle ==. art] []+ flip renderBootstrap html $+ areq (multiSelectFieldList [(mkOptName c, c) | Entity _ c <- cs]) commentSettings Nothing+ where+ mkOptName c = T.concat [ commentBody c, " - ", commentAuthor c, " / "+ , T.pack$ show $ commentCreatedAt c+ ]++trackbackDeleteForm :: ArticleId -> Form [Trackback]+trackbackDeleteForm art html = do+ let tbsSettings = FieldSettings { fsLabel = SomeMessage MsgTrackbacks+ , fsAttrs = [("class", "span8")]+ , fsName = Just "delete-tbs"+ , fsId = Just "delete-tbs"+ , fsTooltip = Nothing+ }+ cs <- lift $ runDB $ selectList [TrackbackArticle ==. art] []+ flip renderBootstrap html $+ areq (multiSelectFieldList [(mkOptName c, c) | Entity _ c <- cs]) tbsSettings Nothing+ where+ mkOptName t = fromMaybe (fromMaybe (trackbackUrl t) $ trackbackBlogName t) $+ trackbackTitle t+++commentForm' :: Maybe Comment -> ArticleId -> Form Comment+commentForm' mcom art html = do+ musr <- lift maybeAuth+ time <- liftIO getCurrentTime+ let commentField = FieldSettings { fsLabel = SomeMessage MsgComment+ , fsAttrs = [("class", "span8")]+ , fsName = Just "comment-contents"+ , fsId = Just "comment-contents"+ , fsTooltip = Nothing+ }+ nameField = FieldSettings { fsLabel = SomeMessage MsgName+ , fsAttrs = []+ , fsId = Just "comment-author"+ , fsName = Just "comment-author"+ , fsTooltip = Nothing+ }+ flip renderBootstrap html $+ Comment <$> areq textField nameField (userScreenName . entityVal <$> musr)+ <*> (unTextarea <$> areq textareaField commentField (Textarea . commentBody <$> mcom))+ <*> pure (commentPassword =<< mcom)+ <*> pure time+ <*> pure art++commentForm :: Maybe Comment -> Article -> Form Comment+commentForm mcom art html = do+ Entity key _ <- lift $ runDB $ getBy404 $+ UniqueArticle (articleCreatedDate art) (articleIdent art)+ commentForm' mcom key html++trackbackForm :: ArticleId -> Form Trackback+trackbackForm aid = renderBootstrap $+ Trackback <$> pure aid+ <*> aopt textField titleSettings Nothing+ <*> (liftM unTextarea <$> aopt textareaField excerptSettings Nothing)+ <*> areq textField urlSettings Nothing+ <*> aopt textField blogSettings Nothing+ where+ titleSettings = "title" { fsName = Just "title" }+ excerptSettings = "excerpt" { fsName = Just "excerpt" }+ urlSettings = "url" { fsName = Just "url" }+ blogSettings = "blog_name" { fsName = Just "blog_name" }
+ Foundation.hs view
@@ -0,0 +1,259 @@+module Foundation+ ( Yablog (..)+ , Route (..)+ , YablogMessage (..)+ , resourcesYablog+ , Handler+ , Widget+ , Form+ , YablogDate (..)+ , YablogDay (..)+ , maybeAuth+ , requireAuth+ , module Settings+ , module Model+ , getBlogTitle+ , getBlogDescription+ , markupRender+ , isAdmin+ , notice+ , commentAnchor+ ) where++import Prelude+import Yesod+import Yesod.Static+import Settings.StaticFiles+import Yesod.RssFeed+import Yesod.AtomFeed+import Yesod.Auth+import Yesod.Auth.BrowserId+import Yesod.Auth.GoogleEmail+import Yesod.Default.Config+import Yesod.Default.Util (addStaticContentExternal)+import Yesod.Logger (Logger, logMsg, formatLogText)+import Network.HTTP.Conduit (Manager)+import qualified Settings+import qualified Data.ByteString.Lazy as L+import qualified Database.Persist.Store+import Database.Persist.MongoDB hiding (master)+import Settings (widgetFile, Extra (..))+import Model+import Text.Jasmine (minifym)+import Web.ClientSession (getKey)+import Text.Hamlet (hamletFile)+import Data.List (nub, sort)+import Data.Maybe+import Network.Mail.Mime+import Data.Time+import System.Locale+import Control.Applicative+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import Markups+import Network.HTTP.Types+import qualified Data.ByteString.Lazy.Char8 as LBS++-- | The site argument for your application. This can be a good place to+-- keep settings and values requiring initialization before your application+-- starts running, such as database connections. Every handler will have+-- access to the data present here.+data Yablog = Yablog+ { settings :: AppConfig DefaultEnv Extra+ , getLogger :: Logger+ , getStatic :: Static -- ^ Settings for static file serving.+ , connPool :: Database.Persist.Store.PersistConfigPool Settings.PersistConfig -- ^ Database connection pool.+ , httpManager :: Manager+ , persistConfig :: Settings.PersistConfig+ }++-- Set up i18n messages. See the message folder.+mkMessage "Yablog" "messages" "en"++-- This is where we define all of the routes in our application. For a full+-- explanation of the syntax, please see:+-- http://www.yesodweb.com/book/handler+--+-- This function does three things:+--+-- * Creates the route datatype YablogRoute. Every valid URL in your+-- application can be represented as a value of this type.+-- * Creates the associated type:+-- type instance Route Yablog = YablogRoute+-- * Creates the value resourcesYablog which contains information on the+-- resources declared below. This is used in Handler.hs by the call to+-- mkYesodDispatch+--+-- What this function does *not* do is create a YesodSite instance for+-- Yablog. Creating that instance requires all of the handler functions+-- for our application to be in scope. However, the handler functions+-- usually require access to the YablogRoute datatype. Therefore, we+-- split these actions into two functions and place them in separate files.+mkYesodData "Yablog" $(parseRoutesFile "config/routes")++type Form x = Html -> MForm Yablog Yablog (FormResult x, Widget)++getBlogTitle :: GHandler sub Yablog T.Text+getBlogTitle = extraTitle . appExtra . settings <$> getYesod++getBlogDescription :: GHandler sub Yablog T.Text+getBlogDescription = extraDescription . appExtra . settings <$> getYesod++isAdmin :: User -> GHandler sub Yablog Bool+isAdmin usr = do+ as <- extraAdmins . appExtra . settings <$> getYesod+ return $ userIdent usr `elem` as++markupRender :: Maybe String -> Article -> GHandler sub Yablog Html+markupRender mid article = do+ extra <- appExtra . settings <$> getYesod+ usr <- runDB $ get404 $ articleAuthor article+ let markup = fromMaybe "markdown" $ articleMarkup article <|> extraMarkup extra+ trans = maybe id (addAmazonAssociateLink . T.unpack) $ userAmazon usr+ return $ renderMarkup mid markup trans $ articleBody article++-- Please see the documentation for the Yesod typeclass. There are a number+-- of settings which can be configured by overriding methods here.+instance Yesod Yablog where+ approot = ApprootMaster $ appRoot . settings++ -- Place the session key file in the config folder+ makeSessionBackend _ = do+ key <- getKey "config/client_session_key.aes"+ return . Just $ clientSessionBackend key 120++ defaultLayout widget = do+ musr <- maybeAuth+ let rss = rssLink FeedR "RSS Link"+ atom = atomLink FeedR "Atom Link"+ accessible <- maybe (return False) (isAdmin . entityVal) musr+ master <- getYesod+ mmsg <- getMessage+ blogTitle <- getBlogTitle+ description <- getBlogDescription+ let mcse = case extraGoogleCSE (appExtra $ settings master) of+ Just cse -> Just $(widgetFile "search")+ Nothing -> Nothing+ comments <- runDB $ do+ cs <- map entityVal <$> selectList [] [LimitTo 10, Desc CommentCreatedAt]+ as <- mapM (get404 . commentArticle) cs+ return $ zip cs as+ articles <- map entityVal <$> runDB (selectList [] [LimitTo 5, Desc ArticleCreatedDate, Desc ArticleCreatedTime])+ tags <- sort . nub . map (tagName . entityVal) <$> runDB (selectList [] [])+ -- We break up the default layout into two components:+ -- default-layout is the contents of the body tag, and+ -- default-layout-wrapper is the entire page. Since the final+ -- value passed to hamletToRepHtml cannot be a widget, this allows+ -- you to use normal widget features in default-layout.+ pc <- widgetToPageContent $ do+ addScriptRemote "https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"+ addScriptRemote "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"+ addScript $ StaticR js_bootstrap_js+ addStylesheet $ StaticR css_bootstrap_responsive_css+ addStylesheet $ StaticR css_bootstrap_css+ setTitle $ toHtml blogTitle+ $(widgetFile "normalize")+ $(widgetFile "default-layout")+ hamletToRepHtml $(hamletFile "templates/default-layout-wrapper.hamlet")++ -- This is done to provide an optimization for serving static files from+ -- a separate domain. Please see the staticRoot setting in Settings.hs+ urlRenderOverride y (StaticR s) =+ Just $ uncurry (joinPath y (Settings.staticRoot $ settings y)) $ renderRoute s+ urlRenderOverride _ _ = Nothing++ -- The page to be redirected to when authentication is required.+ authRoute _ = Just $ AuthR LoginR++ messageLogger y loc level msg =+ formatLogText (getLogger y) loc level msg >>= logMsg (getLogger y)++ -- This function creates static content files in the static folder+ -- and names them based on a hash of their content. This allows+ -- expiration dates to be set far in the future without worry of+ -- users receiving stale content.+ addStaticContent = addStaticContentExternal minifym base64md5 Settings.staticDir (StaticR . flip StaticRoute [])++ -- Place Javascript at bottom of the body tag so the rest of the page loads first+ jsLoader _ = BottomOfBody++-- How to run database actions.+instance YesodPersist Yablog where+ type YesodPersistBackend Yablog = Action+ runDB f = do+ master <- getYesod+ Database.Persist.Store.runPool+ (persistConfig master)+ f+ (connPool master)++instance YesodAuth Yablog where+ type AuthId Yablog = UserId++ -- Where to send a user after successful login+ loginDest _ = RootR+ -- Where to send a user after logout+ logoutDest _ = RootR++ getAuthId creds = runDB $ do+ x <- getBy $ UniqueUser $ credsIdent creds+ case x of+ Just (Entity uid _) -> return $ Just uid+ Nothing -> do+ fmap Just $ insert $+ User (credsIdent creds) (credsIdent creds) Nothing Nothing "ja" "" Nothing++ -- You can add other plugins like BrowserID, email or OAuth here+ authPlugins _ = [authBrowserId, authGoogleEmail]++ authHttpManager = httpManager++-- Sends off your mail. Requires sendmail in production!+deliver :: Yablog -> L.ByteString -> IO ()+deliver _ = sendmail++-- This instance is required to use forms. You can modify renderMessage to+-- achieve customized and internationalized form validation messages.+instance RenderMessage Yablog FormMessage where+ renderMessage _ _ = defaultFormMessage++newtype YablogDate = YablogDate { fromYablogDate :: UTCTime }+ deriving (Eq, Ord, FormatTime, ParseTime)++instance Show YablogDate where+ show = formatTime defaultTimeLocale "%Y-%m-%d"++instance Read YablogDate where+ readsPrec _ = readsTime defaultTimeLocale "%Y-%m-%d"++newtype YablogDay = YablogDay { unYablogDay :: Day }+ deriving (Show, Eq, Ord, ParseTime, Read, Enum)++instance PathPiece YablogDay where+ toPathPiece = T.pack . formatTime defaultTimeLocale "%Y%m%d" . unYablogDay+ fromPathPiece = Data.Time.parseTime defaultTimeLocale "%Y%m%d" . T.unpack++notice :: UserId -> T.Text -> T.Text -> Handler ()+notice usrId title msg = do+ usr <- runDB $ get404 usrId+ extra <- appExtra . settings <$> getYesod+ case (,) <$> extraMailAddress extra <*> userEmail usr of+ Just (addr, to) -> do+ let body = Part "text/plain; charset=utf-8" QuotedPrintableText Nothing [] $ LBS.fromChunks [T.encodeUtf8 msg]+ mail = Mail { mailFrom = Address (Just $ extraTitle extra) addr+ , mailTo = [Address (Just $ userScreenName usr) to]+ , mailHeaders = [("Subject", title)]+ , mailCc = []+ , mailBcc = []+ , mailParts = [[body]]+ }+ -- liftIO $ LBS.putStrLn =<< renderMail' mail+ liftIO $ renderSendMail mail+ Nothing -> return ()++commentAnchor :: Comment -> T.Text+commentAnchor c = T.concat [ "comment-"+ , T.decodeUtf8 $ urlEncode True $ T.encodeUtf8 $ commentAuthor c+ , "-"+ , T.pack $ formatTime defaultTimeLocale "%Y-%m-%d-%H-%M-%S" $ commentCreatedAt c+ ]
+ Handler/Blog.hs view
@@ -0,0 +1,352 @@+module Handler.Blog where+import Data.Time+import Import+import Control.Monad+import Yesod.Auth+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.Text.Lazy as LT+import qualified Data.Text.Lazy.Encoding as LT+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS+import Data.List (sortBy)+import Data.Function+import Text.Hamlet.XML+import Text.XML+import Text.XML.Cursor+import Blaze.ByteString.Builder+import Data.Maybe+import Network.HTTP.Conduit+import Network.HTTP.Types++postCreateR :: Handler RepHtml+postCreateR = do+ ((result, widget), enctype) <- runFormPost articleForm+ case result of+ FormSuccess (article, tags, tbs) -> do+ usr <- requireAuthId+ when (articleAuthor article /= usr) $ redirect RootR+ success <- runDB $ do+ ans <- insertBy article+ case ans of+ Right key -> do+ mapM_ (insertBy . Tag key) tags+ return True+ Left _ -> return False+ if success+ then do+ errs <- catMaybes <$> mapM (pingTrackback article) tbs+ unless (null errs) $ setMessageI $ T.unlines errs+ redirect $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+ else do+ setMessageI $ MsgAlreadyExists $ articleTitle article+ defaultLayout $(widgetFile "post-article")+ _ -> do+ setMessageI MsgInvalidInput+ defaultLayout $(widgetFile "post-article")++getCreateR :: Handler RepHtml+getCreateR = do+ (widget, enctype) <- generateFormPost articleForm+ defaultLayout $ do+ $(widgetFile "post-article")++getArticleR :: YablogDay -> Text -> Handler RepHtml+getArticleR (YablogDay date) ident = do+ musr <- maybeAuthId+ (article, comments, trackbacks, mprev, mnext) <- runDB $ do+ Entity key article <- getBy404 (UniqueArticle (fromEnum date) ident)+ cs <- map entityVal <$> selectList [CommentArticle ==. key] []+ ts <- map entityVal <$> selectList [TrackbackArticle ==. key] []+ mnext <- selectFirst [ ArticleCreatedDate >=. articleCreatedDate article+ , FilterOr [ ArticleCreatedDate >. articleCreatedDate article+ , ArticleCreatedTime >. articleCreatedTime article+ ]+ ]+ [ Asc ArticleCreatedDate, Asc ArticleCreatedTime]+ mprev <- selectFirst [ ArticleCreatedDate <=. articleCreatedDate article+ , FilterOr [ ArticleCreatedDate <. articleCreatedDate article+ , ArticleCreatedTime <. articleCreatedTime article+ ]+ ]+ [ Desc ArticleCreatedDate, Desc ArticleCreatedTime ]+ return (article, cs, ts, entityVal <$> mprev, entityVal <$> mnext)+ (cWidget, cEnctype) <- generateFormPost $ commentForm Nothing article+ let mCommentForm = Just (cWidget, cEnctype)+ blogTitle <- getBlogTitle+ render <- getUrlRender+ defaultLayout $ do+ when (isJust mprev) $ do+ let prev = fromJust mprev+ toWidgetHead+ [hamlet|+ <link rel="prev previous" href=@{articleLink prev} title=#{articleTitle prev}>+ |]+ when (isJust mnext) $ do+ let next = fromJust mnext+ toWidgetHead+ [hamlet|+ <link rel="next" href=@{articleLink next} title=#{articleTitle next}>+ |]+ setTitle $ toHtml $ T.concat [articleTitle article, " - ", blogTitle]+ $(widgetFile "article")++pingTrackback :: Article -> String -> Handler (Maybe T.Text)+pingTrackback article tb = do+ renderUrl <- getUrlRender+ master <- getYesod+ blogName <- getBlogTitle+ let meta = [("title", T.encodeUtf8 $ articleTitle article)+ ,("excerpt", T.encodeUtf8 $ T.take 255 $ T.pack $ articleBody article)+ ,("url", T.encodeUtf8 $ renderUrl $ articleLink article)+ ,("blog_name", T.encodeUtf8 blogName)+ ]+ man = httpManager master+ rsp <- lift $ flip httpLbs man . urlEncodedBody meta =<< parseUrl tb+ if responseStatus rsp /= status200+ then return $ Just $ T.concat [ T.pack tb+ , ": HTTP Error: "+ , T.concat (LT.toChunks $ LT.decodeUtf8 $ responseBody rsp)+ ]+ else do+ case fromDocument <$> parseLBS def (responseBody rsp) of+ Right root -> do+ let code = T.concat $ root $// checkName (== "error") >=> descendant >=> content+ msgs = T.concat $ root $// checkName (== "message") >=> descendant >=> content+ if code == "0"+ then return Nothing+ else return $ Just $ T.concat [T.pack tb, ": ", msgs]+ Left _ -> return $ Just $ T.concat [T.pack tb, ": malformed response"]++putArticleR :: YablogDay -> Text -> Handler RepHtml+putArticleR (YablogDay day) ident = do+ ((result, widget), enctype) <- runFormPost articleForm+ usrId <- requireAuthId+ time <- liftIO getCurrentTime+ case result of+ FormSuccess (article, tags, tbs) -> do+ suc <- runDB $ do+ Entity key old <- getBy404 $ UniqueArticle (fromEnum day) ident+ if articleAuthor old == usrId+ then do+ replace key article { articleModifiedAt = Just time }+ mapM_ (delete . entityKey) =<< selectList [TagArticle ==. key] []+ mapM_ (insert . Tag key) tags+ return True+ else return False+ if suc+ then do+ errs <- catMaybes <$> mapM (pingTrackback article) tbs+ unless (null errs) $ setMessageI $ T.unlines errs+ redirect $ ArticleR (YablogDay day) $ articleIdent article+ else permissionDenied "You are not allowed to edit this article."+ _ -> do+ setMessageI MsgInvalidInput+ let mCommentTrackbackForm = Nothing :: Maybe (Widget, Text, Widget, Text)+ defaultLayout $(widgetFile "edit-article")++getDeleteR :: YablogDay -> Text -> Handler RepHtml+getDeleteR = deleteArticleR ++getModifyR :: YablogDay -> Text -> Handler RepHtml+getModifyR (YablogDay day) ident = do+ (artId, art, tags) <- runDB $ do+ Entity key art <- getBy404 $ UniqueArticle (fromEnum day) ident+ tags <- map (tagName . entityVal) <$> selectList [TagArticle ==. key] []+ return (key, art, tags)+ (widget, enctype) <- generateFormPost $ articleForm' (Just art) (Just tags)+ (cWidget, cEnctype) <- generateFormPost $ commentDeleteForm artId+ (tWidget, tEnctype) <- generateFormPost $ trackbackDeleteForm artId+ let mCommentTrackbackForm = Just (cWidget, cEnctype, tWidget, tEnctype)+ defaultLayout $ do+ setTitleI $ MsgEdit $ articleTitle art+ $(widgetFile "edit-article")++postDeleteCommentR :: YablogDay -> Text -> Handler ()+postDeleteCommentR = deleteCommentR++postModifyR :: YablogDay -> Text -> Handler RepHtml+postModifyR = putArticleR++deleteArticleR :: YablogDay -> Text -> Handler RepHtml+deleteArticleR (YablogDay day) ident = do+ usrId <- requireAuthId+ Entity key art <- runDB $ getBy404 $ UniqueArticle (fromEnum day) ident+ if articleAuthor art == usrId+ then do+ runDB $ do+ mapM_ (delete . entityKey) =<< selectList [TagArticle ==. key] []+ delete key+ redirect RootR+ else do+ permissionDenied "You are not allowed to delete that article."++postCommentR :: YablogDay -> Text -> Handler RepHtml+postCommentR (YablogDay date) ident = do+ Entity key article <- runDB $ getBy404 $ UniqueArticle (fromEnum date) ident+ ((result, _), _) <- runFormPost $ commentForm' Nothing key+ case result of+ FormSuccess comment -> do+ ans <- runDB $ insertBy comment+ case ans of+ Right _ -> do+ render <- getUrlRender+ let anchor = commentAnchor comment+ let url = T.concat [render $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+ , "#", anchor+ ]+ msgRender <- getMessageRender+ notice (articleAuthor article) (msgRender MsgNewComment) $+ T.unlines [ msgRender (MsgYouHaveNewCommentFor url)+ , ""+ , "\"" `T.append` commentBody comment `T.append` "\""+ , "\nby " `T.append` commentAuthor comment+ ]+ redirect url+ Left _ -> do+ setMessageI $ MsgAlreadyExists $ articleTitle article+ redirect $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+ _ -> do+ setMessageI MsgInvalidInput+ redirect $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)++putCommentR :: YablogDay -> Text -> Handler ()+putCommentR = undefined++deleteTrackbackR :: YablogDay -> Text -> Handler ()+deleteTrackbackR (YablogDay day) ident = do+ Entity uid _ <- requireAuth+ Entity aid art <- runDB $ getBy404 $ UniqueArticle (fromEnum day) ident+ ((result, _), _) <- runFormPost $ trackbackDeleteForm aid+ when (uid /= articleAuthor art) $ do+ permissionDenied "You are not allowed to delete those comment(s)."+ case result of+ FormSuccess cs -> do+ when (any ((/= aid) . trackbackArticle) cs) $ permissionDenied "You can't delete that comment."+ runDB $ mapM_ (\c -> deleteBy $ UniqueTrackback aid (trackbackUrl c)) cs+ redirect $ ArticleR (YablogDay day) (articleIdent art)+ _ -> do+ setMessageI MsgInvalidInput+ redirect $ ModifyR (YablogDay day) (articleIdent art)++postDeleteTrackbackR :: YablogDay -> Text -> Handler ()+postDeleteTrackbackR = deleteTrackbackR++deleteCommentR :: YablogDay -> Text -> Handler ()+deleteCommentR (YablogDay day) ident = do+ Entity uid _ <- requireAuth+ Entity aid art <- runDB $ getBy404 $ UniqueArticle (fromEnum day) ident+ ((result, _), _) <- runFormPost $ commentDeleteForm aid+ when (uid /= articleAuthor art) $ do+ permissionDenied "You are not allowed to delete those comment(s)."+ case result of+ FormSuccess cs -> do+ when (any ((/= aid) . commentArticle) cs) $ permissionDenied "You can't delete that comment."+ runDB $ mapM_ (\c -> deleteBy $ UniqueComment aid (commentAuthor c) (commentCreatedAt c)) cs+ redirect $ ArticleR (YablogDay day) (articleIdent art)+ _ -> do+ setMessageI MsgInvalidInput+ redirect $ ModifyR (YablogDay day) (articleIdent art)++postPreviewR :: Handler RepHtml+postPreviewR = do+ author <- userScreenName . entityVal <$> requireAuth+ ((result, _), _) <- runFormPost articleForm+ case result of+ FormSuccess (article, tags, tbs) -> do+ let editable = False+ comments = []+ mCommentTrackbackForm = Nothing :: Maybe (Widget, Text, Widget, Text)+ title = articleTitle article+ posted = show $ UTCTime (toEnum $ articleCreatedDate article) (toEnum $ articleCreatedTime article)+ date = toEnum $ articleCreatedDate article :: Day+ route = Nothing :: Maybe Text+ ident = articleIdent article+ mnext = Nothing+ mprev = Nothing+ blogTitle <- getBlogTitle+ body <- markupRender Nothing article+ defaultLayout $ do+ $(widgetFile "article-view")+ _ -> notFound++getTagR :: Text -> Handler RepHtml+getTagR tag = do+ articles <- runDB $ do+ mapM (get404 . tagArticle . entityVal) =<< selectList [TagName ==. tag] []+ when (null articles) notFound+ defaultLayout $ do+ setTitleI $ MsgArticlesForTag tag+ $(widgetFile "tag")++postTrackbackR :: YablogDay -> Text -> Handler RepXml+postTrackbackR (YablogDay date) ident = do+ Entity aid _ <- runDB $ getBy404 $ UniqueArticle (fromEnum date) ident+ trackback <- runInputPost $+ Trackback aid <$> iopt textField "title"+ <*> (liftM unTextarea <$> iopt textareaField "excerpt")+ <*> ireq textField "url"+ <*> iopt textField "blog_name"+ man <- httpManager <$> getYesod+ curUrl <- getUrlRender <*> pure (ArticleR (YablogDay date) ident)+ alert <- lift $ do+ rsp <- flip httpLbs man =<< parseUrl (T.unpack $ trackbackUrl trackback)+ if responseStatus rsp == status200+ then+ if T.encodeUtf8 curUrl `BS.isInfixOf` BS.concat (LBS.toChunks (responseBody rsp))+ then return Nothing+ else return $ Just "Your page does not include link to my page."+ else return $ Just "HTTP Error"+ case alert of+ Nothing -> do+ runDB $ do+ ans <- insertBy trackback+ case ans of+ Right _ -> return ()+ Left (Entity k _) -> replace k trackback+ return $ mkXmlResponse [xml|<error>0|]+ Just err ->+ return $ mkXmlResponse [xml|<error>1+ <message>#{err}+ |]++getTrackbackR :: YablogDay -> Text -> Handler RepXml+getTrackbackR (YablogDay date) ident = do+ (art, ts) <- runDB $ do+ Entity aid art <- getBy404 $ UniqueArticle (fromEnum date) ident+ ts <- map entityVal <$> selectList [TrackbackArticle ==. aid] []+ return (art, ts)+ render <- getUrlRender+ desc <- getBlogDescription+ bTitle <- getBlogTitle+ return $ mkXmlResponse [xml|+ <error>+ 0+ <rss version="0.91">+ <channel>+ <title>+ #{articleTitle art} - #{bTitle}+ <link>+ #{render $ ArticleR (YablogDay date) ident}+ <description>+ #{articleTitle art} - #{bTitle}+ <language>+ ja+ $forall t <- ts+ <item>+ <title>+ #{fromMaybe (trackbackUrl t) $ trackbackTitle t}+ <link>+ #{trackbackUrl t}+ $maybe e <- trackbackExcerpt t+ <description>+ #{e}+ |]++mkXmlResponse :: [Node] -> RepXml+mkXmlResponse nodes = RepXml $+ ContentBuilder (fromLazyByteString $ renderLBS def $+ Document (Prologue [] Nothing []) body [])+ Nothing+ where+ body = Element "response" [] nodes
+ Handler/Root.hs view
@@ -0,0 +1,70 @@+module Handler.Root where+import qualified Data.Text as T+import Import+import Yesod.Feed+import Control.Arrow+import Data.Time+import Data.Maybe+import Data.List (last)++-- This is a handler function for the GET request method on the RootR+-- resource pattern. All of your resource patterns are defined in+-- config/routes+--+-- The majority of the code you will write in Yesod lives in these handler+-- functions. You can spread them across multiple files if you are so+-- inclined, or create a single monolithic file.+getRootR :: Handler RepHtml+getRootR = do+ offset <- fromMaybe 0 <$> runInputGet (iopt intField "of")+ (articles, hasMore) <- runDB $ do+ as <- selectList [] [OffsetBy offset, LimitTo 5, Desc ArticleCreatedDate, Desc ArticleCreatedTime]+ hasMore <-+ if null as+ then return False+ else do+ let anc = entityVal $ last as+ olds <- count [ ArticleCreatedDate <=. articleCreatedDate anc+ , FilterOr [ ArticleCreatedDate <. articleCreatedDate anc+ , ArticleCreatedTime <. articleCreatedTime anc+ ]+ ]+ return (olds > 0)+ cs <- mapM (\(Entity key _) -> count [CommentArticle ==. key]) as+ ts <- mapM (\(Entity key _) -> count [TrackbackArticle ==. key]) as+ return $ (zip [1 :: Int ..] $ zip3 (map entityVal as) cs ts, hasMore)+ title <- getBlogTitle+ defaultLayout $ do+ setTitle $ toHtml $ "Home - " `T.append` title+ $(widgetFile "homepage")++getFeedR :: Handler RepAtomRss+getFeedR = do+ bTitle <- getBlogTitle+ desc <- getBlogDescription+ arts <- runDB $ map entityVal <$> selectList [] [ LimitTo 5+ , Desc ArticleCreatedDate+ , Desc ArticleCreatedTime+ ]+ let ts = map (uncurry UTCTime . ((toEnum . articleCreatedDate) &&& (toEnum . articleCreatedTime))) arts+ ++ mapMaybe articleModifiedAt arts+ es <- mapM toFeedEntry arts+ time <- if null ts then liftIO getCurrentTime else return $ maximum ts+ newsFeed $ Feed { feedTitle = bTitle+ , feedLinkSelf = FeedR+ , feedLinkHome = RootR+ , feedDescription = toHtml desc+ , feedLanguage = "ja"+ , feedUpdated = time+ , feedEntries = es+ }++toFeedEntry :: Article -> Handler (FeedEntry (Route Yablog))+toFeedEntry art = do+ body <- markupRender Nothing art+ let time = UTCTime (toEnum $ articleCreatedDate art) (toEnum $ articleCreatedTime art)+ return FeedEntry { feedEntryLink = ArticleR (toEnum $ articleCreatedDate art) (articleTitle art)+ , feedEntryUpdated = fromMaybe time $ articleModifiedAt art+ , feedEntryTitle = articleTitle art+ , feedEntryContent = body+ }
+ Handler/User.hs view
@@ -0,0 +1,44 @@+module Handler.User where+import Import+import qualified Data.Text as T++userForm :: Form User+userForm html = do+ Entity _ user <- lift requireAuth+ let ident = userIdent user+ screenName = userScreenName user+ email = userEmail user+ locale = userLocale user+ profile = userProfile user+ amazon = userAmazon user+ langs = [("Japanese" :: Text, "ja"), ("English", "en")]+ flip renderBootstrap html $ do+ User <$> pure ident+ <*> areq textField "screen_name" (Just screenName)+ <*> pure Nothing+ <*> aopt textField "email" (Just email)+ <*> areq (selectFieldList langs ) "locale" (Just locale)+ <*> (T.filter (/= '\r') . unTextarea <$> areq textareaField "profile" (Just $ Textarea profile))+ <*> aopt textField "Amazon Associate" (Just amazon)++getUserSettingsR :: Handler RepHtml+getUserSettingsR = do+ Entity key usr <- requireAuth+ (widget, enctype) <- generateFormPost userForm+ defaultLayout $ do+ setTitle "Settings"+ $(widgetFile "user-settings")++postUserSettingsR :: Handler RepHtml+postUserSettingsR = putUserSettingsR++putUserSettingsR :: Handler RepHtml+putUserSettingsR = do+ Entity key _ <- requireAuth+ ((result, _), _) <- runFormPost userForm+ liftIO $ print result+ case result of+ FormSuccess newUser -> do+ runDB $ replace key newUser+ redirect UserSettingsR+ _ -> permissionDenied "!!!!YOU ARE NOT ALLOWED TO EDIT OTHER'S PROFILE!!!!"
+ Import.hs view
@@ -0,0 +1,63 @@+module Import+ ( module Prelude+ , module Yesod+ , module Foundation+ , module Data.Monoid+ , module Control.Applicative+ , module Settings.StaticFiles+ , module Text.Pandoc+ , module Forms+ , Text+ , articleView+ , articleLink+ , makeSnippet+#if __GLASGOW_HASKELL__ < 740+ , (<>)+#endif+ ) where++import Prelude hiding (writeFile, readFile, head, tail, init, last)+import Yesod hiding (Route(..), Header(..))+import Foundation+import Data.Monoid (Monoid (mappend, mempty, mconcat))+import Control.Applicative ((<$>), (<*>), pure)+import Data.Text (Text)+import qualified Data.Text as T+import Settings.StaticFiles+import Text.Pandoc hiding (Null)+import Yesod.Auth+import Data.Time+import Forms++articleView :: Maybe String -> Article -> Widget+articleView mid article = do+ render <- lift getUrlRender+ let route = Just $ render $ ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)+ musr <- lift maybeAuthId+ (author, tags) <- lift $ runDB $ do+ Entity key _ <- getBy404 $ UniqueArticle (articleCreatedDate article) (articleIdent article)+ author <- get404 (articleAuthor article)+ tags <- map (tagName . entityVal) <$> selectList [TagArticle ==. key] []+ return (userScreenName author, tags)+ body <- lift $ markupRender mid article+ blogTitle <- lift getBlogTitle+ let title = articleTitle article+ editable = maybe False (== articleAuthor article) musr+ date = toEnum $ articleCreatedDate article+ posted = show $ UTCTime date (toEnum $ articleCreatedTime article)+ ident = articleIdent article+ $(widgetFile "article-view")++articleLink :: Article -> Route Yablog+articleLink article = ArticleR (toEnum $ articleCreatedDate article)+ (articleIdent article)++makeSnippet :: Int -> Text -> Text+makeSnippet len t | T.length t <= len = t+ | otherwise = T.take len t `T.append` "..."++#if __GLASGOW_HASKELL__ < 740+infixr 5 <>+(<>) :: Monoid m => m -> m -> m+(<>) = mappend+#endif
+ LICENSE view
@@ -0,0 +1,25 @@+The following license covers this documentation, and the source code, except+where otherwise indicated.++Copyright 2012, Hiromi ISHII. All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++* Redistributions of source code must retain the above copyright notice, this+ list of conditions and the following disclaimer.++* Redistributions in binary form must reproduce the above copyright notice,+ this list of conditions and the following disclaimer in the documentation+ and/or other materials provided with the distribution.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO+EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Markups.hs view
@@ -0,0 +1,66 @@+{-# LANGUAGE PatternGuards, OverloadedStrings #-}+module Markups (addAmazonAssociateLink, readers, renderMarkup) where+import Text.Pandoc.Generic+import qualified Data.ByteString.Char8 as BS+import qualified Data.Text as T+import Network.HTTP.Types+import Data.List+import qualified Data.CaseInsensitive as CI+import Blaze.ByteString.Builder+import Text.Pandoc+import Yesod hiding (insert)+import Data.Maybe+import Prelude+import Data.Char++renderTwitterLink :: Pandoc -> Pandoc+renderTwitterLink = bottomUp go+ where+ go (Link is (url, title))+ | ("twitter":xs) <- T.split (==':') $ T.pack url+ = Link is (T.unpack $ T.append "http://twitter.com/#!/" $ T.intercalate ":" xs, title)+ go i = i++addAmazonAssociateLink :: String -> Pandoc -> Pandoc+addAmazonAssociateLink = bottomUp . procAmazon++renderMarkup :: Maybe String+ -> String -- ^ markup language+ -> (Pandoc -> Pandoc) -- ^ pandoc transformer+ -> String -- ^ source+ -> Html -- ^ Html+renderMarkup mid lang trans =+ writeHtml opts+ . trans . renderTwitterLink+ . fromMaybe readMarkdown (lookup (map toLower lang) readers) defaultParserState+ where+ opts = defaultWriterOptions+ { writerHTMLMathMethod =+ MathJax "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"+ , writerHighlight = True+ , writerHtml5 = True+ , writerIdentifierPrefix = fromMaybe "" mid+ }+++procAmazon :: String -> Inline -> Inline+procAmazon tag (Link is (url, title)) = Link is (attachTo tag url, title)+procAmazon tag (Image is (url, title)) = Image is (attachTo tag url, title)+procAmazon _ il = il++amazons :: [T.Text]+amazons = "www.amazon.com":"amazon.com":concatMap (\cc -> [T.concat [www,"amazon.",co,cc] | www <- ["","www."], co <- ["co.", ""]]) ccTLDs++attachTo :: String -> String -> String+attachTo key url | (p@("http:":"":amazon:paths), qs) <- decodePath (BS.pack url)+ , amazon `elem` amazons+ , let cipath = map CI.mk paths+ , ["o", "asin"] `isPrefixOf` cipath || "dp" `elem` cipath+ || ["gp", "product"] `isPrefixOf` cipath+ , isNothing (lookup "tag" qs)+ = tail $ BS.unpack $ toByteString $ encodePath p (("tag",Just $ BS.pack key):qs)+attachTo _ url = url+++ccTLDs :: [T.Text]+ccTLDs = ["ac", "ad", "ae", "af", "ag", "ai", "al", "am", "an", "ao", "aq", "ar", "as", "at", "au", "aw", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", "ee", "eg", "eh", "er", "es", "et", "fi", "fj", "fk", "fm", "fo", "fr", "ga", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma", "mc", "md", "mg", "mh", "mk", "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt", "pw", "py", "qa", "re", "ro", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "sv", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tm", "tn", "to", "tp", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "um", "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "ye", "yt", "yu", "za", "zm", "zw"]
+ Model.hs view
@@ -0,0 +1,16 @@+module Model where++import Prelude+import Yesod+import Data.Text (Text)+import Database.Persist.Quasi+import Database.Persist.MongoDB+import Language.Haskell.TH.Syntax+import Data.Time++-- You can define all of your database entities in the entities file.+-- You can find more information on persistent and how to declare entities+-- at:+-- http://www.yesodweb.com/book/persistent/+share [mkPersist MkPersistSettings { mpsBackend = ConT ''Action }, mkMigrate "migrateAll"]+ $(persistFileWith lowerCaseSettings "config/models")
+ Settings.hs view
@@ -0,0 +1,84 @@+-- | Settings are centralized, as much as possible, into this file. This+-- includes database connection settings, static file locations, etc.+-- In addition, you can configure a number of different aspects of Yesod+-- by overriding methods in the Yesod typeclass. That instance is+-- declared in the Foundation.hs file.+module Settings+ ( widgetFile+ , PersistConfig+ , staticRoot+ , staticDir+ , Extra (..)+ , parseExtra+ ) where++import Prelude+import Text.Shakespeare.Text (st)+import Language.Haskell.TH.Syntax+import Database.Persist.MongoDB (MongoConf)+import Yesod.Default.Config+import qualified Yesod.Default.Util+import Data.Text (Text)+import Data.Yaml+import Control.Applicative++-- | Which Persistent backend this site is using.+type PersistConfig = MongoConf++-- Static setting below. Changing these requires a recompile++-- | The location of static files on your system. This is a file system+-- path. The default value works properly with your scaffolded site.+staticDir :: FilePath+staticDir = "static"++-- | The base URL for your static files. As you can see by the default+-- value, this can simply be "static" appended to your application root.+-- A powerful optimization can be serving static files from a separate+-- domain name. This allows you to use a web server optimized for static+-- files, more easily set expires and cache values, and avoid possibly+-- costly transference of cookies on static files. For more information,+-- please see:+-- http://code.google.com/speed/page-speed/docs/request.html#ServeFromCookielessDomain+--+-- If you change the resource pattern for StaticR in Foundation.hs, you will+-- have to make a corresponding change here.+--+-- To see how this value is used, see urlRenderOverride in Foundation.hs+staticRoot :: AppConfig DefaultEnv x -> Text+staticRoot conf = [st|#{appRoot conf}/static|]+++-- The rest of this file contains settings which rarely need changing by a+-- user.++widgetFile :: String -> Q Exp+#if DEVELOPMENT+widgetFile = Yesod.Default.Util.widgetFileReload+#else+widgetFile = Yesod.Default.Util.widgetFileNoReload+#endif++data Extra = Extra+ { extraCopyright :: Text+ , extraAnalytics :: Maybe Text -- ^ Google Analytics+ , extraHatenaStar :: Maybe Text -- ^ Google Analytics+ , extraAdmins :: [Text]+ , extraTitle :: Text+ , extraDescription :: Text+ , extraMarkup :: Maybe String+ , extraMailAddress :: Maybe Text+ , extraGoogleCSE :: Maybe Text+ } deriving Show++parseExtra :: DefaultEnv -> Object -> Parser Extra+parseExtra _ o = Extra+ <$> o .: "copyright"+ <*> o .:? "analytics"+ <*> o .:? "hatenastar"+ <*> o .: "admins"+ <*> o .: "title"+ <*> o .: "description"+ <*> o .:? "markup"+ <*> o .:? "admin-mail"+ <*> o .:? "google-cse"
+ Settings/StaticFiles.hs view
@@ -0,0 +1,21 @@+module Settings.StaticFiles where++import Prelude (IO)+import Yesod.Static+import qualified Yesod.Static as Static+import Settings (staticDir)++-- | use this to create your static file serving site+staticSite :: IO Static.Static+staticSite =+#ifdef DEVELOPMENT+ Static.staticDevel staticDir+#else+ Static.static staticDir+#endif++-- | This generates easy references to files in the static directory at compile time,+-- giving you compile-time verification that referenced files exist.+-- Warning: any files added to your static directory during run-time can't be+-- accessed this way. You'll have to use their FilePath or URL to access them.+$(staticFiles Settings.staticDir)
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Yablog.cabal view
@@ -0,0 +1,130 @@+name: Yablog+version: 0.0.1.1+license: BSD3+license-file: LICENSE+author: Hiromi ISHII+maintainer: Hiromi ISHII+synopsis: A simple blog engine powered by Yesod.+description: A simple blog engine powered by Yesod.+category: Web+stability: Experimental+cabal-version: >= 1.6+build-type: Simple+homepage: http://Yablog.yesodweb.com/++extra-source-files:+ config/models, config/routes, messages/*.msg,+ templates/*.hamlet, templates/*.julius, templates/*.lucius+data-files:+ config/mongoDB.yml, config/settings.yml, config/robots.txt,+ static/css/*.css, static/img/*.png, static/js/*.js+Flag dev+ Description: Turn on development settings, like auto-reload templates.+ Default: False++Flag library-only+ Description: Build for use with "yesod devel"+ Default: False+++library+ if flag(library-only)+ Buildable: True+ else+ Buildable: False++ exposed-modules: Application+ other-modules: Foundation+ Import+ Model+ Markups+ Forms+ Settings+ Settings.StaticFiles+ Handler.Root+ Handler.Blog+ Handler.User++ ghc-options: -Wall -threaded -O0+ cpp-options: -DDEVELOPMENT++ extensions: TemplateHaskell+ QuasiQuotes+ OverloadedStrings+ NoImplicitPrelude+ CPP+ MultiParamTypeClasses+ TypeFamilies+ GADTs+ GeneralizedNewtypeDeriving+ FlexibleContexts+ EmptyDataDecls++executable Yablog+ if flag(library-only)+ Buildable: False++ if flag(dev)+ cpp-options: -DDEVELOPMENT+ ghc-options: -Wall -threaded -O0+ else+ ghc-options: -Wall -threaded -O2++ main-is: main.hs++ extensions: TemplateHaskell+ QuasiQuotes+ OverloadedStrings+ NoImplicitPrelude+ CPP+ OverloadedStrings+ MultiParamTypeClasses+ TypeFamilies+ GADTs+ GeneralizedNewtypeDeriving+ FlexibleContexts+ EmptyDataDecls++ build-depends: base >= 4 && < 5+ , yesod-platform == 1.0.1+ , yesod >= 1.0 && < 1.1+ , yesod-core >= 1.0 && < 1.1+ , yesod-auth >= 1.0 && < 1.1+ , yesod-static >= 1.0 && < 1.1+ , yesod-default >= 1.0 && < 1.1+ , yesod-form >= 1.0 && < 1.1+ , yesod-newsfeed >= 1.0 && < 1.1+ , mime-mail >= 0.3.0.3 && < 0.5+ , clientsession >= 0.7.3 && < 0.8+ , bytestring >= 0.9 && < 0.10+ , blaze-builder >= 0.3 && < 0.4+ , text >= 0.11 && < 0.12+ , persistent >= 0.9 && < 0.10+ , case-insensitive >= 0.4 && < 0.5+ , http-types >= 0.6 && < 0.7+ , persistent-mongoDB >= 0.9 && < 0.10+ , template-haskell+ , hamlet >= 1.0 && < 1.1+ , shakespeare-css >= 1.0 && < 1.1+ , shakespeare-js >= 1.0 && < 1.1+ , shakespeare-text >= 1.0 && < 1.1+ , hjsmin >= 0.1 && < 0.2+ , monad-control >= 0.3 && < 0.4+ , wai-extra >= 1.2 && < 1.3+ , yaml >= 0.7 && < 0.8+ , http-conduit >= 1.4 && < 1.5+ , time >= 1.2 && < 1.3+ , old-locale >= 1.0 && < 1.1+ , pandoc >= 1.9 && < 1.10+ , pandoc-types >= 1.9 && < 2.0+ , xml-hamlet >= 0.3 && < 0.4+ , xml-conduit >= 0.7 && < 0.8++source-repository head+ type: git+ location: http://gitweb.konn-san.com/repo/Yablog/tree/master++source-repository this+ type: git+ location: https://github.com/konn/Yablog+ tag: 0.0.1.1
+ config/models view
@@ -0,0 +1,48 @@+User+ ident Text+ screenName Text+ password Text Maybe+ email Text Maybe+ locale Text default="ja"+ profile Text default=""+ amazon Text Maybe+ UniqueUser ident+ UserName screenName+ deriving Show Eq++Article+ author UserId Eq+ title Text Eq+ ident Text Eq+ markup String Maybe+ body String+ createdDate Int Gt Lt Eq Desc+ createdTime Int Gt Lt Eq Desc+ modifiedAt UTCTime Maybe Gt Lt Eq Desc+ UniqueArticle createdDate ident+ deriving Show Eq++Comment+ author Text Eq+ body Text+ password Text Maybe+ createdAt UTCTime Asc+ article ArticleId+ UniqueComment article author createdAt+ deriving Show Eq++Tag+ article ArticleId Eq+ name Text Eq+ deriving Show Eq++Trackback+ article ArticleId Eq+ title Text Eq Maybe+ excerpt Text Maybe+ url Text Eq+ blogName Text Maybe+ UniqueTrackback article url+ deriving Show Eq++ -- By default this file is used in Model.hs (which is imported by Foundation.hs)
+ config/mongoDB.yml view
@@ -0,0 +1,24 @@+Default: &defaults+ user: Yablog+ password: Yablog+ host: localhost+ port: 27017+ database: Yablog+ poolsize: 10++Development:+ <<: *defaults++Test:+ database: Yablog_test+ <<: *defaults++Staging:+ database: Yablog_staging+ poolsize: 100+ <<: *defaults++Production:+ database: Yablog_production+ poolsize: 100+ <<: *defaults
+ config/robots.txt view
@@ -0,0 +1,1 @@+User-agent: *
+ config/routes view
@@ -0,0 +1,20 @@+/static StaticR Static getStatic+/auth AuthR Auth getAuth++/favicon.ico FaviconR GET+/robots.txt RobotsR GET+/feed FeedR GET+/ RootR GET++/preview PreviewR POST+/article/create CreateR GET POST+/article/#YablogDay/#T.Text/edit ModifyR GET POST+/article/#YablogDay/#T.Text ArticleR GET PUT DELETE+/article/#YablogDay/#T.Text/delete DeleteR GET+/article/#YablogDay/#T.Text/comment CommentR POST PUT DELETE+/tag/#T.Text TagR GET+/article/#YablogDay/#T.Text/comment/delete DeleteCommentR POST+/article/#YablogDay/#T.Text/trackback TrackbackR GET POST DELETE+/article/#YablogDay/#T.Text/trackback/delete DeleteTrackbackR POST++/user/settings UserSettingsR GET PUT POST
+ config/settings.yml view
@@ -0,0 +1,28 @@+Default: &defaults+ host: "127.0.0.1"+ port: 3000+ copyright: Insert copyright here+ title: "My Great Blog"+ admins: [] # specify users' idents who can write articles.+ # For example, for Gmail or BrowserId, email-address must be used.+ description: "This is my tiny little blog."+ # analytics: PUT-UA-CODEHERE+ # amazon-associate: amazon-associate-code+ markup: markdown # default markup language+ #hatenastar: "" # hatenastar-id+ admin-mail: "email@example.com" # admin mail+ # google-cse: "" # ids for google cse++Development:+ port: 3000+ <<: *defaults++Testing:+ <<: *defaults++Staging:+ <<: *defaults++Production:+ approot: "http://localhost:3000"+ <<: *defaults
+ main.hs view
@@ -0,0 +1,8 @@+import Prelude (IO)+import Yesod.Default.Config (fromArgs)+import Yesod.Default.Main (defaultMain)+import Settings (parseExtra)+import Application (getApplication)++main :: IO ()+main = defaultMain (fromArgs parseExtra) getApplication
+ messages/en.msg view
@@ -0,0 +1,34 @@+Edit msg@T.Text: Edit #{msg}+EditArticle: Edit an article+LoggedInAs name@T.Text: You are logged in as #{name}.+NotLoggedIn: You are not logged in.+Login: Login+Logout: Logout+DeleteArticle: DELETE+EditOn: Edit+PostArticle: Post a new article+Comments: Comment(s)+Preview: Preview+InvalidInput: Invalid inputs. Try it again.+AlreadyExists title@T.Text: The article "#{title}" already exists.+ArticlesForTag tag@T.Text: Articles tagged with "#{tag}"+Articles: Articles+LeaveComment: Leave a comment+Article: Article+Title: Title+Tags: Tags+CreatedDate: Created date+CreatedTime: Created time+Name: Name+Comment: Comment+DeleteComment: Delete Comments+DeleteTrackback: Delete Trackbacks+DeleteCommentTrackback: Delete Trackbacks and Comments+Tweet: Tweet+NoComments: No Comments+Trackbacks: Trackbacks+NoTrackbacks: No Trackbacks+Identifier: Identifier+NewComment: You have new comment+YouHaveNewCommentFor url@T.Text: You have new comment for: #{url}+Search: Search
+ messages/ja.msg view
@@ -0,0 +1,34 @@+Edit msg@T.Text: 編集: #{msg}+EditArticle: 記事を編集+LoggedInAs name@T.Text: #{name} としてログイン中。+NotLoggedIn: ログインしていません。+Login: ログイン+Logout: ログアウト+DeleteArticle: 削除+PostArticle: 新しい記事を投稿+Comments: コメント+EditOn: 編集+Preview: プレビュー+InvalidInput: 入力が不正です。+AlreadyExists title@T.Text: 「#{title}」と既に同名の記事が存在します。+ArticlesForTag tag@T.Text: 「#{tag}」タグの記事一覧+Articles: 記事一覧+LeaveComment: コメントする+Article: 内容+Title: タイトル+Tags: タグ+CreatedDate: 作成日+CreatedTime: 作成時間+Name: 名前+Comment: コメント+DeleteCommentTrackback: コメント・トラックバック削除+DeleteComment: コメント削除+DeleteTrackback: トラックバック削除+Tweet: ツイート+NoComments: コメントなし+Trackbacks: トラックバック+NoTrackbacks: トラックバックなし+Identifier: 識別子+NewComment: 新規コメントのお知らせ+YouHaveNewCommentFor url@T.Text: あなたの記事にコメントが付きました: #{url}+Search: 検索
+ static/css/bootstrap-responsive.css view
@@ -0,0 +1,581 @@+/*!+ * Bootstrap Responsive v2.0.1+ *+ * Copyright 2012 Twitter, Inc+ * Licensed under the Apache License v2.0+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Designed and built with all the love in the world @twitter by @mdo and @fat.+ */+.clearfix {+ *zoom: 1;+}+.clearfix:before, .clearfix:after {+ display: table;+ content: "";+}+.clearfix:after {+ clear: both;+}+.hidden {+ display: none;+ visibility: hidden;+}+@media (max-width: 480px) {+ .nav-collapse {+ -webkit-transform: translate3d(0, 0, 0);+ }+ .page-header h1 small {+ display: block;+ line-height: 18px;+ }+ input[class*="span"],+ select[class*="span"],+ textarea[class*="span"],+ .uneditable-input {+ display: block;+ width: 100%;+ min-height: 28px;+ /* Make inputs at least the height of their button counterpart */+ + /* Makes inputs behave like true block-level elements */+ + -webkit-box-sizing: border-box;+ /* Older Webkit */+ + -moz-box-sizing: border-box;+ /* Older FF */+ + -ms-box-sizing: border-box;+ /* IE8 */+ + box-sizing: border-box;+ /* CSS3 spec*/+ + }+ .input-prepend input[class*="span"], .input-append input[class*="span"] {+ width: auto;+ }+ input[type="checkbox"], input[type="radio"] {+ border: 1px solid #ccc;+ }+ .form-horizontal .control-group > label {+ float: none;+ width: auto;+ padding-top: 0;+ text-align: left;+ }+ .form-horizontal .controls {+ margin-left: 0;+ }+ .form-horizontal .control-list {+ padding-top: 0;+ }+ .form-horizontal .form-actions {+ padding-left: 10px;+ padding-right: 10px;+ }+ .modal {+ position: absolute;+ top: 10px;+ left: 10px;+ right: 10px;+ width: auto;+ margin: 0;+ }+ .modal.fade.in {+ top: auto;+ }+ .modal-header .close {+ padding: 10px;+ margin: -10px;+ }+ .carousel-caption {+ position: static;+ }+}+@media (max-width: 767px) {+ .container {+ width: auto;+ padding: 0 20px;+ }+ .row-fluid {+ width: 100%;+ }+ .row {+ margin-left: 0;+ }+ .row > [class*="span"], .row-fluid > [class*="span"] {+ float: none;+ display: block;+ width: auto;+ margin: 0;+ }+}+@media (min-width: 768px) and (max-width: 979px) {+ .row {+ margin-left: -20px;+ *zoom: 1;+ }+ .row:before, .row:after {+ display: table;+ content: "";+ }+ .row:after {+ clear: both;+ }+ [class*="span"] {+ float: left;+ margin-left: 20px;+ }+ .span1 {+ width: 42px;+ }+ .span2 {+ width: 104px;+ }+ .span3 {+ width: 166px;+ }+ .span4 {+ width: 228px;+ }+ .span5 {+ width: 290px;+ }+ .span6 {+ width: 352px;+ }+ .span7 {+ width: 414px;+ }+ .span8 {+ width: 476px;+ }+ .span9 {+ width: 538px;+ }+ .span10 {+ width: 600px;+ }+ .span11 {+ width: 662px;+ }+ .span12, .container {+ width: 724px;+ }+ .offset1 {+ margin-left: 82px;+ }+ .offset2 {+ margin-left: 144px;+ }+ .offset3 {+ margin-left: 206px;+ }+ .offset4 {+ margin-left: 268px;+ }+ .offset5 {+ margin-left: 330px;+ }+ .offset6 {+ margin-left: 392px;+ }+ .offset7 {+ margin-left: 454px;+ }+ .offset8 {+ margin-left: 516px;+ }+ .offset9 {+ margin-left: 578px;+ }+ .offset10 {+ margin-left: 640px;+ }+ .offset11 {+ margin-left: 702px;+ }+ .row-fluid {+ width: 100%;+ *zoom: 1;+ }+ .row-fluid:before, .row-fluid:after {+ display: table;+ content: "";+ }+ .row-fluid:after {+ clear: both;+ }+ .row-fluid > [class*="span"] {+ float: left;+ margin-left: 2.762430939%;+ }+ .row-fluid > [class*="span"]:first-child {+ margin-left: 0;+ }+ .row-fluid > .span1 {+ width: 5.801104972%;+ }+ .row-fluid > .span2 {+ width: 14.364640883%;+ }+ .row-fluid > .span3 {+ width: 22.928176794%;+ }+ .row-fluid > .span4 {+ width: 31.491712705%;+ }+ .row-fluid > .span5 {+ width: 40.055248616%;+ }+ .row-fluid > .span6 {+ width: 48.618784527%;+ }+ .row-fluid > .span7 {+ width: 57.182320438000005%;+ }+ .row-fluid > .span8 {+ width: 65.74585634900001%;+ }+ .row-fluid > .span9 {+ width: 74.30939226%;+ }+ .row-fluid > .span10 {+ width: 82.87292817100001%;+ }+ .row-fluid > .span11 {+ width: 91.436464082%;+ }+ .row-fluid > .span12 {+ width: 99.999999993%;+ }+ input.span1, textarea.span1, .uneditable-input.span1 {+ width: 32px;+ }+ input.span2, textarea.span2, .uneditable-input.span2 {+ width: 94px;+ }+ input.span3, textarea.span3, .uneditable-input.span3 {+ width: 156px;+ }+ input.span4, textarea.span4, .uneditable-input.span4 {+ width: 218px;+ }+ input.span5, textarea.span5, .uneditable-input.span5 {+ width: 280px;+ }+ input.span6, textarea.span6, .uneditable-input.span6 {+ width: 342px;+ }+ input.span7, textarea.span7, .uneditable-input.span7 {+ width: 404px;+ }+ input.span8, textarea.span8, .uneditable-input.span8 {+ width: 466px;+ }+ input.span9, textarea.span9, .uneditable-input.span9 {+ width: 528px;+ }+ input.span10, textarea.span10, .uneditable-input.span10 {+ width: 590px;+ }+ input.span11, textarea.span11, .uneditable-input.span11 {+ width: 652px;+ }+ input.span12, textarea.span12, .uneditable-input.span12 {+ width: 714px;+ }+}+@media (max-width: 979px) {+ body {+ padding-top: 0;+ }+ .navbar-fixed-top {+ position: static;+ margin-bottom: 18px;+ }+ .navbar-fixed-top .navbar-inner {+ padding: 5px;+ }+ .navbar .container {+ width: auto;+ padding: 0;+ }+ .navbar .brand {+ padding-left: 10px;+ padding-right: 10px;+ margin: 0 0 0 -5px;+ }+ .navbar .nav-collapse {+ clear: left;+ }+ .navbar .nav {+ float: none;+ margin: 0 0 9px;+ }+ .navbar .nav > li {+ float: none;+ }+ .navbar .nav > li > a {+ margin-bottom: 2px;+ }+ .navbar .nav > .divider-vertical {+ display: none;+ }+ .navbar .nav .nav-header {+ color: #999999;+ text-shadow: none;+ }+ .navbar .nav > li > a, .navbar .dropdown-menu a {+ padding: 6px 15px;+ font-weight: bold;+ color: #999999;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+ }+ .navbar .dropdown-menu li + li a {+ margin-bottom: 2px;+ }+ .navbar .nav > li > a:hover, .navbar .dropdown-menu a:hover {+ background-color: #222222;+ }+ .navbar .dropdown-menu {+ position: static;+ top: auto;+ left: auto;+ float: none;+ display: block;+ max-width: none;+ margin: 0 15px;+ padding: 0;+ background-color: transparent;+ border: none;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+ -webkit-box-shadow: none;+ -moz-box-shadow: none;+ box-shadow: none;+ }+ .navbar .dropdown-menu:before, .navbar .dropdown-menu:after {+ display: none;+ }+ .navbar .dropdown-menu .divider {+ display: none;+ }+ .navbar-form, .navbar-search {+ float: none;+ padding: 9px 15px;+ margin: 9px 0;+ border-top: 1px solid #222222;+ border-bottom: 1px solid #222222;+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);+ }+ .navbar .nav.pull-right {+ float: none;+ margin-left: 0;+ }+ .navbar-static .navbar-inner {+ padding-left: 10px;+ padding-right: 10px;+ }+ .btn-navbar {+ display: block;+ }+ .nav-collapse {+ overflow: hidden;+ height: 0;+ }+}+@media (min-width: 980px) {+ .nav-collapse.collapse {+ height: auto !important;+ }+}+@media (min-width: 1200px) {+ .row {+ margin-left: -30px;+ *zoom: 1;+ }+ .row:before, .row:after {+ display: table;+ content: "";+ }+ .row:after {+ clear: both;+ }+ [class*="span"] {+ float: left;+ margin-left: 30px;+ }+ .span1 {+ width: 70px;+ }+ .span2 {+ width: 170px;+ }+ .span3 {+ width: 270px;+ }+ .span4 {+ width: 370px;+ }+ .span5 {+ width: 470px;+ }+ .span6 {+ width: 570px;+ }+ .span7 {+ width: 670px;+ }+ .span8 {+ width: 770px;+ }+ .span9 {+ width: 870px;+ }+ .span10 {+ width: 970px;+ }+ .span11 {+ width: 1070px;+ }+ .span12, .container {+ width: 1170px;+ }+ .offset1 {+ margin-left: 130px;+ }+ .offset2 {+ margin-left: 230px;+ }+ .offset3 {+ margin-left: 330px;+ }+ .offset4 {+ margin-left: 430px;+ }+ .offset5 {+ margin-left: 530px;+ }+ .offset6 {+ margin-left: 630px;+ }+ .offset7 {+ margin-left: 730px;+ }+ .offset8 {+ margin-left: 830px;+ }+ .offset9 {+ margin-left: 930px;+ }+ .offset10 {+ margin-left: 1030px;+ }+ .offset11 {+ margin-left: 1130px;+ }+ .row-fluid {+ width: 100%;+ *zoom: 1;+ }+ .row-fluid:before, .row-fluid:after {+ display: table;+ content: "";+ }+ .row-fluid:after {+ clear: both;+ }+ .row-fluid > [class*="span"] {+ float: left;+ margin-left: 2.564102564%;+ }+ .row-fluid > [class*="span"]:first-child {+ margin-left: 0;+ }+ .row-fluid > .span1 {+ width: 5.982905983%;+ }+ .row-fluid > .span2 {+ width: 14.529914530000001%;+ }+ .row-fluid > .span3 {+ width: 23.076923077%;+ }+ .row-fluid > .span4 {+ width: 31.623931624%;+ }+ .row-fluid > .span5 {+ width: 40.170940171000005%;+ }+ .row-fluid > .span6 {+ width: 48.717948718%;+ }+ .row-fluid > .span7 {+ width: 57.264957265%;+ }+ .row-fluid > .span8 {+ width: 65.81196581200001%;+ }+ .row-fluid > .span9 {+ width: 74.358974359%;+ }+ .row-fluid > .span10 {+ width: 82.905982906%;+ }+ .row-fluid > .span11 {+ width: 91.45299145300001%;+ }+ .row-fluid > .span12 {+ width: 100%;+ }+ input.span1, textarea.span1, .uneditable-input.span1 {+ width: 60px;+ }+ input.span2, textarea.span2, .uneditable-input.span2 {+ width: 160px;+ }+ input.span3, textarea.span3, .uneditable-input.span3 {+ width: 260px;+ }+ input.span4, textarea.span4, .uneditable-input.span4 {+ width: 360px;+ }+ input.span5, textarea.span5, .uneditable-input.span5 {+ width: 460px;+ }+ input.span6, textarea.span6, .uneditable-input.span6 {+ width: 560px;+ }+ input.span7, textarea.span7, .uneditable-input.span7 {+ width: 660px;+ }+ input.span8, textarea.span8, .uneditable-input.span8 {+ width: 760px;+ }+ input.span9, textarea.span9, .uneditable-input.span9 {+ width: 860px;+ }+ input.span10, textarea.span10, .uneditable-input.span10 {+ width: 960px;+ }+ input.span11, textarea.span11, .uneditable-input.span11 {+ width: 1060px;+ }+ input.span12, textarea.span12, .uneditable-input.span12 {+ width: 1160px;+ }+ .thumbnails {+ margin-left: -30px;+ }+ .thumbnails > li {+ margin-left: 30px;+ }+}
+ static/css/bootstrap.css view
@@ -0,0 +1,3496 @@+/*!+ * Bootstrap v2.0.1+ *+ * Copyright 2012 Twitter, Inc+ * Licensed under the Apache License v2.0+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Designed and built with all the love in the world @twitter by @mdo and @fat.+ */+article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+nav,+section {+ display: block;+}+audio, canvas, video {+ display: inline-block;+ *display: inline;+ *zoom: 1;+}+audio:not([controls]) {+ display: none;+}+html {+ font-size: 100%;+ -webkit-text-size-adjust: 100%;+ -ms-text-size-adjust: 100%;+}+a:focus {+ outline: thin dotted #333;+ outline: 5px auto -webkit-focus-ring-color;+ outline-offset: -2px;+}+a:hover, a:active {+ outline: 0;+}+sub, sup {+ position: relative;+ font-size: 75%;+ line-height: 0;+ vertical-align: baseline;+}+sup {+ top: -0.5em;+}+sub {+ bottom: -0.25em;+}+img {+ max-width: 100%;+ height: auto;+ border: 0;+ -ms-interpolation-mode: bicubic;+}+button,+input,+select,+textarea {+ margin: 0;+ font-size: 100%;+ vertical-align: middle;+}+button, input {+ *overflow: visible;+ line-height: normal;+}+button::-moz-focus-inner, input::-moz-focus-inner {+ padding: 0;+ border: 0;+}+button,+input[type="button"],+input[type="reset"],+input[type="submit"] {+ cursor: pointer;+ -webkit-appearance: button;+}+input[type="search"] {+ -webkit-appearance: textfield;+ -webkit-box-sizing: content-box;+ -moz-box-sizing: content-box;+ box-sizing: content-box;+}+input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button {+ -webkit-appearance: none;+}+textarea {+ overflow: auto;+ vertical-align: top;+}+.clearfix {+ *zoom: 1;+}+.clearfix:before, .clearfix:after {+ display: table;+ content: "";+}+.clearfix:after {+ clear: both;+}+body {+ margin: 0;+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+ font-size: 13px;+ line-height: 18px;+ color: #333333;+ background-color: #ffffff;+}+a {+ color: #0088cc;+ text-decoration: none;+}+a:hover {+ color: #005580;+ text-decoration: underline;+}+.row {+ margin-left: -20px;+ *zoom: 1;+}+.row:before, .row:after {+ display: table;+ content: "";+}+.row:after {+ clear: both;+}+[class*="span"] {+ float: left;+ margin-left: 20px;+}+.span1 {+ width: 60px;+}+.span2 {+ width: 140px;+}+.span3 {+ width: 220px;+}+.span4 {+ width: 300px;+}+.span5 {+ width: 380px;+}+.span6 {+ width: 460px;+}+.span7 {+ width: 540px;+}+.span8 {+ width: 620px;+}+.span9 {+ width: 700px;+}+.span10 {+ width: 780px;+}+.span11 {+ width: 860px;+}+.span12, .container {+ width: 940px;+}+.offset1 {+ margin-left: 100px;+}+.offset2 {+ margin-left: 180px;+}+.offset3 {+ margin-left: 260px;+}+.offset4 {+ margin-left: 340px;+}+.offset5 {+ margin-left: 420px;+}+.offset6 {+ margin-left: 500px;+}+.offset7 {+ margin-left: 580px;+}+.offset8 {+ margin-left: 660px;+}+.offset9 {+ margin-left: 740px;+}+.offset10 {+ margin-left: 820px;+}+.offset11 {+ margin-left: 900px;+}+.row-fluid {+ width: 100%;+ *zoom: 1;+}+.row-fluid:before, .row-fluid:after {+ display: table;+ content: "";+}+.row-fluid:after {+ clear: both;+}+.row-fluid > [class*="span"] {+ float: left;+ margin-left: 2.127659574%;+}+.row-fluid > [class*="span"]:first-child {+ margin-left: 0;+}+.row-fluid > .span1 {+ width: 6.382978723%;+}+.row-fluid > .span2 {+ width: 14.89361702%;+}+.row-fluid > .span3 {+ width: 23.404255317%;+}+.row-fluid > .span4 {+ width: 31.914893614%;+}+.row-fluid > .span5 {+ width: 40.425531911%;+}+.row-fluid > .span6 {+ width: 48.93617020799999%;+}+.row-fluid > .span7 {+ width: 57.446808505%;+}+.row-fluid > .span8 {+ width: 65.95744680199999%;+}+.row-fluid > .span9 {+ width: 74.468085099%;+}+.row-fluid > .span10 {+ width: 82.97872339599999%;+}+.row-fluid > .span11 {+ width: 91.489361693%;+}+.row-fluid > .span12 {+ width: 99.99999998999999%;+}+.container {+ width: 940px;+ margin-left: auto;+ margin-right: auto;+ *zoom: 1;+}+.container:before, .container:after {+ display: table;+ content: "";+}+.container:after {+ clear: both;+}+.container-fluid {+ padding-left: 20px;+ padding-right: 20px;+ *zoom: 1;+}+.container-fluid:before, .container-fluid:after {+ display: table;+ content: "";+}+.container-fluid:after {+ clear: both;+}+p {+ margin: 0 0 9px;+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+ font-size: 13px;+ line-height: 18px;+}+p small {+ font-size: 11px;+ color: #999999;+}+.lead {+ margin-bottom: 18px;+ font-size: 20px;+ font-weight: 200;+ line-height: 27px;+}+h1,+h2,+h3,+h4,+h5,+h6 {+ margin: 0;+ font-weight: bold;+ color: #333333;+ text-rendering: optimizelegibility;+}+h1 small,+h2 small,+h3 small,+h4 small,+h5 small,+h6 small {+ font-weight: normal;+ color: #999999;+}+h1 {+ font-size: 30px;+ line-height: 36px;+}+h1 small {+ font-size: 18px;+}+h2 {+ font-size: 24px;+ line-height: 36px;+}+h2 small {+ font-size: 18px;+}+h3 {+ line-height: 27px;+ font-size: 18px;+}+h3 small {+ font-size: 14px;+}+h4, h5, h6 {+ line-height: 18px;+}+h4 {+ font-size: 14px;+}+h4 small {+ font-size: 12px;+}+h5 {+ font-size: 12px;+}+h6 {+ font-size: 11px;+ color: #999999;+ text-transform: uppercase;+}+.page-header {+ padding-bottom: 17px;+ margin: 18px 0;+ border-bottom: 1px solid #eeeeee;+}+.page-header h1 {+ line-height: 1;+}+ul, ol {+ padding: 0;+ margin: 0 0 9px 25px;+}+ul ul,+ul ol,+ol ol,+ol ul {+ margin-bottom: 0;+}+ul {+ list-style: disc;+}+ol {+ list-style: decimal;+}+li {+ line-height: 18px;+}+ul.unstyled, ol.unstyled {+ margin-left: 0;+ list-style: none;+}+dl {+ margin-bottom: 18px;+}+dt, dd {+ line-height: 18px;+}+dt {+ font-weight: bold;+}+dd {+ margin-left: 9px;+}+hr {+ margin: 18px 0;+ border: 0;+ border-top: 1px solid #eeeeee;+ border-bottom: 1px solid #ffffff;+}+strong {+ font-weight: bold;+}+em {+ font-style: italic;+}+.muted {+ color: #999999;+}+abbr {+ font-size: 90%;+ text-transform: uppercase;+ border-bottom: 1px dotted #ddd;+ cursor: help;+}+blockquote {+ padding: 0 0 0 15px;+ margin: 0 0 18px;+ border-left: 5px solid #eeeeee;+}+blockquote p {+ margin-bottom: 0;+ font-size: 16px;+ font-weight: 300;+ line-height: 22.5px;+}+blockquote small {+ display: block;+ line-height: 18px;+ color: #999999;+}+blockquote small:before {+ content: '\2014 \00A0';+}+blockquote.pull-right {+ float: right;+ padding-left: 0;+ padding-right: 15px;+ border-left: 0;+ border-right: 5px solid #eeeeee;+}+blockquote.pull-right p, blockquote.pull-right small {+ text-align: right;+}+q:before,+q:after,+blockquote:before,+blockquote:after {+ content: "";+}+address {+ display: block;+ margin-bottom: 18px;+ line-height: 18px;+ font-style: normal;+}+small {+ font-size: 100%;+}+cite {+ font-style: normal;+}+code, pre {+ padding: 0 3px 2px;+ font-family: Menlo, Monaco, "Courier New", monospace;+ font-size: 12px;+ color: #333333;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+}+code {+ padding: 3px 4px;+ color: #d14;+ background-color: #f7f7f9;+ border: 1px solid #e1e1e8;+}+pre {+ display: block;+ padding: 8.5px;+ margin: 0 0 9px;+ font-size: 12px;+ line-height: 18px;+ background-color: #f5f5f5;+ border: 1px solid #ccc;+ border: 1px solid rgba(0, 0, 0, 0.15);+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ white-space: pre;+ white-space: pre-wrap;+ word-break: break-all;+ word-wrap: break-word;+}+pre.prettyprint {+ margin-bottom: 18px;+}+pre code {+ padding: 0;+ color: inherit;+ background-color: transparent;+ border: 0;+}+.pre-scrollable {+ max-height: 340px;+ overflow-y: scroll;+}+form {+ margin: 0 0 18px;+}+fieldset {+ padding: 0;+ margin: 0;+ border: 0;+}+legend {+ display: block;+ width: 100%;+ padding: 0;+ margin-bottom: 27px;+ font-size: 19.5px;+ line-height: 36px;+ color: #333333;+ border: 0;+ border-bottom: 1px solid #eee;+}+legend small {+ font-size: 13.5px;+ color: #999999;+}+label,+input,+button,+select,+textarea {+ font-size: 13px;+ font-weight: normal;+ line-height: 18px;+}+input,+button,+select,+textarea {+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+}+label {+ display: block;+ margin-bottom: 5px;+ color: #333333;+}+input,+textarea,+select,+.uneditable-input {+ display: inline-block;+ width: 210px;+ height: 18px;+ padding: 4px;+ margin-bottom: 9px;+ font-size: 13px;+ line-height: 18px;+ color: #555555;+ border: 1px solid #ccc;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+}+.uneditable-textarea {+ width: auto;+ height: auto;+}+label input, label textarea, label select {+ display: block;+}+input[type="image"], input[type="checkbox"], input[type="radio"] {+ width: auto;+ height: auto;+ padding: 0;+ margin: 3px 0;+ *margin-top: 0;+ /* IE7 */++ line-height: normal;+ cursor: pointer;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+ border: 0 \9;+ /* IE9 and down */++}+input[type="image"] {+ border: 0;+}+input[type="file"] {+ width: auto;+ padding: initial;+ line-height: initial;+ border: initial;+ background-color: #ffffff;+ background-color: initial;+ -webkit-box-shadow: none;+ -moz-box-shadow: none;+ box-shadow: none;+}+input[type="button"], input[type="reset"], input[type="submit"] {+ width: auto;+ height: auto;+}+select, input[type="file"] {+ height: 28px;+ /* In IE7, the height of the select element cannot be changed by height, only font-size */++ *margin-top: 4px;+ /* For IE7, add top margin to align select with labels */++ line-height: 28px;+}+input[type="file"] {+ line-height: 18px \9;+}+select {+ width: 220px;+ background-color: #ffffff;+}+select[multiple], select[size] {+ height: auto;+}+input[type="image"] {+ -webkit-box-shadow: none;+ -moz-box-shadow: none;+ box-shadow: none;+}+textarea {+ height: auto;+}+input[type="hidden"] {+ display: none;+}+.radio, .checkbox {+ padding-left: 18px;+}+.radio input[type="radio"], .checkbox input[type="checkbox"] {+ float: left;+ margin-left: -18px;+}+.controls > .radio:first-child, .controls > .checkbox:first-child {+ padding-top: 5px;+}+.radio.inline, .checkbox.inline {+ display: inline-block;+ padding-top: 5px;+ margin-bottom: 0;+ vertical-align: middle;+}+.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline {+ margin-left: 10px;+}+input, textarea {+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);+ -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;+ -moz-transition: border linear 0.2s, box-shadow linear 0.2s;+ -ms-transition: border linear 0.2s, box-shadow linear 0.2s;+ -o-transition: border linear 0.2s, box-shadow linear 0.2s;+ transition: border linear 0.2s, box-shadow linear 0.2s;+}+input:focus, textarea:focus {+ border-color: rgba(82, 168, 236, 0.8);+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);+ outline: 0;+ outline: thin dotted \9;+ /* IE6-9 */++}+input[type="file"]:focus,+input[type="radio"]:focus,+input[type="checkbox"]:focus,+select:focus {+ -webkit-box-shadow: none;+ -moz-box-shadow: none;+ box-shadow: none;+ outline: thin dotted #333;+ outline: 5px auto -webkit-focus-ring-color;+ outline-offset: -2px;+}+.input-mini {+ width: 60px;+}+.input-small {+ width: 90px;+}+.input-medium {+ width: 150px;+}+.input-large {+ width: 210px;+}+.input-xlarge {+ width: 270px;+}+.input-xxlarge {+ width: 530px;+}+input[class*="span"],+select[class*="span"],+textarea[class*="span"],+.uneditable-input {+ float: none;+ margin-left: 0;+}+input.span1, textarea.span1, .uneditable-input.span1 {+ width: 50px;+}+input.span2, textarea.span2, .uneditable-input.span2 {+ width: 130px;+}+input.span3, textarea.span3, .uneditable-input.span3 {+ width: 210px;+}+input.span4, textarea.span4, .uneditable-input.span4 {+ width: 290px;+}+input.span5, textarea.span5, .uneditable-input.span5 {+ width: 370px;+}+input.span6, textarea.span6, .uneditable-input.span6 {+ width: 450px;+}+input.span7, textarea.span7, .uneditable-input.span7 {+ width: 530px;+}+input.span8, textarea.span8, .uneditable-input.span8 {+ width: 610px;+}+input.span9, textarea.span9, .uneditable-input.span9 {+ width: 690px;+}+input.span10, textarea.span10, .uneditable-input.span10 {+ width: 770px;+}+input.span11, textarea.span11, .uneditable-input.span11 {+ width: 850px;+}+input.span12, textarea.span12, .uneditable-input.span12 {+ width: 930px;+}+input[disabled],+select[disabled],+textarea[disabled],+input[readonly],+select[readonly],+textarea[readonly] {+ background-color: #f5f5f5;+ border-color: #ddd;+ cursor: not-allowed;+}+.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline {+ color: #c09853;+}+.control-group.warning input, .control-group.warning select, .control-group.warning textarea {+ color: #c09853;+ border-color: #c09853;+}+.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus {+ border-color: #a47e3c;+ -webkit-box-shadow: 0 0 6px #dbc59e;+ -moz-box-shadow: 0 0 6px #dbc59e;+ box-shadow: 0 0 6px #dbc59e;+}+.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on {+ color: #c09853;+ background-color: #fcf8e3;+ border-color: #c09853;+}+.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline {+ color: #b94a48;+}+.control-group.error input, .control-group.error select, .control-group.error textarea {+ color: #b94a48;+ border-color: #b94a48;+}+.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus {+ border-color: #953b39;+ -webkit-box-shadow: 0 0 6px #d59392;+ -moz-box-shadow: 0 0 6px #d59392;+ box-shadow: 0 0 6px #d59392;+}+.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on {+ color: #b94a48;+ background-color: #f2dede;+ border-color: #b94a48;+}+.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline {+ color: #468847;+}+.control-group.success input, .control-group.success select, .control-group.success textarea {+ color: #468847;+ border-color: #468847;+}+.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus {+ border-color: #356635;+ -webkit-box-shadow: 0 0 6px #7aba7b;+ -moz-box-shadow: 0 0 6px #7aba7b;+ box-shadow: 0 0 6px #7aba7b;+}+.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on {+ color: #468847;+ background-color: #dff0d8;+ border-color: #468847;+}+input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid {+ color: #b94a48;+ border-color: #ee5f5b;+}+input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus {+ border-color: #e9322d;+ -webkit-box-shadow: 0 0 6px #f8b9b7;+ -moz-box-shadow: 0 0 6px #f8b9b7;+ box-shadow: 0 0 6px #f8b9b7;+}+.form-actions {+ padding: 17px 20px 18px;+ margin-top: 18px;+ margin-bottom: 18px;+ background-color: #f5f5f5;+ border-top: 1px solid #ddd;+}+.uneditable-input {+ display: block;+ background-color: #ffffff;+ border-color: #eee;+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);+ cursor: not-allowed;+}+:-moz-placeholder {+ color: #999999;+}+::-webkit-input-placeholder {+ color: #999999;+}+.help-block {+ display: block;+ margin-top: 5px;+ margin-bottom: 0;+ color: #999999;+}+.help-inline {+ display: inline-block;+ *display: inline;+ /* IE7 inline-block hack */++ *zoom: 1;+ margin-bottom: 9px;+ vertical-align: middle;+ padding-left: 5px;+}+.input-prepend, .input-append {+ margin-bottom: 5px;+ *zoom: 1;+}+.input-prepend:before,+.input-append:before,+.input-prepend:after,+.input-append:after {+ display: table;+ content: "";+}+.input-prepend:after, .input-append:after {+ clear: both;+}+.input-prepend input,+.input-append input,+.input-prepend .uneditable-input,+.input-append .uneditable-input {+ -webkit-border-radius: 0 3px 3px 0;+ -moz-border-radius: 0 3px 3px 0;+ border-radius: 0 3px 3px 0;+}+.input-prepend input:focus,+.input-append input:focus,+.input-prepend .uneditable-input:focus,+.input-append .uneditable-input:focus {+ position: relative;+ z-index: 2;+}+.input-prepend .uneditable-input, .input-append .uneditable-input {+ border-left-color: #ccc;+}+.input-prepend .add-on, .input-append .add-on {+ float: left;+ display: block;+ width: auto;+ min-width: 16px;+ height: 18px;+ margin-right: -1px;+ padding: 4px 5px;+ font-weight: normal;+ line-height: 18px;+ color: #999999;+ text-align: center;+ text-shadow: 0 1px 0 #ffffff;+ background-color: #f5f5f5;+ border: 1px solid #ccc;+ -webkit-border-radius: 3px 0 0 3px;+ -moz-border-radius: 3px 0 0 3px;+ border-radius: 3px 0 0 3px;+}+.input-prepend .active, .input-append .active {+ background-color: #a9dba9;+ border-color: #46a546;+}+.input-prepend .add-on {+ *margin-top: 1px;+ /* IE6-7 */++}+.input-append input, .input-append .uneditable-input {+ float: left;+ -webkit-border-radius: 3px 0 0 3px;+ -moz-border-radius: 3px 0 0 3px;+ border-radius: 3px 0 0 3px;+}+.input-append .uneditable-input {+ border-left-color: #eee;+ border-right-color: #ccc;+}+.input-append .add-on {+ margin-right: 0;+ margin-left: -1px;+ -webkit-border-radius: 0 3px 3px 0;+ -moz-border-radius: 0 3px 3px 0;+ border-radius: 0 3px 3px 0;+}+.input-append input:first-child {+ *margin-left: -160px;+}+.input-append input:first-child + .add-on {+ *margin-left: -21px;+}+.search-query {+ padding-left: 14px;+ padding-right: 14px;+ margin-bottom: 0;+ -webkit-border-radius: 14px;+ -moz-border-radius: 14px;+ border-radius: 14px;+}+.form-search input,+.form-inline input,+.form-horizontal input,+.form-search textarea,+.form-inline textarea,+.form-horizontal textarea,+.form-search select,+.form-inline select,+.form-horizontal select,+.form-search .help-inline,+.form-inline .help-inline,+.form-horizontal .help-inline,+.form-search .uneditable-input,+.form-inline .uneditable-input,+.form-horizontal .uneditable-input {+ display: inline-block;+ margin-bottom: 0;+}+.form-search .hide, .form-inline .hide, .form-horizontal .hide {+ display: none;+}+.form-search label,+.form-inline label,+.form-search .input-append,+.form-inline .input-append,+.form-search .input-prepend,+.form-inline .input-prepend {+ display: inline-block;+}+.form-search .input-append .add-on,+.form-inline .input-prepend .add-on,+.form-search .input-append .add-on,+.form-inline .input-prepend .add-on {+ vertical-align: middle;+}+.form-search .radio,+.form-inline .radio,+.form-search .checkbox,+.form-inline .checkbox {+ margin-bottom: 0;+ vertical-align: middle;+}+.control-group {+ margin-bottom: 9px;+}+legend + .control-group {+ margin-top: 18px;+ -webkit-margin-top-collapse: separate;+}+.form-horizontal .control-group {+ margin-bottom: 18px;+ *zoom: 1;+}+.form-horizontal .control-group:before, .form-horizontal .control-group:after {+ display: table;+ content: "";+}+.form-horizontal .control-group:after {+ clear: both;+}+.form-horizontal .control-label {+ float: left;+ width: 140px;+ padding-top: 5px;+ text-align: right;+}+.form-horizontal .controls {+ margin-left: 160px;+}+.form-horizontal .form-actions {+ padding-left: 160px;+}+table {+ max-width: 100%;+ border-collapse: collapse;+ border-spacing: 0;+}+.table {+ width: 100%;+ margin-bottom: 18px;+}+.table th, .table td {+ padding: 8px;+ line-height: 18px;+ text-align: left;+ vertical-align: top;+ border-top: 1px solid #ddd;+}+.table th {+ font-weight: bold;+}+.table thead th {+ vertical-align: bottom;+}+.table thead:first-child tr th, .table thead:first-child tr td {+ border-top: 0;+}+.table tbody + tbody {+ border-top: 2px solid #ddd;+}+.table-condensed th, .table-condensed td {+ padding: 4px 5px;+}+.table-bordered {+ border: 1px solid #ddd;+ border-collapse: separate;+ *border-collapse: collapsed;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.table-bordered th + th,+.table-bordered td + td,+.table-bordered th + td,+.table-bordered td + th {+ border-left: 1px solid #ddd;+}+.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td {+ border-top: 0;+}+.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {+ -webkit-border-radius: 4px 0 0 0;+ -moz-border-radius: 4px 0 0 0;+ border-radius: 4px 0 0 0;+}+.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child {+ -webkit-border-radius: 0 4px 0 0;+ -moz-border-radius: 0 4px 0 0;+ border-radius: 0 4px 0 0;+}+.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child {+ -webkit-border-radius: 0 0 0 4px;+ -moz-border-radius: 0 0 0 4px;+ border-radius: 0 0 0 4px;+}+.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child {+ -webkit-border-radius: 0 0 4px 0;+ -moz-border-radius: 0 0 4px 0;+ border-radius: 0 0 4px 0;+}+.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th {+ background-color: #f9f9f9;+}+.table tbody tr:hover td, .table tbody tr:hover th {+ background-color: #f5f5f5;+}+table .span1 {+ float: none;+ width: 44px;+ margin-left: 0;+}+table .span2 {+ float: none;+ width: 124px;+ margin-left: 0;+}+table .span3 {+ float: none;+ width: 204px;+ margin-left: 0;+}+table .span4 {+ float: none;+ width: 284px;+ margin-left: 0;+}+table .span5 {+ float: none;+ width: 364px;+ margin-left: 0;+}+table .span6 {+ float: none;+ width: 444px;+ margin-left: 0;+}+table .span7 {+ float: none;+ width: 524px;+ margin-left: 0;+}+table .span8 {+ float: none;+ width: 604px;+ margin-left: 0;+}+table .span9 {+ float: none;+ width: 684px;+ margin-left: 0;+}+table .span10 {+ float: none;+ width: 764px;+ margin-left: 0;+}+table .span11 {+ float: none;+ width: 844px;+ margin-left: 0;+}+table .span12 {+ float: none;+ width: 924px;+ margin-left: 0;+}+[class^="icon-"], [class*=" icon-"] {+ display: inline-block;+ width: 14px;+ height: 14px;+ line-height: 14px;+ vertical-align: text-top;+ background-image: url("../img/glyphicons-halflings.png");+ background-position: 14px 14px;+ background-repeat: no-repeat;+ *margin-right: .3em;+}+[class^="icon-"]:last-child, [class*=" icon-"]:last-child {+ *margin-left: 0;+}+.icon-white {+ background-image: url("../img/glyphicons-halflings-white.png");+}+.icon-glass {+ background-position: 0 0;+}+.icon-music {+ background-position: -24px 0;+}+.icon-search {+ background-position: -48px 0;+}+.icon-envelope {+ background-position: -72px 0;+}+.icon-heart {+ background-position: -96px 0;+}+.icon-star {+ background-position: -120px 0;+}+.icon-star-empty {+ background-position: -144px 0;+}+.icon-user {+ background-position: -168px 0;+}+.icon-film {+ background-position: -192px 0;+}+.icon-th-large {+ background-position: -216px 0;+}+.icon-th {+ background-position: -240px 0;+}+.icon-th-list {+ background-position: -264px 0;+}+.icon-ok {+ background-position: -288px 0;+}+.icon-remove {+ background-position: -312px 0;+}+.icon-zoom-in {+ background-position: -336px 0;+}+.icon-zoom-out {+ background-position: -360px 0;+}+.icon-off {+ background-position: -384px 0;+}+.icon-signal {+ background-position: -408px 0;+}+.icon-cog {+ background-position: -432px 0;+}+.icon-trash {+ background-position: -456px 0;+}+.icon-home {+ background-position: 0 -24px;+}+.icon-file {+ background-position: -24px -24px;+}+.icon-time {+ background-position: -48px -24px;+}+.icon-road {+ background-position: -72px -24px;+}+.icon-download-alt {+ background-position: -96px -24px;+}+.icon-download {+ background-position: -120px -24px;+}+.icon-upload {+ background-position: -144px -24px;+}+.icon-inbox {+ background-position: -168px -24px;+}+.icon-play-circle {+ background-position: -192px -24px;+}+.icon-repeat {+ background-position: -216px -24px;+}+.icon-refresh {+ background-position: -240px -24px;+}+.icon-list-alt {+ background-position: -264px -24px;+}+.icon-lock {+ background-position: -287px -24px;+}+.icon-flag {+ background-position: -312px -24px;+}+.icon-headphones {+ background-position: -336px -24px;+}+.icon-volume-off {+ background-position: -360px -24px;+}+.icon-volume-down {+ background-position: -384px -24px;+}+.icon-volume-up {+ background-position: -408px -24px;+}+.icon-qrcode {+ background-position: -432px -24px;+}+.icon-barcode {+ background-position: -456px -24px;+}+.icon-tag {+ background-position: 0 -48px;+}+.icon-tags {+ background-position: -25px -48px;+}+.icon-book {+ background-position: -48px -48px;+}+.icon-bookmark {+ background-position: -72px -48px;+}+.icon-print {+ background-position: -96px -48px;+}+.icon-camera {+ background-position: -120px -48px;+}+.icon-font {+ background-position: -144px -48px;+}+.icon-bold {+ background-position: -167px -48px;+}+.icon-italic {+ background-position: -192px -48px;+}+.icon-text-height {+ background-position: -216px -48px;+}+.icon-text-width {+ background-position: -240px -48px;+}+.icon-align-left {+ background-position: -264px -48px;+}+.icon-align-center {+ background-position: -288px -48px;+}+.icon-align-right {+ background-position: -312px -48px;+}+.icon-align-justify {+ background-position: -336px -48px;+}+.icon-list {+ background-position: -360px -48px;+}+.icon-indent-left {+ background-position: -384px -48px;+}+.icon-indent-right {+ background-position: -408px -48px;+}+.icon-facetime-video {+ background-position: -432px -48px;+}+.icon-picture {+ background-position: -456px -48px;+}+.icon-pencil {+ background-position: 0 -72px;+}+.icon-map-marker {+ background-position: -24px -72px;+}+.icon-adjust {+ background-position: -48px -72px;+}+.icon-tint {+ background-position: -72px -72px;+}+.icon-edit {+ background-position: -96px -72px;+}+.icon-share {+ background-position: -120px -72px;+}+.icon-check {+ background-position: -144px -72px;+}+.icon-move {+ background-position: -168px -72px;+}+.icon-step-backward {+ background-position: -192px -72px;+}+.icon-fast-backward {+ background-position: -216px -72px;+}+.icon-backward {+ background-position: -240px -72px;+}+.icon-play {+ background-position: -264px -72px;+}+.icon-pause {+ background-position: -288px -72px;+}+.icon-stop {+ background-position: -312px -72px;+}+.icon-forward {+ background-position: -336px -72px;+}+.icon-fast-forward {+ background-position: -360px -72px;+}+.icon-step-forward {+ background-position: -384px -72px;+}+.icon-eject {+ background-position: -408px -72px;+}+.icon-chevron-left {+ background-position: -432px -72px;+}+.icon-chevron-right {+ background-position: -456px -72px;+}+.icon-plus-sign {+ background-position: 0 -96px;+}+.icon-minus-sign {+ background-position: -24px -96px;+}+.icon-remove-sign {+ background-position: -48px -96px;+}+.icon-ok-sign {+ background-position: -72px -96px;+}+.icon-question-sign {+ background-position: -96px -96px;+}+.icon-info-sign {+ background-position: -120px -96px;+}+.icon-screenshot {+ background-position: -144px -96px;+}+.icon-remove-circle {+ background-position: -168px -96px;+}+.icon-ok-circle {+ background-position: -192px -96px;+}+.icon-ban-circle {+ background-position: -216px -96px;+}+.icon-arrow-left {+ background-position: -240px -96px;+}+.icon-arrow-right {+ background-position: -264px -96px;+}+.icon-arrow-up {+ background-position: -289px -96px;+}+.icon-arrow-down {+ background-position: -312px -96px;+}+.icon-share-alt {+ background-position: -336px -96px;+}+.icon-resize-full {+ background-position: -360px -96px;+}+.icon-resize-small {+ background-position: -384px -96px;+}+.icon-plus {+ background-position: -408px -96px;+}+.icon-minus {+ background-position: -433px -96px;+}+.icon-asterisk {+ background-position: -456px -96px;+}+.icon-exclamation-sign {+ background-position: 0 -120px;+}+.icon-gift {+ background-position: -24px -120px;+}+.icon-leaf {+ background-position: -48px -120px;+}+.icon-fire {+ background-position: -72px -120px;+}+.icon-eye-open {+ background-position: -96px -120px;+}+.icon-eye-close {+ background-position: -120px -120px;+}+.icon-warning-sign {+ background-position: -144px -120px;+}+.icon-plane {+ background-position: -168px -120px;+}+.icon-calendar {+ background-position: -192px -120px;+}+.icon-random {+ background-position: -216px -120px;+}+.icon-comment {+ background-position: -240px -120px;+}+.icon-magnet {+ background-position: -264px -120px;+}+.icon-chevron-up {+ background-position: -288px -120px;+}+.icon-chevron-down {+ background-position: -313px -119px;+}+.icon-retweet {+ background-position: -336px -120px;+}+.icon-shopping-cart {+ background-position: -360px -120px;+}+.icon-folder-close {+ background-position: -384px -120px;+}+.icon-folder-open {+ background-position: -408px -120px;+}+.icon-resize-vertical {+ background-position: -432px -119px;+}+.icon-resize-horizontal {+ background-position: -456px -118px;+}+.dropdown {+ position: relative;+}+.dropdown-toggle {+ *margin-bottom: -3px;+}+.dropdown-toggle:active, .open .dropdown-toggle {+ outline: 0;+}+.caret {+ display: inline-block;+ width: 0;+ height: 0;+ text-indent: -99999px;+ *text-indent: 0;+ vertical-align: top;+ border-left: 4px solid transparent;+ border-right: 4px solid transparent;+ border-top: 4px solid #000000;+ opacity: 0.3;+ filter: alpha(opacity=30);+ content: "\2193";+}+.dropdown .caret {+ margin-top: 8px;+ margin-left: 2px;+}+.dropdown:hover .caret, .open.dropdown .caret {+ opacity: 1;+ filter: alpha(opacity=100);+}+.dropdown-menu {+ position: absolute;+ top: 100%;+ left: 0;+ z-index: 1000;+ float: left;+ display: none;+ min-width: 160px;+ _width: 160px;+ padding: 4px 0;+ margin: 0;+ list-style: none;+ background-color: #ffffff;+ border-color: #ccc;+ border-color: rgba(0, 0, 0, 0.2);+ border-style: solid;+ border-width: 1px;+ -webkit-border-radius: 0 0 5px 5px;+ -moz-border-radius: 0 0 5px 5px;+ border-radius: 0 0 5px 5px;+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);+ -webkit-background-clip: padding-box;+ -moz-background-clip: padding;+ background-clip: padding-box;+ *border-right-width: 2px;+ *border-bottom-width: 2px;+}+.dropdown-menu.bottom-up {+ top: auto;+ bottom: 100%;+ margin-bottom: 2px;+}+.dropdown-menu .divider {+ height: 1px;+ margin: 5px 1px;+ overflow: hidden;+ background-color: #e5e5e5;+ border-bottom: 1px solid #ffffff;+ *width: 100%;+ *margin: -5px 0 5px;+}+.dropdown-menu a {+ display: block;+ padding: 3px 15px;+ clear: both;+ font-weight: normal;+ line-height: 18px;+ color: #555555;+ white-space: nowrap;+}+.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover {+ color: #ffffff;+ text-decoration: none;+ background-color: #0088cc;+}+.dropdown.open {+ *z-index: 1000;+}+.dropdown.open .dropdown-toggle {+ color: #ffffff;+ background: #ccc;+ background: rgba(0, 0, 0, 0.3);+}+.dropdown.open .dropdown-menu {+ display: block;+}+.typeahead {+ margin-top: 2px;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.well {+ min-height: 20px;+ padding: 19px;+ margin-bottom: 20px;+ background-color: #f5f5f5;+ border: 1px solid #eee;+ border: 1px solid rgba(0, 0, 0, 0.05);+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);+}+.well blockquote {+ border-color: #ddd;+ border-color: rgba(0, 0, 0, 0.15);+}+.fade {+ -webkit-transition: opacity 0.15s linear;+ -moz-transition: opacity 0.15s linear;+ -ms-transition: opacity 0.15s linear;+ -o-transition: opacity 0.15s linear;+ transition: opacity 0.15s linear;+ opacity: 0;+}+.fade.in {+ opacity: 1;+}+.collapse {+ -webkit-transition: height 0.35s ease;+ -moz-transition: height 0.35s ease;+ -ms-transition: height 0.35s ease;+ -o-transition: height 0.35s ease;+ transition: height 0.35s ease;+ position: relative;+ overflow: hidden;+ height: 0;+}+.collapse.in {+ height: auto;+}+.close {+ float: right;+ font-size: 20px;+ font-weight: bold;+ line-height: 18px;+ color: #000000;+ text-shadow: 0 1px 0 #ffffff;+ opacity: 0.2;+ filter: alpha(opacity=20);+}+.close:hover {+ color: #000000;+ text-decoration: none;+ opacity: 0.4;+ filter: alpha(opacity=40);+ cursor: pointer;+}+.btn {+ display: inline-block;+ padding: 4px 10px 4px;+ margin-bottom: 0;+ font-size: 13px;+ line-height: 18px;+ color: #333333;+ text-align: center;+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);+ vertical-align: middle;+ background-color: #f5f5f5;+ background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);+ background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));+ background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);+ background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);+ background-image: linear-gradient(top, #ffffff, #e6e6e6);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ border: 1px solid #ccc;+ border-bottom-color: #bbb;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+ cursor: pointer;+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ *margin-left: .3em;+}+.btn:hover,+.btn:active,+.btn.active,+.btn.disabled,+.btn[disabled] {+ background-color: #e6e6e6;+}+.btn:active, .btn.active {+ background-color: #cccccc \9;+}+.btn:first-child {+ *margin-left: 0;+}+.btn:hover {+ color: #333333;+ text-decoration: none;+ background-color: #e6e6e6;+ background-position: 0 -15px;+ -webkit-transition: background-position 0.1s linear;+ -moz-transition: background-position 0.1s linear;+ -ms-transition: background-position 0.1s linear;+ -o-transition: background-position 0.1s linear;+ transition: background-position 0.1s linear;+}+.btn:focus {+ outline: thin dotted #333;+ outline: 5px auto -webkit-focus-ring-color;+ outline-offset: -2px;+}+.btn.active, .btn:active {+ background-image: none;+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+ background-color: #e6e6e6;+ background-color: #d9d9d9 \9;+ outline: 0;+}+.btn.disabled, .btn[disabled] {+ cursor: default;+ background-image: none;+ background-color: #e6e6e6;+ opacity: 0.65;+ filter: alpha(opacity=65);+ -webkit-box-shadow: none;+ -moz-box-shadow: none;+ box-shadow: none;+}+.btn-large {+ padding: 9px 14px;+ font-size: 15px;+ line-height: normal;+ -webkit-border-radius: 5px;+ -moz-border-radius: 5px;+ border-radius: 5px;+}+.btn-large [class^="icon-"] {+ margin-top: 1px;+}+.btn-small {+ padding: 5px 9px;+ font-size: 11px;+ line-height: 16px;+}+.btn-small [class^="icon-"] {+ margin-top: -1px;+}+.btn-mini {+ padding: 2px 6px;+ font-size: 11px;+ line-height: 14px;+}+.btn-primary,+.btn-primary:hover,+.btn-warning,+.btn-warning:hover,+.btn-danger,+.btn-danger:hover,+.btn-success,+.btn-success:hover,+.btn-info,+.btn-info:hover,+.btn-inverse,+.btn-inverse:hover {+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+ color: #ffffff;+}+.btn-primary.active,+.btn-warning.active,+.btn-danger.active,+.btn-success.active,+.btn-info.active,+.btn-dark.active {+ color: rgba(255, 255, 255, 0.75);+}+.btn-primary {+ background-color: #006dcc;+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);+ background-image: linear-gradient(top, #0088cc, #0044cc);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);+ border-color: #0044cc #0044cc #002a80;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-primary:hover,+.btn-primary:active,+.btn-primary.active,+.btn-primary.disabled,+.btn-primary[disabled] {+ background-color: #0044cc;+}+.btn-primary:active, .btn-primary.active {+ background-color: #003399 \9;+}+.btn-warning {+ background-color: #faa732;+ background-image: -moz-linear-gradient(top, #fbb450, #f89406);+ background-image: -ms-linear-gradient(top, #fbb450, #f89406);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));+ background-image: -webkit-linear-gradient(top, #fbb450, #f89406);+ background-image: -o-linear-gradient(top, #fbb450, #f89406);+ background-image: linear-gradient(top, #fbb450, #f89406);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);+ border-color: #f89406 #f89406 #ad6704;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-warning:hover,+.btn-warning:active,+.btn-warning.active,+.btn-warning.disabled,+.btn-warning[disabled] {+ background-color: #f89406;+}+.btn-warning:active, .btn-warning.active {+ background-color: #c67605 \9;+}+.btn-danger {+ background-color: #da4f49;+ background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);+ background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));+ background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);+ background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);+ background-image: linear-gradient(top, #ee5f5b, #bd362f);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);+ border-color: #bd362f #bd362f #802420;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-danger:hover,+.btn-danger:active,+.btn-danger.active,+.btn-danger.disabled,+.btn-danger[disabled] {+ background-color: #bd362f;+}+.btn-danger:active, .btn-danger.active {+ background-color: #942a25 \9;+}+.btn-success {+ background-color: #5bb75b;+ background-image: -moz-linear-gradient(top, #62c462, #51a351);+ background-image: -ms-linear-gradient(top, #62c462, #51a351);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));+ background-image: -webkit-linear-gradient(top, #62c462, #51a351);+ background-image: -o-linear-gradient(top, #62c462, #51a351);+ background-image: linear-gradient(top, #62c462, #51a351);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);+ border-color: #51a351 #51a351 #387038;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-success:hover,+.btn-success:active,+.btn-success.active,+.btn-success.disabled,+.btn-success[disabled] {+ background-color: #51a351;+}+.btn-success:active, .btn-success.active {+ background-color: #408140 \9;+}+.btn-info {+ background-color: #49afcd;+ background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);+ background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));+ background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);+ background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);+ background-image: linear-gradient(top, #5bc0de, #2f96b4);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);+ border-color: #2f96b4 #2f96b4 #1f6377;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-info:hover,+.btn-info:active,+.btn-info.active,+.btn-info.disabled,+.btn-info[disabled] {+ background-color: #2f96b4;+}+.btn-info:active, .btn-info.active {+ background-color: #24748c \9;+}+.btn-inverse {+ background-color: #393939;+ background-image: -moz-linear-gradient(top, #454545, #262626);+ background-image: -ms-linear-gradient(top, #454545, #262626);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));+ background-image: -webkit-linear-gradient(top, #454545, #262626);+ background-image: -o-linear-gradient(top, #454545, #262626);+ background-image: linear-gradient(top, #454545, #262626);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);+ border-color: #262626 #262626 #000000;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+}+.btn-inverse:hover,+.btn-inverse:active,+.btn-inverse.active,+.btn-inverse.disabled,+.btn-inverse[disabled] {+ background-color: #262626;+}+.btn-inverse:active, .btn-inverse.active {+ background-color: #0c0c0c \9;+}+button.btn, input[type="submit"].btn {+ *padding-top: 2px;+ *padding-bottom: 2px;+}+button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner {+ padding: 0;+ border: 0;+}+button.btn.large, input[type="submit"].btn.large {+ *padding-top: 7px;+ *padding-bottom: 7px;+}+button.btn.small, input[type="submit"].btn.small {+ *padding-top: 3px;+ *padding-bottom: 3px;+}+.btn-group {+ position: relative;+ *zoom: 1;+ *margin-left: .3em;+}+.btn-group:before, .btn-group:after {+ display: table;+ content: "";+}+.btn-group:after {+ clear: both;+}+.btn-group:first-child {+ *margin-left: 0;+}+.btn-group + .btn-group {+ margin-left: 5px;+}+.btn-toolbar {+ margin-top: 9px;+ margin-bottom: 9px;+}+.btn-toolbar .btn-group {+ display: inline-block;+ *display: inline;+ /* IE7 inline-block hack */++ *zoom: 1;+}+.btn-group .btn {+ position: relative;+ float: left;+ margin-left: -1px;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+}+.btn-group .btn:first-child {+ margin-left: 0;+ -webkit-border-top-left-radius: 4px;+ -moz-border-radius-topleft: 4px;+ border-top-left-radius: 4px;+ -webkit-border-bottom-left-radius: 4px;+ -moz-border-radius-bottomleft: 4px;+ border-bottom-left-radius: 4px;+}+.btn-group .btn:last-child, .btn-group .dropdown-toggle {+ -webkit-border-top-right-radius: 4px;+ -moz-border-radius-topright: 4px;+ border-top-right-radius: 4px;+ -webkit-border-bottom-right-radius: 4px;+ -moz-border-radius-bottomright: 4px;+ border-bottom-right-radius: 4px;+}+.btn-group .btn.large:first-child {+ margin-left: 0;+ -webkit-border-top-left-radius: 6px;+ -moz-border-radius-topleft: 6px;+ border-top-left-radius: 6px;+ -webkit-border-bottom-left-radius: 6px;+ -moz-border-radius-bottomleft: 6px;+ border-bottom-left-radius: 6px;+}+.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle {+ -webkit-border-top-right-radius: 6px;+ -moz-border-radius-topright: 6px;+ border-top-right-radius: 6px;+ -webkit-border-bottom-right-radius: 6px;+ -moz-border-radius-bottomright: 6px;+ border-bottom-right-radius: 6px;+}+.btn-group .btn:hover,+.btn-group .btn:focus,+.btn-group .btn:active,+.btn-group .btn.active {+ z-index: 2;+}+.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {+ outline: 0;+}+.btn-group .dropdown-toggle {+ padding-left: 8px;+ padding-right: 8px;+ -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+ box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);+ *padding-top: 5px;+ *padding-bottom: 5px;+}+.btn-group.open {+ *z-index: 1000;+}+.btn-group.open .dropdown-menu {+ display: block;+ margin-top: 1px;+ -webkit-border-radius: 5px;+ -moz-border-radius: 5px;+ border-radius: 5px;+}+.btn-group.open .dropdown-toggle {+ background-image: none;+ -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+ box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);+}+.btn .caret {+ margin-top: 7px;+ margin-left: 0;+}+.btn:hover .caret, .open.btn-group .caret {+ opacity: 1;+ filter: alpha(opacity=100);+}+.btn-primary .caret,+.btn-danger .caret,+.btn-info .caret,+.btn-success .caret,+.btn-inverse .caret {+ border-top-color: #ffffff;+ opacity: 0.75;+ filter: alpha(opacity=75);+}+.btn-small .caret {+ margin-top: 4px;+}+.alert {+ padding: 8px 35px 8px 14px;+ margin-bottom: 18px;+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+ background-color: #fcf8e3;+ border: 1px solid #fbeed5;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.alert, .alert-heading {+ color: #c09853;+}+.alert .close {+ position: relative;+ top: -2px;+ right: -21px;+ line-height: 18px;+}+.alert-success {+ background-color: #dff0d8;+ border-color: #d6e9c6;+}+.alert-success, .alert-success .alert-heading {+ color: #468847;+}+.alert-danger, .alert-error {+ background-color: #f2dede;+ border-color: #eed3d7;+}+.alert-danger,+.alert-error,+.alert-danger .alert-heading,+.alert-error .alert-heading {+ color: #b94a48;+}+.alert-info {+ background-color: #d9edf7;+ border-color: #bce8f1;+}+.alert-info, .alert-info .alert-heading {+ color: #3a87ad;+}+.alert-block {+ padding-top: 14px;+ padding-bottom: 14px;+}+.alert-block > p, .alert-block > ul {+ margin-bottom: 0;+}+.alert-block p + p {+ margin-top: 5px;+}+.nav {+ margin-left: 0;+ margin-bottom: 18px;+ list-style: none;+}+.nav > li > a {+ display: block;+}+.nav > li > a:hover {+ text-decoration: none;+ background-color: #eeeeee;+}+.nav .nav-header {+ display: block;+ padding: 3px 15px;+ font-size: 11px;+ font-weight: bold;+ line-height: 18px;+ color: #999999;+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+ text-transform: uppercase;+}+.nav li + .nav-header {+ margin-top: 9px;+}+.nav-list {+ padding-left: 14px;+ padding-right: 14px;+ margin-bottom: 0;+}+.nav-list > li > a, .nav-list .nav-header {+ margin-left: -15px;+ margin-right: -15px;+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);+}+.nav-list > li > a {+ padding: 3px 15px;+}+.nav-list .active > a, .nav-list .active > a:hover {+ color: #ffffff;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);+ background-color: #0088cc;+}+.nav-list [class^="icon-"] {+ margin-right: 2px;+}+.nav-tabs, .nav-pills {+ *zoom: 1;+}+.nav-tabs:before,+.nav-pills:before,+.nav-tabs:after,+.nav-pills:after {+ display: table;+ content: "";+}+.nav-tabs:after, .nav-pills:after {+ clear: both;+}+.nav-tabs > li, .nav-pills > li {+ float: left;+}+.nav-tabs > li > a, .nav-pills > li > a {+ padding-right: 12px;+ padding-left: 12px;+ margin-right: 2px;+ line-height: 14px;+}+.nav-tabs {+ border-bottom: 1px solid #ddd;+}+.nav-tabs > li {+ margin-bottom: -1px;+}+.nav-tabs > li > a {+ padding-top: 9px;+ padding-bottom: 9px;+ border: 1px solid transparent;+ -webkit-border-radius: 4px 4px 0 0;+ -moz-border-radius: 4px 4px 0 0;+ border-radius: 4px 4px 0 0;+}+.nav-tabs > li > a:hover {+ border-color: #eeeeee #eeeeee #dddddd;+}+.nav-tabs > .active > a, .nav-tabs > .active > a:hover {+ color: #555555;+ background-color: #ffffff;+ border: 1px solid #ddd;+ border-bottom-color: transparent;+ cursor: default;+}+.nav-pills > li > a {+ padding-top: 8px;+ padding-bottom: 8px;+ margin-top: 2px;+ margin-bottom: 2px;+ -webkit-border-radius: 5px;+ -moz-border-radius: 5px;+ border-radius: 5px;+}+.nav-pills .active > a, .nav-pills .active > a:hover {+ color: #ffffff;+ background-color: #0088cc;+}+.nav-stacked > li {+ float: none;+}+.nav-stacked > li > a {+ margin-right: 0;+}+.nav-tabs.nav-stacked {+ border-bottom: 0;+}+.nav-tabs.nav-stacked > li > a {+ border: 1px solid #ddd;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+}+.nav-tabs.nav-stacked > li:first-child > a {+ -webkit-border-radius: 4px 4px 0 0;+ -moz-border-radius: 4px 4px 0 0;+ border-radius: 4px 4px 0 0;+}+.nav-tabs.nav-stacked > li:last-child > a {+ -webkit-border-radius: 0 0 4px 4px;+ -moz-border-radius: 0 0 4px 4px;+ border-radius: 0 0 4px 4px;+}+.nav-tabs.nav-stacked > li > a:hover {+ border-color: #ddd;+ z-index: 2;+}+.nav-pills.nav-stacked > li > a {+ margin-bottom: 3px;+}+.nav-pills.nav-stacked > li:last-child > a {+ margin-bottom: 1px;+}+.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu {+ margin-top: 1px;+ border-width: 1px;+}+.nav-pills .dropdown-menu {+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret {+ border-top-color: #0088cc;+ margin-top: 6px;+}+.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret {+ border-top-color: #005580;+}+.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret {+ border-top-color: #333333;+}+.nav > .dropdown.active > a:hover {+ color: #000000;+ cursor: pointer;+}+.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover {+ color: #ffffff;+ background-color: #999999;+ border-color: #999999;+}+.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret {+ border-top-color: #ffffff;+ opacity: 1;+ filter: alpha(opacity=100);+}+.tabs-stacked .open > a:hover {+ border-color: #999999;+}+.tabbable {+ *zoom: 1;+}+.tabbable:before, .tabbable:after {+ display: table;+ content: "";+}+.tabbable:after {+ clear: both;+}+.tab-content {+ overflow: hidden;+}+.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs {+ border-bottom: 0;+}+.tab-content > .tab-pane, .pill-content > .pill-pane {+ display: none;+}+.tab-content > .active, .pill-content > .active {+ display: block;+}+.tabs-below .nav-tabs {+ border-top: 1px solid #ddd;+}+.tabs-below .nav-tabs > li {+ margin-top: -1px;+ margin-bottom: 0;+}+.tabs-below .nav-tabs > li > a {+ -webkit-border-radius: 0 0 4px 4px;+ -moz-border-radius: 0 0 4px 4px;+ border-radius: 0 0 4px 4px;+}+.tabs-below .nav-tabs > li > a:hover {+ border-bottom-color: transparent;+ border-top-color: #ddd;+}+.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover {+ border-color: transparent #ddd #ddd #ddd;+}+.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li {+ float: none;+}+.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a {+ min-width: 74px;+ margin-right: 0;+ margin-bottom: 3px;+}+.tabs-left .nav-tabs {+ float: left;+ margin-right: 19px;+ border-right: 1px solid #ddd;+}+.tabs-left .nav-tabs > li > a {+ margin-right: -1px;+ -webkit-border-radius: 4px 0 0 4px;+ -moz-border-radius: 4px 0 0 4px;+ border-radius: 4px 0 0 4px;+}+.tabs-left .nav-tabs > li > a:hover {+ border-color: #eeeeee #dddddd #eeeeee #eeeeee;+}+.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover {+ border-color: #ddd transparent #ddd #ddd;+ *border-right-color: #ffffff;+}+.tabs-right .nav-tabs {+ float: right;+ margin-left: 19px;+ border-left: 1px solid #ddd;+}+.tabs-right .nav-tabs > li > a {+ margin-left: -1px;+ -webkit-border-radius: 0 4px 4px 0;+ -moz-border-radius: 0 4px 4px 0;+ border-radius: 0 4px 4px 0;+}+.tabs-right .nav-tabs > li > a:hover {+ border-color: #eeeeee #eeeeee #eeeeee #dddddd;+}+.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover {+ border-color: #ddd #ddd #ddd transparent;+ *border-left-color: #ffffff;+}+.navbar {+ overflow: visible;+ margin-bottom: 18px;+}+.navbar-inner {+ padding-left: 20px;+ padding-right: 20px;+ background-color: #2c2c2c;+ background-image: -moz-linear-gradient(top, #333333, #222222);+ background-image: -ms-linear-gradient(top, #333333, #222222);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));+ background-image: -webkit-linear-gradient(top, #333333, #222222);+ background-image: -o-linear-gradient(top, #333333, #222222);+ background-image: linear-gradient(top, #333333, #222222);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);+}+.btn-navbar {+ display: none;+ float: right;+ padding: 7px 10px;+ margin-left: 5px;+ margin-right: 5px;+ background-color: #2c2c2c;+ background-image: -moz-linear-gradient(top, #333333, #222222);+ background-image: -ms-linear-gradient(top, #333333, #222222);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));+ background-image: -webkit-linear-gradient(top, #333333, #222222);+ background-image: -o-linear-gradient(top, #333333, #222222);+ background-image: linear-gradient(top, #333333, #222222);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);+ border-color: #222222 #222222 #000000;+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);+}+.btn-navbar:hover,+.btn-navbar:active,+.btn-navbar.active,+.btn-navbar.disabled,+.btn-navbar[disabled] {+ background-color: #222222;+}+.btn-navbar:active, .btn-navbar.active {+ background-color: #080808 \9;+}+.btn-navbar .icon-bar {+ display: block;+ width: 18px;+ height: 2px;+ background-color: #f5f5f5;+ -webkit-border-radius: 1px;+ -moz-border-radius: 1px;+ border-radius: 1px;+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+ -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);+}+.btn-navbar .icon-bar + .icon-bar {+ margin-top: 3px;+}+.nav-collapse.collapse {+ height: auto;+}+.navbar .brand:hover {+ text-decoration: none;+}+.navbar .brand {+ float: left;+ display: block;+ padding: 8px 20px 12px;+ margin-left: -20px;+ font-size: 20px;+ font-weight: 200;+ line-height: 1;+ color: #ffffff;+}+.navbar .navbar-text {+ margin-bottom: 0;+ line-height: 40px;+ color: #999999;+}+.navbar .navbar-text a:hover {+ color: #ffffff;+ background-color: transparent;+}+.navbar .btn, .navbar .btn-group {+ margin-top: 5px;+}+.navbar .btn-group .btn {+ margin-top: 0;+}+.navbar-form {+ margin-bottom: 0;+ *zoom: 1;+}+.navbar-form:before, .navbar-form:after {+ display: table;+ content: "";+}+.navbar-form:after {+ clear: both;+}+.navbar-form input, .navbar-form select {+ display: inline-block;+ margin-top: 5px;+ margin-bottom: 0;+}+.navbar-form .radio, .navbar-form .checkbox {+ margin-top: 5px;+}+.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] {+ margin-top: 3px;+}+.navbar-form .input-append, .navbar-form .input-prepend {+ margin-top: 6px;+ white-space: nowrap;+}+.navbar-form .input-append input, .navbar-form .input-prepend input {+ margin-top: 0;+}+.navbar-search {+ position: relative;+ float: left;+ margin-top: 6px;+ margin-bottom: 0;+}+.navbar-search .search-query {+ padding: 4px 9px;+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;+ font-size: 13px;+ font-weight: normal;+ line-height: 1;+ color: #ffffff;+ color: rgba(255, 255, 255, 0.75);+ background: #666;+ background: rgba(255, 255, 255, 0.3);+ border: 1px solid #111;+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15);+ -webkit-transition: none;+ -moz-transition: none;+ -ms-transition: none;+ -o-transition: none;+ transition: none;+}+.navbar-search .search-query :-moz-placeholder {+ color: #eeeeee;+}+.navbar-search .search-query::-webkit-input-placeholder {+ color: #eeeeee;+}+.navbar-search .search-query:hover {+ color: #ffffff;+ background-color: #999999;+ background-color: rgba(255, 255, 255, 0.5);+}+.navbar-search .search-query:focus, .navbar-search .search-query.focused {+ padding: 5px 10px;+ color: #333333;+ text-shadow: 0 1px 0 #ffffff;+ background-color: #ffffff;+ border: 0;+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+ -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);+ outline: 0;+}+.navbar-fixed-top {+ position: fixed;+ top: 0;+ right: 0;+ left: 0;+ z-index: 1030;+}+.navbar-fixed-top .navbar-inner {+ padding-left: 0;+ padding-right: 0;+ -webkit-border-radius: 0;+ -moz-border-radius: 0;+ border-radius: 0;+}+.navbar .nav {+ position: relative;+ left: 0;+ display: block;+ float: left;+ margin: 0 10px 0 0;+}+.navbar .nav.pull-right {+ float: right;+}+.navbar .nav > li {+ display: block;+ float: left;+}+.navbar .nav > li > a {+ float: none;+ padding: 10px 10px 11px;+ line-height: 19px;+ color: #999999;+ text-decoration: none;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+}+.navbar .nav > li > a:hover {+ background-color: transparent;+ color: #ffffff;+ text-decoration: none;+}+.navbar .nav .active > a, .navbar .nav .active > a:hover {+ color: #ffffff;+ text-decoration: none;+ background-color: #222222;+}+.navbar .divider-vertical {+ height: 40px;+ width: 1px;+ margin: 0 9px;+ overflow: hidden;+ background-color: #222222;+ border-right: 1px solid #333333;+}+.navbar .nav.pull-right {+ margin-left: 10px;+ margin-right: 0;+}+.navbar .dropdown-menu {+ margin-top: 1px;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.navbar .dropdown-menu:before {+ content: '';+ display: inline-block;+ border-left: 7px solid transparent;+ border-right: 7px solid transparent;+ border-bottom: 7px solid #ccc;+ border-bottom-color: rgba(0, 0, 0, 0.2);+ position: absolute;+ top: -7px;+ left: 9px;+}+.navbar .dropdown-menu:after {+ content: '';+ display: inline-block;+ border-left: 6px solid transparent;+ border-right: 6px solid transparent;+ border-bottom: 6px solid #ffffff;+ position: absolute;+ top: -6px;+ left: 10px;+}+.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret {+ border-top-color: #ffffff;+}+.navbar .nav .active .caret {+ opacity: 1;+ filter: alpha(opacity=100);+}+.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle {+ background-color: transparent;+}+.navbar .nav .active > .dropdown-toggle:hover {+ color: #ffffff;+}+.navbar .nav.pull-right .dropdown-menu {+ left: auto;+ right: 0;+}+.navbar .nav.pull-right .dropdown-menu:before {+ left: auto;+ right: 12px;+}+.navbar .nav.pull-right .dropdown-menu:after {+ left: auto;+ right: 13px;+}+.breadcrumb {+ padding: 7px 14px;+ margin: 0 0 18px;+ background-color: #fbfbfb;+ background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);+ background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));+ background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);+ background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);+ background-image: linear-gradient(top, #ffffff, #f5f5f5);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);+ border: 1px solid #ddd;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+ -webkit-box-shadow: inset 0 1px 0 #ffffff;+ -moz-box-shadow: inset 0 1px 0 #ffffff;+ box-shadow: inset 0 1px 0 #ffffff;+}+.breadcrumb li {+ display: inline-block;+ text-shadow: 0 1px 0 #ffffff;+}+.breadcrumb .divider {+ padding: 0 5px;+ color: #999999;+}+.breadcrumb .active a {+ color: #333333;+}+.pagination {+ height: 36px;+ margin: 18px 0;+}+.pagination ul {+ display: inline-block;+ *display: inline;+ /* IE7 inline-block hack */++ *zoom: 1;+ margin-left: 0;+ margin-bottom: 0;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);+}+.pagination li {+ display: inline;+}+.pagination a {+ float: left;+ padding: 0 14px;+ line-height: 34px;+ text-decoration: none;+ border: 1px solid #ddd;+ border-left-width: 0;+}+.pagination a:hover, .pagination .active a {+ background-color: #f5f5f5;+}+.pagination .active a {+ color: #999999;+ cursor: default;+}+.pagination .disabled a, .pagination .disabled a:hover {+ color: #999999;+ background-color: transparent;+ cursor: default;+}+.pagination li:first-child a {+ border-left-width: 1px;+ -webkit-border-radius: 3px 0 0 3px;+ -moz-border-radius: 3px 0 0 3px;+ border-radius: 3px 0 0 3px;+}+.pagination li:last-child a {+ -webkit-border-radius: 0 3px 3px 0;+ -moz-border-radius: 0 3px 3px 0;+ border-radius: 0 3px 3px 0;+}+.pagination-centered {+ text-align: center;+}+.pagination-right {+ text-align: right;+}+.pager {+ margin-left: 0;+ margin-bottom: 18px;+ list-style: none;+ text-align: center;+ *zoom: 1;+}+.pager:before, .pager:after {+ display: table;+ content: "";+}+.pager:after {+ clear: both;+}+.pager li {+ display: inline;+}+.pager a {+ display: inline-block;+ padding: 5px 14px;+ background-color: #fff;+ border: 1px solid #ddd;+ -webkit-border-radius: 15px;+ -moz-border-radius: 15px;+ border-radius: 15px;+}+.pager a:hover {+ text-decoration: none;+ background-color: #f5f5f5;+}+.pager .next a {+ float: right;+}+.pager .previous a {+ float: left;+}+.modal-open .dropdown-menu {+ z-index: 2050;+}+.modal-open .dropdown.open {+ *z-index: 2050;+}+.modal-open .popover {+ z-index: 2060;+}+.modal-open .tooltip {+ z-index: 2070;+}+.modal-backdrop {+ position: fixed;+ top: 0;+ right: 0;+ bottom: 0;+ left: 0;+ z-index: 1040;+ background-color: #000000;+}+.modal-backdrop.fade {+ opacity: 0;+}+.modal-backdrop, .modal-backdrop.fade.in {+ opacity: 0.8;+ filter: alpha(opacity=80);+}+.modal {+ position: fixed;+ top: 50%;+ left: 50%;+ z-index: 1050;+ max-height: 500px;+ overflow: auto;+ width: 560px;+ margin: -250px 0 0 -280px;+ background-color: #ffffff;+ border: 1px solid #999;+ border: 1px solid rgba(0, 0, 0, 0.3);+ *border: 1px solid #999;+ /* IE6-7 */++ -webkit-border-radius: 6px;+ -moz-border-radius: 6px;+ border-radius: 6px;+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+ -webkit-background-clip: padding-box;+ -moz-background-clip: padding-box;+ background-clip: padding-box;+}+.modal.fade {+ -webkit-transition: opacity .3s linear, top .3s ease-out;+ -moz-transition: opacity .3s linear, top .3s ease-out;+ -ms-transition: opacity .3s linear, top .3s ease-out;+ -o-transition: opacity .3s linear, top .3s ease-out;+ transition: opacity .3s linear, top .3s ease-out;+ top: -25%;+}+.modal.fade.in {+ top: 50%;+}+.modal-header {+ padding: 9px 15px;+ border-bottom: 1px solid #eee;+}+.modal-header .close {+ margin-top: 2px;+}+.modal-body {+ padding: 15px;+}+.modal-body .modal-form {+ margin-bottom: 0;+}+.modal-footer {+ padding: 14px 15px 15px;+ margin-bottom: 0;+ background-color: #f5f5f5;+ border-top: 1px solid #ddd;+ -webkit-border-radius: 0 0 6px 6px;+ -moz-border-radius: 0 0 6px 6px;+ border-radius: 0 0 6px 6px;+ -webkit-box-shadow: inset 0 1px 0 #ffffff;+ -moz-box-shadow: inset 0 1px 0 #ffffff;+ box-shadow: inset 0 1px 0 #ffffff;+ *zoom: 1;+}+.modal-footer:before, .modal-footer:after {+ display: table;+ content: "";+}+.modal-footer:after {+ clear: both;+}+.modal-footer .btn {+ float: right;+ margin-left: 5px;+ margin-bottom: 0;+}+.tooltip {+ position: absolute;+ z-index: 1020;+ display: block;+ visibility: visible;+ padding: 5px;+ font-size: 11px;+ opacity: 0;+ filter: alpha(opacity=0);+}+.tooltip.in {+ opacity: 0.8;+ filter: alpha(opacity=80);+}+.tooltip.top {+ margin-top: -2px;+}+.tooltip.right {+ margin-left: 2px;+}+.tooltip.bottom {+ margin-top: 2px;+}+.tooltip.left {+ margin-left: -2px;+}+.tooltip.top .tooltip-arrow {+ bottom: 0;+ left: 50%;+ margin-left: -5px;+ border-left: 5px solid transparent;+ border-right: 5px solid transparent;+ border-top: 5px solid #000000;+}+.tooltip.left .tooltip-arrow {+ top: 50%;+ right: 0;+ margin-top: -5px;+ border-top: 5px solid transparent;+ border-bottom: 5px solid transparent;+ border-left: 5px solid #000000;+}+.tooltip.bottom .tooltip-arrow {+ top: 0;+ left: 50%;+ margin-left: -5px;+ border-left: 5px solid transparent;+ border-right: 5px solid transparent;+ border-bottom: 5px solid #000000;+}+.tooltip.right .tooltip-arrow {+ top: 50%;+ left: 0;+ margin-top: -5px;+ border-top: 5px solid transparent;+ border-bottom: 5px solid transparent;+ border-right: 5px solid #000000;+}+.tooltip-inner {+ max-width: 200px;+ padding: 3px 8px;+ color: #ffffff;+ text-align: center;+ text-decoration: none;+ background-color: #000000;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.tooltip-arrow {+ position: absolute;+ width: 0;+ height: 0;+}+.popover {+ position: absolute;+ top: 0;+ left: 0;+ z-index: 1010;+ display: none;+ padding: 5px;+}+.popover.top {+ margin-top: -5px;+}+.popover.right {+ margin-left: 5px;+}+.popover.bottom {+ margin-top: 5px;+}+.popover.left {+ margin-left: -5px;+}+.popover.top .arrow {+ bottom: 0;+ left: 50%;+ margin-left: -5px;+ border-left: 5px solid transparent;+ border-right: 5px solid transparent;+ border-top: 5px solid #000000;+}+.popover.right .arrow {+ top: 50%;+ left: 0;+ margin-top: -5px;+ border-top: 5px solid transparent;+ border-bottom: 5px solid transparent;+ border-right: 5px solid #000000;+}+.popover.bottom .arrow {+ top: 0;+ left: 50%;+ margin-left: -5px;+ border-left: 5px solid transparent;+ border-right: 5px solid transparent;+ border-bottom: 5px solid #000000;+}+.popover.left .arrow {+ top: 50%;+ right: 0;+ margin-top: -5px;+ border-top: 5px solid transparent;+ border-bottom: 5px solid transparent;+ border-left: 5px solid #000000;+}+.popover .arrow {+ position: absolute;+ width: 0;+ height: 0;+}+.popover-inner {+ padding: 3px;+ width: 280px;+ overflow: hidden;+ background: #000000;+ background: rgba(0, 0, 0, 0.8);+ -webkit-border-radius: 6px;+ -moz-border-radius: 6px;+ border-radius: 6px;+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);+}+.popover-title {+ padding: 9px 15px;+ line-height: 1;+ background-color: #f5f5f5;+ border-bottom: 1px solid #eee;+ -webkit-border-radius: 3px 3px 0 0;+ -moz-border-radius: 3px 3px 0 0;+ border-radius: 3px 3px 0 0;+}+.popover-content {+ padding: 14px;+ background-color: #ffffff;+ -webkit-border-radius: 0 0 3px 3px;+ -moz-border-radius: 0 0 3px 3px;+ border-radius: 0 0 3px 3px;+ -webkit-background-clip: padding-box;+ -moz-background-clip: padding-box;+ background-clip: padding-box;+}+.popover-content p, .popover-content ul, .popover-content ol {+ margin-bottom: 0;+}+.thumbnails {+ margin-left: -20px;+ list-style: none;+ *zoom: 1;+}+.thumbnails:before, .thumbnails:after {+ display: table;+ content: "";+}+.thumbnails:after {+ clear: both;+}+.thumbnails > li {+ float: left;+ margin: 0 0 18px 20px;+}+.thumbnail {+ display: block;+ padding: 4px;+ line-height: 1;+ border: 1px solid #ddd;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);+}+a.thumbnail:hover {+ border-color: #0088cc;+ -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);+ -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);+ box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);+}+.thumbnail > img {+ display: block;+ max-width: 100%;+ margin-left: auto;+ margin-right: auto;+}+.thumbnail .caption {+ padding: 9px;+}+.label {+ padding: 2px 4px 3px;+ font-size: 11.049999999999999px;+ font-weight: bold;+ color: #ffffff;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+ background-color: #999999;+ -webkit-border-radius: 3px;+ -moz-border-radius: 3px;+ border-radius: 3px;+}+.label:hover {+ color: #ffffff;+ text-decoration: none;+}+.label-important {+ background-color: #b94a48;+}+.label-important:hover {+ background-color: #953b39;+}+.label-warning {+ background-color: #f89406;+}+.label-warning:hover {+ background-color: #c67605;+}+.label-success {+ background-color: #468847;+}+.label-success:hover {+ background-color: #356635;+}+.label-info {+ background-color: #3a87ad;+}+.label-info:hover {+ background-color: #2d6987;+}+@-webkit-keyframes progress-bar-stripes {+ from {+ background-position: 0 0;+ }+ to {+ background-position: 40px 0;+ }+}+@-moz-keyframes progress-bar-stripes {+ from {+ background-position: 0 0;+ }+ to {+ background-position: 40px 0;+ }+}+@keyframes progress-bar-stripes {+ from {+ background-position: 0 0;+ }+ to {+ background-position: 40px 0;+ }+}+.progress {+ overflow: hidden;+ height: 18px;+ margin-bottom: 18px;+ background-color: #f7f7f7;+ background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);+ background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));+ background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);+ background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);+ background-image: linear-gradient(top, #f5f5f5, #f9f9f9);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.progress .bar {+ width: 0%;+ height: 18px;+ color: #ffffff;+ font-size: 12px;+ text-align: center;+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);+ background-color: #0e90d2;+ background-image: -moz-linear-gradient(top, #149bdf, #0480be);+ background-image: -ms-linear-gradient(top, #149bdf, #0480be);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));+ background-image: -webkit-linear-gradient(top, #149bdf, #0480be);+ background-image: -o-linear-gradient(top, #149bdf, #0480be);+ background-image: linear-gradient(top, #149bdf, #0480be);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);+ -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+ -webkit-transition: width 0.6s ease;+ -moz-transition: width 0.6s ease;+ -ms-transition: width 0.6s ease;+ -o-transition: width 0.6s ease;+ transition: width 0.6s ease;+}+.progress-striped .bar {+ background-color: #62c462;+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ -webkit-background-size: 40px 40px;+ -moz-background-size: 40px 40px;+ -o-background-size: 40px 40px;+ background-size: 40px 40px;+}+.progress.active .bar {+ -webkit-animation: progress-bar-stripes 2s linear infinite;+ -moz-animation: progress-bar-stripes 2s linear infinite;+ animation: progress-bar-stripes 2s linear infinite;+}+.progress-danger .bar {+ background-color: #dd514c;+ background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);+ background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));+ background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);+ background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);+ background-image: linear-gradient(top, #ee5f5b, #c43c35);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);+}+.progress-danger.progress-striped .bar {+ background-color: #ee5f5b;+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+}+.progress-success .bar {+ background-color: #5eb95e;+ background-image: -moz-linear-gradient(top, #62c462, #57a957);+ background-image: -ms-linear-gradient(top, #62c462, #57a957);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));+ background-image: -webkit-linear-gradient(top, #62c462, #57a957);+ background-image: -o-linear-gradient(top, #62c462, #57a957);+ background-image: linear-gradient(top, #62c462, #57a957);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);+}+.progress-success.progress-striped .bar {+ background-color: #62c462;+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+}+.progress-info .bar {+ background-color: #4bb1cf;+ background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);+ background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));+ background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);+ background-image: -o-linear-gradient(top, #5bc0de, #339bb9);+ background-image: linear-gradient(top, #5bc0de, #339bb9);+ background-repeat: repeat-x;+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);+}+.progress-info.progress-striped .bar {+ background-color: #5bc0de;+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));+ background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+ background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);+}+.accordion {+ margin-bottom: 18px;+}+.accordion-group {+ margin-bottom: 2px;+ border: 1px solid #e5e5e5;+ -webkit-border-radius: 4px;+ -moz-border-radius: 4px;+ border-radius: 4px;+}+.accordion-heading {+ border-bottom: 0;+}+.accordion-heading .accordion-toggle {+ display: block;+ padding: 8px 15px;+}+.accordion-inner {+ padding: 9px 15px;+ border-top: 1px solid #e5e5e5;+}+.carousel {+ position: relative;+ margin-bottom: 18px;+ line-height: 1;+}+.carousel-inner {+ overflow: hidden;+ width: 100%;+ position: relative;+}+.carousel .item {+ display: none;+ position: relative;+ -webkit-transition: 0.6s ease-in-out left;+ -moz-transition: 0.6s ease-in-out left;+ -ms-transition: 0.6s ease-in-out left;+ -o-transition: 0.6s ease-in-out left;+ transition: 0.6s ease-in-out left;+}+.carousel .item > img {+ display: block;+ line-height: 1;+}+.carousel .active, .carousel .next, .carousel .prev {+ display: block;+}+.carousel .active {+ left: 0;+}+.carousel .next, .carousel .prev {+ position: absolute;+ top: 0;+ width: 100%;+}+.carousel .next {+ left: 100%;+}+.carousel .prev {+ left: -100%;+}+.carousel .next.left, .carousel .prev.right {+ left: 0;+}+.carousel .active.left {+ left: -100%;+}+.carousel .active.right {+ left: 100%;+}+.carousel-control {+ position: absolute;+ top: 40%;+ left: 15px;+ width: 40px;+ height: 40px;+ margin-top: -20px;+ font-size: 60px;+ font-weight: 100;+ line-height: 30px;+ color: #ffffff;+ text-align: center;+ background: #222222;+ border: 3px solid #ffffff;+ -webkit-border-radius: 23px;+ -moz-border-radius: 23px;+ border-radius: 23px;+ opacity: 0.5;+ filter: alpha(opacity=50);+}+.carousel-control.right {+ left: auto;+ right: 15px;+}+.carousel-control:hover {+ color: #ffffff;+ text-decoration: none;+ opacity: 0.9;+ filter: alpha(opacity=90);+}+.carousel-caption {+ position: absolute;+ left: 0;+ right: 0;+ bottom: 0;+ padding: 10px 15px 5px;+ background: #333333;+ background: rgba(0, 0, 0, 0.75);+}+.carousel-caption h4, .carousel-caption p {+ color: #ffffff;+}+.hero-unit {+ padding: 60px;+ margin-bottom: 30px;+ background-color: #f5f5f5;+ -webkit-border-radius: 6px;+ -moz-border-radius: 6px;+ border-radius: 6px;+}+.hero-unit h1 {+ margin-bottom: 0;+ font-size: 60px;+ line-height: 1;+ letter-spacing: -1px;+}+.hero-unit p {+ font-size: 18px;+ font-weight: 200;+ line-height: 27px;+}+.pull-right {+ float: right;+}+.pull-left {+ float: left;+}+.hide {+ display: none;+}+.show {+ display: block;+}+.invisible {+ visibility: hidden;+}
+ static/img/glyphicons-halflings-white.png view
binary file changed (absent → 4352 bytes)
+ static/img/glyphicons-halflings.png view
binary file changed (absent → 4352 bytes)
+ static/js/bootstrap.js view
@@ -0,0 +1,1720 @@+/* ===================================================+ * bootstrap-transition.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#transitions+ * ===================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ========================================================== */++!function( $ ) {++ $(function () {++ "use strict"++ /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)+ * ======================================================= */++ $.support.transition = (function () {+ var thisBody = document.body || document.documentElement+ , thisStyle = thisBody.style+ , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined++ return support && {+ end: (function () {+ var transitionEnd = "TransitionEnd"+ if ( $.browser.webkit ) {+ transitionEnd = "webkitTransitionEnd"+ } else if ( $.browser.mozilla ) {+ transitionEnd = "transitionend"+ } else if ( $.browser.opera ) {+ transitionEnd = "oTransitionEnd"+ }+ return transitionEnd+ }())+ }+ })()++ })++}( window.jQuery );/* ==========================================================+ * bootstrap-alert.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#alerts+ * ==========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ========================================================== */+++!function( $ ){++ "use strict"++ /* ALERT CLASS DEFINITION+ * ====================== */++ var dismiss = '[data-dismiss="alert"]'+ , Alert = function ( el ) {+ $(el).on('click', dismiss, this.close)+ }++ Alert.prototype = {++ constructor: Alert++ , close: function ( e ) {+ var $this = $(this)+ , selector = $this.attr('data-target')+ , $parent++ if (!selector) {+ selector = $this.attr('href')+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+ }++ $parent = $(selector)+ $parent.trigger('close')++ e && e.preventDefault()++ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())++ $parent+ .trigger('close')+ .removeClass('in')++ function removeElement() {+ $parent+ .trigger('closed')+ .remove()+ }++ $.support.transition && $parent.hasClass('fade') ?+ $parent.on($.support.transition.end, removeElement) :+ removeElement()+ }++ }+++ /* ALERT PLUGIN DEFINITION+ * ======================= */++ $.fn.alert = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('alert')+ if (!data) $this.data('alert', (data = new Alert(this)))+ if (typeof option == 'string') data[option].call($this)+ })+ }++ $.fn.alert.Constructor = Alert+++ /* ALERT DATA-API+ * ============== */++ $(function () {+ $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)+ })++}( window.jQuery );/* ============================================================+ * bootstrap-button.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#buttons+ * ============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ============================================================ */++!function( $ ){++ "use strict"++ /* BUTTON PUBLIC CLASS DEFINITION+ * ============================== */++ var Button = function ( element, options ) {+ this.$element = $(element)+ this.options = $.extend({}, $.fn.button.defaults, options)+ }++ Button.prototype = {++ constructor: Button++ , setState: function ( state ) {+ var d = 'disabled'+ , $el = this.$element+ , data = $el.data()+ , val = $el.is('input') ? 'val' : 'html'++ state = state + 'Text'+ data.resetText || $el.data('resetText', $el[val]())++ $el[val](data[state] || this.options[state])++ // push to event loop to allow forms to submit+ setTimeout(function () {+ state == 'loadingText' ?+ $el.addClass(d).attr(d, d) :+ $el.removeClass(d).removeAttr(d)+ }, 0)+ }++ , toggle: function () {+ var $parent = this.$element.parent('[data-toggle="buttons-radio"]')++ $parent && $parent+ .find('.active')+ .removeClass('active')++ this.$element.toggleClass('active')+ }++ }+++ /* BUTTON PLUGIN DEFINITION+ * ======================== */++ $.fn.button = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('button')+ , options = typeof option == 'object' && option+ if (!data) $this.data('button', (data = new Button(this, options)))+ if (option == 'toggle') data.toggle()+ else if (option) data.setState(option)+ })+ }++ $.fn.button.defaults = {+ loadingText: 'loading...'+ }++ $.fn.button.Constructor = Button+++ /* BUTTON DATA-API+ * =============== */++ $(function () {+ $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {+ var $btn = $(e.target)+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')+ $btn.button('toggle')+ })+ })++}( window.jQuery );/* ==========================================================+ * bootstrap-carousel.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#carousel+ * ==========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ========================================================== */+++!function( $ ){++ "use strict"++ /* CAROUSEL CLASS DEFINITION+ * ========================= */++ var Carousel = function (element, options) {+ this.$element = $(element)+ this.options = $.extend({}, $.fn.carousel.defaults, options)+ this.options.slide && this.slide(this.options.slide)+ }++ Carousel.prototype = {++ cycle: function () {+ this.interval = setInterval($.proxy(this.next, this), this.options.interval)+ return this+ }++ , to: function (pos) {+ var $active = this.$element.find('.active')+ , children = $active.parent().children()+ , activePos = children.index($active)+ , that = this++ if (pos > (children.length - 1) || pos < 0) return++ if (this.sliding) {+ return this.$element.one('slid', function () {+ that.to(pos)+ })+ }++ if (activePos == pos) {+ return this.pause().cycle()+ }++ return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))+ }++ , pause: function () {+ clearInterval(this.interval)+ this.interval = null+ return this+ }++ , next: function () {+ if (this.sliding) return+ return this.slide('next')+ }++ , prev: function () {+ if (this.sliding) return+ return this.slide('prev')+ }++ , slide: function (type, next) {+ var $active = this.$element.find('.active')+ , $next = next || $active[type]()+ , isCycling = this.interval+ , direction = type == 'next' ? 'left' : 'right'+ , fallback = type == 'next' ? 'first' : 'last'+ , that = this++ if (!$next.length) return++ this.sliding = true++ isCycling && this.pause()++ $next = $next.length ? $next : this.$element.find('.item')[fallback]()++ if (!$.support.transition && this.$element.hasClass('slide')) {+ this.$element.trigger('slide')+ $active.removeClass('active')+ $next.addClass('active')+ this.sliding = false+ this.$element.trigger('slid')+ } else {+ $next.addClass(type)+ $next[0].offsetWidth // force reflow+ $active.addClass(direction)+ $next.addClass(direction)+ this.$element.trigger('slide')+ this.$element.one($.support.transition.end, function () {+ $next.removeClass([type, direction].join(' ')).addClass('active')+ $active.removeClass(['active', direction].join(' '))+ that.sliding = false+ setTimeout(function () { that.$element.trigger('slid') }, 0)+ })+ }++ isCycling && this.cycle()++ return this+ }++ }+++ /* CAROUSEL PLUGIN DEFINITION+ * ========================== */++ $.fn.carousel = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('carousel')+ , options = typeof option == 'object' && option+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))+ if (typeof option == 'number') data.to(option)+ else if (typeof option == 'string' || (option = options.slide)) data[option]()+ else data.cycle()+ })+ }++ $.fn.carousel.defaults = {+ interval: 5000+ }++ $.fn.carousel.Constructor = Carousel+++ /* CAROUSEL DATA-API+ * ================= */++ $(function () {+ $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {+ var $this = $(this), href+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+ , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())+ $target.carousel(options)+ e.preventDefault()+ })+ })++}( window.jQuery );/* =============================================================+ * bootstrap-collapse.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#collapse+ * =============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ============================================================ */++!function( $ ){++ "use strict"++ var Collapse = function ( element, options ) {+ this.$element = $(element)+ this.options = $.extend({}, $.fn.collapse.defaults, options)++ if (this.options["parent"]) {+ this.$parent = $(this.options["parent"])+ }++ this.options.toggle && this.toggle()+ }++ Collapse.prototype = {++ constructor: Collapse++ , dimension: function () {+ var hasWidth = this.$element.hasClass('width')+ return hasWidth ? 'width' : 'height'+ }++ , show: function () {+ var dimension = this.dimension()+ , scroll = $.camelCase(['scroll', dimension].join('-'))+ , actives = this.$parent && this.$parent.find('.in')+ , hasData++ if (actives && actives.length) {+ hasData = actives.data('collapse')+ actives.collapse('hide')+ hasData || actives.data('collapse', null)+ }++ this.$element[dimension](0)+ this.transition('addClass', 'show', 'shown')+ this.$element[dimension](this.$element[0][scroll])++ }++ , hide: function () {+ var dimension = this.dimension()+ this.reset(this.$element[dimension]())+ this.transition('removeClass', 'hide', 'hidden')+ this.$element[dimension](0)+ }++ , reset: function ( size ) {+ var dimension = this.dimension()++ this.$element+ .removeClass('collapse')+ [dimension](size || 'auto')+ [0].offsetWidth++ this.$element.addClass('collapse')+ }++ , transition: function ( method, startEvent, completeEvent ) {+ var that = this+ , complete = function () {+ if (startEvent == 'show') that.reset()+ that.$element.trigger(completeEvent)+ }++ this.$element+ .trigger(startEvent)+ [method]('in')++ $.support.transition && this.$element.hasClass('collapse') ?+ this.$element.one($.support.transition.end, complete) :+ complete()+ }++ , toggle: function () {+ this[this.$element.hasClass('in') ? 'hide' : 'show']()+ }++ }++ /* COLLAPSIBLE PLUGIN DEFINITION+ * ============================== */++ $.fn.collapse = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('collapse')+ , options = typeof option == 'object' && option+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.collapse.defaults = {+ toggle: true+ }++ $.fn.collapse.Constructor = Collapse+++ /* COLLAPSIBLE DATA-API+ * ==================== */++ $(function () {+ $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {+ var $this = $(this), href+ , target = $this.attr('data-target')+ || e.preventDefault()+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7+ , option = $(target).data('collapse') ? 'toggle' : $this.data()+ $(target).collapse(option)+ })+ })++}( window.jQuery );/* ============================================================+ * bootstrap-dropdown.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns+ * ============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ============================================================ */+++!function( $ ){++ "use strict"++ /* DROPDOWN CLASS DEFINITION+ * ========================= */++ var toggle = '[data-toggle="dropdown"]'+ , Dropdown = function ( element ) {+ var $el = $(element).on('click.dropdown.data-api', this.toggle)+ $('html').on('click.dropdown.data-api', function () {+ $el.parent().removeClass('open')+ })+ }++ Dropdown.prototype = {++ constructor: Dropdown++ , toggle: function ( e ) {+ var $this = $(this)+ , selector = $this.attr('data-target')+ , $parent+ , isActive++ if (!selector) {+ selector = $this.attr('href')+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+ }++ $parent = $(selector)+ $parent.length || ($parent = $this.parent())++ isActive = $parent.hasClass('open')++ clearMenus()+ !isActive && $parent.toggleClass('open')++ return false+ }++ }++ function clearMenus() {+ $(toggle).parent().removeClass('open')+ }+++ /* DROPDOWN PLUGIN DEFINITION+ * ========================== */++ $.fn.dropdown = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('dropdown')+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))+ if (typeof option == 'string') data[option].call($this)+ })+ }++ $.fn.dropdown.Constructor = Dropdown+++ /* APPLY TO STANDARD DROPDOWN ELEMENTS+ * =================================== */++ $(function () {+ $('html').on('click.dropdown.data-api', clearMenus)+ $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)+ })++}( window.jQuery );/* =========================================================+ * bootstrap-modal.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#modals+ * =========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ========================================================= */+++!function( $ ){++ "use strict"++ /* MODAL CLASS DEFINITION+ * ====================== */++ var Modal = function ( content, options ) {+ this.options = options+ this.$element = $(content)+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))+ }++ Modal.prototype = {++ constructor: Modal++ , toggle: function () {+ return this[!this.isShown ? 'show' : 'hide']()+ }++ , show: function () {+ var that = this++ if (this.isShown) return++ $('body').addClass('modal-open')++ this.isShown = true+ this.$element.trigger('show')++ escape.call(this)+ backdrop.call(this, function () {+ var transition = $.support.transition && that.$element.hasClass('fade')++ !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position++ that.$element+ .show()++ if (transition) {+ that.$element[0].offsetWidth // force reflow+ }++ that.$element.addClass('in')++ transition ?+ that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :+ that.$element.trigger('shown')++ })+ }++ , hide: function ( e ) {+ e && e.preventDefault()++ if (!this.isShown) return++ var that = this+ this.isShown = false++ $('body').removeClass('modal-open')++ escape.call(this)++ this.$element+ .trigger('hide')+ .removeClass('in')++ $.support.transition && this.$element.hasClass('fade') ?+ hideWithTransition.call(this) :+ hideModal.call(this)+ }++ }+++ /* MODAL PRIVATE METHODS+ * ===================== */++ function hideWithTransition() {+ var that = this+ , timeout = setTimeout(function () {+ that.$element.off($.support.transition.end)+ hideModal.call(that)+ }, 500)++ this.$element.one($.support.transition.end, function () {+ clearTimeout(timeout)+ hideModal.call(that)+ })+ }++ function hideModal( that ) {+ this.$element+ .hide()+ .trigger('hidden')++ backdrop.call(this)+ }++ function backdrop( callback ) {+ var that = this+ , animate = this.$element.hasClass('fade') ? 'fade' : ''++ if (this.isShown && this.options.backdrop) {+ var doAnimate = $.support.transition && animate++ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')+ .appendTo(document.body)++ if (this.options.backdrop != 'static') {+ this.$backdrop.click($.proxy(this.hide, this))+ }++ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow++ this.$backdrop.addClass('in')++ doAnimate ?+ this.$backdrop.one($.support.transition.end, callback) :+ callback()++ } else if (!this.isShown && this.$backdrop) {+ this.$backdrop.removeClass('in')++ $.support.transition && this.$element.hasClass('fade')?+ this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :+ removeBackdrop.call(this)++ } else if (callback) {+ callback()+ }+ }++ function removeBackdrop() {+ this.$backdrop.remove()+ this.$backdrop = null+ }++ function escape() {+ var that = this+ if (this.isShown && this.options.keyboard) {+ $(document).on('keyup.dismiss.modal', function ( e ) {+ e.which == 27 && that.hide()+ })+ } else if (!this.isShown) {+ $(document).off('keyup.dismiss.modal')+ }+ }+++ /* MODAL PLUGIN DEFINITION+ * ======================= */++ $.fn.modal = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('modal')+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)+ if (!data) $this.data('modal', (data = new Modal(this, options)))+ if (typeof option == 'string') data[option]()+ else if (options.show) data.show()+ })+ }++ $.fn.modal.defaults = {+ backdrop: true+ , keyboard: true+ , show: true+ }++ $.fn.modal.Constructor = Modal+++ /* MODAL DATA-API+ * ============== */++ $(function () {+ $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {+ var $this = $(this), href+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+ , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())++ e.preventDefault()+ $target.modal(option)+ })+ })++}( window.jQuery );/* ===========================================================+ * bootstrap-tooltip.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#tooltips+ * Inspired by the original jQuery.tipsy by Jason Frame+ * ===========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ========================================================== */++!function( $ ) {++ "use strict"++ /* TOOLTIP PUBLIC CLASS DEFINITION+ * =============================== */++ var Tooltip = function ( element, options ) {+ this.init('tooltip', element, options)+ }++ Tooltip.prototype = {++ constructor: Tooltip++ , init: function ( type, element, options ) {+ var eventIn+ , eventOut++ this.type = type+ this.$element = $(element)+ this.options = this.getOptions(options)+ this.enabled = true++ if (this.options.trigger != 'manual') {+ eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'+ eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'+ this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))+ this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))+ }++ this.options.selector ?+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :+ this.fixTitle()+ }++ , getOptions: function ( options ) {+ options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())++ if (options.delay && typeof options.delay == 'number') {+ options.delay = {+ show: options.delay+ , hide: options.delay+ }+ }++ return options+ }++ , enter: function ( e ) {+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)++ if (!self.options.delay || !self.options.delay.show) {+ self.show()+ } else {+ self.hoverState = 'in'+ setTimeout(function() {+ if (self.hoverState == 'in') {+ self.show()+ }+ }, self.options.delay.show)+ }+ }++ , leave: function ( e ) {+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)++ if (!self.options.delay || !self.options.delay.hide) {+ self.hide()+ } else {+ self.hoverState = 'out'+ setTimeout(function() {+ if (self.hoverState == 'out') {+ self.hide()+ }+ }, self.options.delay.hide)+ }+ }++ , show: function () {+ var $tip+ , inside+ , pos+ , actualWidth+ , actualHeight+ , placement+ , tp++ if (this.hasContent() && this.enabled) {+ $tip = this.tip()+ this.setContent()++ if (this.options.animation) {+ $tip.addClass('fade')+ }++ placement = typeof this.options.placement == 'function' ?+ this.options.placement.call(this, $tip[0], this.$element[0]) :+ this.options.placement++ inside = /in/.test(placement)++ $tip+ .remove()+ .css({ top: 0, left: 0, display: 'block' })+ .appendTo(inside ? this.$element : document.body)++ pos = this.getPosition(inside)++ actualWidth = $tip[0].offsetWidth+ actualHeight = $tip[0].offsetHeight++ switch (inside ? placement.split(' ')[1] : placement) {+ case 'bottom':+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}+ break+ case 'top':+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}+ break+ case 'left':+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}+ break+ case 'right':+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}+ break+ }++ $tip+ .css(tp)+ .addClass(placement)+ .addClass('in')+ }+ }++ , setContent: function () {+ var $tip = this.tip()+ $tip.find('.tooltip-inner').html(this.getTitle())+ $tip.removeClass('fade in top bottom left right')+ }++ , hide: function () {+ var that = this+ , $tip = this.tip()++ $tip.removeClass('in')++ function removeWithAnimation() {+ var timeout = setTimeout(function () {+ $tip.off($.support.transition.end).remove()+ }, 500)++ $tip.one($.support.transition.end, function () {+ clearTimeout(timeout)+ $tip.remove()+ })+ }++ $.support.transition && this.$tip.hasClass('fade') ?+ removeWithAnimation() :+ $tip.remove()+ }++ , fixTitle: function () {+ var $e = this.$element+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {+ $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')+ }+ }++ , hasContent: function () {+ return this.getTitle()+ }++ , getPosition: function (inside) {+ return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {+ width: this.$element[0].offsetWidth+ , height: this.$element[0].offsetHeight+ })+ }++ , getTitle: function () {+ var title+ , $e = this.$element+ , o = this.options++ title = $e.attr('data-original-title')+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)++ title = title.toString().replace(/(^\s*|\s*$)/, "")++ return title+ }++ , tip: function () {+ return this.$tip = this.$tip || $(this.options.template)+ }++ , validate: function () {+ if (!this.$element[0].parentNode) {+ this.hide()+ this.$element = null+ this.options = null+ }+ }++ , enable: function () {+ this.enabled = true+ }++ , disable: function () {+ this.enabled = false+ }++ , toggleEnabled: function () {+ this.enabled = !this.enabled+ }++ , toggle: function () {+ this[this.tip().hasClass('in') ? 'hide' : 'show']()+ }++ }+++ /* TOOLTIP PLUGIN DEFINITION+ * ========================= */++ $.fn.tooltip = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('tooltip')+ , options = typeof option == 'object' && option+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.tooltip.Constructor = Tooltip++ $.fn.tooltip.defaults = {+ animation: true+ , delay: 0+ , selector: false+ , placement: 'top'+ , trigger: 'hover'+ , title: ''+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'+ }++}( window.jQuery );/* ===========================================================+ * bootstrap-popover.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#popovers+ * ===========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * =========================================================== */+++!function( $ ) {++ "use strict"++ var Popover = function ( element, options ) {+ this.init('popover', element, options)+ }++ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js+ ========================================== */++ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {++ constructor: Popover++ , setContent: function () {+ var $tip = this.tip()+ , title = this.getTitle()+ , content = this.getContent()++ $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)+ $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)++ $tip.removeClass('fade top bottom left right in')+ }++ , hasContent: function () {+ return this.getTitle() || this.getContent()+ }++ , getContent: function () {+ var content+ , $e = this.$element+ , o = this.options++ content = $e.attr('data-content')+ || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)++ content = content.toString().replace(/(^\s*|\s*$)/, "")++ return content+ }++ , tip: function() {+ if (!this.$tip) {+ this.$tip = $(this.options.template)+ }+ return this.$tip+ }++ })+++ /* POPOVER PLUGIN DEFINITION+ * ======================= */++ $.fn.popover = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('popover')+ , options = typeof option == 'object' && option+ if (!data) $this.data('popover', (data = new Popover(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.popover.Constructor = Popover++ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {+ placement: 'right'+ , content: ''+ , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'+ })++}( window.jQuery );/* =============================================================+ * bootstrap-scrollspy.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy+ * =============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ============================================================== */++!function ( $ ) {++ "use strict"++ /* SCROLLSPY CLASS DEFINITION+ * ========================== */++ function ScrollSpy( element, options) {+ var process = $.proxy(this.process, this)+ , $element = $(element).is('body') ? $(window) : $(element)+ , href+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)+ this.$scrollElement = $element.on('scroll.scroll.data-api', process)+ this.selector = (this.options.target+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+ || '') + ' .nav li > a'+ this.$body = $('body').on('click.scroll.data-api', this.selector, process)+ this.refresh()+ this.process()+ }++ ScrollSpy.prototype = {++ constructor: ScrollSpy++ , refresh: function () {+ this.targets = this.$body+ .find(this.selector)+ .map(function () {+ var href = $(this).attr('href')+ return /^#\w/.test(href) && $(href).length ? href : null+ })++ this.offsets = $.map(this.targets, function (id) {+ return $(id).position().top+ })+ }++ , process: function () {+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset+ , offsets = this.offsets+ , targets = this.targets+ , activeTarget = this.activeTarget+ , i++ for (i = offsets.length; i--;) {+ activeTarget != targets[i]+ && scrollTop >= offsets[i]+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])+ && this.activate( targets[i] )+ }+ }++ , activate: function (target) {+ var active++ this.activeTarget = target++ this.$body+ .find(this.selector).parent('.active')+ .removeClass('active')++ active = this.$body+ .find(this.selector + '[href="' + target + '"]')+ .parent('li')+ .addClass('active')++ if ( active.parent('.dropdown-menu') ) {+ active.closest('li.dropdown').addClass('active')+ }+ }++ }+++ /* SCROLLSPY PLUGIN DEFINITION+ * =========================== */++ $.fn.scrollspy = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('scrollspy')+ , options = typeof option == 'object' && option+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.scrollspy.Constructor = ScrollSpy++ $.fn.scrollspy.defaults = {+ offset: 10+ }+++ /* SCROLLSPY DATA-API+ * ================== */++ $(function () {+ $('[data-spy="scroll"]').each(function () {+ var $spy = $(this)+ $spy.scrollspy($spy.data())+ })+ })++}( window.jQuery );/* ========================================================+ * bootstrap-tab.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#tabs+ * ========================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ======================================================== */+++!function( $ ){++ "use strict"++ /* TAB CLASS DEFINITION+ * ==================== */++ var Tab = function ( element ) {+ this.element = $(element)+ }++ Tab.prototype = {++ constructor: Tab++ , show: function () {+ var $this = this.element+ , $ul = $this.closest('ul:not(.dropdown-menu)')+ , selector = $this.attr('data-target')+ , previous+ , $target++ if (!selector) {+ selector = $this.attr('href')+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+ }++ if ( $this.parent('li').hasClass('active') ) return++ previous = $ul.find('.active a').last()[0]++ $this.trigger({+ type: 'show'+ , relatedTarget: previous+ })++ $target = $(selector)++ this.activate($this.parent('li'), $ul)+ this.activate($target, $target.parent(), function () {+ $this.trigger({+ type: 'shown'+ , relatedTarget: previous+ })+ })+ }++ , activate: function ( element, container, callback) {+ var $active = container.find('> .active')+ , transition = callback+ && $.support.transition+ && $active.hasClass('fade')++ function next() {+ $active+ .removeClass('active')+ .find('> .dropdown-menu > .active')+ .removeClass('active')++ element.addClass('active')++ if (transition) {+ element[0].offsetWidth // reflow for transition+ element.addClass('in')+ } else {+ element.removeClass('fade')+ }++ if ( element.parent('.dropdown-menu') ) {+ element.closest('li.dropdown').addClass('active')+ }++ callback && callback()+ }++ transition ?+ $active.one($.support.transition.end, next) :+ next()++ $active.removeClass('in')+ }+ }+++ /* TAB PLUGIN DEFINITION+ * ===================== */++ $.fn.tab = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('tab')+ if (!data) $this.data('tab', (data = new Tab(this)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.tab.Constructor = Tab+++ /* TAB DATA-API+ * ============ */++ $(function () {+ $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {+ e.preventDefault()+ $(this).tab('show')+ })+ })++}( window.jQuery );/* =============================================================+ * bootstrap-typeahead.js v2.0.1+ * http://twitter.github.com/bootstrap/javascript.html#typeahead+ * =============================================================+ * Copyright 2012 Twitter, Inc.+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ * http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ * ============================================================ */++!function( $ ){++ "use strict"++ var Typeahead = function ( element, options ) {+ this.$element = $(element)+ this.options = $.extend({}, $.fn.typeahead.defaults, options)+ this.matcher = this.options.matcher || this.matcher+ this.sorter = this.options.sorter || this.sorter+ this.highlighter = this.options.highlighter || this.highlighter+ this.$menu = $(this.options.menu).appendTo('body')+ this.source = this.options.source+ this.shown = false+ this.listen()+ }++ Typeahead.prototype = {++ constructor: Typeahead++ , select: function () {+ var val = this.$menu.find('.active').attr('data-value')+ this.$element.val(val)+ return this.hide()+ }++ , show: function () {+ var pos = $.extend({}, this.$element.offset(), {+ height: this.$element[0].offsetHeight+ })++ this.$menu.css({+ top: pos.top + pos.height+ , left: pos.left+ })++ this.$menu.show()+ this.shown = true+ return this+ }++ , hide: function () {+ this.$menu.hide()+ this.shown = false+ return this+ }++ , lookup: function (event) {+ var that = this+ , items+ , q++ this.query = this.$element.val()++ if (!this.query) {+ return this.shown ? this.hide() : this+ }++ items = $.grep(this.source, function (item) {+ if (that.matcher(item)) return item+ })++ items = this.sorter(items)++ if (!items.length) {+ return this.shown ? this.hide() : this+ }++ return this.render(items.slice(0, this.options.items)).show()+ }++ , matcher: function (item) {+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())+ }++ , sorter: function (items) {+ var beginswith = []+ , caseSensitive = []+ , caseInsensitive = []+ , item++ while (item = items.shift()) {+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)+ else if (~item.indexOf(this.query)) caseSensitive.push(item)+ else caseInsensitive.push(item)+ }++ return beginswith.concat(caseSensitive, caseInsensitive)+ }++ , highlighter: function (item) {+ return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) {+ return '<strong>' + match + '</strong>'+ })+ }++ , render: function (items) {+ var that = this++ items = $(items).map(function (i, item) {+ i = $(that.options.item).attr('data-value', item)+ i.find('a').html(that.highlighter(item))+ return i[0]+ })++ items.first().addClass('active')+ this.$menu.html(items)+ return this+ }++ , next: function (event) {+ var active = this.$menu.find('.active').removeClass('active')+ , next = active.next()++ if (!next.length) {+ next = $(this.$menu.find('li')[0])+ }++ next.addClass('active')+ }++ , prev: function (event) {+ var active = this.$menu.find('.active').removeClass('active')+ , prev = active.prev()++ if (!prev.length) {+ prev = this.$menu.find('li').last()+ }++ prev.addClass('active')+ }++ , listen: function () {+ this.$element+ .on('blur', $.proxy(this.blur, this))+ .on('keypress', $.proxy(this.keypress, this))+ .on('keyup', $.proxy(this.keyup, this))++ if ($.browser.webkit || $.browser.msie) {+ this.$element.on('keydown', $.proxy(this.keypress, this))+ }++ this.$menu+ .on('click', $.proxy(this.click, this))+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))+ }++ , keyup: function (e) {+ e.stopPropagation()+ e.preventDefault()++ switch(e.keyCode) {+ case 40: // down arrow+ case 38: // up arrow+ break++ case 9: // tab+ case 13: // enter+ if (!this.shown) return+ this.select()+ break++ case 27: // escape+ this.hide()+ break++ default:+ this.lookup()+ }++ }++ , keypress: function (e) {+ e.stopPropagation()+ if (!this.shown) return++ switch(e.keyCode) {+ case 9: // tab+ case 13: // enter+ case 27: // escape+ e.preventDefault()+ break++ case 38: // up arrow+ e.preventDefault()+ this.prev()+ break++ case 40: // down arrow+ e.preventDefault()+ this.next()+ break+ }+ }++ , blur: function (e) {+ var that = this+ e.stopPropagation()+ e.preventDefault()+ setTimeout(function () { that.hide() }, 150)+ }++ , click: function (e) {+ e.stopPropagation()+ e.preventDefault()+ this.select()+ }++ , mouseenter: function (e) {+ this.$menu.find('.active').removeClass('active')+ $(e.currentTarget).addClass('active')+ }++ }+++ /* TYPEAHEAD PLUGIN DEFINITION+ * =========================== */++ $.fn.typeahead = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ , data = $this.data('typeahead')+ , options = typeof option == 'object' && option+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.typeahead.defaults = {+ source: []+ , items: 8+ , menu: '<ul class="typeahead dropdown-menu"></ul>'+ , item: '<li><a href="#"></a></li>'+ }++ $.fn.typeahead.Constructor = Typeahead+++ /* TYPEAHEAD DATA-API+ * ================== */++ $(function () {+ $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {+ var $this = $(this)+ if ($this.data('typeahead')) return+ e.preventDefault()+ $this.typeahead($this.data())+ })+ })++}( window.jQuery );
+ static/js/modernizr.js view
@@ -0,0 +1,4 @@+/* Modernizr 2.0.6 (Custom Build) | MIT & BSD+ * Build: http://www.modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-iepp-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load+ */+;window.Modernizr=function(a,b,c){function H(){e.input=function(a){for(var b=0,c=a.length;b<c;b++)t[a[b]]=a[b]in l;return t}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)l.setAttribute("type",f=a[d]),e=l.type!=="text",e&&(l.value=m,l.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&l.style.WebkitAppearance!==c?(g.appendChild(l),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(l,null).WebkitAppearance!=="textfield"&&l.offsetHeight!==0,g.removeChild(l)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=l.checkValidity&&l.checkValidity()===!1:/^color$/.test(f)?(g.appendChild(l),g.offsetWidth,e=l.value!=m,g.removeChild(l)):e=l.value!=m)),s[a[d]]=!!e;return s}("search tel url email datetime date month week time datetime-local number range color".split(" "))}function F(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+p.join(c+" ")+c).split(" ");return E(d,b)}function E(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function D(a,b){return!!~(""+a).indexOf(b)}function C(a,b){return typeof a===b}function B(a,b){return A(o.join(a+";")+(b||""))}function A(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l=b.createElement("input"),m=":)",n=Object.prototype.toString,o=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),p="Webkit Moz O ms Khtml".split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["­","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},w=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=C(e[d],"function"),C(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),x,y={}.hasOwnProperty,z;!C(y,c)&&!C(y.call,c)?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],c)};var G=function(c,d){var f=c.join(""),g=d.length;v(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||j.touch.offsetTop===9,e.csstransforms3d=j.csstransforms3d.offsetLeft===9,e.generatedcontent=j.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("touch-enabled),("),i,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'";visibility:hidden}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!C(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return e.touch},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b<c;)if(a[p[b].toLowerCase()+"IndexedDB"])return!0;return!!a.indexedDB},r.hashchange=function(){return w("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){return w("dragstart")&&w("drop")},r.websockets=function(){for(var b=-1,c=p.length;++b<c;)if(a[p[b]+"WebSocket"])return!0;return"WebSocket"in a},r.rgba=function(){A("background-color:rgba(150,255,150,.5)");return D(k.backgroundColor,"rgba")},r.hsla=function(){A("background-color:hsla(120,40%,100%,.5)");return D(k.backgroundColor,"rgba")||D(k.backgroundColor,"hsla")},r.multiplebgs=function(){A("background:url(https://),url(https://),red url(https://)");return/(url\s*\(.*?){3}/.test(k.background)},r.backgroundsize=function(){return F("backgroundSize")},r.borderimage=function(){return F("borderImage")},r.borderradius=function(){return F("borderRadius")},r.boxshadow=function(){return F("boxShadow")},r.textshadow=function(){return b.createElement("div").style.textShadow===""},r.opacity=function(){B("opacity:.55");return/^0.55$/.test(k.opacity)},r.cssanimations=function(){return F("animationName")},r.csscolumns=function(){return F("columnCount")},r.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";A((a+o.join(b+a)+o.join(c+a)).slice(0,-a.length));return D(k.backgroundImage,"gradient")},r.cssreflections=function(){return F("boxReflect")},r.csstransforms=function(){return!!E(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},r.csstransforms3d=function(){var a=!!E(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=e.csstransforms3d);return a},r.csstransitions=function(){return F("transitionProperty")},r.fontface=function(){return e.fontface},r.generatedcontent=function(){return e.generatedcontent},r.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}}catch(e){}return c},r.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")}catch(d){}return c},r.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},r.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}},r.webworkers=function(){return!!a.Worker},r.applicationcache=function(){return!!a.applicationCache},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");a.innerHTML="<svg/>";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var I in r)z(r,I)&&(x=I.toLowerCase(),e[x]=r[I](),u.push((e[x]?"":"no-")+x));e.input||H(),A(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b<g)a.createElement(f[b])}a.iepp=a.iepp||{};var d=a.iepp,e=d.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",f=e.split("|"),g=f.length,h=new RegExp("(^|\\s)("+e+")","gi"),i=new RegExp("<(/*)("+e+")","gi"),j=/^\s*[\{\}]\s*$/,k=new RegExp("(^|[^\\n]*?\\s)("+e+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),l=b.createDocumentFragment(),m=b.documentElement,n=m.firstChild,o=b.createElement("body"),p=b.createElement("style"),q=/print|all/,r;d.getCSS=function(a,b){if(a+""===c)return"";var e=-1,f=a.length,g,h=[];while(++e<f){g=a[e];if(g.disabled)continue;b=g.media||b,q.test(b)&&h.push(d.getCSS(g.imports,b),g.cssText),b="all"}return h.join("")},d.parseCSS=function(a){var b=[],c;while((c=k.exec(a))!=null)b.push(((j.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(h,"$1.iepp_$2")+c[4]);return b.join("\n")},d.writeHTML=function(){var a=-1;r=r||b.body;while(++a<g){var c=b.getElementsByTagName(f[a]),d=c.length,e=-1;while(++e<d)c[e].className.indexOf("iepp_")<0&&(c[e].className+=" iepp_"+f[a])}l.appendChild(r),m.appendChild(o),o.className=r.className,o.id=r.id,o.innerHTML=r.innerHTML.replace(i,"<$1font")},d._beforePrint=function(){p.styleSheet.cssText=d.parseCSS(d.getCSS(b.styleSheets,"all")),d.writeHTML()},d.restoreHTML=function(){o.innerHTML="",m.removeChild(o),m.appendChild(r)},d._afterPrint=function(){d.restoreHTML(),p.styleSheet.cssText=""},s(b),s(l);d.disablePP||(n.insertBefore(p,n.firstChild),p.media="print",p.className="iepp-printshim",a.attachEvent("onbeforeprint",d._beforePrint),a.attachEvent("onafterprint",d._afterPrint))}(a,b),e._version=d,e._prefixes=o,e._domPrefixes=p,e.hasEvent=w,e.testProp=function(a){return E([a])},e.testAllProps=F,e.testStyles=v,g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+u.join(" "):"");return e}(this,this.document),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=F[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=E[h](f);return f}function e(a,b,e,g,h){var i=f(a),j=i.autoCallback;if(!i.bypass){b&&(b=D(b)?b:b[a]||b[g]||b[a.split("/").pop().split("?")[0]]);if(i.instead)return i.instead(a,b,e,g,h);e.load(i.url,i.forceCSS||!i.forceJS&&/css$/.test(i.url)?"c":c,i.noexec),(D(b)||D(j))&&e.load(function(){d(),b&&b(i.origUrl,h,g),j&&j(i.origUrl,h,g)})}}function b(a,b){function c(a){if(C(a))e(a,h,b,0,d);else if(B(a))for(i in a)a.hasOwnProperty(i)&&e(a[i],h,b,i,d)}var d=!!a.test,f=d?a.yep:a.nope,g=a.load||a.both,h=a.callback,i;c(f),c(g),a.complete&&b.load(a.complete)}var g,h,i=this.yepnope.loader;if(C(a))e(a,0,i,0);else if(A(a))for(g=0;g<a.length;g++)h=a[g],C(h)?e(h,0,i,0):A(h)?H(h):B(h)&&b(h,i);else B(a)&&b(a,i)},H.addPrefix=function(a,b){F[a]=b},H.addFilter=function(a){E.push(a)},H.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",G=function(){b.removeEventListener("DOMContentLoaded",G,0),b.readyState="complete"},0)),a.yepnope=d()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
+ templates/article-view.hamlet view
@@ -0,0 +1,40 @@+<article .article>+ <h1 .article-title>+ <a href=@{articleLink article}>+ #{title}+ <div .article-desc>+ <div .author>+ <i .icon-user>+ \ written by #{author}+ <div .posted-date>+ <i .icon-calendar>+ \ posted on #{posted}+ $maybe d <- articleModifiedAt article+ <div .modified-date>+ <i .icon-upload>+ \ modified on #{show d}+ $if not (null tags)+ <div .tags>+ <i .icon-tags> #+ <ul .tag-list>+ $forall tag <- tags+ <li>+ <a href=@{TagR tag}>+ #{tag}+ $maybe r <- route+ <div .social>+ <i .icon-bookmark> #+ <div .social-item class="fb-like" data-href="#{r}" data-send="false" data-show-faces="false" data-layout="button_count">+ <a .social-item href="http://b.hatena.ne.jp/entry/#{r}" class="hatena-bookmark-button" data-hatena-bookmark-title="#{title} - #{blogTitle}" data-hatena-bookmark-layout="standard" title="このエントリーをはてなブックマークに追加">+ <img src="http://b.st-hatena.com/images/entry-button/button-only.gif" alt="このエントリーをはてなブックマークに追加" width="20" height="20" style="border: none;"> #+ <span .social-item>+ <g:plusone href=#{r}></g:plusone>+ <a href="https://twitter.com/share" class="twitter-share-button" data-url="#{r}" data-text="#{title} - #{blogTitle}" data-via="mr_konn" data-lang="ja">+ _{MsgTweet}+ <script>+ !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");+ <div .article-body .show-grid>+ #{body}+ $if editable+ <div style="text-align: right;">+ <a href=@{ModifyR (YablogDay date) ident} .btn>_{MsgEditArticle} #
+ templates/article-view.lucius view
@@ -0,0 +1,22 @@+.article-desc {+ margin: 1em;+}++.article-body {+}++.tag-list {+ display: inline;+ margin: 0px;+ padding: 0px;+ list-style: none;+}++.tag-list > li {+ margin-left: 1em;+ display: inline;+}++.social .social-item {+ margin-left: 1em;+}
+ templates/article.hamlet view
@@ -0,0 +1,68 @@+<ul .pager>+ $maybe prev <- mprev+ <li .previous>+ <a href=@{articleLink prev}>+ ← #{makeSnippet 15 $ articleTitle prev}+ $maybe next <- mnext+ <li .next>+ <a href=@{articleLink next}>+ #{makeSnippet 15 $ articleTitle next} →++^{articleView Nothing article}++$if (not $ null trackbacks)+ <h2>+ <a name="trackbacks">+ _{MsgTrackbacks}+ <div>+ Trackback URL:+ <input type="url" value="#{render $ TrackbackR (YablogDay date) ident}">+ <ul .trackbacks>+ $forall t <- trackbacks+ <li .trackback>+ <a href="#{trackbackUrl t}">+ #{fromMaybe (trackbackUrl t) $ trackbackTitle t}+$else+ <h2>+ <a name="trackbacks">+ _{MsgNoTrackbacks}+ <div>+ Trackback URL:+ <input type="url" value="#{render $ TrackbackR (YablogDay date) ident}">++$if (not $ null comments)+ <h2>+ <a name="comments">+ _{MsgComments}+ $forall c <- comments+ <article .comment .well ##{commentAnchor c}>+ <div .comment-body>+ #{commentBody c}+ <div .comment-desc>+ <div .comment-author>+ <i .icon-user>+ #{commentAuthor c}+ <div .comment-date>+ <i .icon-calendar>+ <a href="##{commentAnchor c}">+ #{show $ commentCreatedAt c}+$else+ <h2>+ <a name="comments">+ _{MsgNoComments} ++$maybe (widget, enc) <- mCommentForm+ <h2>_{MsgLeaveComment}+ <form method=post action=@{CommentR (YablogDay date) ident} enctype=#{enc}>+ ^{widget}+ <input type=submit>++<ul .pager>+ $maybe prev <- mprev+ <li .previous>+ <a href=@{articleLink prev}>+ ← #{makeSnippet 15 $ articleTitle prev}+ $maybe next <- mnext+ <li .next>+ <a href=@{articleLink next}>+ #{makeSnippet 15 $ articleTitle next} →
+ templates/article.lucius view
@@ -0,0 +1,9 @@+.comment-desc {+ text-align: right;+}++.article-body {+ border: 1px;+ border-style: solid;+ padding: 20px;+}
+ templates/default-layout-wrapper.hamlet view
@@ -0,0 +1,94 @@+\<!doctype html>+\<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->+\<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->+\<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->+\<!--[if gt IE 8]><!-->+<html class="no-js" lang="en"> <!--<![endif]-->+ <head>+ <meta charset="UTF-8">++ <title>#{pageTitle pc}+ <meta name="description" content="">+ <meta name="author" content="">++ <meta name="viewport" content="width=device-width,initial-scale=1">+ <link href="@{FeedR}" type="application/atom+xml" rel="alternate" title="Blog Feed">+ <link rel="contents toc index home start top origin" href=@{RootR}>+ ^{pageHead pc}++ \<!--[if lt IE 9]>+ \<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>+ \<![endif]-->++ <script>+ document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/,'js');+ $maybe hatenastar <- extraHatenaStar $ appExtra $ settings master+ <script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js">+ <script type="text/javascript">+ Hatena.Star.Token = '#{hatenastar}';+ Hatena.Star.SiteConfig = {+ entryNodes: {+ 'article.article': {+ uri: 'h1.article-title a',+ title: 'h1.article-title',+ container: 'h1.article-title'+ }+ }+ };+ <script type="text/javascript" src="http://b.st-hatena.com/js/bookmark_button_wo_al.js" charset="utf-8" async="async">+ $maybe analytics <- extraAnalytics $ appExtra $ settings master+ <script type="text/javascript">+ var _gaq = _gaq || [];+ _gaq.push(['_setAccount', '#{analytics}']);+ _gaq.push(['_trackPageview']);+ + (function() {+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);+ })();+ <body>+ <div id="fb-root"></div>+ <script>+ (function(d, s, id) {+ var js, fjs = d.getElementsByTagName(s)[0];+ if (d.getElementById(id)) return;+ js = d.createElement(s); js.id = id;+ js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1";+ fjs.parentNode.insertBefore(js, fjs);+ }(document, 'script', 'facebook-jssdk'));+ <div .container>+ ^{pageBody pc}+ <footer>+ Powered by #+ <a href="http://www.yesodweb.com/">+ Yesod+ , #+ <a href="http://johnmacfarlane.net/pandoc/">+ Pandoc+ , #+ <a href="http://twitter.github.com/bootstrap">+ Bootstrap+ , #+ <a href="http://www.mongodb.org/">+ MongoDB+ \ and #+ <a href="http://www.haskell.org/">+ Haskell+ \.<br>+ #{extraCopyright $ appExtra $ settings master}++ <script type="text/javascript">+ window.___gcfg = {lang: 'ja'};+ + (function() {+ var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;+ po.src = 'https://apis.google.com/js/plusone.js';+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);+ })();+ \<!-- Prompt IE 6 users to install Chrome Frame. Remove this if you want to support IE 6. chromium.org/developers/how-tos/chrome-frame-getting-started -->+ \<!--[if lt IE 7 ]>+ <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js">+ <script>+ window.attachEvent('onload',function(){CFInstall.check({mode:'overlay'})})+ \<![endif]-->
+ templates/default-layout.hamlet view
@@ -0,0 +1,63 @@+<header .hero-unit>+ <h1>+ <a href=@{RootR}>+ #{blogTitle}+ <p .lead>#{description}++$maybe msg <- mmsg+ <div #message .alert .alert-info .row8 .offest2>#{msg}+<div .row>+ <div .span4>+ <ul .nav .nav-list .well>+ <li .nav-header>+ <i .icon-book> #+ Recent Posts+ $forall art <- articles+ <li>+ <a href=@{ArticleR (toEnum $ articleCreatedDate art) (articleIdent art)}>+ #{articleTitle art}+ <li .nav-header>+ <i .icon-tags> #+ Tags+ $forall tag <- tags+ <li>+ <a href=@{TagR tag}>+ #{tag}+ <li .nav-header>+ <i .icon-comment> #+ Recent Comments+ $forall (comment, article) <- comments+ <li>+ <a href="@{ArticleR (toEnum $ articleCreatedDate article) (articleIdent article)}##{commentAnchor comment}">+ #{show $ utctDay $ commentCreatedAt comment} #{commentAuthor comment}+ $maybe cse <- mcse+ <li .nav-header>+ <i .icon-search> #+ Search+ <li>+ ^{cse}+ <li .nav-header>+ Control+ $if accessible+ <li>+ <a href=@{UserSettingsR}>+ <i .icon-cog> #+ Settings+ <li>+ <a href=@{CreateR}>+ <i .icon-pencil> #+ Post new article++ $maybe usr <- musr+ <li>+ <a href=@{AuthR LogoutR}>+ <i .icon-arrow-left> #+ Logout+ $nothing+ <li>+ <a href=@{AuthR LoginR}>+ <i .icon-arrow-right> #+ Login++ <div .span8>+ ^{widget}
+ templates/default-layout.lucius view
@@ -0,0 +1,22 @@+body {+ font-family: sans-serif;+}++table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {+ margin: 0; padding: 0; vertical-align: baseline; border: none; }+table.sourceCode { width: 100%; }+td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }+td.sourceCode { padding-left: 5px; }+code > span.kw { color: #007020; font-weight: bold; }+code > span.dt { color: #902000; }+code > span.dv { color: #40a070; }+code > span.bn { color: #40a070; }+code > span.fl { color: #40a070; }+code > span.ch { color: #4070a0; }+code > span.st { color: #4070a0; }+code > span.co { color: #60a0b0; font-style: italic; }+code > span.ot { color: #007020; }+code > span.al { color: #ff0000; font-weight: bold; }+code > span.fu { color: #06287e; }+code > span.er { color: #ff0000; font-weight: bold; }+
+ templates/edit-article.hamlet view
@@ -0,0 +1,34 @@+<h1>_{MsgEditArticle}+<div .tabbalble>+ <ul .nav .nav-tabs>+ <li .active>+ <a href="#editor" data-toggle="tab">+ _{MsgEditOn}+ <li>+ <a href="#preview" data-toggle="tab" #show-preview>+ _{MsgPreview}+ $maybe _ <- mCommentTrackbackForm+ <li>+ <a href="#comment-delete" data-toggle="tab" #show-comment-view>+ _{MsgDeleteCommentTrackback}+ <li>+ <a href="#delete-article" data-toggle="tab" #show-delete-article>+ _{MsgDeleteArticle}+ <div .tab-content>+ <div .active .tab-pane #editor>+ <form method=post action=@{ModifyR (YablogDay day) ident} enctype=#{enctype} #edit-form>+ ^{widget}+ <input type=submit .btn>+ <div .tab-pane #preview>+ <iframe src=@{PreviewR} #preview-contents .span7 height="400px">+ $maybe (cWidget, cEnctype, tWidget, tEnctype) <- mCommentTrackbackForm+ <div .tab-pane #comment-delete>+ <form action=@{DeleteCommentR (YablogDay day) ident} method=post enctype=#{cEnctype}>+ ^{cWidget}+ <input type=submit value=_{MsgDeleteComment}>+ <form action=@{DeleteTrackbackR (YablogDay day) ident} method=post enctype=#{tEnctype}>+ ^{tWidget}+ <input type=submit value=_{MsgDeleteTrackback}>+ <div .tab-pane #delete-article>+ <form action=@{DeleteR (YablogDay day) ident} method=get enctype=#{enctype}>+ <input type=submit value=_{MsgDeleteArticle} .btn .btn-danger>
+ templates/edit-article.julius view
@@ -0,0 +1,11 @@+$(document).ready(function(){+ function updatePreview(data, type) {+ $("#preview-contents").html(data);+ }+ function reloadPreview() {+ var src = $('#src').val();+ var title = $('#title').val()+ $("#preview-contents").contents().find("html").load("/preview", $("#edit-form").serializeArray());+ }+ $('#show-preview').click(function(){ reloadPreview(); });+});
+ templates/edit-article.lucius view
@@ -0,0 +1,3 @@+textarea#src {+ height: 250px;+}
+ templates/homepage.hamlet view
@@ -0,0 +1,38 @@+<h2>Recent Articles+<ul .pager>+ $if (>) offset 0+ <li .next>+ <a href="@{RootR}?of=#{max 0 $ subtract offset 5}">+ Newer Articles →+ $if hasMore+ <li .previous>+ <a href="@{RootR}?of=#{(+) offset 5}">+ ← Older Articles+$forall (no, ents) <- articles+ $with (art, cs, ts) <- ents+ <div .well>+ ^{articleView (Just $ (++) "art" $ (++) (show no) "-") art}+ <div .navi-links>+ <a href=@{articleLink art}>+ Permalink+ \ | #+ <a href="@{articleLink art}#comments">+ $if (==) cs 0+ _{MsgNoComments}+ $else+ _{MsgComments} (#{cs})+ \ | #+ <a href="@{articleLink art}#trackbacks">+ $if (==) ts 0+ _{MsgNoTrackbacks}+ $else+ _{MsgTrackbacks} (#{ts})+<ul class="pager">+ $if (>) offset 0+ <li .next>+ <a href="@{RootR}?of=#{max 0 (subtract offset 5)}">+ Newer Articles →+ $if hasMore+ <li .previous>+ <a href="@{RootR}?of=#{(+) offset 5}">+ ← Older Articles
+ templates/homepage.lucius view
@@ -0,0 +1,3 @@+.navi-links {+ text-align: right;+}
+ templates/normalize.lucius view
@@ -0,0 +1,439 @@+/*! normalize.css 2011-08-12T17:28 UTC · http://github.com/necolas/normalize.css */++/* =============================================================================+ HTML5 display definitions+ ========================================================================== */++/*+ * Corrects block display not defined in IE6/7/8/9 & FF3+ */++article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+nav,+section {+ display: block;+}++/*+ * Corrects inline-block display not defined in IE6/7/8/9 & FF3+ */++audio,+canvas,+video {+ display: inline-block;+ *display: inline;+ *zoom: 1;+}++/*+ * Prevents modern browsers from displaying 'audio' without controls+ */++audio:not([controls]) {+ display: none;+}++/*+ * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4+ * Known issue: no IE6 support+ */++[hidden] {+ display: none;+}+++/* =============================================================================+ Base+ ========================================================================== */++/*+ * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units+ * http://clagnut.com/blog/348/#c790+ * 2. Keeps page centred in all browsers regardless of content height+ * 3. Prevents iOS text size adjust after orientation change, without disabling user zoom+ * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/+ */++html {+ font-size: 100%; /* 1 */+ overflow-y: scroll; /* 2 */+ -webkit-text-size-adjust: 100%; /* 3 */+ -ms-text-size-adjust: 100%; /* 3 */+}++/*+ * Addresses margins handled incorrectly in IE6/7+ */++body {+ margin: 0;+}++/* + * Addresses font-family inconsistency between 'textarea' and other form elements.+ */++body,+button,+input,+select,+textarea {+ font-family: sans-serif;+}+++/* =============================================================================+ Links+ ========================================================================== */++a {+ color: #00e;+}++a:visited {+ color: #551a8b;+}++/*+ * Addresses outline displayed oddly in Chrome+ */++a:focus {+ outline: thin dotted;+}++/*+ * Improves readability when focused and also mouse hovered in all browsers+ * people.opera.com/patrickl/experiments/keyboard/test+ */++a:hover,+a:active {+ outline: 0;+}+++/* =============================================================================+ Typography+ ========================================================================== */++/*+ * Addresses styling not present in IE7/8/9, S5, Chrome+ */++abbr[title] {+ border-bottom: 1px dotted;+}++/*+ * Addresses style set to 'bolder' in FF3/4, S4/5, Chrome+*/++b, +strong { + font-weight: bold; +}++blockquote {+ margin: 1em 40px;+}++/*+ * Addresses styling not present in S5, Chrome+ */++dfn {+ font-style: italic;+}++/*+ * Addresses styling not present in IE6/7/8/9+ */++mark {+ background: #ff0;+ color: #000;+}++/*+ * Corrects font family set oddly in IE6, S4/5, Chrome+ * en.wikipedia.org/wiki/User:Davidgothberg/Test59+ */++pre,+code,+kbd,+samp {+ font-family: monospace, serif;+ _font-family: 'courier new', monospace;+ font-size: 1em;+}++/*+ * Improves readability of pre-formatted text in all browsers+ */++pre {+ white-space: pre;+ white-space: pre-wrap;+ word-wrap: break-word;+}++/*+ * 1. Addresses CSS quotes not supported in IE6/7+ * 2. Addresses quote property not supported in S4+ */++/* 1 */++q {+ quotes: none;+}++/* 2 */++q:before,+q:after {+ content: '';+ content: none;+}++small {+ font-size: 75%;+}++/*+ * Prevents sub and sup affecting line-height in all browsers+ * gist.github.com/413930+ */++sub,+sup {+ font-size: 75%;+ line-height: 0;+ position: relative;+ vertical-align: baseline;+}++sup {+ top: -0.5em;+}++sub {+ bottom: -0.25em;+}+++/* =============================================================================+ Lists+ ========================================================================== */++ul,+ol {+ margin: 1em 0;+ padding: 0 0 0 40px;+}++dd {+ margin: 0 0 0 40px;+}++nav ul,+nav ol {+ list-style: none;+ list-style-image: none;+}+++/* =============================================================================+ Embedded content+ ========================================================================== */++/*+ * 1. Removes border when inside 'a' element in IE6/7/8/9+ * 2. Improves image quality when scaled in IE7+ * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/+ */++img {+ border: 0; /* 1 */+ -ms-interpolation-mode: bicubic; /* 2 */+}++/*+ * Corrects overflow displayed oddly in IE9 + */++svg:not(:root) {+ overflow: hidden;+}+++/* =============================================================================+ Figures+ ========================================================================== */++/*+ * Addresses margin not present in IE6/7/8/9, S5, O11+ */++figure {+ margin: 0;+}+++/* =============================================================================+ Forms+ ========================================================================== */++/*+ * Corrects margin displayed oddly in IE6/7+ */++form {+ margin: 0;+}++/*+ * Define consistent margin and padding+ */++fieldset {+ margin: 0 2px;+ padding: 0.35em 0.625em 0.75em;+}++/*+ * 1. Corrects color not being inherited in IE6/7/8/9+ * 2. Corrects alignment displayed oddly in IE6/7+ */++legend {+ border: 0; /* 1 */+ *margin-left: -7px; /* 2 */+}++/*+ * 1. Corrects font size not being inherited in all browsers+ * 2. Addresses margins set differently in IE6/7, F3/4, S5, Chrome+ * 3. Improves appearance and consistency in all browsers+ */++button,+input,+select,+textarea {+ font-size: 100%; /* 1 */+ margin: 0; /* 2 */+ vertical-align: baseline; /* 3 */+ *vertical-align: middle; /* 3 */+}++/*+ * 1. Addresses FF3/4 setting line-height using !important in the UA stylesheet+ * 2. Corrects inner spacing displayed oddly in IE6/7+ */++button,+input {+ line-height: normal; /* 1 */+ *overflow: visible; /* 2 */+}++/*+ * Corrects overlap and whitespace issue for buttons and inputs in IE6/7+ * Known issue: reintroduces inner spacing+ */++table button,+table input {+ *overflow: auto;+}++/*+ * 1. Improves usability and consistency of cursor style between image-type 'input' and others+ * 2. Corrects inability to style clickable 'input' types in iOS+ */++button,+html input[type="button"], +input[type="reset"], +input[type="submit"] {+ cursor: pointer; /* 1 */+ -webkit-appearance: button; /* 2 */+}++/*+ * 1. Addresses box sizing set to content-box in IE8/9+ * 2. Addresses excess padding in IE8/9+ */++input[type="checkbox"],+input[type="radio"] {+ box-sizing: border-box; /* 1 */+ padding: 0; /* 2 */+}++/*+ * 1. Addresses appearance set to searchfield in S5, Chrome+ * 2. Addresses box sizing set to border-box in S5, Chrome (include -moz to future-proof)+ */++input[type="search"] {+ -webkit-appearance: textfield; /* 1 */+ -moz-box-sizing: content-box;+ -webkit-box-sizing: content-box; /* 2 */+ box-sizing: content-box;+}++/*+ * Corrects inner padding displayed oddly in S5, Chrome on OSX+ */++input[type="search"]::-webkit-search-decoration {+ -webkit-appearance: none;+}++/*+ * Corrects inner padding and border displayed oddly in FF3/4+ * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/+ */++button::-moz-focus-inner,+input::-moz-focus-inner {+ border: 0;+ padding: 0;+}++/*+ * 1. Removes default vertical scrollbar in IE6/7/8/9+ * 2. Improves readability and alignment in all browsers+ */++textarea {+ overflow: auto; /* 1 */+ vertical-align: top; /* 2 */+}+++/* =============================================================================+ Tables+ ========================================================================== */++/* + * Remove most spacing between table cells+ */++table {+ border-collapse: collapse;+ border-spacing: 0;+}
+ templates/post-article.hamlet view
@@ -0,0 +1,17 @@+<h1>_{MsgPostArticle}+<form method=post action=@{CreateR} enctype=#{enctype} #edit-form>+ <div .tabbalble>+ <ul .nav .nav-tabs>+ <li .active>+ <a href="#editor" data-toggle="tab">+ _{MsgEditOn}+ <li>+ <a href="#preview" data-toggle="tab" #show-preview>+ _{MsgPreview}+ <div .tab-content>+ <div .active .tab-pane #editor>+ ^{widget}++ <div .tab-pane #preview>+ <iframe src=@{PreviewR} #preview-contents .span7 height="400px">+ <input type=submit .btn>
+ templates/post-article.julius view
@@ -0,0 +1,11 @@+$(document).ready(function(){+ function updatePreview(data, type) {+ $("#preview-contents").html(data);+ }+ function reloadPreview() {+ var src = $('#src').val();+ var title = $('#title').val()+ $("#preview-contents").contents().find("html").load("/preview", $("#edit-form").serializeArray());+ }+ $('#show-preview').click(function(){ reloadPreview(); });+});
+ templates/post-article.lucius view
@@ -0,0 +1,3 @@+textarea#src {+ height: 250px;+}
+ templates/search.hamlet view
@@ -0,0 +1,9 @@+<form action="http://www.google.com/cse" id="cse-search-box">+ <div>+ <input type="hidden" name="cx" value="#{cse}">+ <input type="hidden" name="ie" value="UTF-8">+ <div .input-append>+ <input type="text" name="q" .span2>+ <button type="submit" name="sa" .btn>+ _{MsgSearch}+<script type="text/javascript" src="http://www.google.com/cse/brand?form=cse-search-box&">
+ templates/tag.hamlet view
@@ -0,0 +1,8 @@+<h1>_{MsgArticlesForTag tag}+<ul>+ $forall art <- sortBy (flip $ on compare articleCreatedDate) articles+ <li>+ <a href=@{ArticleR (toEnum $ articleCreatedDate art) (articleIdent art)}>+ #{show $ ModifiedJulianDay $ toInteger $ articleCreatedDate art}+ \ #{show $ timeToTimeOfDay $ toEnum $ articleCreatedTime art}+ \ - #{articleTitle art}
+ templates/user-settings.hamlet view
@@ -0,0 +1,5 @@+<h2>+ Settings+<form method=post action=@{UserSettingsR} enctype=#{enctype}>+ ^{widget}+ <input type=submit>