/*
 * 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;}


