﻿/*
* File:        jquery.dataTables.min.js
* Version:     1.5.0
* Author:      Allan Jardine (www.sprymedia.co.uk)
* Info:        www.datatables.net
* 
* Copyright 2008-2009 Allan Jardine, all rights reserved.
*
* This source file is free software, under either the GPL v2 license or a
* BSD style license, as supplied with this software.
* 
* This source file is distributed in the hope that it will be useful, but 
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
*/
(function($) {
    $.fn.dataTableSettings = []; $.fn.dataTableExt = {}; var _oExt = $.fn.dataTableExt;
    _oExt.sVersion = "1.5.0"; _oExt.iApiIndex = 0; _oExt.oApi = {}; _oExt.afnFiltering = []; _oExt.aoFeatures = [];
    _oExt.ofnSearch = {}; _oExt.oPagination = { two_button: { fnInit: function(oSettings, fnCallbackDraw) {
        var nPaging = oSettings.anFeatures.p;
        oSettings.nPrevious = document.createElement("div"); oSettings.nNext = document.createElement("div");
        if (oSettings.sTableId !== "") {
            nPaging.setAttribute("id", oSettings.sTableId + "_paginate");
            oSettings.nPrevious.setAttribute("id", oSettings.sTableId + "_previous"); oSettings.nNext.setAttribute("id", oSettings.sTableId + "_next")
        } oSettings.nPrevious.className = "paginate_disabled_previous"; oSettings.nNext.className = "paginate_disabled_next";
        oSettings.nPrevious.title = oSettings.oLanguage.oPaginate.sPrevious; oSettings.nNext.title = oSettings.oLanguage.oPaginate.sNext;
        nPaging.appendChild(oSettings.nPrevious); nPaging.appendChild(oSettings.nNext); $(nPaging).insertAfter(oSettings.nTable);
        $(oSettings.nPrevious).click(function() {
            oSettings._iDisplayStart -= oSettings._iDisplayLength;
            if (oSettings._iDisplayStart < 0) { oSettings._iDisplayStart = 0 } fnCallbackDraw(oSettings)
        }); $(oSettings.nNext).click(function() {
            if (oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay()) {
                oSettings._iDisplayStart += oSettings._iDisplayLength
            } fnCallbackDraw(oSettings)
        }); $(oSettings.nPrevious).bind("selectstart", function() {
            return false
        }); $(oSettings.nNext).bind("selectstart", function() { return false })
    }, fnUpdate: function(oSettings, fnCallbackDraw) {
        if (!oSettings.anFeatures.p) {
            return
        } oSettings.nPrevious.className = (oSettings._iDisplayStart === 0) ? "paginate_disabled_previous" : "paginate_enabled_previous";
        oSettings.nNext.className = (oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay()) ? "paginate_disabled_next" : "paginate_enabled_next"
    } 
    }, iFullNumbersShowPages: 5, full_numbers: { fnInit: function(oSettings, fnCallbackDraw) {
        var nPaging = oSettings.anFeatures.p;
        var nFirst = document.createElement("span"); var nPrevious = document.createElement("span");
        var nList = document.createElement("span"); var nNext = document.createElement("span");
        var nLast = document.createElement("span"); nFirst.innerHTML = oSettings.oLanguage.oPaginate.sFirst;
        nPrevious.innerHTML = oSettings.oLanguage.oPaginate.sPrevious; nNext.innerHTML = oSettings.oLanguage.oPaginate.sNext;
        nLast.innerHTML = oSettings.oLanguage.oPaginate.sLast; nFirst.className = "paginate_button first";
        nPrevious.className = "paginate_button previous"; nNext.className = "paginate_button next";
        nLast.className = "paginate_button last"; if (oSettings.sTableId !== "") {
            nPaging.setAttribute("id", oSettings.sTableId + "_paginate");
            nPrevious.setAttribute("id", oSettings.sTableId + "_previous"); nPrevious.setAttribute("id", oSettings.sTableId + "_previous");
            nNext.setAttribute("id", oSettings.sTableId + "_next"); nLast.setAttribute("id", oSettings.sTableId + "_last")
        } nPaging.appendChild(nFirst); nPaging.appendChild(nPrevious); nPaging.appendChild(nList);
        nPaging.appendChild(nNext); nPaging.appendChild(nLast); $(nFirst).click(function() {
            oSettings._iDisplayStart = 0;
            fnCallbackDraw(oSettings)
        }); $(nPrevious).click(function() {
            oSettings._iDisplayStart -= oSettings._iDisplayLength;
            if (oSettings._iDisplayStart < 0) { oSettings._iDisplayStart = 0 } fnCallbackDraw(oSettings)
        }); $(nNext).click(function() {
            if (oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay()) {
                oSettings._iDisplayStart += oSettings._iDisplayLength
            } fnCallbackDraw(oSettings)
        }); $(nLast).click(function() {
            var iPages = parseInt((oSettings.fnRecordsDisplay() - 1) / oSettings._iDisplayLength, 10) + 1;
            oSettings._iDisplayStart = (iPages - 1) * oSettings._iDisplayLength; fnCallbackDraw(oSettings)
        }); $("span", nPaging).bind("mousedown", function() { return false }); $("span", nPaging).bind("selectstart", function() {
            return false
        }); oSettings.nPaginateList = nList
    }, fnUpdate: function(oSettings, fnCallbackDraw) {
        if (!oSettings.anFeatures.p) {
            return
        } var iPageCount = jQuery.fn.dataTableExt.oPagination.iFullNumbersShowPages; var iPageCountHalf = Math.floor(iPageCount / 2);
        var iPages = Math.ceil((oSettings.fnRecordsDisplay() - 1) / oSettings._iDisplayLength) + 1;
        var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
        var sList = ""; var iStartButton; var iEndButton; if (iPages < iPageCount) {
            iStartButton = 1;
            iEndButton = iPages
        } else {
            if (iCurrentPage <= iPageCountHalf) {
                iStartButton = 1; iEndButton = iPageCount
            } else {
                if (iCurrentPage >= (iPages - iPageCountHalf)) {
                    iStartButton = iPages - iPageCount + 1;
                    iEndButton = iPages
                } else {
                    iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1; iEndButton = iStartButton + iPageCount - 1
                } 
            } 
        } for (var i = iStartButton; i <= iEndButton; i++) {
            if (iCurrentPage != i) {
                sList += '<span class="paginate_button">' + i + "</span>"
            } else { sList += '<span class="paginate_active">' + i + "</span>" } 
        } oSettings.nPaginateList.innerHTML = sList;
        $("span", oSettings.nPaginateList).bind("mousedown", function() { return false }); $("span", oSettings.nPaginateList).bind("selectstart", function() {
            return false
        }); $("span", oSettings.nPaginateList).click(function() {
            var iTarget = (this.innerHTML * 1) - 1;
            oSettings._iDisplayStart = iTarget * oSettings._iDisplayLength; fnCallbackDraw(oSettings);
            return false
        })
    } }
    }; _oExt.oSort = { "string-asc": function(a, b) {
        var x = a.toLowerCase(); var y = b.toLowerCase();
        return ((x < y) ? -1 : ((x > y) ? 1 : 0))
    }, "string-desc": function(a, b) {
        var x = a.toLowerCase(); var y = b.toLowerCase();
        return ((x < y) ? 1 : ((x > y) ? -1 : 0))
    }, "html-asc": function(a, b) {
        var x = a.replace(/<.*?>/g, "").toLowerCase();
        var y = b.replace(/<.*?>/g, "").toLowerCase(); return ((x < y) ? -1 : ((x > y) ? 1 : 0))
    }, "html-desc": function(a, b) {
        var x = a.replace(/<.*?>/g, "").toLowerCase();
        var y = b.replace(/<.*?>/g, "").toLowerCase(); return ((x < y) ? 1 : ((x > y) ? -1 : 0))
    }, "date-asc": function(a, b) {
        var x = Date.parse(a);
        var y = Date.parse(b); if (isNaN(x)) { x = Date.parse("01/01/1970 00:00:00") } if (isNaN(y)) {
            y = Date.parse("01/01/1970 00:00:00")
        } return x - y
    }, "date-desc": function(a, b) {
        var x = Date.parse(a); var y = Date.parse(b); if (isNaN(x)) {
            x = Date.parse("01/01/1970 00:00:00")
        } if (isNaN(y)) { y = Date.parse("01/01/1970 00:00:00") } return y - x
    }, "numeric-asc": function(a, b) {
        var x = a == "-" ? 0 : a;
        var y = b == "-" ? 0 : b; return x - y
    }, "numeric-desc": function(a, b) {
        var x = a == "-" ? 0 : a; var y = b == "-" ? 0 : b;
        return y - x
    } 
    }; _oExt.aTypes = [function(sData) {
        if (typeof sData == "number") {
            return "numeric"
        } else { if (typeof sData.charAt != "function") { return null } } var sValidFirstChars = "0123456789-";
        var sValidChars = "0123456789."; var Char; var bDecimal = false; Char = sData.charAt(0); if (sValidFirstChars.indexOf(Char) == -1) {
            return null
        } for (var i = 1; i < sData.length; i++) {
            Char = sData.charAt(i); if (sValidChars.indexOf(Char) == -1) {
                return null
            } if (Char == ".") { if (bDecimal) { return null } bDecimal = true } 
        } return "numeric"
    }, function(sData) {
        if (!isNaN(Date.parse(sData))) {
            return "date"
        } return null
    } ]; _oExt._oExternConfig = { iNextUnique: 0 }; $.fn.dataTable = function(oInit) {
        var _aoSettings = $.fn.dataTableSettings;
        function classSettings() {
            this.fnRecordsTotal = function() {
                if (this.oFeatures.bServerSide) {
                    return this._iRecordsTotal
                } else { return this.aiDisplayMaster.length } 
            }; this.fnRecordsDisplay = function() {
                if (this.oFeatures.bServerSide) {
                    return this._iRecordsDisplay
                } else { return this.aiDisplay.length } 
            }; this.fnDisplayEnd = function() {
                if (this.oFeatures.bServerSide) {
                    return this._iDisplayStart + this.aiDisplay.length
                } else { return this._iDisplayEnd } 
            }; this.sInstance = null; this.oFeatures = { bPaginate: true, bLengthChange: true, bFilter: true, bSort: true, bInfo: true, bAutoWidth: true, bProcessing: false, bSortClasses: true, bStateSave: false, bServerSide: false };
            this.anFeatures = []; this.oLanguage = { sProcessing: "Processing...", sLengthMenu: "Show _MENU_ entries", sZeroRecords: "No matching records found", sInfo: "Showing _START_ to _END_ of _TOTAL_ entries", sInfoEmpty: "Showing 0 to 0 of 0 entries", sInfoFiltered: "(filtered from _MAX_ total entries)", sInfoPostFix: "", sSearch: "Search:", sUrl: "", oPaginate: { sFirst: "First", sPrevious: "Previous", sNext: "Next", sLast: "Last"} };
            this.aoData = []; this.aiDisplay = []; this.aiDisplayMaster = []; this.aoColumns = []; this.iNextId = 0;
            this.asDataSearch = []; this.oPreviousSearch = { sSearch: "", bEscapeRegex: true }; this.aoPreSearchCols = [];
            this.aaSorting = [[0, "asc"]]; this.aaSortingFixed = null; this.asStripClasses = ["odd", "even"];
            this.fnRowCallback = null; this.fnHeaderCallback = null; this.fnFooterCallback = null; this.fnDrawCallback = null;
            this.fnInitComplete = null; this.sTableId = ""; this.nTable = null; this.iDefaultSortIndex = 0;
            this.bInitialised = false; this.aoOpenRows = []; this.sDomPositioning = "lfrtip"; this.sPaginationType = "two_button";
            this.iCookieDuration = 60 * 60 * 2; this.sAjaxSource = null; this.bAjaxDataGet = true; this.fnServerData = $.getJSON;
            this.iServerDraw = 0; this._iDisplayLength = 10; this._iDisplayStart = 0; this._iDisplayEnd = 10;
            this._iRecordsTotal = 0; this._iRecordsDisplay = 0
        } this.oApi = {}; this.fnDraw = function() {
            _fnReDraw(_fnSettingsFromNode(this[_oExt.iApiIndex]))
        }; this.fnFilter = function(sInput, iColumn, bEscapeRegex) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            if (typeof bEscapeRegex == "undefined") { bEscapeRegex = true } if (typeof iColumn == "undefined" || iColumn === null) {
                _fnFilterComplete(oSettings, { sSearch: sInput, bEscapeRegex: bEscapeRegex }, 1)
            } else {
                oSettings.aoPreSearchCols[iColumn].sSearch = sInput; oSettings.aoPreSearchCols[iColumn].bEscapeRegex = bEscapeRegex;
                _fnFilterComplete(oSettings, oSettings.oPreviousSearch, 1)
            } 
        }; this.fnSettings = function(nNode) {
            return _fnSettingsFromNode(this[_oExt.iApiIndex])
        }; this.fnSort = function(aaSort) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            oSettings.aaSorting = aaSort; _fnSort(oSettings)
        }; this.fnAddData = function(mData, bRedraw) {
            var aiReturn = [];
            var iTest; if (typeof bRedraw == "undefined") { bRedraw = true } var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            if (typeof mData[0] == "object") {
                for (var i = 0; i < mData.length; i++) {
                    iTest = _fnAddData(oSettings, mData[i]);
                    if (iTest == -1) { return aiReturn } aiReturn.push(iTest)
                } 
            } else {
                iTest = _fnAddData(oSettings, mData);
                if (iTest == -1) { return aiReturn } aiReturn.push(iTest)
            } oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
            _fnBuildSearchArray(oSettings, 1); if (bRedraw) { _fnReDraw(oSettings) } return aiReturn
        }; this.fnDeleteRow = function(iAODataIndex, fnCallBack, bNullRow) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            var i; for (i = 0; i < oSettings.aiDisplayMaster.length; i++) {
                if (oSettings.aiDisplayMaster[i] == iAODataIndex) {
                    oSettings.aiDisplayMaster.splice(i, 1);
                    break
                } 
            } for (i = 0; i < oSettings.aiDisplay.length; i++) {
                if (oSettings.aiDisplay[i] == iAODataIndex) {
                    oSettings.aiDisplay.splice(i, 1);
                    break
                } 
            } _fnBuildSearchArray(oSettings, 1); if (typeof fnCallBack == "function") {
                fnCallBack.call(this)
            } if (oSettings._iDisplayStart >= oSettings.aiDisplay.length) {
                oSettings._iDisplayStart -= oSettings._iDisplayLength;
                if (oSettings._iDisplayStart < 0) { oSettings._iDisplayStart = 0 } 
            } _fnCalculateEnd(oSettings);
            _fnDraw(oSettings); var aData = oSettings.aoData[iAODataIndex]._aData.slice(); if (typeof bNullRow != "undefined" && bNullRow === true) {
                oSettings.aoData[iAODataIndex] = null
            } return aData
        }; this.fnClearTable = function(bRedraw) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            _fnClearTable(oSettings); if (typeof bRedraw == "undefined" || bRedraw) {
                _fnDraw(oSettings)
            } 
        }; this.fnOpen = function(nTr, sHtml, sClass) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            this.fnClose(nTr); var nNewRow = document.createElement("tr"); var nNewCell = document.createElement("td");
            nNewRow.appendChild(nNewCell); nNewCell.className = sClass; nNewCell.colSpan = _fnVisbleColumns(oSettings);
            nNewCell.innerHTML = sHtml; $(nNewRow).insertAfter(nTr); if (!oSettings.oFeatures.bServerSide) {
                oSettings.aoOpenRows.push({ nTr: nNewRow, nParent: nTr })
            } 
        }; this.fnClose = function(nTr) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            for (var i = 0; i < oSettings.aoOpenRows.length; i++) {
                if (oSettings.aoOpenRows[i].nParent == nTr) {
                    var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
                    if (nTrParent) { nTrParent.removeChild(oSettings.aoOpenRows[i].nTr) } oSettings.aoOpenRows.splice(i, 1);
                    return 0
                } 
            } return 1
        }; this.fnGetData = function(iRow) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            if (typeof iRow != "undefined") { return oSettings.aoData[iRow]._aData } return _fnGetDataMaster(oSettings)
        }; this.fnGetNodes = function(iRow) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            if (typeof iRow != "undefined") { return oSettings.aoData[iRow].nTr } return _fnGetTrNodes(oSettings)
        }; this.fnGetPosition = function(nNode) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            var i; if (nNode.nodeName == "TR") {
                for (i = 0; i < oSettings.aoData.length; i++) {
                    if (oSettings.aoData[i].nTr == nNode) {
                        return i
                    } 
                } 
            } else {
                if (nNode.nodeName == "TD") {
                    for (i = 0; i < oSettings.aoData.length; i++) {
                        var iCorrector = 0;
                        for (var j = 0; j < oSettings.aoColumns.length; j++) {
                            if (oSettings.aoColumns[j].bVisible) {
                                if (oSettings.aoData[i].nTr.getElementsByTagName("td")[j - iCorrector] == nNode) {
                                    return [i, j - iCorrector, j]
                                } 
                            } else { iCorrector++ } 
                        } 
                    } 
                } 
            } return null
        }; this.fnUpdate = function(mData, iRow, iColumn, bRedraw) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            var iVisibleColumn; var sDisplay; if (typeof bRedraw == "undefined") { bRedraw = true } if (typeof mData != "object") {
                sDisplay = mData;
                oSettings.aoData[iRow]._aData[iColumn] = sDisplay; if (oSettings.aoColumns[iColumn].fnRender !== null) {
                    sDisplay = oSettings.aoColumns[iColumn].fnRender({ iDataRow: iRow, iDataColumn: iColumn, aData: oSettings.aoData[iRow]._aData });
                    if (oSettings.aoColumns[iColumn].bUseRendered) {
                        oSettings.aoData[iRow]._aData[iColumn] = sDisplay
                    } 
                } iVisibleColumn = _fnColumnIndexToVisible(oSettings, iColumn); if (iVisibleColumn !== null) {
                    oSettings.aoData[iRow].nTr.getElementsByTagName("td")[iVisibleColumn].innerHTML = sDisplay
                } 
            } else {
                if (mData.length != oSettings.aoColumns.length) {
                    alert("Warning: An array passed to fnUpdate must have the same number of columns as the table in question - in this case " + oSettings.aoColumns.length);
                    return 1
                } for (var i = 0; i < mData.length; i++) {
                    sDisplay = mData[i]; oSettings.aoData[iRow]._aData[i] = sDisplay;
                    if (oSettings.aoColumns[i].fnRender !== null) {
                        sDisplay = oSettings.aoColumns[i].fnRender({ iDataRow: iRow, iDataColumn: i, aData: oSettings.aoData[iRow]._aData });
                        if (oSettings.aoColumns[i].bUseRendered) {
                            oSettings.aoData[iRow]._aData[i] = sDisplay
                        } 
                    } iVisibleColumn = _fnColumnIndexToVisible(oSettings, i); if (iVisibleColumn !== null) {
                        oSettings.aoData[iRow].nTr.getElementsByTagName("td")[iVisibleColumn].innerHTML = sDisplay
                    } 
                } 
            } _fnBuildSearchArray(oSettings, 1); if (bRedraw) { _fnReDraw(oSettings) } return 0
        }; this.fnSetColumnVis = function(iCol, bShow) {
            var oSettings = _fnSettingsFromNode(this[_oExt.iApiIndex]);
            var i, iLen; var iColumns = oSettings.aoColumns.length; var nTd; if (oSettings.aoColumns[iCol].bVisible == bShow) {
                return
            } var nTrHead = $("thead tr", oSettings.nTable)[0]; var nTrFoot = $("tfoot tr", oSettings.nTable)[0];
            var anTheadTh = []; var anTfootTh = []; for (i = 0; i < iColumns; i++) {
                anTheadTh.push(oSettings.aoColumns[i].nTh);
                anTfootTh.push(oSettings.aoColumns[i].nTf)
            } if (bShow) {
                var iInsert = 0; for (i = 0; i < iCol;
i++) { if (oSettings.aoColumns[i].bVisible) { iInsert++ } } if (iInsert >= _fnVisbleColumns(oSettings)) {
                    nTrHead.appendChild(anTheadTh[iCol]);
                    if (nTrFoot) { nTrFoot.appendChild(anTfootTh[iCol]) } for (i = 0, iLen = oSettings.aoData.length;
i < iLen; i++) {
                        nTd = oSettings.aoData[i]._anHidden[iCol]; oSettings.aoData[i].nTr.appendChild(nTd)
                    } 
                } else {
                    var iBefore; for (i = iCol; i < iColumns; i++) {
                        iBefore = _fnColumnIndexToVisible(oSettings, i);
                        if (iBefore !== null) { break } 
                    } nTrHead.insertBefore(anTheadTh[iCol], nTrHead.getElementsByTagName("th")[iBefore]);
                    if (nTrFoot) {
                        nTrFoot.insertBefore(anTfootTh[iCol], nTrFoot.getElementsByTagName("th")[iBefore])
                    } for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {
                        nTd = oSettings.aoData[i]._anHidden[iCol];
                        oSettings.aoData[i].nTr.insertBefore(nTd, oSettings.aoData[i].nTr.getElementsByTagName("td")[iBefore])
                    } 
                } oSettings.aoColumns[iCol].bVisible = true
            } else {
                nTrHead.removeChild(anTheadTh[iCol]);
                if (nTrFoot) { nTrFoot.removeChild(anTfootTh[iCol]) } var iVisCol = _fnColumnIndexToVisible(oSettings, iCol);
                for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {
                    nTd = oSettings.aoData[i].nTr.getElementsByTagName("td")[iVisCol];
                    oSettings.aoData[i]._anHidden[iCol] = nTd; nTd.parentNode.removeChild(nTd)
                } oSettings.aoColumns[iCol].bVisible = false
            } _fnSaveState(oSettings)
        }; function _fnExternApiFunc(sFunc) {
            return function() {
                var aArgs = [_fnSettingsFromNode(this[_oExt.iApiIndex])].concat(Array.prototype.slice.call(arguments));
                return _oExt.oApi[sFunc].apply(this, aArgs)
            } 
        } for (var sFunc in _oExt.oApi) {
            if (sFunc) {
                this[sFunc] = _fnExternApiFunc(sFunc)
            } 
        } function _fnInitalise(oSettings) {
            if (oSettings.bInitialised === false) {
                setTimeout(function() {
                    _fnInitalise(oSettings)
                }, 200); return
            } _fnAddOptionsHtml(oSettings); _fnDrawHead(oSettings); if (oSettings.oFeatures.bSort) {
                _fnSort(oSettings, false);
                _fnSortingClasses(oSettings)
            } else {
                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
                _fnCalculateEnd(oSettings); _fnDraw(oSettings)
            } if (oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide) {
                _fnProcessingDisplay(oSettings, true);
                $.getJSON(oSettings.sAjaxSource, null, function(json) {
                    for (var i = 0; i < json.aaData.length;
i++) { _fnAddData(oSettings, json.aaData[i]) } if (oSettings.oFeatures.bSort) {
                        _fnSort(oSettings)
                    } else {
                        oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); _fnCalculateEnd(oSettings);
                        _fnDraw(oSettings)
                    } _fnProcessingDisplay(oSettings, false); if (typeof oSettings.fnInitComplete == "function") {
                        oSettings.fnInitComplete(oSettings, json)
                    } 
                }); return
            } if (typeof oSettings.fnInitComplete == "function") {
                oSettings.fnInitComplete(oSettings)
            } 
        } function _fnLanguageProcess(oSettings, oLanguage, bInit) {
            _fnMap(oSettings.oLanguage, oLanguage, "sProcessing");
            _fnMap(oSettings.oLanguage, oLanguage, "sLengthMenu"); _fnMap(oSettings.oLanguage, oLanguage, "sZeroRecords");
            _fnMap(oSettings.oLanguage, oLanguage, "sInfo"); _fnMap(oSettings.oLanguage, oLanguage, "sInfoEmpty");
            _fnMap(oSettings.oLanguage, oLanguage, "sInfoFiltered"); _fnMap(oSettings.oLanguage, oLanguage, "sInfoPostFix");
            _fnMap(oSettings.oLanguage, oLanguage, "sSearch"); if (typeof oLanguage.oPaginate != "undefined") {
                _fnMap(oSettings.oLanguage.oPaginate, oLanguage.oPaginate, "sFirst");
                _fnMap(oSettings.oLanguage.oPaginate, oLanguage.oPaginate, "sPrevious"); _fnMap(oSettings.oLanguage.oPaginate, oLanguage.oPaginate, "sNext");
                _fnMap(oSettings.oLanguage.oPaginate, oLanguage.oPaginate, "sLast")
            } if (bInit) {
                _fnInitalise(oSettings)
            } 
        } function _fnAddColumn(oSettings, oOptions, nTh) {
            oSettings.aoColumns[oSettings.aoColumns.length++] = { sType: null, _bAutoType: true, bVisible: true, bSearchable: true, bSortable: true, sTitle: nTh ? nTh.innerHTML : "", sName: "", sWidth: null, sClass: null, fnRender: null, bUseRendered: true, iDataSort: oSettings.aoColumns.length - 1, nTh: nTh ? nTh : document.createElement("th"), nTf: null };
            var iLength = oSettings.aoColumns.length - 1; if (typeof oOptions != "undefined" && oOptions !== null) {
                var oCol = oSettings.aoColumns[iLength];
                if (typeof oOptions.sType != "undefined") {
                    oCol.sType = oOptions.sType; oCol._bAutoType = false
                } _fnMap(oCol, oOptions, "bVisible"); _fnMap(oCol, oOptions, "bSearchable"); _fnMap(oCol, oOptions, "bSortable");
                _fnMap(oCol, oOptions, "sTitle"); _fnMap(oCol, oOptions, "sName"); _fnMap(oCol, oOptions, "sWidth");
                _fnMap(oCol, oOptions, "sClass"); _fnMap(oCol, oOptions, "fnRender"); _fnMap(oCol, oOptions, "bUseRendered");
                _fnMap(oCol, oOptions, "iDataSort")
            } if (typeof oSettings.aoPreSearchCols[iLength] == "undefined" || oSettings.aoPreSearchCols[iLength] === null) {
                oSettings.aoPreSearchCols[iLength] = { sSearch: "", bEscapeRegex: true }
            } else {
                if (typeof oSettings.aoPreSearchCols[iLength].bEscapeRegex == "undefined") {
                    oSettings.aoPreSearchCols[iLength].bEscapeRegex = true
                } 
            } 
        } function _fnAddData(oSettings, aData) {
            if (aData.length != oSettings.aoColumns.length) {
                alert("Warning - added data does not match known column length");
                return -1
            } var iThisIndex = oSettings.aoData.length; oSettings.aoData.push({ _iId: oSettings.iNextId++, _aData: aData.slice(), nTr: document.createElement("tr"), _anHidden: [] });
            var nTd; for (var i = 0; i < aData.length; i++) {
                nTd = document.createElement("td"); if (typeof oSettings.aoColumns[i].fnRender == "function") {
                    var sRendered = oSettings.aoColumns[i].fnRender({ iDataRow: iThisIndex, iDataColumn: i, aData: aData });
                    nTd.innerHTML = sRendered; if (oSettings.aoColumns[i].bUseRendered) {
                        oSettings.aoData[iThisIndex]._aData[i] = sRendered
                    } 
                } else { nTd.innerHTML = aData[i] } if (oSettings.aoColumns[i].sClass !== null) {
                    nTd.className = oSettings.aoColumns[i].sClass
                } if (oSettings.aoColumns[i]._bAutoType && oSettings.aoColumns[i].sType != "string") {
                    if (oSettings.aoColumns[i].sType === null) {
                        oSettings.aoColumns[i].sType = _fnDetectType(aData[i])
                    } else {
                        if (oSettings.aoColumns[i].sType == "date" || oSettings.aoColumns[i].sType == "numeric") {
                            oSettings.aoColumns[i].sType = _fnDetectType(aData[i])
                        } 
                    } 
                } if (oSettings.aoColumns[i].bVisible) {
                    oSettings.aoData[iThisIndex].nTr.appendChild(nTd)
                } else { oSettings.aoData[iThisIndex]._anHidden[i] = nTd } 
            } oSettings.aiDisplayMaster.push(iThisIndex);
            return iThisIndex
        } function _fnGatherData(oSettings) {
            var iLoop; var i, j; if (oSettings.sAjaxSource === null) {
                $("tbody:eq(0)>tr", oSettings.nTable).each(function() {
                    var iThisIndex = oSettings.aoData.length;
                    oSettings.aoData.push({ _iId: oSettings.iNextId++, _aData: [], nTr: this, _anHidden: [] });
                    oSettings.aiDisplayMaster.push(iThisIndex); var aLocalData = oSettings.aoData[iThisIndex]._aData;
                    $("td", this).each(function(i) { aLocalData[i] = this.innerHTML })
                })
            } var iCorrector = 0; for (i = 0;
i < oSettings.aoColumns.length; i++) {
                if (oSettings.aoColumns[i].sTitle === null) {
                    oSettings.aoColumns[i].sTitle = oSettings.aoColumns[i].nTh.innerHTML
                } var bAutoType = oSettings.aoColumns[i]._bAutoType; var bRender = typeof oSettings.aoColumns[i].fnRender == "function";
                var bClass = oSettings.aoColumns[i].sClass !== null; var bVisible = oSettings.aoColumns[i].bVisible;
                if (bAutoType || bRender || bClass || !bVisible) {
                    iLoop = oSettings.aoData.length; for (j = 0; j < iLoop;
j++) {
                        var nCellNode = oSettings.aoData[j].nTr.getElementsByTagName("td")[i - iCorrector];
                        if (bAutoType) {
                            if (oSettings.aoColumns[i].sType === null) {
                                oSettings.aoColumns[i].sType = _fnDetectType(oSettings.aoData[j]._aData[i])
                            } else {
                                if (oSettings.aoColumns[i].sType == "date" || oSettings.aoColumns[i].sType == "numeric") {
                                    oSettings.aoColumns[i].sType = _fnDetectType(oSettings.aoData[j]._aData[i])
                                } 
                            } 
                        } if (bRender) {
                            var sRendered = oSettings.aoColumns[i].fnRender({ iDataRow: j, iDataColumn: i, aData: oSettings.aoData[j]._aData });
                            nCellNode.innerHTML = sRendered; if (oSettings.aoColumns[i].bUseRendered) {
                                oSettings.aoData[j]._aData[i] = sRendered
                            } 
                        } if (bClass) { nCellNode.className += " " + oSettings.aoColumns[i].sClass } if (!bVisible) {
                            oSettings.aoData[j]._anHidden[i] = nCellNode;
                            nCellNode.parentNode.removeChild(nCellNode)
                        } 
                    } if (!bVisible) { iCorrector++ } 
                } 
            } 
        } function _fnDrawHead(oSettings) {
            var i, nTh, iLen;
            var iThs = oSettings.nTable.getElementsByTagName("thead")[0].getElementsByTagName("th").length;
            var iCorrector = 0; if (iThs !== 0) {
                for (i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) {
                    nTh = oSettings.aoColumns[i].nTh;
                    if (oSettings.aoColumns[i].bVisible) {
                        if (oSettings.aoColumns[i].sWidth !== null) {
                            nTh.style.width = oSettings.aoColumns[i].sWidth
                        } if (oSettings.aoColumns[i].sTitle != nTh.innerHTML) {
                            nTh.innerHTML = oSettings.aoColumns[i].sTitle
                        } 
                    } else { nTh.parentNode.removeChild(nTh); iCorrector++ } 
                } 
            } else {
                var nTr = document.createElement("tr");
                for (i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) {
                    if (oSettings.aoColumns[i].bVisible) {
                        nTh = oSettings.aoColumns[i].nTh;
                        if (oSettings.aoColumns[i].sClass !== null) {
                            nTh.className = oSettings.aoColumns[i].sClass
                        } if (oSettings.aoColumns[i].sWidth !== null) {
                            nTh.style.width = oSettings.aoColumns[i].sWidth
                        } nTh.innerHTML = oSettings.aoColumns[i].sTitle; nTr.appendChild(nTh)
                    } 
                } $("thead", oSettings.nTable).html("")[0].appendChild(nTr)
            } if (oSettings.oFeatures.bSort) {
                for (i = 0; i < oSettings.aoColumns.length; i++) {
                    if (oSettings.aoColumns[i].bSortable === false) {
                        continue
                    } $(oSettings.aoColumns[i].nTh).click(function(e) {
                        var iDataIndex; for (var i = 0; i < oSettings.aoColumns.length;
i++) { if (oSettings.aoColumns[i].nTh == this) { iDataIndex = i; break } } if (oSettings.aoColumns[iDataIndex].bSortable === false) {
                            return
                        } var fnInnerSorting = function() {
                            if (e.shiftKey) {
                                var bFound = false; for (var i = 0; i < oSettings.aaSorting.length;
i++) {
                                    if (oSettings.aaSorting[i][0] == iDataIndex) {
                                        if (oSettings.aaSorting[i][1] == "asc") {
                                            oSettings.aaSorting[i][1] = "desc"
                                        } else { oSettings.aaSorting.splice(i, 1) } bFound = true; break
                                    } 
                                } if (bFound === false) {
                                    oSettings.aaSorting.push([iDataIndex, "asc"])
                                } 
                            } else {
                                if (oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex) {
                                    oSettings.aaSorting[0][1] = oSettings.aaSorting[0][1] == "asc" ? "desc" : "asc"
                                } else {
                                    oSettings.aaSorting.splice(0, oSettings.aaSorting.length); oSettings.aaSorting.push([iDataIndex, "asc"])
                                } 
                            } _fnSort(oSettings)
                        }; if (!oSettings.oFeatures.bProcessing) { fnInnerSorting() } else {
                            _fnProcessingDisplay(oSettings, true);
                            setTimeout(function() {
                                fnInnerSorting(); if (!oSettings.oFeatures.bServerSide) {
                                    _fnProcessingDisplay(oSettings, false)
                                } 
                            }, 0)
                        } 
                    })
                } $("thead th", oSettings.nTable).mousedown(function(e) {
                    if (e.shiftKey) {
                        this.onselectstart = function() {
                            return false
                        }; return false
                    } 
                })
            } if (oSettings.oFeatures.bAutoWidth) {
                oSettings.nTable.style.width = oSettings.nTable.offsetWidth + "px"
            } var nTfoot = oSettings.nTable.getElementsByTagName("tfoot"); if (nTfoot.length !== 0) {
                iCorrector = 0;
                var nTfs = nTfoot[0].getElementsByTagName("th"); for (i = 0, iLen = nTfs.length; i < iLen; i++) {
                    oSettings.aoColumns[i].nTf = nTfs[i - iCorrector];
                    if (!oSettings.aoColumns[i].bVisible) {
                        nTfs[i - iCorrector].parentNode.removeChild(nTfs[i - iCorrector]);
                        iCorrector++
                    } 
                } 
            } 
        } function _fnDraw(oSettings) {
            var i; var anRows = []; var iRowCount = 0; var bRowError = false;
            var iStrips = oSettings.asStripClasses.length; var iOpenRows = oSettings.aoOpenRows.length;
            if (oSettings.oFeatures.bServerSide && !_fnAjaxUpdate(oSettings)) { return } if (oSettings.aiDisplay.length !== 0) {
                var iStart = oSettings._iDisplayStart;
                var iEnd = oSettings._iDisplayEnd; if (oSettings.oFeatures.bServerSide) {
                    iStart = 0; iEnd = oSettings.aoData.length
                } for (var j = iStart; j < iEnd; j++) {
                    var nRow = oSettings.aoData[oSettings.aiDisplay[j]].nTr;
                    if (iStrips !== 0) {
                        $(nRow).removeClass(oSettings.asStripClasses.join(" ")); $(nRow).addClass(oSettings.asStripClasses[iRowCount % iStrips])
                    } if (typeof oSettings.fnRowCallback == "function") {
                        nRow = oSettings.fnRowCallback(nRow, oSettings.aoData[oSettings.aiDisplay[j]]._aData, iRowCount, j);
                        if (!nRow && !bRowError) {
                            alert("Error: A node was not returned by fnRowCallback"); bRowError = true
                        } 
                    } anRows.push(nRow); iRowCount++; if (iOpenRows !== 0) {
                        for (var k = 0; k < iOpenRows; k++) {
                            if (nRow == oSettings.aoOpenRows[k].nParent) {
                                anRows.push(oSettings.aoOpenRows[k].nTr)
                            } 
                        } 
                    } 
                } 
            } else {
                anRows[0] = document.createElement("tr"); if (typeof oSettings.asStripClasses[0] != "undefined") {
                    anRows[0].className = oSettings.asStripClasses[0]
                } var nTd = document.createElement("td"); nTd.setAttribute("valign", "top"); nTd.colSpan = oSettings.aoColumns.length;
                nTd.className = "dataTables_empty"; nTd.innerHTML = oSettings.oLanguage.sZeroRecords; anRows[iRowCount].appendChild(nTd)
            } if (typeof oSettings.fnHeaderCallback == "function") {
                oSettings.fnHeaderCallback($("thead tr", oSettings.nTable)[0], _fnGetDataMaster(oSettings), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay)
            } if (typeof oSettings.fnFooterCallback == "function") {
                oSettings.fnFooterCallback($("tfoot tr", oSettings.nTable)[0], _fnGetDataMaster(oSettings), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay)
            } var nTrs = $("tbody:eq(0)>tr", oSettings.nTable); for (i = 0; i < nTrs.length; i++) {
                nTrs[i].parentNode.removeChild(nTrs[i])
            } var nBody = $("tbody:eq(0)", oSettings.nTable); if (nBody[0]) {
                for (i = 0; i < anRows.length;
i++) { nBody[0].appendChild(anRows[i]) } 
            } if (oSettings.oFeatures.bPaginate) {
                _oExt.oPagination[oSettings.sPaginationType].fnUpdate(oSettings, function(oSettings) {
                    _fnCalculateEnd(oSettings);
                    _fnDraw(oSettings)
                })
            } if (oSettings.oFeatures.bInfo && oSettings.anFeatures.i) {
                if (oSettings.fnRecordsDisplay() === 0 && oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal()) {
                    oSettings.anFeatures.i.innerHTML = oSettings.oLanguage.sInfoEmpty + oSettings.oLanguage.sInfoPostFix
                } else {
                    if (oSettings.fnRecordsDisplay() === 0) {
                        oSettings.anFeatures.i.innerHTML = oSettings.oLanguage.sInfoEmpty + " " + oSettings.oLanguage.sInfoFiltered.replace("_MAX_", oSettings.fnRecordsTotal()) + oSettings.oLanguage.sInfoPostFix
                    } else {
                        if (oSettings.fnRecordsDisplay() == oSettings.fnRecordsTotal()) {
                            oSettings.anFeatures.i.innerHTML = oSettings.oLanguage.sInfo.replace("_START_", oSettings._iDisplayStart + 1).replace("_END_", oSettings.fnDisplayEnd()).replace("_TOTAL_", oSettings.fnRecordsDisplay()) + oSettings.oLanguage.sInfoPostFix
                        } else {
                            oSettings.anFeatures.i.innerHTML = oSettings.oLanguage.sInfo.replace("_START_", oSettings._iDisplayStart + 1).replace("_END_", oSettings.fnDisplayEnd()).replace("_TOTAL_", oSettings.fnRecordsDisplay()) + " " + oSettings.oLanguage.sInfoFiltered.replace("_MAX_", oSettings.fnRecordsTotal()) + oSettings.oLanguage.sInfoPostFix
                        } 
                    } 
                } 
            } if (oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort) {
                _fnSortingClasses(oSettings)
            } _fnSaveState(oSettings); if (typeof oSettings.fnDrawCallback == "function") {
                oSettings.fnDrawCallback(oSettings)
            } 
        } function _fnReDraw(oSettings) {
            if (oSettings.oFeatures.bSort) {
                _fnSort(oSettings, oSettings.oPreviousSearch)
            } else {
                if (oSettings.oFeatures.bFilter) {
                    _fnFilterComplete(oSettings, oSettings.oPreviousSearch)
                } else { _fnCalculateEnd(oSettings); _fnDraw(oSettings) } 
            } 
        } function _fnAjaxUpdate(oSettings) {
            if (oSettings.bAjaxDataGet) {
                _fnProcessingDisplay(oSettings, true);
                var iColumns = oSettings.aoColumns.length; var aoData = []; var i; oSettings.iServerDraw++;
                aoData.push({ name: "sEcho", value: oSettings.iServerDraw }); aoData.push({ name: "iColumns", value: iColumns });
                aoData.push({ name: "sColumns", value: _fnColumnOrdering(oSettings) }); aoData.push({ name: "iDisplayStart", value: oSettings._iDisplayStart });
                aoData.push({ name: "iDisplayLength", value: oSettings.oFeatures.bPaginate !== false ? oSettings._iDisplayLength : -1 });
                if (oSettings.oFeatures.bFilter !== false) {
                    aoData.push({ name: "sSearch", value: oSettings.oPreviousSearch.sSearch });
                    aoData.push({ name: "bEscapeRegex", value: oSettings.oPreviousSearch.bEscapeRegex }); for (i = 0;
i < iColumns; i++) {
                        aoData.push({ name: "sSearch_" + i, value: oSettings.aoPreSearchCols[i].sSearch });
                        aoData.push({ name: "bEscapeRegex_" + i, value: oSettings.aoPreSearchCols[i].bEscapeRegex })
                    } 
                } if (oSettings.oFeatures.bSort !== false) {
                    var iFixed = oSettings.aaSortingFixed !== null ? oSettings.aaSortingFixed.length : 0;
                    var iUser = oSettings.aaSorting.length; aoData.push({ name: "iSortingCols", value: iFixed + iUser });
                    for (i = 0; i < iFixed; i++) {
                        aoData.push({ name: "iSortCol_" + i, value: oSettings.aaSortingFixed[i][0] });
                        aoData.push({ name: "iSortDir_" + i, value: oSettings.aaSortingFixed[i][1] })
                    } for (i = 0; i < iUser;
i++) {
                        aoData.push({ name: "iSortCol_" + (i + iFixed), value: oSettings.aaSorting[i][0] }); aoData.push({ name: "iSortDir_" + (i + iFixed), value: oSettings.aaSorting[i][1] })
                    } 
                } oSettings.fnServerData(oSettings.sAjaxSource, aoData, function(json) {
                    _fnAjaxUpdateDraw(oSettings, json)
                }); return false
            } else { return true } 
        } function _fnAjaxUpdateDraw(oSettings, json) {
            if (typeof json.sEcho != "undefined") {
                if (json.sEcho * 1 < oSettings.iServerDraw) {
                    return
                } else { oSettings.iServerDraw = json.sEcho * 1 } 
            } _fnClearTable(oSettings); oSettings._iRecordsTotal = json.iTotalRecords;
            oSettings._iRecordsDisplay = json.iTotalDisplayRecords; var sOrdering = _fnColumnOrdering(oSettings);
            var bReOrder = (json.sColumns != "undefined" && sOrdering !== "" && json.sColumns != sOrdering);
            if (bReOrder) { var aiIndex = _fnReOrderIndex(oSettings, json.sColumns) } for (var i = 0, iLen = json.aaData.length;
i < iLen; i++) {
                if (bReOrder) {
                    var aData = []; for (var j = 0, jLen = oSettings.aoColumns.length;
j < jLen; j++) { aData.push(json.aaData[i][aiIndex[j]]) } _fnAddData(oSettings, aData)
                } else {
                    _fnAddData(oSettings, json.aaData[i])
                } 
            } oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); oSettings.bAjaxDataGet = false;
            _fnDraw(oSettings); oSettings.bAjaxDataGet = true; _fnProcessingDisplay(oSettings, false)
        } function _fnAddOptionsHtml(oSettings) {
            var nHolding = document.createElement("div");
            oSettings.nTable.parentNode.insertBefore(nHolding, oSettings.nTable); var nWrapper = document.createElement("div");
            nWrapper.className = "dataTables_wrapper"; if (oSettings.sTableId !== "") {
                nWrapper.setAttribute("id", oSettings.sTableId + "_wrapper")
            } var nInsertNode = nWrapper; var sDom = oSettings.sDomPositioning.split(""); var nTmp; for (var i = 0;
i < sDom.length; i++) {
                var cOption = sDom[i]; if (cOption == "<") {
                    var nNewNode = document.createElement("div");
                    var cNext = sDom[i + 1]; if (cNext == "'" || cNext == '"') {
                        var sClass = ""; var j = 2; while (sDom[i + j] != cNext) {
                            sClass += sDom[i + j];
                            j++
                        } nNewNode.className = sClass; i += j
                    } nInsertNode.appendChild(nNewNode); nInsertNode = nNewNode
                } else {
                    if (cOption == ">") { nInsertNode = nInsertNode.parentNode } else {
                        if (cOption == "l" && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange) {
                            nTmp = _fnFeatureHtmlLength(oSettings);
                            oSettings.anFeatures[cOption] = nTmp; nInsertNode.appendChild(nTmp)
                        } else {
                            if (cOption == "f" && oSettings.oFeatures.bFilter) {
                                nTmp = _fnFeatureHtmlFilter(oSettings);
                                oSettings.anFeatures[cOption] = nTmp; nInsertNode.appendChild(nTmp)
                            } else {
                                if (cOption == "r" && oSettings.oFeatures.bProcessing) {
                                    nTmp = _fnFeatureHtmlProcessing(oSettings);
                                    oSettings.anFeatures[cOption] = nTmp; nInsertNode.appendChild(nTmp)
                                } else {
                                    if (cOption == "t") {
                                        oSettings.anFeatures[cOption] = oSettings.nTable;
                                        nInsertNode.appendChild(oSettings.nTable)
                                    } else {
                                        if (cOption == "i" && oSettings.oFeatures.bInfo) {
                                            nTmp = _fnFeatureHtmlInfo(oSettings);
                                            oSettings.anFeatures[cOption] = nTmp; nInsertNode.appendChild(nTmp)
                                        } else {
                                            if (cOption == "p" && oSettings.oFeatures.bPaginate) {
                                                nTmp = _fnFeatureHtmlPaginate(oSettings);
                                                oSettings.anFeatures[cOption] = nTmp; nInsertNode.appendChild(nTmp)
                                            } else {
                                                if (_oExt.aoFeatures.length !== 0) {
                                                    var aoFeatures = _oExt.aoFeatures;
                                                    for (var k = 0, kLen = aoFeatures.length; k < kLen; k++) {
                                                        if (cOption == aoFeatures[k].cFeature) {
                                                            nTmp = aoFeatures[k].fnInit(oSettings);
                                                            oSettings.anFeatures[cOption] = nTmp; nInsertNode.appendChild(nTmp); break
                                                        } 
                                                    } 
                                                } 
                                            } 
                                        } 
                                    } 
                                } 
                            } 
                        } 
                    } 
                } 
            } nHolding.parentNode.replaceChild(nWrapper, nHolding)
        } function _fnFeatureHtmlFilter(oSettings) {
            var nFilter = document.createElement("div");
            if (oSettings.sTableId !== "") {
                nFilter.setAttribute("id", oSettings.sTableId + "_filter")
            } nFilter.className = "dataTables_filter"; var sSpace = oSettings.oLanguage.sSearch === "" ? "" : " ";
            nFilter.innerHTML = oSettings.oLanguage.sSearch + sSpace + '<input type="text" />'; var jqFilter = $("input", nFilter);
            jqFilter.val(oSettings.oPreviousSearch.sSearch.replace('"', "&quot;")); jqFilter.keyup(function(e) {
                _fnFilterComplete(oSettings, { sSearch: this.value, bEscapeRegex: oSettings.oPreviousSearch.bEscapeRegex })
            }); return nFilter
        } function _fnFeatureHtmlInfo(oSettings) {
            var nInfo = document.createElement("div");
            if (oSettings.sTableId !== "") { nInfo.setAttribute("id", oSettings.sTableId + "_info") } nInfo.className = "dataTables_info";
            return nInfo
        } function _fnFeatureHtmlPaginate(oSettings) {
            var nPaginate = document.createElement("div");
            nPaginate.className = "dataTables_paginate paging_" + oSettings.sPaginationType; oSettings.anFeatures.p = nPaginate;
            _oExt.oPagination[oSettings.sPaginationType].fnInit(oSettings, function(oSettings) {
                _fnCalculateEnd(oSettings);
                _fnDraw(oSettings)
            }); return nPaginate
        } function _fnFeatureHtmlLength(oSettings) {
            var sName = (oSettings.sTableId === "") ? "" : 'name="' + oSettings.sTableId + '_length"';
            var sStdMenu = '<select size="1" ' + sName + '><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select>';
            var nLength = document.createElement("div"); if (oSettings.sTableId !== "") {
                nLength.setAttribute("id", oSettings.sTableId + "_length")
            } nLength.className = "dataTables_length"; nLength.innerHTML = oSettings.oLanguage.sLengthMenu.replace("_MENU_", sStdMenu);
            $('select option[value="' + oSettings._iDisplayLength + '"]', nLength).attr("selected", true);
            $("select", nLength).change(function(e) {
                oSettings._iDisplayLength = parseInt($(this).val(), 10);
                _fnCalculateEnd(oSettings); if (oSettings._iDisplayEnd == oSettings.aiDisplay.length) {
                    oSettings._iDisplayStart = oSettings._iDisplayEnd - oSettings._iDisplayLength;
                    if (oSettings._iDisplayStart < 0) { oSettings._iDisplayStart = 0 } 
                } if (oSettings._iDisplayLength == -1) {
                    oSettings._iDisplayStart = 0
                } _fnDraw(oSettings)
            }); return nLength
        } function _fnFeatureHtmlProcessing(oSettings) {
            var nProcessing = document.createElement("div");
            if (oSettings.sTableId !== "") {
                nProcessing.setAttribute("id", oSettings.sTableId + "_processing")
            } nProcessing.innerHTML = oSettings.oLanguage.sProcessing; nProcessing.className = "dataTables_processing";
            oSettings.nTable.parentNode.insertBefore(nProcessing, oSettings.nTable); return nProcessing
        } function _fnProcessingDisplay(oSettings, bShow) {
            if (oSettings.oFeatures.bProcessing) {
                oSettings.anFeatures.r.style.visibility = bShow ? "visible" : "hidden"
            } 
        } function _fnFilterComplete(oSettings, oInput, iForce) {
            _fnFilter(oSettings, oInput.sSearch, iForce, oInput.bEscapeRegex);
            for (var i = 0; i < oSettings.aoPreSearchCols.length; i++) {
                _fnFilterColumn(oSettings, oSettings.aoPreSearchCols[i].sSearch, i, oSettings.aoPreSearchCols[i].bEscapeRegex)
            } if (_oExt.afnFiltering.length !== 0) { _fnFilterCustom(oSettings) } if (typeof oSettings.iInitDisplayStart != "undefined" && oSettings.iInitDisplayStart != -1) {
                oSettings._iDisplayStart = oSettings.iInitDisplayStart;
                oSettings.iInitDisplayStart = -1
            } else { oSettings._iDisplayStart = 0 } _fnCalculateEnd(oSettings);
            _fnDraw(oSettings); _fnBuildSearchArray(oSettings, 0)
        } function _fnFilterCustom(oSettings) {
            var afnFilters = _oExt.afnFiltering;
            for (var i = 0, iLen = afnFilters.length; i < iLen; i++) {
                var iCorrector = 0; for (var j = 0, jLen = oSettings.aiDisplay.length;
j < jLen; j++) {
                    var iDisIndex = oSettings.aiDisplay[j - iCorrector]; if (!afnFilters[i](oSettings, oSettings.aoData[iDisIndex]._aData, iDisIndex)) {
                        oSettings.aiDisplay.splice(j - iCorrector, 1);
                        iCorrector++
                    } 
                } 
            } 
        } function _fnFilterColumn(oSettings, sInput, iColumn, bEscapeRegex) {
            if (sInput === "") {
                return
            } var iIndexCorrector = 0; var sRegexMatch = bEscapeRegex ? _fnEscapeRegex(sInput) : sInput;
            var rpSearch = new RegExp(sRegexMatch, "i"); for (var i = oSettings.aiDisplay.length - 1; i >= 0;
i--) {
                var sData = _fnDataToSearch(oSettings.aoData[oSettings.aiDisplay[i]]._aData[iColumn], oSettings.aoColumns[iColumn].sType);
                if (!rpSearch.test(sData)) { oSettings.aiDisplay.splice(i, 1); iIndexCorrector++ } 
            } 
        } function _fnFilter(oSettings, sInput, iForce, bEscapeRegex) {
            var i;
            if (typeof iForce == "undefined" || iForce === null) { iForce = 0 } if (_oExt.afnFiltering.length !== 0) {
                iForce = 1
            } var asSearch = bEscapeRegex ? _fnEscapeRegex(sInput).split(" ") : sInput.split(" "); var sRegExpString = "^(?=.*?" + asSearch.join(")(?=.*?") + ").*$";
            var rpSearch = new RegExp(sRegExpString, "i"); if (sInput.length <= 0) {
                oSettings.aiDisplay.splice(0, oSettings.aiDisplay.length);
                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice()
            } else {
                if (oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length || oSettings.oPreviousSearch.sSearch.length > sInput.length || iForce == 1 || sInput.indexOf(oSettings.oPreviousSearch.sSearch) !== 0) {
                    oSettings.aiDisplay.splice(0, oSettings.aiDisplay.length);
                    _fnBuildSearchArray(oSettings, 1); for (i = 0; i < oSettings.aiDisplayMaster.length; i++) {
                        if (rpSearch.test(oSettings.asDataSearch[i])) {
                            oSettings.aiDisplay.push(oSettings.aiDisplayMaster[i])
                        } 
                    } 
                } else {
                    var iIndexCorrector = 0; for (i = 0; i < oSettings.asDataSearch.length; i++) {
                        if (!rpSearch.test(oSettings.asDataSearch[i])) {
                            oSettings.aiDisplay.splice(i - iIndexCorrector, 1);
                            iIndexCorrector++
                        } 
                    } 
                } 
            } oSettings.oPreviousSearch.sSearch = sInput; oSettings.oPreviousSearch.bEscapeRegex = bEscapeRegex
        } function _fnSort(oSettings, bApplyClasses) {
            var aaSort = []; var oSort = _oExt.oSort; var aoData = oSettings.aoData;
            var iDataSort; var iDataType; var i; if (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) {
                if (oSettings.aaSortingFixed !== null) {
                    aaSort = oSettings.aaSortingFixed.concat(oSettings.aaSorting)
                } else { aaSort = oSettings.aaSorting.slice() } if (!window.runtime) {
                    var fnLocalSorting; var sDynamicSort = "fnLocalSorting = function(a,b){var iTest;";
                    for (i = 0; i < aaSort.length - 1; i++) {
                        iDataSort = oSettings.aoColumns[aaSort[i][0]].iDataSort;
                        iDataType = oSettings.aoColumns[iDataSort].sType; sDynamicSort += "iTest = oSort['" + iDataType + "-" + aaSort[i][1] + "']( aoData[a]._aData[" + iDataSort + "], aoData[b]._aData[" + iDataSort + "] ); if ( iTest === 0 )"
                    } iDataSort = oSettings.aoColumns[aaSort[aaSort.length - 1][0]].iDataSort; iDataType = oSettings.aoColumns[iDataSort].sType;
                    sDynamicSort += "iTest = oSort['" + iDataType + "-" + aaSort[aaSort.length - 1][1] + "']( aoData[a]._aData[" + iDataSort + "], aoData[b]._aData[" + iDataSort + "] ); return iTest;}";
                    eval(sDynamicSort); oSettings.aiDisplayMaster.sort(fnLocalSorting)
                } else {
                    var aAirSort = [];
                    var iLen = aaSort.length; for (i = 0; i < iLen; i++) {
                        iDataSort = oSettings.aoColumns[aaSort[i][0]].iDataSort;
                        aAirSort.push([iDataSort, oSettings.aoColumns[iDataSort].sType + "-" + aaSort[i][1]])
                    } oSettings.aiDisplayMaster.sort(function(a, b) {
                        var iTest;
                        for (var i = 0; i < iLen; i++) {
                            iTest = oSort[aAirSort[i][1]](aoData[a]._aData[aAirSort[i][0]], aoData[b]._aData[aAirSort[i][0]]);
                            if (iTest !== 0) { return iTest } 
                        } return 0
                    })
                } 
            } if (typeof bApplyClasses == "undefined" || bApplyClasses) {
                _fnSortingClasses(oSettings)
            } if (oSettings.oFeatures.bFilter) {
                _fnFilterComplete(oSettings, oSettings.oPreviousSearch, 1)
            } else {
                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); oSettings._iDisplayStart = 0;
                _fnCalculateEnd(oSettings); _fnDraw(oSettings)
            } 
        } function _fnSortingClasses(oSettings) {
            var i;
            var aaSort; var iColumns = oSettings.aoColumns.length; for (i = 0; i < iColumns; i++) {
                $(oSettings.aoColumns[i].nTh).removeClass("sorting_asc sorting_desc sorting")
            } if (oSettings.aaSortingFixed !== null) {
                aaSort = oSettings.aaSortingFixed.concat(oSettings.aaSorting)
            } else { aaSort = oSettings.aaSorting.slice() } for (i = 0; i < oSettings.aoColumns.length; i++) {
                if (oSettings.aoColumns[i].bSortable && oSettings.aoColumns[i].bVisible) {
                    var sClass = "sorting";
                    for (var j = 0; j < aaSort.length; j++) {
                        if (aaSort[j][0] == i) {
                            sClass = (aaSort[j][1] == "asc") ? "sorting_asc" : "sorting_desc";
                            break
                        } 
                    } $(oSettings.aoColumns[i].nTh).addClass(sClass)
                } 
            } if (oSettings.oFeatures.bSortClasses) {
                var nTrs = _fnGetTrNodes(oSettings);
                $("td", nTrs).removeClass("sorting_1 sorting_2 sorting_3"); var iClass = 1; for (i = 0; i < aaSort.length;
i++) {
                    var iVis = _fnColumnIndexToVisible(oSettings, aaSort[i][0]); if (iVis !== null) {
                        if (iClass <= 2) {
                            $("td:eq(" + iVis + ")", nTrs).addClass("sorting_" + iClass)
                        } else { $("td:eq(" + iVis + ")", nTrs).addClass("sorting_3") } iClass++
                    } 
                } 
            } 
        } function _fnVisibleToColumnIndex(oSettings, iMatch) {
            var iColumn = -1;
            for (var i = 0; i < oSettings.aoColumns.length; i++) {
                if (oSettings.aoColumns[i].bVisible === true) {
                    iColumn++
                } if (iColumn == iMatch) { return i } 
            } return null
        } function _fnColumnIndexToVisible(oSettings, iMatch) {
            var iVisible = -1;
            for (var i = 0; i < oSettings.aoColumns.length; i++) {
                if (oSettings.aoColumns[i].bVisible === true) {
                    iVisible++
                } if (i == iMatch) { return oSettings.aoColumns[i].bVisible === true ? iVisible : null } 
            } return null
        } function _fnVisbleColumns(oS) {
            var iVis = 0; for (var i = 0; i < oS.aoColumns.length; i++) {
                if (oS.aoColumns[i].bVisible === true) {
                    iVis++
                } 
            } return iVis
        } function _fnBuildSearchArray(oSettings, iMaster) {
            oSettings.asDataSearch.splice(0, oSettings.asDataSearch.length);
            var aArray = (typeof iMaster != "undefined" && iMaster == 1) ? oSettings.aiDisplayMaster : oSettings.aiDisplay;
            for (var i = 0, iLen = aArray.length; i < iLen; i++) {
                oSettings.asDataSearch[i] = ""; for (var j = 0, jLen = oSettings.aoColumns.length;
j < jLen; j++) {
                    if (oSettings.aoColumns[j].bSearchable) {
                        var sData = oSettings.aoData[aArray[i]]._aData[j];
                        oSettings.asDataSearch[i] += _fnDataToSearch(sData, oSettings.aoColumns[j].sType) + " "
                    } 
                } 
            } 
        } function _fnDataToSearch(sData, sType) {
            if (typeof _oExt.ofnSearch[sType] == "function") {
                return _oExt.ofnSearch[sType](sData)
            } else {
                if (sType == "html") { return sData.replace(/\n/g, " ").replace(/<.*?>/g, "") } else {
                    if (typeof sData == "string") {
                        return sData.replace(/\n/g, " ")
                    } 
                } 
            } return sData
        } function _fnCalculateEnd(oSettings) {
            if (oSettings.oFeatures.bPaginate === false) {
                oSettings._iDisplayEnd = oSettings.aiDisplay.length
            } else {
                if (oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length || oSettings._iDisplayLength == -1) {
                    oSettings._iDisplayEnd = oSettings.aiDisplay.length
                } else { oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength } 
            } 
        } function _fnConvertToWidth(sWidth, nParent) {
            if (!sWidth || sWidth === null || sWidth === "") {
                return 0
            } if (typeof nParent == "undefined") {
                nParent = document.getElementsByTagName("body")[0]
            } var iWidth; var nTmp = document.createElement("div"); nTmp.style.width = sWidth; nParent.appendChild(nTmp);
            iWidth = nTmp.offsetWidth; nParent.removeChild(nTmp); return (iWidth)
        } function _fnCalculateColumnWidths(oSettings) {
            var iTableWidth = oSettings.nTable.offsetWidth;
            var iTotalUserIpSize = 0; var iTmpWidth; var iVisibleColumns = 0; var iColums = oSettings.aoColumns.length;
            var i; var oHeaders = $("thead th", oSettings.nTable); for (i = 0; i < iColums; i++) {
                if (oSettings.aoColumns[i].bVisible) {
                    iVisibleColumns++;
                    if (oSettings.aoColumns[i].sWidth !== null) {
                        iTmpWidth = _fnConvertToWidth(oSettings.aoColumns[i].sWidth, oSettings.nTable.parentNode);
                        iTotalUserIpSize += iTmpWidth; oSettings.aoColumns[i].sWidth = iTmpWidth + "px"
                    } 
                } 
            } if (iColums == oHeaders.length && iTotalUserIpSize === 0 && iVisibleColumns == iColums) {
                for (i = 0;
i < oSettings.aoColumns.length; i++) {
                    oSettings.aoColumns[i].sWidth = oHeaders[i].offsetWidth + "px"
                } 
            } else {
                var nCalcTmp = oSettings.nTable.cloneNode(false); nCalcTmp.setAttribute("id", "");
                var sTableTmp = '<table class="' + nCalcTmp.className + '">'; var sCalcHead = "<tr>"; var sCalcHtml = "<tr>";
                for (i = 0; i < iColums; i++) {
                    if (oSettings.aoColumns[i].bVisible) {
                        sCalcHead += "<th>" + oSettings.aoColumns[i].sTitle + "</th>";
                        if (oSettings.aoColumns[i].sWidth !== null) {
                            var sWidth = ""; if (oSettings.aoColumns[i].sWidth !== null) {
                                sWidth = ' style="width:' + oSettings.aoColumns[i].sWidth + ';"'
                            } sCalcHtml += "<td" + sWidth + ' tag_index="' + i + '">' + fnGetMaxLenString(oSettings, i) + "</td>"
                        } else { sCalcHtml += '<td tag_index="' + i + '">' + fnGetMaxLenString(oSettings, i) + "</td>" } 
                    } 
                } sCalcHead += "</tr>";
                sCalcHtml += "</tr>"; nCalcTmp = $(sTableTmp + sCalcHead + sCalcHtml + "</table>")[0]; nCalcTmp.style.width = iTableWidth + "px";
                nCalcTmp.style.visibility = "hidden"; nCalcTmp.style.position = "absolute"; oSettings.nTable.parentNode.appendChild(nCalcTmp);
                var oNodes = $("td", nCalcTmp); var iIndex; for (i = 0; i < oNodes.length; i++) {
                    iIndex = oNodes[i].getAttribute("tag_index");
                    oSettings.aoColumns[iIndex].sWidth = $("td", nCalcTmp)[i].offsetWidth + "px"
                } oSettings.nTable.parentNode.removeChild(nCalcTmp)
            } 
        } function fnGetMaxLenString(oSettings, iCol) {
            var iMax = 0; var iMaxIndex = -1; for (var i = 0;
i < oSettings.aoData.length; i++) {
                if (oSettings.aoData[i]._aData[iCol].length > iMax) {
                    iMax = oSettings.aoData[i]._aData[iCol].length;
                    iMaxIndex = i
                } 
            } if (iMaxIndex >= 0) { return oSettings.aoData[iMaxIndex]._aData[iCol] } return ""
        } function _fnArrayCmp(aArray1, aArray2) {
            if (aArray1.length != aArray2.length) {
                return 1
            } for (var i = 0; i < aArray1.length; i++) { if (aArray1[i] != aArray2[i]) { return 2 } } return 0
        } function _fnDetectType(sData) {
            var aTypes = _oExt.aTypes;
            var iLen = aTypes.length; for (var i = 0; i < iLen; i++) {
                var sType = aTypes[i](sData); if (sType !== null) {
                    return sType
                } 
            } return "string"
        } function _fnSettingsFromNode(nTable) {
            for (var i = 0; i < _aoSettings.length;
i++) { if (_aoSettings[i].nTable == nTable) { return _aoSettings[i] } } return null
        } function _fnGetDataMaster(oSettings) {
            var aData = [];
            var iLen = oSettings.aoData.length; for (var i = 0; i < iLen; i++) {
                aData.push(oSettings.aoData[i]._aData)
            } return aData
        } function _fnGetTrNodes(oSettings) {
            var aNodes = []; var iLen = oSettings.aoData.length;
            for (var i = 0; i < iLen; i++) { aNodes.push(oSettings.aoData[i].nTr) } return aNodes
        } function _fnEscapeRegex(sVal) {
            var acEscape = ["/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^"];
            var reReplace = new RegExp("(\\" + acEscape.join("|\\") + ")", "g"); return sVal.replace(reReplace, "\\$1")
        } function _fnReOrderIndex(oSettings, sColumns) {
            var aColumns = sColumns.split(","); var aiReturn = [];
            for (var i = 0, iLen = oSettings.aoColumns.length; i < iLen; i++) {
                for (var j = 0; j < iLen; j++) {
                    if (oSettings.aoColumns[i].sName == aColumns[j]) {
                        aiReturn.push(j);
                        break
                    } 
                } 
            } return aiReturn
        } function _fnColumnOrdering(oSettings) {
            var sNames = ""; for (var i = 0, iLen = oSettings.aoColumns.length;
i < iLen; i++) { sNames += oSettings.aoColumns[i].sName + "," } if (sNames.length == iLen) {
                return ""
            } return sNames.slice(0, -1)
        } function _fnClearTable(oSettings) {
            oSettings.aoData.length = 0;
            oSettings.aiDisplayMaster.length = 0; oSettings.aiDisplay.length = 0; _fnCalculateEnd(oSettings)
        } function _fnSaveState(oSettings) {
            if (!oSettings.oFeatures.bStateSave) { return } var i;
            var sValue = "{"; sValue += '"iStart": ' + oSettings._iDisplayStart + ","; sValue += '"iEnd": ' + oSettings._iDisplayEnd + ",";
            sValue += '"iLength": ' + oSettings._iDisplayLength + ","; sValue += '"sFilter": "' + oSettings.oPreviousSearch.sSearch.replace('"', '\\"') + '",';
            sValue += '"sFilterEsc": ' + oSettings.oPreviousSearch.bEscapeRegex + ","; sValue += '"aaSorting": [ ';
            for (i = 0; i < oSettings.aaSorting.length; i++) {
                sValue += "[" + oSettings.aaSorting[i][0] + ",'" + oSettings.aaSorting[i][1] + "'],"
            } sValue = sValue.substring(0, sValue.length - 1); sValue += "],"; sValue += '"aaSearchCols": [ ';
            for (i = 0; i < oSettings.aoPreSearchCols.length; i++) {
                sValue += "['" + oSettings.aoPreSearchCols[i].sSearch.replace("'", "'") + "'," + oSettings.aoPreSearchCols[i].bEscapeRegex + "],"
            } sValue = sValue.substring(0, sValue.length - 1); sValue += "],"; sValue += '"abVisCols": [ ';
            for (i = 0; i < oSettings.aoColumns.length; i++) {
                sValue += oSettings.aoColumns[i].bVisible + ","
            } sValue = sValue.substring(0, sValue.length - 1); sValue += "]"; sValue += "}"; _fnCreateCookie("SpryMedia_DataTables_" + oSettings.sInstance, sValue, oSettings.iCookieDuration)
        } function _fnLoadState(oSettings, oInit) {
            if (!oSettings.oFeatures.bStateSave) {
                return
            } var oData; var sData = _fnReadCookie("SpryMedia_DataTables_" + oSettings.sInstance); if (sData !== null && sData !== "") {
                try {
                    if (typeof JSON == "object" && typeof JSON.parse == "function") {
                        oData = JSON.parse(sData.replace(/'/g, '"'))
                    } else { oData = eval("(" + sData + ")") } 
                } catch (e) { return } oSettings._iDisplayStart = oData.iStart;
                oSettings.iInitDisplayStart = oData.iStart; oSettings._iDisplayEnd = oData.iEnd; oSettings._iDisplayLength = oData.iLength;
                oSettings.oPreviousSearch.sSearch = oData.sFilter; oSettings.aaSorting = oData.aaSorting.slice();
                if (typeof oData.sFilterEsc != "undefined") {
                    oSettings.oPreviousSearch.bEscapeRegex = oData.sFilterEsc
                } if (typeof oData.aaSearchCols != "undefined") {
                    for (var i = 0; i < oData.aaSearchCols.length;
i++) {
                        oSettings.aoPreSearchCols[i] = { sSearch: oData.aaSearchCols[i][0], bEscapeRegex: oData.aaSearchCols[i][1] }
                    } 
                } if (typeof oData.abVisCols != "undefined") {
                    if (typeof oInit.aoColumns == "undefined") {
                        oInit.aoColumns = []
                    } for (i = 0; i < oData.abVisCols.length; i++) {
                        if (typeof oInit.aoColumns[i] == "undefined" || oInit.aoColumns[i] === null) {
                            oInit.aoColumns[i] = {}
                        } oInit.aoColumns[i].bVisible = oData.abVisCols[i]
                    } 
                } 
            } 
        } function _fnCreateCookie(sName, sValue, iSecs) {
            var date = new Date();
            date.setTime(date.getTime() + (iSecs * 1000)); sName += "_" + window.location.pathname.replace(/[\/:]/g, "").toLowerCase();
            document.cookie = sName + "=" + sValue + "; expires=" + date.toGMTString() + "; path=/"
        } function _fnReadCookie(sName) {
            var sNameEQ = sName + "_" + window.location.pathname.replace(/[\/:]/g, "").toLowerCase() + "=";
            var sCookieContents = document.cookie.split(";"); for (var i = 0; i < sCookieContents.length;
i++) {
                var c = sCookieContents[i]; while (c.charAt(0) == " ") { c = c.substring(1, c.length) } if (c.indexOf(sNameEQ) === 0) {
                    return c.substring(sNameEQ.length, c.length)
                } 
            } return null
        } function _fnGetUniqueThs(nThead) {
            var nTrs = nThead.getElementsByTagName("tr");
            if (nTrs.length == 1) { return nTrs[0].getElementsByTagName("th") } var aLayout = [], aReturn = [];
            var ROWSPAN = 2, COLSPAN = 3; var i, j, k, iLen, jLen, iColumnShifted; var fnShiftCol = function(a, i, j) {
                while (typeof a[i][j] != "undefined") {
                    j++
                } return j
            }; var fnAddRow = function(i) {
                if (typeof aLayout[i] == "undefined") {
                    aLayout[i] = []
                } 
            }; for (i = 0, iLen = nTrs.length; i < iLen; i++) {
                fnAddRow(i); var iColumn = 0; var nTds = nTrs[i].getElementsByTagName("th");
                for (j = 0, jLen = nTds.length; j < jLen; j++) {
                    var iColspan = nTds[j].getAttribute("colspan") * 1;
                    var iRowspan = nTds[j].getAttribute("rowspan") * 1; if (!iColspan || iColspan === 0 || iColspan === 1) {
                        iColumnShifted = fnShiftCol(aLayout, i, iColumn);
                        aLayout[i][iColumnShifted] = nTds[j]; if (iRowspan || iRowspan === 0 || iRowspan === 1) {
                            for (k = 1;
k < iRowspan; k++) { fnAddRow(i + k); aLayout[i + k][iColumnShifted] = ROWSPAN } 
                        } iColumn++
                    } else {
                        iColumnShifted = fnShiftCol(aLayout, i, iColumn);
                        for (k = 0; k < iColspan; k++) { aLayout[i][iColumnShifted + k] = COLSPAN } iColumn += iColspan
                    } 
                } 
            } for (i = 0, iLen = aLayout.length;
i < iLen; i++) {
                for (j = 0, jLen = aLayout.length; j < jLen; j++) {
                    if (typeof aLayout[j][i] == "object") {
                        aReturn.push(aLayout[j][i])
                    } 
                } 
            } return aReturn
        } function _fnMap(oRet, oSrc, sName, sMappedName) {
            if (typeof sMappedName == "undefined") {
                sMappedName = sName
            } if (typeof oSrc[sName] != "undefined") { oRet[sMappedName] = oSrc[sName] } 
        } this.oApi._fnInitalise = _fnInitalise;
        this.oApi._fnLanguageProcess = _fnLanguageProcess; this.oApi._fnAddColumn = _fnAddColumn;
        this.oApi._fnAddData = _fnAddData; this.oApi._fnGatherData = _fnGatherData; this.oApi._fnDrawHead = _fnDrawHead;
        this.oApi._fnDraw = _fnDraw; this.oApi._fnAjaxUpdate = _fnAjaxUpdate; this.oApi._fnAddOptionsHtml = _fnAddOptionsHtml;
        this.oApi._fnFeatureHtmlFilter = _fnFeatureHtmlFilter; this.oApi._fnFeatureHtmlInfo = _fnFeatureHtmlInfo;
        this.oApi._fnFeatureHtmlPaginate = _fnFeatureHtmlPaginate; this.oApi._fnFeatureHtmlLength = _fnFeatureHtmlLength;
        this.oApi._fnFeatureHtmlProcessing = _fnFeatureHtmlProcessing; this.oApi._fnProcessingDisplay = _fnProcessingDisplay;
        this.oApi._fnFilterComplete = _fnFilterComplete; this.oApi._fnFilterColumn = _fnFilterColumn;
        this.oApi._fnFilter = _fnFilter; this.oApi._fnSortingClasses = _fnSortingClasses; this.oApi._fnVisibleToColumnIndex = _fnVisibleToColumnIndex;
        this.oApi._fnColumnIndexToVisible = _fnColumnIndexToVisible; this.oApi._fnVisbleColumns = _fnVisbleColumns;
        this.oApi._fnBuildSearchArray = _fnBuildSearchArray; this.oApi._fnDataToSearch = _fnDataToSearch;
        this.oApi._fnCalculateEnd = _fnCalculateEnd; this.oApi._fnConvertToWidth = _fnConvertToWidth;
        this.oApi._fnCalculateColumnWidths = _fnCalculateColumnWidths; this.oApi._fnArrayCmp = _fnArrayCmp;
        this.oApi._fnDetectType = _fnDetectType; this.oApi._fnGetDataMaster = _fnGetDataMaster;
        this.oApi._fnGetTrNodes = _fnGetTrNodes; this.oApi._fnEscapeRegex = _fnEscapeRegex; this.oApi._fnReOrderIndex = _fnReOrderIndex;
        this.oApi._fnColumnOrdering = _fnColumnOrdering; this.oApi._fnClearTable = _fnClearTable;
        this.oApi._fnSaveState = _fnSaveState; this.oApi._fnLoadState = _fnLoadState; this.oApi._fnCreateCookie = _fnCreateCookie;
        this.oApi._fnReadCookie = _fnReadCookie; this.oApi._fnGetUniqueThs = _fnGetUniqueThs; var _that = this;
        return this.each(function() {
            var oSettings = new classSettings(); _aoSettings.push(oSettings);
            var i = 0, iLen; var bInitHandedOff = false; var bUsePassedData = false; var sId = this.getAttribute("id");
            if (sId !== null) { oSettings.sTableId = sId; oSettings.sInstance = sId } else {
                oSettings.sInstance = _oExt._oExternConfig.iNextUnique++
            } oSettings.nTable = this; oSettings.oApi = _that.oApi; if (typeof oInit != "undefined" && oInit !== null) {
                _fnMap(oSettings.oFeatures, oInit, "bPaginate");
                _fnMap(oSettings.oFeatures, oInit, "bLengthChange"); _fnMap(oSettings.oFeatures, oInit, "bFilter");
                _fnMap(oSettings.oFeatures, oInit, "bSort"); _fnMap(oSettings.oFeatures, oInit, "bInfo");
                _fnMap(oSettings.oFeatures, oInit, "bProcessing"); _fnMap(oSettings.oFeatures, oInit, "bAutoWidth");
                _fnMap(oSettings.oFeatures, oInit, "bSortClasses"); _fnMap(oSettings.oFeatures, oInit, "bServerSide");
                _fnMap(oSettings, oInit, "asStripClasses"); _fnMap(oSettings, oInit, "fnRowCallback");
                _fnMap(oSettings, oInit, "fnHeaderCallback"); _fnMap(oSettings, oInit, "fnFooterCallback");
                _fnMap(oSettings, oInit, "fnDrawCallback"); _fnMap(oSettings, oInit, "fnInitComplete");
                _fnMap(oSettings, oInit, "fnServerData"); _fnMap(oSettings, oInit, "aaSorting"); _fnMap(oSettings, oInit, "aaSortingFixed");
                _fnMap(oSettings, oInit, "sPaginationType"); _fnMap(oSettings, oInit, "sAjaxSource"); _fnMap(oSettings, oInit, "sDom", "sDomPositioning");
                _fnMap(oSettings, oInit, "oSearch", "oPreviousSearch"); _fnMap(oSettings, oInit, "aoSearchCols", "aoPreSearchCols");
                _fnMap(oSettings, oInit, "iDisplayLength", "_iDisplayLength"); if (typeof oInit.iDisplayStart != "undefined" && typeof oSettings.iInitDisplayStart == "undefined") {
                    oSettings.iInitDisplayStart = oInit.iDisplayStart;
                    oSettings._iDisplayStart = oInit.iDisplayStart
                } if (typeof oInit.bStateSave != "undefined") {
                    oSettings.oFeatures.bStateSave = oInit.bStateSave;
                    _fnLoadState(oSettings, oInit)
                } if (typeof oInit.aaData != "undefined") {
                    bUsePassedData = true
                } if (typeof oInit != "undefined" && typeof oInit.aoData != "undefined") {
                    oInit.aoColumns = oInit.aoData
                } if (typeof oInit.oLanguage != "undefined") {
                    if (typeof oInit.oLanguage.sUrl != "undefined" && oInit.oLanguage.sUrl !== "") {
                        oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
                        $.getJSON(oSettings.oLanguage.sUrl, null, function(json) {
                            _fnLanguageProcess(oSettings, json, true)
                        }); bInitHandedOff = true
                    } else { _fnLanguageProcess(oSettings, oInit.oLanguage, false) } 
                } 
            } var nThead = this.getElementsByTagName("thead");
            var nThs = nThead.length === 0 ? null : _fnGetUniqueThs(nThead[0]); var bUseCols = typeof oInit != "undefined" && typeof oInit.aoColumns != "undefined";
            for (i = 0, iLen = bUseCols ? oInit.aoColumns.length : nThs.length; i < iLen; i++) {
                var col = bUseCols ? oInit.aoColumns[i] : null;
                var n = nThs ? nThs[i] : null; _fnAddColumn(oSettings, col, n)
            } if (this.getElementsByTagName("thead").length === 0) {
                this.appendChild(document.createElement("thead"))
            } if (this.getElementsByTagName("tbody").length === 0) {
                this.appendChild(document.createElement("tbody"))
            } if (bUsePassedData) {
                for (i = 0; i < oInit.aaData.length; i++) {
                    _fnAddData(oSettings, oInit.aaData[i])
                } 
            } else { _fnGatherData(oSettings) } oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
            if (oSettings.oFeatures.bAutoWidth) { _fnCalculateColumnWidths(oSettings) } oSettings.bInitialised = true;
            if (bInitHandedOff === false) { _fnInitalise(oSettings) } 
        })
    } 
})(jQuery);