/** $Id: FlickrApp.as 74 2007-02-19 10:51:48Z gijsbert $ */ import com.kelvinluck.flickr.Flickr; import com.kelvinluck.flickr.FlickrResponseListener; import com.kelvinluck.flickr.Person; import com.kelvinluck.flickr.Photoset; import com.kelvinluck.flickr.Photo; import com.kelvinluck.flickr.ResultsSet; import com.kelvinluck.util.LogWrapper; class FlickrApp { private var _parent : MovieClip; private var _username : String; private var _nsid : String; private var _photosetIdx : Number; private var _period : Number; private var _border : Number; private var _aniStep : Number; private var _flickr : Flickr; private var _flickrLstnr : FlickrResponseListener; private var _mcs : Array; private var _mcd : Array; private var _mcc : Number; private var _mcl : MovieClipLoader; private var _person : Person; private var _linkUrl : String; private var _loadInterval : Number; static function tracemc( s : String, mc : MovieClip ) { trace( s + " " + mc + " v " + mc._visible + " d " + mc.getDepth() + " a " + mc._alpha ); } static function tracetf( s : String, tf : TextField ) { trace( s + " " + tf + " v " + tf._visible + " d " + tf.getDepth() + " a " + tf._alpha + " t " + tf.text + " h " + tf.htmlText ); } function FlickrApp( parent : MovieClip, username : String, nsid : String, photosetIdx : Number, period : Number ) { trace( "Flickr.Flickr" ); _parent = parent; // Get params: _username = username ? username : "roidelapatate"; _nsid = nsid; _photosetIdx = photosetIdx; // period is in milliseconds. _period = Math.max( 500, period ? period : 5000 ); // at least 0.5 second trace( "_username " + _username ); trace( " _nsid " + _nsid ); trace( " _period " + _period ); _aniStep = 10; _border = 25; // We alternate between 2 MovieClips in _mcs, where _mcc is the current displayed. // The 2 depths used are stored in _mcd. _mcs = new Array; _mcd = new Array; _mcd[ 0 ] = parent.getNextHighestDepth(); _mcd[ 1 ] = _mcd[ 0 ] + 1; _mcc = 1; // Display some text while loading, takes a while. var field : TextField = parent.createTextField( "mc" + _mcc, _mcd[ 1 ], 0, ( Stage.height - 30 ) / 2, Stage.width, Stage.height ); _mcs[ 1 ] = field; // Import style sheet for loading text. var styles:TextField.StyleSheet = new TextField.StyleSheet(); styles.onLoad = function(success:Boolean):Void { if (success) { field.styleSheet = styles; // Styles are only picked up correctly after styleSheet is set! field.html = true; field.htmlText = "

Loading...

"; } else { // Hmm, no styles. field.text = "Loading..."; var tf : TextFormat = field.getTextFormat(); tf.size = 28; tf.align = "center"; field.setTextFormat( tf ); field.textColor = 0xdddddd; } }; styles.load("style.css"); // Go through a Loader. _mcl = new MovieClipLoader(); _mcl.addListener( this ); // Do some stuff on key release. Key.addListener( this ); // Adjust to size changes. Stage.addListener(this); Stage.scaleMode = "noScale"; Stage.align = "TL"; // We keep the person. _person = undefined; // Hook up loggin to tracing. // LogWrapper.getInstance().init(); // LogWrapper.getInstance().addTracePublisher(); // Setup Flickr and FlickrResponseListener. _flickr = Flickr.getFlickr(); _flickr.apiKey = "0155f783f94555485809d753aefb6eba"; _flickrLstnr = new FlickrResponseListener(); // To test: // _flickrLstnr.onTestEcho = function(params:Object) { // trace("onTestEcho"); // } // _flickr.testEcho( "one", 2, "free" ); // Setup scope for callbacks. var self : FlickrApp = this; // Setup for peopleFindByUsername to get nsid. _flickrLstnr.onPeopleFindByUsername = function(person: Person) { trace( "onPeopleFindByUsername" ); trace( "person " + person.username + " " + person.nsid ); self._person = person; self._nsid = person.nsid; if ( self._photosetIdx ) { // Get photosets for this person. self._flickr.photosetsGetList( self._nsid ); } else { // Get all (public) photos. self._flickr.peopleGetPublicPhotos( person.nsid ); } }; // Setup photosetsGetList. _flickrLstnr.onPhotosetsGetList = function(person: Person) { trace( "onPhotosetsGetList" ); trace( "person " + person ); self._person = person; if ( person.getPhotosets()[ self._photosetIdx ] ) { trace( "request photos" ); self._flickr.photosetsGetPhotos( person.getPhotosets()[ self._photosetIdx ].id ); } else { trace( "peopleGetPublicPhotos" ); self._flickr.peopleGetPublicPhotos( person.nsid ); } }; // Setup photosetsGetPhotos. _flickrLstnr.onPhotosetsGetPhotos = function(photoset: Photoset) { trace( "onPhotosetsGetPhotos" ); trace( "numPhotos " + photoset.numPhotos ); trace( "photos " + photoset.getPhotos().length ); if ( photoset.getPhotos().length > 0 ) { self.startLoadRandomPhotoCycle(); } } // Setup peopleGetPublicPhotos. _flickrLstnr.onPeopleGetPublicPhotos = function(person: Person, resultsSet: ResultsSet ) { trace( "onPeopleGetPublicPhotos" ); trace( "numPhotos " + resultsSet.total ); trace( "photos " + resultsSet.photos.length ); trace( "page " + resultsSet.page ); trace( "numberOfPages " + resultsSet.numberOfPages ); if ( resultsSet.total > 0 ) { self.startLoadRandomPhotoCycle(); } if ( resultsSet.page < resultsSet.numberOfPages ) { // Get the next page. self._flickr.peopleGetPublicPhotos( person.nsid, "", 100, resultsSet.page + 1 ); } } // Start the chain. if ( ! _nsid ) { // Get the nsid for the username. _flickr.peopleFindByUsername( _username ); } else { // Get photosets for requested nsid. self._flickr.photosetsGetList( _nsid ); } } // getEmptyClip: get an empty MovieClip to load the next photo. function getEmptyClip():MovieClip { _mcc = 1 - _mcc; _mcs[ _mcc ].removeMovieClip(); _mcs[ _mcc ] = _parent.createEmptyMovieClip( "mc" + _mcc, _mcd[ 0 ] ); _mcs[ _mcc ]._visible = false; _mcs[ _mcc ]._alpha = 0; tracemc( "getEmptyClip(): mc" + _mcc, _mcs[ _mcc ] ); return _mcs[ _mcc ]; } // loadRandomPhoto: load random photo from photoset[0] or from the public photos. function loadRandomPhoto() { trace( "loadRandomPhoto" ); if ( _person ) { var photos : Array; // Try photosetIdx first. if ( _person.getPhotosets().length > 0 ) { trace( "Got photosets" ); var photoset : Photoset = _person.getPhotosets()[ _photosetIdx ]; if ( photoset ) { photos = photoset.getPhotos(); } } // Then _person.getPhotos(). if ( ! photos ) { trace( "use person.getPhotos" ); photos = _person.getPhotos(); } if ( photos ) { // Choose one. var idx : Number = MathUtils.randomRange( photos.length ); trace( "get " + idx + " from " + photos.length ); var photo : Photo = photos[ idx ]; // Decide which photo url to use for download, get one bigger than the // space we have. var minsize : Number = Math.min( Stage.width, Stage.height ); var url : String; if ( minsize <= 75 ) { url = photo.thumbnailUrl; } else if ( minsize <= 240 ) { url = photo.smallUrl; } else if ( minsize <= 500 ) { url = photo.mediumUrl; } else { url = photo.largeUrl; } trace( "get " + url ); // Now load the clip. _mcl.loadClip( url, getEmptyClip() ); // photo.owner is not set if photo was requested through the photoset, so // set it to get a valid photoPageUrl if ( ! photo.owner ) { photo.owner = _person; } // Use this link if MovieClip gets clicked. _linkUrl = photo.photoPageUrl; trace( "_linkUrl " + _linkUrl ); } } // To just get one image: // clearInterval( _loadInterval ); // _loadInterval = undefined; } // startLoadRandomPhotoCycle: load random image and install interval handler to do it // every x seconds. function startLoadRandomPhotoCycle() { if ( ! _loadInterval ) { trace( "startLoadRandomPhotoCycle" ); trace( "_loadInterval = " + _loadInterval ); trace( "_period = " + _period ); loadRandomPhoto(); if ( ! _loadInterval ) { var self : FlickrApp = this; _loadInterval = setInterval( function() { self.loadRandomPhoto() }, _period ); } trace( "_loadInterval = " + _loadInterval ); } } // onLoadInit: MovieClipLoader event. function onLoadInit( mc : MovieClip ) { trace( "FlickrApp::onLoadInit" ); trace( "mc " + mc ); // trace( "mc pos " + mc._x + "," + mc._y ); // trace( "mc size " + mc._width + "," + mc._height ); // trace( "stage " + Stage.width + ", " + Stage.height); // trace( "mc scale " + mc._xscale + "," + mc._yscale ); // Size to max size so we see everything. Take off the border. var sw : Number = Stage.width - 2 * _border; var sh : Number = Stage.height - 2 * _border; var sx : Number = sw / mc._width; var sy : Number = sh / mc._height; if ( sx < sy ) { mc._width *= sx; mc._height *= sx; } else { mc._width *= sy; mc._height *= sy; } // trace( "mc size " + mc._width + "," + mc._height ); // Center clip. mc._x = _border + ( sw - mc._width ) / 2; mc._y = _border + ( sh - mc._height ) / 2; // trace( "mc pos " + mc._x + "," + mc._y ); // Swap forward. // FIXME: just doing _mcs[ _mcc ].swapDepths( _mcs[ 1 - _mcc ] ) does not work? mc.swapDepths( _mcd[ 1 ] ); // Install link on click. if ( _linkUrl ) { var url : String = _linkUrl; mc.useHandCursor = true; mc.onRelease = function() { trace( "onRelease" ); trace( "url = " + url ); mc.getURL( url ); } } // Start animation if transparent. if ( mc._alpha < 100 ) { var self : FlickrApp = this; mc.onEnterFrame = function() { self.doEnterFrame(); } } } // doEnterFrame: animate until fully opaque. function doEnterFrame() { _mcs[ _mcc ]._alpha = Math.min( 100, _mcs[ _mcc ]._alpha + _aniStep ); _mcs[ 1 - _mcc ]._alpha = 100 - _mcs[ _mcc ]._alpha; if ( _mcs[ _mcc ]._alpha == 100 ) { _mcs[ _mcc ] .onEnterFrame = undefined; } } // onKeyDown: Key listener, ' ' forces a new random image to be loaded. function onKeyDown() { switch(Key.getCode()) { case Key.SPACE: { if ( _loadInterval ) { clearInterval( _loadInterval ); _loadInterval = undefined; } else { startLoadRandomPhotoCycle(); } } break; } } // onResize: Stage listener. function onResize() { trace("FlickrApp.onResize " + Stage.width + ", " + Stage.height); } private static var app : FlickrApp; // entry point static function main(mc:MovieClip) { trace("Flickr.main"); trace("mc.bgcolor " + mc.bgcolor); app = new FlickrApp( mc, mc.username, mc.nsid, mc.photosetIdx, mc.period ); } }