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

/*
//------------------------------
//  AdvancedDataGrid
//------------------------------
*/

AdvancedDataGrid
{
	alternatingItemColors: #F7F7F7, #FFFFFF;
	columnDropIndicatorSkin: ClassReference("mx.skins.halo.DataGridColumnDropIndicator");
	columnResizeSkin: ClassReference("mx.skins.halo.DataGridColumnResizeSkin");
	headerColors: #FFFFFF, #E6E6E6;
	headerDragProxyStyleName: "headerDragProxyStyle";
	headerBackgroundSkin: ClassReference("mx.skins.halo.DataGridHeaderBackgroundSkin");
	headerSeparatorSkin: ClassReference("mx.skins.halo.DataGridHeaderSeparator");
	headerHorizontalSeparatorSkin: ClassReference("mx.skins.halo.AdvancedDataGridHeaderHorizontalSeparator");
	headerStyleName: "advancedDataGridStyles";
	sortArrowSkin: ClassReference("mx.skins.halo.DataGridSortArrow");
	stretchCursor: Embed(source="Assets.swf",symbol="cursorStretch");
	verticalGridLineColor: #CCCCCC;
	disclosureClosedIcon: Embed(source="Assets.swf",symbol="TreeDisclosureClosed");
	disclosureOpenIcon: Embed(source="Assets.swf",symbol="TreeDisclosureOpen");
	defaultLeafIcon: Embed(source="Assets.swf",symbol="TreeNodeIcon");
	folderClosedIcon: Embed(source="Assets.swf",symbol="TreeFolderClosed");
	folderOpenIcon: Embed(source="Assets.swf",symbol="TreeFolderOpen");
	paddingLeft: 2;
	paddingRight: 0;
    /* sort item renderer's font styles */
	sortFontFamily: "Verdana";
	sortFontSize: 10;
	sortFontStyle: "normal";
	sortFontWeight: "normal";
}

/*
//------------------------------
//  AdvancedDataGridItemRenderer
//------------------------------
*/

AdvancedDataGridItemRenderer
{
	paddingLeft: 5;
}

/*
//------------------------------
//  AdvancedDataGridSortItemRenderer
//------------------------------
*/
AdvancedDataGridSortItemRenderer
{
    paddingTop: 0;
    paddingBottom: 0;
    paddingLeft: 0;
    paddingRight: 0;
    horizontalGap: 0;

    color: #0B333C;
    icon: ClassReference("mx.skins.halo.DataGridSortArrow");
}

/*
//------------------------------
//  AdvancedDataGridHeaderRenderer
//------------------------------
*/
AdvancedDataGridHeaderRenderer
{
    paddingTop: 0;
    paddingBottom: 0;
    paddingLeft: 2;
    paddingRight: 2;
    horizontalGap: 0;
    horizontalAlign:center;
    verticalAlign:middle;

    color: #0B333C;

    backgroundColor: #FFFFFF;
    backgroundAlpha: 0.0;
}

/*
//------------------------------
//  .advancedDataGridStyles
//------------------------------
*/

.advancedDataGridStyles
{
	fontWeight: "bold";
}

/*
//------------------------------
//  AdvancedListBase
//------------------------------
*/
AdvancedListBase
{
	backgroundColor: #FFFFFF;
	backgroundDisabledColor: #DDDDDD;
	borderStyle: "solid";
	dropIndicatorSkin: ClassReference("mx.skins.halo.ListDropIndicator");
	paddingBottom: 2;
	paddingLeft: 2;
	paddingRight: 0;
	paddingTop: 2;
}

/*
//------------------------------
//  PrintAdvancedDataGrid
//------------------------------
*/

PrintAdvancedDataGrid
{
	alternatingItemColors: #FFFFFF, #FFFFFF;
	borderColor: 0;
	columnResizeSkin: ClassReference("mx.skins.halo.DataGridColumnResizeSkin");
	headerColors: #FFFFFF, #FFFFFF;
	headerSeparatorSkin: ClassReference("mx.skins.halo.DataGridHeaderSeparator");
	headerStyleName: "advancedDataGridStyles";
	horizontalGridLineColor: 0;
	horizontalGridLines: true;
	sortArrowSkin: ClassReference("mx.skins.halo.DataGridSortArrow");
	stretchCursor: Embed(source="Assets.swf",symbol="cursorStretch");
	verticalGridLineColor: #000000;
}

/*
//------------------------------
//  PrintOLAPDataGrid
//------------------------------
*/

PrintOLAPDataGrid
{
	alternatingItemColors: #FFFFFF, #FFFFFF;
	borderColor: 0;
	columnResizeSkin: ClassReference("mx.skins.halo.DataGridColumnResizeSkin");
	headerColors: #FFFFFF, #FFFFFF;
	headerSeparatorSkin: ClassReference("mx.skins.halo.DataGridHeaderSeparator");
	headerStyleName: "advancedDataGridStyles";
	horizontalGridLineColor: 0;
	horizontalGridLines: true;
	stretchCursor: Embed(source="Assets.swf",symbol="cursorStretch");
	verticalGridLineColor: #000000;
}
