/**

* This is the web browser implementation of `debug()`.
*
* Expose `debug()` as the module.
*/

exports = module.exports = require('./debug'); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; exports.load = load; exports.useColors = useColors; exports.storage = 'undefined' != typeof chrome

&& 'undefined' != typeof chrome.storage
   ? chrome.storage.local
   : localstorage();

/**

* Colors.
*/

exports.colors = [

'lightseagreen',
'forestgreen',
'goldenrod',
'dodgerblue',
'darkorchid',
'crimson'

];

/**

* Currently only WebKit-based Web Inspectors, Firefox >= v31,
* and the Firebug extension (any Firefox version) are known
* to support "%c" CSS customizations.
*
* TODO: add a `localStorage` variable to explicitly enable/disable colors
*/

function useColors() {

// NB: In an Electron preload script, document will be defined but not fully
// initialized. Since we know we're in Chrome, we'll just detect this case
// explicitly
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
  return true;
}

// is webkit? http://stackoverflow.com/a/16459606/376773
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
  // is firebug? http://stackoverflow.com/a/398120/376773
  (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
  // is firefox >= v31?
  // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
  (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
  // double check webkit in userAgent just in case we are in a worker
  (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));

}

/**

* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/

exports.formatters.j = function(v) {

try {
  return JSON.stringify(v);
} catch (err) {
  return '[UnexpectedJSONParseError]: ' + err.message;
}

};

/**

* Colorize log arguments if enabled.
*
* @api public
*/

function formatArgs(args) {

var useColors = this.useColors;

args[0] = (useColors ? '%c' : '')
  + this.namespace
  + (useColors ? ' %c' : ' ')
  + args[0]
  + (useColors ? '%c ' : ' ')
  + '+' + exports.humanize(this.diff);

if (!useColors) return;

var c = 'color: ' + this.color;
args.splice(1, 0, c, 'color: inherit')

// the final "%c" is somewhat tricky, because there could be other
// arguments passed either before or after the %c, so we need to
// figure out the correct index to insert the CSS into
var index = 0;
var lastC = 0;
args[0].replace(/%[a-zA-Z%]/g, function(match) {
  if ('%%' === match) return;
  index++;
  if ('%c' === match) {
    // we only are interested in the *last* %c
    // (the user may have provided their own)
    lastC = index;
  }
});

args.splice(lastC, 0, c);

}

/**

* Invokes `console.log()` when available.
* No-op when `console.log` is not a "function".
*
* @api public
*/

function log() {

// this hackery is required for IE8/9, where
// the `console.log` function doesn't have 'apply'
return 'object' === typeof console
  && console.log
  && Function.prototype.apply.call(console.log, console, arguments);

}

/**

* Save `namespaces`.
*
* @param {String} namespaces
* @api private
*/

function save(namespaces) {

try {
  if (null == namespaces) {
    exports.storage.removeItem('debug');
  } else {
    exports.storage.debug = namespaces;
  }
} catch(e) {}

}

/**

* Load `namespaces`.
*
* @return {String} returns the previously persisted debug modes
* @api private
*/

function load() {

var r;
try {
  r = exports.storage.debug;
} catch(e) {}

// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
if (!r && typeof process !== 'undefined' && 'env' in process) {
  r = process.env.DEBUG;
}

return r;

}

/**

* Enable namespaces listed in `localStorage.debug` initially.
*/

exports.enable(load());

/**

* Localstorage attempts to return the localstorage.
*
* This is necessary because safari throws
* when a user disables cookies/localstorage
* and you attempt to access it.
*
* @return {LocalStorage}
* @api private
*/

function localstorage() {

try {
  return window.localStorage;
} catch (e) {}

}