text: // 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.
  
  import app from "../../app";
  import FauxtonAPI from "../../core/api";
  
  import ReactComponentsActions from "../components/actions";
  
  
  // sequence info is an array in couchdb2 with two indexes. On couch 1.x, it's just a string / number
  const getSeqNum = (val) => {
    return _.isArray(val) ? val[1] : val;
  };
  
  const getNewButtonLinks = (databaseName, partitionKey) => {
    const addLinks = FauxtonAPI.getExtensions('sidebar:links');
    const newUrlPrefix = '#' + FauxtonAPI.urls('databaseBaseURL', 'app', FauxtonAPI.url.encode(databaseName));
    let partitionKeyComponent = '';
    let partitionKeyQueryParam = '';
    if (partitionKey) {
      partitionKeyComponent = '/_partition/' + encodeURIComponent(partitionKey);
      partitionKeyQueryParam = '?partitionKey=' + encodeURIComponent(partitionKey);
    }
  
    const addNewLinks = addLinks.reduce((menuLinks, link) => {
      menuLinks.push({
        title: link.title,
        url: newUrlPrefix + partitionKeyComponent + '/' + link.url,
        icon: 'fonticon-plus-circled'
      });
  
      return menuLinks;
    }, [{
      title: 'New Doc',
      url: newUrlPrefix + '/_new' + partitionKeyQueryParam,
      icon: 'fonticon-plus-circled'
    }, {
      title: 'New View',
      url: newUrlPrefix + partitionKeyComponent + '/new_view',
      icon: 'fonticon-plus-circled'
    }, getMangoLink(databaseName, partitionKey)]);
  
    return [{
      title: 'Add New',
      links: addNewLinks
    }];
  };
  
  const getMangoLink = (databaseName, partitionKey) => {
    const newUrlPrefix = '#' + FauxtonAPI.urls('databaseBaseURL', 'app', FauxtonAPI.url.encode(databaseName)) +
      (partitionKey ? '/_partition/' + encodeURIComponent(partitionKey) : '');
  
    return {
      title: app.i18n.en_US['new-mango-index'],
      url: newUrlPrefix + '/_index',
      icon: 'fonticon-plus-circled'
    };
  };
  
  const parseJSON = (str) => {
    return JSON.parse('"' + str + '"');   // this ensures newlines are converted
  };
  
  const getModifyDatabaseLinks = (databaseName) => {
    return [{
      title: 'Replicate Database',
      icon: 'fonticon-replicate',
      url: FauxtonAPI.urls('replication', 'app', databaseName)
    }, {
      title: 'Delete',
      icon: 'fonticon-trash',
      onClick: ReactComponentsActions.showDeleteDatabaseModal.bind(this, {showDeleteModal: true, dbId: databaseName})
    }];
  };
  
  const truncateDoc = (docString, maxRows) => {
    let lines = docString.split('\n');
    let isTruncated = false;
    if (lines.length > maxRows) {
      isTruncated = true;
      lines = lines.slice(0, maxRows);
      docString = lines.join('\n');
    }
    return {
      isTruncated: isTruncated,
      content: docString
    };
  };
  
  const getNewDocUrl = (databaseName, partitionKey) => {
    const safeDatabaseName = encodeURIComponent(databaseName);
    let url = FauxtonAPI.urls('new', 'newDocument', safeDatabaseName);
    if (partitionKey) {
      url = url + '?partitionKey=' + encodeURIComponent(partitionKey);
    }
    return url;
  };
  
  const selectedViewContainsReduceFunction = (designDocs, selectedNavItem) => {
    if (!selectedNavItem) {
      return false;
    }
  
    let showReduce = false;
    // If a map/reduce view is selected, check if view contains reduce field
    if (designDocs && isViewSelected(selectedNavItem)) {
      const ddocID = '_design/' + selectedNavItem.designDocName;
      const ddoc = designDocs.find(ddoc => ddoc._id === ddocID);
      showReduce = ddoc !== undefined && ddoc.views
          && ddoc.views[selectedNavItem.indexName] !== undefined
          && ddoc.views[selectedNavItem.indexName].reduce !== undefined;
    }
    return showReduce;
  };
  
  const isViewSelected = (selectedNavItem) => {
    return (selectedNavItem.navItem === 'designDoc'
      && selectedNavItem.designDocSection === 'Views'
      && selectedNavItem.indexName);
  };
  
  const isDDocPartitioned = (ddoc, isDbPartitioned) => {
    // By default a design doc is partitioned if the database is partitioned
    let isDDocPartitioned = isDbPartitioned;
    // Check if ddoc is explictly set to not partitioned
    if (isDbPartitioned && ddoc.options && ddoc.options.partitioned === false) {
      isDDocPartitioned = false;
    }
    return isDDocPartitioned;
  };
  
  export default {
    getSeqNum,
    getNewButtonLinks,
    getModifyDatabaseLinks,
    getNewDocUrl,
    isDDocPartitioned,
    parseJSON,
    truncateDoc,
    selectedViewContainsReduceFunction,
    isViewSelected
  };
  