/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

/* JSPWiki stylesheet jspwiki.css
 * April 07, based on BrushedTemplate
 * Styles can be overwritten by print and skin stylesheets
 * /

/* COLOR scheme
	normal font color
	#f9f9f9 code, comment, weblogentries, (light grey)
	#d7d7d7 table header(darker grey)
	#ddd table borders,
	#d9e8ff edit background
	#eee hover color
	#f93 highlight color, searchbars, ...  (amber)
	#e0e0ff information (light blue)
	#ffff80 warning (light yellow)
	#ffe0e0 error (light pink)
 */

/* +++ 010 LAYOUT of main ID blocks +++ */
#wikibody {
	margin:1em 2em;
	padding:0.25em;
}
#header, #footer {
	padding:0 0 0 20%;
}
#header .applicationlogo {
	position:absolute;
	left:2em;
	right:auto;
	width:18%;
}
#footer .applicationlogo,
#footer .companylogo,
#footer .wikiversion,
#footer .rssfeed,
#header .companylogo {
	display:none;
}
#header .userbox {
	float:right;
}
#header .pagename {
	float:left;
}
#header .searchbox {
	clear:right;
	float:right;
}
#header .breadcrumbs {
	clear:both;
}
#favorites {
	float:left;
	overflow:hidden; /*avoid overflow for wide content of leftmenu or leftmenufooter */
	margin-top:1.75em;
	width:18%;
	padding:0.5em;
}
#favorites .userbox {
	border:1px solid #ddd;
	margin-bottom:0.5em;
	padding:0.25em 0.5em;
	display:none;
}
#favorites .login, #favorites .logoff {
	clear:left;
}
#footer .copyright {
}
#content {
	margin:1em 0;
}
/*#wikibody.fav-left*/ #page, #wikibody.fav-right #favorites {
	float:right;
}
#wikibody.fav-right #page, /*#wikibody.fav-left*/ #favorites {
	float:left;
}
/*ie6 hack*/
* html  #page, * html #wikibody.fav-right #favorites {
	margin-left:-3px; /*Three Pixel Text Jog*/
}
* html #wikibody.fav-right #page, * html #favorites {
	margin-right:-3px;/*Three Pixel Text Jog*/
}
#wikibody.fav-right #header, #wikibody.fav-right #footer {
	padding:0 20% 0 0;
}
#wikibody.fav-right #header .applicationlogo {
	left:auto;
	right:2em;
}
#page {
	width:80%;
}
#wikibody.fav-slide #page {
	width:100%;
}

#actionsTop	{
	float:right;
	z-index:10;
}
/* ie hack */
* html #actionsTop	{
	margin-top:1px;
}
#actionsBottom {
	text-align:right;
	margin-bottom:0.5em;
}
* html #header, * html .userbox {
	height:1%; /*hasLayout:true; --ie peekaboo/layout hack */
}

b.roundedCorners {
}

/* +++ 200 Generic stuff here +++ */
/* refined global reset */
/* inspired by http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/ and yui reset */
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
	margin:0;
	padding:0;
	border:0;
	outline:none;
	/* vertical-align:baseline; seems to give printing errors in FF */
}
/* remember to define focus styles! */
:focus {
	outline:0;
}
body {
	color:black;
	background:white;
	margin: 0;
	/*font: 12px/1.5 "Lucida Grande", Arial, Helvetica, Sans-Serif;*/
	font:12px/140% Verdana,Arial,Helvetica,sans-serif;
}
table {
	border-collapse:collapse;
	border-spacing:0;
	empty-cells:show;
}

h1, h2, h3, h4, p, blockquote, label, ul, ol, dl, hr, .hr, .quote {
	margin:0.5em 0;
}
th, td {
	padding:0.25em 0.5em;
}
.hr {
	display:block;
	border-bottom:1px solid #ddd;
}
hr, .hr, .clearbox {
	clear:both;
}

/* +++ 210 Page titles, headings, and paragraphs +++ */
.titlebox {
	color:#555;
	padding:0.25em 1em;
}
.pagename {
	font-size:175%;
	line-height:1.4;
	font-weight:bold;
	margin-bottom:0.5em;
}
/*
Headings:
	The headings h2, h3 and h4 get a {{clear:left}} so they can appear
	side by side with .commentbox-es.

	The {{.editsection}} and {{hashlink}} define the styling of the
	[[Edit] and # hash-hover link on each heading.

DOM structure:
>	<h2 id="section-...">Header-Title
>	<a class="hashlink" href="...">#</a>
>	<a class="editsection href="...&section=0">[Edit]</a>
>	</h2>

*/
h2, h3, h4 {
	clear:left;
	margin:1em 0 0.5em 0;
	padding:0.25em;
	line-height:1.2;
}
h2 { font-size: 150%; }
h2 .editsection, h2 .hashlink { font-size: 67%; }
h3 { font-size: 132%; }
h3 .editsection, h3 .hashlink { font-size: 76%; }
h4 { font-size: 116%; }
h4 .editsection, h4 .hashlink { font-size: 86%; }

a.editsection, a.hashlink {
	font-weight:normal;
	line-height:1.2;
	padding:0.25em;
	text-decoration:none;
	color:#ccc;
}
a.editsection:hover, a.hashlink:hover {
	background-color:#ddd;
	color:blue !important;
}
h2:hover .editsection, h3:hover .editsection, h4:hover .editsection,
h2:hover .hashlink, h3:hover .hashlink, h4:hover .hashlink {
	color:#999;
}


b, i {
	color:inherit;
}
br {
	clear:both;
}
/* +++ 220 Lists and bullets +++ */
ul ul, ol ol {
	margin:0;
}
ul,ol {
	padding-left:3em;
}
dl dt {
	font-weight:bold;
}
dl dd {
	margin-left:2em;
}

