package tripvisModel { import com.adobe.serialization.json.JSONDecoder; import com.google.maps.LatLng; import flash.events.EventDispatcher; import flash.utils.Dictionary; import mx.collections.ArrayCollection; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.mxml.HTTPService; [Event(name="result", type="tripvisModel.TripItemProviderEvent")] public class TripItemProvider extends EventDispatcher { private var _taHttpService: HTTPService; //TripAdvisor HTTP service private var _storedTripItems: Dictionary; // _storedTripItems[locid] = SimpleTripItem public function TripItemProvider() { _taHttpService = new HTTPService(); _taHttpService.url = "http://www.tripadvisor.com/GMapsLocationController"; _taHttpService.useProxy = false; _taHttpService.method = "GET"; _taHttpService.addEventListener(ResultEvent.RESULT, taHttpService_result); _taHttpService.addEventListener(FaultEvent.FAULT, taHttpService_fault); _storedTripItems = new Dictionary(); } private function taHttpService_fault(event: FaultEvent): void { trace('ERROR accesing TA:' + event.message); } public function requestTripItems(mapViewport: MapViewport): void { _taHttpService.cancel(); //als er een request bezig was, cancel die // eerst op zoek gaan naar reeds gevonden TripItems: findStoredTripItems(mapViewport); // prepareer TripAdvisor request: var options: Object = new Object(); options.Action = "display"; options.from = "Tourism"; options.g = 999999; options.mc = mapViewport.centerPoint.lat() + ',' + mapViewport.centerPoint.lng(); options.mz = mapViewport.zoomLevel; options.mw = mapViewport.pixelWidth; options.mh = mapViewport.pixelHeight; // Verzend request naar TripAdvisor: _taHttpService.send(options); // DEBUG trace("Action=" + options.Action + "&from=" + options.from + "&g=" + options.g + "&mc=" + options.mc + "&mz=" + options.mz + "&mw=" + options.mw + "&mh=" + options.mh); } private function taHttpService_result(event: ResultEvent):void { var tripAdvisorAnswer: String = String(event.result); //trace(tripAdvisorAnswer); var correctJsonAnswer: String = tripAdvisorAnswer; // antwoord beetje processen, geen correct JSON antwoord // vb hotels: 123 vervangen door "hotels": 123 //var jsonCorrection:RegExp = /(\w+): /g; //correctJsonAnswer = correctJsonAnswer.replace( jsonCorrection, "\"$1\": "); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('zoom:', "g"), '"zoom":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('hotels:', "g"), '"hotels":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('lat:', "g"), '"lat":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('lng:', "g"), '"lng":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('locId:', "g"), '"locId":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('url:', "g"), '"url":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('title:', "g"), '"title":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('customHover:', "g"), '"customHover":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('titleUrl:', "g"), '"titleUrl":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('restaurants:', "g"), '"restaurants":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('attractions:', "g"), '"attractions":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('hotelsVisible:', "g"), '"hotelsVisible":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('sponsorVisible:', "g"), '"sponsorVisible":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('sponsors:', "g"), '"sponsors":'); correctJsonAnswer = correctJsonAnswer.replace(new RegExp('sponsorTrackingCode:', "g"), '"sponsorTrackingCode":'); // '' vervangen door "" correctJsonAnswer = correctJsonAnswer.replace(new RegExp("''", "g"), '" "'); var cutOffPosition: int = correctJsonAnswer.indexOf('"hotelsVisible":'); correctJsonAnswer = correctJsonAnswer.substring(0, cutOffPosition-2) + "}"; trace(correctJsonAnswer); //var correctJSONanswer: String = '{"zoom": 13, "hotels": [{ "lat": 51.14685, "lng": 2.714623, "locId": 637181, "url": "/Hotel_Review-g230023-d637181-Reviews-Bed_Breakfast_De_Promenade-Nieuwpoort_West_Flanders.html", "customHover": {"title": "Bed & Breakfast De Promenade", "url": "http://www.tripadvisor.com/GMapsLocationController?Action=info&from=Tourism&g=637181","titleUrl": "/Hotel_Review-g230023-d637181-Reviews-Bed_Breakfast_De_Promenade-Nieuwpoort_West_Flanders.html"} }]}'; var decoder:JSONDecoder = new JSONDecoder(correctJsonAnswer, true); var resultObject:Object = (decoder.getValue() as Object); var hotels:Array = resultObject["hotels"]; var attractions:Array = resultObject["attractions"]; var restaurants:Array = resultObject["restaurants"]; var tripItem: SimpleTripItem; var tripItems: ArrayCollection = new ArrayCollection(); for each(var hotel: Object in hotels) { if (_storedTripItems[hotel.locId] == null) { tripItem = parseTaObject(hotel); tripItem.type = TripItemType.HOTEL; tripItems.addItem(tripItem); } } for each(var attraction: Object in attractions) { if (_storedTripItems[attraction.locId] == null) { tripItem = parseTaObject(attraction); tripItem.type = TripItemType.LANDMARK; tripItems.addItem(tripItem); } } for each(var restaurant: Object in restaurants) { if (_storedTripItems[restaurant.locId] == null) { tripItem = parseTaObject(restaurant); tripItem.type = TripItemType.EATINGPLACE; tripItems.addItem(tripItem); } } dispatchEvent( new TripItemProviderEvent('result', tripItems) ); } private function parseTaObject(taObject: Object): SimpleTripItem { var tripItem: SimpleTripItem = new SimpleTripItem(); tripItem.name = taObject.customHover.title; tripItem.location = new Coordinates(taObject.lat, taObject.lng); tripItem.tripadvisorUrl = "http://www.tripadvisor.com" + taObject.url; //dummy data: tripItem.longDescription = "description description description description description description description description description"; tripItem.realAddress = "real address real address real address real address"; tripItem.rating = Math.round(Math.random()*(5)); // Sla de TripItem op in een Dictionary: _storedTripItems[taObject.locId] = tripItem; return tripItem; } // Dit gaan we normaal gezien nooit doen, aangezien we alle gevonden TripItems 'eeuwig' bijhouden public function clear(): void { for (var locId: Object in _storedTripItems) { delete _storedTripItems[locId]; } trace('cleared'); } private function findStoredTripItems(mapViewport: MapViewport): void { var foundTripItems: ArrayCollection = new ArrayCollection(); for each (var tripItem: SimpleTripItem in _storedTripItems) { var tripItemLatLng: LatLng = new LatLng(tripItem.location.latitude, tripItem.location.longitude); // kijken of de TripItem in de MapViewPort ligt: if( mapViewport.latLngBounds.containsLatLng(tripItemLatLng) ) { foundTripItems.addItem(tripItem); } } if (foundTripItems.length > 0) { trace ('found ' + foundTripItems.length + ' stored TripItems'); //DEBUG dispatchEvent( new TripItemProviderEvent('result', foundTripItems) ); } } } }