(function() {
  var Bar, FlashMediaPlayer, HtmlMediaPlayer, MediaPlayer, MediaPlayerControls, MediaPlayerFactory, MediaSource, Plugin, Scrubber, Util, VolumeControl, i;
  var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
    for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
    function ctor() { this.constructor = child; }
    ctor.prototype = parent.prototype;
    child.prototype = new ctor;
    child.__super__ = parent.prototype;
    return child;
  }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
  if (!Function.prototype.bind) {
    Function.prototype.bind = function(context) {
      return jQuery.proxy(this, context);
    };
  }
  if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(text) {
      return this.indexOf(text) === 0;
    };
  }
  if (window.jQuery) {
    $.fn.mediaPlayer = function(options) {
      this.each(function() {
        return MediaPlayerFactory.create(this, options || {});
      });
      return this;
    };
  }
  MediaPlayerFactory = {
    create: function(element, options) {
      var browserCanPlayVideo, flash, player, videoEl;
      videoEl = document.createElement('video');
      browserCanPlayVideo = !!videoEl.canPlayType && (videoEl.canPlayType('video/mp4') || videoEl.canPlayType('video/webm'));
      if (browserCanPlayVideo) {
        player = new HtmlMediaPlayer(element, options);
      } else {
        flash = new Plugin('flash');
        $(element).addClass('fallback');
        if (flash.isInstalled || flash.version.major < 10) {
          $(element).addClass('fallback');
          player = new FlashMediaPlayer(element, options);
        }
      }
      $(element).data('controller', player);
      return player;
    }
  };
  Util = {
    getRelativePosition: function(x, relativeElement) {
      return Math.max(0, Math.min(1, (x - this.findPosX(relativeElement)) / relativeElement.offsetWidth));
    },
    findPosX: function(element) {
      var curleft;
      curleft = element.offsetLeft;
      while ((element = element.offsetParent)) {
        curleft += element.offsetLeft;
      }
      return curleft;
    },
    blockTextSelection: function() {
      document.body.focus();
      return document.onselectstart = function() {
        return false;
      };
    },
    unblockTextSelection: function() {
      return document.onselectstart = function() {
        return true;
      };
    }
  };
  MediaSource = (function() {
    function MediaSource(model) {
      this.url = model.url;
      this.type = this.type;
    }
    MediaSource.prototype.isPlayableBy = function(player) {
      return player.canPlayType(this.type);
    };
    MediaSource.prototype.toElement = function() {
      return $('<source />', {
        src: this.url,
        type: this.type
      });
    };
    return MediaSource;
  })();
  window.MediaSource = MediaSource;
  i = 0;
  MediaPlayer = (function() {
    function MediaPlayer(element, options) {
      var s, source, _i, _len, _ref;
      this.options = options;
      this.element = $(element);
      this.index = i++;
      this.status = 'uninitialized';
      this.initialized = false;
      this.autoPlay = false;
      this.duration = 0;
      this.currentTime = 0;
      this.bufferedTime = 0;
      this.volume = localStorage.volume || 0.8;
      this.paused = true;
      this.ended = false;
      this.fullscreen = false;
      this.width = this.element.width();
      this.height = this.element.height();
      this.overlay = this.element.find('.overlay');
      this.controls = new MediaPlayerControls(this);
      this.justScrubbed = false;
      this.sources = [];
      _ref = this.element.find('source');
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        s = _ref[_i];
        source = new MediaSource({
          url: s.getAttribute('src'),
          type: s.getAttribute('type')
        });
        this.sources.push(source);
      }
    }
    MediaPlayer.prototype.setPoster = function(poster) {
      return this.element.find('.poster').css('backgroundImage', 'url(' + poster.url + ')');
    };
    MediaPlayer.prototype.setSources = function(sources) {
      return this.sources = sources;
    };
    MediaPlayer.prototype.reset = function() {
      this.currentTime = 0;
      this.bufferedTime = 0;
      this.duration = 0;
      this.paused = true;
      this.justScrubbed = false;
      this.element.removeClass('played playing paused').addClass('waiting');
      this.overlay.stop().removeClass('played paused ended muted').css('opacity', 1);
      return this.controls.reset();
    };
    MediaPlayer.prototype.onPlay = function() {
      this.status = 'playing';
      this.paused = false;
      this.ended = false;
      this.element.removeClass('paused ended').addClass('played playing');
      return this.element.trigger('play');
    };
    MediaPlayer.prototype.onPause = function() {
      this.paused = true;
      this.status = 'paused';
      this.element.removeClass('playing').addClass('paused');
      return this.element.trigger('pause');
    };
    MediaPlayer.prototype.onEnded = function() {
      this.status = 'ended';
      this.ended = true;
      this.paused = true;
      this.element.removeClass('playing').addClass('ended');
      this.overlay.removeClass('played paused muted').addClass('ended').css('opacity', 1);
      return this.element.trigger('ended');
    };
    MediaPlayer.prototype.onDurationChange = function(duration) {
      this.initialized = true;
      this.duration = duration;
      return this.element.trigger('durationChange', duration);
    };
    MediaPlayer.prototype.onTimeUpdate = function(timeInSeconds) {
      this.element.removeClass('waiting');
      this.currentTime = timeInSeconds;
      return this.element.trigger('timeUpdate', timeInSeconds);
    };
    MediaPlayer.prototype.onBufferedTimeChange = function(bufferedTime) {
      this.bufferedTime = bufferedTime;
      return this.element.trigger('bufferedTimeChange', bufferedTime);
    };
    MediaPlayer.prototype.onVolumeChange = function(volume) {
      this.volume = volume;
      localStorage.volume = volume;
      if (volume > 0) {
        this.element.removeClass('muted');
        this.element.find('.volume').removeClass('muted');
        this.muted = false;
      }
      return this.element.trigger('volumeChange', volume);
    };
    MediaPlayer.prototype.onError = function(error) {
      return this.element.trigger('error', error);
    };
    MediaPlayer.prototype.onSeeking = function() {
      this.element.addClass('waiting');
      return this.element.trigger('seeking');
    };
    MediaPlayer.prototype.onSeeked = function() {
      this.element.removeClass('waiting');
      return this.element.trigger('seeked');
    };
    MediaPlayer.prototype.onWaiting = function() {
      this.status = 'waiting';
      return this.element.trigger('waiting');
    };
    MediaPlayer.prototype.onMuted = function() {
      this.muted = true;
      this.element.trigger('muted');
      this.element.addClass('muted');
      return this.element.find('.volume').addClass('muted');
    };
    MediaPlayer.prototype.onUnmuted = function() {
      this.muted = false;
      return this.element.removeClass('muted');
    };
    return MediaPlayer;
  })();
  HtmlMediaPlayer = (function() {
    __extends(HtmlMediaPlayer, MediaPlayer);
    function HtmlMediaPlayer(element, options) {
      this.head = $(element).find('video')[0];
      this.head.controls = false;
      this.supportsFullscreen = navigator.userAgent.indexOf('Chrome') === -1 && typeof this.head.webkitSupportsFullscreen !== 'undefined';
      HtmlMediaPlayer.__super__.constructor.call(this, element, options);
      $(this.head).bind({
        'loadeddata': this.onLoadedData.bind(this),
        'loadedmetadata': this.onLoadedMetadata.bind(this),
        'ended': this.onEnded.bind(this),
        'durationchange': this.onDurationChange.bind(this),
        'timeupdate': this.onTimeUpdate.bind(this),
        'volumechange': this.onVolumeChange.bind(this),
        'progress': this.onProgress.bind(this),
        'seeking': this.onSeeking.bind(this),
        'seeked': this.onSeeked.bind(this),
        'waiting': this.onWaiting.bind(this),
        'error': this.onError.bind(this)
      });
    }
    HtmlMediaPlayer.prototype.canPlay = function(type) {
      return this.head.canPlayType(type);
    };
    HtmlMediaPlayer.prototype.play = function() {
      this.head.play();
      return this.onPlay();
    };
    HtmlMediaPlayer.prototype.pause = function() {
      this.head.pause();
      return this.onPause();
    };
    HtmlMediaPlayer.prototype.seek = function(timeInSeconds) {
      if (this.initialized) {
        return this.head.currentTime = timeInSeconds;
      }
    };
    HtmlMediaPlayer.prototype.setVolume = function(volume) {
      return this.head.volume = volume;
    };
    HtmlMediaPlayer.prototype.setSources = function(sources) {
      HtmlMediaPlayer.__super__.setSources.call(this, sources);
      $(this.head).children('source').remove();
      this.sources.forEach(__bind(function(source) {
        return source.toElement().appendTo(this.head);
      }, this));
      return this.reload();
    };
    HtmlMediaPlayer.prototype.reload = function() {
      if (!this.paused) {
        this.pause();
      }
      this.reset();
      return this.head.load();
    };
    HtmlMediaPlayer.prototype.enterFullscreen = function() {
      this.fullscreen = true;
      return this.head.webkitEnterFullScreen();
    };
    HtmlMediaPlayer.prototype.leaveFullscreen = function() {
      return this.fullscreen = false;
    };
    HtmlMediaPlayer.prototype.onProgress = function(e) {
      var buffered, bufferedTime;
      buffered = this.head.buffered;
      if (!(buffered && buffered.length >= 1)) {
        return;
      }
      bufferedTime = buffered.end(0);
      return this.onBufferedTimeChange(bufferedTime);
    };
    HtmlMediaPlayer.prototype.onPlay = function(e) {
      return HtmlMediaPlayer.__super__.onPlay.call(this);
    };
    HtmlMediaPlayer.prototype.onPause = function(e) {
      return HtmlMediaPlayer.__super__.onPause.call(this);
    };
    HtmlMediaPlayer.prototype.onVolumeChange = function(e) {
      return HtmlMediaPlayer.__super__.onVolumeChange.call(this, e.target.volume);
    };
    HtmlMediaPlayer.prototype.onTimeUpdate = function(e) {
      return HtmlMediaPlayer.__super__.onTimeUpdate.call(this, e.target.currentTime);
    };
    HtmlMediaPlayer.prototype.onDurationChange = function(e) {
      return HtmlMediaPlayer.__super__.onDurationChange.call(this, e.target.duration);
    };
    HtmlMediaPlayer.prototype.onLoadedData = function() {};
    HtmlMediaPlayer.prototype.onLoadedMetadata = function() {};
    return HtmlMediaPlayer;
  })();
  FlashMediaPlayer = (function() {
    __extends(FlashMediaPlayer, MediaPlayer);
    function FlashMediaPlayer(element, options) {
      FlashMediaPlayer.__super__.constructor.call(this, element, options);
      this.pluginPlaceholder = this.element.find('.fallback');
      this.movieName = 'player_1';
      this.element.find('video').remove();
      window.player = this;
      this.pluginPlaceholder.html(this.getPluginHTML());
      this.plugin = document.getElementById(this.movieName);
    }
    FlashMediaPlayer.prototype.play = function() {
      this.callFlash('_play');
      return this.onPlay();
    };
    FlashMediaPlayer.prototype.pause = function() {
      this.callFlash('_pause');
      return this.onPause();
    };
    FlashMediaPlayer.prototype.reload = function() {
      this.reset();
      return this.callFlash('_loadUrl', this.sources[0].url);
    };
    FlashMediaPlayer.prototype.setVolume = function(volume) {
      return this.callFlash('_setVolume', volume);
    };
    FlashMediaPlayer.prototype.seek = function(time) {
      this.callFlash('_seek', time);
      return {
        setSources: function(sources) {
          setSources.__super__.constructor.call(this, sources);
          return this.reload();
        }
      };
    };
    FlashMediaPlayer.prototype.callFlash = function(functionName, arg) {
      try {
        if (arg) {
          return this.plugin[functionName](arg);
        } else {
          return this.plugin[functionName]();
        }
      } catch (ex) {
        return this.onDebug("Exception calling flash function '" + functionName + "': " + ex.message);
      }
    };
    FlashMediaPlayer.prototype.callback = function(functionName, arg) {
      try {
        this[functionName].bind(this)(arg);
      } catch (error) {
        this.onDebug(error);
      }
      return false;
    };
    FlashMediaPlayer.prototype.getPluginHTML = function() {
      var params, pluginSrc;
      params = {
        url: this.sources[0].url,
        backgroundColor: '0x000000',
        width: this.width,
        height: this.height,
        autoPlay: this.autoPlay,
        playerRef: 'player'
      };
      pluginSrc = 'http://s.cmcdn.net/scripts/player/2011-02-01.swf';
      if ($.browser.msie) {
        pluginSrc += '?' + new Date().getTime();
      }
      return ['<object', ' id="', this.movieName, '"', ' name="', this.movieName, '"', ' type="application/x-shockwave-flash"', ' data="', pluginSrc, '"', ' width="', this.width, '"', ' height="', this.height, '"', '>', '<param name="wmode" value="windowless" />', '<param name="movie" value="', pluginSrc, '" />', '<param name="menu" value="false" />', '<param name="quality" value="autohigh" />', '<param name="allowScriptAccess" value="always" />', '<param name="flashvars" value="' + jQuery.param(params) + '" />', '</object>'].join('');
    };
    FlashMediaPlayer.prototype.onComplete = function() {
      return this.onEnded();
    };
    FlashMediaPlayer.prototype.onVolumeChange = function(volume) {
      return FlashMediaPlayer.__super__.onVolumeChange.call(this, volume);
    };
    FlashMediaPlayer.prototype.onDurationChange = function(duration) {
      return FlashMediaPlayer.__super__.onDurationChange.call(this, duration);
    };
    FlashMediaPlayer.prototype.onCurrentTimeChange = function(time) {
      return this.onTimeUpdate(time);
    };
    FlashMediaPlayer.prototype._onLoadProgress = function(progress) {
      return this.onLoadProgress(progress);
    };
    FlashMediaPlayer.prototype.onLoadProgress = function(progress) {
      return this.onBufferedTimeChange(this.duration * progress);
    };
    FlashMediaPlayer.prototype.onJsReady = function() {
      return this.initialized = true;
    };
    FlashMediaPlayer.prototype.onPlayerStateChange = function(state) {
      return this.onDebug('state change:' + state);
    };
    FlashMediaPlayer.prototype.onDebug = function(message) {
      try {
        return console.write(message);
      } catch (error) {

      }
    };
    FlashMediaPlayer.prototype.onMediaError = function(error) {
      var errStr;
      errStr = 'errorID: ' + error.errorID + '<br /> - message: ' + error.message + '<br /> - detail: ' + error.detail;
      alert(errStr);
      return this.onDebug('onMediaError: ' + errStr);
    };
    FlashMediaPlayer.prototype.onBufferingChange = function(buffering) {
      if (buffering) {
        return this.onWaiting();
      }
    };
    return FlashMediaPlayer;
  })();
  MediaPlayerControls = (function() {
    function MediaPlayerControls(player) {
      this.player = player;
      this.element = this.player.element.find('.controls');
      this.hidden = false;
      this.scrubber = new Scrubber(this.element.find('.scrubber'), this);
      this.volumeControl = new VolumeControl(this.element.find('.volume'), this);
      if (!this.player.supportsFullscreen) {
        this.player.element.addClass('noFullscreen');
      }
      this.element.click(function(e) {
        return false;
      });
      this.element.find('.fullscreen').click(__bind(function(e) {
        return this.player.enterFullscreen();
      }, this));
      this.player.element.bind('mousemove', this.mouseMove.bind(this));
      this.bufferedBar = new Bar(this.element.find('.bufferedBar'));
      this.playedBar = new Bar(this.element.find('.playedBar'));
      this.overlay = this.player.overlay;
      this.player.element.bind({
        play: __bind(function(e) {
          this.show();
          if (this.player.justScrubbed) {
            this.overlay.css('opacity', 0);
            this.player.justScrubbed = false;
            return;
          }
          return this.overlay.stop().removeClass('paused muted ended').addClass('playing').css('opacity', 1).animate({
            opacity: 0
          }, 500);
        }, this),
        muted: __bind(function(e) {
          return this.overlay.stop().removeClass('playing paused ended').addClass('muted').css('opacity', 1).animate({
            opacity: 0
          }, 500);
        }, this),
        pause: __bind(function(e) {
          if (this.player.justScrubbed || this.scrubber.dragging) {
            return;
          }
          return this.overlay.stop().removeClass('playing muted ended').addClass('paused').css('opacity', 1).animate({
            opacity: 0
          }, 500);
        }, this),
        timeUpdate: __bind(function(e, time) {
          var playedValue;
          if (this.scrubber.dragging) {
            return;
          }
          playedValue = time / this.player.duration;
          return this.playedBar.setValue(playedValue);
        }, this),
        bufferedTimeChange: __bind(function(e, bufferedTime) {
          var bufferedValue;
          bufferedValue = bufferedTime / this.player.duration;
          return this.bufferedBar.setValue(bufferedValue);
        }, this),
        click: __bind(function(e) {
          if (this.player.paused) {
            return this.player.play();
          } else {
            return this.player.pause();
          }
        }, this),
        mouseenter: __bind(function(e) {
          return this.show();
        }, this),
        mouseleave: __bind(function(e) {
          return this.hide();
        }, this)
      });
      this.element.find('.playPauseToggle').click(__bind(function() {
        if (this.player.paused) {
          return this.player.play();
        } else {
          return this.player.pause();
        }
      }, this));
    }
    MediaPlayerControls.prototype.reset = function() {
      this.playedBar.setValue(0);
      return this.bufferedBar.setValue(0);
    };
    MediaPlayerControls.prototype.hide = function() {
      if (this.scrubber.dragging || this.volumeControl.dragging || this.hidden) {
        return;
      }
      this.hidden = true;
      return this.element.stop().animate({
        opacity: 0
      }, 250);
    };
    MediaPlayerControls.prototype.show = function() {
      this.hidden = false;
      return this.element.stop().animate({
        opacity: 1
      }, 50);
    };
    MediaPlayerControls.prototype.mouseMove = function(e) {
      if (this.hidden) {
        this.show();
      }
      if (this.mouseMoveTimeout) {
        clearInterval(this.mouseMoveTimeout);
      }
      return this.mouseMoveTimeout = setTimeout(this.hide.bind(this), 3000);
    };
    return MediaPlayerControls;
  })();
  Scrubber = (function() {
    function Scrubber(element, controls) {
      this.element = element;
      this.controls = controls;
      this.player = this.controls.player;
      this.dragging = false;
      this.wasPlaying = false;
      this.element.find('.track').bind({
        'mousedown': this.startScrub.bind(this),
        'mouseup': this.stopScrub.bind(this)
      });
    }
    Scrubber.prototype.startScrub = function(e) {
      Util.blockTextSelection();
      this.wasPlaying = !this.player.paused;
      this.dragging = true;
      this.player.element.addClass('scrubbing');
      this.scrubTo(e);
      if (this.wasPlaying) {
        this.player.pause();
      }
      return $(document).bind({
        'mousemove': this.scrubTo.bind(this),
        'mouseup': this.stopScrub.bind(this)
      });
    };
    Scrubber.prototype.stopScrub = function(e) {
      Util.unblockTextSelection();
      this.dragging = false;
      this.scrubTo(e);
      if (this.wasPlaying) {
        this.player.justScrubbed = true;
        this.player.play();
      }
      this.player.element.removeClass('scrubbing');
      return $(document).unbind('mousemove mouseup');
    };
    Scrubber.prototype.scrubTo = function(e) {
      var position;
      position = Util.getRelativePosition(e.pageX, this.element[0]);
      return this.setPosition(position);
    };
    Scrubber.prototype.setPosition = function(position) {
      this.controls.playedBar.setValue(position);
      return this.player.seek(this.player.duration * position);
    };
    return Scrubber;
  })();
  VolumeControl = (function() {
    function VolumeControl(element, controls) {
      this.element = element;
      this.controls = controls;
      this.player = this.controls.player;
      this.volumeButton = this.element.find('.volumeButton');
      this.track = this.element.find('.track');
      this.bar = new Bar(this.track.find('.bar'));
      this.dragging = false;
      this.player.element.bind({
        volumeChange: __bind(function(e, volume) {
          if (!this.dragging) {
            return this.setValue(volume);
          }
        }, this)
      });
      this.track.bind({
        'mousedown': this.startDrag.bind(this),
        'mouseup': this.endDrag.bind(this)
      });
      this.setValue(this.player.volume);
      this.volumeButton.click(this.toggleMute.bind(this));
    }
    VolumeControl.prototype.setValue = function(volume) {
      this.bar.setValue(volume);
      if (volume === 0) {
        return this.element.addClass('silent').removeClass('low medium high');
      } else if (volume < 0.33) {
        return this.element.addClass('low').removeClass('silent medium high');
      } else if (volume < 0.66) {
        return this.element.addClass('medium').removeClass('silent low high');
      } else {
        return this.element.addClass('high').removeClass('silent low medium');
      }
    };
    VolumeControl.prototype.toggleMute = function() {
      if (this.player.muted) {
        this.player.setVolume(this.volumeBeforeMute);
        return this.player.onUnmuted();
      } else {
        this.volumeBeforeMute = this.player.volume;
        this.player.setVolume(0);
        return this.player.onMuted();
      }
    };
    VolumeControl.prototype.startDrag = function(e) {
      Util.blockTextSelection();
      this.dragging = true;
      this.scrubTo(e);
      return $(document).bind({
        'mousemove': this.scrubTo.bind(this),
        'mouseup': this.endDrag.bind(this)
      });
    };
    VolumeControl.prototype.endDrag = function(e) {
      Util.unblockTextSelection();
      this.dragging = false;
      this.scrubTo(e);
      return $(document).unbind('mousemove mouseup');
    };
    VolumeControl.prototype.scrubTo = function(e) {
      var position;
      position = Util.getRelativePosition(e.pageX, this.track[0]);
      return this.setPosition(position);
    };
    VolumeControl.prototype.setPosition = function(position) {
      this.setValue(position);
      return this.player.setVolume(position);
    };
    return VolumeControl;
  })();
  Bar = (function() {
    function Bar(element) {
      this.element = element;
    }
    Bar.prototype.setValue = function(value) {
      return this.element.css('width', Math.round(value * 100) + '%');
    };
    return Bar;
  })();
  Plugin = (function() {
    function Plugin(name) {
      this.name = name;
      this.version = {
        text: '',
        major: -1,
        minor: -1
      };
      this.setVersion();
      this.isInstalled = this.version.major > -1;
    }
    Plugin.prototype.setVersion = function() {
      if (window.ActiveXObject) {
        return this.setActiveXVersion();
      } else {
        return this.setNavigatorVersion();
      }
    };
    Plugin.prototype.getNavigatorPlugin = function() {
      try {
        if (this.name === 'flash') {
          return navigator.plugins['Shockwave Flash'];
        }
      } catch (error) {
        return null;
      }
      return null;
    };
    Plugin.prototype.getActiveXObject = function() {
      try {
        if (this.name === 'flash') {
          return new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
        }
      } catch (error) {
        return null;
      }
    };
    Plugin.prototype.setActiveXVersion = function() {
      var activeXObject, versionArray, versionText;
      try {
        activeXObject = this.getActiveXObject();
        if (activeXObject) {
          if (this.name === 'flash') {
            versionText = activeXObject.GetVariable('$version');
            versionArray = versionText.split(',');
            this.version.text = versionText;
            this.version.major = parseInt(versionArray[0].split(' ')[1], 10);
            return this.version.minor = parseInt(versionArray[1], 10);
          }
        }
      } catch (error) {
        return null;
      }
    };
    Plugin.prototype.setNavigatorVersion = function() {
      var descParts, majorMinor, navigatorPlugin, versionParts, versionText;
      try {
        navigatorPlugin = this.getNavigatorPlugin();
        if (navigatorPlugin) {
          versionText = navigatorPlugin.description;
          this.version.text = versionText;
          if (versionText.startsWith('Shockwave')) {
            descParts = versionText.split(/ +/);
            majorMinor = descParts[2].split(/\./);
            this.version.major = parseInt(majorMinor[0], 10);
            return this.version.minor = parseInt(majorMinor[1], 10);
          } else {
            versionParts = versionText.split('.');
            this.version.major = parseInt(versionParts[0], 10);
            return this.version.minor = parseInt(versionParts[1], 10);
          }
        }
      } catch (error) {
        return null;
      }
    };
    return Plugin;
  })();
}).call(this);