/* +++ 225 Forms, Labels, form-values and form-help +++ */
.wikiform {
}
.wikiform tr {
	vertical-align:middle;
}
.wikiform td {
}
.formvalue {
	font-weight:bold;
}
.formhelp {
	font-style:italic;
	margin:0.5em 0;
}
/*
textarea, input[type=text] {
	padding: 1px 0 1px 3px;
	border: 1px solid #ddd;
}
*/
legend, label {
	font-weight:bold;
	white-space:nowrap;
	padding-right:0.5em;
}
fieldset {
	margin:0.5em 0;
	padding:0.5em;
	border:1px solid #ddd;
}
.wikiform option {
    padding:0.1em 0.5em;
}
.wikiform input {
    padding:0.5em;
}
.wikiform input, .wikiform option {
	color:#555;
	border:1px solid #ddd;
	-moz-border-radius:5px;
	-webkit-border-radius:5px;
}
.wikiform input[type='submit'], .wikiform input[type='button'],.wikiform input[type='file'], .wikiform button, .btn {
	display:inline-block;
	cursor:pointer;

	background: transparent;
	background: -moz-linear-gradient(top,  transparent,  rgba(0,0,0,.1));
	background: -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0,0,0,.1)));
	text-shadow:0 1px 0 rgba(255,255,255,.8);
}
.wikiform input[type='submit']:hover, .wikiform input[type='button']:hover,.wikiform input[type='file']:hover, .wikiform button:hover, .btn:hover {
	background: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,.1)), to(transparent));
	background: -moz-linear-gradient(top,  rgba(0,0,0,.1),  transparent);
}

/* +++ 240 Pre-formatted text blocks and code +++ */
code, tt, pre {
	font: Monaco, "Courier New", Courier, monospace;
	overflow: auto;
}
pre {
	clear:both;
	white-space:pre;
	margin:1em 2.5%;
	padding:0.5em;
	background:#f9f9f9;
	border:1px solid #ddd;
	_width:100%;
	_overflow-x:auto;
	_padding-bottom:1.5em; /*take scrollbar into account on ie ugh*/
}

#previewcontent, #info, #pagecontent, #attach, #findcontent, .diffbody {
	overflow-y:hidden; /*safari only -- ?? */
	_width:100%;
	_overflow-x:auto;
	_padding-bottom:1.5em !important; /*take scrollbar into account on ie ugh*/
}

/* +++ 250 Hyperlinks +++ */
a {
	color:blue;
}
a:link {
}
a:visited {
}
a:active {
}
.hover {
	background-color:#eee;
}
/* ie6 hack */
* html .hover {
	background-color:#eee;
}
/* ie7 hack */
*:first-child+html .hover {
	background-color:#eee;
}

a:hover {
}
a:focus {
}
a.wikipage {
}
a.createpage {
	color:red;
	text-decoration:none;
	border-bottom:1px dashed red;
}
a.external {
}
a.interwiki {
}
a.feed {
	background-image:url(../../images/jspwiki-strip.gif);
	background-repeat:no-repeat;
	background-position:0 0;
	text-indent:16px;
	margin:0 0.5em;
	width:16px;
	height:16px;
	text-decoration:none;
	overflow:hidden;
	display:block;
	float:right;
}
/* switch to gif for better ie rendering, but selectors nok in ie6 (fine in ie7) */
/*a.infolink {
	background-image:url("../../images/jspwiki-strip.gif");
	background-repeat:no-repeat;
	background-position:right -16px;
	padding-right:16px;
	line-height:16px !important;
	height:16px;
	overflow:hidden;
}
a.infolink img {
	display:none;
}*/

/* +++ 260 Image styles +++ */
img {
	border:none;
	/* max-width:99%; FIXME ff ok to fit in parent */
}
img.inline {
}
img.outlink {
}
img.attlink {
}
.applicationlogo a {
	display:block;
	height:64px;
	width:64px;
	overflow:hidden;
	margin-left:auto;
	margin-right:auto;
	text-indent:-1000px;
	background:url(../../images/jspwiki_logo.png) -64px 0 no-repeat;
}
.applicationlogo a:hover {
	background-position:0 0;
}


/* +++ 270 Footnotes and small text +++ */
a.footnoteref {
	vertical-align:super;
	font-size:85%;
}
a.footnote {
	vertical-align:super;
	color:#04A;
}
.small {
	font-size:85%;
}
.sub {
	font-size:85%;
	vertical-align:sub;
}
.sup {
	font-size:85%;
	vertical-align:super;
}
.strike {
	text-decoration:line-through;
}
.center {
	text-align:center;
}
.center table {
	margin-left:auto;
	margin-right:auto;
	text-align:left;
}
.quote {
	border-left:4px solid #bbb;
	padding-left:3em;
	margin:0 0.5em;
}
.ltr {
	direction:ltr;
}
.rtl {
	direction:rtl;
}
.invisible {
	display:none;
}  /* also used by the TASKS plugin */


/* +++ 280 Convenience styles and info/warning/error dialogs +++ */
.additinfo {
	background-color:#e0e0ff;
}
.diffnote, .information, .warning, .error {
	display:block;
	clear:both;
	margin:1em .5em;
	padding:1em 1em 1em 3em;
	background-position:.8em .9em;
	background-repeat:no-repeat;
}
td .information, td .warning, td .error {
	margin:0;
}
.diffnote, .information {
	background-image:url(images/information.gif);
	background-color:#e0e0ff;
}
.warning {
	background-image:url(images/exclamation.gif);
	background-color:#ffff80;
}
.error {
	background-image:url(images/error.gif);
	background-color:#ffe0e0;
	color:#c00000;
}
.error * li {
	margin-left:0;
	padding-left:0;
}

/* +++ 290 Comment boxes (used on some pages) +++ */
.commentbox {
	display:block;
	float:right;
	clear:right;
	width:35%;
	overflow:hidden;
	border:1px solid #ddd;
	background:#f9f9f9;
	padding:0 0.5em;
	margin:0 0 1em 0.5em;
	font-size:90%;
}
.commentbox li {
	margin-left:0;
	padding-left:0;
}

