diff --git a/flowplayer.admin.inc b/flowplayer.admin.inc
index 8bd4613..3ec05b9 100644
--- a/flowplayer.admin.inc
+++ b/flowplayer.admin.inc
@@ -10,6 +10,17 @@
  */
 function flowplayer_admin_settings() {
   $form = array();
+
+  $flowplayer_path = flowplayer_get_path();
+
+  $form['flowplayer_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Flowplayer Library Path'),
+    '#default_value' => $flowplayer_path,
+    '#description' => t('The location where Flowplayer and plugins are installed. Relative paths are from the Drupal root directory.'),
+    '#after_build' => array('_flowplayer_admin_settings_check_plugin_path'),
+  );
+
   $form['flowplayer_key'] = array(
     '#type' => 'textfield',
     '#title' => t('License Key'),
@@ -130,4 +141,22 @@ function flowplayer_admin_settings() {
   );
 
   return system_settings_form($form);
+}
+
+/**
+ * Checks if the directory in $form_element exists and contains a file named
+ * 'flowplayer.swf'. If validation fails, the form element is flagged
+ * with an error from within the file_check_directory function.
+ *
+ * @param $form_element
+ *   The form element containing the name of the directory to check.
+ */
+function _flowplayer_admin_settings_check_plugin_path($form_element) {
+  $library_path = $form_element['#value'];
+  
+  if(!is_dir($library_path) || !_flowplayer_get_js_path() || !_flowplayer_get_swf_path()){
+    form_set_error($form_element['#parents'][0], t('You need to download and set up flowplayer. For more information see README.txt.'));
+  }
+
+  return $form_element;
 }
\ No newline at end of file
diff --git a/flowplayer.module b/flowplayer.module
index 5bc1923..7edddde 100644
--- a/flowplayer.module
+++ b/flowplayer.module
@@ -5,7 +5,13 @@
  * Provides integration with FlowPlayer.
  */
 
