/*
 *
 *  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 mx "library://ns.adobe.com/flex/mx";

/*
//------------------------------
//  Halo FileSystemComboBox
//------------------------------
*/

mx|FileSystemComboBox
{
	computerIcon: Embed(source="ComputerIcon.swf", symbol="ComputerIcon");
	directoryIcon: Embed(source="Assets.swf", symbol="TreeFolderOpen");
}

/*
//------------------------------
//  Halo FileSystemDataGrid
//------------------------------
*/

mx|FileSystemDataGrid
{
	directoryIcon: Embed(source="Assets.swf", symbol="TreeFolderClosed");
	fileIcon: Embed(source="Assets.swf", symbol="TreeNodeIcon");
}

/*
//------------------------------
//  Halo FileSystemList
//------------------------------
*/

mx|FileSystemList
{
	directoryIcon: Embed(source="Assets.swf", symbol="TreeFolderClosed");
	fileIcon: Embed(source="Assets.swf", symbol="TreeNodeIcon");
}

/*
//------------------------------
//  FileSystemTree
//------------------------------
*/

mx|FileSystemTree
{
	directoryIcon: Embed(source="Assets.swf", symbol="TreeFolderClosed");
	fileIcon: Embed(source="Assets.swf", symbol="TreeNodeIcon");
}


/*
//------------------------------
//  .gripperSkin
//------------------------------
*/

.gripperSkin
{
	downSkin: Embed("gripper_up.png");
	overSkin: Embed("gripper_up.png");
	upSkin: Embed("gripper_up.png");
}

/*
//------------------------------
//  HTML
//------------------------------
*/

mx|HTML
{
	borderStyle: "none";
    layoutDirection: "ltr";
}

/*
//------------------------------
//  .macCloseButton
//------------------------------
*/

.macCloseButton
{
	downSkin: Embed("mac_close_down.png");
	overSkin: Embed("mac_close_over.png");
	upSkin: Embed("mac_close_up.png");
}

/*
//------------------------------
//  .macMaxButton
//------------------------------
*/

.macMaxButton
{
	disabledSkin: Embed("mac_max_dis.png");
	downSkin: Embed("mac_max_down.png");
	overSkin: Embed("mac_max_over.png");
	upSkin: Embed("mac_max_up.png");
}

/*
//------------------------------
//  .macMinButton
//------------------------------
*/

.macMinButton
{
	alpha: 0.5;
	disabledSkin: Embed("mac_min_dis.png");
	downSkin: Embed("mac_min_down.png");
	overSkin: Embed("mac_min_over.png");
	upSkin: Embed("mac_min_up.png");
}

/*
//------------------------------
//  .statusTextStyle
//------------------------------
*/

.statusTextStyle
{
	alpha: 0.6;
	color: #585858;
	fontSize: 10;
}

/*
//------------------------------
//  .titleTextStyle
//------------------------------
*/

.titleTextStyle
{
	alpha: 0.6;
	color: #585858;
	fontSize: 9;
}

/*
//------------------------------
//  .winCloseButton
//------------------------------
*/

.winCloseButton
{
	downSkin: Embed("win_close_down.png");
	overSkin: Embed("win_close_over.png");
	upSkin: Embed("win_close_up.png");
}

/*
//------------------------------
//  Window
//------------------------------
*/

mx|Window
{
	borderColor: #A6A6A6;
	borderStyle: "solid";
	buttonPadding: 2;
	closeButtonSkin: ClassReference("mx.skins.halo.WindowCloseButtonSkin");
	cornerRadius: 0;
    backgroundAlpha: 1;
	backgroundColor: #FFFFFF;
	buttonAlignment: "auto";
	gripperPadding: 3;
	gripperStyleName: "gripperSkin";
	highlightAlphas: 1.0, 1.0;
	maximizeButtonSkin: ClassReference("mx.skins.halo.WindowMaximizeButtonSkin");       
	minimizeButtonSkin: ClassReference("mx.skins.halo.WindowMinimizeButtonSkin");     
	restoreButtonSkin: ClassReference("mx.skins.halo.WindowRestoreButtonSkin");  
	roundedBottomCorners: false;
	showFlexChrome: true;
	statusBarBackgroundSkin: ClassReference("mx.skins.halo.StatusBarBackgroundSkin");
	statusBarBackgroundColor: #DDDDDD;
	statusTextStyleName: "statusTextStyle";
	titleAlignment: "auto";
	titleBarBackgroundSkin: ClassReference("mx.skins.halo.ApplicationTitleBarBackgroundSkin");
	titleBarButtonPadding: 5;
	titleBarColors: #FFFFFF, #BABABA;
	titleTextStyleName: "titleTextStyle";
}

/*
//------------------------------
//  WindowedApplication
//------------------------------
*/

mx|WindowedApplication
{
	borderColor: #A6A6A6;
	borderStyle: "solid";
	buttonPadding: 2;
	closeButtonSkin: ClassReference("mx.skins.halo.WindowCloseButtonSkin");
	cornerRadius: 0;
    backgroundAlpha: 1;
	backgroundColor: #FFFFFF;
	buttonAlignment: "auto";
	gripperPadding: 3;
	gripperStyleName: "gripperSkin";
	highlightAlphas: 1.0, 1.0;
	maximizeButtonSkin: ClassReference("mx.skins.halo.WindowMaximizeButtonSkin");       
	minimizeButtonSkin: ClassReference("mx.skins.halo.WindowMinimizeButtonSkin");                
	restoreButtonSkin: ClassReference("mx.skins.halo.WindowRestoreButtonSkin");  
	roundedBottomCorners: false;
	showFlexChrome: true;
	statusBarBackgroundSkin: ClassReference("mx.skins.halo.StatusBarBackgroundSkin");
	statusBarBackgroundColor: #DDDDDD;
	statusTextStyleName: "statusTextStyle";
	titleAlignment: "auto";
	titleBarBackgroundSkin: ClassReference("mx.skins.halo.ApplicationTitleBarBackgroundSkin");
	titleBarButtonPadding: 5;
	titleBarColors: #FFFFFF, #BABABA;
	titleTextStyleName: "titleTextStyle";
}

/*
//------------------------------
//  .winMaxButton
//------------------------------
*/

.winMaxButton
{
	upSkin: Embed("win_max_up.png");
	overSkin: Embed("win_max_over.png");
	downSkin: Embed("win_max_down.png");
	disabledSkin: Embed("win_max_dis.png");
}

/*
//------------------------------
//  .winMinButton
//------------------------------
*/

.winMinButton
{
	upSkin: Embed("win_min_up.png");
	overSkin: Embed("win_min_over.png");
	downSkin: Embed("win_min_down.png");
	disabledSkin: Embed("win_min_dis.png");
}

/*
//------------------------------
//  .winRestoreButton
//------------------------------
*/

.winRestoreButton
{
	upSkin: Embed("win_restore_up.png");
	overSkin: Embed("win_restore_over.png");
	downSkin: Embed("win_restore_down.png");
}