/* +++ 300 Wiki tables and zebra tables +++ */
.wikitable {
	margin:0.5em 0.25em;
}
.wikitable tr {
	vertical-align:top;
}
.wikitable * th {
	border:1px solid #ddd;
	background-color:#eee;
	vertical-align:top;
}
.wikitable * td {
	border:1px solid #ddd;
	vertical-align:top;
	text-align:left;
	/*word-wrap:break-word;*/
}
.zebra-table tr.odd td {
	background-color:#eee;
}
.wikitable * td.split {
	border-top:1px solid #d9d9d9;
} /* CHECK */

/* +++ 350 Attachments +++ */
#attach {
}
/* upload submit button */
#upload {
	float:left;
}
#progressbar {
	float:left;
	margin-left:1em;
	width:30em;
	border:2px solid #ddd;
	visibility:hidden;
}
#progressbar .ajaxprogress {
	background:url(images/progress.gif) repeat-x;
	height:18px;
	text-align:center;
	width:0;
}
.attachtype {
	line-height:1.6;
	font-size:11px;
	padding-left:20px;
	background-repeat:no-repeat;
	background-position:0 0;
	background-image:url(images/attach-strip.png);
}
#attach-gif { background-position:0 -112px; }
#attach-png { background-position:0 -112px; }
#attach-bmp { background-position:0 -112px; }
#attach-jpg { background-position:0 -112px; }
#attach-jpeg { background-position:0 -112px; }
#attach-text { background-position:0 -16px; }
#attach-txt { background-position:0 -16px; }
#attach-zip { background-position:0 -128px; }
#attach-jar { background-position:0 -128px; }
#attach-tar { background-position:0 -128px; }
#attach-pdf { background-position:0 -80px; }
#attach-doc { background-position:0 -32px; }
#attach-xls { background-position:0 -48px; }
#attach-ppt { background-position:0 -64px; }
#attach-swf { background-position:0 -96px; }
#attach-mov { background-position:0 -160px; }
#attach-mp3 { background-position:0 -144px; }
#attach-wav { background-position:0 -144px; }

/* +++ 400 Styles for specific JSPs +++ */

/* +++ 405 AttachmentTab +++ */

/* +++ 410 CommentContent +++ */
#commentcontent {
}

/* +++ 415 ConflictContent +++ */
#conflict,
#conflictother,
#conflictown {
}

/* +++ 420 DiffContent and Diff Providers:Traditional and External +++ */
#diffcontent {
	clear:both;
}
.diffbody {
	padding:0.5em;
}
/* .diffnote equals .information */
td.diffadd, td.diffrem, td.diff {
	font:110% Monaco, "Courier New", Courier, monospace;
	line-height:1;
}
td.diffadd {
	background:#9f9;
}
td.diffrem {
	background:#f93;
}
td.diff {
	background:#fff;
}

/* +++ 421 Contextual diff provider +++ */
.diff-wikitext {
	font:110% Monaco, "Courier New", Courier, monospace;
	line-height:1;
	overflow:auto;
}
.diff-insertion {
	background:#9f9;
	text-decoration:none;
	color:black;
}
.diff-deletion {
	background:#f93;
	text-decoration:line-through;
	color:black;
}
.diff-nextprev {
	vertical-align:super;
	text-decoration:none;
}


/* +++ 425 Edit/EditContent and CommentContent +++ */
body.edit {
}
body.comment {
}
#edithelp {
}

/* +++ 430 Edit/EditContent +++ */
.textarea-resizer {
    background:#eee url(images/resize-horizontal.gif) top center;
	cursor:s-resize; /* css3 row-resize */
    font-size:1px;
	height:6px;
    line-height:6px;
    overflow:hidden;
}

#toolbuttons, #toolextra, #searchbar {
	margin-left:1em;
	clear:both;
}
#tools span {
	float:left;
	display:block;
	padding:0.25em 0;
	margin-right:1em;
}
#toolbuttons span {
	border:1px solid #ddd;
}
a.tool {
	float:left;
	display:block;
	background:transparent;
	margin:2px;
	text-decoration: none;
}
a.tool:hover, .btn:hover {
	background-color:#ddd !important;
}
#tools a.tool {
	border:none;
	background-repeat:no-repeat;
	background-image:url("images/editor-strip.gif");
	background-color:transparent;
	height:16px;
	width:16px;
	text-indent:20px;
	overflow:hidden;
}

#tbREDO		{ background-position:0 0; width:auto !important;}
#tbUNDO		{ background-position:0 -16px; width:auto !important;}

/*#tbOUTLINE	{ background-position:0 0; width:auto !important;}
#tbOUTLINE	{
	width:auto !important;
	background-image:url("images/book_open.png") !important;
}
*/
/*
label[for="edittoc"] {
	background-repeat:no-repeat;
	background-position:center left;
	xxbackground-image:url("images/editor-strip.gif");
	background-image:url("images/book_open.png") !important;
	background-color:transparent;
	padding:2px 0 2px 20px;
}
*/
#tbH1 		{ background-position:0 -192px; }
#tbH2 		{ background-position:0 -208px; }
#tbH3 		{ background-position:0 -224px; }
#tbB  		{ background-position:0 -176px; }
#tbI  		{ background-position:0 -256px; }
#tbLink   	{ background-position:0 -48px; }
#tbMONO   	{ background-position:0 -160px; }
/*
#tbColor  	{ background-image:url("images/paintbrush.png");  }
#tbBackground { background-image:url("images/paintcan.png");  }
*/
#tbPRE   	{ background-position:0 -64px; }
#tbCODE   	{ background-position:0 -80px; }
#tbHR 		{ background-position:0 -240px; }
#tbBR 		{ background-position:0 -112px; }
#tbDL 		{ background-position:0 -272px; }
#tbSUP		{ background-position:0 -336px; }
#tbSUB		{ background-position:0 -320px; }
#tbSTRIKE 	{ background-position:0 -304px; }
#tbUL 		{ background-position:0 -256px; }
#tbOL 		{ background-position:0 -272px; }
#tbLEFT   	{ background-position:0 -288px; }
#tbCENTER 	{ background-position:0 -304px; }
#tbRIGHT  	{ background-position:0 -320px; }
#tbJUST   	{ background-position:0 -336px; }
#tbQUOTE  	{ background-position:0 -272px; }
#tbIMG		{ background-position:0 -96px; }
#tbTABLE  	{ background-position:0 -144px; }
#tbTOC		{ background-position:0 -32px; }
#tbTAB		{ background-position:0 -128px; }
#tbSIGN		{ background-position:0 -288px; }

