{"version":3,"sources":["jsdelivr-header.js","/npm/footable@2.0.5/js/footable.js"],"names":[],"mappings":"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","file":"/npm/footable@2.0.5/js/footable.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/footable@2.0.5/js/footable.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","﻿/*!\n * FooTable - Awesome Responsive Tables\n * Version : 2.0.3\n * http://fooplugins.com/plugins/footable-jquery/\n *\n * Requires jQuery - http://jquery.com/\n *\n * Copyright 2014 Steven Usher & Brad Vincent\n * Released under the MIT license\n * You are free to use FooTable in commercial projects as long as this copyright header is left intact.\n *\n * Date: 11 Nov 2014\n */\n(function ($, w, undefined) {\n    w.footable = {\n        options: {\n            delay: 100, // The number of millseconds to wait before triggering the react event\n            breakpoints: { // The different screen resolution breakpoints\n                phone: 480,\n                tablet: 1024\n            },\n            parsers: {  // The default parser to parse the value out of a cell (values are used in building up row detail)\n                alpha: function (cell) {\n                    return $(cell).data('value') || $.trim($(cell).text());\n                },\n                numeric: function (cell) {\n                    var val = $(cell).data('value') || $(cell).text().replace(/[^0-9.\\-]/g, '');\n                    val = parseFloat(val);\n                    if (isNaN(val)) val = 0;\n                    return val;\n                }\n            },\n            addRowToggle: true,\n            calculateWidthOverride: null,\n            toggleSelector: ' > tbody > tr:not(.footable-row-detail)', //the selector to show/hide the detail row\n            columnDataSelector: '> thead > tr:last-child > th, > thead > tr:last-child > td', //the selector used to find the column data in the thead\n            detailSeparator: ':', //the separator character used when building up the detail row\n            toggleHTMLElement: '<span />', // override this if you want to insert a click target rather than use a background image.\n            createGroupedDetail: function (data) {\n                var groups = { '_none': { 'name': null, 'data': [] } };\n                for (var i = 0; i < data.length; i++) {\n                    var groupid = data[i].group;\n                    if (groupid !== null) {\n                        if (!(groupid in groups))\n                            groups[groupid] = { 'name': data[i].groupName || data[i].group, 'data': [] };\n\n                        groups[groupid].data.push(data[i]);\n                    } else {\n                        groups._none.data.push(data[i]);\n                    }\n                }\n                return groups;\n            },\n            createDetail: function (element, data, createGroupedDetail, separatorChar, classes) {\n                /// <summary>This function is used by FooTable to generate the detail view seen when expanding a collapsed row.</summary>\n                /// <param name=\"element\">This is the div that contains all the detail row information, anything could be added to it.</param>\n                /// <param name=\"data\">\n                ///  This is an array of objects containing the cell information for the current row.\n                ///  These objects look like the below:\n                ///    obj = {\n                ///      'name': String, // The name of the column\n                ///      'value': Object, // The value parsed from the cell using the parsers. This could be a string, a number or whatever the parser outputs.\n                ///      'display': String, // This is the actual HTML from the cell, so if you have images etc you want moved this is the one to use and is the default value used.\n                ///      'group': String, // This is the identifier used in the data-group attribute of the column.\n                ///      'groupName': String // This is the actual name of the group the column belongs to.\n                ///    }\n                /// </param>\n                /// <param name=\"createGroupedDetail\">The grouping function to group the data</param>\n                /// <param name=\"separatorChar\">The separator charactor used</param>\n                /// <param name=\"classes\">The array of class names used to build up the detail row</param>\n\n                var groups = createGroupedDetail(data);\n                for (var group in groups) {\n                    if (groups[group].data.length === 0) continue;\n                    if (group !== '_none') element.append('<div class=\"' + classes.detailInnerGroup + '\">' + groups[group].name + '</div>');\n\n                    for (var j = 0; j < groups[group].data.length; j++) {\n                        var separator = (groups[group].data[j].name) ? separatorChar : '';\n                        element.append($('<div></div>').addClass(classes.detailInnerRow).append($('<div></div>').addClass(classes.detailInnerName)\n                                .append(groups[group].data[j].name + separator)).append($('<div></div>').addClass(classes.detailInnerValue)\n                                .attr('data-bind-value', groups[group].data[j].bindName).append(groups[group].data[j].display)));\n                    }\n                }\n            },\n            classes: {\n                main: 'footable',\n                loading: 'footable-loading',\n                loaded: 'footable-loaded',\n                toggle: 'footable-toggle',\n                disabled: 'footable-disabled',\n                detail: 'footable-row-detail',\n                detailCell: 'footable-row-detail-cell',\n                detailInner: 'footable-row-detail-inner',\n                detailInnerRow: 'footable-row-detail-row',\n                detailInnerGroup: 'footable-row-detail-group',\n                detailInnerName: 'footable-row-detail-name',\n                detailInnerValue: 'footable-row-detail-value',\n                detailShow: 'footable-detail-show'\n            },\n            triggers: {\n                initialize: 'footable_initialize',                      //trigger this event to force FooTable to reinitialize\n                resize: 'footable_resize',                              //trigger this event to force FooTable to resize\n                redraw: 'footable_redraw',                              //trigger this event to force FooTable to redraw\n                toggleRow: 'footable_toggle_row',                       //trigger this event to force FooTable to toggle a row\n                expandFirstRow: 'footable_expand_first_row',            //trigger this event to force FooTable to expand the first row\n                expandAll: 'footable_expand_all',                       //trigger this event to force FooTable to expand all rows\n                collapseAll: 'footable_collapse_all'                    //trigger this event to force FooTable to collapse all rows\n            },\n            events: {\n                alreadyInitialized: 'footable_already_initialized',     //fires when the FooTable has already been initialized\n                initializing: 'footable_initializing',                  //fires before FooTable starts initializing\n                initialized: 'footable_initialized',                    //fires after FooTable has finished initializing\n                resizing: 'footable_resizing',                          //fires before FooTable resizes\n                resized: 'footable_resized',                            //fires after FooTable has resized\n                redrawn: 'footable_redrawn',                            //fires after FooTable has redrawn\n                breakpoint: 'footable_breakpoint',                      //fires inside the resize function, when a breakpoint is hit\n                columnData: 'footable_column_data',                     //fires when setting up column data. Plugins should use this event to capture their own info about a column\n                rowDetailUpdating: 'footable_row_detail_updating',      //fires before a detail row is updated\n                rowDetailUpdated: 'footable_row_detail_updated',        //fires when a detail row is being updated\n                rowCollapsed: 'footable_row_collapsed',                 //fires when a row is collapsed\n                rowExpanded: 'footable_row_expanded',                   //fires when a row is expanded\n                rowRemoved: 'footable_row_removed',                     //fires when a row is removed\n                reset: 'footable_reset'                                 //fires when FooTable is reset\n            },\n            debug: false, // Whether or not to log information to the console.\n            log: null\n        },\n\n        version: {\n            major: 0, minor: 5,\n            toString: function () {\n                return w.footable.version.major + '.' + w.footable.version.minor;\n            },\n            parse: function (str) {\n                var version = /(\\d+)\\.?(\\d+)?\\.?(\\d+)?/.exec(str);\n                return {\n                    major: parseInt(version[1], 10) || 0,\n                    minor: parseInt(version[2], 10) || 0,\n                    patch: parseInt(version[3], 10) || 0\n                };\n            }\n        },\n\n        plugins: {\n            _validate: function (plugin) {\n                ///<summary>Simple validation of the <paramref name=\"plugin\"/> to make sure any members called by FooTable actually exist.</summary>\n                ///<param name=\"plugin\">The object defining the plugin, this should implement a string property called \"name\" and a function called \"init\".</param>\n\n                if (!$.isFunction(plugin)) {\n                  if (w.footable.options.debug === true) console.error('Validation failed, expected type \"function\", received type \"{0}\".', typeof plugin);\n                  return false;\n                }\n                var p = new plugin();\n                if (typeof p['name'] !== 'string') {\n                    if (w.footable.options.debug === true) console.error('Validation failed, plugin does not implement a string property called \"name\".', p);\n                    return false;\n                }\n                if (!$.isFunction(p['init'])) {\n                    if (w.footable.options.debug === true) console.error('Validation failed, plugin \"' + p['name'] + '\" does not implement a function called \"init\".', p);\n                    return false;\n                }\n                if (w.footable.options.debug === true) console.log('Validation succeeded for plugin \"' + p['name'] + '\".', p);\n                return true;\n            },\n            registered: [], // An array containing all registered plugins.\n            register: function (plugin, options) {\n                ///<summary>Registers a <paramref name=\"plugin\"/> and its default <paramref name=\"options\"/> with FooTable.</summary>\n                ///<param name=\"plugin\">The plugin that should implement a string property called \"name\" and a function called \"init\".</param>\n                ///<param name=\"options\">The default options to merge with the FooTable's base options.</param>\n\n                if (w.footable.plugins._validate(plugin)) {\n                    w.footable.plugins.registered.push(plugin);\n                    if (typeof options === 'object') $.extend(true, w.footable.options, options);\n                }\n            },\n            load: function(instance){\n              var loaded = [], registered, i;\n              for(i = 0; i < w.footable.plugins.registered.length; i++){\n                try {\n                  registered = w.footable.plugins.registered[i];\n                  loaded.push(new registered(instance));\n                } catch (err) {\n                  if (w.footable.options.debug === true) console.error(err);\n                }\n              }\n              return loaded;\n            },\n            init: function (instance) {\n                ///<summary>Loops through all registered plugins and calls the \"init\" method supplying the current <paramref name=\"instance\"/> of the FooTable as the first parameter.</summary>\n                ///<param name=\"instance\">The current instance of the FooTable that the plugin is being initialized for.</param>\n\n                for (var i = 0; i < instance.plugins.length; i++) {\n                    try {\n                      instance.plugins[i]['init'](instance);\n                    } catch (err) {\n                        if (w.footable.options.debug === true) console.error(err);\n                    }\n                }\n            }\n        }\n    };\n\n    var instanceCount = 0;\n\n    $.fn.footable = function (options) {\n        ///<summary>The main constructor call to initialize the plugin using the supplied <paramref name=\"options\"/>.</summary>\n        ///<param name=\"options\">\n        ///<para>A JSON object containing user defined options for the plugin to use. Any options not supplied will have a default value assigned.</para>\n        ///<para>Check the documentation or the default options object above for more information on available options.</para>\n        ///</param>\n\n        options = options || {};\n        if (options.breakpoints) {  // clear the default breakpoints if the user specifies one\n          w.footable.options.breakpoints = {};\n        }\n        var o = $.extend(true, {}, w.footable.options, options); //merge user and default options\n        return this.each(function () {\n            instanceCount++;\n            var footable = new Footable(this, o, instanceCount);\n            $(this).data('footable', footable);\n        });\n    };\n\n    //helper for using timeouts\n    function Timer() {\n        ///<summary>Simple timer object created around a timeout.</summary>\n        var t = this;\n        t.id = null;\n        t.busy = false;\n        t.start = function (code, milliseconds) {\n            ///<summary>Starts the timer and waits the specified amount of <paramref name=\"milliseconds\"/> before executing the supplied <paramref name=\"code\"/>.</summary>\n            ///<param name=\"code\">The code to execute once the timer runs out.</param>\n            ///<param name=\"milliseconds\">The time in milliseconds to wait before executing the supplied <paramref name=\"code\"/>.</param>\n\n            if (t.busy) {\n                return;\n            }\n            t.stop();\n            t.id = setTimeout(function () {\n                code();\n                t.id = null;\n                t.busy = false;\n            }, milliseconds);\n            t.busy = true;\n        };\n        t.stop = function () {\n            ///<summary>Stops the timer if its runnning and resets it back to its starting state.</summary>\n\n            if (t.id !== null) {\n                clearTimeout(t.id);\n                t.id = null;\n                t.busy = false;\n            }\n        };\n    }\n\n    function Footable(t, o, id) {\n        ///<summary>Inits a new instance of the plugin.</summary>\n        ///<param name=\"t\">The main table element to apply this plugin to.</param>\n        ///<param name=\"o\">The options supplied to the plugin. Check the defaults object to see all available options.</param>\n        ///<param name=\"id\">The id to assign to this instance of the plugin.</param>\n\n        var ft = this;\n        ft.id = id;\n        ft.table = t;\n        ft.options = o;\n        ft.breakpoints = [];\n        ft.breakpointNames = '';\n        ft.columns = {};\n        ft.plugins = w.footable.plugins.load(ft);\n\n        var opt = ft.options,\n            cls = opt.classes,\n            evt = opt.events,\n            trg = opt.triggers,\n            indexOffset = 0;\n\n        // This object simply houses all the timers used in the FooTable.\n        ft.timers = {\n            resize: new Timer(),\n            register: function (name) {\n                ft.timers[name] = new Timer();\n                return ft.timers[name];\n            }\n        };\n\n        ft.init = function () {\n            var $window = $(w), $table = $(ft.table);\n\n            w.footable.plugins.init(ft);\n\n            if ($table.hasClass(cls.loaded)) {\n                //already loaded FooTable for the table, so don't init again\n                ft.raise(evt.alreadyInitialized);\n                return;\n            }\n\n            //raise the initializing event\n            ft.raise(evt.initializing);\n\n            $table.addClass(cls.loading);\n\n            // Get the column data once for the life time of the plugin\n            $table.find(opt.columnDataSelector).each(function () {\n                var data = ft.getColumnData(this);\n                ft.columns[data.index] = data;\n            });\n\n            // Create a nice friendly array to work with out of the breakpoints object.\n            for (var name in opt.breakpoints) {\n                ft.breakpoints.push({ 'name': name, 'width': opt.breakpoints[name] });\n                ft.breakpointNames += (name + ' ');\n            }\n\n            // Sort the breakpoints so the smallest is checked first\n            ft.breakpoints.sort(function (a, b) {\n                return a['width'] - b['width'];\n            });\n\n            $table\n                .unbind(trg.initialize)\n                //bind to FooTable initialize trigger\n                .bind(trg.initialize, function () {\n                    //remove previous \"state\" (to \"force\" a resize)\n                    $table.removeData('footable_info');\n                    $table.data('breakpoint', '');\n\n                    //trigger the FooTable resize\n                    $table.trigger(trg.resize);\n\n                    //remove the loading class\n                    $table.removeClass(cls.loading);\n\n                    //add the FooTable and loaded class\n                    $table.addClass(cls.loaded).addClass(cls.main);\n\n                    //raise the initialized event\n                    ft.raise(evt.initialized);\n                })\n                .unbind(trg.redraw)\n                //bind to FooTable redraw trigger\n                .bind(trg.redraw, function () {\n                    ft.redraw();\n                })\n                .unbind(trg.resize)\n                //bind to FooTable resize trigger\n                .bind(trg.resize, function () {\n                    ft.resize();\n                })\n                .unbind(trg.expandFirstRow)\n                //bind to FooTable expandFirstRow trigger\n                .bind(trg.expandFirstRow, function () {\n                    $table.find(opt.toggleSelector).first().not('.' + cls.detailShow).trigger(trg.toggleRow);\n                })\n                .unbind(trg.expandAll)\n                //bind to FooTable expandFirstRow trigger\n                .bind(trg.expandAll, function () {\n                    $table.find(opt.toggleSelector).not('.' + cls.detailShow).trigger(trg.toggleRow);\n                })\n                .unbind(trg.collapseAll)\n                //bind to FooTable expandFirstRow trigger\n                .bind(trg.collapseAll, function () {\n                    $table.find('.' + cls.detailShow).trigger(trg.toggleRow);\n                });\n\n            //trigger a FooTable initialize\n            $table.trigger(trg.initialize);\n\n            //bind to window resize\n            $window\n                .bind('resize.footable', function () {\n                    ft.timers.resize.stop();\n                    ft.timers.resize.start(function () {\n                        ft.raise(trg.resize);\n                    }, opt.delay);\n                });\n        };\n\n        ft.addRowToggle = function () {\n            if (!opt.addRowToggle) return;\n\n            var $table = $(ft.table),\n                hasToggleColumn = false;\n\n            //first remove all toggle spans\n            $table.find('span.' + cls.toggle).remove();\n\n            for (var c in ft.columns) {\n                var col = ft.columns[c];\n                if (col.toggle) {\n                    hasToggleColumn = true;\n                    var selector = '> tbody > tr:not(.' + cls.detail + ',.' + cls.disabled + ') > td:nth-child(' + (parseInt(col.index, 10) + 1) + '),' +\n                                            '> tbody > tr:not(.' + cls.detail + ',.' + cls.disabled + ') > th:nth-child(' + (parseInt(col.index, 10) + 1) + ')';\n                    $table.find(selector).not('.' + cls.detailCell).prepend($(opt.toggleHTMLElement).addClass(cls.toggle));\n                    return;\n                }\n            }\n            //check if we have an toggle column. If not then add it to the first column just to be safe\n            if (!hasToggleColumn) {\n                $table\n                    .find('> tbody > tr:not(.' + cls.detail + ',.' + cls.disabled + ') > td:first-child')\n                                        .add('> tbody > tr:not(.' + cls.detail + ',.' + cls.disabled + ') > th:first-child')\n                    .not('.' + cls.detailCell)\n                    .prepend($(opt.toggleHTMLElement).addClass(cls.toggle));\n            }\n        };\n\n        ft.setColumnClasses = function () {\n            var $table = $(ft.table);\n            for (var c in ft.columns) {\n                var col = ft.columns[c];\n                if (col.className !== null) {\n                    var selector = '', first = true;\n                    $.each(col.matches, function (m, match) { //support for colspans\n                        if (!first) selector += ', ';\n                        selector += '> tbody > tr:not(.' + cls.detail + ') > td:nth-child(' + (parseInt(match, 10) + 1) + ')';\n                        first = false;\n                    });\n                    //add the className to the cells specified by data-class=\"blah\"\n                    $table.find(selector).not('.' + cls.detailCell).addClass(col.className);\n                }\n            }\n        };\n\n        //moved this out into it's own function so that it can be called from other add-ons\n        ft.bindToggleSelectors = function () {\n            var $table = $(ft.table);\n\n            if (!ft.hasAnyBreakpointColumn()) return;\n\n            $table.find(opt.toggleSelector).unbind(trg.toggleRow).bind(trg.toggleRow, function (e) {\n                var $row = $(this).is('tr') ? $(this) : $(this).parents('tr:first');\n                ft.toggleDetail($row);\n            });\n\n            $table.find(opt.toggleSelector).unbind('click.footable').bind('click.footable', function (e) {\n                if ($table.is('.breakpoint') && $(e.target).is('td,th,.'+ cls.toggle)) {\n                    $(this).trigger(trg.toggleRow);\n                }\n            });\n        };\n\n        ft.parse = function (cell, column) {\n            var parser = opt.parsers[column.type] || opt.parsers.alpha;\n            return parser(cell);\n        };\n\n        ft.getColumnData = function (th) {\n            var $th = $(th), hide = $th.data('hide'), index = $th.index();\n            hide = hide || '';\n            hide = jQuery.map(hide.split(','), function (a) {\n                return jQuery.trim(a);\n            });\n            var data = {\n                'index': index,\n                'hide': { },\n                'type': $th.data('type') || 'alpha',\n                'name': $th.data('name') || $.trim($th.text()),\n                'ignore': $th.data('ignore') || false,\n                'toggle': $th.data('toggle') || false,\n                'className': $th.data('class') || null,\n                'matches': [],\n                'names': { },\n                'group': $th.data('group') || null,\n                'groupName': null,\n                'isEditable': $th.data('editable')\n            };\n\n            if (data.group !== null) {\n                var $group = $(ft.table).find('> thead > tr.footable-group-row > th[data-group=\"' + data.group + '\"], > thead > tr.footable-group-row > td[data-group=\"' + data.group + '\"]').first();\n                data.groupName = ft.parse($group, { 'type': 'alpha' });\n            }\n\n            var pcolspan = parseInt($th.prev().attr('colspan') || 0, 10);\n            indexOffset += pcolspan > 1 ? pcolspan - 1 : 0;\n            var colspan = parseInt($th.attr('colspan') || 0, 10), curindex = data.index + indexOffset;\n            if (colspan > 1) {\n                var names = $th.data('names');\n                names = names || '';\n                names = names.split(',');\n                for (var i = 0; i < colspan; i++) {\n                    data.matches.push(i + curindex);\n                    if (i < names.length) data.names[i + curindex] = names[i];\n                }\n            } else {\n                data.matches.push(curindex);\n            }\n\n            data.hide['default'] = ($th.data('hide') === \"all\") || ($.inArray('default', hide) >= 0);\n\n            var hasBreakpoint = false;\n            for (var name in opt.breakpoints) {\n                data.hide[name] = ($th.data('hide') === \"all\") || ($.inArray(name, hide) >= 0);\n                hasBreakpoint = hasBreakpoint || data.hide[name];\n            }\n            data.hasBreakpoint = hasBreakpoint;\n            var e = ft.raise(evt.columnData, { 'column': { 'data': data, 'th': th } });\n            return e.column.data;\n        };\n\n        ft.getViewportWidth = function () {\n            return window.innerWidth || (document.body ? document.body.offsetWidth : 0);\n        };\n\n        ft.calculateWidth = function ($table, info) {\n            if (jQuery.isFunction(opt.calculateWidthOverride)) {\n                return opt.calculateWidthOverride($table, info);\n            }\n            if (info.viewportWidth < info.width) info.width = info.viewportWidth;\n            if (info.parentWidth < info.width) info.width = info.parentWidth;\n            return info;\n        };\n\n        ft.hasBreakpointColumn = function (breakpoint) {\n            for (var c in ft.columns) {\n                if (ft.columns[c].hide[breakpoint]) {\n                    if (ft.columns[c].ignore) {\n                        continue;\n                    }\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        ft.hasAnyBreakpointColumn = function () {\n            for (var c in ft.columns) {\n                if (ft.columns[c].hasBreakpoint) {\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        ft.resize = function () {\n            var $table = $(ft.table);\n\n            if (!$table.is(':visible')) {\n                return;\n            } //we only care about FooTables that are visible\n\n            if (!ft.hasAnyBreakpointColumn()) {\n\t\t\t\t$table.trigger(trg.redraw);\n\t\t\t\treturn;\n            } //we only care about FooTables that have breakpoints\n\n            var info = {\n                'width': $table.width(),                  //the table width\n                'viewportWidth': ft.getViewportWidth(),   //the width of the viewport\n                'parentWidth': $table.parent().width()    //the width of the parent\n            };\n\n            info = ft.calculateWidth($table, info);\n\n            var pinfo = $table.data('footable_info');\n            $table.data('footable_info', info);\n            ft.raise(evt.resizing, { 'old': pinfo, 'info': info });\n\n            // This (if) statement is here purely to make sure events aren't raised twice as mobile safari seems to do\n            if (!pinfo || (pinfo && pinfo.width && pinfo.width !== info.width)) {\n\n                var current = null, breakpoint;\n                for (var i = 0; i < ft.breakpoints.length; i++) {\n                    breakpoint = ft.breakpoints[i];\n                    if (breakpoint && breakpoint.width && info.width <= breakpoint.width) {\n                        current = breakpoint;\n                        break;\n                    }\n                }\n\n                var breakpointName = (current === null ? 'default' : current['name']),\n                    hasBreakpointFired = ft.hasBreakpointColumn(breakpointName),\n                    previousBreakpoint = $table.data('breakpoint');\n\n                $table\n                    .data('breakpoint', breakpointName)\n                    .removeClass('default breakpoint').removeClass(ft.breakpointNames)\n                    .addClass(breakpointName + (hasBreakpointFired ? ' breakpoint' : ''));\n\n                //only do something if the breakpoint has changed\n                if (breakpointName !== previousBreakpoint) {\n                    //trigger a redraw\n                    $table.trigger(trg.redraw);\n                    //raise a breakpoint event\n                    ft.raise(evt.breakpoint, { 'breakpoint': breakpointName, 'info': info });\n                }\n            }\n\n            ft.raise(evt.resized, { 'old': pinfo, 'info': info });\n        };\n\n        ft.redraw = function () {\n            //add the toggler to each row\n            ft.addRowToggle();\n\n            //bind the toggle selector click events\n            ft.bindToggleSelectors();\n\n            //set any cell classes defined for the columns\n            ft.setColumnClasses();\n\n            var $table = $(ft.table),\n                breakpointName = $table.data('breakpoint'),\n                hasBreakpointFired = ft.hasBreakpointColumn(breakpointName);\n\n            $table\n                .find('> tbody > tr:not(.' + cls.detail + ')').data('detail_created', false).end()\n                .find('> thead > tr:last-child > th')\n                .each(function () {\n                    var data = ft.columns[$(this).index()], selector = '', first = true;\n                    $.each(data.matches, function (m, match) {\n                        if (!first) {\n                            selector += ', ';\n                        }\n                        var count = match + 1;\n                        selector += '> tbody > tr:not(.' + cls.detail + ') > td:nth-child(' + count + ')';\n                        selector += ', > tfoot > tr:not(.' + cls.detail + ') > td:nth-child(' + count + ')';\n                        selector += ', > colgroup > col:nth-child(' + count + ')';\n                        first = false;\n                    });\n\n                    selector += ', > thead > tr[data-group-row=\"true\"] > th[data-group=\"' + data.group + '\"]';\n                    var $column = $table.find(selector).add(this);\n                    if (breakpointName !== '') {\n                      if (data.hide[breakpointName] === false) $column.addClass('footable-visible').show();\n                      else $column.removeClass('footable-visible').hide();\n                    }\n\n                    if ($table.find('> thead > tr.footable-group-row').length === 1) {\n                        var $groupcols = $table.find('> thead > tr:last-child > th[data-group=\"' + data.group + '\"]:visible, > thead > tr:last-child > th[data-group=\"' + data.group + '\"]:visible'),\n                            $group = $table.find('> thead > tr.footable-group-row > th[data-group=\"' + data.group + '\"], > thead > tr.footable-group-row > td[data-group=\"' + data.group + '\"]'),\n                            groupspan = 0;\n\n                        $.each($groupcols, function () {\n                            groupspan += parseInt($(this).attr('colspan') || 1, 10);\n                        });\n\n                        if (groupspan > 0) $group.attr('colspan', groupspan).show();\n                        else $group.hide();\n                    }\n                })\n                .end()\n                .find('> tbody > tr.' + cls.detailShow).each(function () {\n                    ft.createOrUpdateDetailRow(this);\n                });\n\n            $table.find(\"[data-bind-name]\").each(function () {\n                ft.toggleInput(this);\n            });\n\n            $table.find('> tbody > tr.' + cls.detailShow + ':visible').each(function () {\n                var $next = $(this).next();\n                if ($next.hasClass(cls.detail)) {\n                    if (!hasBreakpointFired) $next.hide();\n                    else $next.show();\n                }\n            });\n\n            // adding .footable-first-column and .footable-last-column to the first and last th and td of each row in order to allow\n            // for styling if the first or last column is hidden (which won't work using :first-child or :last-child)\n            $table.find('> thead > tr > th.footable-last-column, > tbody > tr > td.footable-last-column').removeClass('footable-last-column');\n            $table.find('> thead > tr > th.footable-first-column, > tbody > tr > td.footable-first-column').removeClass('footable-first-column');\n            $table.find('> thead > tr, > tbody > tr')\n                .find('> th.footable-visible:last, > td.footable-visible:last')\n                .addClass('footable-last-column')\n                .end()\n                .find('> th.footable-visible:first, > td.footable-visible:first')\n                .addClass('footable-first-column');\n\n            ft.raise(evt.redrawn);\n        };\n\n        ft.toggleDetail = function (row) {\n            var $row = (row.jquery) ? row : $(row),\n                $next = $row.next();\n\n            //check if the row is already expanded\n            if ($row.hasClass(cls.detailShow)) {\n                $row.removeClass(cls.detailShow);\n\n                //only hide the next row if it's a detail row\n                if ($next.hasClass(cls.detail)) $next.hide();\n\n                ft.raise(evt.rowCollapsed, { 'row': $row[0] });\n\n            } else {\n                ft.createOrUpdateDetailRow($row[0]);\n                $row.addClass(cls.detailShow)\n                    .next().show();\n\n                ft.raise(evt.rowExpanded, { 'row': $row[0] });\n            }\n        };\n\n        ft.removeRow = function (row) {\n            var $row = (row.jquery) ? row : $(row);\n            if ($row.hasClass(cls.detail)) {\n                $row = $row.prev();\n            }\n            var $next = $row.next();\n            if ($row.data('detail_created') === true) {\n                //remove the detail row\n                $next.remove();\n            }\n            $row.remove();\n\n            //raise event\n            ft.raise(evt.rowRemoved);\n        };\n\n        ft.appendRow = function (row) {\n            var $row = (row.jquery) ? row : $(row);\n            $(ft.table).find('tbody').append($row);\n\n            //redraw the table\n            ft.redraw();\n        };\n\n        ft.getColumnFromTdIndex = function (index) {\n            /// <summary>Returns the correct column data for the supplied index taking into account colspans.</summary>\n            /// <param name=\"index\">The index to retrieve the column data for.</param>\n            /// <returns type=\"json\">A JSON object containing the column data for the supplied index.</returns>\n            var result = null;\n            for (var column in ft.columns) {\n                if ($.inArray(index, ft.columns[column].matches) >= 0) {\n                    result = ft.columns[column];\n                    break;\n                }\n            }\n            return result;\n        };\n\n        ft.createOrUpdateDetailRow = function (actualRow) {\n            var $row = $(actualRow), $next = $row.next(), $detail, values = [];\n            if ($row.data('detail_created') === true) return true;\n\n            if ($row.is(':hidden')) return false; //if the row is hidden for some reason (perhaps filtered) then get out of here\n            ft.raise(evt.rowDetailUpdating, { 'row': $row, 'detail': $next });\n            $row.find('> td:hidden').each(function () {\n                var index = $(this).index(), column = ft.getColumnFromTdIndex(index), name = column.name;\n                if (column.ignore === true) return true;\n\n                if (index in column.names) name = column.names[index];\n\n                var bindName = $(this).attr(\"data-bind-name\");\n                if (bindName != null && $(this).is(':empty')) {\n                    var bindValue = $('.' + cls.detailInnerValue + '[' + 'data-bind-value=\"' + bindName + '\"]');\n                    $(this).html($(bindValue).contents().detach());\n                }\n                var display;\n                if (column.isEditable !== false && (column.isEditable || $(this).find(\":input\").length > 0)) {\n                    if(bindName == null) {\n                        bindName = \"bind-\" + $.now() + \"-\" + index;\n                        $(this).attr(\"data-bind-name\", bindName);\n                    }\n                    display = $(this).contents().detach();\n                }\n                if (!display) display = $(this).contents().clone(true, true);\n                values.push({ 'name': name, 'value': ft.parse(this, column), 'display': display, 'group': column.group, 'groupName': column.groupName, 'bindName': bindName });\n                return true;\n            });\n            if (values.length === 0) return false; //return if we don't have any data to show\n            var colspan = $row.find('> td:visible').length;\n            var exists = $next.hasClass(cls.detail);\n            if (!exists) { // Create\n                $next = $('<tr class=\"' + cls.detail + '\"><td class=\"' + cls.detailCell + '\"><div class=\"' + cls.detailInner + '\"></div></td></tr>');\n                $row.after($next);\n            }\n            $next.find('> td:first').attr('colspan', colspan);\n            $detail = $next.find('.' + cls.detailInner).empty();\n            opt.createDetail($detail, values, opt.createGroupedDetail, opt.detailSeparator, cls);\n            $row.data('detail_created', true);\n            ft.raise(evt.rowDetailUpdated, { 'row': $row, 'detail': $next });\n            return !exists;\n        };\n\n        ft.raise = function (eventName, args) {\n\n            if (ft.options.debug === true && $.isFunction(ft.options.log)) ft.options.log(eventName, 'event');\n\n            args = args || { };\n            var def = { 'ft': ft };\n            $.extend(true, def, args);\n            var e = $.Event(eventName, def);\n            if (!e.ft) {\n                $.extend(true, e, def);\n            } //pre jQuery 1.6 which did not allow data to be passed to event object constructor\n            $(ft.table).trigger(e);\n            return e;\n        };\n\n        //reset the state of FooTable\n        ft.reset = function() {\n            var $table = $(ft.table);\n            $table.removeData('footable_info')\n                .data('breakpoint', '')\n                .removeClass(cls.loading)\n                .removeClass(cls.loaded);\n\n            $table.find(opt.toggleSelector).unbind(trg.toggleRow).unbind('click.footable');\n\n            $table.find('> tbody > tr').removeClass(cls.detailShow);\n\n            $table.find('> tbody > tr.' + cls.detail).remove();\n\n            ft.raise(evt.reset);\n        };\n\n        //Switch between row-detail and detail-show.\n        ft.toggleInput = function (column) {\n            var bindName = $(column).attr(\"data-bind-name\");\n            if(bindName != null) {\n                var bindValue = $('.' + cls.detailInnerValue + '[' + 'data-bind-value=\"' + bindName + '\"]');\n                if(bindValue != null) {\n                    if($(column).is(\":visible\")) {\n                        if(!$(bindValue).is(':empty')) $(column).html($(bindValue).contents().detach());\n                    } else if(!$(column).is(':empty')) {\n                        $(bindValue).html($(column).contents().detach());\n                    }\n                }\n            }\n        };\n\n        ft.init();\n        return ft;\n    }\n})(jQuery, window);\n"]}