# The API§

### You can play with the picker API to extend and create custom functionality:

    var $input = $('.datepicker').pickadate()

    // Use the picker object directly.
    var picker = $input.pickadate('picker')
    picker.methodName(argument1, argument2, ...)
    picker.objectName

    // Or pass through the element’s plugin data.
    $input.pickadate(methodName, argument1, argument2, ...)
    $input.pickadate(objectName)

For most examples on this page, the date picker is used, but the same API applies to the time picker as well.

## Methods§

There are eleven methods available on the picker:

1. `open`
2. `close`
3. `start`
4. `stop`
5. `render`
6. `clear`
7. `get`
8. `set`
9. `on`
10. `off`
11. `trigger`

All these methods (except `get`) return the picker object and are therefore chainable:

    picker.open().clear().close()...

## Objects§

There are four objects available through the picker:

1. `$node`
2. `$root`
3. `_hidden`
4. `component`

# The Methods§

## Open and Close§

Open and close the picker holder. To check if it’s already open, use the `get` method.

    picker.open()
    picker.close()

    // If a “click” is involved, prevent the event bubbling.
    event.stopPropagation()

    // If we want to maintain focus on the input,
    // prevent the default action on “mousedown”.
    event.preventDefault()

### Close with focus§

Close the picker while keeping focus on the `input` element by passing a truth-y argument.

    picker.close(true)

### Open without focus§

Open the picker without focusing onto the `input` element by passing `false` as the first argument. Opening the picker this way, there’s a few things to note:

(1) The only way to close it is with a separate custom binding – in this example, on document click.

(2) The “opening” events are still triggered – however, using the `get` method to see if the picker is open will return `false`.

(3) If any of the picker elements is focused/clicked, it resumes normal behavior.

    picker.open(false)
    $(document).on('click', function() {
        picker.close()
    })

## Start and Stop§

Destroy and rebuild the picker. To check if it’s already started, use the `get` method.

    picker.stop()
    picker.start()

Destroying the picker also clears any events’ callbacks bound on it.

## Render§

Refresh the picker after adding something to the holder.

    picker.render()

By default, only the “face” of the picker (i.e. the `box` element), has it’s contents re-rendered. To render the entire picker from the `root` up, pass `true` as the first argument:

    picker.render(true)

## Clear§

Clear the value in the picker’s `input` element.

    picker.clear()

This is a shorthand that uses the `set` method behind the scenes.

## Get§

Get the properties, objects, and states of the picker.

    picker.get(thing)

The `thing` argument is an optional string and can be one of the following:

- `value` (default)
- `select` *
- `highlight` *
- `view` *
- `min` *
- `max` *
- `open`
- `start`
- `id`
- `disable`
- `enable`

### * Item Objects§

The `thing`s denoted in the list above with an asterisk (*) return a picker item object that can be formatted by passing a second string argument using the date or time formatting rules:

    picker.get(thing, format)

Each “date” or “time” within the picker has an item object accompanying it behind the scenes.

Here’s a date picker item object for 20 April, 2013:

    {
        // The full year.
        year: 2013,

        // The month with zero-as-index.
        month: 3,

        // The date of the month.
        date: 20,

        // The day of the week with zero-as-index.
        day: 6,

        // The underlying JavaScript Date object.
        obj: { 'Sat, 20 Apr 2013 04:00:00 GMT' },

        // The “pick” value used for comparisons.
        pick: 1366430400000
    }

Here’s a time picker item object for 4:20 PM:

    {
        // Hour of the day from 0 to 23.
        hour: 16,

        // The minutes of the hour from 0 to 59 (based on the interval).
        mins: 20,

        // The “pick” value used for comparisons.
        pick: 980
    }

## Get `value`§

Returns the string value of the picker’s `input` element.

    picker.get() // Short for `picker.get('value')`.

## Get `select`§

Returns the item object or formatted string of the date that is visually selected.