.editor {
	font:110% Monaco, "Courier New", Courier, monospace;
	padding:4px;
	width:99%;
}
#toctoc {
	position:relative;
	margin:0.5em 0;
}
#toctoc label {
	display:block;
	margin:0;
	padding:0.5em;
}
#toctoc ul {
	border:3px solid #eee;
	width:auto;
	overflow:auto;
	height:150px;
	list-style:none;
	margin:0;
	padding:0;
}
#toctoc a {
	display:block;
	padding:0 0.5em;
	cursor:pointer;
	overflow:hidden;
	white-space:nowrap;
}

/* ie6 hack ensure moremenu remains properly aligned */
* html #editorarea {
	padding:4px 0;
}
/*ie7 hack */
*:first-child+html #editorarea {
	padding:4px 0;
}
#submitbuttons input {
	margin-right:2em;
}
#commentcontent, #editcontent {
	width:100%;
}

#searchbar {
	display:block !important;
}
#searchbar span {
	white-space:nowrap;
}
#searchbarhelp {
}
#findSuggestionMenu {
	position:absolute;
	color:white;
	background-color:rgba(0,0,0,0.7);
	-moz-border-radius:10px;
	-webkit-border-radius:5px;
	border-radius:10px;
	-webkit-box-shadow:0 0 5px rgba(0, 0, 0, 0.5);
	box-shadow:0 0 5px rgba(0, 0, 0, 0.5);
	z-index:10;
	font-size:85%;
	overflow:hidden;
}
/* ie6 hack */
* html #findSuggestionMenu {
	background:url(images/tip.png) top left;
}
/* ie7 hack */
*:first-child+html #findSuggestionMenu {
	background:url(images/tip.png) top left;
}

#findSuggestionMenu ul {
	list-style:none;
	margin:0;
	padding:0;
}
#findSuggestionMenu li {
	padding:0.25em 0.5em;
	cursor:pointer;
}
#findSuggestionMenu .hover {
	background-color:rgba(0,0,0,0.5);
	-moz-border-radius:10px;
	-webkit-border-radius:5px;
	border-radius:10px;
}
/* ie6 hack */
* html #findSuggestionMenu .hover {
	background-color:black;
}
/* ie7 hack */
*:first-child+html #findSuggestionMenu .hover {
	background-color:black;
}


/* +++ 440 Favorites +++ */
/* fixme
#collapseFavs {
	position:absolute;
	margin-left:-1px;
	left:-0.5em;
	top:-1px;
	width:0.5em;
	height:100%;
	background:#f9f9f9;
	border-top:1px solid #f9f9f9;
	border-bottom:1px solid #f9f9f9;
	cursor:pointer;
}
#wikibody.fav-right #collapseFavs {
	left:auto;
	right:-0.5em;
	margin-left:0;
	margin-right:-1px;
}
#collapseFavs.hover {
	background-color:#eee;
	border-color:#eee;
}
#collapseFavsWrapper {
	position:absolute;
	padding-right:1em;
	left:0.5em;
	top:-2em;
	cursor:auto;
	overflow:hidden;
}
#wikibody.fav-right #collapseFavsWrapper {
	left:auto;
	right:0.5em;
	padding-right:0;
	padding-left:1em;
}
#collapseFavsWrapper #favorites {
	background:white;
	border:0.5em solid #eee;
	border-left:none;
}
#wikibody.fav-right #collapseFavsWrapper #favorites {
	border-right:none;
	border-left:0.5em solid #eee;
}
#collapseFavsPointer {
	position:absolute;
	width:4px;
	height:12px;
	background:url(images/arrleft.gif) top left no-repeat;
	margin-left:-15px;
	z-index:5;
}
#wikibody.fav-right #collapseFavsPointer{
	margin-left:15px;
}
.fav-slide #collapseFavsPointer {
	background-image:url(images/arrright.gif);
}
*/

.userbox {
	overflow:hidden;
	padding:0.5em 0;
	white-space:nowrap;
}
#favorites .userbox a.action, #favorites .userbox .username {
	float:left;
	display:block;
	margin-right:4px; /*spacing between buttons */
}
.username {
	font-style:italic;
	padding:0.25em 0.5em;
}
.username.anonymous {
}
.username.asserted {
}
.username.authenticated {
}

.wikiversion, .rssfeed {
	font-size:90%;
	padding:0.25em;
	text-align:center;
}

/* +++ 450 FindContent +++ */
#details, #scope {
	margin-left:2em;
}
.gBar {
}
.graphBar {
	padding:0;
	color:white;
	border-color:#f93;
	border-left-style:solid;
	border-bottom-style:solid;
}
.fragment {
	margin:0.25em;
	font:90% Monaco, "Courier New", Courier, monospace;
}
.fragment_ellipsis {
	font-weight:bold;
}
.nosearchresult {
	font-style:italic;
}
/* For the search_highlight.js.  This style defines the how the words that have
   been found look like.  If you look for "thingy", you will get these following
   in the results.
   <span class="searchword">thingy</span>
 */
.cursor {
	background-color:#eee;
}
.searchword, .searchmatch {
	background-color:#f93;
	color:black;
	text-decoration:inherit;
}

/* +++ 455 Footer +++ */
.copyright {
	padding:1em 0.25em;
	font-size:90%;
	text-align:center;
	color:#555;
}

/* +++ 460 Header +++ */
.breadcrumbs {
	font-size:90%;
	padding:0 1.5em 1em 0;
}

