dbda8d6ce9 2007-07-21 drh: /* 5cd9597428 2007-09-24 jnc: ** Copyright (c) 2006,2007 D. Richard Hipp dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This program is free software; you can redistribute it and/or dbda8d6ce9 2007-07-21 drh: ** modify it under the terms of the GNU General Public dbda8d6ce9 2007-07-21 drh: ** License version 2 as published by the Free Software Foundation. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This program is distributed in the hope that it will be useful, dbda8d6ce9 2007-07-21 drh: ** but WITHOUT ANY WARRANTY; without even the implied warranty of dbda8d6ce9 2007-07-21 drh: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dbda8d6ce9 2007-07-21 drh: ** General Public License for more details. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** You should have received a copy of the GNU General Public dbda8d6ce9 2007-07-21 drh: ** License along with this library; if not, write to the dbda8d6ce9 2007-07-21 drh: ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, dbda8d6ce9 2007-07-21 drh: ** Boston, MA 02111-1307, USA. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** Author contact information: dbda8d6ce9 2007-07-21 drh: ** drh@hwaci.com dbda8d6ce9 2007-07-21 drh: ** http://www.hwaci.com/drh/ dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ******************************************************************************* dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** This file contains code to implement the basic web page look and feel. dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: #include "config.h" dbda8d6ce9 2007-07-21 drh: #include "style.h" dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Elements of the submenu are collected into the following dbda8d6ce9 2007-07-21 drh: ** structure and displayed below the main menu by style_header(). dbda8d6ce9 2007-07-21 drh: ** dbda8d6ce9 2007-07-21 drh: ** Populate this structure with calls to style_submenu_element() dbda8d6ce9 2007-07-21 drh: ** prior to calling style_header(). dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: static struct Submenu { dbda8d6ce9 2007-07-21 drh: const char *zLabel; dbda8d6ce9 2007-07-21 drh: const char *zTitle; dbda8d6ce9 2007-07-21 drh: const char *zLink; dbda8d6ce9 2007-07-21 drh: } aSubmenu[30]; dbda8d6ce9 2007-07-21 drh: static int nSubmenu = 0; dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Add a new element to the submenu dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void style_submenu_element( dbda8d6ce9 2007-07-21 drh: const char *zLabel, dbda8d6ce9 2007-07-21 drh: const char *zTitle, dbda8d6ce9 2007-07-21 drh: const char *zLink dbda8d6ce9 2007-07-21 drh: ){ dbda8d6ce9 2007-07-21 drh: assert( nSubmenu < sizeof(aSubmenu)/sizeof(aSubmenu[0]) ); dbda8d6ce9 2007-07-21 drh: aSubmenu[nSubmenu].zLabel = zLabel; dbda8d6ce9 2007-07-21 drh: aSubmenu[nSubmenu].zTitle = zTitle; dbda8d6ce9 2007-07-21 drh: aSubmenu[nSubmenu].zLink = zLink; dbda8d6ce9 2007-07-21 drh: nSubmenu++; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Compare two submenu items for sorting purposes dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: static int submenuCompare(const void *a, const void *b){ dbda8d6ce9 2007-07-21 drh: const struct Submenu *A = (const struct Submenu*)a; 50a58adb76 2007-10-10 drh: const struct Submenu *B = (const struct Submenu*)b; dbda8d6ce9 2007-07-21 drh: return strcmp(A->zLabel, B->zLabel); dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Draw the header. dbda8d6ce9 2007-07-21 drh: */ 66f4caa379 2007-07-23 drh: void style_header(const char *zTitle){ dbda8d6ce9 2007-07-21 drh: const char *zLogInOut = "Logout"; f3807dbd88 2007-10-10 jnc: char *zProjectDescr = db_get("project-description", 0); 916b6e4b3b 2007-07-21 drh: login_check_credentials(); dbda8d6ce9 2007-07-21 drh: @ <html> 07eaead5dc 2007-09-23 jnc: @ <head> 07eaead5dc 2007-09-23 jnc: @ <title>%s(zTitle)</title> 07eaead5dc 2007-09-23 jnc: @ <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="%s(g.zBaseURL)/timeline.rss"> 5cd9597428 2007-09-24 jnc: @ <link rel="stylesheet" href="%s(g.zBaseURL)/style.css" type="text/css" media="screen"> f3807dbd88 2007-10-10 jnc: if( zProjectDescr != 0 ){ f3807dbd88 2007-10-10 jnc: @ <meta name="description" content="%s(zProjectDescr)"> f3807dbd88 2007-10-10 jnc: } 07eaead5dc 2007-09-23 jnc: @ </head> 5cd9597428 2007-09-24 jnc: @ <body> 5cd9597428 2007-09-24 jnc: @ <div id="page-title">%s(zTitle)</div> 5cd9597428 2007-09-24 jnc: @ <div id="login-status"> 9c952d247e 2007-07-31 drh: if( g.zLogin==0 ){ 5cd9597428 2007-09-24 jnc: @ not logged in dbda8d6ce9 2007-07-21 drh: zLogInOut = "Login"; dbda8d6ce9 2007-07-21 drh: }else{ 5cd9597428 2007-09-24 jnc: @ logged in as %h(g.zLogin) 66f4caa379 2007-07-23 drh: } 5cd9597428 2007-09-24 jnc: @ </div> 5cd9597428 2007-09-24 jnc: @ <div id="main-menu"> 50a58adb76 2007-10-10 drh: @ <a href="%s(g.zBaseURL)/home">Home</a> fd36718ad9 2007-07-31 drh: if( g.okRead ){ afcdc7ec97 2007-08-01 drh: @ | <a href="%s(g.zBaseURL)/leaves">Leaves</a> afcdc7ec97 2007-08-01 drh: @ | <a href="%s(g.zBaseURL)/timeline">Timeline</a> dbda8d6ce9 2007-07-21 drh: } 66f4caa379 2007-07-23 drh: #if 0 dbda8d6ce9 2007-07-21 drh: @ | <font color="#888888">Search</font> dbda8d6ce9 2007-07-21 drh: @ | <font color="#888888">Ticket</font> dbda8d6ce9 2007-07-21 drh: @ | <font color="#888888">Reports</font> 66f4caa379 2007-07-23 drh: #endif dbda8d6ce9 2007-07-21 drh: if( g.okSetup ){ dbda8d6ce9 2007-07-21 drh: @ | <a href="%s(g.zBaseURL)/setup">Setup</a> dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: if( !g.noPswd ){ dbda8d6ce9 2007-07-21 drh: @ | <a href="%s(g.zBaseURL)/login">%s(zLogInOut)</a> dbda8d6ce9 2007-07-21 drh: } 5cd9597428 2007-09-24 jnc: @ </div> dbda8d6ce9 2007-07-21 drh: if( nSubmenu>0 ){ dbda8d6ce9 2007-07-21 drh: int i; 64569b3a7a 2007-09-25 drh: @ <div id="sub-menu"> dbda8d6ce9 2007-07-21 drh: qsort(aSubmenu, nSubmenu, sizeof(aSubmenu[0]), submenuCompare); dbda8d6ce9 2007-07-21 drh: for(i=0; i<nSubmenu; i++){ dbda8d6ce9 2007-07-21 drh: struct Submenu *p = &aSubmenu[i]; dbda8d6ce9 2007-07-21 drh: char *zTail = i<nSubmenu-1 ? " | " : ""; dbda8d6ce9 2007-07-21 drh: if( p->zLink==0 ){ 5cd9597428 2007-09-24 jnc: @ <span class="label">%h(p->zLabel)</span> 5cd9597428 2007-09-24 jnc: @ <span class="tail">%s(zTail)</span> dbda8d6ce9 2007-07-21 drh: }else{ 5cd9597428 2007-09-24 jnc: @ <a class="label" href="%T(p->zLink)">%h(p->zLabel)</a> 5cd9597428 2007-09-24 jnc: @ <span class="tail">%s(zTail)</span> dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: } 01ce2cf3dc 2007-09-24 jnc: @ </div> dbda8d6ce9 2007-07-21 drh: } 5cd9597428 2007-09-24 jnc: @ <div id="page"> dbda8d6ce9 2007-07-21 drh: g.cgiPanic = 1; dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** Draw the footer at the bottom of the page. dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void style_footer(void){ 5cd9597428 2007-09-24 jnc: /* end the <div id="page"> from style_header() */ 5cd9597428 2007-09-24 jnc: @ </div> 5cd9597428 2007-09-24 jnc: @ <div id="style-footer"> c2d1e3c70a 2007-09-22 drh: @ Fossil version %s(MANIFEST_VERSION) %s(MANIFEST_DATE) 5cd9597428 2007-09-24 jnc: @ </div> dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: 5cd9597428 2007-09-24 jnc: dbda8d6ce9 2007-07-21 drh: /* 5cd9597428 2007-09-24 jnc: ** WEBPAGE: style.css dbda8d6ce9 2007-07-21 drh: */ 5cd9597428 2007-09-24 jnc: void page_style_css(void){ 50a58adb76 2007-10-10 drh: char *zCSS = 0; 5cd9597428 2007-09-24 jnc: 5cd9597428 2007-09-24 jnc: cgi_set_content_type("text/css"); 50a58adb76 2007-10-10 drh: zCSS = db_get("css",0); 50a58adb76 2007-10-10 drh: if( zCSS ){ 50a58adb76 2007-10-10 drh: cgi_append_content(zCSS, -1); 4f641e7e4e 2007-09-02 drh: }else{ 5cd9597428 2007-09-24 jnc: /* No CSS file found, use our own */ 5cd9597428 2007-09-24 jnc: /* 5cd9597428 2007-09-24 jnc: ** Selector order: tags, ids, classes, other 5cd9597428 2007-09-24 jnc: ** Content order: margin, borders, padding, fonts, colors, other 5cd9597428 2007-09-24 jnc: ** Note: Once things are finialize a bit we can collapse this and 5cd9597428 2007-09-24 jnc: ** make it much smaller, if necessary. Right now, it's verbose 5cd9597428 2007-09-24 jnc: ** but easy to edit. 5cd9597428 2007-09-24 jnc: */ 5cd9597428 2007-09-24 jnc: @ body { 5cd9597428 2007-09-24 jnc: @ margin: 0px; 5cd9597428 2007-09-24 jnc: @ padding: 0px; 5cd9597428 2007-09-24 jnc: @ background-color: white; 5cd9597428 2007-09-24 jnc: @ } 5cd9597428 2007-09-24 jnc: @ #page-title { 5cd9597428 2007-09-24 jnc: @ padding: 10px 10px 10px 10px; 99eabf9b0c 2007-09-25 jnc: @ font-size: 1.8em; 5cd9597428 2007-09-24 jnc: @ font-weight: bold; 99eabf9b0c 2007-09-25 jnc: @ background-color: #6a7ec7; 99eabf9b0c 2007-09-25 jnc: @ color: #0a1e67; 5cd9597428 2007-09-24 jnc: @ } 5cd9597428 2007-09-24 jnc: @ #login-status { 5cd9597428 2007-09-24 jnc: @ padding: 0px 10px 10px 0px; 5cd9597428 2007-09-24 jnc: @ font-size: 0.9em; 5cd9597428 2007-09-24 jnc: @ text-align: right; 99eabf9b0c 2007-09-25 jnc: @ background-color: #6a7ec7; 99eabf9b0c 2007-09-25 jnc: @ color: white; 5cd9597428 2007-09-24 jnc: @ position: absolute; 5cd9597428 2007-09-24 jnc: @ top: 10; 5cd9597428 2007-09-24 jnc: @ right: 0; 5cd9597428 2007-09-24 jnc: @ } 5cd9597428 2007-09-24 jnc: @ #main-menu { 99eabf9b0c 2007-09-25 jnc: @ padding: 5px 10px 5px 10px; 5cd9597428 2007-09-24 jnc: @ font-size: 0.9em; 99eabf9b0c 2007-09-25 jnc: @ font-weight: bold; 5cd9597428 2007-09-24 jnc: @ text-align: center; 99eabf9b0c 2007-09-25 jnc: @ letter-spacing: 1px; 99eabf9b0c 2007-09-25 jnc: @ background-color: #414f84; 99eabf9b0c 2007-09-25 jnc: @ color: white; 5cd9597428 2007-09-24 jnc: @ } 5cd9597428 2007-09-24 jnc: @ #sub-menu { 5cd9597428 2007-09-24 jnc: @ padding: 3px 10px 3px 0px; 5cd9597428 2007-09-24 jnc: @ font-size: 0.9em; 5cd9597428 2007-09-24 jnc: @ text-align: center; 99eabf9b0c 2007-09-25 jnc: @ background-color: #414f84; 99eabf9b0c 2007-09-25 jnc: @ color: white; 99eabf9b0c 2007-09-25 jnc: @ } 99eabf9b0c 2007-09-25 jnc: @ #main-menu a, #main-menu a:visited, #sub-menu a, #sub-menu a:visited { 99eabf9b0c 2007-09-25 jnc: @ padding: 3px 10px 3px 10px; 99eabf9b0c 2007-09-25 jnc: @ color: white; 5cd9597428 2007-09-24 jnc: @ } 99eabf9b0c 2007-09-25 jnc: @ #main-menu a:hover, #sub-menu a:hover { 99eabf9b0c 2007-09-25 jnc: @ color: #414f84; 99eabf9b0c 2007-09-25 jnc: @ background-color: white; 5cd9597428 2007-09-24 jnc: @ } 5cd9597428 2007-09-24 jnc: @ #page { 5cd9597428 2007-09-24 jnc: @ padding: 10px 20px 10px 20px; 5cd9597428 2007-09-24 jnc: @ } 5cd9597428 2007-09-24 jnc: @ #style-footer { 5cd9597428 2007-09-24 jnc: @ font-size: 0.8em; 5cd9597428 2007-09-24 jnc: @ margin-top: 12px; 99eabf9b0c 2007-09-25 jnc: @ padding: 5px 10px 5px 10px; 99eabf9b0c 2007-09-25 jnc: @ text-align: right; 99eabf9b0c 2007-09-25 jnc: @ background-color: #414f84; 99eabf9b0c 2007-09-25 jnc: @ color: white; 99eabf9b0c 2007-09-25 jnc: @ } cfc7984ede 2007-09-25 jnc: @ table.label-value th { cfc7984ede 2007-09-25 jnc: @ text-align: right; cfc7984ede 2007-09-25 jnc: @ vertical-align: top; cfc7984ede 2007-09-25 jnc: @ } cfc7984ede 2007-09-25 jnc: @ div.section-title { cfc7984ede 2007-09-25 jnc: @ margin-bottom: 0px; cfc7984ede 2007-09-25 jnc: @ padding: 1px 1px 1px 1px; cfc7984ede 2007-09-25 jnc: @ font-size: 1.2em; cfc7984ede 2007-09-25 jnc: @ font-weight: bold; cfc7984ede 2007-09-25 jnc: @ background-color: #6a7ec7; cfc7984ede 2007-09-25 jnc: @ color: #0a1e67; 5cd9597428 2007-09-24 jnc: @ } 4f641e7e4e 2007-09-02 drh: } dbda8d6ce9 2007-07-21 drh: } dbda8d6ce9 2007-07-21 drh: dbda8d6ce9 2007-07-21 drh: /* dbda8d6ce9 2007-07-21 drh: ** WEBPAGE: test_env dbda8d6ce9 2007-07-21 drh: */ dbda8d6ce9 2007-07-21 drh: void page_test_env(void){ 66f4caa379 2007-07-23 drh: style_header("Environment Test"); 218577e3af 2007-10-11 drh: @ g.zBaseURL = %h(g.zBaseURL)<br> 218577e3af 2007-10-11 drh: @ g.zTop = %h(g.zTop)<hr> dbda8d6ce9 2007-07-21 drh: cgi_print_all(); dbda8d6ce9 2007-07-21 drh: style_footer(); dbda8d6ce9 2007-07-21 drh: }