
The flash video player designed and developed for Free IQ and StomperNet. Plays video and audio content for a user. I implemented 85% of the actionscript, creating intuitive interactivity and functionality. External xml plsylist, author biography display, content details, share by email, social bookmarking, get embed codes, and more. Sleek design for maximum intuitive user engagement including navigable playlist, author biography, video detail, embedding, email, social bookmarking, volume control, full screen, multiple size options, etc.






Custom Flash Video Player @ FreeIQ and StomperNet
Dynamic Flash Scrolling Link List XML driven Component on FlashDen
Go get the file at FlashDen
Dynamic Scrolling Link List XML driven (No Wrap)
An interactive link list. Vertically scrolling list of links or just text. Could be used for a nav menu or a link list, or even just a scrolling list. Scroll speed calculated dynamically from mouse position to give not only scrolling control, but also speed control. Reads an external XML file containing just titles and url paths and creates this interactive click-able link list! On click the link is highlighted and on release loads the url either in a blank window or not (configurable). On rollover the list item grows with animation and is highlighted (all configurable, size speed etc). Once end of list is reached scrolling stops, another version is available with a wrap-around feature: Dynamic Scrolling Link List XML driven Auto wrapping
Circlecube Items at FlashDen
Get Current URL and Query String Parameters to Flash | Tutorial
Overview
This tutorial / how to / example will show how to get the current url from the browser to flash, and even how to get the query string parameters from the url into actionscript using ExternalInterface.
It has been a dilemma for many people to get this information into flash across browsers and without having to rely on flashvars or javascript, but to just have it work.
I wrote a post on it earlier, although it seemed it wouldn’t play nice with Internet Explorer IE, I later realized that it was only because of the way my blog is configured to embed flash. The call ExternalInterface.call(“window.location.href.toString”); or even ExternalInterface.call(‘eval’, ‘window.location.href’); which basically do the same thing.
This can be taken even further and we can read the query string, which, if you don’t know what that is, is the data contained in the url. The data is sent as paired strings, the key and the value. So, for example I could have a url http://example.com/index.html?var1=one&var2=two&var3=three. The question mark separates the actual url path from the query string. So following the ‘?’ we see three variables: var1, var2 and var3, and their corresponding values: one, two and three. They are seperated as pairs with an ampersand (&) and then the key and value are seperated by an equals sign (=). So it goes url?key=value&key=value&key=value…
Once we pass the complete url into our swf, it’s pretty easy to parse the keys and corresponding values.
Steps
- Rather than use url with ExternalInterface.call(“window.location.href.toString”); implement the QueryString class make a new QueryString This will do most of the work for you: var myPath:QueryString = new QueryString();
- Upon creation of the QueryString object the class reads the parameters automatically by parsing the parameters after the ‘?’ and delimiting on the ‘&’. So you get var1=one and var2=two
- Set up each parameter (key) as a variable in the parameter object of the QueryString class assigning it’s value to that variable.
- Access your values as myPath.parameters.var1 and myPath.parameters.var2
- unescape() your values to make the usable, unless you need them to be encoded or course. Unescape decodes the string from URL-encoded format (converting all hexadecimal sequences to ASCII characters). If your parameter had been some funky encoded string like var4=this+stuff%3E%22%28%29%3F, after you unescape(myPath.parameters.var4) you get: this stuff>”()?.
Example