/* +++ 465 InfoContent +++ */
#infocontent {
}
#incomingLinks, #outgoingLinks, #externalLinks, #attachmentLinks, #versionhistory {
	width:30%;
	overflow:hidden;
	margin-right:0.5em;
	float:left;
}
#versionhistory td {
	white-space:nowrap;
}
.pagination {
	margin:0.25em;
	padding:0.5em;
	background:#eee;
	/*line-height:1;*/
}
.pagination a {
	cursor:pointer;
}
.pagination a, .pagination .cursor {
	padding:0.5em;
}
.pagination .cursor, .pagination a:hover {
	background-color:#d7d7d7;
}
td.changenote {
	font-style:italic;
}
th.changenote, td.changenote {
	width:30%;
	overflow:hidden;
}
#info th select {
	display:block;
}

/* +++ 470 PageActions +++ */
.pageactions {
	line-height:1.5;
}
.pageactions ul {
	list-style:none;
	margin:0;
	padding:0;
}
.pageactions li {
	display:block;
	float:left;
}
.pageactions li ul {
	position:absolute;
	background:white;
	border:2px solid #ddd;
	left:0; /*right:2.5em; */
	z-index:10;
}
.pageactions li ul li ul {
	position:static;
	left:auto;
}
.pageactions li ul li {
	display:block;
	white-space:nowrap;
	float:none;
}
.pageactions li ul li.separator {
	border-top:2px solid #ddd;
}
/* undo settings for nested information! */
.pageactions li ul li ul {
	position:static;
	left:auto;
	border:none;
}
.pageactions li ul li ul li {
/* nothing to undo ?? */
}
#hiddenmorepopup {
	display:none;
	border:1px solid #ddd;
}
#hiddenmorepopup ul {
	list-style:none;
	margin:0;
	padding:0;

}
#morebutton ul a {
	padding:0.25em 0.5em;
	text-decoration:none;
	cursor:pointer;
}
.pageactions a.action {
	display:block;
}
#morebutton a:hover, a.action:hover, #sectiontoc a:hover
.userbox a.action:hover, a.action.quick2bottom:hover, a.action.quick2top:hover {
	background-color:#eee !important;
}

a.action.view,
a.action.comment,
a.action.prefs,
a.action.attach,
a.action.info,
a.action.viewgroup,
a.action.creategroup,
a.action.workflow,
a.action.login,
a.action.logout {
}
#searchTools a.action, .userbox a.action, a.action.edit, a.action.more {
	padding:0.25em 0.5em;
	text-decoration:none;
	line-height:normal;
	border:1px solid #ddd;
	background:#f9f9f9;
}
a.action.edit, a.action.more {
	margin-left:4px;
	border-bottom:none;
}
a.action.more {
	padding-right:1.5em;
	background: #f9f9f9 url(images/arrdownsmall.gif) 95% center no-repeat;
}
a.action.quick2top, a.action.quick2bottom {
 	overflow:hidden;
	padding:0;
	text-indent:20px;
 	width:20px;
 	margin:0 0 0 2px;
}
a.action.quick2top {
	float:right;
 	background:url(images/arrup.gif) no-repeat 3px 3px;
}

/*********/
.popup ul {
	position:absolute;
	background:white;
	border:2px solid #ddd;
	padding:0.25em;
	margin:0;
	left:0;
	z-index:15;
	list-style:none;
}
.popup li a {
	display:block;
	line-height:1.5;
	white-space:nowrap;
	cursor:pointer;
}
.popup a:hover {
	background-color:#eee !important;
}

/* +++ 472 PageContent.jsp +++ */
#pagecontent {
	padding:0.5em 0;
}

/* +++ 475 PreviewContent - "This is a preview" comment +++ */
#sneakpreviewheader {
	clear:both;
	font-size:110%;
	background-color:#ddd;
	padding:0.5em;
	margin:0.5em 0;
}
#sneakpreview {
}
#previewcontent {
}
.previewcontent {
	background-image:url(images/preview.gif);
}

/* +++ 480 PreferencesContent, LoginContent, GroupContent +++ */

/* +++ 485 SearchBox +++ */
.spin {
	background:url(images/spin.gif) no-repeat;
	width:16px;
	height:16px;
	margin:0 0.5em;
}
.searchbox {
}
#searchForm #query {
	width:164px;
	padding:2px 22px 2px 2px;
	vertical-align: middle;
	color:#555;
}
#searchSubmit {
	position:absolute;
    top:5px;
	right:3px;

	margin:0;
	padding:0;
	width:16px;
	height:16px;
	border:none;
	background: url(images/search.gif) no-repeat center;
	overflow:hidden;
    cursor:pointer;
}
#searchboxMenu {
	position:absolute;
	background:white;
	border:2px solid #ddd;
	padding:0.25em;
	left:0;
	z-index:15;
}
/*ie6 hack*/
* html #searchboxMenu {
	white-space:nowrap;  /*ensure box has proper width ugh! */
}
#searchboxMenu ul {
	list-style:none;
	margin:0;
	padding:0;
}
#searchboxMenu li {
	padding:0 0.5em;
}

#searchTools a:hover, #searchboxMenu li:hover {
	background:#eee;
}
#searchboxMenu div {
	margin:0.5em 0;
}
#searchTools {
	text-align:left;
}

/* +++ 490 ViewTemplate +++ */
body.view {
	/*background-image:white;*/
}


/* +++ 600 JSPWiki plugins +++ */

/* +++ 610 Image plugin +++ */
.imageplugin {
	margin:.5em 0;
}
.imageplugin img {
	border:0;
}
.imageplugin caption {
	font-size:90%;
}
.imageplugin * {
	padding:0;
	margin:0;
}

/* +++ 620 Index plugin +++ */
.index {
}
.index .header {
	padding:4px;
	background:#f9f9f9;
	border:1px solid #ddd;
	text-align:center;
	font-size:1.4em;
}
.index .body {
    margin-top: 0.5ex;
}
.index .section {
	color:red;
	font-size:1.4em;
	display: block;
	border-bottom: 2px solid silver;
	margin-top:1.5ex;
}

