var Froogaloop=function(){function g(a){return new g.fn.init(a)}function h(a,b,c){if(!c.contentWindow.postMessage)return!1;var f=c.getAttribute("src").split("?")[0];a=JSON.stringify({method:a,value:b});c.contentWindow.postMessage(a,f)}function i(a){if(a.origin!=playerDomain)return!1;var b=JSON.parse(a.data);a=b.value;var c=b.data,f=f==""?null:b.player_id;b=f?d[f][b.event||b.method]:d[b.event||b.method];var e=[];if(!b)return!1;a!==void 0&&e.push(a);c&&e.push(c);f&&e.push(f);return e.length>0?b.apply(null,
e):b.call()}function j(a,b,c){c?(d[c]||(d[c]={}),d[c][a]=b):d[a]=b}var d={},k=!1;g.fn=g.prototype={playerDomain:"",element:null,init:function(a){typeof a==="string"&&(a=document.getElementById(a));this.element=a;return this},api:function(a,b){if(!this.element||!a)return!1;var c=this.element,f=c.id!=""?c.id:null,e=!b||!b.constructor||!b.call||!b.apply?b:null,d=b&&b.constructor&&b.call&&b.apply?b:null;d&&j(a,d,f);h(a,e,c);return this},addEvent:function(a,b){if(!this.element)return!1;var c=this.element;
j(a,b,c.id!=""?c.id:null);a!="ready"&&h("addEventListener",a,c);if(k)return this;c=c.getAttribute("src").split("/");for(var d="",e=0,g=c.length;e<g;e++){if(e<3)d+=c[e];else break;e<2&&(d+="/")}playerDomain=d;window.addEventListener?window.addEventListener("message",i,!1):window.attachEvent("onmessage",i,!1);k=!0;return this},removeEvent:function(a){if(!this.element)return!1;var b=this.element,c;a:{if((c=b.id!=""?b.id:null)&&d[c]){if(!d[c][a]){c=!1;break a}d[c][a]=null}else{if(!d[a]){c=!1;break a}d[a]=
null}c=!0}a!="ready"&&c&&h("removeEventListener",a,b)}};g.fn.init.prototype=g.fn;return window.Froogaloop=window.$f=g}();

window.Sandwich || (window.Sandwich = {})

