// ========================================================================== // Project: SproutCore - JavaScript Application Framework // Copyright: ©2012 Michael Krotscheck and contributors. // License: Licensed under MIT license (see license.js) // ==========================================================================

/**

* @class
* 
* An easy-to-reference list of media capabilities which the current running
* browser supports such as HTML5 and Plugin detection. It is modeled after
* Flash Player's browser capabilities class, with all the non-media related
* properties removed. Rather than performing specific browser checks, we
* instead test by creating some basic DOM elements. It's both more reliable and
* easier to maintain than browser version checks.
* 
* To see whether your target browser will support what you're trying to do,
* check http://caniuse.com/
* 
* @see http://caniuse.com/
* @since SproutCore 1.8.1
* @author Michael Krotscheck
*/

SC.mediaCapabilities = SC.Object.create({});

/**

* Automatic detection of various browser media capabilities.
*/

(function() {

/**
 * Specifies whether the browser supports the HTML5 <audio> tag.
 * 
 * @name SC.mediaCapabilities.isHTML5AudioSupported
 * @type Boolean
 */
SC.mediaCapabilities.isHTML5AudioSupported = NO;
try {
  // Firefox 3.6 doesn't support the W3C API. Disable support.
  if(SC.browser.isMozilla && SC.browser.compare(SC.browser.mozilla, "3.6") <= 0) {
    throw new Error('Browser not supported');
  }

  var doc = document.createElement('audio');
  var isAudioSupported = !!doc.canPlayType;
  delete doc;
  SC.mediaCapabilities.isHTML5AudioSupported = isAudioSupported;

} catch(e) {
}

/**
 * Specifies whether the browser supports the HTML5 <video> tag.
 * 
 * @name SC.mediaCapabilities.isHTML5AudioSupported
 * @type Boolean
 */
SC.mediaCapabilities.isHTML5VideoSupported = NO;
try {
  // Firefox 3.6 doesn't support the W3C API. Disable support.
  if(SC.browser.isMozilla && SC.browser.compare(SC.browser.mozilla, "3.6") <= 0) {
    throw new Error('Browser not supported');
  }

  var doc = document.createElement('video');
  var isVideoSupported = !!doc.canPlayType;
  delete doc;
  SC.mediaCapabilities.isHTML5VideoSupported = isVideoSupported;
} catch(e) {
}

/**
 * Specifies whether the browser supports the Adobe Flash plugin.
 * 
 * @name SC.mediaCapabilities.isHTML5AudioSupported
 * @type Boolean
 */
SC.mediaCapabilities.isFlashSupported = NO;
// Non-IE detection
if(navigator.plugins) {
  for( var i = 0; i < navigator.plugins.length; i++) {
    if(navigator.plugins[i].name.indexOf("Shockwave Flash") >= 0) {
      SC.mediaCapabilities.isFlashSupported = YES;
    }
  }
}
// IE ActiveX detection
if(window.ActiveXObject) {
  try {
    var control = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
    delete control;
    SC.mediaCapabilities.isFlashSupported = YES;
  } catch(e) {
    // Do nothing- The ActiveX object isn't available.
  }
}

/**
 * Specifies whether the browser supports quicktime media playback.
 * 
 * @type Boolean
 */
SC.mediaCapabilities.isQuicktimeSupported = NO;

// Non-IE detection
if(navigator.plugins) {
  for( var i = 0; i < navigator.plugins.length; i++) {
    if(navigator.plugins[i].name.indexOf("QuickTime") >= 0) {
      SC.mediaCapabilities.isQuicktimeSupported = YES;
    }
  }
}
// IE ActiveX detection
if(window.ActiveXObject) {
  var control = null;
  try {
    control = new ActiveXObject('QuickTime.QuickTime');
    delete control;
    SC.mediaCapabilities.isQuicktimeSupported = YES;
  } catch(e) {
    // Do nothing- the ActiveX object isn't available.
  }

  try {
    // This generates a user prompt in Internet Explorer 7
    control = new ActiveXObject('QuickTimeCheckObject.QuickTimeCheck');
    delete control;
    SC.mediaCapabilities.isQuicktimeSupported = YES;
  } catch(e) {
    // Do nothing- The ActiveX object isn't available.
  }
}

/**
 * Specifies whether the browser supports the HTML5 getUserMedia/Stream API.
 * 
 * NOTE: As of February 2012, this feature is still in Draft status and is
 * likely to change frequently. It's included here for the sake of
 * completeness, however concrete implementations don't yet exist.
 * 
 * @name SC.mediaCapabilities.isHTML5StreamApiSupported
 * @type Boolean
 */
SC.mediaCapabilities.isHTML5StreamApiSupported = !!navigator.getUserMedia;

/**
 * Specifies whether the browser supports audio recording via the HTML5 stream
 * API or the Adobe Flash plugin.
 * 
 * @name SC.mediaCapabilities.hasMicrophone
 * @type Boolean
 */
SC.mediaCapabilities.hasMicrophone = SC.mediaCapabilities.isHTML5StreamApiSupported || SC.mediaCapabilities.isFlashSupported;

/**
 * Specifies whether the browser supports video recording via the HTML5 stream
 * API or the Adobe Flash Plugin.
 * 
 * @name SC.mediaCapabilities.hasMicrophone
 * @type Boolean
 */
SC.mediaCapabilities.hasVideoCamera = SC.mediaCapabilities.isHTML5StreamApiSupported || SC.mediaCapabilities.isFlashSupported;

/**
 * Specifies whether the browser has audio playback capabilities.
 * 
 * @name SC.mediaCapabilities.hasAudioPlayback
 * @type Boolean
 */
SC.mediaCapabilities.hasAudioPlayback = SC.mediaCapabilities.isHTML5AudioSupported || SC.mediaCapabilities.isQuicktimeSupported || SC.mediaCapabilities.isFlashSupported;

/**
 * Specifies whether the browser has video playback capabilities.
 * 
 * @name SC.mediaCapabilities.hasVideoPlayback
 * @type Boolean
 */
SC.mediaCapabilities.hasVideoPlayback = SC.mediaCapabilities.isHTML5VideoSupported || SC.mediaCapabilities.isQuicktimeSupported || SC.mediaCapabilities.isFlashSupported;

/**
 * Specifies whether the browser supports Ogg Vorbis.
 * 
 * @name SC.mediaCapabilities.isOggSupported
 * @type Boolean
 */
SC.mediaCapabilities.isOggSupported = SC.mediaCapabilities.hasVideoPlayback && (SC.browser.isMozilla || SC.browser.isChrome || SC.browser.isOpera);

/**
 * Specifies whether the browser supports the WebM/VP8 Video format.
 * 
 * @name SC.mediaCapabilities.isWebMSupported
 * @type Boolean
 */
SC.mediaCapabilities.isWebMSupported = SC.mediaCapabilities.hasVideoPlayback && (SC.browser.isMozilla || SC.browser.isChrome || SC.browser.isOpera);

/**
 * Specifies whether the browser supports the Adobe FLV compression format.
 * 
 * @name isFLVSupported
 * @type Boolean
 */
SC.mediaCapabilities.isFLVSupported = SC.mediaCapabilities.isFlashSupported;

/**
 * Specifies whether the browser supports the MPEG-4/H.264 Video format
 * 
 * @name isMP4Supported
 * @type Boolean
 */
SC.mediaCapabilities.isMP4Supported = SC.mediaCapabilities.hasVideoPlayback && (SC.browser.isIE || SC.browser.isChrome || SC.browser.isSafari);

})();