/* +++ 625 Table of contents plugin +++ */
div.toc {
	width:60%;
	float:left;
	clear:left;
}
/* duplicate toc items links back to the first rendered table of contents */
a.toc {
	color:grey;
	padding:0.25em;
}
a.toc:hover {
	background:#eee;
}
#favorites .toc {
	width:100%;
}
#pagecontent .toc h4 {
	font-size:1.4em;
}
.toc ul {
	padding-left:0;
	list-style:none;
}
.toc li {
	margin-left:1em;
	padding-left:0;
}
.toc li.toclevel-1 {
	margin-left:0.5em;
}
.toc li.toclevel-2 {
	margin-left:1.5em;
}
.toc li.toclevel-3 {
	margin-left:2.5em;
}


/*continue here ...*/

/* +++ 630 Weblog and weblogarchive plugins +++ */
.weblog {
	margin:0 2em;
	clear:both;
}
.weblogentry {
	margin:0.5em 0;
}
.weblogentryheading {
	padding:0.25em 0.5em;
	font-size:90%;
	background:#e0e0e0;
	float:right;
}
.weblogentrytitle {
	padding:0.25em 0.5em;
	font-size:120%;
	line-height:1.2;
	font-weight:bold;
	background:#e0e0e0;
}
.weblogentrybody {
	margin-left:0.5em;
	clear:both;
}
.weblogentryfooter {
	font-size:90%;
	padding:0.25em 0.5em;
	border-bottom:3px solid #e0e0e0;
	clear:both;
}
.weblogarchive {
}
.weblogarchive ul {
}
.weblogarchive li {
	margin-left:1em;
	display:block;
	list-style-type:none;
}
.archiveyear {
	font-weight:bold;
	text-decoration:none;
	margin-left:0 !important;
}
.archiveyear:after {
	content:" AD"
}

.weblogcommentstitle {
	background:#e0e0e0;
	margin:1em 0.5em 0 0.5em;
	padding:0.5em;
	font-weight:bold;
	font-size:120%;
	line-height:1.1;
}
.weblogcomments {
	background:#f9f9f9;
	margin:0 0.5em 1em 0.5em;
	padding:1em;
}


/* +++ 640 RecentChangesPlugin +++ */
.recentchanges {
	table-layout:fixed;
} /*faster renderer */
.recentchanges .changenote {
	font-style:italic;
}
.recentchanges td {
	vertical-align:top;
	border-bottom:1px solid #f9f9f9;
}
.recentchanges .date {
	vertical-align:bottom;
	border-top:1.5em solid white;
	background-color:#f9f9f9 !important;
	border-bottom:none;
}
.recentchanges tr.odd td {
	background-color:transparent;
}


/* +++ 800 JSPWiki JSP Taglibs +++ */

/* +++ 805 CalendarTag +++ */
div.calendar {
	border:1px solid black;
}
table.calendar {
}
table.calendar td {
	text-align:center;
}
table.calendar td.othermonth {
	color:#707070;
}
table.calendar td.link {
	background:#f9f9f9;
}
table.calendar tr.month {
}
table.calendar tr.weekdays {
	color:red;
}

/* +++ 900 "Special-effects" JavaScript styles +++ */
.add-css  {
    display:none;
}

/* +++ 910 Tabbed Pages +++ */
/* use absolute position trick to avoid page bump when inserting tabmenu
 * "tabs" surrounds the actual tab-content :only border right-bottom-left
 * "tabmenu" visualises the actuals tabs :border-bottom to close the tabs box
 * "tabmenu a" for the actual tabs :border left-top-right to draw the tab
 *    Note:margin-left -2px to compensate border-width ico you want adjacent tabs
 *          increase/decrease margin-left to create space between the tabs
 *   "active" is the active tab  :border-bottom --white-- to 'reopen' the tabmenu border
 *   "alerttab" is a --red-- tab used in edit mode for msg like lock etc.
 */
.accesskey {
	text-decoration:underline;
}
.hidetab {
	display:none;
}
.tabs {
	clear:both;
	padding:0.5em;
	border:1px solid #ddd;
	margin-bottom:0.5em;
}
.tabmenu {
	padding:0 1em;
	font-weight:bold;
}
/* nested tabs should not allow floated stuff to appear next to the tabmenu - ugh */
.tabs .tabmenu {
	clear:both;
}

/* ie6 and lower */
* html .tabmenu {
	border:1px solid white;
}
/*ie7 hack */
*:first-child+html .tabmenu {
	border:1px solid white;
}

.tabmenu a {
	float:left;
	margin:0 0 -1px -1px;
	padding:0.25em 0.5em;
	border:1px solid #ddd;
	color:gray;
	background:#f9f9f9;
	text-decoration:none;
	cursor:pointer;
	line-height:normal;
}
.tabmenu a:hover {
	background:#eee;
}
.tabmenu a.activetab {
	color:black;
	background:transparent;
	border-bottom:1px solid white;
	cursor:default;
}


/* +++ 910 Accordion +++ */
.accordion, .tabbedAccordion {
	clear:both;
	border:1px solid #ddd;
	margin-bottom:0.5em;
}
.accordion .toggle {
	border: 2px solid #f9f9f9;
	background:#f9f9f9;
	cursor:pointer;
	font-weight:bold;
	line-height:1.4;
	padding:0.25em 1em 0.25em 0;
}
.accordion .toggle:hover, .menu .toggle:hover {
	background:#eee;
}
.accordion .tab {
	padding:0 1em;
}
.menu {
    clear:both; /* check out */
	color:gray;
	font-weight:bold;
}
.menu.top {
	margin-left:0.5em; /* small left indent of first toggle */
}
.menu.left {
	float:left;
	margin-top:0.5em; /* small top indent of first toggle */
}
.menu.right {
	float:right;
	margin-top:0.5em; /* small top indent of first toggle */
}
.menu .toggle {
	background:#f9f9f9;
	border:1px solid #ddd;
	cursor:pointer;
	padding:0.25em 0.5em;
}
.menu.top .toggle {
	float:left;
	margin:0 0 -1px -1px; /* adjacent toggle will stick: let 1px border overlap.*/
	display:inline;
}
.menu.left .toggle {
	margin:0 -1px -1px 0; /* adjacent toggle will stick: let 1px border overlap.*/
}
.menu.right .toggle {
	margin:0 0 -1px -1px; /* adjacent toggle will stick: let 1px border overlap.*/
}
.menu .toggle.active {
	background:transparent;
	cursor:default;
	color:black;
}
.menu.top .toggle.active {
	border-bottom:1px solid white;
}
.menu.left .toggle.active {
	border-right:1px solid white;
}
.menu.right .toggle.active {
	border-left:1px solid white;
}
.tabbedAccordion {
	padding:0.5em;
}
.leftAccordion, .rightAccordion {
	margin-bottom:0.5em;
}
.leftAccordion .tab, .rightAccordion .tab {
	border:1px solid #ddd !important;
	margin:0 0 -2px 0; /* trick :: -2px to reveal top and bottom borders the tabs */
	padding:0.25em 0.5em;
}

