Tempo (AS3) – Small Efficient Media Player

Friday, September 19th, 2008 | Projects



Version 2.0.1, Updated October 06, 2008
  • Compatibility: Flash Player 9 and later (ActionScript 3.0)
  • File Size: About 25Kb
  • Change Log

Download Now (2.0.1)

What’s New

  • Now extends TempoLite – Previously Tempo and TempoLite shared the same core classes but not through extending. With the overhaul, Tempo now extends directly from TempoLite, simplifying integration.
  • Removed PureMVC and restructured – I was searching for a way to get TempoLite even smaller than it already was. In the end, I nixed PureMVC and realized I didn’t miss it (at least for this project). With TempoLite losing PureMVC, I had to take that change to Tempo. With that and a LOT of restructuring I managed to cut file size by about 7Kb!
  • Dropped compiled size by 7Kb (32Kb -> 25Kb)
  • Fixed video scaling issue on initial play – This was an issue I noticed after converting to TempoLite 2.0.0, where the video would play unscaled, then repeat scaled.

Description

Tempo is an online Flash-based music player, built to allow for a fully customizable interface. It is even capable of changing skins on the fly. Skinning is handled by making a simple SWF with movieclips with specific names. Tempo will look to see if the buttons exist, and if so, will assign actions to them. You can make a skin as simple as the Demo in minutes, or you can take the time to build one as unique as the Winamp skin. Tempo currently supports the following file types: flv, mp4, m4v, m4a, 3gp, mov, f4v, f4p, f4a, f4b, and mp3.

Competitors

This is a list of other known Flash media players currently out. While some media players may seem fancy or elaborate, Tempo’s goal is to be small, efficient and configurable. Below is a list of comparable players with similar capabilities and file sizes:

Playlists:


Skins:



You need to upgrade your Flash PlayerThis site requires atleast version 9.


Usage

Item Object

An item object is used for handling a single item. You pass an item object to add audio or video to the play list. When you try to retrieve audio or video from the play list, it is returned as an item object. Below is the format of an item object :

{title: "My Song", length: "100", url: "mySong.mp3", extOverride: "m4a"}

If no title is passed, it will be set to “”. If no length is passed, it will be set to -1. If extOverride isn’t passed, Tempo will get that last three letters of the file name to guess the file format.

Support Video Formats

Below is a list of the supported video formats. This is basically a run down of the videos Flash can play.

  • flv
  • mp4
  • m4v
  • 3gp
  • mov
  • f4v
  • f4p
  • f4b

Support Audio Formats

Below is a list of the supported audio formats, this is basically a run down of the sounds Flash can play.

  • m4a
  • f4a
  • mp3

Support Playlist Formats

