// 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.

define([], function () {

  var constants = {

    MISC: {
      TRAY_TOGGLE_SPEED: 250,
      DEFAULT_PAGE_SIZE: 20,
      MODAL_BACKDROP_Z_INDEX: 1025
    },

    DATABASES: {
      DOCUMENT_LIMIT: 100
    },

    // global events for common used components
    EVENTS: {
      TRAY_OPENED: 'tray:opened',
      NAVBAR_SIZE_CHANGED: 'navbar:size_changed'
    },

    // documentation URLs
    DOC_URLS: {
      GENERAL: '/_utils/docs/intro/api.html#documents',
      ALL_DBS: '/_utils/docs/api/server/common.html?highlight=all_dbs#get--_all_dbs',
      REPLICATION: '/_utils/docs/replication/replicator.html#basics',
      DESIGN_DOCS: '/_utils/docs/couchapp/ddocs.html#design-docs',
      DESIGN_DOC_METADATA: '/_utils/docs/api/ddoc/common.html#api-ddoc-view-index-info',
      VIEW_FUNCS: '/_utils/docs/couchapp/ddocs.html#view-functions',
      MAP_FUNCS: '/_utils/docs/couchapp/ddocs.html#map-functions',
      REDUCE_FUNCS: '/_utils/docs/couchapp/ddocs.html#reduce-and-rereduce-functions',
      API_REF: '/_utils/docs/http-api.html',
      DB_PERMISSION: '/_utils/docs/api/database/security.html#db-security',
      STATS: '/_utils/docs/api/server/common.html?highlight=stats#get--_stats',
      ACTIVE_TASKS: '/_utils/docs/api/server/common.html?highlight=stats#active-tasks',
      LOG: '/_utils/docs/api/server/common.html?highlight=stats#log',
      CONFIG: '/_utils/docs/config/index.html',
      VIEWS: '/_utils/docs/intro/overview.html#views',
      MANGO_INDEX: '/_utils/docs/intro/api.html#documents',
      MANGO_SEARCH: '/_utils/docs/intro/api.html#documents',
      CHANGES: '/_utils/docs/api/database/changes.html?highlight=changes#post--db-_changes'
    },

    LOCAL_STORAGE: {
      SIDEBAR_MINIMIZED: 'sidebar-minimized'
    }
  };
  return constants;
});
