/**
 * Simple example application of the NoncontiguousCartogram class.
 * Shows how to use shp/dbf data to create the cartogram.
 * 
 * By Zachary Forest Johnson
 * indiemaps.com/blog
 * 
 */
package
{
    import com.indiemaps.mapping.cartograms.noncontiguous.NoncontiguousCartogram;
    import com.indiemaps.mapping.cartograms.utils.CartogramUtils;
    import com.indiemaps.mapping.projections.LambertConformalConic;
    import com.indiemaps.mapping.utils.ShpDbfLoader;
        
    import flash.display.Sprite;
    import flash.events.Event;
    
    [SWF(backgroundColor='#cccccc', width='1000', height='500')]
    /**
     * A very simple example of the NoncontiguousCartogram class.
     * Loads geometry and attributes from a shapefile and creates a cartogram based on 2008 general election turnout.
     * 
     */
    public class USStatesCartogramExample extends Sprite
    {
        protected var shapefileLocation:String = 'data/shp/STATES2';
        protected var attributeField:String = 'VOTERS_08'; //size states according to turnout in the 08 election
        
        protected var anchorPercentile:Number = .9;
        protected var maxWidthOfCartogram:Number = 1000;
        protected var maxHeightOfCartogram:Number = 500;
        
        protected var combinedArrayForCartogram:Array = []; 
        
        protected var cartogram:NoncontiguousCartogram;
        
        protected var cartogramContainer:Sprite = new Sprite();
        
        public function USStatesCartogramExample()
        {            
            var shpDbfLoader:ShpDbfLoader = new ShpDbfLoader(shapefileLocation + '.shp', shapefileLocation + '.dbf');    
            shpDbfLoader.addEventListener(ShpDbfLoader.DATA_LOADED, onShpDbfDataLoaded);
            addChild(cartogramContainer);
        }
        
        protected function onShpDbfDataLoaded(e:Event):void {
            var shpDbfLoader:ShpDbfLoader = e.target as ShpDbfLoader;
            combinedArrayForCartogram = CartogramUtils.createCombinedArrayFromShpDbf(shpDbfLoader.shpRecords, shpDbfLoader.dbfRecords, multiPolygonConversionFunction);
            createCartogram();
        }
        
        protected function multiPolygonConversionFunction(multiPolygon:Array):Array {
            var standardParallel1_degrees:Number = 33;
            var standardParallel2_degrees:Number = 45;
            var latitudeOrigin_degrees:Number = 23;
            var longitudeOrigin_degrees:Number = -96;
            var geometry:Array = LambertConformalConic.projectMultiPolygon(multiPolygon, NaN, NaN, NaN, NaN, standardParallel1_degrees, standardParallel2_degrees, latitudeOrigin_degrees, longitudeOrigin_degrees);
            
            return geometry;
        }
        
        protected function createCartogram():void {
            cartogram = new NoncontiguousCartogram(combinedArrayForCartogram, maxWidthOfCartogram, maxHeightOfCartogram, attributeField, anchorPercentile);
            cartogramContainer.addChild(cartogram);
        }
    }
}