You can pass the following playlist file types to Tempo. For each file type (if XML based) is a list of the corresponding tags as they relate to the Item Object described above.

  • ASX
    • <title> = Title
    • <ref> or <base> = URL
    • <duration> = Length
    • Example
  • XSPF
    • <title> = Title
    • <location> = URL
    • <duration> = Length
    • Example
  • M3U
  • PLS
    • = Title</li> <li><media:group><media:content url=”value”> = URL </li> <li><duration> = Length </li> <li> <a class="external text" title="http://code.google.com/apis/youtube/developers_guide_protocol.html#Understanding_Video_Entries" rel="nofollow" href="http://code.google.com/apis/youtube/developers_guide_protocol.html#Understanding_Video_Entries" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','code.google.com']);">Spec</a></li> </ul> </li> </ul> <h3>Javascript API</h3> <h4>Methods</h4> <pre><span style="color: #333399;"> play()</span></pre> <dl> <dd> Plays selected item in the playlist </dd> </dl> <pre><span style="color: #333399;"> playpause()</span></pre> <dl> <dd> Toggles between play and pause </dd> </dl> <pre><span style="color: #333399;"> pause()</span></pre> <dl> <dd> Pauses selected item in the playlist </dd> </dl> <pre><span style="color: #333399;"> stop()</span></pre> <dl> <dd> Stops the selected item in the playlist </dd> </dl> <pre><span style="color: #333399;"> next()</span></pre> <dl> <dd> Plays the next item in the playlist </dd> </dl> <pre><span style="color: #333399;"> prev()</span></pre> <dl> <dd> Plays the previous item in the playlist </dd> </dl> <pre><span style="color: #333399;"> playItem(index:Number)</span></pre> <dl> <dd> Plays specified item in the playlist </dd> </dl> <pre><span style="color: #333399;"> loadFile(item:Object, autoStart:Boolean = true)</span></pre> <dl> <dd> Creates a playlist of a single item and load the item </dd> </dl> <pre><span style="color: #333399;"> loadSkin(url:String = "DefaultSkin.swf")</span></pre> <dl> <dd> Loads a new skin </dd> </dl> <pre><span style="color: #333399;"> loadPlayList(url:String = "playlists/Tempo.m3u")</span></pre> <dl> <dd> Loads a new playlist </dd> </dl> <pre><span style="color: #333399;"> addItem(item:Object, index:Number = undefined)</span></pre> <dl> <dd> Adds an item to the playlist at the end, or at index specified </dd> </dl> <pre><span style="color: #333399;"> removetem(index:Number = undefined)</span></pre> <dl> <dd> Removes an item from the playlist from the end, or at index specified </dd> </dl> <pre><span style="color: #333399;"> clearItems()</span></pre> <dl> <dd> Clears the playlist </dd> </dl> <pre><span style="color: #333399;"> mute(b:Boolean)</span></pre> <dl> <dd> Turns audio off or on </dd> </dl> <h4>Properties</h4> <pre><span style="color: #333399;"> setId : Number getId : Number</span></pre> <dl> <dd> A unique id for this specific player. Useful where more than one player is on the page (default “1″) </dd> </dl> <pre><span style="color: #333399;"> setRepeat : Boolean getRepeat : Boolean</span></pre> <dl> <dd> Whether to loop the playlist (false) or a single item (true) (default false) </dd> </dl> <pre><span style="color: #333399;"> setShuffle : Boolean getShuffle : Boolean</span></pre> <dl> <dd> Whether to shuffle the playlist or not (default false) </dd> </dl> <pre><span style="color: #333399;"> setVolume : Number getVolume : Number</span></pre> <dl> <dd> A number from 0 to 1 determines volume (default 0.5) </dd> </dl> <pre><span style="color: #333399;"> setSeekPercent : Number getSeekPercent : Number</span></pre> <dl> <dd> Current play percentage through item </dd> </dl> <pre><span style="color: #333399;"> getItemData : Object</span></pre> <dl> <dd> Returns current playlist item object </dd> </dl> <pre><span style="color: #333399;"> getItemIndex : Number</span></pre> <dl> <dd> Returns current playlist item index </dd> </dl> <pre><span style="color: #333399;"> getLength : Number</span></pre> <dl> <dd> Returns number of items in playlist </dd> </dl> <pre><span style="color: #333399;"> getLoadPercent : Number</span></pre> <dl> <dd> Returns the load percentage </dd> </dl> <pre><span style="color: #333399;"> getTimeElapsed : Number</span></pre> <dl> <dd> Returns current play time, in 00:00 format </dd> </dl> <pre><span style="color: #333399;"> getTimeRemaining : Number</span></pre> <dl> <dd> Returns current remaining play time, in 00:00 format </dd> </dl> <pre><span style="color: #333399;"> getObjectID : String</span></pre> <dl> <dd> Returns unique SWF object ID in the html </dd> </dl> <h4>Events</h4> <pre><span style="color: #333399;"> onPlay</span></pre> <dl> <dd> Dispatched when item begins playing </dd> </dl> <pre><span style="color: #333399;"> onMetaData : Object</span></pre> <dl> <dd> Dispatched when metadata for current item is retrieved. </dd> <dd> Passes metadata as an object. </dd> </dl> <pre><span style="color: #333399;"> onPlayProgress : Object</span></pre> <dl> <dd> Dispatches when play progress is updated. </dd> <dd> <pre class="brush: as3;"> {percent:currentPercent, elapsed:timeCurrent, remain:timeLeft, total:timeTotal}</pre> </dd> <dd> percent : Current play percentage through item</dd> <dd> elapsed : Current play time, in 00:00 format</dd> <dd> remain : Current remaining play time, in 00:00 format</dd> <dd> total : Total length of item, in 00:00 format</dd> </dl> <pre><span style="color: #333399;"> onPlayComplete : Void</span></pre> <dl> <dd> Dispatched when item has finished playing </dd> </dl> <pre><span style="color: #333399;"> onLoad : Object</span></pre> <dl> <dd> Dispatched when a new item has begun to load.</dd> <pre class="brush: as3;">{url:strURL, type:"audio", time:timeTotal}</pre> <dd> url : URL of item loading </dd> <dd> type : Either “audio” or “video” </dd> <dd> time : Elapsed play time </dd> </dl> <pre><span style="color: #333399;"> onLoadProgress</span></pre> <dl> <dd> Dispatches when load progress is updated. </dd> <pre class="brush: as3;">{loaded:bytesLoaded, total:bytesTotal}</pre> <dd> loaded : Current bytes loaded </dd> <dd> total : Bytes to load </dd> </dl> <pre><span style="color: #333399;"> onVolume : Number</span></pre> <dl> <dd> Dispatched when the volume has changed. </dd> <dd> Passes the new volume setting. </dd> </dl> <pre><span style="color: #333399;"> onShuffle : Boolean</span></pre> <dl> <dd> Dispatched when the shuffle setting has changed. </dd> <dd> Pass the new shuffle setting. </dd> </dl> <pre><span style="color: #333399;"> onRepeat : Boolean</span></pre> <dl> <dd> Dispatched when the repeat setting has changed. </dd> <dd> Pass the new repeat setting. </dd> </dl> <h3>Flashvars API</h3> <pre><span style="color: #333399;"> autoStart : Boolean</span></pre> <dl> <dd> Determines if the player will immediately play the first item (default true) </dd> </dl> <pre><span style="color: #333399;"> autoStartIndex : Number</span></pre> <dl> <dd> The index of an item in the playlist to play if ‘autoStart’ is set to true (default 0) </dd> </dl> <pre><span style="color: #333399;"> bufferTime : Number</span></pre> <dl> <dd> Seconds to pre-buffer before playing an item (default 1) </dd> </dl> <pre><span style="color: #333399;"> fileURL : String</span></pre> <dl> <dd> The URL to an item to play, will create a playlist consisting on this single item </dd> </dl> <pre><span style="color: #333399;"> playerId : String</span></pre> <dl> <dd> A unique id for this specific player. Useful where more than one player is on the page (default “1″) </dd> </dl> <pre><span style="color: #333399;"> playlistURL : String</span></pre> <dl> <dd> The URL of the playlist to load (default “playlists/Tempo.m3u”) </dd> </dl> <pre><span style="color: #333399;"> repeat : Boolean</span></pre> <dl> <dd> Whether to loop the playlist (false) or a single item (true) (default false) </dd> </dl> <pre><span style="color: #333399;"> shuffle : Boolean</span></pre> <dl> <dd> Whether to shuffle the playlist or not (default false) </dd> </dl> <pre><span style="color: #333399;"> skinURL : String</span></pre> <dl> <dd> The URL to the skin to load (default “DefaultSkin.swf”) </dd> </dl> <pre><span style="color: #333399;"> volume : Number</span></pre> <dl> <dd> A number from 0 to 1 determines volume (default 0.5) </dd> </dl> <p><a name="changelog" ></a></p> <h3>Change Log</h3> <h4>Tempo 2.0.1 for AS3 (October 06, 2008)</h4> <ul> <li>Now extends TempoLite</li> <li>Removed PureMVC and restructured</li> <li>Dropped compiled size by 7Kb (32Kb -> 25Kb)</li> <li>Fixed video scaling issue on initial play</li> </ul> <h4>Tempo 1.1 for AS3 (September 19, 2008)</h4> <ul> <li>Added file extension override </li> <li>Fixed pause bug </li> <li>Updated to PureMVC AS3 Multicore 1.0.5 </li> </ul> <h4>Tempo 1.0.3 for AS3 (June 26, 2008)</h4> <ul> <li>Forgot to add PlayListProxy as a listener for metadata</li> <li>Playlist will automatically update with metadata as it’s received</li> </ul> <h4>Tempo 1.0.2 for AS3 (unreleased)</h4> <ul> <li>Fixed int comparison bug in removeItem, addItem, and play. Introduced in 1.0.1</li> </ul> <h4>Tempo 1.0.1 for AS3 (unreleased)</h4> <ul> <li>Fixed issue of adding / removing item from playlist at index ’0′</li> </ul> <h4>Tempo 1.0.0 for AS3 (unreleased)</h4> <ul> <li>Changed how the repeat property is handled. Instead of a boolean, it now passes a string. Accepted values are REPEAT_TRACK, REPEAT_ALL, and REPEAT_NONE.</li> </ul> <h4>Tempo 0.9.5 for AS3 (May 14, 2008)</h4> <ul> <li>Updates for TempoLite</li> </ul> <h4>Tempo 0.9.4 for AS3 (unreleased)</h4> <ul> <li>Updates for TempoLite</li> </ul> <h4>Tempo 0.9.3 for AS3 (unreleased)</h4> <ul> <li>Updates for TempoLite</li> </ul> <h4>Tempo 0.9.2 for AS3</h4> <ul> <li>Added loadSkin and loadPlayList methods to JavaScript API. Can’t believe I forgot these.</li> </ul> <h4>Tempo 0.9.1 for AS3</h4> <ul> <li>Switched to PureMVC multicore and tweaked api.</li> </ul> <h4>Tempo 0.9.0 for AS3 (unreleased)</h4> <ul> <li>Enhanced shuffle, now allows for next and previous shuffled songs. </li> <li>Improved Winamp skin.</li> <li>Dropped file size from 58kb to 31kb.</li> <li>Reorganized files again and optimized. </li> <li>Improved Javascript, and FlashVar support.</li> <li>Improved playlist updating.</li> </ul> <h4>Tempo 0.8.0 for AS3 (unreleased)</h4> <ul> <li>Probably should’ve been a minor release.</li> <li>Built a demo ui to swap between playlists and skins.</li> <li>Only changes here involved stability between playlists and skin changing.</li> </ul> <h4>Tempo 0.7.1 for AS3 (unreleased)</h4> <ul> <li>Fixed play list issue when an unplayable file is in the play list. Changed double click to single click for items in play lists.</li> </ul> <h4>Tempo 0.7 for AS3 (unreleased)</h4> <ul> <li>Fixed playlist tracking issue. </li> <li>Cleaned up code and reorganized structure. </li> <li>Reduced file size slightly.</li> </ul> <h4>Tempo 0.6 for AS3 (unreleased)</h4> <ul> <li>Added new skins (Zune, Winamp). </li> <li>Now handles video, and aac music (m4a and mp4). </li> <li>Also supports full screen video (only in Demo and Default skins).</li> </ul> <h4>Tempo 0.5 for AS3 (unreleased)</h4> <ul> <li>Supports custom views / skins, Player and Playlists. Loads default playlist file only.</li> </ul> <h3>Need Help?</h3> <p>Feel free to e-mail me a question. When you e-mail your question, please include a simplified FLA file (and any class files) that clearly demonstrates the problem and provide a brief explanation.</p> <p>Author: Gabriel Mariani, (e-mail: gabriel -at- coursevector.com)<br /> Copyright 2010, CourseVector (This work is subject to the terms <a href="http://blog.coursevector.com/terms" >here</a>.)</p> <p class="tags">Tags: <a href="http://blog.coursevector.com/tag/audio" rel="tag">audio</a>, <a href="http://blog.coursevector.com/tag/tempolite" rel="tag">tempolite</a>, <a href="http://blog.coursevector.com/tag/video" rel="tag">video</a></p> <div class="clear"></div></div> <!-- You can start editing here. --> <div class="box-left"> <h4 id="comments">2 Comments to <em>Tempo (AS3) – Small Efficient Media Player</em></h4> <div class="comment" id="comment-1230"> <div class="comment-details"> <strong><a href="http://www.radiofayl.com" onclick="javascript:_gaq.push(['_trackEvent','outbound-commentauthor','http://www.radiofayl.com']);" rel='external nofollow' class='url'>indiglosv</a></strong><br /> <small>November 8, 2009</small> </div><div class="clear"></div> <div class="comment-text"> <p>Can use ACC+ with this ?</p> </div> </div> <div class="comment" id="comment-1231"> <div class="comment-details"> <strong><a href="http://www.coursevector.com" rel='external nofollow' class='url'>gabriel</a></strong><br /> <small>November 8, 2009</small> </div><div class="clear"></div> <div class="comment-text"> <p>You know, I’m not sure. If Flash Player supports it, then yes. But I’m not sure ACC(m4a) is the same as ACC+. Wouldn’t take long to test and find out.</p> </div> </div> <h4 id="respond">Leave a comment</h4> <div id="commentform"> <div id="flashCommentBox" style="width:712px; height:330px; outline:none"><strong>Please upgrade your Flash Player</strong> To submit a comment, you must have Flash Player 9.0.0 or higher installed. I use a flash form here to help prevent spam.</div> <script type="text/javascript"> <!-- // <![CDATA[ var flashvars = {}; var params = {}; params.wmode = "transparent"; flashvars.formTextColor = "0x000000"; flashvars.formBackgroundColor = "0xFFFFFF"; flashvars.formBorderColor = "0xD4D4D4"; flashvars.titleTextColor = "0x363636"; flashvars.nameTitle = "Name (required)"; flashvars.nameValue = ""; flashvars.emailTitle = "Mail (will not be published) (required)"; flashvars.emailValue = ""; flashvars.urlTitle = "Website"; flashvars.urlValue = ""; flashvars.actionURL = "http://blog.coursevector.com/wp-comments-post.php"; flashvars.commentPostID = "7"; flashvars.unfilteredHtmlComment = "ad287e5c9d"; swfobject.embedSWF("http://blog.coursevector.com/wp-content/themes/demar/CommentBox.swf", "flashCommentBox", "712", "330", "9.0.0", false, flashvars, params, {}); swfobject.createCSS("#commentform","outline:none"); swfobject.createCSS("#flashCommentBox","outline:none"); // ]]> --> </script> </div> </div> </div><!-- end content-left --> <div id="content-right"> <div class="box-right"> <h4>Search</h4> <div id="searchform"> <form method="get" action="http://blog.coursevector.com/"> <input type="text" value="search..." onfocus="if (this.value == 'search...') {this.value = '';}" onblur="if (this.value == '') {this.value = 'search...';}" name="s" id="search" /> <input type="submit" id="search-submit" name="submit" value="GO" /> </form> </div> </div> <div id="text-3" class="box-right"> <div class="textwidget"><form action="https://www.paypal.com/cgi-bin/webscr" method="post"> <input type="hidden" name="cmd" value="_s-xclick"> <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7----- "> <input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"> <img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1"> </form> </div> </div><div id="linkcat-2" class="box-right"><h4>Blogroll</h4> <ul class='xoxo blogroll'> <li><a href="http://www.coursevector.com/" rel="me" title="Main Site" target="" onclick="javascript:_gaq.push(['_trackEvent','outbound-blogroll','http://www.coursevector.com/']);">Course Vector</a></li> <li><a href="http://blog.greensock.com/" rel="acquaintance" title="Best tweening engine out there, gotta show some love with a link to Jack’s work." target="" onclick="javascript:_gaq.push(['_trackEvent','outbound-blogroll','http://blog.greensock.com/']);">Tweenlite – GreenSock</a></li> </ul> </div> <div id="linkcat-8" class="box-right"><h4>Projects</h4> <ul class='xoxo blogroll'> <li><a href="http://blog.coursevector.com/merlin" rel="me" title="Font Organizer">.merlin</a></li> <li><a href="http://blog.coursevector.com/minerva" rel="me" title="SOL Reader">.minerva</a></li> <li><a href="http://blog.coursevector.com/sparta" rel="me" title="MXI Editor">.sparta</a></li> <li><a href="http://blog.coursevector.com/whistler" rel="me" title="Trace Log Viewer">.whistler</a></li> <li><a href="http://blog.coursevector.com/airadio" rel="me" title="Internet Radio">AIRadio</a></li> <li><a href="http://blog.coursevector.com/aroma" rel="me" title="Recipe Manager">Aroma</a></li> <li><a href="http://blog.coursevector.com/blackbox" rel="me" title="Flash Secure Login">BlackBox</a></li> <li><a href="http://blog.coursevector.com/comet" rel="me" title="Flash-based Chat">Comet</a></li> <li><a href="http://blog.coursevector.com/timestamp" rel="me" title="SWF Compile Timestamp">Compile Timestamp</a></li> <li><a href="http://blog.coursevector.com/flashbug" rel="me">Flashbug</a></li> <li><a href="http://blog.coursevector.com/googletasks" rel="me">Google Tasks</a></li> <li><a href="http://blog.coursevector.com/orion" rel="me" title="Particle Engine">Orion</a></li> <li><a href="http://blog.coursevector.com/sideshow" rel="me" title="Media Player">SideShow</a></li> <li><a href="http://blog.coursevector.com/tempolite" rel="me" title="Media Library">Tempolite</a></li> </ul> </div> <div id="text-4" class="box-right"> <div class="textwidget"><script type="text/javascript"><!-- google_ad_client = "pub-4393629565174725"; /* Blog Side 160x600, created 5/19/10 */ google_ad_slot = "5670071724"; google_ad_width = 160; google_ad_height = 600; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script></div> </div><div id="text-5" class="box-right"> <div class="textwidget"><script type="text/javascript"> window.google_analytics_uacct = "UA-349755-3"; </script></div> </div><div id="meta-2" class="box-right"><h4>Admin</h4> <ul> <li><a href="http://blog.coursevector.com/wp-login.php">Log in</a></li> <li><a href="http://blog.coursevector.com/feed" title="Syndicate this site using RSS 2.0">Entries <abbr title="Really Simple Syndication">RSS</abbr></a></li> <li><a href="http://blog.coursevector.com/comments/feed" title="The latest comments to all posts in RSS">Comments <abbr title="Really Simple Syndication">RSS</abbr></a></li> <li><a href="http://wordpress.org/" title="Powered by WordPress, state-of-the-art semantic personal publishing platform.">WordPress.org</a></li> </ul> </div> </div><!-- end content-right --> <div class="clear"></div> </div><!-- end content --> </div><!-- end page --> <div id="footer-wrap"> <div id="footer"> <div id="legal"><a href="http://blog.coursevector.com">Course Vector</a> is powered by <a href="http://wordpress.org">WordPress</a>.</div> <div id="webdemar"><a href="http://webdemar.com" title="WordPress Themes">WordPress Themes</a> by webdemar.</div> <div class="clear"></div> </div> </div><!-- end footer-wrap --> <script type='text/javascript' src='http://blog.coursevector.com/wp-content/uploads/shadowbox-js/73fe7904daae6540adc379bc2c86be8c.js?ver=3.0.3'></script> <!-- Begin Shadowbox JS --> <script type="text/javascript"> var shadowbox_conf = { animate: true, animateFade: true, animSequence: "sync", autoDimensions: false, modal: false, showOverlay: true, overlayColor: "#000", overlayOpacity: 0.8, flashBgColor: "#000000", autoplayMovies: true, showMovieControls: true, slideshowDelay: 0, resizeDuration: 0.35, fadeDuration: 0.35, displayNav: true, continuous: false, displayCounter: true, counterType: "default", counterLimit: 10, viewportPadding: 20, handleOversize: "resize", handleUnsupported: "link", initialHeight: 160, initialWidth: 320, enableKeys: true, skipSetup: false, flashParams: {bgcolor:"#000000", allowFullScreen:true}, flashVars: {}, flashVersion: "9.0.0" }; Shadowbox.init(shadowbox_conf); </script> <!-- End Shadowbox JS --> <script type='text/javascript' src='http://blog.coursevector.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/shCore.js?ver=2.1.364b'></script> <script type='text/javascript' src='http://blog.coursevector.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/shBrushAS3.js?ver=2.1.364b'></script> <script type='text/javascript'> (function(){ var corecss = document.createElement('link'); var themecss = document.createElement('link'); var corecssurl = "http://blog.coursevector.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/styles/shCore.css?ver=2.1.364b"; if ( corecss.setAttribute ) { corecss.setAttribute( "rel", "stylesheet" ); corecss.setAttribute( "type", "text/css" ); corecss.setAttribute( "href", corecssurl ); } else { corecss.rel = "stylesheet"; corecss.href = corecssurl; } document.getElementsByTagName("head")[0].appendChild(corecss); var themecssurl = "http://blog.coursevector.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/styles/shThemeMidnight.css?ver=2.1.364b"; if ( themecss.setAttribute ) { themecss.setAttribute( "rel", "stylesheet" ); themecss.setAttribute( "type", "text/css" ); themecss.setAttribute( "href", themecssurl ); } else { themecss.rel = "stylesheet"; themecss.href = themecssurl; } document.getElementsByTagName("head")[0].appendChild(themecss); })(); SyntaxHighlighter.config.clipboardSwf = 'http://blog.coursevector.com/wp-content/plugins/syntaxhighlighter/syntaxhighlighter/scripts/clipboard.swf'; SyntaxHighlighter.config.strings.expandSource = 'show source'; SyntaxHighlighter.config.strings.viewSource = 'view source'; SyntaxHighlighter.config.strings.copyToClipboard = 'copy to clipboard'; SyntaxHighlighter.config.strings.copyToClipboardConfirmation = 'The code is in your clipboard now'; SyntaxHighlighter.config.strings.print = 'print'; SyntaxHighlighter.config.strings.help = '?'; SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n'; SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: '; SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: '; SyntaxHighlighter.all(); </script> <!--stats_footer_test--><script src="http://stats.wordpress.com/e-201030.js" type="text/javascript"></script> <script type="text/javascript"> st_go({blog:'9620780',v:'ext',post:'7'}); var load_cmc = function(){linktracker_init(9620780,7,2);}; if ( typeof addLoadEvent != 'undefined' ) addLoadEvent(load_cmc); else load_cmc(); </script> </body> </html>