Here’s a working example. This link has the parameters appended to it following the question mark ‘?’ and separated with an ampersand ‘&’ like all query string parameters. I have one for myName (Circlecube) another for myText (Jo Jo is a monkey) which are both pulled out and put into their own text box after they are unescaped, and then there are a couple more parameters just to show, the aNum (3013), anotherParam (more), and ref (http://blog.circlecube.com/…)
Special thanks to Abdul Qabiz example. I rewrote it for as2 so it would work with some flash projects I’m working on.
I use the new swf object 2 to embed the swf. Go get it here: 
Actionscript:
The actionscript layer of the swf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import flash.external.*; //so we can use externalInterface import QueryString.as; //so we can use the QueryString Class//make a new QueryString named myPath var myPath:QueryString = new QueryString(); assignVariables(); //custom function to handle all the query string parameters function assignVariables() { //if myName parameter exists if (myPath.parameters.myName) { //assign it to the text of the myName text box //unescape() will translate/unencode the url characters myName.text = unescape(myPath.parameters.myName); } if (myPath.parameters.myText) { myText.text = unescape(myPath.parameters.myText); } if (myPath.url) { //get the complete url (including any parameters) thisUrl.text = myPath.url; } recurseTrace(myPath.parameters, " "); } //function to recursivly print objects in heirarchy as string //so we get all parameters no matter what the key traced into //the allParams text box. function recurseTrace(info:Object, indent:String) { for (var i in info) { if (typeof info[i] == "object") { traceParams(indent + i + ":"); recurseTrace(info[i], indent + " "); } else { traceParams(indent + i + ": " + info[i] + "\n"); } } } function traceParams(traceMe:String) { allParams.text += traceMe; } |
The QueryString.as class for as2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | class QueryString { //instance variables var _queryString; var _all; var _params:Object; public function QueryString() { readQueryString(); } public function get getQueryString():String { return _queryString; } public function get url():String { return _all; } public function get parameters():Object { return _params; } private function readQueryString() { _params = {}; try { _all = ExternalInterface.call("window.location.href.toString"); _queryString = ExternalInterface.call("window.location.search.substring", 1); if(_queryString) { var allParams:Array = _queryString.split('&'); //var length:uint = params.length; for (var i = 0, index = -1; i < allParams.length; i++) { var keyValuePair:String = allParams[i]; if((index = keyValuePair.indexOf("=")) > 0) { var paramKey:String = keyValuePair.substring(0,index); var paramValue:String = keyValuePair.substring(index+1); _params[paramKey] = paramValue; } } } } catch(e:Error) { trace("Some error occured. ExternalInterface doesn't work in Standalone player."); } } } |
Download
Here’s a zip file containing the sample files, the QueryString Class file, and even the swfobject javascript file.
getURLParams.zip
Interactive Spin Actionscript Tutorial
I have been thinking of different interactions that are possible with objects. If you’ve read this blog at all you’ll know that I’ve played with physics and gravity and throwing balls and bouncing balls and all sorts. But I hadn’t wrapped my head around an interactive spinner. I know it’d be easy to make a slider or something that would apply a spin to an object, but this just isn’t interactive enough for me.
Circle with slider to rotate and button for random spin:
This attempt at spinning is ok. I mean, it spins the object and it even glides to a stop if you press the button for a random spin… But it’s just not intuitive and not fun. But if you want this, here’s how I did it.
Actionscript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | drag = .96; speed = 0; slider.handle.onPress = function() { spinning = false; //drag along the line this.startDrag(true, slider.line._x-slider.handle._width/2, slider.line._y-slider.handle._height/2, slider.line._width-slider.handle._width/2, slider.line._y-slider.handle._height/2); } slider.handle.onRelease = slider.handle.onReleaseOutside = function() { this.stopDrag(); } _root.onEnterFrame = function() { if (spinning) { //apply the speed to the rotation knob._rotation += speed; //recalculate speed speed = speed*drag; //if speed gets unnoticeably tiny just set it to 0 if (Math.pow(speed, 2) < .0001) { speed = 0; } } else { //set the rotation from the slider position knob._rotation = slider.line._x + slider.handle._x + slider.handle._width/2; } //spit out feedback continuously feedbackr.text = knob._rotation; feedbackaccr.text = speed; } spinner.onRelease = function() { //find a random speed speed = (Math.random()* 50) - 25; spinning = true; } |
I want to grab it and spin it though. I want to apply the same principles from physics, like acceleration and friction as forces to the object, so I can grab to spin and release to watch it glide gracefully to a stop. I’ve been thinking about this and how I’d have to use trigonometry and stuff to do it. One day I finally had the time and tried it out. It took me a minute but I figured out that what I needed was arctangent. So (with pointers from jbum, thanks Jim!) I came up with this:
Interactive grab-able circle to spin and twirl:
This one is much more interactive and intuitive. I really think this is because there are no sliders or buttons, no controls, just an object to interact with. It’s much more like real life!
Steps:
In order to make a grab and spin object
1. You have to know where you grab. The user clicks on the shape (knob) and you must figure out what degree or rotation point they have started at. (atan2)
2. As the knob is clicked and the mouse moves (dragging), calculate new rotation by mouse position
3. When mouse is released figure out the current speed of rotation and apply it to the knob with friction, so it can be thrown and spun in that way. (Of course this is optional, if you just want to spin it when the mouse is down you’re done at step 2)
Actionscript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | damp = .96; //friction r = 0; //rotation accr = 0; //speed of rotation knob.onPress = function() { dragging = true; //find mouse y coordinate in relation to knob origin a = _root._ymouse - knob._y; //find mouse x coordinate in relation to knob origin b = _root._xmouse - knob._x; //using arctangent find the spot of rotation (in degrees) oldr = Math.atan2(a,b)*180/Math.PI; } knob.onRelease = knob.onReleaseOutside = function() { dragging = false; } knob.onEnterFrame = function() { if (dragging) { //find mouse y coordinate in relation to knob origin a = _root._ymouse-knob._y; //find mouse x coordinate in relation to knob origin b = _root._xmouse-knob._x; //using arctangent find the spot of rotation (in degrees) r = Math.atan2(a,b)*180/Math.PI; //use current rotation and previous rotation //to find acceleration //averages the acceleration with the //previous acceleration for smoother spins accr = ((r - oldr) + accr)/2; //apply the acceleration to the rotation knob._rotation += accr; //remember current rotation as old rotation oldr = r; feedbacka.text = a; feedbackb.text = b; } else { knob._rotation += accr; //apply friction to acceleration force //and if acceleration gets tiny, just set it to zero if (Math.pow(accr, 2) > .0001 ) { accr *= damp; } else{ accr = 0; } } //spit out feedback continuosly feedbackr.text = knob._rotation; feedbackaccr.text = accr; } |
I commented the code to explain what is happening, if you need more just post a comment. Let me know if you find this useful and what you end up making with it.
Downloads:
Local Connection Actionscript – Communicate between seperate Flash files | Tutorial
Overview:
Local Connection
Communication between two separate flash files placed on the same page (or even running simultaneously on one machine) is a nice way to spread a project out. You can send variable, call functions, pretty much do anything in one swf from another. Easiest case use would be a navigation menu set up in one flash file to control the other one containing the content. I’ve made an example here showing how to send text from one to another. I’ve done it both directions here. Send text from the red swf to the blue swf, and from mr. Blue you send to the red flash file. I have named the flash functions in actionscript accordingly (or tried to, now I notice a few places I misspelled receive, ‘i’ before ‘e’, right? oh yea, except after ‘c’)…
Anyways, try out the example here, I made it a little easier by putting a keyListener on ‘Enter’, so you don’t have to actually press the send button. Didn’t realize it before, but this is like a chat app built in flash! So go ahead and chat with yourself to prove that it works!
Execute actionscript in one swf from another! Inter-swf communication.
Example:
Type here to send Red text to Blue flash file
And see it received here, and go ahead and send some back to Red.
Actionscript:
Red:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Receiving //create a local connection for reciept of text var receiving_lc:LocalConnection = new LocalConnection(); //function called from other swf receiving_lc.recieveBlueText = function(textRecieved:String) { feedback.text += textRecieved+"\n"; }; //receive connection of specified name receiving_lc.connect("fromBlue"); //Sending sendButton.onRelease = function() { //create local connection for sending text var sending_lc:LocalConnection = new LocalConnection(); //put text from input into a var var textToSend = inputText.text; //send through specified connection, call specified method, send specified parameter sending_lc.send("fromRed", "recieveRedText", textToSend); //set the input empty inputText.text = ""; } |
Blue:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Receiving var receiving_lc:LocalConnection = new LocalConnection(); receiving_lc.recieveRedText = function(textRecieved:String) { feedback.text += textRecieved+"\n"; }; receiving_lc.connect("fromRed"); //Sending sendButton.onRelease = function() { var sending_lc:LocalConnection = new LocalConnection(); var textToSend = inputText.text; sending_lc.send("fromBlue", "recieveBlueText", textToSend); inputText.text = ""; } |
And the code to listen to the ‘enter’ key(this is in both files):
1 2 3 4 5 6 7 8 | //Enter button to send var keyListener:Object = new Object(); keyListener.onKeyDown = function() { if (Key.getCode() == "13") { sendButton.onRelease(); } }; Key.addListener(keyListener); |
Download Source:
StomperNet Scrutinizer Update | Features include Bookmarking, Screenshots & Loader
Scrutinizer is constantly being updated and enhanced and with the launch of Adobe AIR 1.0 is easier than ever to install!
It now supports bookmarking, capturing and saving screenshots and displays progress as pages load.
With even more to come soon!
Go check it out at StomperNet’s public site for free download
!
Here’s some images to show off scrutinizer!
Watching the loader while my page loads:

Scrutinizing this circlecube blog:

Bookmarking my page for quick access:

Free IQ Player integrates Google Analytics for Video
As announced, the Free IQ Media Player now incorporates Google Analytics with it’s custom flash video player. Simply put, users may upload their own content (or even use anyone else’s content that is on Free IQ), embed it on their own sites and then view the tracking/logging/usage/analytics/metrics it their own Google analytics account. You don’t have to do anything- the player will do it automatically, but if you don’t have google analytics installed on your site, nothing happens. So go ahead and sign up, it’s free and very useful.
This works with both versions of Google analytics tracking code. Recently Google updated the code they give users to enhance the functionality of the analytics they give you in their reports. Some have voiced concern about whether they can update to the new code and still use the Free IQ video tracking, now the answer is yes! This new updated player works with the new Google Analytics Tracking Code! Others have voiced a concern that they aren’t ready to update the Google code on the rest of their site yet, this is not a problem either. The Free IQ Player works with either version of the GATC (Google Analytics Tracking Code). It would even work with both… say you had a site with some old code and some new code, the player knows and will tell Google what people are doing with this player on your site.

To see the report, go to your google analytics account, click on ‘Content’, and then ‘Top Content’. This page shows you the most viewed pages on your site. You can filter the report by typing in the box under the list of urls. Find the ‘Find Url’ box (be sure ‘containing’ is selected in the drop-down) and type ‘freeiqvideo/’. Press ‘go’ and you should see all the analytics for the Free IQ player on your site! All the analytics from the player start with ‘freeiqvideo/’ in the url path and we’ve organized all the analytics into three different types: Video, Actions and Navigation. Every time someone does any of these things on your site, google analytics will log a pageview to a certain page. This certain page changes and depends upon what the user did exactly. When a user visits your site and begins to watch a certain video called ‘My Cool Video’, google analytics logs a pageview to ‘freeiqvideo/playstart/mycoolvideo! Notice that the title of the video is incorporated into the report, this helps determine which video is more popular and such. The title of the video is the title you give Free IQ upon uploading your content and can usually also be found at http://freeiq.com/mycoolvideo
This information can be very helful as you think about which video to place or keep on your site, and even where to put it. You can also see how many times the video was finished (freeiqvideo/playcomplete/mycoolvideo). This can be very useful to help you determine if your video is too long, too boring, or on the other end very engaging- it’s essentially your video bounce rate.
Other than video tracking, the Free IQ Player also logs to google analytics actions users have with the player itself. The Free IQ Player enables users to share your content with others. There are interactions with the player for users to email a link to their friends about the content they are watching, get html codes to embed that content onto their own site, and even share the content with any of a number of social bookmarking sites! If someone were to use the Free IQ Player to link to your content through a popular del.icio.us the report would log a pageview at ‘freeiqvideo/PlayerInteraction/SharedVideo/delicious/mycoolvideo’! You will see which bookmarking service was used and what content was bookmarked! You will know what users are doing with your content!

And lastly you can see how users navigate through the embedded Free IQ Player. Inside the player, users are presented with information about the content they watch. All this information is organized into tabbed windows. Every time a user view’s this information, the player logs to google analytics a page view. These logs are independent of the content, so the url reported does not include the video Title as before. An example is a user views the author window is: /freeiqvideo/PlayerNav/WindowSelected/author.
Here is the breakdown of all the logging from the Free IQ Player to Google Analytics:
Video Tracking:
Play Started: /freeiqvideo/playstart/mycoolvideo
Play Completed: /freeiqvideo/playcomplete/mycoolvideo
Interactions:
Embed Codes Copied: /freeiqvideo/PlayerInteraction/EmbedCodesCopied/mycoolvideo
Email Sent: /freeiqvideo/PlayerInteraction/EmailSent/mycoolvideo
Bookmark: /freeiqvideo/PlayerInteraction/SharedVideo/bookmarkingService/mycoolvideo
Navigation:
Author Tab Selected: /freeiqvideo/PlayerNav/WindowSelected/author
Playlist Tab Selected: /freeiqvideo/PlayerNav/WindowSelected/playlist
IQPON Tab Selected: /freeiqvideo/PlayerNav/WindowSelected/iqpon
Share Tab Selected: /freeiqvideo/PlayerNav/WindowSelected/share
Email Tab Selected: /freeiqvideo/PlayerNav/WindowSelected/email
Embed Tab Selected: /freeiqvideo/PlayerNav/WindowSelected/embed
This is the list of current integration with Google Analytics from the Free IQ Player. If you have any questions or requests, feel free to comment here or contact Free IQ.































Stomper Scrutinizer Browser AIR App
Software for viewing websites through a simulated fovea vision. Since not everyone could set-up, let alone afford a real eye-tracker. This software uses the mouse pointer as the user’s focal point, or foveal view. It blurs everything except where your focal point (the mouse) is. It is helpful because it forces you to re-think web design from an extreme usability standpoint. This browser software was built using AIR and Flex. Using this software as an eye-tracking simulation, you can get a better idea of how users interact with your site design.
I was responsible for programming and designing some key functionality of the app: the menu bar logic, bookmarking engine, capturing and saving of screenshots, and the loading bar which shows page load progress, and the overall browser chrome/skin.