<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:maps="com.google.maps.*" layout="absolute" title="Amsterdam Coffeeshop Finder" initialize="init()" viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import mx.controls.Image;
import mx.controls.Alert;
import mx.events.DragEvent;
import mx.events.ResizeEvent;
import mx.core.Window;
import mx.effects.Resize;
import com.adobe.utils.XMLUtil;
import com.adobe.xml.syndication.rss.Item20;
import com.adobe.xml.syndication.rss.RSS20;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.navigateToURL;
import com.google.maps.LatLng;
import com.google.maps.Map;
import com.google.maps.MapEvent;
import com.google.maps.MapType;
import com.google.maps.MapMouseEvent;
import com.google.maps.LatLng;
import com.google.maps.InfoWindowOptions;
import com.google.maps.overlays.Marker;
import com.google.maps.overlays.MarkerOptions;
import com.google.maps.controls.ZoomControl;
import com.google.maps.controls.PositionControl;
import com.google.maps.controls.MapTypeControl;
import com.google.maps.controls.NavigationControl;
[Embed(source="icon.png")] private var coffeeshopIcon:Class
private static const RSS_URL:String = "rss.xml"; private static const GEORSS_NAMESPACE:String = "http://www.georss.org/georss"; private static const MAP_CENTER:LatLng = new LatLng(52.3740,4.8986); private static const AUTO_RESIZE:Boolean = false; private static const STATUSBAR_DEFAULTTEXT:String = "Kies een locatie";
private var loader:URLLoader = new URLLoader(); private var ns:Namespace = new Namespace("georss",GEORSS_NAMESPACE); private var pointElement:QName = new QName(ns, "point");
private function init():void
{
var screenBounds:Rectangle = Screen.mainScreen.bounds; var nativeWindow:NativeWindow = this.nativeWindow;
nativeWindow.x = (screenBounds.width - nativeWindow.width)/2;
nativeWindow.y = (screenBounds.height - nativeWindow.height)/2;
this.status = STATUSBAR_DEFAULTTEXT; divider.getDividerAt(0).visible = AUTO_RESIZE; }
private function parseRSS(data:String):void
{
if(!XMLUtil.isValidXML(data)) {
Alert.show("Feed bevat geen valide XML.","Fout"); return; }
var rss:RSS20 = new RSS20();
rss.parse(data);
var items:Array = rss.items;
for each(var item:Item20 in items) {
var points:Array = item.xml.descendants(pointElement).toString().split(" "); var enclosures:XMLList = item.xml.descendants("enclosure").attribute("url"); var images:Array = null;
if(enclosures.length() > 0) {
images = new Array();
for each(var enclosure:String in enclosures) {
images.push(enclosure); }
}
this.map.addOverlay(createMarker(item.title,item.description,item.link,points,images)); }
}
private function createMarker(title:String,description:String,url:String,position:Array,images:Array=null):Marker
{
var markerOptions:MarkerOptions = new MarkerOptions();
markerOptions.icon = new coffeeshopIcon(); markerOptions.tooltip = title; markerOptions.iconAlignment = MarkerOptions.ALIGN_HORIZONTAL_CENTER; markerOptions.iconOffset = new Point(0,-10); markerOptions.hasShadow = true;
var marker:Marker = new Marker(new LatLng(position[0],position[1]),markerOptions);
marker.addEventListener(MapMouseEvent.ROLL_OVER,function(event:MapMouseEvent):void { var street:String = description.split("<")[0]; changeStatus(title + " (" + street + ")"); });
marker.addEventListener(MapMouseEvent.ROLL_OUT,function(event:MapMouseEvent):void {
changeStatus(STATUSBAR_DEFAULTTEXT); });
marker.addEventListener(MapMouseEvent.CLICK, function(event:MapMouseEvent):void {
txtTitle.text = title; txtDescription.htmlText = description; btnLink.visible = true; btnLink.toolTip = url; btnLink.addEventListener(MouseEvent.CLICK,function(event:MouseEvent):void { navigateToURL(new URLRequest(url),"website"); });
accordion.selectedIndex = 0; container.removeAllChildren();
for each(var image:String in images) {
var objImage:Image = new Image(); objImage.load(image); objImage.maintainAspectRatio = true; objImage.showBusyCursor = true; objImage.percentWidth = 90; container.addChild(objImage); }
if(AUTO_RESIZE) {
var finished:Boolean = false;
accordion.resizeToContent = true;
divider.getDividerAt(0).x = stage.stageWidth - boxDescription.width;
}
map.panTo(event.latLng); });
return marker; }
private function changeStatus(text:String):void
{
this.status = text; }
private function onDataLoad(event:Event):void
{
var rawRSS:String = URLLoader(event.target).data;
parseRSS(rawRSS); }
private function onMapPreinitialize(event:Event):void {
var request:URLRequest = new URLRequest(RSS_URL); request.method = URLRequestMethod.GET;
loader.addEventListener(Event.COMPLETE, onDataLoad); loader.load(request); }
private function onMapReady(event:Event):void {
this.map.enableScrollWheelZoom(); this.map.enableContinuousZoom();
this.map.addControl(new NavigationControl());
this.map.setCenter(MAP_CENTER, 16, MapType.NORMAL_MAP_TYPE); }
]]>
</mx:Script>
<mx:HDividedBox id="divider" width="100%" height="100%" >
<mx:HBox width="80%" height="100%">
<maps:Map id="map" mapevent_mapready="onMapReady(event)" mapevent_mappreinitialize="onMapPreinitialize(event)" width="100%" height="100%" key="ABQIAAAATEjwloQxnrFICySY4m0OexSOW14Fob9ANQdkqXsiDTAtWn4o0BTh9K8wg-g5Mh9mgsMicJTggM9sHQ" url="http://code.google.com/apis/maps/" />
</mx:HBox>
<mx:HBox width="30%" height="100%">
<mx:Accordion id="accordion" color="0x323232" width="100%" height="100%">
<mx:VBox id="boxDescription" label="Beschrijving" paddingTop="5" paddingLeft="5">
<mx:Text id="txtTitle" selectable="false" fontWeight="bold" />
<mx:Text id="txtDescription" selectable="false" />
<mx:Button id="btnLink" label="Bezoek website" visible="false" />
</mx:VBox>
<mx:VBox id="container" label="Foto's" horizontalAlign="center" paddingTop="15">
</mx:VBox>
</mx:Accordion>
</mx:HBox>
</mx:HDividedBox>
</mx:WindowedApplication>