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

@namespace "library://ns.adobe.com/flex/spark";

/* Default Skins */

Application
{
    backgroundColor: #FFFFFF;
    skinClass: ClassReference("spark.skins.spark.ApplicationSkin");
}

BorderContainer
{
    backgroundColor: #FFFFFF;
    borderStyle : "solid"; 
    cornerRadius: 0;
    skinClass: ClassReference("spark.skins.spark.BorderContainerSkin");
}

Button
{
    skinClass: ClassReference("spark.skins.spark.ButtonSkin");
}

Button.emphasized
{
    skinClass: ClassReference("spark.skins.spark.DefaultButtonSkin");
}

ButtonBar
{
    skinClass: ClassReference("spark.skins.spark.ButtonBarSkin");
}

BusyIndicator
{
	skinClass: ClassReference("spark.skins.spark.BusyIndicatorSkin");
	rotationInterval: 30;  /* Must be multiples of 30 */
}

Callout
{
    backgroundColor: #ffffff;
    contentBackgroundAppearance: flat;
    contentBackgroundColor: #FFFFFF;
    skinClass: ClassReference("spark.skins.spark.CalloutSkin");
    borderColor: #3d3d3d;
    borderThickness: 1;
}


CheckBox
{
    gap: 5;
    labelPlacement: "right";
    skinClass: ClassReference("spark.skins.spark.CheckBoxSkin");
}

ComboBox
{
/*  dropShadowVisible: true; in spark.css */
    paddingBottom: 3;
    paddingLeft: 3;
    paddingRight: 3;
    paddingTop: 5;
    skinClass: ClassReference("spark.skins.spark.ComboBoxSkin");
}

DataGrid
{
    dragIndicatorClass: ClassReference("spark.components.gridClasses.DataGridDragProxy");
    dropIndicatorSkin: ClassReference("spark.skins.spark.ListDropIndicator");
    skinClass: ClassReference("spark.skins.spark.DataGridSkin");
    stretchCursor: Embed(source="Assets.swf",symbol="cursorStretch");    
}

DropDownList
{
/*  dropShadowVisible: true; in spark.css */
    skinClass: ClassReference("spark.skins.spark.DropDownListSkin");
}

Form
{
    skinClass : ClassReference("spark.skins.spark.FormSkin");
}

FormHeading
{
    fontSize : 15;
    fontWeight : "bold";
    skinClass : ClassReference("spark.skins.spark.FormHeadingSkin");
}

FormItem
{
    errorIndicatorSource : Embed(source="assets/ErrorIndicator.png");
    requiredIndicatorSource : Embed(source="assets/RequiredIndicator.png");
    skinClass : ClassReference("spark.skins.spark.FormItemSkin");
}

GridColumnHeaderGroup
{
    separatorAffordance: 5;
}

HScrollBar
{
    skinClass: ClassReference("spark.skins.spark.HScrollBarSkin");
}

HSlider
{
    skinClass: ClassReference("spark.skins.spark.HSliderSkin");
}

Image
{
    skinClass: ClassReference("spark.skins.spark.ImageSkin");
    enableLoadingState: false;
    showErrorSkin : false;
    smoothingQuality: "default";
}

List
{
    skinClass: ClassReference("spark.skins.spark.ListSkin");
    dragIndicatorClass: ClassReference("spark.components.supportClasses.ListItemDragProxy");
    dropIndicatorSkin: ClassReference("spark.skins.spark.ListDropIndicator");
}

MuteButton
{
    skinClass: ClassReference("spark.skins.spark.mediaClasses.normal.MuteButtonSkin");
}

NumericStepper
{
    skinClass: ClassReference("spark.skins.spark.NumericStepperSkin");
}

Panel
{
    backgroundColor: #FFFFFF;
/* in spark.css */
/*
    borderAlpha: 0.5;
    borderColor: 0;
    cornerRadius: 0;
    dropShadowVisible: true;
*/
	skinClass: ClassReference("spark.skins.spark.PanelSkin");
}

RadioButton
{
	skinClass: ClassReference("spark.skins.spark.RadioButtonSkin");
}

RichEditableText
{
    layoutDirection: "ltr";
}

Scroller
{
    skinClass: ClassReference("spark.skins.spark.ScrollerSkin");
}

ScrubBar
{
    skinClass: ClassReference("spark.skins.spark.mediaClasses.normal.ScrubBarSkin");
}

SkinnableDataContainer
{
    skinClass: ClassReference("spark.skins.spark.SkinnableDataContainerSkin");
}

SkinnableComponent
{
    errorSkin: ClassReference("spark.skins.spark.ErrorSkin");
    focusSkin: ClassReference("spark.skins.spark.FocusSkin");
}

SkinnableContainer
{
    skinClass: ClassReference("spark.skins.spark.SkinnableContainerSkin");
}

SkinnablePopUpContainer
{
    skinClass: ClassReference("spark.skins.spark.SkinnablePopUpContainerSkin");
}

SkinnableTextBase:normalWithPrompt 
{
    color: #BABABA;
    fontStyle: italic;
}

SkinnableTextBase:disabledWithPrompt 
{
    color: #BABABA;
    fontStyle: italic;
}

Spinner
{
    skinClass: ClassReference("spark.skins.spark.SpinnerSkin");    
}

TabBar
{
    skinClass: ClassReference("spark.skins.spark.TabBarSkin");
    cornerRadius: 4;
}

TextBase
{
    layoutDirection: "ltr";
}

TextArea
{
    paddingBottom: 3;
    paddingLeft: 3;
    paddingRight: 3;
    paddingTop: 5;
	skinClass: ClassReference("spark.skins.spark.TextAreaSkin");
}

TextInput
{
    paddingBottom: 3;
    paddingLeft: 3;
    paddingRight: 3;
    paddingTop: 5;
	skinClass: ClassReference("spark.skins.spark.TextInputSkin");
}

TitleWindow
{
/* in spark.css */
/*
	borderAlpha: 0.8;
	borderColor: 0;
	cornerRadius: 0;
	dropShadowVisible: true;
*/
	skinClass: ClassReference("spark.skins.spark.TitleWindowSkin");
}

ToggleButton
{
	skinClass: ClassReference("spark.skins.spark.ToggleButtonSkin");
}

VideoDisplay
{
    layoutDirection: "ltr";
}

VideoPlayer
{
/*  dropShadowVisible: true; in spark.css */
    layoutDirection: "ltr";
    skinClass: ClassReference("spark.skins.spark.VideoPlayerSkin");
}

VolumeBar
{
    skinClass: ClassReference("spark.skins.spark.mediaClasses.normal.VolumeBarSkin");
}

VScrollBar
{
    skinClass: ClassReference("spark.skins.spark.VScrollBarSkin");
}

VSlider
{
    skinClass: ClassReference("spark.skins.spark.VSliderSkin");
}

global
{
    softKeyboardEffectDuration: 150;
}