Defaults to `null` when there’s no `value`.

    picker.get('select')
    picker.get('select', 'yyyy/mm/dd')

## Get `highlight`§

Returns the item object or formatted string of the date that is visually highlighted.

Defaults to “today” (or “now” for the time picker) when there’s no `value`.

    picker.get('highlight')
    picker.get('highlight', 'yyyy/mm/dd')

## Get `view`§

Returns the item object or formatted string of the date that determines the current view.

Defaults to the first day of the current month (or “now” for the time picker) when there’s no `value`.

    picker.get('view')
    picker.get('view', 'yyyy/mm/dd')

## Get `min`§

Returns the item object or formatted string of the date that determines the lower limit.

Defaults to a `-Infinity` item object when it is not explicitly set in the options or through the picker’s API.

    picker.get('min')
    picker.get('min', 'yyyy/mm/dd')

## Get `max`§

Returns the item object or formatted string of the date that determines the upper limit.

Defaults to an `Infinity` item object when it is not explicitly set in the options or through the picker’s API.

    picker.get('max')
    picker.get('max', 'yyyy/mm/dd')

## Get `open`§

Returns a boolean value of whether the picker is open or not.

    picker.get('open')

## Get `start`§

Returns a boolean value of whether the picker has started or not.

    picker.get('start')

## Get `id`§

Returns a unique string that is the ID of the picker and it’s element. If the element has no ID, it is set to something random.

    picker.get('id')

## Get `disable` and `enable`§

Both these things work together to determine which item objects to disable on the picker:

    // Array passed in options to disable dates
    var datesToDisable = [ 1, 4, 7, [2013,3,8], [2013,3,19], new Date(2013,3,26) ]

    // Returns `1` to represent a base “enabled” state
    picker.get('enable')

    // Returns the collection of dates to disable
    picker.get('disable')

However, when all dates are disabled and a select few are enabled, it behaves differently:

    // Array passed in options to disable all dates except a few
    var datesToDisable = [ true, 1, 4, 7, [2013,3,8], [2013,3,19], new Date(2013,3,26) ]

    // Returns `-1` to represent a base “flipped” state
    picker.get('enable')

    // Returns the collection of dates to *not* disable
    picker.get('disable')

## Set§

Set the properties, objects, and states of the picker.

    // One at a time
    picker.set(thing, value)

    // Multiple at once
    picker.set({
        thing: value,
        thing: value,
        thing: value
    })

The `value` is based on the `thing` being set. The `thing`, is a string that can be:

- `clear`
- `select` *
- `highlight` *
- `view`
- `min` *
- `max` *
- `disable` *
- `enable` *
- `interval` (time picker only) *

### * cascading changes§

When the `thing`s denoted in the list above with an asterisk (*) are set, they cascade into updating other things using the same value.

### muted callbacks§

By default, any callbacks bound with the `on` method will be fired when it’s relevant `thing` is set. To silenty set a `thing`, pass an options object with the `muted` parameter set to `true`:

    // One at a time
    picker.set(thing, value, { muted: true })

    // Multiple at once
    picker.set({
        thing: value,
        thing: value,
        thing: value
    }, { muted: true })

## Set `clear`§

Clear the value in the picker’s `input` element.

    picker.set('clear')

This is the full form of the `clear` method.

## Set `select`§

Setting `select` has cascading changes that update the `highlight`, the `view`, and the value of the `input` element based on the settings `format`.

### Select a date item object§

    // Using arrays formatted as [YEAR,MONTH,DATE].
    picker.set('select', [2013,3,20])

    // Using JavaScript Date objects.
    picker.set('select', new Date(2013, 3, 30))

    // Using positive integers as UNIX timestamps.
    picker.set('select', 1366898887654)

    // Using a string along with the parsing format (defaults to `format` option).
    picker.set('select', '2014-04-20', { format: 'yyyy-mm-dd' })

