/*
 * 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.
 */

/* content styles */
html {
	background-color: white;
	color: black;
	font-family: Arial, Lucida Grande, sans-serif;
	font-size: 0.85em;
	line-height: 1.25em;
}


/* links */
a:hover {color: #0044B3;}
a {color: #597BB3;}
a.nonexistent, a.badinterwiki {color: gray;}

/* Headings */

h1 a {
	text-decoration: none;
	color: black;
}
li p {
	margin: .25em 0;
}
li.gap {
	margin-top: 0.5em;
}
a, img, img.drawing {
	border: 0;
}
dt {
	font-weight: bold;
}

pre {
	padding: 0.5em;
	font-family: courier, monospace;
	border: 1pt solid #c0c0c0;
	margin-left: 1em;
	background: #F0ECE6;
	white-space: pre;
	/* begin css 3 or browser specific rules - do not remove!
	see: http://forums.techguy.org/archive/index.php/t-249849.html */
    white-space: pre-wrap;
    word-wrap: break-word;
    white-space: -moz-pre-wrap;
    white-space: -pre-wrap;
    white-space: -o-pre-wrap;
    /* end css 3 or browser specific rules */
}

table
{
	margin: 0.5em 0;
	border-collapse: collapse;
}

td
{
	padding: 0.25em;
	border: 1px solid #ADB9CC;
}

td p {
	margin: 0;
	padding: 0;
}

/* standard rule ---- */
hr {
	height: 1px;
	background-color: #c0c0c0;
	border: none;
}

/* custom rules ----- to ---------- */
.hr1 {height: 2px;}
.hr2 {height: 3px;}
.hr3 {height: 4px;}
.hr4 {height: 5px;}
.hr5 {height: 6px;}
.hr6 {height: 7px;}

/* Replacement for html 3 u tag */
.u {text-decoration: underline;}

.footnotes ul {
	padding: 0 2em;
	margin: 0 0 1em;
}

.footnotes li {
	list-style: none;
}

.info {
    font-size: 0.85em;
    color: gray;
}

#pageinfo {
    margin-top: 2em;
}

/* eye catchers */
.warning
{
	color: red;
}

.error
{
	color: red;
}

strong.highlight
{
	background-color: #CCE0FF;
	padding: 1pt;
}

#credits img {
	vertical-align: middle;
}

/* Recent changes */

.recentchanges p {
	margin: 0.25em;
}

.recentchanges td {
	vertical-align: top;
	border: none;
	border-bottom: 1pt solid #F0ECE6;
	background: #F7F6F2;
}

.rcdaybreak td {
	background: #B8C5D9;
	border: none;
}

.rcdaybreak td a {
	font-size: 0.88em;
}

.rcicon1, .rcicon2 {
	text-align: center;
}

.rcpagelink {
	width: 33%;
}

.rctime {
	font-size: 0.88em;
	white-space: nowrap;
}

.rceditor {
	white-space: nowrap;
	font-size: 0.88em;
}

.rccomment {
	width: 66%;
	color: gray;
	font-size: 0.88em;
}

.rcrss {
	float: right;
}

.recentchanges[dir="rtl"] .rcrss {
	float: left;
}

/* User Preferences */

.userpref table, .userpref td {
	border: none;
}


/* CSS for new code_area markup used by Colorizer and ParserBase */

div.codearea { /* the div makes the border */
	margin: 0.5em 0;
	padding: 0;
	border: 1pt solid #AEBDCC;
	background-color: #F3F5F7;
	color: black;
}

div.codearea pre { /* the pre has no border and is inside the div */
	margin: 0;
	padding: 10pt;
	border: none;
}

a.codenumbers { /* format of the line numbering link */
	margin: 0 10pt;
	font-size: 0.85em;
	color: gray;
}

/* format of certain syntax spans */
div.codearea pre span.LineNumber {color: gray;}
div.codearea pre span.ID         {color: #000000;}
div.codearea pre span.Operator   {color: #0000C0;}
div.codearea pre span.Char       {color: #004080;}
div.codearea pre span.Comment    {color: #008000;}
div.codearea pre span.Number     {color: #0080C0;}
div.codearea pre span.String     {color: #004080;}
div.codearea pre span.SPChar     {color: #0000C0;}
div.codearea pre span.ResWord    {color: #A00000;}
div.codearea pre span.ConsWord   {color: #008080; font-weight: bold;}
div.codearea pre span.Error      {color: #FF8080; border: solid 1.5pt #FF0000;}
div.codearea pre span.ResWord2   {color: #0080ff; font-weight: bold;}
div.codearea pre span.Special    {color: #0000ff;}
div.codearea pre span.Preprc     {color: #803999;}


