/**
 * conf.js - xhrdavclient config
 *
 * Configuration of Library parameters.
 *
 * @license Copyright 2011 The xhrdavclient library authors.
 * All rights reserved.
 */

goog.provide('xhrdav.Conf');
goog.require('goog.debug.Console');
goog.require('goog.debug.ErrorHandler');
goog.require('goog.debug.Logger');
goog.require('goog.net.XhrIo');
goog.require('xhrdav.lib');


/*
 * Refs: goog.DEBUG=true|false
 */

/**
 * xhrdavclient Global config
 *
 * @constructor
 */
xhrdav.Conf = function() {
  this.initialize_();
  this.initializeErrorHandler_();
};
goog.addSingletonGetter(xhrdav.Conf);

/**
 * Initiaze config
 *
 * @private
 */
xhrdav.Conf.prototype.initialize_ = function() {
  /** @type {string} */
  this.xmlParseFuncObj = 'xhrdav.utils.domparse';

  /**
   * @private
   * @type {goog.debug.Logger}
   */
  this.logger_ = new goog.debug.Logger.getLogger('xhrdavclient');

  if (goog.DEBUG) {
    this.logger_.setLevel(goog.debug.Logger.Level.ALL);
  } else {
    this.logger_.setLevel(goog.debug.Logger.Level.WARNING);
  }
  goog.debug.Console.autoInstall();
  goog.debug.Console.instance.setCapturing(true);

  /**
   * @private
   * @type {Object}
   */
  this.xmgr_ = {timeoutInterval: 120000};

  /**
   * @private
   * @type {goog.debug.ErrorHandler}
   */
  this.errorHandler_ = null;
};

/**
 * Initialize errorHandler
 *
 * @private
 */
xhrdav.Conf.prototype.initializeErrorHandler_ = function() {
  var handler = goog.bind(function(e) {
    this.logger_.warning(e.name + ': ' + e.message, e);
  }, this);
  this.errorHandler_ = new goog.debug.ErrorHandler(handler);
//  this.errorHandler_.protectWindowSetInterval();
//  this.errorHandler_.protectWindowSetTimeout();
  goog.net.XhrIo.protectEntryPoints(this.errorHandler_);
};

/**
 * Get errorHandler
 *
 * @return {goog.debug.ErrorHandler} errorHandler.
 */
xhrdav.Conf.prototype.getErrorHandler = function() {
  if (!goog.isDefAndNotNull(this.errorHandler_)) {
    this.initializeErrorHandler_();
  }
  return this.errorHandler_;
};

/**
 * Get XhrManager
 *
 * @return {Object} XhrManager config Map.
 */
xhrdav.Conf.prototype.getXhrMgrConfig = function() {
  return this.xmgr_;
};

/**
 * Get library logger
 *
 * Example:
 *  xhrdav.Conf.getInstance().getLogger().warning(
 *    'DavFs: ' + errors.request.path);
 *  xhrdav.Conf.getInstance().getLogger().warning(
 *    'DavFs: ' + errors.request.message);
 *
 * @param {number=} level goog.debug.Logger.Level.
 * @return {goog.debug.Logger} logger object.
 */
xhrdav.Conf.prototype.getLogger = function(level) {
  if (level) this.logger_.setLevel(level);
  return this.logger_;
};

/**
 * Output debug log(use config method).
 *
 * Example:
 *  xhrdav.Conf.logging(node.isSelected());
 *  => [10.098s] [xhrdavclient] true
 *
 *  xhrdav.Conf.logging({
 *    selected: node.isSelected(), expanded: node.getExpanded()});
 *  => [10.098s] [xhrdavclient] selected: true
 *  => [10.098s] [xhrdavclient] expanded: false
 *
 * @param {(Object|*)} messages
 *     Log message. Json/Hash Object OR stirng|number|boolean.
 * @param {string=} opt_output
 *     logger output method(warning, info, config, fine, etc).
 *     [default: info].
 * @see goog.debug.Logger
 */
xhrdav.Conf.logging = function(messages, opt_output) {
    var logger = xhrdav.Conf.getInstance().getLogger();
    var methodName = goog.isDefAndNotNull(opt_output) &&
      goog.isDef(logger[opt_output]) ? opt_output : 'info';

    if (messages && goog.isObject(messages)) {
        var logMessages = {};
        goog.mixin(logMessages, messages);
        goog.object.forEach(logMessages, function(v, k) {
          logger[methodName](goog.string.subs('%s: %s', k, v));
        });
    } else {
      logger[methodName](messages);
    }
};

// Load Config
xhrdav.Conf.getInstance();

/* Entry Point for closure compiler */
//goog.exportSymbol('xhrdav.lib.LIBNAME', xhrdav.lib.LIBNAME);
goog.exportSymbol('xhrdav.Conf.getInstance', xhrdav.Conf.getInstance);
goog.exportProperty(xhrdav.Conf.prototype, 'getXhrMgrConfig',
  xhrdav.Conf.prototype.getXhrMgrConfig);
goog.exportProperty(xhrdav.Conf.prototype, 'getLogger',
  xhrdav.Conf.prototype.getLogger);
goog.exportSymbol('xhrdav.Conf.logging', xhrdav.Conf.logging);