### Select a time item object§

    // Using arrays formatted as [HOUR,MINUTE].
    picker.set('select', [3,0])

    // Using JavaScript Date objects.
    picker.set('select', new Date(2013, 3, 20, 10, 30))

    // Using positive integers as minutes.
    picker.set('select', 540)

    // Using a string along with the parsing format (defaults to `format` option).
    picker.set('select', '04-30', { format: 'hh-i' })

## Set `highlight`§

Setting `highlight` has a cascading change that updates the item object that sets the `view` of the picker.

### Highlight a date item object§

    // Using arrays formatted as [YEAR,MONTH,DATE].
    picker.set('highlight', [2013,3,20])

    // Using JavaScript Date objects.
    picker.set('highlight', new Date(2013, 3, 30))

    // Using positive integers as UNIX timestamps.
    picker.set('highlight', 1366898887654)

    // Using a string along with the parsing format (defaults to `format` option).
    picker.set('highlight', '2014-04-20', { format: 'yyyy-mm-dd' })

### Highlight a time item object§

    // Using arrays formatted as [HOUR,MINUTE].
    picker.set('highlight', [15,30])

    // Using JavaScript Date objects.
    picker.set('highlight', new Date(2013, 3, 20, 10, 30))

    // Using positive integers as minutes.
    picker.set('highlight', 1080)

    // Using a string along with the parsing format (defaults to `format` option).
    picker.set('highlight', '04-30', { format: 'hh-i' })

## Set `view`§

Setting `view` has no cascading changes and the `highlight` remains unaffected.

### Viewset a date item object§

The `value` passed gets normalized to the first date of the month to bring into view.

    // Using arrays formatted as [YEAR,MONTH,DATE].
    picker.set('view', [2000,3,20])

    // Using JavaScript Date objects.
    picker.set('view', new Date(1988,7,14))

    // Using positive integers as UNIX timestamps.
    picker.set('view', 1587355200000)

    // Using a string along with the parsing format (defaults to `format` option).
    picker.set('view', '2014-04-20', { format: 'yyyy-mm-dd' })

### Viewset a time item object§

    // Using arrays formatted as [HOUR,MINUTE].
    picker.set('view', [15,30])

    // Using JavaScript Date objects.
    picker.set('view', new Date(2013, 3, 20, 10, 30))

    // Using positive integers as minutes.
    picker.set('view', 1080)

    // Using a string along with the parsing format (defaults to `format` option).
    picker.set('view', '04-30', { format: 'hh-i' })

## Set `min`§

Setting `min` has cascading changes on the `select`, `highlight`, and `view` only when the particular item object goes out of range.

### Limit the min date §

    // Using arrays formatted as [YEAR,MONTH,DATE].
    picker.set('min', [2013,3,20])

    // Using JavaScript Date objects.
    picker.set('min', new Date(2013,7,14))

    // Using formatted strings.
    picker.set('min', '8 January, 2014'))

    // Using integers as days relative to today.
    picker.set('min', -4)

    // Using `true` for “today”.
    picker.set('min', true)

    // Using `false` to remove.
    picker.set('min', false)

### Limit the min time §

    // Using arrays formatted as [HOUR,MINUTE].
    picker.set('min', [15,30])

    // Using JavaScript Date objects.
    picker.set('min', new Date(2013, 3, 20, 10, 30))

    // Using formatted strings.
    picker.set('min', '4:30 PM'))

    // Using integers as intervals relative from now.
    picker.set('min', -4)

    // Using `true` for “now”.
    picker.set('min', true)

    // Using `false` to remove.
    picker.set('min', false)

## Set `max`§

Setting `max` has cascading changes on the `select`, `highlight`, and `view` only when the particular item object goes out of range.