/* ie only hack no needed ?
* html .togglemenu {
	margin-top:1px;
}
*/

/* margin is not compatible with scrollHeigth used by accordion - replace it by padding */
/*
.tab h1, .tab h2, .tab h3, .tab h4,
.tab p, .tab pre, .tab blockquote, .tab label,
.tab ul, .tab ol, .tab dl, .xxtab hr {
	margin:0 auto;
	padding-top:0.5em;
	padding-bottom:0.5em;
}
*/

/* +++ 912 wiki columns +++ */
/*ie6 and lower hack */
* html .columns {
	width:100%;
}
/*ie7 hack */
*:first-child+html .columns {
	width:100%;
}
.columns .col {
	float:left;
	padding:0 0.25em;
}

/* +++ 915 Tips +++ */
.tip-anchor {
	border-bottom:2px solid #545454;
	cursor:pointer;
}
.tip-tip {
	color:white;
	width:auto; /*240px;*/
	z-index:100;
	font-size:90%;
	background-color:rgba(0,0,0,0.7);
	-moz-border-radius:10px;
	-webkit-border-radius:5px;
	border-radius:10px;
	-webkit-box-shadow:0 0 5px rgba(0, 0, 0, 0.5);
	-box-shadow:0 0 5px rgba(0, 0, 0, 0.5);
}
.tip-title {
	font-weight:bold;
	padding:8px 8px 4px;
}
* html .tip-title {
	background:url(images/tip.png) top left;
}
/*ie7 hack */
*:first-child+html .tip-title {
	background:url(images/tip.png) top left;
}
.tip-text {
	padding:4px 8px 8px;
}
.tip-text th {
	background:grey !important;
}
* html .tip-text {
	background:url(images/tip.png) bottom right;
}
/*ie7 hack */
*:first-child+html .tip-text {
	background:url(images/tip.png) bottom right;
}
.tip-tip a {
	color: white !important;
}


/* +++ 920 Collapsible lists +++ */
div.collapse ul, div.collapse ol {
	margin:0;
	padding:0;
}
/* ie6 hack : avoid strange side-effect on borders */
* html div.collapse ul, * html div.collapse ol {
	width:100%;
}
div.collapse li {
	list-style-type:none;
}
.collapse .collapsebody, .collapsebox .collapse .collapsebody {
	padding-left:1.5em;
}

/*
Make sure to print collapsed items as it they were not collapsed.
This requires some smart 'specific' css selector rules, in order to
overwrite the style set by the mootools animation routines.
*/
@media print {
.collapse .collapsebody ul, .collapsebox div.collapsebody  {
	height:auto !important;
}
}


/* ie7 hack */
*:first-child+html .collapse .collapsebody,
*:first-child+html .collapsebox .collapse .collapsebody {
	float:left;
	padding-left:0.5em;
}
/* ie6 hack */
* html .collapse .collapsebody, * html .collapsebox .collapse .collapsebody {
	float:left;
	padding-left:0.5em;
}


/* collapse icons */
.collapseBullet, .collapseOpen, .collapseClose {
	clear:left;
	float:left;
	text-align:center;
	text-decoration:none;
	color:blue;
	font:bold small Monaco, "Courier New", Courier, monospace;
	width:1.2em;
	height:1em;
}
.collapseOpen, .collapseClose {
	cursor:pointer;
}

/* +++ collapsebox +++ */
.collapsebox {
    clear:right; /* avoid clash with intern floated bullet */
	border:1px solid #ddd;
	margin:0 0 0.5em 0;
}
.collapsetitle {
	margin:0;
	padding:0.25em 0;
	border: 2px solid white;
}
.collapsebox .collapsebody {
	padding:0 0.5em;
}

/* +++ 930 Sortable tables +++ */
.sortable .sortAscending, .sortable .sortDescending, .sortable .sort {
	background-repeat:no-repeat;
	background-position:2px 4px;
	cursor:pointer;
	padding-left:11px;
}
.sortable .sort {
	background-image:url(images/sortable.gif);
}
.sortable .sortAscending {
	background-image:url(images/sorted_down.gif);
	background-position:2px 6px;
}
.sortable .sortDescending {
	background-image:url(images/sorted_up.gif);
	background-position:2px 0px;
}


/* +++ 940 SLIMBOX Attachment viewer etc. +++ */
a.slimbox {
	font-weight:bold;
	font-size:1.3em;
	padding:0 0.2em;
}
a.slimbox:visited, a.slimbox:active, a.slimbox:link {
	text-decoration:none;
	border:none;
}
a.slimbox:hover {
	background:#eee;
}

