<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()" layout="horizontal" viewSourceURL="srcview/index.html">

  <mx:Script>
  <![CDATA[
  import mx.charts.HitData;
  import mx.collections.ArrayCollection;
  import mx.rpc.events.ResultEvent;
  
  [Bindable] public var territoryRevenue:ArrayCollection;
  [Bindable] public var productlineRevenue:Object;
  [Bindable] public var topTenCustomersRevenue:Object;
  
  private var _selectedTerritory:String = "*";
  private var _selectedProductLine:String = "*";
  
  private function initApp():void
  {
    productlineRevenue = new Object();
    topTenCustomersRevenue = new Object();
    
    tSrv.send();
    
    updateProductLineRevenue();
    updateTopTenCustomersRevenue();
  }
  
  public function set selectedTerritory(territory:String):void
  {
    _selectedTerritory = territory;
    
    updateProductLineRevenue();
    updateTopTenCustomersRevenue();
  }
  
  [Bindable] public function get selectedTerritory():String
  {
    return _selectedTerritory;
  }
  
  public function set selectedProductLine(productLine:String):void
  {
    _selectedProductLine = productLine;
    
    updateTopTenCustomersRevenue();
  }
  
 [Bindable] public function get selectedProductLine():String
 {
   return _selectedProductLine;
 }
  
  private function updateProductLineRevenue():void
  {
    if (productlineRevenue[_selectedTerritory] == undefined)
    {
      productlineRevenue[_selectedTerritory] = new ArrayCollection();
      
      var p:Object = new Object();

      if (_selectedTerritory != "*")
      {
        p.territory = _selectedTerritory;
      }
      
      plSrv.send(p);
    }
    else
    {
      plPie.dataProvider = productlineRevenue[_selectedTerritory];
    }
  }
  
  private function updateTopTenCustomersRevenue():void
  {
    if (topTenCustomersRevenue[_selectedTerritory + '_' + _selectedProductLine] == undefined)
    {
      topTenCustomersRevenue[_selectedTerritory + '_' + _selectedProductLine] = new ArrayCollection();
      
      var p:Object = new Object();
      
      if (_selectedTerritory != "*")
      {
        p.territory = _selectedTerritory;
      }
      
      if (_selectedProductLine != "*")
      {
        p.productline = _selectedProductLine;
      }
      
      ttcSrv.send(p);
    }
    else
    {
      ttcBar.dataProvider = topTenCustomersRevenue[_selectedTerritory + '_' + _selectedProductLine];
    }
  }
  
  private function handleTResult(event:ResultEvent):void
  {
    territoryRevenue = new ArrayCollection();
    tPie.dataProvider = territoryRevenue;
    
    var hdr:ArrayCollection = event.result.Envelope.Body.ExecuteActivityResponse.swresult['COLUMN-HDR-ROW']['COLUMN-HDR-ITEM'];
    
    for each (var pl:Object in event.result.Envelope.Body.ExecuteActivityResponse.swresult['DATA-ROW'])
    {
      var spl:Object = new Object();
      spl[hdr[0]] = pl['DATA-ITEM'][0];
      spl[hdr[1]] = pl['DATA-ITEM'][1];
      territoryRevenue.addItem(spl);
    }
  }
  
  private function handlePLResult(event:ResultEvent):void
  {
    var hdr:ArrayCollection = event.result.Envelope.Body.ExecuteActivityResponse.swresult['COLUMN-HDR-ROW']['COLUMN-HDR-ITEM'];
    
    for each (var pl:Object in event.result.Envelope.Body.ExecuteActivityResponse.swresult['DATA-ROW'])
    {
      var spl:Object = new Object();
      spl[hdr[0]] = pl['DATA-ITEM'][0];
      spl[hdr[1]] = (pl['DATA-ITEM'][1] * (Math.random() + .5));  // randomized for demo
      productlineRevenue[_selectedTerritory].addItem(spl);
    }
    
    plPie.dataProvider = productlineRevenue[_selectedTerritory];
  }
  
  private function handleTTCResult(event:ResultEvent):void
  {
    var hdr:ArrayCollection = event.result.Envelope.Body.ExecuteActivityResponse.swresult['ROW-HDR-ROW'];
    var pl:ArrayCollection = event.result.Envelope.Body.ExecuteActivityResponse.swresult['DATA-ROW'];
    
    for (var i:int = 0; i < pl.length; i++)
    {
      var spl:Object = new Object();
      spl.name = hdr[i]['ROW-HDR-ITEM'][0];
      spl.sales = (pl[i]['DATA-ITEM'] * (Math.random() + .5)); // randomized data for demo
      topTenCustomersRevenue[_selectedTerritory + '_' + _selectedProductLine].addItemAt(spl,0);
    }
    
    ttcBar.dataProvider = topTenCustomersRevenue[_selectedTerritory + '_' + _selectedProductLine];
  }
  
  private function formatTPieDataTip(hitdata:HitData):String
  {
    return "<b>" + hitdata.item.TERRITORY + "</b><br>" + cf.format(hitdata.item.SOLD_PRICE);
  }
  ]]>
  </mx:Script>
  
  <!-- Hard coded data for demo -->
  <mx:HTTPService id="tSrv" url="Sales_by_Territory.xaction" result="handleTResult(event)"/>
  
  <mx:HTTPService id="plSrv" url="Sales_by_Productline.xaction" result="handlePLResult(event)"/>
  
  <mx:HTTPService id="ttcSrv" url="topnmdxquery.xaction" result="handleTTCResult(event)"/>


  <mx:CurrencyFormatter id="cf" precision="0"/>
  

  <mx:SeriesInterpolate id="plEffect"/>
  
  <mx:SeriesSlide id="ttcSlide" direction="right"/>
  

  <mx:VBox height="100%" width="40%">
    <mx:Panel width="100%" height="100%" title="Revenue By Territory">
      <mx:PieChart id="tPie" width="100%" height="100%" showDataTips="true" dataTipFunction="formatTPieDataTip">
        <mx:itemClick>
        selectedTerritory = event.hitData.item.TERRITORY;
        
        var explodeData:Array = [];
        explodeData[territoryRevenue.getItemIndex(event.hitData.item)] = 0.15;
        tPie.series[0].perWedgeExplodeRadius = explodeData;
        </mx:itemClick>
        <mx:series>
          <mx:PieSeries nameField="TERRITORY" field="SOLD_PRICE" labelPosition="insideWithCallout" labelField="TERRITORY"/>
        </mx:series>
      </mx:PieChart>
    </mx:Panel>
    
    <mx:Panel width="100%" height="100%" title="Revenue By Product Line (Territory = {selectedTerritory})">
      <mx:PieChart id="plPie" width="100%" height="100%" showDataTips="true">
        <mx:itemClick>
        selectedProductLine = event.hitData.item.PRODUCTLINE;
  
        var explodeData:Array = [];
        explodeData[productlineRevenue[_selectedTerritory].getItemIndex(event.hitData.item)] = 0.15;
        plPie.series[0].perWedgeExplodeRadius = explodeData;
        </mx:itemClick>
        <mx:series>
          <mx:PieSeries nameField="PRODUCTLINE" field="REVENUE" labelPosition="insideWithCallout" showDataEffect="{plEffect}" labelField="PRODUCTLINE"/>
        </mx:series>
      </mx:PieChart>
    </mx:Panel>
  </mx:VBox>

  <mx:Panel width="100%" height="100%" title="Top 10 Customers (Territory = {selectedTerritory} | Product Line = {selectedProductLine})">
    <mx:BarChart id="ttcBar" width="100%" height="100%" showDataTips="true">
      <mx:series>
        <mx:BarSeries xField="sales" showDataEffect="{ttcSlide}"/>
      </mx:series>
      <mx:verticalAxis>
        <mx:CategoryAxis categoryField="name"/>
      </mx:verticalAxis>
    </mx:BarChart>
  </mx:Panel>
  
</mx:Application>