### Limit the max date §

    // Using arrays formatted as [YEAR,MONTH,DATE].
    picker.set('max', [2013,3,20])

    // Using JavaScript Date objects.
    picker.set('max', new Date(2013,7,14))

    // Using formatted strings.
    picker.set('max', '20 April, 2016'))

    // Using integers as days relative to today.
    picker.set('max', 4)

    // Using `true` for “today”.
    picker.set('max', true)

    // Using `false` to remove.
    picker.set('max', false)

### Limit the max time §

    // Using arrays formatted as [HOUR,MINUTE].
    picker.set('max', [15,30])

    // Using JavaScript Date objects.
    picker.set('max', new Date(2013, 3, 20, 10, 30))

    // Using formatted strings.
    picker.set('max', '11:30 AM'))

    // Using integers as intervals relative from now.
    picker.set('max', 4)

    // Using `true` for “now”.
    picker.set('max', true)

    // Using `false` to remove.
    picker.set('max', false)

## Set `disable` and `enable`§

Setting `disable` or `enable` has cascading changes on the `select`, `highlight`, and `view` only when the currently selected item object becomes disabled.

An important thing to note here is that “setting” something as enabled or disabled adds the new elements to the collection of items to disable rather than completely replacing them with the new collection.

### Disable/enable dates §

You can disable sets of dates and then enable the entire set or specific dates within those sets by the following methods:

- Specific dates:

      picker.set('disable', [

          // Using a collection of arrays formatted as [YEAR,MONTH,DATE]
          [2014,9,3], [2014,9,9], [2014,9,20],

          // Using JavaScript Date objects
          new Date(2013,9,13), new Date(2013,9,24)
      ])
      picker.set('enable', [
          [2014,9,9],
          [2014,9,13],
          new Date(2013,9,20)
      ])

- Ranges of dates:

      picker.set('disable', [

          // Using integers as the days of the week (1 to 7)
          1, 4, 7,

          // Using a range object with a “from” and “to” property
          { from: [2014,2,14], to: [2014,2,27] }
      ])
      picker.set('enable', [
          4,
          { from: [2014,2,24], to: [2014,2,27] }
      ])

- “Flip” the enabled and disabled dates:

      picker.set('disable', 'flip')
      picker.set('enable', 'flip')

- All the dates:

      // Disable all the dates
      picker.set('disable', true)
      picker.set('enable', false)

      // Enable all the dates
      picker.set('enable', true)
      picker.set('disable', false)

### Disable/enable times §

You can disable sets of times and then enable the entire set or specific times within those sets by the following methods:

- Specific times:

      picker.set('disable', [

          // Using a collection of arrays formatted as [HOUR,MINUTES]
          [2,30], [4,30], [9,0],

          // Using JavaScript Date objects
          new Date(2013,9,13,6), new Date(2013,9,13,12,30)
      ])
      picker.set('enable', [
          [4,30], [6,0],
          new Date(2013,9,13,9)
      ])

- Ranges of times:

      picker.set('disable', [

          // Using integers as hours of the day (from 0 to 23)
          1, 4, 7,

          // Using a range object with a “from” and “to” property
          { from: [10,30], to: [18,0] }
      })
      picker.set('enable', [
          4,
          { from: [14,0], to: [16,30] }
      ])

- “Flip” the enabled and disabled times:

      picker.set('disable', 'flip')
      picker.set('enable', 'flip')

- All the times:

      // Disable all the times
      picker.set('disable', true)
      picker.set('enable', true)

      // Enable all the dates
      picker.set('enable', true)
      picker.set('disable', false)

### Enable an element within a disabled range §

When a date or time you want to enable falls within a disabled range, add the `inverted` property to the item:

    picker.set('disable', [

        // Disable all Mondays, except November 17th, 2013.
        1, [2013, 10, 17, 'inverted'],

        // Disable all dates from March 2nd, 2014 to March 28th, 2014
        // except for March 10th and all between March 14th and March 23rd.
        { from: [2014, 2, 2], to: [2014, 2, 28] },
        [2014, 2, 10, 'inverted'],
        { from: [2014, 2, 14], to: [2014, 2, 23], inverted: true }
    ])

    picker.set('disable', [

        // Disable all times from 1:00 AM to 1:59 AM, except 1:30 AM.
        1, [1, 30, 'inverted'],

        // Disable all times from 3:00 AM to 6:00 PM except
        // for 4:30 AM and all between 7:30 AM and 11:30 AM.
        { from: [3,0], to: [18,0] },
        [4, 30, 'inverted'],
        { from: [7,30], to: [11,30], inverted: true }
    ])

