// Type definitions for jquery.dynatable v0.3.1
// Project: http://www.dynatable.com/
// Definitions by: François Massart <https://github.com/francoismassart/>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped

/// <reference path="../jquery/jquery.d.ts" />

interface JQuery {
    /**
    * @constructor
    */
    dynatable: JQueryDynatable.Dynatable;
}

/** Static members of jQuery (those on $ and jQuery themselves) */
interface JQueryStatic {
    /**
     * Global dynatable plugin setting defaults
     *
     * @param options The configuration options to be set globally
     */
    dynatableSetup(options: JQueryDynatable.Options): void;
}

declare namespace JQueryDynatable {
    interface Features {
        /**
         * Enable the pagination feature
         *
         * @default true
         */
        paginate?: boolean;
        /**
         * Enable the sorting feature
         *
         * @default true
         */
        sort?: boolean;
        /**
         * Enable the pushState feature
         * Used to update the page URL parameters and cache the query result for the browser's forward- and back-buttons
         *
         * @default true
         */
        pushState?: boolean;
        /**
         * Enable the search feature
         *
         * @default true
         */
        search?: boolean;
        /**
         * Enable the recordCount feature
         * When pagination is enabled, dynatable will also show the currently displayed records and the total number of records
         *
         * @default true
         */
        recordCount?: boolean;
        /**
         * Enable the perPageSelect feature
         * The perPageSelect will insert a form control filled with the options from `perPageOptions`
         *
         * @default true
         */
        perPageSelect?: boolean;
    }
    interface Column {
        index: number;
        label: string;
        /**
         * Determined by the `data-dynatable-column` or using the `defaultColumnIdStyle`
         *
         * @example
         * // Using the `defaultColumnIdStyle` of `camelCase`
         * // `<th>Favorite Music</th>` would be translated into the id `favoriteMusic`
         */
        id: string;
        /**
         * Function that returns the cell data to be written inside the cell
         *
         * @param record A data object representing the current line of data
         * @return The data for the current cell
         *
         * @example
         * function exampleAttributeWriter(record) {
         *     return record[this.id];
         * };
         */
        attributeWriter: (record: any) => any;
        /**
         * Function that interprets the cell html data in order to convert it into data
         *
         * @param cell A html node of the target cell
         * @param record A data object representing the current line of data
         * @return the html content for the current cell
         *
         * @example
         * function exampleAttributeReader(cell, record) {
         *     return $(cell).html();
         * };
         */
        attributeReader: (cell: Element, record: any) => string;
        /** List of ids for sorting, generated by the plugin, can be tweaked by using `data-dynatable-sorts` */
        sorts: Array<string>;
        hidden: boolean;
        /**
         * Detected internally by dynatable.
         * Possible values are:
         *
         * @enum('left', 'right', 'center', 'justify', 'initial', 'inherit')
         */
        textAlign: string;
    }
    interface Table {
        /**
         * By default, dynatable converts headings to JSON attribute names using:
         *
         * @enum('camelCase', 'trimDash', 'dashed', 'underscore', 'lowercase')
         * @default 'camelCase'
         * @see http://www.dynatable.com/#converting-attribute-names
         *
         * @example
         * // Given the html `<th>Favorite Music</th>` column header
         * // `camelCase` would translate it to id `favoriteMusic`
         * // `trimDash` would translate it to id `Favorite-Music`
         * // `dashed` would translate it to id `favorite-music`
         * // `underscore` would translate it to id `favorite_music`
         * // `lowercase` would translate it to id `favorite music`
         */
        defaultColumnIdStyle?: string;
        /** Generated internally by the plugin, will be reset by the DomColumns at init */
        columns?: Array<JQueryDynatable.Column>;
        /**
         * Selector used by dynatable in order to find the table header row
         *
         * @default 'thead tr'
         */
        headRowSelector?: string;
        /**
         * Selector used by dynatable in order to find the table body rows
         *
         * @default 'tbody tr'
         */
        bodyRowSelector?: string;
        /**
         * Optional classname that can be added by dynatable to the header cells
         *
         * @default null
         */
        headRowClass?: string;
    }
    interface Inputs {
        /**
         * Allows you to provide an array of jQuery objects which point to our filter inputs.
         * The inputs musts have a name attribute value matching a columnId in order to work.
         * Input values must strictly match the data from the cell...
         * Searching for "Lux" won't show "Luxembourg" event if it starts if the same letters!
         *
         * @default null
         * @see http://www.dynatable.com/#querying
         *
         * @example
         * $('#search-year')
         */
        queries?: JQuery;
        /**
         * @todo Find out how this `inputs.sorts` setting is useful + show an example
         * @default null
         * @see http://www.dynatable.com/#sorting
         */
        sorts?: any;
        /**
         * Allows you to define the accepted modifier keys to trigger a multisort action
         *
         * @default ['ctrlKey', 'shiftKey', 'metaKey']
         * @see https://en.wikipedia.org/wiki/Modifier_key
         */
        multisort?: Array<string>;
        /**
         * @todo Find out how this `inputs.page` setting is useful + show an example
         * @default null
         */
        page?: any;
        /**
         * The events attached to the search/filtering inputs elements
         *
         * @default 'blur change'
         */
        queryEvent?: string;
        /**
         * The jQuery object pointing to a target where to insert the recordCount html
         *
         * @default null
         *
         * @example
         * $('#chart-status-text')
         */
        recordCountTarget?: JQuery;
        /**
         * Determines where the recordCount is inserted
         *
         * @enum('before', 'after')
         * @default 'after'
         * @see http://api.jquery.com/category/manipulation/dom-insertion-outside/
         */
        recordCountPlacement?: string;
        /**
         * The target inside next to which the pagination block will be inserted (before or after).
         * You can use a selector string, an Element or a JQuery.
         *
         * @default null
         */
        paginationLinkTarget?: string|Element|JQuery;
        /**
         * Determines where the pagination links are inserted
         *
         * @enum('before', 'after')
         * @default 'after'
         * @see http://api.jquery.com/category/manipulation/dom-insertion-outside/
         */
        paginationLinkPlacement?: string;
        /**
         * The classname to be injected on the `<ul>` containing the pagination
         *
         * @default 'dynatable-pagination-links'
         */
        paginationClass?: string;
        /**
         * The classname to be injected on every pagination link
         *
         * @default 'dynatable-page-link'
         */
        paginationLinkClass?: string;
        /**
         * The classname to be injected on the previous page link
         *
         * @default 'dynatable-page-prev'
         */
        paginationPrevClass?: string;
        /**
         * The classname to be injected on the next page link
         *
         * @default 'dynatable-page-next'
         */
        paginationNextClass?: string;
        /**
         * The classname to be injected on the current page link
         *
         * @default 'dynatable-active-page'
         */
        paginationActiveClass?: string;
        /**
         * The classname to be injected on the disabled page links
         *
         * @default 'dynatable-disabled-page'
         */
        paginationDisabledClass?: string;
        /**
         * Text content for the previous page link
         *
         * @default 'Previous'
         */
        paginationPrev?: string;
        /**
         * Text content for the next page link
         *
         * @default 'Next'
         */
        paginationNext?: string;
        /**
         * Define the number of page number links shown inside the pagination
         *
         * @default [1,2,2,1]
         */
        paginationGap?: Array<number>;
        /**
         * The target next to which the search block will be inserted (before or after).
         * You can use a selector string, an Element or a JQuery.
         *
         * @default null
         */
        searchTarget?: string|Element|JQuery;
        /**
         * Determines where the search field is inserted
         *
         * @enum('before', 'after')
         * @default 'before'
         * @see http://api.jquery.com/category/manipulation/dom-insertion-outside/
         */
        searchPlacement?: string;
        /**
         * Text preceding the search field
         *
         * @default 'Search: '
         */
        searchText?: string;
        /**
         * The target next to which the per page pagination block will be inserted (before or after).
         * You can use a selector string, an Element or a jQuery object.
         *
         * @default null
         */
        perPageTarget?: string|Element|JQuery;
        /**
         * Determines where the perPage menu is inserted
         *
         * @enum('before', 'after')
         * @default 'before'
         * @see http://api.jquery.com/category/manipulation/dom-insertion-outside/
         */
        perPagePlacement?: string;
        /**
         * Text content preceding the items per page <select>
         *
         * @default 'Show: '
         */
        perPageText?: string;
        /**
         * Text content introducing the pagination
         *
         * @default 'Pages: '
         */
        pageText?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default '{pageLowerBound} to {pageUpperBound} of'
         */
        recordCountPageBoundTemplate?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default '{recordsShown} of'
         */
        recordCountPageUnboundedTemplate?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default '{recordsQueryCount} {collectionName}'
         */
        recordCountTotalTemplate?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default ' (filtered from {recordsTotal} total records)'
         */
        recordCountFilteredTemplate?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default 'Showing '
         */
        recordCountText?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default '{text} {pageTemplate} {totalTemplate} {filteredTemplate}'
         */
        recordCountTextTemplate?: string;
        /**
         * Text content used inside the recordsCount
         *
         * @default '<span id="dynatable-record-count-{elementId}" class="dynatable-record-count">{textTemplate}</span>'
         */
        recordCountTemplate?: string;
        /**
         * Text content injected inside the processingIndicator
         *
         * @default 'Processing...'
         */
        processingText?: string;
    }
    interface Dataset {
        /**
         * Enable the `ajax` mode
         *
         * @default false
         */
        ajax?: boolean;
        /**
         * A string containing the URL to which the request is sent.
         *
         * @default null
         */
        ajaxUrl?: string;
        /**
         * Defining the `cache` setting for the jQuery's ajax call...
         * true or false for dataType 'script' and 'jsonp'
         *
         * @default null
         * @see http://api.jquery.com/jQuery.ajax
         */
        ajaxCache?: boolean;
        /**
         * Send the ajax request automatically
         *
         * @default false
         */
        ajaxOnLoad?: boolean;
        /**
         * Defining the `method` setting for the jQuery's ajax call...
         * The HTTP method to use for the request (e.g. "POST", "GET", "PUT").
         *
         * @enum('GET', 'POST')
         * @default 'GET'
         * @todo Check if other methods could be used... ('GET', 'PUT', 'HEAD', 'POST', 'PATCH', 'TRACE', 'DELETE', 'CONNECT', 'OPTIONS', 'IS_AWARE', 'IS_EAGER', 'PROPFIND', 'IS_OPTIONAL', 'IS_REQUIRED', 'IS_CONSTRUCTOR', 'IS_INSTANTIATOR')
         */
        ajaxMethod?: string;
        /**
         * The type of data that you're expecting back from the server.
         * If none is specified, jQuery will try to infer it based on the MIME type of the response...
         *
         * @enum('xml', 'html', 'script', 'json', 'jsonp', 'text')
         * @default 'json'
         * @see http://api.jquery.com/jQuery.ajax
         */
        ajaxDataType?: string;
        /**
         * Name of the property in the dataset that contains the total number of records
         *
         * @default null
         */
        totalRecordCount?: string;
        /**
         * Object describing the current request's filtering
         *
         * @default {}
         */
        queries?: Object;
        /**
         * Name of the property in the dataset that contains the total number of records for the current query
         *
         * @default null
         */
        queryRecordCount?: string;
        /**
         * The page represented in the for the current dataset
         *
         * @default null
         */
        page?: number;
        /**
         * The default number of items loaded per page
         *
         * @default 10
         */
        perPageDefault?: number;
        /**
         * The default options available in the perPage menu built by dynatable
         *
         * @default [10,20,50,100]
         */
        perPageOptions?: Array<number>;
        /**
         * Object describing the current request's sorting
         *
         * @default {}
         */
        sorts?: Object;
        /**
         * The sorting keys (generated by dynatable)
         *
         * @default null
         */
        sortsKeys?: Array<string>;
        /**
         * The sorting types (generated by dynatable)
         * It will hosts the type of object to sort (string, number, etc.)
         *
         * @default {}
         */
        sortTypes?: Object;
        /**
         * The core data (generated or loaded by dynatable)
         *
         * @default null
         */
        records?: any;
    }
    interface Writers {
        /**
         * Function that write the data inside each row
         *
         * @param rowIndex The index of the current row (from 0 to the perPage value)
         * @param record A data object containing all the data for the current record (current line)
         * @param columns  An array of columns
         * @param cellWriter A reference to the function responsible for writing inside the cell
         * @return the data for the current cell
         *
         * @default defaultRowWriter
         *
         * @example
         * function exampleRowWriter(rowIndex, record, columns, cellWriter) {
         *     var tr = '';
         *     // grab the record's attribute for each column
         *     for (var i = 0, len = columns.length; i < len; i++) {
         *         tr += cellWriter(columns[i], record);
         *     }
         *     return '<tr>' + tr + '</tr>';
         * };
         */
        _rowWriter?: (rowIndex: number, record: any, columns: Array<Column>, cellWriter: Function) => string;
        /**
         * Function that returns the HTML code that will be injected for the cell
         *
         * @param column The column object describing the config for the current column
         * @param record A data object representing the current line of data
         * @return the data for the current cell
         *
         * @default defaultCellWriter
         *
         * @example
         * function exampleCellWriter(column, record) {
         *     var html = column.attributeWriter(record),
         *     td = '<td';
         *
         *     if (column.hidden || column.textAlign) {
         *         td += ' style="';
         *
         *         // keep cells for hidden column headers hidden
         *         if (column.hidden) {
         *             td += 'display: none;';
         *         }
         *
         *         // keep cells aligned as their column headers are aligned
         *         if (column.textAlign) {
         *             td += 'text-align: ' + column.textAlign + ';';
         *         }
         *
         *         td += '"';
         *     }
         *
         *     return td + '>' + html + '</td>';
         * };
         */
        _cellWriter?: (column: Column, record: any) => string;
        /**
         * Function that returns the cell data to be written inside the cell
         *
         * @param record A data object representing the current line of data
         * @return the data for the current cell
         *
         * @default defaultAttributeWriter
         *
         * @example
         * function exampleAttributeWriter(record) {
         *     // `this` is the column object in settings.columns
         *    return record[this.id];
         * };
         */
        _attributeWriter?: (record: any) => any;
    }
    interface Readers {
        /**
         * Function that interprets the row into data
         *
         * @param index The index of the current row (from 0 to the perPage value)
         * @param thisRef
         * @param record
         * @return the data for the current row
         *
         * @default null
         *
         * @example
         * function exampleRowReader(index, this, record) {
         *     //...
         * };
         */
        _rowReader?: (index: number, thisRef: any, record: any) => any;
        /**
         * Function that interprets the cell into data
         *
         * @param cell A html node of the target cell
         * @param record A data object representing the current line of data
         * @return the data for the current cell
         *
         * @default defaultAttributeReader
         *
         * @example
         * function exampleAttributeReader(cell, record) {
         *    return $(cell).html();
         * };
         */
        _attributeReader?: (cell: Element, record: any) => any;
    }
    interface Params {
        /**
         * @default 'dynatable'
         */
        dynatable?: string;
        /**
         * @default 'queries'
         */
        queries?: string;
        /**
         * @default 'sorts'
         */
        sorts?: string;
        /**
         * @default 'page'
         */
        page?: string;
        /**
         * @default 'perPage'
         */
        perPage?: string;
        /**
         * @default 'offset'
         */
        offset?: string;
        /**
         * @default 'records'
         */
        records?: string;
        /**
         * @default null
         */
        record?: Object;
        /**
         * @default 'queryRecordCount'
         */
        queryRecordCount?: string;
        /**
         * @default 'totalRecordCount'
         */
        totalRecordCount?: string;
    }
    interface Options {
        features?: Features;
        table?: Table;
        inputs?: Inputs;
        dataset?: Dataset;
        writers?: Writers;
        readers?: Readers;
        params?: Params;
    }
    interface DOM {
        /**
         * Manually update the dom with the current record set...
         * This can be useful after multiple calls to `domcolumns.add()` with `skipUpdate` set to true.
         * This way we improve performance by generating the DOM only once.
         */
        update(): void;
    }
    interface DOMColumns {
        /**
         * Add a new column at runtime
         *
         * @param $column A jQuery object containing the html markup for the `th`
         * @param position The position index indicating where we want to insert the new column
         * @param skipAppend A boolean allowing to skip the appending of the column header to table
         * @param skipUpdate A boolean allowing to skip the call to `dom.update()`
         */
        add($column: JQuery, position: number, skipAppend?: boolean, skipUpdate?: boolean): void;
        /**
         * Add several `data-` attributes on the provided `$cell`
         *
         * @param $cell A jQuery object pointing to the target cell
         * @return the modified jQuery object `$cell`
         */
        attachGeneratedAttributes($cell: JQuery): JQuery;
        /**
         * Generate a jQuery object if none is provided and decorate it by calling `attachGeneratedAttributes`
         *
         * @param $cell An optional jQuery object pointing to the target cell
         */
        generate($cell?: JQuery): JQuery;
        /**
         * Parse the table header row, analyse its cells and save the columns.
         *
         * @return Could return an `$.error()` if nothing is found.
         */
        getFromTable(): void|JQuery;
        /** Initializes `settings.table.columns` array and calls `getFromTable()` */
        init(): void;
        /**
         * Check if the `$element` is valid (if it is a `table`)
         *
         * @return A boolean
         */
        initOnLoad(): boolean;
        /**
         * Generate a jQuery object  if none is provided and decorate it by calling `attachGeneratedAttributes`
         *
         * @param columnIndexOrId A number (the column index) or a string (the column id)
         */
        remove(columnIndexOrId: number|string): void;
        /**
         * Remove the column from `settings.table.columns`
         *
         * @param index A number (the column index)
         */
        removeFromArray(index: number): void;
        /**
         * Remove the column from the DOM
         *
         * @param columnId A string matching the id used in `data-dynatable-column` attribute
         */
        removeFromTable(columnId: string): void;
    }
    interface InputsSearch {
        /** Inject the search form at the target location */
        attach(): void;
        /**
         * Build the html markup for the search form
         *
         * @return The jQuery object for the search form
         */
        create(): JQuery;
        /** Call the `attach()` method */
        init(): void;
        /**
         * Check if the search feature is enabled in `settings.features`
         *
         * @return A boolean
         */
        initOnLoad(): boolean;
    }
    interface PaginationLinks {
        /** Insert the pagination links inside the page */
        attach(): void;
        /**
         * Generate a string containing the html of a pagination link
         *
         * @param page The page number
         * @param label The text of the link (could be Previous, Next or a number)
         * @param linkClass The classname for the `<a>`
         * @param conditional Do we want to use the conditionalClass
         * @param conditionalClass The classname for both the `<li>` and its `<a>`
         * @return A string containing html markup
         */
        buildLink(page: number, label: string|number, linkClass: string, conditional: boolean, conditionalClass: string): string;
        /**
         * Build the `<ul>` and creates the event listeners
         *
         * @return A string containing html markup
         */
        create(): string;
        /** Call the attach method */
        init(): void;
        /**
         * Check if the paginate feature is enabled in `settings.features`
         *
         * @return A boolean
         */
        initOnLoad(): boolean;
    }
    interface PaginationPage {
        /** Parse the current window.location in order to determine the target page */
        init(): void;
        /**
         * Check if the paginate feature is enabled in `settings.features`
         *
         * @return A boolean
         */
        initOnLoad(): boolean;
        /**
         * Set the page in the dataset
         *
         * @param page The new page number
         */
        set(page: number): void;
    }
    interface PaginationPerPage {
        /** Insert the pagination per page inside the page */
        attach(): void;
        /**
         * Generate the html markup for the pagination per page
         *
         * @return A jQuery object containing the `<label>` and the `<select>`
         */
        create(): JQuery;
        /** Set up the pagination per page */
        init(): void;
        /**
         * Check if the paginate feature is enabled in `settings.features`
         *
         * @return A boolean
         */
        initOnLoad(): boolean;
        /**
         * Set the new value for the pagination per page
         *
         * @param number The new number of items visible per page
         * @param skipResetPage By default (false) it sends you to page 1
         */
        set(number: number, skipResetPage?: boolean): void;
    }
    interface ProcessingIndicator {
        /** Insert the processing indicator inside the page */
        attach(): void;
        /**
         * Generate the html markup for the processing indicator
         *
         * @return A jQuery object containing the generated html
         */
        create(): JQuery;
        /** Hide the processing indicator */
        hide(): void;
        /** Set up the processing indicator */
        init(): void;
        /**
         * Position the processing indicator at the center
         *
         * @return A jQuery object containing the processing indicator
         */
        position(): JQuery;
        /** Show the processing indicator */
        show(): void;
    }
    interface Queries {
        /**
         * Add a new condition in the queries
         *
         * @param name The key for for the query
         * @param value The value we wish to find
         * @return A reference to the related Dynatable object
         */
        add(name: string, value: any): Dynatable;
        /** functions object for Queries */
        functions: QueriesFunctions;
        /** Set up the initial search parameters */
        init(): void;
        /**
         * Check if search feature is enabled
         *
         * @return A boolean if search feature is enabled
         */
        initOnLoad(): boolean;
        /**
         * Remove the query from the dataset
         *
         * @param name The key for for the query to be removed
         * @return A reference to the related Dynatable object
         */
        remove(name: string): Dynatable;
        /**  Run a search with all the saved queries */
        run(): any;
        /**
         * Shortcut for performing simple query from built-in search
         *
         * @param q The value that will be searched for
         */
        runSearch(q: any): void;
        /** Set up the input fields for creating queries */
        setupInputs(): void;
    }
    interface QueriesFunctions {
        /**
         * Search in all of the properties of the provided single record
         *
         * @param record A data object with all the properties of the current line
         * @param queryValue The researched value
         * @return A boolean indicating if a match was found
         */
        search(record: any, queryValue: string): boolean;
    }
    interface Records {
        /**
         * Count records from table
         *
         * @return The length of the records Array
         */
        count(): number;
        /**
         * Get initial recordset to populate table
         * if ajax, call ajaxUrl
         * otherwise, initialize from in-table records
         *
         * @return An Array with the records
         */
        getFromTable(): Array<Object>;
        /** Create and init the records */
        init(): void;
        /**
         * Check if ajax feature is enabled
         *
         * @return A boolean if ajax feature is enabled
         */
        initOnLoad(): boolean;
        /**
         * Get the first and the last indexes based on current page and number of items per page
         *
         * @return An Array with the first index ([0]) and the last index ([1])
         */
        pageBounds(): Array<number>;
        /** Update the records with the new page */
        paginate(): void;
        /** Reset the records */
        resetOriginal(): void;
        /**
         * Call the appropriated sort function
         *
         * @return The number (-1, 0 or +1) representing the comparison
         */
        sort(): number;
        /**
         * Merge ajax response json with cached data including (meta-data and records)
         *
         * @param data The new data
         */
        updateFromJson(data: any): void;
    }
    interface RecordsCount {
        /** Insert the record count inside the page */
        attach(): void;
        /**
         * Generate the html markup for the record count
         *
         * @return A jQuery object containing the generated html
         */
        create(): JQuery;
        /** Create and init the records count */
        init(): void;
        /**
         * Check if recordCount feature is enabled
         *
         * @return A boolean if recordCount feature is enabled
         */
        initOnLoad(): boolean;
    }
    interface Settings {
        dataset: Dataset;
        features: Features;
        inputs: Inputs;
        params: Params;
        readers: Readers;
        table: Table;
        writers: Writers;
    }
    interface Sorts {
        /**
         * Add a new sort in sortKeys
         *
         * @param attr The key for for the sorting
         * @param direction The sorting direction (-1 or +1)
         * @return A reference to the related Dynatable object
         */
        add(attr: string, direction: number): Dynatable;
        /** Remove all the sortKeys */
        clear(): void;
        /** functions object for Sorts */
        functions: SortsFunctions;
        /**
         * Try to intelligently guess which sort function to use based on the type of attribute values.
         *
         * @param a The first record
         * @param b The second record
         * @param attr The key of the property
         * @return A string containing one of the types ('string' or 'number')
         */
        guessType(a: any, b: any, attr: string): string;
        /** Create and init the sorts */
        init(): void;
        /**
         * Check if sort feature is enabled
         *
         * @return A boolean if sort feature is enabled
         */
        initOnLoad(): boolean;
        /**
         * Remove a sort attribute from the sortKeys
         *
         * @param attr The key to be removed from the sorting
         * @return A reference to the related Dynatable object
         */
        remove(attr: string): Dynatable;
    }
    interface SortsFunctions {
        /**
         * Sorting between 2 numbers
         *
         * @param a The first record
         * @param b The second record
         * @param attr The key of the property
         * @param direction The number describingthe order: ASC (+1), DESC (-1) or none (0)
         * @return The number (-1, 0 or +1) representing the comparison
         */
        number(a: any, b: any, attr: string, direction: number): number;
        /**
         * Restores the original order we had...
         *
         * @param a The first record
         * @param b The second record
         * @return The number (-1, 0 or +1) representing the comparison
         */
        originalPlacement(a: any, b: any): number;
        /**
         * Sorting between 2 strings
         *
         * @param a The first record
         * @param b The second record
         * @param attr The key of the property
         * @param direction The number describingthe order: ASC (+1), DESC (-1) or none (0)
         * @return The number (-1, 0 or +1) representing the comparison
         */
        string(a: any, b: any, attr: string, direction: number): number;
    }
    interface SortsHeaders {
        /**
         * Inject the arrow down inside the $link
         *
         * @param $link The jQuery object to be used
         */
        appendArrowDown($link: JQuery): void;
        /**
         * Inject the arrow up inside the $link
         *
         * @param $link The jQuery object to be used
         */
        appendArrowUp($link: JQuery): void;
        /** Go through each cell and call `attachOne` */
        attach(): void;
        /**
         * If sorting is allowed for the provided cell, it injects the hml generated by `create`
         *
         * @param cell The cell Element to be parsed
         */
        attachOne(cell: Element): void;
        /**
         * Generate the html markup to be inserted inside the header of the sortable column
         *
         * @param cell An Element which point to the cell in the header row
         * @return A jQuery object containing the markup of the link
         */
        create(cell: Element): JQuery;
        /** Create and init the sorts */
        init(): void;
        /**
         * Check if sort feature is enabled
         *
         * @return A boolean if sort feature is enabled
         */
        initOnLoad(): boolean;
        /** Remove all the sort headers from the table */
        removeAll(): void;
        /** Remove all arrows Elements from the table */
        removeAllArrows(): void;
        /**
         * Remove the arrow found inside the provided $link
         *
         * @param $link The jQuery object containing the `<a>` markup in the sortable headers
         */
        removeArrow($link: JQuery): void;
        /**
         * Remove the link generated by dynatable inside the sortable header
         * and restore its original html content
         *
         * @param cell The cell Element that will be parsed
         */
        removeOne(cell: Element): void;
        /**
         * @todo learn more about this method and document it
         *
         * @param $link The jQuery object to be used
         * @param column The Column object that will be used
         * @return A boolean which is true if supplied test function passes for ALL items in an array
         */
        sortedByColumn($link: JQuery, column: Column): boolean;
        /**
         * Inspect the settings to determine the order to use
         *
         * @param column The Column object that will be used
         * @return A number (-1 or +1) describing the order to use (DESC or ASC)
         */
        sortedByColumnValue(column: Column): number;
        /**
         * Refresh the [multi] sorting of the dataset
         *
         * @param $e The event object (of the click on the table sortable header)
         * @param $link The header link
         * @param column The Column object to be sorted
         */
        toggleSort(e: Event, $link: JQuery, column: Column): void;
    }
    interface State {
        /** Set up a listener for popstate event on window */
        init(): void;
        /**
         * Check if pushState option is true, and if browser supports it
         *
         * @return A boolean
         */
        initOnLoad(): boolean;
        /**
         * Handler for the popstate event
         *
         * @param event The native popstate event
         */
        pop(event: Event): void;
        /**
         * Update the URL data using pushState
         *
         * @param data An object with the parameters we want to push
         */
        push(data: Object): void;
    }
    interface Dynatable {
        /**
        * Initialize Dynatable plugin
        *
        * @param options An optional object that allow you to change the default configuration options
        */
        (options?: Options): JQuery;
        /**
         * Each dynatable instance inherits from this,
         * set properties specific to instance
         *
         * @param element The html node to be used by dynatable
         * @param options The JQueryDynatable.Options object which contains all the settings
         * @return A reference to the current and brand new dynatable object
         */
        init(element: Element, options: Options): Dynatable;
        /**
         * Call the process method on all the components of this dynatable
         *
         * @param skipPushState A boolean allowing to skip the update the query string in the URL
         */
        process(skipPushState?: boolean): void;
        /** The `element` encapsulated inside a jQuery object */
        $element: JQuery;
        /** The `dom` API */
        dom: DOM;
        /** The `domColumns` API */
        domColumns: DOMColumns;
        /** The native element on which the dynatable plugin was called */
        element: Element
        /** The `inputsSearch` API */
        inputsSearch: InputsSearch;
        /** The `paginationLinks` API */
        paginationLinks: PaginationLinks;
        /** The `paginationPage` API */
        paginationPage: PaginationPage;
        /** The `paginationPerPage` API */
        paginationPerPage: PaginationPerPage;
        /** The `processingIndicator` API */
        processingIndicator: ProcessingIndicator;
        /** The `queries` API */
        queries: Queries;
        /** The `records` API */
        records: Records;
        /** The `recordsCount` API */
        recordsCount: RecordsCount;
        /** The `settings` API */
        settings: Settings;
        /** The `sorts` API */
        sorts: Sorts;
        /** The `sortsHeaders` API */
        sortsHeaders: SortsHeaders;
        /** The `state` API */
        state: State;
    }
}

//declare var dynatable: JQueryDynatable.Dynatable;