+/*
+ * The default path to the FlowPlayer directory.
+ */
+define('FLOWPLAYER_PATH', 'sites/all/libraries/flowplayer');
+
 /**
+
  * Implementation of hook_help().
  *
  * The code provided in this function is a demonstration of how to use jcarousel_add().
@@ -88,15 +94,23 @@ function flowplayer_add($selector = NULL, $config = NULL) {
   static $flowplayer_added = FALSE;
   static $flowplayer_selectors = array();
 
+  // Get path to flowplayer libraries.
+  $flowplayer_path = flowplayer_get_path();
+
+  if (!$flowplayer_path) {
+    watchdog('flowplayer', 'Flowplayer was not found. Please read the manual for mor instructions on how to set up flowplayer.', array(), WATCHDOG_ERROR);
+    return FALSE;
+  }  
+  
   // Add Flowplayer to the page if it hasn't been added yet.
   if ($flowplayer_added === FALSE) {
     // Add the FlowPlayer JavaScript and CSS to the page.
-    drupal_add_js(drupal_get_path('module', 'flowplayer') . '/flowplayer/example/flowplayer.min.js');
+    drupal_add_js(_flowplayer_get_js_path());
     drupal_add_css(drupal_get_path('module', 'flowplayer') . '/flowplayer.css');
 
     // Tell the JavaScript where flowplayer.swf is.
     $settings = array(
-      'flowplayerSwf' => drupal_get_path('module', 'flowplayer') . '/flowplayer/flowplayer.swf',
+      'flowplayerSwf' => _flowplayer_get_swf_path(),
     );
     drupal_add_js($settings, 'setting');
     $flowplayer_added = TRUE;
@@ -240,3 +254,65 @@ function theme_flowplayer($variables) {
   // Return the markup.
   return "<div id='$id' $attributes></div>";
 }
+
+/**
+ * Return the path to the Flowplayer plugins.
+ */
+function flowplayer_get_path() {
+  static $library_path = NULL;
+
+  // Try to locate the library path in any possible setup.
+  if ($library_path == NULL) {
+    // First check the default location.
+    $path = variable_get('flowplayer_path', FLOWPLAYER_PATH);
+    if (is_dir($path)) {
+      $library_path = $path;
+    }
+    // Ask the libraries module as a fallback.
+    elseif ($library_path == NULL && module_exists('libraries')) {
+      if ($path = libraries_get_path('flowplayer')) {
+        $library_path = $path;
+        variable_set('flowplayer_path', $library_path);
+      }
+    }
+    // If no path is found suggest the default one.
+    elseif ($library_path == NULL) {
+      $library_path = FLOWPLAYER_PATH;
+    }
+  }
+
+  return $library_path;
+}
+
+/**
+ * Get the path to the flowplayer-X.X.X-min.js file
+ * 
+ * @return 
+ */
+function _flowplayer_get_js_path(){
+  $library_path = flowplayer_get_path();
+  $files = glob($library_path."/example/flowplayer-*.min.js");
+  return isset($files[0])?$files[0]:false;
+}
+
+/**
+ * Get the path to the flowplayer-X.X.X.swf file
+ * 
+ * @return 
+ */
+function _flowplayer_get_swf_path(){
+  $library_path = flowplayer_get_path();
+  $files = glob($library_path."/flowplayer-*.swf");
+  return isset($files[0])?$files[0]:false;
+}
+
+/**
+ * Get the path to the flowplayer.controls-X.X.X.swf file
+ * 
+ * @return 
+ */
+function _flowplayer_get_controls_swf_path(){
+  $library_path = flowplayer_get_path();
+  $files = glob($library_path."/flowplayer.controls-*.swf");
+  return isset($files[0])?$files[0]:false;
+}
\ No newline at end of file
diff --git a/flowplayer/README.txt b/flowplayer/README.txt
deleted file mode 100644
index 05950ca..0000000
--- a/flowplayer/README.txt
+++ /dev/null
@@ -1,255 +0,0 @@
-Version history:
-
-3.1.5
------
-Fixes:
-- The player went to a locked state when resuming playback after a period that was long enought to send the
-netConnection to an invalid state. Now when resuming playback on an invalid connection the clip starts again from
-the beginning. This is only when using RTMP connections and does not affect progressive download playback.
-- Custom netConnect and netStream events did not pass the info object to JS listeners
-
-3.1.4
------
-Fixes:
-- player did not initialize if the controlbar plugin was disabled and if the play button overlay was disabled with play: null
-- works properly without cachebusting on IE
-- RSS playlist parsing now respects the isDefault attribute used in mRSS media group items
-- Fixed passing of connection arguments
-
-3.1.3
------
-- enhancements to RSS playlist parsing: Now skips all media:content that have unsupported types. Now the type attribute
-of the media:content element is mandatory and has to be present in the RSS file
-- Possibility to pass a RSS file name with playFeed("playlist.rss") and setPlaylist("playlist.rss") calls.
-- changes to the ConnectionProvider and URLResolver APIs
-- Now automatically uses a plugin that is called 'rtmp' for all clips that have the rtmp-protocol in their URLs.
-- Added possibility to specify all clip properties in an RSS playlist
-
-Fixes:
-- the result of URL resolvers in now cached, and the resolvers will not be used again when a clip is replayed
-- some style properties like 'backgroundGradient' had no effect in config
-- video goes tiny on Firefox: http://flowplayer.org/forum/8/23226
-- RSS playlists: The 'type' attribute value 'audio/mp3' in the media:content element caused an error.
-- Dispatches onMetadata() if an URL resolver changes the clip URL (changes to a different file)
-- error codes and error message were not properly passed to onEvent JS listeners
-
-3.1.2
------
-- The domain of the logo url must the same domain from where the player SWF is loaded from.
-- Fullscreen can be toggled by doublclick on the video area.
-Fixes:
-- Player was not initialized correctly when instream playlists were used and the provider used in the instream clips was defined in the common clip.
-- A separator in the Context Menu made the callbacks in the following menu items out of order. Related forum post: http://flowplayer.org/forum/8/22541
-- the width and height settings of a logo were ignored if the logo was a sWF file
-- volume control and mute/unmute were not working after an instream clip had been played
-- now possible to use RTMP for mp3 files
-- Issue 12: cuepointMultiplier was undefined in the clip object set to JS event listeners
-- Issue 14: onBeforeStop was unnecessarily fired when calling setPlaylist() and the player was not playing,
-            additionally onStop was never fired even if onBeforeStop was
-- fixed screen vertical placement problems that reappeared with 3.1.1
-- The rotating animation now has the same size and position as it has after initialized
-
-3.1.1
------
-- External configuration files
-- Instream playback
-- Added toggleFullscreen() the API
-- Possibility to specify controls configuration in clips
-- Seek target position is now sent in the onBeforeSeek event
-Fixes:
-- The screen size was initially too small on Firefox (Mac)
-- Did not persist a zero volume value: http://www.flowplayer.org/forum/8/18413
-
-3.1.0
------
-New features:
-- clip's can have urlResolvers and connectionProviders
-- Added new configuration options 'connectionCallbacks' and 'streamCallbacks'. Both accept an Array of event names as a value.
-  When these events get fired on the connection or stream object, corresponding Clip events will be fired by the player.
-  This can be used for example when firing custom events from RTMP server apps
-- Added new clip event types: 'onConnectionEvent' and 'onStreamEvent' these get fired when the predefined events happen on the connection and stream objects.
-- Added Security.allowDomain() to allow loaded plugins to script the player
-- Added addClip(clip, index) to the API, index is optional
-- Possibility to view videos without metadata, using clip.metaData: false
-- Now the player's preloader uses the rotating animation instead of a percent text to indicate the progress
-  of loading the player SWF. You can disable the aninamtion by setting buffering: false
-- calling close() now does not send the onStop event
-- Clip's custom properties are now present in the root of the clip argument in all clip events that are sent to JS.
-
-Bug fixes:
-- The preloader sometimes failed to initialize the player
-- Allow seeking while in buffering state: http://flowplayer.org/forum/8/16505
-- Replay of a RTMP stream was failing after the connection had expired
-- Security error when clicking on the screen if there is an image in the playlist loaded from a foreign domain
-- loadPlugin() was not working
-- now fullscreen works with Flash versions older than 9.0.115, in versions that do not support hardware scaling
-- replaying a RTMP stream with an image in front of the stream in the playlist was not working (video stayed hidden). Happened
-  because the server does not send metadata if replaying the same stream.
-- the scrubber is disabled if the clip is not seekable in the first frame: http://flowplayer.org/forum/8/16526
-  By default if the clip has one of following extensions (the typical flash video extensions) it is seekable
-  in the first frame: 'f4b', 'f4p', 'f4v', 'flv'. Added new clip property seekableOnBegin that can be used to override the default.  
-
-3.0.6
------
-- added possibility to associate a linkUrl and linkWindow to the canvas
-Fixes:
-- fix for entering fullscreen for Flash versions that don't support the hardware scaled fullscreen-mode
-- when showing images the duration tracking starts only after the image has been completely loaded: http://flowplayer.org/forum/2/15301
-- fix for verifying license keys for domains that have more than 4 labels in them
-- if plugin loading failis because of a IO error, the plugin will be discarded and the player initialization continues:
-
-3.0.4
------
-- The "play" pseudo-plugin now supports fadeIn(), fadeOut(), showPlugin(), hidePlugin() and
-  additionally you can configure it like this:
-  // make only the play button invisible (buffering animation is still used)
-  play: { display: 'none' }
-  // disable the play button and the buffering animation
-  play: null
-  // disable the buffering animation
-  buffering: null 
-- Added possibility to seek when in the buffering state: http://flowplayer.org/forum/3/13896
-- Added copyright notices and other GPL required entries to the user interface
-
-Fixes:
-- clip urls were not resolved correctly if the HTML page URL had a query string starting with a question mark (http://flowplayer.org/forum/8/14016#post-14016)
-- Fixed context menu for with IE (commercial version)
-- a cuepoint at time zero was fired several times
-- screen is now arranged correctly even when only bottom or top is defined for it in the configuration
-- Fixed context menu for with IE (commercial version)
-- a cuepoint at time zero was fired several times
-- screen is now arranged correctly even when only bottom or top is defined for it in the configuration
-- Now possible to call play() in an onError handler: http://flowplayer.org/forum/8/12939
-- Does not throw an error if the player cannot persist the volume on the client computer: http://flowplayer.org/forum/8/13286#post-13495
-- Triggering fullscreen does not pause the player in IE
-- The play button overlay no longer has a gap between it's pieces when a label is used: http://flowplayer.org/forum/8/14250
-- clip.update() JS call now resets the duration
-- a label configured for the play button overlay did not work in the commercial version
-
-3.0.3
------
-- fixed cuepoint firing: Does not skip cuepoints any more
-- Plugins can now be loaded from a different domain to the flowplayer.swf
-- Specifying a clip to play by just using the 'clip' node in the configuration was not working, a playlist definition was required. This is now fixed.
-- Fixed: A playlist with different providers caused the onMetadata event to fire events with metadata from the previous clip in the playlist. Occurred when moving in the playlist with next() and prev()
-- the opacity setting now works with the logo
-- fadeOut() call to the "screen" plugin was sending the listenerId and pluginName arguments in wrong order
-- stop(), pause(), resume(), close() no longer return the flowplayer object to JS
-- changing the size of the screen in a onFullscreen listener now always works, there was a bug that caused this to fail occasionally
-- fixed using arbitrary SWFs as plugins
-- the API method setPlaylist() no longer starts playing if autoPlay: true, neither it starts buffering if autoBuffering: true
-- the API method play() now accepts an array of clip objects as an argument, the playlist is replaced with the specified clips and playback starts from the 1st clip
-
-3.0.2
------
-- setting play: null now works again
-- pressing the play again button overlay does not open a linkUrl associated with a clip
-- now displays a live feed even when the RTMP server does not send any metadata and the onStart method is not therefore dispatched
-- added onMetaData clip event
-- fixed 'orig' scaling: the player went to 'fit' scaling after coming back from fullscreen. This is now fixed and the original dimensions are preserved in non-fullscreen mode.
-- cuepoint times are now given in milliseconds, the firing precision is 100 ms. All cuepoint times are rounded to the nearest 100 ms value (for example 1120 rounds to 1100) 
-- backgroundGradient was drawn over the background image in the canvas and in the content and controlbar plugins. Now it's drawn below the image.
-- added cuepointMultiplier property to clips. This can be used to multiply the time values read from cuepoint metadata embedded into video files.
-- the player's framerate was increased to 24 FPS, makes all animations smoother
-
-3.0.1
------
-- Fixed negative cuepoints from common clip. Now these are properly propagated to the clips in playlist.
-- buffering animation is now the same size as the play button overlay
-- commercial version now supports license keys that allows the use of subdomains
-- error messages are now automatically hidden after a 4 second delay. They are also hidden when a new clips
-  starts playing (when onBeforeBegin is fired)
-- added possibility to disable the buffering animation like so: buffering: false
-- pressing the play button overlay does not open a linkUrl associated with a clip
-- license key verification failed if a port number was used in the URL (like in this url: http://mydomain.com:8080/video.html)
-- added audio support, clip has a new "image" property
-- workaround for missing "NetStream.Play.Start" notfication that was happending with Red5. Because of this issue the video was not shown.
-- commercial version has the possibility to change the zIndex of the logo
-
-3.0.0
------
-- Removed security errors that happened when loading images from foreign domains (domains other than the domain of the core SWF).
-  Using a backgroundImage on canvas, in the content plugin, and for the controls is also possible to be loaded
-  from a foreign domain - BUT backgroundRepeat cannot be used for foreign images.
-- Now allows the embedding HTML to script the player even if the player is loaded from another domain.
-- Added a 'live' property to Clips, used for live streams.
-- A player embedded to a foreign domain now loads images, css files and other resources from the domain where the palyer SWF was loaded from. This is to generate shorter embed-codes.
-- Added linkUrl and linkWindow properties to the logo, in commercial version you can set these to point to a linked page. The linked page gets opened
-  when the logo is clicked.  Possible values for linkWindow:
-    * "_self" specifies the current frame in the current window.
-    * "_blank" specifies a new window.
-    * "_parent" specifies the parent of the current frame.
-    * "_top" specifies the top-level frame in the current window.
-- Added linkUrl and linkWindow properties to clips. The linked page is opened when the video are is clicked and the corresponding clip has a linkUrl specified.
-- Made the play button overlay and the "Play again" button slightly bigger.
-
-RC4
----
-- Now shows a "Play again" button at the end of the video/playlist
-- Commercial version shows a Flowplayer logo if invalidKey was supplied, but the otherwise the player works
-- setting play: null in configuration will disable the play button overlay
-- setting opacity for "play" also sets it for the buffering animation
-- Fixed firing of cuepoints too early. Cuepoint firing is now based on stream time and does not rely on timers
-- added onXMPData event listener
-- Should not stop playback too early before the clip is really completed
-- The START event is now delayed so that the metadata is available when the event is fired, METADATA event was removed,
-  new event BEGIN that is dispatched when the playback has been successfully started. Metadata is not normally
-  available when BEGIN is fired. 
-
-RC3
----
-- stopBuffering() now dispatches the onStop event first if the player is playing/paused/buffering at the time of calling it
-- fixed detection of images based on file extensions
-- fixed some issues with having images in the playlist
-- made it possible to autoBuffer next video while showing an image (image without a duration)
-
-RC2
----
-- fixed: setting the screen height in configuration did not have any effect
-
-RC1
------
-- better error message if plugin loading fails, shows the URL used
-- validates our redesigned multidomain license key correctly
-- fix to prevent the play button going visible when the onBufferEmpty event occurs
-- the commercial swf now correctly loads the controls using version information
-- fixed: the play button overlay became invisible with long fadeOutSpeeds
-
-beta6
------
-- removed the onFirstFramePause event
-- playing a clip for the second time caused a doubled sound
-- pausing on first frame did not work on some FLV files
-
-beta5
------
-- logo only uses percentage scaling if it's a SWF file (there is ".swf" in it's url)
-- context menu now correctly builds up from string entries in configuration
--always closes the previous connection before starting a new clip
-
-beta4
------
-- now it's possible to load a plugin into the panel without specifying any position/dimensions
- information, the plugin is placed to left: "50%", top: "50%" and using the plugin DisplayObject's width & height
-- The Flowplayer API was not fully initialized when onLoad was invoked on Flash plugins
-
-beta3
------
-- tweaking logo placement
-- "play" did not show up after repeated pause/resume
-- player now loads the latest controls SWF version, right now the latest SWF is called 'flowplayer.controls-3.0.0-beta2.swf'
-
-beta2
------
-- fixed support for RTMP stream groups
-- changed to loop through available fonts in order to find a suitable font also in IE
-- Preloader was broken on IE: When the player SWf was in browser's cache it did not initialize properly
-- Context menu now correctly handles menu items that are configured by their string labels only (not using json objects)
-- fixed custom logo positioning (was moved to the left edge of screen in fullscreen)
-- "play" now always follows the position and size of the screen
-- video was stretched below the controls in fullscreen when autoHide: 'never'
-- logo now takes 6.5% of the screen height, width is scaled so that the aspect ratio is preserved
-
-beta1
------
-- First public beta release
diff --git a/flowplayer/example/flowplayer.min.js b/flowplayer/example/flowplayer.min.js
deleted file mode 100644
index e8fa742..0000000
--- a/flowplayer/example/flowplayer.min.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/* 
- * flowplayer.js 3.1.4. The Flowplayer API
- * 
- * Copyright 2009 Flowplayer Oy
- * 
- * This file is part of Flowplayer.
- * 
- * Flowplayer is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * 
- * Flowplayer is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with Flowplayer.  If not, see <http://www.gnu.org/licenses/>.
- * 
- * Date: 2009-02-25 21:24:29 +0000 (Wed, 25 Feb 2009)
- * Revision: 166 
- */
-(function(){function g(o){console.log("$f.fireEvent",[].slice.call(o))}function k(q){if(!q||typeof q!="object"){return q}var o=new q.constructor();for(var p in q){if(q.hasOwnProperty(p)){o[p]=k(q[p])}}return o}function m(t,q){if(!t){return}var o,p=0,r=t.length;if(r===undefined){for(o in t){if(q.call(t[o],o,t[o])===false){break}}}else{for(var s=t[0];p<r&&q.call(s,p,s)!==false;s=t[++p]){}}return t}function c(o){return document.getElementById(o)}function i(q,p,o){if(typeof p!="object"){return q}if(q&&p){m(p,function(r,s){if(!o||typeof s!="function"){q[r]=s}})}return q}function n(s){var q=s.indexOf(".");if(q!=-1){var p=s.substring(0,q)||"*";var o=s.substring(q+1,s.length);var r=[];m(document.getElementsByTagName(p),function(){if(this.className&&this.className.indexOf(o)!=-1){r.push(this)}});return r}}function f(o){o=o||window.event;if(o.preventDefault){o.stopPropagation();o.preventDefault()}else{o.returnValue=false;o.cancelBubble=true}return false}function j(q,o,p){q[o]=q[o]||[];q[o].push(p)}function e(){return"_"+(""+Math.random()).substring(2,10)}var h=function(t,r,s){var q=this;var p={};var u={};q.index=r;if(typeof t=="string"){t={url:t}}i(this,t,true);m(("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop").split(","),function(){var v="on"+this;if(v.indexOf("*")!=-1){v=v.substring(0,v.length-1);var w="onBefore"+v.substring(2);q[w]=function(x){j(u,w,x);return q}}q[v]=function(x){j(u,v,x);return q};if(r==-1){if(q[w]){s[w]=q[w]}if(q[v]){s[v]=q[v]}}});i(this,{onCuepoint:function(x,w){if(arguments.length==1){p.embedded=[null,x];return q}if(typeof x=="number"){x=[x]}var v=e();p[v]=[x,w];if(s.isLoaded()){s._api().fp_addCuepoints(x,r,v)}return q},update:function(w){i(q,w);if(s.isLoaded()){s._api().fp_updateClip(w,r)}var v=s.getConfig();var x=(r==-1)?v.clip:v.playlist[r];i(x,w,true)},_fireEvent:function(v,y,w,A){if(v=="onLoad"){m(p,function(B,C){if(C[0]){s._api().fp_addCuepoints(C[0],r,B)}});return false}A=A||q;if(v=="onCuepoint"){var z=p[y];if(z){return z[1].call(s,A,w)}}if(y&&"onBeforeBegin,onMetaData,onStart,onUpdate,onResume".indexOf(v)!=-1){i(A,y);if(y.metaData){if(!A.duration){A.duration=y.metaData.duration}else{A.fullDuration=y.metaData.duration}}}var x=true;m(u[v],function(){x=this.call(s,A,y,w)});return x}});if(t.onCuepoint){var o=t.onCuepoint;q.onCuepoint.apply(q,typeof o=="function"?[o]:o);delete t.onCuepoint}m(t,function(v,w){if(typeof w=="function"){j(u,v,w);delete t[v]}});if(r==-1){s.onCuepoint=this.onCuepoint}};var l=function(p,r,q,t){var s={};var o=this;var u=false;if(t){i(s,t)}m(r,function(v,w){if(typeof w=="function"){s[v]=w;delete r[v]}});i(this,{animate:function(y,z,x){if(!y){return o}if(typeof z=="function"){x=z;z=500}if(typeof y=="string"){var w=y;y={};y[w]=z;z=500}if(x){var v=e();s[v]=x}if(z===undefined){z=500}r=q._api().fp_animate(p,y,z,v);return o},css:function(w,x){if(x!==undefined){var v={};v[w]=x;w=v}r=q._api().fp_css(p,w);i(o,r);return o},show:function(){this.display="block";q._api().fp_showPlugin(p);return o},hide:function(){this.display="none";q._api().fp_hidePlugin(p);return o},toggle:function(){this.display=q._api().fp_togglePlugin(p);return o},fadeTo:function(y,x,w){if(typeof x=="function"){w=x;x=500}if(w){var v=e();s[v]=w}this.display=q._api().fp_fadeTo(p,y,x,v);this.opacity=y;return o},fadeIn:function(w,v){return o.fadeTo(1,w,v)},fadeOut:function(w,v){return o.fadeTo(0,w,v)},getName:function(){return p},getPlayer:function(){return q},_fireEvent:function(w,v,x){if(w=="onUpdate"){var y=q._api().fp_getPlugin(p);if(!y){return}i(o,y);delete o.methods;if(!u){m(y.methods,function(){var A=""+this;o[A]=function(){var B=[].slice.call(arguments);var C=q._api().fp_invoke(p,A,B);return C==="undefined"||C===undefined?o:C}});u=true}}var z=s[w];if(z){z.apply(o,v);if(w.substring(0,1)=="_"){delete s[w]}}}})};function b(o,t,z){var E=this,y=null,x,u,p=[],s={},B={},r,v,w,D,A,q;i(E,{id:function(){return r},isLoaded:function(){return(y!==null)},getParent:function(){return o},hide:function(F){if(F){o.style.height="0px"}if(y){y.style.height="0px"}return E},show:function(){o.style.height=q+"px";if(y){y.style.height=A+"px"}return E},isHidden:function(){return y&&parseInt(y.style.height,10)===0},load:function(F){if(!y&&E._fireEvent("onBeforeLoad")!==false){m(a,function(){this.unload()});x=o.innerHTML;if(x&&!flashembed.isSupported(t.version)){o.innerHTML=""}flashembed(o,t,{config:z});if(F){F.cached=true;j(B,"onLoad",F)}}return E},unload:function(){if(x.replace(/\s/g,"")!==""){if(E._fireEvent("onBeforeUnload")===false){return E}try{if(y){y.fp_close();E._fireEvent("onUnload")}}catch(F){}y=null;o.innerHTML=x}return E},getClip:function(F){if(F===undefined){F=D}return p[F]},getCommonClip:function(){return u},getPlaylist:function(){return p},getPlugin:function(F){var H=s[F];if(!H&&E.isLoaded()){var G=E._api().fp_getPlugin(F);if(G){H=new l(F,G,E);s[F]=H}}return H},getScreen:function(){return E.getPlugin("screen")},getControls:function(){return E.getPlugin("controls")},getConfig:function(F){return F?k(z):z},getFlashParams:function(){return t},loadPlugin:function(I,H,K,J){if(typeof K=="function"){J=K;K={}}var G=J?e():"_";E._api().fp_loadPlugin(I,H,K,G);var F={};F[G]=J;var L=new l(I,null,E,F);s[I]=L;return L},getState:function(){return y?y.fp_getState():-1},play:function(G,F){function H(){if(G!==undefined){E._api().fp_play(G,F)}else{E._api().fp_play()}}if(y){H()}else{E.load(function(){H()})}return E},getVersion:function(){var G="flowplayer.js 3.1.4";if(y){var F=y.fp_getVersion();F.push(G);return F}return G},_api:function(){if(!y){throw"Flowplayer "+E.id()+" not loaded when calling an API method"}return y},setClip:function(F){E.setPlaylist([F]);return E},getIndex:function(){return w}});m(("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error,MouseOver,MouseOut").split(","),function(){var F="on"+this;if(F.indexOf("*")!=-1){F=F.substring(0,F.length-1);var G="onBefore"+F.substring(2);E[G]=function(H){j(B,G,H);return E}}E[F]=function(H){j(B,F,H);return E}});m(("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip,playFeed").split(","),function(){var F=this;E[F]=function(H,G){if(!y){return E}var I=null;if(H!==undefined&&G!==undefined){I=y["fp_"+F](H,G)}else{I=(H===undefined)?y["fp_"+F]():y["fp_"+F](H)}return I==="undefined"||I===undefined?E:I}});E._fireEvent=function(O){if(typeof O=="string"){O=[O]}var P=O[0],M=O[1],K=O[2],J=O[3],I=0;if(z.debug){g(O)}if(!y&&P=="onLoad"&&M=="player"){y=y||c(v);A=y.clientHeight;m(p,function(){this._fireEvent("onLoad")});m(s,function(Q,R){R._fireEvent("onUpdate")});u._fireEvent("onLoad")}if(P=="onLoad"&&M!="player"){return}if(P=="onError"){if(typeof M=="string"||(typeof M=="number"&&typeof K=="number")){M=K;K=J}}if(P=="onContextMenu"){m(z.contextMenu[M],function(Q,R){R.call(E)});return}if(P=="onPluginEvent"){var F=M.name||M;var G=s[F];if(G){G._fireEvent("onUpdate",M);G._fireEvent(K,O.slice(3))}return}if(P=="onPlaylistReplace"){p=[];var L=0;m(M,function(){p.push(new h(this,L++,E))})}if(P=="onClipAdd"){if(M.isInStream){return}M=new h(M,K,E);p.splice(K,0,M);for(I=K+1;I<p.length;I++){p[I].index++}}var N=true;if(typeof M=="number"&&M<p.length){D=M;var H=p[M];if(H){N=H._fireEvent(P,K,J)}if(!H||N!==false){N=u._fireEvent(P,K,J,H)}}m(B[P],function(){N=this.call(E,M,K);if(this.cached){B[P].splice(I,1)}if(N===false){return false}I++});return N};function C(){if($f(o)){$f(o).getParent().innerHTML="";w=$f(o).getIndex();a[w]=E}else{a.push(E);w=a.length-1}q=parseInt(o.style.height,10)||o.clientHeight;if(typeof t=="string"){t={src:t}}r=o.id||"fp"+e();v=t.id||r+"_api";t.id=v;z.playerId=r;if(typeof z=="string"){z={clip:{url:z}}}if(typeof z.clip=="string"){z.clip={url:z.clip}}z.clip=z.clip||{};if(o.getAttribute("href",2)&&!z.clip.url){z.clip.url=o.getAttribute("href",2)}u=new h(z.clip,-1,E);z.playlist=z.playlist||[z.clip];var F=0;m(z.playlist,function(){var H=this;if(typeof H=="object"&&H.length){H={url:""+H}}m(z.clip,function(I,J){if(J!==undefined&&H[I]===undefined&&typeof J!="function"){H[I]=J}});z.playlist[F]=H;H=new h(H,F,E);p.push(H);F++});m(z,function(H,I){if(typeof I=="function"){if(u[H]){u[H](I)}else{j(B,H,I)}delete z[H]}});m(z.plugins,function(H,I){if(I){s[H]=new l(H,I,E)}});if(!z.plugins||z.plugins.controls===undefined){s.controls=new l("controls",null,E)}s.canvas=new l("canvas",null,E);t.bgcolor=t.bgcolor||"#000000";t.version=t.version||[9,0];t.expressInstall="http://www.flowplayer.org/swf/expressinstall.swf";function G(H){if(!E.isLoaded()&&E._fireEvent("onBeforeClick")!==false){E.load()}return f(H)}x=o.innerHTML;if(x.replace(/\s/g,"")!==""){if(o.addEventListener){o.addEventListener("click",G,false)}else{if(o.attachEvent){o.attachEvent("onclick",G)}}}else{if(o.addEventListener){o.addEventListener("click",f,false)}E.load()}}if(typeof o=="string"){flashembed.domReady(function(){var F=c(o);if(!F){throw"Flowplayer cannot access element: "+o}else{o=F;C()}})}else{C()}}var a=[];function d(o){this.length=o.length;this.each=function(p){m(o,p)};this.size=function(){return o.length}}window.flowplayer=window.$f=function(){var p=null;var o=arguments[0];if(!arguments.length){m(a,function(){if(this.isLoaded()){p=this;return false}});return p||a[0]}if(arguments.length==1){if(typeof o=="number"){return a[o]}else{if(o=="*"){return new d(a)}m(a,function(){if(this.id()==o.id||this.id()==o||this.getParent()==o){p=this;return false}});return p}}if(arguments.length>1){var r=arguments[1];var q=(arguments.length==3)?arguments[2]:{};if(typeof o=="string"){if(o.indexOf(".")!=-1){var t=[];m(n(o),function(){t.push(new b(this,k(r),k(q)))});return new d(t)}else{var s=c(o);return new b(s!==null?s:o,r,q)}}else{if(o){return new b(o,r,q)}}}return null};i(window.$f,{fireEvent:function(){var o=[].slice.call(arguments);var q=$f(o[0]);return q?q._fireEvent(o.slice(1)):null},addPlugin:function(o,p){b.prototype[o]=p;return $f},each:m,extend:i});if(typeof jQuery=="function"){jQuery.prototype.flowplayer=function(q,p){if(!arguments.length||typeof arguments[0]=="number"){var o=[];this.each(function(){var r=$f(this);if(r){o.push(r)}});return arguments.length?o[arguments[0]]:new d(o)}return this.each(function(){$f(this,k(q),p?k(p):{})})}}})();(function(){var e=typeof jQuery=="function";var i={width:"100%",height:"100%",allowfullscreen:true,allowscriptaccess:"always",quality:"high",version:null,onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(e){jQuery.tools=jQuery.tools||{};jQuery.tools.flashembed={version:"1.0.4",conf:i}}function j(){if(c.done){return false}var l=document;if(l&&l.getElementsByTagName&&l.getElementById&&l.body){clearInterval(c.timer);c.timer=null;for(var k=0;k<c.ready.length;k++){c.ready[k].call()}c.ready=null;c.done=true}}var c=e?jQuery:function(k){if(c.done){return k()}if(c.timer){c.ready.push(k)}else{c.ready=[k];c.timer=setInterval(j,13)}};function f(l,k){if(k){for(key in k){if(k.hasOwnProperty(key)){l[key]=k[key]}}}return l}function g(k){switch(h(k)){case"string":k=k.replace(new RegExp('(["\\\\])',"g"),"\\$1");k=k.replace(/^\s?(\d+)%/,"$1pct");return'"'+k+'"';case"array":return"["+b(k,function(n){return g(n)}).join(",")+"]";case"function":return'"function()"';case"object":var l=[];for(var m in k){if(k.hasOwnProperty(m)){l.push('"'+m+'":'+g(k[m]))}}return"{"+l.join(",")+"}"}return String(k).replace(/\s/g," ").replace(/\'/g,'"')}function h(l){if(l===null||l===undefined){return false}var k=typeof l;return(k=="object"&&l.push)?"array":k}if(window.attachEvent){window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function b(k,n){var m=[];for(var l in k){if(k.hasOwnProperty(l)){m[l]=n(k[l])}}return m}function a(r,t){var q=f({},r);var s=document.all;var n='<object width="'+q.width+'" height="'+q.height+'"';if(s&&!q.id){q.id="_"+(""+Math.random()).substring(9)}if(q.id){n+=' id="'+q.id+'"'}if(q.cachebusting){q.src+=((q.src.indexOf("?")!=-1?"&":"?")+Math.random())}if(q.w3c||!s){n+=' data="'+q.src+'" type="application/x-shockwave-flash"'}else{n+=' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'}n+=">";if(q.w3c||s){n+='<param name="movie" value="'+q.src+'" />'}q.width=q.height=q.id=q.w3c=q.src=null;for(var l in q){if(q[l]!==null){n+='<param name="'+l+'" value="'+q[l]+'" />'}}var o="";if(t){for(var m in t){if(t[m]!==null){o+=m+"="+(typeof t[m]=="object"?g(t[m]):t[m])+"&"}}o=o.substring(0,o.length-1);n+='<param name="flashvars" value=\''+o+"' />"}n+="</object>";return n}function d(m,p,l){var k=flashembed.getVersion();f(this,{getContainer:function(){return m},getConf:function(){return p},getVersion:function(){return k},getFlashvars:function(){return l},getApi:function(){return m.firstChild},getHTML:function(){return a(p,l)}});var q=p.version;var r=p.expressInstall;var o=!q||flashembed.isSupported(q);if(o){p.onFail=p.version=p.expressInstall=null;m.innerHTML=a(p,l)}else{if(q&&r&&flashembed.isSupported([6,65])){f(p,{src:r});l={MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title};m.innerHTML=a(p,l)}else{if(m.innerHTML.replace(/\s/g,"")!==""){}else{m.innerHTML="<h2>Flash version "+q+" or greater is required</h2><h3>"+(k[0]>0?"Your version is "+k:"You have no flash plugin installed")+"</h3>"+(m.tagName=="A"?"<p>Click here to download latest version</p>":"<p>Download latest version from <a href='http://www.adobe.com/go/getflashplayer'>here</a></p>");if(m.tagName=="A"){m.onclick=function(){location.href="http://www.adobe.com/go/getflashplayer"}}}}}if(!o&&p.onFail){var n=p.onFail.call(this);if(typeof n=="string"){m.innerHTML=n}}if(document.all){window[p.id]=document.getElementById(p.id)}}window.flashembed=function(l,m,k){if(typeof l=="string"){var n=document.getElementById(l);if(n){l=n}else{c(function(){flashembed(l,m,k)});return}}if(!l){return}if(typeof m=="string"){m={src:m}}var o=f({},i);f(o,m);return new d(l,o,k)};f(window.flashembed,{getVersion:function(){var m=[0,0];if(navigator.plugins&&typeof navigator.plugins["Shockwave Flash"]=="object"){var l=navigator.plugins["Shockwave Flash"].description;if(typeof l!="undefined"){l=l.replace(/^.*\s+(\S+\s+\S+$)/,"$1");var n=parseInt(l.replace(/^(.*)\..*$/,"$1"),10);var r=/r/.test(l)?parseInt(l.replace(/^.*r(.*)$/,"$1"),10):0;m=[n,r]}}else{if(window.ActiveXObject){try{var p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7")}catch(q){try{p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");m=[6,0];p.AllowScriptAccess="always"}catch(k){if(m[0]==6){return m}}try{p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash")}catch(o){}}if(typeof p=="object"){l=p.GetVariable("$version");if(typeof l!="undefined"){l=l.replace(/^\S+\s+(.*)$/,"$1").split(",");m=[parseInt(l[0],10),parseInt(l[2],10)]}}}}return m},isSupported:function(k){var m=flashembed.getVersion();var l=(m[0]>k[0])||(m[0]==k[0]&&m[1]>=k[1]);return l},domReady:c,asString:g,getHTML:a});if(e){jQuery.fn.flashembed=function(l,k){var m=null;this.each(function(){m=flashembed(this,l,k)});return l.api===false?this:m}}})();
\ No newline at end of file
diff --git a/flowplayer/example/index.html b/flowplayer/example/index.html
deleted file mode 100644
index fcd5ad3..0000000
--- a/flowplayer/example/index.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<html><head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-<!-- A minimal Flowplayer setup to get you started -->
-  
-
-	<!-- 
-		include flowplayer JavaScript file that does  
-		Flash embedding and provides the Flowplayer API.
-	-->
-	<script type="text/javascript" src="flowplayer.min.js"></script>
-	
-	<!-- some minimal styling, can be removed -->
-	<link rel="stylesheet" type="text/css" href="style.css">
-	
-	<!-- page title -->
-	<title>Minimal Flowplayer setup</title>
-
-</head><body>
-
-	<div id="page">
-		
-		<h1>Minimal Flowplayer setup</h1>
-	
-		<p>View commented source code to get familiar with Flowplayer installation.</p>
-		
-		<!-- this A tag is where your Flowplayer will be placed. it can be anywhere -->
-		<a  
-			 href="http://e1h13.simplecdn.net/flowplayer/flowplayer.flv"  
-			 style="display:block;width:520px;height:330px"  
-			 id="player"> 
-		</a> 
-	
-		<!-- this will install flowplayer inside previous A- tag. -->
-		<script>
-			flowplayer("player", "../flowplayer.swf");
-		</script>
-	
-		
-		
-		<!-- 
-			after this line is purely informational stuff. 
-			does not affect on Flowplayer functionality 
-		-->
-
-		<p>		
-			If you are running these examples <strong>locally</strong> and not on some webserver you must edit your 
-			<a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html">
-				Flash security settings</a>. 
-		</p>
-		
-		<p class="less">
-			Select "Edit locations" &gt; "Add location" &gt; "Browse for files" and select
-			flowplayer-x.x.x.swf you just downloaded.
-		</p>
-		
-		
-		<h2>Documentation</h2>
-		
-		<p>
-			<a href="http://flowplayer.org/documentation/installation/index.html">Flowplayer installation</a>
-		</p>
-
-		<p>
-			<a href="http://flowplayer.org/documentation/configuration/index.html">Flowplayer configuration</a>
-		</p>
-
-		<p>
-			See this identical page on <a href="http://flowplayer.org/demos/example/index.htm">Flowplayer website</a> 
-		</p>
-		
-	</div>
-	
-	
-</body></html>
diff --git a/flowplayer/example/style.css b/flowplayer/example/style.css
deleted file mode 100644
index 98f090c..0000000
--- a/flowplayer/example/style.css
+++ /dev/null
@@ -1,41 +0,0 @@
-
-body {
-	background-color:#fff;	
-	font-family:"Lucida Grande","bitstream vera sans","trebuchet ms",verdana,arial;
-	text-align:center;
-}
-
-#page {
-	background-color:#efefef;
-	width:600px;
-	margin:50px auto;
-	padding:20px 150px 20px 50px;
-	min-height:600px;
-	border:2px solid #fff;
-	outline:1px solid #ccc;
-	text-align:left;
-}
-
-h1, h2 {
-	letter-spacing:-1px;
-	color:#2D5AC3;
-	font-weight:normal;		
-	margin-bottom:-10px;
-}
-
-h1 {
-	font-size:22px;
-}
-
-h2 {
-	font-size:18px;
-}
-
-.less {
-	color:#999;
-	font-size:12px;
-}
-
-a {
-	color:#295c72;		
-}
diff --git a/flowplayer/flowplayer.audio.swf b/flowplayer/flowplayer.audio.swf
deleted file mode 100644
index cdf93c7..0000000
Binary files a/flowplayer/flowplayer.audio.swf and /dev/null differ
diff --git a/flowplayer/flowplayer.captions.swf b/flowplayer/flowplayer.captions.swf
deleted file mode 100644
index dba09e9..0000000
Binary files a/flowplayer/flowplayer.captions.swf and /dev/null differ
diff --git a/flowplayer/flowplayer.controls.swf b/flowplayer/flowplayer.controls.swf
deleted file mode 100644
index aacdcd3..0000000
Binary files a/flowplayer/flowplayer.controls.swf and /dev/null differ
diff --git a/flowplayer/flowplayer.rtmp.swf b/flowplayer/flowplayer.rtmp.swf
deleted file mode 100644
index 7675184..0000000
Binary files a/flowplayer/flowplayer.rtmp.swf and /dev/null differ
diff --git a/flowplayer/flowplayer.swf b/flowplayer/flowplayer.swf
deleted file mode 100644
index 63f3934..0000000
Binary files a/flowplayer/flowplayer.swf and /dev/null differ