## Set `interval`§

For the time picker only, you can change the interval between each time display.

Setting `interval` has cascading changes on the `select`, `highlight`, and `view` only when the particular item object goes out of range.

    // Using integers representing the interval length in minutes
    picker.set('interval', 15)
    picker.set('interval', 20)
    picker.set('interval', 120)

# The Events and Callbacks§

## Event `on`§

Bind callbacks to get fired off when the relative picker method is called (unless if the callback is “muted”):

    // One at a time
    picker.on(methodName, function() { … })

    // Multiple at once
    picker.on({
        methodName: function() { … },
        methodName: function() { … },
        methodName: function() { … }
    })

The `methodName` can be `open`, `close`, `render`, `start`, `stop`, or `set`.

Within scope of these callbacks, `this` refers to the picker object – and for most events, no arguments are passed.

The only exception is the `set` method, which is passed an argument that provides more context as to what is being “set”.

### Event callbacks as bindings§

After the picker has been initiated, callbacks to events can be set using the `on` method:

    picker.on({
        open: function() {
            console.log('Opened up!')
        },
        close: function() {
            console.log('Closed now')
        },
        render: function() {
            console.log('Just rendered anew')
        },
        stop: function() {
            console.log('See ya')
        },
        set: function(thingSet) {
            console.log('Set stuff:', thingSet)
        }
    })

Since these callbacks can only be bound after the picker has started, the `'start'` event cannot be given a callback this way. To do that, it must be passed as an option.

### Event callbacks as options§

Before the picker has initiated, callbacks to events can be set by passing them as options when invoking the picker:

    $('.datepicker').pickadate({
        onOpen: function() {
            console.log('Opened up!')
        },
        onClose: function() {
            console.log('Closed now')
        },
        onRender: function() {
            console.log('Just rendered anew')
        },
        onStart: function() {
            console.log('Hello there :)')
        },
        onStop: function() {
            console.log('See ya')
        },
        onSet: function(thingSet) {
            console.log('Set stuff:', thingSet)
        }
    })

## Event `off`§

Unbind callbacks that are bound using the `on` method:

    picker.off(methodName, methodName, methodName, ...)

The `methodName` can be `open`, `close`, `render`, `start`, `stop`, or `set`.

    picker.on('open', function() {
        console.log('Even when I’m opened, I’m not logged..')
    })
    picker.off('open')

## Event `trigger`§

Trigger an event’s callbacks that have been queued up:

    picker.on('open', function() {
        console.log('This logs without opening!')
    })
    picker.trigger('open')

Note: this doesn’t actually invoke the method; it only triggers the callback. Similar to jQuery’s `triggerHandler` method.

Optionally, you can also pass some data to the method being triggered:

    picker.on('open', function(data) {
        console.log('This logs without opening with this data:', data)
    })
    picker.trigger('open', { some: 'value' })

# The Objects§

## Object `$node`§

This is the picker’s relative `input` element wrapped as a jQuery object.

    picker.$node

## Object `$root`§

This is the picker’s relative root holder element wrapped as a jQuery object.

    picker.$root

## Object `_hidden`§

This is the picker’s relative hidden element, which is `undefined` if there’s no `formatSubmit` option.

There should be no reason to use this – it’s mostly for internal use. If you have a valid reason for using this, please mention it in the Issues.

## Object `component`§

This is the picker’s relative component constructor that builds the date or time picker. This API is in flux – so avoid using it for now.