// setup global scope
//
  if(!window.blipsnips){
    blipsnips = {};
    blipsnips.embedded = true;
  };

// setup script loader
//
  if(!blipsnips.get_script){
    blipsnips.get_script = function(src, callback){
      var head = document.getElementsByTagName('head')[0];
      var script = document.createElement('script');
      var id = 'blipsnips-' + src.replace(/[^\w]/g, '-').replace(/^-+/, '');
      script.id = id;
      script.src = src;
      script.type = 'text/javascript';

    // Attach handlers for all browsers
    //
      var done = false;
      script.onload = script.onreadystatechange = function() {
        if ( !done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") ) {
          done = true;
          callback && callback();
          // Handle memory leak in IE
          script.onload = script.onreadystatechange = null;
          if ( head && script.parentNode ) {
            head.removeChild( script );
          }
        }
      };

    // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
    // This arises when a base node is used (#2709 and #4378).
    //
      head.insertBefore(script, head.firstChild);
    }
  };

// setup style loader
//
  if(!blipsnips.get_style){
    blipsnips.get_style = function(href, callback){
      var head = document.getElementsByTagName('head')[0];
      var link = document.createElement('link');
      var id = 'blipsnips-' + href.replace(/[^\w]/g, '-').replace(/^-+/, '');
      link.id = id;
      link.href = href;
      link.type = 'text/css';
      link.media = 'screen';
      link.rel = 'stylesheet';
      head.insertBefore(link, head.firstChild);
      callback && callback();
    }
  };

// setup log helper
//
  if(!blipsnips.log){
    blipsnips.log = function(){
      if(window.console && typeof window.console.log === 'function'){
        window.console.log.apply(window.console, arguments);
      };
    };
  };

// setup blipsnip page counter
//
  if(!blipsnips.counter){
    blipsnips.counter = 1;
  };

// setup callback stack
//
  if(!blipsnips.callbacks){
    blipsnips.callbacks = [];
  }

// setup player stack
//
  if(!blipsnips.players){
    blipsnips.players = [];
  }

// provides a way to safely run all callbacks after *all* assets are loaded
//
  if(!blipsnips.run_callbacks_when_assets_are_loaded){
    blipsnips.run_callbacks_when_assets_are_loaded = function(options){
      base = options.base || 'http://blipsnips.com';

      // start css loading iff needed 
      //
        if(!blipsnips['css-assets-loaded?']){
          blipsnips['css-assets-loaded?'] = true;

          blipsnips.get_style(base + '/stylesheets/player.css');
        }

      // start js loading in the background - runs all callbacks when loaded AND
      // page is loaded
      //
        if(!blipsnips['js-assets-loaded?']){
          blipsnips['js-assets-loaded?'] = true;

          blipsnips.get_script(base + '/javascripts/jquery.js', function(){
            blipsnips.jq = blipsnips.jQuery = jQuery.noConflict(true);

            blipsnips.get_script(base + '/javascripts/swfobject.js', function(){
              blipsnips.get_script(base + '/javascripts/blipsnips.js', function(){

                blipsnips.jq(function(){
                  if(!blipsnips.sweeper){
                    blipsnips.sweep =
                      function(){
                        while(true){
                          var cb = blipsnips.callbacks.shift();
                          if(!cb) break;
                          cb();
                        };
                      };
                    blipsnips.sweep();
                    blipsnips.sweeper = setInterval(blipsnips.sweep, 1000);
                  }
                });

              });
            });
          });
        }
    };
  };



//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

// embed y'all!
//

(function(){

// this code is scary, but required to parse out config info from the embed
// script tag
//
  embedHelper=(function(){var a=(function(){var b=document.getElementsByTagName("script");return b[b.length-1]})();return{getConfig:function(g){var b=a.innerHTML,d={},c=Array.prototype.slice.call(arguments);try{d=(new Function("return "+b.replace(/\n|\r/g,"")))()}catch(f){}c.push(d);return this.merge.apply(this,c)},merge:function(g,f){if(typeof g!=="object"){g={}}for(var e in f){if(!f.hasOwnProperty||f.hasOwnProperty(e)){var b=f[e];if(typeof b==="object"){g[e]=this.merge(g[e],b);continue}g[e]=b}}for(var d=2,c=arguments.length;d<c;d++){this.merge(g,arguments[d])}return g},getQueryParams:function(){var g=a.src,c,d,f,e={},b=Array.prototype.slice.call(arguments);if(g.indexOf("?")>-1){c=g.split("?")[1].split("&");d=c.length;while(d--){f=c[d].split("=");e[f[0]]=f[1]}}b.push(e);return this.merge.apply(this,b)},insert:function(e){if(e.nodeName&&!e.length){return a.parentNode.insertBefore(e,a)}if(typeof e==="string"){var c=document.createElement("div");c.innerHTML=e;e=c.childNodes}for(var d=0,b=e.length||0;d<b;++d){this.insert(e[d])}return this},scriptRef:a}})();

  var config = embedHelper.getConfig();
  var query = embedHelper.getQueryParams();
  var script = embedHelper.scriptRef;

  var base = (
    config.base || query.base ||
    config.slash || query.slash ||
    ((script.src.match(/^[^\/]+\/\/[^\/]+/) || [])[0])
  );

  var id = config.id || query.id;

  var size = config.size || query.size || 'medium';

// setup widget container and callback
//
  var domid = "blipsnips-" + blipsnips.counter++;
  var selector = '#' + domid;
  var div =
    "<div class='blipsnips-embedded-player' id='" + domid + "'>" +
      "<span style='color:#999;font-style:italic;font-size:0.8em;'>... loading blipsnip #" + id + " ...</span>" +
    "</div>";

// dump dat shit into the dom now - not later - to preserve order
//
  document.write(div);

// register the callback for this blipsnip
//
  var callback = function(){
    var jq = blipsnips.jq;
    var options = {'id' : id, 'base' : base, 'size' : size, 'embedded' : true};
    var player = jq(selector).embedded_player(options);
    blipsnips.players.push(player);
  };
  blipsnips.callbacks.push(callback);
  blipsnips.run_callbacks_when_assets_are_loaded({'base' : base});
})();
