text: 'use strict';
  
  var fontAttrs = require('../../plots/font_attributes');
  var colorAttrs = require('../../components/color/attributes');
  var axesAttrs = require('../../plots/cartesian/layout_attributes');
  var overrideAll = require('../../plot_api/edit_types').overrideAll;
  
  var docs = require('../../constants/docs');
  var FORMAT_LINK = docs.FORMAT_LINK;
  var DATE_FORMAT_LINK = docs.DATE_FORMAT_LINK;
  
  module.exports = {
      color: {
          valType: 'color',
          editType: 'calc',
          description: [
              'Sets default for all colors associated with this axis',
              'all at once: line, font, tick, and grid colors.',
              'Grid color is lightened by blending this with the plot background',
              'Individual pieces can override this.'
          ].join(' ')
      },
      smoothing: {
          valType: 'number',
          dflt: 1,
          min: 0,
          max: 1.3,
          editType: 'calc'
      },
      title: {
          text: {
              valType: 'string',
              dflt: '',
              editType: 'calc',
              description: [
                  'Sets the title of this axis.',
                  'Note that before the existence of `title.text`, the title\'s',
                  'contents used to be defined as the `title` attribute itself.',
                  'This behavior has been deprecated.'
              ].join(' ')
          },
          font: fontAttrs({
              editType: 'calc',
              description: [
                  'Sets this axis\' title font.',
                  'Note that the title\'s font used to be set',
                  'by the now deprecated `titlefont` attribute.'
              ].join(' ')
          }),
          // TODO how is this different than `title.standoff`
          offset: {
              valType: 'number',
              dflt: 10,
              editType: 'calc',
              description: [
                  'An additional amount by which to offset the title from the tick',
                  'labels, given in pixels.',
                  'Note that this used to be set',
                  'by the now deprecated `titleoffset` attribute.'
              ].join(' '),
          },
          editType: 'calc',
      },
      type: {
          valType: 'enumerated',
          // '-' means we haven't yet run autotype or couldn't find any data
          // it gets turned into linear in gd._fullLayout but not copied back
          // to gd.data like the others are.
          values: ['-', 'linear', 'date', 'category'],
          dflt: '-',
          editType: 'calc',
          description: [
              'Sets the axis type.',
              'By default, plotly attempts to determined the axis type',
              'by looking into the data of the traces that referenced',
              'the axis in question.'
          ].join(' ')
      },
      autotypenumbers: axesAttrs.autotypenumbers,
      autorange: {
          valType: 'enumerated',
          values: [true, false, 'reversed'],
          dflt: true,
          editType: 'calc',
          description: [
              'Determines whether or not the range of this axis is',
              'computed in relation to the input data.',
              'See `rangemode` for more info.',
              'If `range` is provided, then `autorange` is set to *false*.'
          ].join(' ')
      },
      rangemode: {
          valType: 'enumerated',
          values: ['normal', 'tozero', 'nonnegative'],
          dflt: 'normal',
          editType: 'calc',
          description: [
              'If *normal*, the range is computed in relation to the extrema',
              'of the input data.',
              'If *tozero*`, the range extends to 0,',
              'regardless of the input data',
              'If *nonnegative*, the range is non-negative,',
              'regardless of the input data.'
          ].join(' ')
      },
      range: {
          valType: 'info_array',
          editType: 'calc',
          items: [
              {valType: 'any', editType: 'calc'},
              {valType: 'any', editType: 'calc'}
          ],
          description: [
              'Sets the range of this axis.',
              'If the axis `type` is *log*, then you must take the log of your',
              'desired range (e.g. to set the range from 1 to 100,',
              'set the range from 0 to 2).',
              'If the axis `type` is *date*, it should be date strings,',
              'like date data, though Date objects and unix milliseconds',
              'will be accepted and converted to strings.',
              'If the axis `type` is *category*, it should be numbers,',
              'using the scale where each category is assigned a serial',
              'number from zero in the order it appears.'
          ].join(' ')
      },
  
      fixedrange: {
          valType: 'boolean',
          dflt: false,
          editType: 'calc',
          description: [
              'Determines whether or not this axis is zoom-able.',
              'If true, then zoom is disabled.'
          ].join(' ')
      },
      cheatertype: {
          valType: 'enumerated',
          values: ['index', 'value'],
          dflt: 'value',
          editType: 'calc'
      },
      tickmode: {
          valType: 'enumerated',
          values: ['linear', 'array'],
          dflt: 'array',
          editType: 'calc'
      },
      nticks: {
          valType: 'integer',
          min: 0,
          dflt: 0,
          editType: 'calc',
          description: [
              'Specifies the maximum number of ticks for the particular axis.',
              'The actual number of ticks will be chosen automatically to be',
              'less than or equal to `nticks`.',
              'Has an effect only if `tickmode` is set to *auto*.'
          ].join(' ')
      },
      tickvals: {
          valType: 'data_array',
          editType: 'calc',
          description: [
              'Sets the values at which ticks on this axis appear.',
              'Only has an effect if `tickmode` is set to *array*.',
              'Used with `ticktext`.'
          ].join(' ')
      },
      ticktext: {
          valType: 'data_array',
          editType: 'calc',
          description: [
              'Sets the text displayed at the ticks position via `tickvals`.',
              'Only has an effect if `tickmode` is set to *array*.',
              'Used with `tickvals`.'
          ].join(' ')
      },
      showticklabels: {
          valType: 'enumerated',
          values: ['start', 'end', 'both', 'none'],
          dflt: 'start',
          editType: 'calc',
          description: [
              'Determines whether axis labels are drawn on the low side,',
              'the high side, both, or neither side of the axis.'
          ].join(' ')
      },
      tickfont: fontAttrs({
          editType: 'calc',
          description: 'Sets the tick font.'
      }),
      tickangle: {
          valType: 'angle',
          dflt: 'auto',
          editType: 'calc',
          description: [
              'Sets the angle of the tick labels with respect to the horizontal.',
              'For example, a `tickangle` of -90 draws the tick labels',
              'vertically.'
          ].join(' ')
      },
      tickprefix: {
          valType: 'string',
          dflt: '',
          editType: 'calc',
          description: 'Sets a tick label prefix.'
      },
      showtickprefix: {
          valType: 'enumerated',
          values: ['all', 'first', 'last', 'none'],
          dflt: 'all',
          editType: 'calc',
          description: [
              'If *all*, all tick labels are displayed with a prefix.',
              'If *first*, only the first tick is displayed with a prefix.',
              'If *last*, only the last tick is displayed with a suffix.',
              'If *none*, tick prefixes are hidden.'
          ].join(' ')
      },
      ticksuffix: {
          valType: 'string',
          dflt: '',
          editType: 'calc',
          description: 'Sets a tick label suffix.'
      },
      showticksuffix: {
          valType: 'enumerated',
          values: ['all', 'first', 'last', 'none'],
          dflt: 'all',
          editType: 'calc',
          description: 'Same as `showtickprefix` but for tick suffixes.'
      },
      showexponent: {
          valType: 'enumerated',
          values: ['all', 'first', 'last', 'none'],
          dflt: 'all',
          editType: 'calc',
          description: [
              'If *all*, all exponents are shown besides their significands.',
              'If *first*, only the exponent of the first tick is shown.',
              'If *last*, only the exponent of the last tick is shown.',
              'If *none*, no exponents appear.'
          ].join(' ')
      },
      exponentformat: {
          valType: 'enumerated',
          values: ['none', 'e', 'E', 'power', 'SI', 'B'],
          dflt: 'B',
          editType: 'calc',
          description: [
              'Determines a formatting rule for the tick exponents.',
              'For example, consider the number 1,000,000,000.',
              'If *none*, it appears as 1,000,000,000.',
              'If *e*, 1e+9.',
              'If *E*, 1E+9.',
              'If *power*, 1x10^9 (with 9 in a super script).',
              'If *SI*, 1G.',
              'If *B*, 1B.'
          ].join(' ')
      },
      minexponent: {
          valType: 'number',
          dflt: 3,
          min: 0,
          editType: 'calc',
          description: [
              'Hide SI prefix for 10^n if |n| is below this number'
          ].join(' ')
      },
      separatethousands: {
          valType: 'boolean',
          dflt: false,
          editType: 'calc',
          description: [
              'If "true", even 4-digit integers are separated'
          ].join(' ')
      },
      tickformat: {
          valType: 'string',
          dflt: '',
          editType: 'calc',
          description: [
              'Sets the tick label formatting rule using d3 formatting mini-languages',
              'which are very similar to those in Python. For numbers, see:',
              FORMAT_LINK,
              'And for dates see:',
              DATE_FORMAT_LINK,
              'We add one item to d3\'s date formatter: *%{n}f* for fractional seconds',
              'with n digits. For example, *2016-10-13 09:15:23.456* with tickformat',
              '*%H~%M~%S.%2f* would display *09~15~23.46*'
          ].join(' ')
      },
      tickformatstops: overrideAll(axesAttrs.tickformatstops, 'calc', 'from-root'),
      categoryorder: {
          valType: 'enumerated',
          values: [
              'trace', 'category ascending', 'category descending', 'array'
              /* , 'value ascending', 'value descending'*/ // value ascending / descending to be implemented later
          ],
          dflt: 'trace',
          editType: 'calc',
          description: [
              'Specifies the ordering logic for the case of categorical variables.',
              'By default, plotly uses *trace*, which specifies the order that is present in the data supplied.',
              'Set `categoryorder` to *category ascending* or *category descending* if order should be determined by',
              'the alphanumerical order of the category names.',
              /* 'Set `categoryorder` to *value ascending* or *value descending* if order should be determined by the',
              'numerical order of the values.',*/ // // value ascending / descending to be implemented later
              'Set `categoryorder` to *array* to derive the ordering from the attribute `categoryarray`. If a category',
              'is not found in the `categoryarray` array, the sorting behavior for that attribute will be identical to',
              'the *trace* mode. The unspecified categories will follow the categories in `categoryarray`.'
          ].join(' ')
      },
      categoryarray: {
          valType: 'data_array',
          editType: 'calc',
          description: [
              'Sets the order in which categories on this axis appear.',
              'Only has an effect if `categoryorder` is set to *array*.',
              'Used with `categoryorder`.'
          ].join(' ')
      },
      labelpadding: {
          valType: 'integer',
          dflt: 10,
          editType: 'calc',
          description: 'Extra padding between label and the axis'
      },
      labelprefix: {
          valType: 'string',
          editType: 'calc',
          description: 'Sets a axis label prefix.'
      },
      labelsuffix: {
          valType: 'string',
          dflt: '',
          editType: 'calc',
          description: 'Sets a axis label suffix.'
      },
      // lines and grids
      showline: {
          valType: 'boolean',
          dflt: false,
          editType: 'calc',
          description: [
              'Determines whether or not a line bounding this axis is drawn.'
          ].join(' ')
      },
      linecolor: {
          valType: 'color',
          dflt: colorAttrs.defaultLine,
          editType: 'calc',
          description: 'Sets the axis line color.'
      },
      linewidth: {
          valType: 'number',
          min: 0,
          dflt: 1,
          editType: 'calc',
          description: 'Sets the width (in px) of the axis line.'
      },
      gridcolor: {
          valType: 'color',
          editType: 'calc',
          description: 'Sets the axis line color.'
      },
      gridwidth: {
          valType: 'number',
          min: 0,
          dflt: 1,
          editType: 'calc',
          description: 'Sets the width (in px) of the axis line.'
      },
      showgrid: {
          valType: 'boolean',
          dflt: true,
          editType: 'calc',
          description: [
              'Determines whether or not grid lines are drawn.',
              'If *true*, the grid lines are drawn at every tick mark.'
          ].join(' ')
      },
      minorgridcount: {
          valType: 'integer',
          min: 0,
          dflt: 0,
          editType: 'calc',
          description: 'Sets the number of minor grid ticks per major grid tick'
      },
      minorgridwidth: {
          valType: 'number',
          min: 0,
          dflt: 1,
          editType: 'calc',
          description: 'Sets the width (in px) of the grid lines.'
      },
      minorgridcolor: {
          valType: 'color',
          dflt: colorAttrs.lightLine,
          editType: 'calc',
          description: 'Sets the color of the grid lines.'
      },
      startline: {
          valType: 'boolean',
          editType: 'calc',
          description: [
              'Determines whether or not a line is drawn at along the starting value',
              'of this axis.',
              'If *true*, the start line is drawn on top of the grid lines.'
          ].join(' ')
      },
      startlinecolor: {
          valType: 'color',
          editType: 'calc',
          description: 'Sets the line color of the start line.'
      },
      startlinewidth: {
          valType: 'number',
          dflt: 1,
          editType: 'calc',
          description: 'Sets the width (in px) of the start line.'
      },
      endline: {
          valType: 'boolean',
          editType: 'calc',
          description: [
              'Determines whether or not a line is drawn at along the final value',
              'of this axis.',
              'If *true*, the end line is drawn on top of the grid lines.'
          ].join(' ')
      },
      endlinewidth: {
          valType: 'number',
          dflt: 1,
          editType: 'calc',
          description: 'Sets the width (in px) of the end line.'
      },
      endlinecolor: {
          valType: 'color',
          editType: 'calc',
          description: 'Sets the line color of the end line.'
      },
      tick0: {
          valType: 'number',
          min: 0,
          dflt: 0,
          editType: 'calc',
          description: 'The starting index of grid lines along the axis'
      },
      dtick: {
          valType: 'number',
          min: 0,
          dflt: 1,
          editType: 'calc',
          description: 'The stride between grid lines along the axis'
      },
      arraytick0: {
          valType: 'integer',
          min: 0,
          dflt: 0,
          editType: 'calc',
          description: 'The starting index of grid lines along the axis'
      },
      arraydtick: {
          valType: 'integer',
          min: 1,
          dflt: 1,
          editType: 'calc',
          description: 'The stride between grid lines along the axis'
      },
  
      _deprecated: {
          title: {
              valType: 'string',
              editType: 'calc',
              description: [
                  'Deprecated in favor of `title.text`.',
                  'Note that value of `title` is no longer a simple',
                  '*string* but a set of sub-attributes.'
              ].join(' ')
          },
          titlefont: fontAttrs({
              editType: 'calc',
              description: 'Deprecated in favor of `title.font`.'
          }),
          titleoffset: {
              valType: 'number',
              dflt: 10,
              editType: 'calc',
              description: 'Deprecated in favor of `title.offset`.'
          }
      },
  
      editType: 'calc'
  };
  