#lbOverlay {
	position:absolute;
	left:0;
	top:0;
	width:100%;
	background-color:#000;
	cursor:pointer;
}
#lbCenter, #lbBottomContainer {
	position:absolute;
	left:50%;
	overflow:hidden;
	font: 90% Verdana, Helvetica, sans-serif;
	color:#666;
	line-height:1.5;
	text-align:left;
}
#lbBottomContainer {
	padding:0 12px;
}
#lbCenter {
	padding:12px 12px 0 12px;
}
#lbCenter a {
	outline:none;
}
.lbLoading {
	background:#fff url(images/spin.gif) no-repeat center;
}
#lbImage {
	border:10px solid #fff;
	border-top-width:1.4em;
	background-color:#fff;
	background-repeat:no-repeat;
	background-position:center center;
	position:relative;
}
#lbBottom {
	border:10px solid #fff;
	border-top-style:none;
	background-color:#fff;
}
#lbBottom div {
	white-space:nowrap;
	overflow:hidden;
}
#lbCaption, #lbPrevLink, #lbNextLink {
	font-weight:bold;
}
#lbPrevLink {
	padding-right:1em;
}
#lbNextLink {
	padding-left:1em;
}
#lbCloseLink {
	display:block;
	position:absolute;
	width:28px;
	height:28px;
	top:0;
	right:0;
	background:url(images/slimbox_close.png) no-repeat;
	z-index:10;
}
/* gif icons for ie */
* html #lbCloseLink {
	background:url(images/slimbox_close.gif) 4px 12px no-repeat;
}
* html #lbCloseLink:hover {
	background-image:url(images/slimbox_close_hover.gif);
}

#lbBottomContainer *:visited, #lbBottomContainer *:active, #lbBottomContainer *:link,
#lbCenter *:visited, #lbCenter *:active, #lbCenter *:link {
	text-decoration:none;
	border-bottom:none;
}


/* +++ 950 Categorised +++ */
.categoryLink {
	border-bottom:2px solid #545454;
	text-decoration:none;
}
.categoryPopup {
	color:white;
	z-index:100;
	font-size:90%;
	margin-top:2px;
	position:absolute;
	z-index:10;
	background-color:rgba(0,0,0,0.7);
	-moz-border-radius:10px;
	-webkit-border-radius:5px;
	border-radius:10px;
	-webkit-box-shadow:0 0 5px rgba(0, 0, 0, 0.5);
	box-shadow:0 0 5px rgba(0, 0, 0, 0.5);
}
/* ie6 hack */
* html .categoryPopup {
	width:240px;
}
/* ie7 hack */
*:first-child+html .categoryPopup {
	width:240px;
}
.categoryPopup a:link, .categoryPopup a:active,.categoryPopup a:visited {
	color:white;
	text-decoration:none;
}
.categoryTitle {
	padding:4px;
	font-weight:bold;
}
/* ie6 hack */
* html .categoryTitle {
	background:url(images/tip.png) top left;
}
/* ie7 hack */
*:first-child+html .categoryTitle {
	background:url(images/tip.png) top left;
}
.categoryText {
	padding:4px 0;
}
/* ie6 hack */
* html .categoryText {
	background:url(images/tip.png) bottom right;
}
/* ie7 hack */
*:first-child+html .categoryText {
	background:url(images/tip.png) bottom right;
}
.categoryText ul {
	list-style:none;
	margin:0 !important;
	padding:0 !important;
}
.categoryText li {
	display:block;
	padding:0 8px;
}
.categoryPopup .hover {
	background-color:rgba(0,0,0,0.5);
	-moz-border-radius:10px;
	-webkit-border-radius:5px;
	border-radius:10px;
}
/* ie6 hack */
* html .categoryPopup .hover {
	background-color:black;
}
/* ie7 hack */
*:first-child+html .categoryPopup .hover {
	background-color:black;
}


/* Pretty printing styles. Used with prettify.js.
pre.prettyprint {
}

.str {color: #489a1b; }
.kwd {color: #1b609a; }
.com {color: #888; }
.typ {color: #666; }
.lit {color: #066; }
.pun {color: #660; }
.pln {color: #000; }
.tag {color: #008; }
.atn {color: #606; }
.atv {color: #080; }
.dec {color: #606; }

@media print {
  .str {color: #060; }
  .kwd {color: #006; font-weight: bold; }
  .com {color: #600; font-style: italic; }
  .typ {color: #404; font-weight: bold; }
  .lit {color: #044; }
  .pun {color: #440; }
  .pln {color: #000; }
  .tag {color: #006; font-weight: bold; }
  .atn {color: #404; }
  .atv {color: #060; }
}
*/

/* Pretty printing styles. Used with prettify.js from
   Google Code Prettify (4 March 2013 version). Below CSS
   adapted from prettify.css in GCP download.
   CSS for line nums not included, as presently not
   supported by JSPWiki.
*/
pre.prettyprint {
}

.pln { color: #000 }  /* plain text */
.str { color: #080 }  /* string content */
.kwd { color: #008 }  /* a keyword */
.com { color: #800 }  /* a comment */
.typ { color: #606 }  /* a type name */
.lit { color: #066 }  /* a literal value */
/* punctuation, lisp open bracket, lisp close bracket */
.pun, .opn, .clo { color: #660 }
.tag { color: #008 }  /* a markup tag name */
.atn { color: #606 }  /* a markup attribute name */
.atv { color: #080 }  /* a markup attribute value */
.dec, .var { color: #606 }  /* a declaration; a variable name */
.fun { color: red }  /* a function name */

/* Use higher contrast and text-weight for printable form. */
@media print {
  .str { color: #060 }
  .kwd { color: #006; font-weight: bold }
  .com { color: #600; font-style: italic }
  .typ { color: #404; font-weight: bold }
  .lit { color: #044 }
  .pun, .opn, .clo { color: #440 }
  .tag { color: #006; font-weight: bold }
  .atn { color: #404 }
  .atv { color: #060 }
}

div.coverflow {
	background-color:#000;
	color:#fff;
	visibility:hidden;
	position:relative;
	overflow:hidden;
}
div.coverflow * {
	margin:0;
	padding:0;
}
div.coverflow .imgcontainer {
	position:relative;
}
div.coverflow img {
	position:absolute;
	border:none;
}
div.coverflow .slider {
	position:relative;
	border:1px solid #bbb;
	z-index:10001;
}
div.coverflow .knob {
	background:#fff;
	width:100px;
	height:15px;
}