$.extend(Sandwich, {
  els: {},
  
  delays: {
    stage: {
      fadeIn: 1000,
      fadeOut: 1000,      
    },
    controls: {
      fadeIn: 500,
      fadeOut: 500,
      persist: 500
    }
  },
  
  hoverTimer: null,
  
  player: {
    youtube: { p: null, ready: false },
    vimeo:   { p: null, ready: false },
    
    listening: false,
    
    queued: {
      id: null,
      source: null,
      offset: null
    },
    
    playingSource: null,
    
    play: function(url) {
      var
        playing = false,
        source = (url ? (url.match("youtube") ? "youtube" : "vimeo") : (this.playingSource || this.queued.source)),
        id = (url ? url.match(source === "youtube" ? /youtube\.com\/watch\?v=(.+?)(\&|$)/ : /vimeo\.com\/([0-9]+)/)[1] : this.queued.id),
        offset = (url ? url.match(/\&t=(\d+?)m(\d+?)s/) : this.queued.offset)
        
      offset = offset ? (parseInt(offset[1])*60) + parseInt(offset[2]) : 0;
        
      if (!source && !this.queued.id) return;
        
      if (!this[source].ready) {
        this.queued = { source: source, id: id }
      } else {
        Sandwich.els.stage.addClass(source)
        
        if (source === "youtube") {
          if (!this.listening) {
            this.listening = true
            this.youtube.p.addEventListener("onStateChange", "Sandwich.player.stateChanged")
          }
        
          if (this.youtube.p.getPlayerState() === -1) {
            if (id) {
              this.youtube.p.loadVideoById(id, offset, "hd720")
              playing = true
            }
          } else {
            this.youtube.p.playVideo()
            playing = true
          }
        } else {
          if (id) {
            Sandwich.els.vimeo.attr("src", "http://player.vimeo.com/video/" + id + "?api=1&title=0&byline=0&portrait=0&color=ffffff&autoplay=1")
            Sandwich.els.stage.addClass("loaded")
          } else {
            this.vimeo.p.api("play")
          }
        }
        
        playing = true
      }

      if (playing) {
        this.playingSource = source
        Sandwich.els.stage.addClass("playing")
        Sandwich.els.controls.trigger("mousemove")
      }
    },
    
    pause: function() {
      if (this.playingSource) {
        if (this.playingSource === "youtube") {
          this.youtube.p.pauseVideo()
        } else {
          this.vimeo.p.api("pause")
        }

        Sandwich.els.stage.removeClass("playing")        
      }
    },

    stop: function() {
      if (this.playingSource === "youtube") {
        if (this.youtube.ready)
          this.youtube.p.stopVideo()
      } else {
        Sandwich.els.vimeo.attr("src", "")
      }

      Sandwich.els.stage.removeClass(this.playingSource)
      this.playingSource = null
    },
    
    stateChanged: function(state) {
      if (Sandwich.els.stage.hasClass("loaded")) return;
      if (state === 1) Sandwich.els.stage.addClass("loaded")
    }
  },
  
  hoverTimerFunction: function() {
    if (!Sandwich.els.stage.hasClass("playing")) return;
    
    Sandwich.els.controls.addClass("fading")
    Sandwich.els.controls.animate({ opacity: 0 }, Sandwich.delays.controls.fadeOut, function() {
      Sandwich.els.controls.removeClass("fading")
      Sandwich.els.stage.removeClass("hovering")
    })
  },
  
  init: function() {    
    this.els.stage = $("<div>", { id: "stage" }).appendTo($("body"))
    this.els.playerContainer = $("<div>", { id: "player-container" }).appendTo(this.els.stage)
    this.els.controls = $("<div>", { id: "controls" }).appendTo(this.els.stage)
    
    $.extend(this.els, {
      vimeo: $("<iframe>", { id: "vimeo-player", src: "http://player.vimeo.com/video/1635410?api=1&player_id=vimeo-player", wmode: "transparent", width: 960, height: 940, frameborder: 0 }).appendTo(this.els.playerContainer),
      youtube: $('<object type="application/futuresplash" id="youtube-player" width="960" height="540"\
        data="http://www.youtube.com/apiplayer?version=3&amp;enablejsapi=1&amp;playerapiid=player">\
        <param name="allowScriptAccess" value="always">\
        <param name="wmode" value="opaque">\
        <param name="bgcolor" value="#FFFFFF">\
      </object>').appendTo(this.els.playerContainer),
      close: $("<a>", { id: "close", text: "Close" }).appendTo(this.els.controls),
      play: $("<a>", { id: "play", text: "Play" }).appendTo(this.els.controls)
    })
    
    this.player.youtube.p = this.els.youtube[0]
    this.player.vimeo.p   = $f(this.els.vimeo[0])
    
    window.onYouTubePlayerReady = function() { Sandwich.player.youtube.ready = true; Sandwich.player.play() }
    this.player.vimeo.p.addEvent("ready", function() { Sandwich.player.vimeo.ready = true; Sandwich.player.play() });

    this.els.stage.append($("<div>", { id: "glass" }))
    this.els.stage.append($("<div>", { id: "spinner" }))
    
    this.els.stage.click(function(e) {
      switch(e.target.id) {
        case "glass": // fall through
        case "close":
          Sandwich.hideStage()
          break
          
        case "play":
          Sandwich.togglePlay()
          break
          
        default:
          return true
          break
      }
      
      return false
    })
    
    this.els.controls.mousemove(function() {
      if (
        !Sandwich.els.stage.hasClass("playing") ||
        Sandwich.els.controls.hasClass("fading")
      ) return;
      
      Sandwich.els.controls.animate({ opacity: 1 }, Sandwich.els.stage.hasClass("hovering") ? 0 : Sandwich.delays.controls.fadeIn)
      Sandwich.els.stage.addClass("hovering")
      
      clearTimeout(Sandwich.hoverTimer)

      Sandwich.hoverTimer = setTimeout(Sandwich.hoverTimerFunction, Sandwich.delays.controls.persist)
    })    
  },
  
  showVideo: function(url) {      
    if (url.match("youtube") && $("div.CTFplaceholder").length) {
      Sandwich.els.stage.addClass("ctf")
      setTimeout(Sandwich.showVideo, 100, url)
    } else {
      Sandwich.els.stage.removeClass("ctf")
      Sandwich.showPlayer()
      Sandwich.player.play(url)
    }
  },
  
  showPlayer: function() {
    if (!this.els.stage.hasClass("present")) {
      this.els.stage
        .css({ opacity: 0 })
        .addClass("present")
        .animate({ opacity: 1 }, Sandwich.delays.stage.fadeIn)
    }
  },
  
  hideStage: function() {
    this.els.stage.animate({ opacity: 0 }, Sandwich.delays.stage.fadeOut, function() {
      $(this)
        .removeClass("present loaded")
        .removeAttr("style")
        
      Sandwich.player.stop()
    })
  },
  
  togglePlay: function() {
    this.els.stage.toggleClass("playing")
    if (this.els.stage.hasClass("playing")) {
      clearTimeout(Sandwich.hoverTimer)
      Sandwich.els.stage.addClass("hovering")
      Sandwich.player.play()
    } else {
      Sandwich.els.controls.css("opacity", 1)
      Sandwich.player.pause()
    }
  }
})

$(function() {
  // this monster lovingly ganked from here:
  // http://www.featureblend.com/javascript-flash-detection-library.html
  // and subsequently cut way the hell down
  var hasFlash = (function(){
    var
      type, mimeTypes,
      activeXNames, obj, i

    if (navigator.plugins && navigator.plugins.length){
      type = "application/x-shockwave-flash"
      mimeTypes = navigator.mimeTypes

      return (mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin && mimeTypes[type].enabledPlugin.description)
    } else if (navigator.appVersion.indexOf("Mac") == -1 && window.execScript){
      activeXNames = [
        "ShockwaveFlash.ShockwaveFlash.7",
        "ShockwaveFlash.ShockwaveFlash.6",
        "ShockwaveFlash.ShockwaveFlash",
      ]

      for (i = 0; i < activeXNames.length; i++){
        try{ obj = new ActiveXObject(activeXNames[i]) }
        catch (e) { obj = { activeXError: true } }
        if (!obj.activeXError) return true;
      }
    }
  })()
  
  if (hasFlash && !navigator.userAgent.match(/Mobile/i)) {
    Sandwich.init()

    $("a.video").live("click", function(e) {
      if (e.which !== 1) return true;
      Sandwich.showVideo($(this).attr("href"));
      return false;
    })    
  }
})
