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

/**
    PhoneFontSizeSmall=14pt
    PhoneFontSizeNormal = 15pt
    PhoneFontSizeMedium=17pt
    PhoneFontSizeMediumLarge=19pt
    PhoneFontSizeLarge=24pt
    PhoneFontSizeExtraLarge=32pt
    PhoneFontSizeExtraExtraLarge=54pt
    PhoneFontSizeHuge=140pt
*/

/** 

main wp7 color and fonts 

*/
  
body, input, div
{
    background: black;
    color: White;
    font-family: Segoe WP;
    font-size: 15pt; /* PhoneFontSizeNormal */
    margin-left:0.1em;
    filter: progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction=45);
}

h1, h2, h3, h4 
{    
    display: block;
    font-family: Segoe WP Light;
    font-weight: bold;
    margin: 0 0.1em;
    min-height: 1.1em;
    outline: 0 none;
    overflow: hidden;
    padding: 0;
    text-align: left;
    white-space: nowrap;
 }

h1
{
    font-size: 32pt; /* PhoneFontSizeExtraLarge */ 
}

h2
{
    font-size: 24pt; /* PhoneFontSizeLarge */
    font-weight: normal;
}

h3
{
    font-size: 17pt; /* PhoneFontSizeMedium */
}

h4
{
    font-size: 15pt; /* PhoneFontSizeNormal */
    font-weight: normal;
}

h4 > span
{
    color: gray;
}

/** 

Buttons

*/

a.btn, div.btn
{
    background: black;
    color: white;
    text-decoration: none;
    display:block;
    font-size: 15pt;
    text-decoration:none;
    padding:0.7em 0;
    margin:3px 0px 3px 5px;
}

a.backBtn, input[type="button"], input[type="submit"]
{
    background: black;
    color: white;
    border-color: white;
    border-style: solid;
    padding: 4px 10px;
    border-width: 3px; /* PhoneBorderThickness */
    font-size: 17pt; /* PhoneFontSizeMedium */
    display: block;
    text-decoration:none;
    text-transform:lowercase;
  
}

input[type="button"]:active, input[type="submit"]:active
{
    background: white;
    color: black;
}

/** 

Input fields 

*/

input[type="text"]
{
    width: 150px;
    padding:4px;
    margin-bottom: 14px;
    box-shadow: 0px 0px 12px #387bbe;
    background-color: #8c8e8b;
    border: 1px solid #B3B3B3;
    color: #3e3e3e;
    text-shadow: 0 1px 0 #FFFFFF;
}

input[type="text"]:focus,
input[type="text"]:active {
    box-shadow: 0 0 12px #387BBE;
    background-color: #f0f0f0;
}

span.tb-label
{
    padding: 4px 10px 8px 4px;
    font-size: 12pt;
    color: grey; 
    display: block;
}

/** 

application specific styles

*/

#info {
    border-bottom: 1px solid #666666;
    border-top: 1px solid #666666;
}

#info table
{
    font-family: Segoe WP Light;
}

  
