text: /**
   * The Settings Modul reads the settings out of settings.json and provides
   * this information to the other modules
   */
  
  /*
   * 2011 Peter 'Pita' Martischka (Primary Technology Ltd)
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS-IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  var fs = require("fs");
  var os = require("os");
  var path = require('path');
  var argv = require('./Cli').argv;
  var npm = require("npm/lib/npm.js");
  var jsonminify = require("jsonminify");
  var log4js = require("log4js");
  var randomString = require("./randomstring");
  
  
  /* Root path of the installation */
  exports.root = path.normalize(path.join(npm.dir, ".."));
  
  /**
   * The app title, visible e.g. in the browser window
   */
   
     exports.et = "Etherpad";
  exports.title = "Etherpad";
  
  
  /**
   * The app favicon fully specified url, visible e.g. in the browser window
   */
  exports.favicon = "favicon.ico";
  exports.faviconPad = "../" + exports.favicon;
  exports.faviconTimeslider = "../../" + exports.favicon;
  
  
  
  /**
   * The IP ep-lite should listen to
   */
  exports.ip = "0.0.0.0";
  
  /**
   * The Port ep-lite should listen to
   */
  exports.port = process.env.PORT || 9001;
  
  /**
   * The SSL signed server key and the Certificate Authority's own certificate
   * default case: ep-lite does *not* use SSL. A signed server key is not required in this case.
   */
  exports.ssl = false;
  
  /**
   * socket.io transport methods
   **/
  exports.socketTransportProtocols = ['xhr-polling', 'jsonp-polling', 'htmlfile'];
  
  /*
   * The Type of the database
   */
  exports.dbType = "dirty";
  /**
   * This setting is passed with dbType to ueberDB to set up the database
   */
  exports.dbSettings = { "filename" : path.join(exports.root, "dirty.db") };
  
  /**
   * The default Text of a new pad
   */
  exports.defaultPadText = "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nEtherpad on Github: http:\/\/j.mp/ep-lite\n";
  
  /**
   * The toolbar buttons and order.
   */
  exports.toolbar = {
    left: [
      ["bold", "italic", "underline", "strikethrough"],
      ["orderedlist", "unorderedlist", "indent", "outdent"],
      ["undo", "redo"],
      ["clearauthorship"]
    ],
    right: [
      ["importexport", "timeslider", "savedrevision"],
      ["settings", "embed"],
      ["showusers"]
    ],
    timeslider: [
      ["timeslider_export", "timeslider_returnToPad"]
    ]
  }
  
  /**
   * A flag that requires any user to have a valid session (via the api) before accessing a pad
   */
  exports.requireSession = false;
  
  /**
   * A flag that prevents users from creating new pads
   */
  exports.editOnly = false;
  
  /**
   * A flag that bypasses password prompts for users with valid sessions
   */
  exports.sessionNoPassword = false;
  
  /**
   * Max age that responses will have (affects caching layer).
   */
  exports.maxAge = 1000*60*60*6; // 6 hours
  
  /**
   * A flag that shows if minification is enabled or not
   */
  exports.minify = true;
  
  /**
   * The path of the abiword executable
   */
  exports.abiword = null;
  
  /**
   * Should we support none natively supported file types on import?
   */
  exports.allowUnknownFileEnds = true;
  
  /**
   * The log level of log4js
   */
  exports.loglevel = "INFO";
  
  /**
   * Disable IP logging
   */
  exports.disableIPlogging = false;
  
  /*
  * log4js appender configuration
  */
  exports.logconfig = { appenders: [{ type: "console" }]};
  
  /*
  * Session Key, do not sure this.
  */
  exports.sessionKey = false;
  
  /*
  * Trust Proxy, whether or not trust the x-forwarded-for header.
  */
  exports.trustProxy = false;
  
  /* This setting is used if you need authentication and/or
   * authorization. Note: /admin always requires authentication, and
   * either authorization by a module, or a user with is_admin set */
  exports.requireAuthentication = false;
  exports.requireAuthorization = false;
  exports.users = {};
  
  //checks if abiword is avaiable
  exports.abiwordAvailable = function()
  {
    if(exports.abiword != null)
    {
      return os.type().indexOf("Windows") != -1 ? "withoutPDF" : "yes";
    }
    else
    {
      return "no";
    }
  };
  
  exports.reloadSettings = function reloadSettings() {
    // Discover where the settings file lives
    var settingsFilename = argv.settings || "settings.json";
  
    if (path.resolve(settingsFilename)===settingsFilename) {
      settingsFilename = path.resolve(settingsFilename);
    } else {
      settingsFilename = path.resolve(path.join(exports.root, settingsFilename));
    }
    
    var settingsStr;
    try{
      //read the settings sync
      settingsStr = fs.readFileSync(settingsFilename).toString();
    } catch(e){
      console.warn('No settings file found. Continuing using defaults!');
    }
  
    // try to parse the settings
    var settings;
    try {
      if(settingsStr) {
        settingsStr = jsonminify(settingsStr).replace(",]","]").replace(",}","}");
        settings = JSON.parse(settingsStr);
      }
    }catch(e){
      console.error('There was an error processing your settings.json file: '+e.message);
      process.exit(1);
    }
  
    //loop trough the settings
    for(var i in settings)
    {
      //test if the setting start with a low character
      if(i.charAt(0).search("[a-z]") !== 0)
      {
        console.warn("Settings should start with a low character: '" + i + "'");
      }
  
      //we know this setting, so we overwrite it
      //or it's a settings hash, specific to a plugin
      if(exports[i] !== undefined || i.indexOf('ep_')==0)
      {
        exports[i] = settings[i];
      }
      //this setting is unkown, output a warning and throw it away
      else
      {
        console.warn("Unknown Setting: '" + i + "'. This setting doesn't exist or it was removed");
      }
    }
  
    log4js.configure(exports.logconfig);//Configure the logging appenders
    log4js.setGlobalLogLevel(exports.loglevel);//set loglevel
    process.env['DEBUG'] = 'socket.io:' + exports.loglevel; // Used by SocketIO for Debug
    log4js.replaceConsole();
  
    if(exports.abiword){
      // Check abiword actually exists
      if(exports.abiword != null)
      {
        fs.exists(exports.abiword, function(exists) {
          if (!exists) {
            console.error("Abiword does not exist at this path, check your settings file");
            exports.abiword = null;
          }
        });
      }
    }
  
    if(!exports.sessionKey){ // If the secretKey isn't set we also create yet another unique value here
      exports.sessionKey = randomString(32);
      console.warn("You need to set a sessionKey value in settings.json, this will allow your users to reconnect to your Etherpad Instance if your instance restarts");
    }
  
    if(exports.dbType === "dirty"){
      console.warn("DirtyDB is used. This is fine for testing but not recommended for production.");
    }
  };
  
  // initially load settings
  exports.reloadSettings();
  