<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009"  creationComplete="hbox1_creationCompleteHandler(event)"
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%" xmlns:nestedtreedatagrid="com.flexicious.nestedtreedatagrid.*">
    <fx:Script>
        <![CDATA[
            import com.flexicious.example.model.billing.LineItem;
            import com.flexicious.example.utils.ExampleUtils;
            import com.flexicious.nestedtreedatagrid.cells.FlexDataGridCell;
            import com.flexicious.nestedtreedatagrid.cells.FlexDataGridFooterCell;
            import com.flexicious.nestedtreedatagrid.interfaces.IFlexDataGridCell;
            import com.flexicious.nestedtreedatagrid.utils.ExtendedUIUtils;
            import com.flexicious.nestedtreedatagrid.valueobjects.RowInfo;
            import com.flexicious.nestedtreedatagrid.valueobjects.RowPositionInfo;
            import com.flexicious.utils.UIUtils;
            
            import mock.FlexiciousMockGenerator;
            
            import mx.collections.ArrayCollection;
            import mx.collections.HierarchicalCollectionView;
            import mx.collections.HierarchicalData;
            import mx.collections.IList;
            import mx.collections.XMLListCollection;
            import mx.events.FlexEvent;
            
            import pdf.AlivePdfGenerator;
            
            protected function hbox1_creationCompleteHandler(event:FlexEvent):void
            {
                
            }
            private function getDataValue(item:Object,col:FlexDataGridColumn,cell:IFlexDataGridCell=null):String{
                var val:Object="";
                var nestDepth:int=cell.level.nestDepth;
                
                if(nestDepth==3){
                    val=ExtendedUIUtils.resolveExpression(item, col.dataField)
                    return val?UIUtils.formatCurrency(parseFloat(val.toString())):"";
                }
                return getTotal(item,nestDepth+1,col.dataField,false);
            }
            private function getFooter(cell:FlexDataGridFooterCell):String{
                var val:Object=cell.rowInfo.data;
                return getTotal(val,cell.level.nestDepth,cell.column.dataField,true);
            }
            private function getTotal(val:Object,nestDepth:int,dataField:String,usePrefix:Boolean):*{
                var arr:Object=[];
                var lbl:String="";
                var regionGroup:Object
                var region:Object
                var rep:Object
                if(val is IList || val is Array){
                    //the top level footers converts the root to a flat array.
                    for each( regionGroup  in val){
                        for each( region  in regionGroup.children()){
                            for each( rep  in region.children()){
                                arr.push({"value":rep[dataField]});
                            }
                        }
                    }
                }
                else if(nestDepth==1){
                    for each( regionGroup  in val.children()){
                        for each( region  in regionGroup.children()){
                            for each( rep  in region.children()){
                                arr.push({"value":rep[dataField]});
                            }
                        }
                    }
                }
                else if(nestDepth==2){
                    for each(var region1:Object in val.children()){
                        for each(var rep1:Object in region1.children()){
                            arr.push({"value":rep1[dataField]});
                        }
                    }
                    lbl="Region "
                }
                else if(nestDepth==3){
                    for each(var rep2:Object in val.children()){
                        arr.push({"value":rep2[dataField]});
                    }
                    lbl="State "
                }
                return (usePrefix?lbl+"Sum:":"")+ UIUtils.formatCurrency(UIUtils.sum(arr,"value"));
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
        
        <fx:XMLList id="dpHierarchyXML" >
            <Region Region="Southwest">
                <Region Region="Arizona">
                    <Territory_Rep Territory_Rep="Barbara Jennings" 
                                   Actual="38865" Estimate="40000"/>
                    <Territory_Rep Territory_Rep="Dana Binn" 
                                   Actual="29885" Estimate="30000"/>
                </Region>
                <Region Region="Central California">
                    <Territory_Rep Territory_Rep="Joe Smith" 
                                   Actual="29134" Estimate="30000"/>
                </Region>
                <Region Region="Nevada">
                    <Territory_Rep Territory_Rep="Bethany Pittman" 
                                   Actual="52888" Estimate="45000"/>
                </Region>
                <Region Region="Northern California">
                    <Territory_Rep Territory_Rep="Lauren Ipsum" 
                                   Actual="38805" Estimate="40000"/>
                    <Territory_Rep Territory_Rep="T.R. Smith" 
                                   Actual="55498" Estimate="40000"/>
                </Region>
                <Region Region="Southern California">
                    <Territory_Rep Territory_Rep="Alice Treu" 
                                   Actual="44985" Estimate="45000"/>
                    <Territory_Rep Territory_Rep="Jane Grove" 
                                   Actual="44913" Estimate="45000"/>
                </Region>
            </Region>
            <Region Region="Northeast">
                <Region Region="New York">
                    <Territory_Rep Territory_Rep="Alex Smith" 
                                   Actual="49229" Estimate="50000"/>
                    <Territory_Rep Territory_Rep="Joe Pittman" 
                                   Actual="35555" Estimate="40000"/>
                </Region>
                <Region Region="New Jersey">
                    <Territory_Rep Territory_Rep="Joe Smith" 
                                   Actual="28394" Estimate="30000"/>
                </Region>
                
                <Region Region="Connecticut">
                    <Territory_Rep Territory_Rep="Amanda Peters" 
                                   Actual="44331" Estimate="55000"/>
                    <Territory_Rep Territory_Rep="Jake Fremmer" 
                                   Actual="55434" Estimate="65000"/>
                </Region>
            </Region>  
        </fx:XMLList>
    </fx:Declarations>
    <nestedtreedatagrid:FlexDataGrid id="grid" width="100%" height="100%" enablePrint="true" enablePreferencePersistence="true"
                                     enableExport="true" enableCopy="true" enableFilters="true" enableDrillDown="true"
                                      pdfBytesReady="new AlivePdfGenerator().generate(event.target as FlexDataGrid ,event.printOptions)" 
                                    enableFooters="true"  initialSortField="title" 
                                    initialSortAscending="true" forcePagerRow="true"
                                    dataProvider="{new XMLListCollection(dpHierarchyXML)}" enableHideIfNoChildren="true"
                                    preferencePersistenceKey="xmlGroupedData">
                                
                <nestedtreedatagrid:columnLevel>
                    <nestedtreedatagrid:FlexDataGridColumnLevel >
                        <nestedtreedatagrid:columns>
                            
                            <nestedtreedatagrid:FlexDataGridColumn dataField="@Region" 
                                                       headerText="Region"   />
                            <nestedtreedatagrid:FlexDataGridColumn dataField="@Territory_Rep"
                                                       headerText="Territory Rep"  filterControl="TextInput" filterOperation="BeginsWith"/>
                            <nestedtreedatagrid:FlexDataGridColumn dataField="@Actual" 
                                                       headerText="Actual"
                                                       footerAlign="center"
                                                       labelFunction2="getDataValue"
                                                       footerLabelFunction2="getFooter"/>
                            <nestedtreedatagrid:FlexDataGridColumn dataField="@Estimate" 
                                                       headerText="Estimate" 
                                                       footerAlign="center" 
                                                       labelFunction2="getDataValue"
                                                       footerLabelFunction2="getFooter"/>

                        </nestedtreedatagrid:columns>
                        <nestedtreedatagrid:nextLevel>
                            <nestedtreedatagrid:FlexDataGridColumnLevel reusePreviousLevelColumns="true" enableFooters="true">
                                <nestedtreedatagrid:nextLevel>
                                    <nestedtreedatagrid:FlexDataGridColumnLevel reusePreviousLevelColumns="true" enableFooters="true">
                                    </nestedtreedatagrid:FlexDataGridColumnLevel>
                                </nestedtreedatagrid:nextLevel>
                            </nestedtreedatagrid:FlexDataGridColumnLevel>
                        </nestedtreedatagrid:nextLevel>
                    </nestedtreedatagrid:FlexDataGridColumnLevel>
                </nestedtreedatagrid:columnLevel>    
    </nestedtreedatagrid:FlexDataGrid>
    
</mx:HBox>