/*
 * File:        jquery.dataTables.min.js
 * Version:     1.6.2
 * Author:      Allan Jardine (www.sprymedia.co.uk)
 * Info:        www.datatables.net
 * 
 * Copyright 2008-2010 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(jQuery){
    jQuery.fn.dataTableSettings=[];
    var _aoSettings=jQuery.fn.dataTableSettings;
    jQuery.fn.dataTableExt={};
    var _oExt=jQuery.fn.dataTableExt;
    _oExt.sVersion="1.6.2";
    _oExt.iApiIndex=0;
    _oExt.oApi={};
    _oExt.afnFiltering=[];
    _oExt.aoFeatures=[];
    _oExt.ofnSearch={};

    _oExt.afnSortData=[];
    _oExt.oStdClasses={
        sPagePrevEnabled:"paginate_enabled_previous",
        sPagePrevDisabled:"paginate_disabled_previous",
        sPageNextEnabled:"paginate_enabled_next",
        sPageNextDisabled:"paginate_disabled_next",
        sPageJUINext:"",
        sPageJUIPrev:"",
        sPageButton:"paginate_button",
        sPageButtonActive:"paginate_active",
        sPageButtonStaticDisabled:"paginate_button paginate_deactive",
        sPageFirst:"first",
        sPagePrevious:"previous",
        sPageNext:"N&auml;chste",
        sPageLast:"last",
        sStripOdd:"odd",
        sStripEven:"even",
        sRowEmpty:"dataTables_empty",
        sWrapper:"dataTables_wrapper",
        sFilter:"dataTables_filter",
        sInfo:"dataTables_info",
        sPaging:"dataTables_paginate paging_",
        sLength:"dataTables_length",
        sProcessing:"dataTables_processing",
        sSortAsc:"sorting_asc",
        sSortDesc:"sorting_desc",
        sSortable:"sorting",
        sSortableAsc:"sorting_asc_disabled",
        sSortableDesc:"sorting_desc_disabled",
        sSortableNone:"sorting_disabled",
        sSortColumn:"sorting_",
        sSortJUIAsc:"",
        sSortJUIDesc:"",
        sSortJUI:"",
        sSortJUIAscAllowed:"",
        sSortJUIDescAllowed:""
    };
    _oExt.oJUIClasses={
        sPagePrevEnabled:"fg-button ui-state-default ui-corner-left",
        sPagePrevDisabled:"fg-button ui-state-default ui-corner-left ui-state-disabled",
        sPageNextEnabled:"fg-button ui-state-default ui-corner-right",
        sPageNextDisabled:"fg-button ui-state-default ui-corner-right ui-state-disabled",
        sPageJUINext:"ui-icon ui-icon-circle-arrow-e",
        sPageJUIPrev:"ui-icon ui-icon-circle-arrow-w",
        sPageButton:"fg-button ui-btn-default",
        sPageButtonActive:"fg-button ui-btn-default ui-state-active",
        sPageButtonStaticDisabled:"fg-button ui-btn-default ui-btn-disabled",
        sPageFirst:"first ui-corner-tl ui-corner-bl",
        sPagePrevious:"previous",
        sPageNext:"next",
        sPageLast:"last ui-corner-tr ui-corner-br",
        sStripOdd:"odd",
        sStripEven:"even",
        sRowEmpty:"dataTables_empty",
        sWrapper:"dataTables_wrapper",
        sFilter:"dataTables_filter",
        sInfo:"dataTables_info",
        sPaging:"dataTables_paginate fg-buttonset fg-buttonset-multi paging_",
        sLength:"dataTables_length",
        sProcessing:"dataTables_processing",
        sSortAsc:"ui-state-default",
        sSortDesc:"ui-state-default",
        sSortable:"ui-state-default",
        sSortableAsc:"ui-state-default",
        sSortableDesc:"ui-state-default",
        sSortableNone:"ui-state-default",
        sSortColumn:"sorting_",
        sSortJUIAsc:"css_right ui-icon ui-icon-triangle-1-n",
        sSortJUIDesc:"css_right ui-icon ui-icon-triangle-1-s",
        sSortJUI:"css_right ui-icon ui-icon-carat-2-n-s",
        sSortJUIAscAllowed:"css_right ui-icon ui-icon-carat-1-n",
        sSortJUIDescAllowed:"css_right ui-icon ui-icon-carat-1-s"
    };
    _oExt.oPagination={
        two_button:{
            fnInit:function(oSettings,nPaging,fnCallbackDraw){
                var nPrevious,nNext,nPreviousInner,nNextInner;
                if(!oSettings.bJUI){
                    nPrevious=document.createElement("div");
                    nNext=document.createElement("div")
                }else{
                    nPrevious=document.createElement("a");
                    nNext=document.createElement("a");
                    nNextInner=document.createElement("span");
                    nNextInner.className=oSettings.oClasses.sPageJUINext;
                    nNext.appendChild(nNextInner);
                    nPreviousInner=document.createElement("span");
                    nPreviousInner.className=oSettings.oClasses.sPageJUIPrev;
                    nPrevious.appendChild(nPreviousInner)
                    }
                    nPrevious.className=oSettings.oClasses.sPagePrevDisabled;
                nNext.className=oSettings.oClasses.sPageNextDisabled;
                nPrevious.title=oSettings.oLanguage.oPaginate.sPrevious;
                nNext.title=oSettings.oLanguage.oPaginate.sNext;
                nPaging.appendChild(nPrevious);
                nPaging.appendChild(nNext);
                jQuery(nPrevious).click(function(){
                    if(oSettings.oApi._fnPageChange(oSettings,"previous")){
                        fnCallbackDraw(oSettings)
                    }
                });
            jQuery(nNext).click(function(){
                if(oSettings.oApi._fnPageChange(oSettings,"next")){
                    fnCallbackDraw(oSettings)
                }
            });
        jQuery(nPrevious).bind("selectstart",function(){
            return false
            });
        jQuery(nNext).bind("selectstart",function(){
            return false
        });
        if(oSettings.sTableId!==""&&typeof oSettings.aanFeatures.p=="undefined"){
            nPaging.setAttribute("id",oSettings.sTableId+"_paginate");
            nPrevious.setAttribute("id",oSettings.sTableId+"_previous");
            nNext.setAttribute("id",oSettings.sTableId+"_next")
        }
    },
fnUpdate:function(oSettings,fnCallbackDraw){
    if(!oSettings.aanFeatures.p){
        return
    }
    var an=oSettings.aanFeatures.p;
    for(var i=0,iLen=an.length;i<iLen;i++){
        if(an[i].childNodes.length!==0){
            an[i].childNodes[0].className=(oSettings._iDisplayStart===0)?oSettings.oClasses.sPagePrevDisabled:oSettings.oClasses.sPagePrevEnabled;
            an[i].childNodes[1].className=(oSettings.fnDisplayEnd()==oSettings.fnRecordsDisplay())?oSettings.oClasses.sPageNextDisabled:oSettings.oClasses.sPageNextEnabled
        }
    }
    }
},
iFullNumbersShowPages:5,
full_numbers:{
    fnInit:function(oSettings,nPaging,fnCallbackDraw){
        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;
        var oClasses=oSettings.oClasses;
        nFirst.className=oClasses.sPageButton+" "+oClasses.sPageFirst;
        nPrevious.className=oClasses.sPageButton+" "+oClasses.sPagePrevious;
        nNext.className=oClasses.sPageButton+" "+oClasses.sPageNext;
        nLast.className=oClasses.sPageButton+" "+oClasses.sPageLast;
        nPaging.append(nFirst);
        nPaging.append(nPrevious);
        nPaging.append(nList);
        nPaging.append(nNext);
        nPaging.append(nLast);
        jQuery(nFirst).click(function(){
            if(oSettings.oApi._fnPageChange(oSettings,"first")){
                fnCallbackDraw(oSettings)
            }
        });
    jQuery(nPrevious).click(function(){
        if(oSettings.oApi._fnPageChange(oSettings,"previous")){
            fnCallbackDraw(oSettings)
        }
    });
jQuery(nNext).click(function(){
    if(oSettings.oApi._fnPageChange(oSettings,"next")){
        fnCallbackDraw(oSettings)
    }
});
jQuery(nLast).click(function(){
    if(oSettings.oApi._fnPageChange(oSettings,"last")){
        fnCallbackDraw(oSettings)
    }
});
jQuery("span",nPaging).bind("mousedown",function(){
    return false
    }).bind("selectstart",function(){
    return false
});
if(oSettings.sTableId!==""&&typeof oSettings.aanFeatures.p=="undefined"){
    nPaging.attr("id",oSettings.sTableId+"_paginate");
    nFirst.setAttribute("id",oSettings.sTableId+"_first");
    nPrevious.setAttribute("id",oSettings.sTableId+"_previous");
    nNext.setAttribute("id",oSettings.sTableId+"_next");
    nLast.setAttribute("id",oSettings.sTableId+"_last")
}
},
fnUpdate:function(oSettings,fnCallbackDraw){
    if(!oSettings.aanFeatures.p){
        return
    }
    var iPageCount=_oExt.oPagination.iFullNumbersShowPages;
    var iPageCountHalf=Math.floor(iPageCount/2);
    var iPages=Math.ceil((oSettings.fnRecordsDisplay())/oSettings._iDisplayLength);
    var iCurrentPage=Math.ceil(oSettings._iDisplayStart/oSettings._iDisplayLength)+1;
    var sList="";
    var iStartButton,iEndButton,i,iLen;
    var oClasses=oSettings.oClasses;
    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(i=iStartButton;i<=iEndButton;i++){
    if(iCurrentPage!=i){
        sList+='<span class="'+oClasses.sPageButton+'">'+i+"</span>"
    }
    else{
        sList+='<span class="'+oClasses.sPageButtonActive+'">'+i+"</span>"
        }
    }
var an=oSettings.aanFeatures.p;
var anButtons,anStatic,nPaginateList;
var fnClick=function(){
    var iTarget=(this.innerHTML*1)-1;
    oSettings._iDisplayStart=iTarget*oSettings._iDisplayLength;
    fnCallbackDraw(oSettings);
    return false;
    };

var fnFalse=function(){
    return false;
    };
for(i=0,iLen=an.length;i<iLen;
    i++){
    if(an[i].children.length===0){
        continue;
    }
    nPaginateList=an[i].children("span:eq(2)");
    nPaginateList.html(sList);
    jQuery("span",nPaginateList).click(fnClick).bind("mousedown",fnFalse).bind("selectstart",fnFalse);
    anButtons=an[i].children("span");
    anStatic=[anButtons[0],anButtons[1],anButtons[anButtons.length-2],anButtons[anButtons.length-1]];
    jQuery(anStatic).removeClass(oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled);
    if(anStatic[0]!= undefined && anStatic[1]!= undefined &&anStatic[2]!= undefined &&anStatic[3]!= undefined){
    if(iCurrentPage==1){
        anStatic[0].className+=" "+oClasses.sPageButtonStaticDisabled;
        anStatic[1].className+=" "+oClasses.sPageButtonStaticDisabled
        }else{
        anStatic[0].className+=" "+oClasses.sPageButton;
        anStatic[1].className+=" "+oClasses.sPageButton
        }
        if(iPages===0||iCurrentPage==iPages||oSettings._iDisplayLength==-1){
        anStatic[2].className+=" "+oClasses.sPageButtonStaticDisabled;
        anStatic[3].className+=" "+oClasses.sPageButtonStaticDisabled
        }else{
        anStatic[2].className+=" "+oClasses.sPageButton;
        anStatic[3].className+=" "+oClasses.sPageButton
        }
    }
}
}
}
};

_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){
    var iParse=Date.parse(sData);
    if(iParse!==null&&!isNaN(iParse)){
        return"date"
        }
        return null
    }];
_oExt._oExternConfig={
    iNextUnique:0
};
jQuery.fn.dataTable=function(oInit){
    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.aanFeatures=[];
this.oLanguage={
    sProcessing:"Processing...",
    sLengthMenu:"_MENU_",
    sZeroRecords:"Keine passenden Eintr&auml;ge gefunden",
    sInfo:"_START_ bis _END_ von _TOTAL_ Eintr&auml;gen werden angezeigt",
    sInfoEmpty:"0 bis 0 von 0 Eintr&auml;gen werden angezeigt",
    sInfoFiltered:"(Von _MAX_ gesamten Eintr&auml;gen gefiltert)",
    sInfoPostFix:"",
    sSearch:"Suche&nbsp;",
    sUrl:"",
    oPaginate:{
        sFirst:"Erste",
        sPrevious:"Vorherige",
        sNext:"N&auml;chste",
        sLast:"Letzte"
    }
};
this.aoData=[];
this.aiDisplay=[];
this.aiDisplayMaster=[];
this.aoColumns=[];
this.iNextId=0;
this.asDataSearch=[];
this.oPreviousSearch={
    sSearch:"",
    bEscapeRegex:true
};

this.aoPreSearchCols=[];
this.aaSorting=[[0,"asc",0]];
this.aaSortingFixed=null;
this.asStripClasses=[];
this.fnRowCallback=null;
this.fnHeaderCallback=null;
this.fnFooterCallback=null;
this.aoDrawCallback=[];
this.fnInitComplete=null;
this.sTableId="";
this.nTable=null;
this.iDefaultSortIndex=0;
this.bInitialised=false;
this.aoOpenRows=[];
this.sDom="lfrtip";
this.sPaginationType="two_button";
this.iCookieDuration=60*60*2;
this.sAjaxSource=null;
this.bAjaxDataGet=true;
this.fnServerData=jQuery.getJSON;
this.iServerDraw=0;
this._iDisplayLength=5;
this._iDisplayStart=0;
this._iDisplayEnd=5;
this._iRecordsTotal=0;
this._iRecordsDisplay=0;
this.bJUI=false;
this.oClasses=_oExt.oStdClasses;
this.bFiltered=false;
this.bSorted=false
}
this.oApi={};

this.fnDraw=function(bComplete){
    var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
    if(typeof bComplete!="undefined"&&bComplete===false){
        _fnCalculateEnd(oSettings);
        _fnDraw(oSettings)
    }else{
        _fnReDraw(oSettings)
        }
    };

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.fnVersionCheck=function(sVersion){
    var fnZPad=function(Zpad,count){
        while(Zpad.length<count){
            Zpad+="0"
        }
        return Zpad
        };

    var aThis=_oExt.sVersion.split(".");
    var aThat=sVersion.split(".");
    var sThis="",sThat="";
    for(var i=0,iLen=aThat.length;i<iLen;i++){
        sThis+=fnZPad(aThis[i],3);
        sThat+=fnZPad(aThat[i],3)
    }
    return parseInt(sThis,10)>=parseInt(sThat,10)
    };

this.fnSort=function(aaSort){
    var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
    oSettings.aaSorting=aaSort;
    _fnSort(oSettings)
    };

this.fnSortListener=function(nNode,iColumn,fnCallback){
    _fnSortAttachListener(_fnSettingsFromNode(this[_oExt.iApiIndex]),nNode,iColumn,fnCallback)
};

this.fnAddData=function(mData,bRedraw){
	
    if(mData.length===0){
        return[]
        }
        var aiReturn=[];
    var iTest;
    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(typeof bRedraw=="undefined"||bRedraw){
    _fnReDraw(oSettings)
    }
    return aiReturn
};

this.fnDeleteRow=function(mTarget,fnCallBack,bNullRow){
    var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
    var i,iAODataIndex;
    iAODataIndex=(typeof mTarget=="object")?_fnNodeToDataIndex(oSettings,mTarget):mTarget;
    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;
    var nTrs=jQuery("tbody tr",oSettings.nTable);
    if(jQuery.inArray(nTr,nTrs)!=-1){
        jQuery(nNewRow).insertAfter(nTr)
    }
    if(!oSettings.oFeatures.bServerSide){
        oSettings.aoOpenRows.push({
            nTr:nNewRow,
            nParent:nTr
        })
    }
    return nNewRow
    };

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(mRow){
    var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
    if(typeof mRow!="undefined"){
        var iRow=(typeof mRow=="object")?_fnNodeToDataIndex(oSettings,mRow):mRow;
        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.toUpperCase()=="TR"){
        return _fnNodeToDataIndex(oSettings,nNode)
        }else{
        if(nNode.nodeName.toUpperCase()=="TD"){
            var iDataIndex=_fnNodeToDataIndex(oSettings,nNode.parentNode);
            var iCorrector=0;
            for(var j=0;j<oSettings.aoColumns.length;j++){
                if(oSettings.aoColumns[j].bVisible){
                    if(oSettings.aoData[iDataIndex].nTr.getElementsByTagName("td")[j-iCorrector]==nNode){
                        return[iDataIndex,j-iCorrector,j]
                    }
                }else{
                iCorrector++
            }
            }
        }
}
return null
};

this.fnUpdate=function(mData,mRow,iColumn,bRedraw){
    var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
    var iVisibleColumn;
    var sDisplay;
    var iRow=(typeof mRow=="object")?_fnNodeToDataIndex(oSettings,mRow):mRow;
    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,
                oSettings:oSettings
            });
            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("DataTables 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,
                oSettings:oSettings
            });
            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(typeof bRedraw!="undefined"&&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,anTds;
    if(oSettings.aoColumns[iCol].bVisible==bShow){
        return
    }
    var nTrHead=jQuery("thead:eq(0)>tr",oSettings.nTable)[0];
    var nTrFoot=jQuery("tfoot:eq(0)>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])
}
anTds=_fnGetTdNodes(oSettings);
for(i=0,iLen=oSettings.aoData.length;i<iLen;i++){
    nTd=oSettings.aoData[i]._anHidden[iCol];
    oSettings.aoData[i].nTr.insertBefore(nTd,jQuery(">td:eq("+iBefore+")",oSettings.aoData[i].nTr)[0])
}
}
oSettings.aoColumns[iCol].bVisible=true
}else{
    nTrHead.removeChild(anTheadTh[iCol]);
    if(nTrFoot){
        nTrFoot.removeChild(anTfootTh[iCol])
        }
        anTds=_fnGetTdNodes(oSettings);
    for(i=0,iLen=oSettings.aoData.length;
        i<iLen;i++){
        nTd=anTds[(i*oSettings.aoColumns.length)+iCol];
        oSettings.aoData[i]._anHidden[iCol]=nTd;
        nTd.parentNode.removeChild(nTd)
        }
        oSettings.aoColumns[iCol].bVisible=false
    }
    for(i=0,iLen=oSettings.aoOpenRows.length;
    i<iLen;i++){
    oSettings.aoOpenRows[i].nTr.colSpan=_fnVisbleColumns(oSettings)
    }
    _fnSaveState(oSettings)
};

this.fnPageChange=function(sAction,bRedraw){
    var oSettings=_fnSettingsFromNode(this[_oExt.iApiIndex]);
    _fnPageChange(oSettings,sAction);
    _fnCalculateEnd(oSettings);
    if(typeof bRedraw=="undefined"||bRedraw){
        _fnDraw(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);
        oSettings.fnServerData(oSettings.sAjaxSource,null,function(json){
            for(var i=0;i<json.aaData.length;
                i++){
                _fnAddData(oSettings,json.aaData[i])
                }
                oSettings.iInitDisplayStart=oSettings._iDisplayStart;
            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)
}
if(!oSettings.oFeatures.bServerSide){
    _fnProcessingDisplay(oSettings,false)
    }
}
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,
        asSorting:["asc","desc"],
        sSortingClass:oSettings.oClasses.sSortable,
        sSortingClassJUI:oSettings.oClasses.sSortJUI,
        sTitle:nTh?nTh.innerHTML:"",
        sName:"",
        sWidth:null,
        sClass:null,
        fnRender:null,
        bUseRendered:true,
        iDataSort:oSettings.aoColumns.length-1,
        sSortDataType:"std",
        nTh:nTh?nTh:document.createElement("th"),
        nTf:null
    };
    var iLength=oSettings.aoColumns.length-1;
    var oCol=oSettings.aoColumns[iLength];
    if(typeof oOptions!="undefined"&&oOptions!==null){
        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");
        _fnMap(oCol,oOptions,"asSorting");
        _fnMap(oCol,oOptions,"sSortDataType")
        }
        if(!oSettings.oFeatures.bSort){
        oCol.bSortable=false
    }
    if(!oCol.bSortable||(jQuery.inArray("asc",oCol.asSorting)==-1&&jQuery.inArray("desc",oCol.asSorting)==-1)){
        oCol.sSortingClass=oSettings.oClasses.sSortableNone;
        oCol.sSortingClassJUI=""
        }else{
        if(jQuery.inArray("asc",oCol.asSorting)!=-1&&jQuery.inArray("desc",oCol.asSorting)==-1){
            oCol.sSortingClass=oSettings.oClasses.sSortableAsc;
            oCol.sSortingClassJUI=oSettings.oClasses.sSortJUIAscAllowed
            }else{
            if(jQuery.inArray("asc",oCol.asSorting)==-1&&jQuery.inArray("desc",oCol.asSorting)!=-1){
                oCol.sSortingClass=oSettings.oClasses.sSortableDesc;
                oCol.sSortingClassJUI=oSettings.oClasses.sSortJUIDescAllowed
                }
            }
    }
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("DataTables warning: Added data does not match known number of columns");
        return -1
        }
        var iThisIndex=oSettings.aoData.length;
    oSettings.aoData.push({
        nTr:document.createElement("tr"),
        _iId:oSettings.iNextId++,
        _aData:aData.slice(),
        _anHidden:[],
        _sRowStripe:""
    });
    var nTd,sThisType;
    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,
                oSettings:oSettings
            });
            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"){
        sThisType=_fnDetectType(oSettings.aoData[iThisIndex]._aData[i]);
        if(oSettings.aoColumns[i].sType===null){
            oSettings.aoColumns[i].sType=sThisType
            }else{
            if(oSettings.aoColumns[i].sType!=sThisType){
                oSettings.aoColumns[i].sType="string"
            }
        }
    }
    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,i,iLen,j,jLen,jInner,nTds,nTrs,nTd,aLocalData,iThisIndex,iRow,iRows,iColumn,iColumns;
    if(oSettings.sAjaxSource===null){
        nTrs=oSettings.nTable.getElementsByTagName("tbody")[0].childNodes;
        for(i=0,iLen=nTrs.length;i<iLen;i++){
            if(nTrs[i].nodeName.toUpperCase()=="TR"){
                iThisIndex=oSettings.aoData.length;
                oSettings.aoData.push({
                    nTr:nTrs[i],
                    _iId:oSettings.iNextId++,
                    _aData:[],
                    _anHidden:[],
                    _sRowStripe:""
                });
                oSettings.aiDisplayMaster.push(iThisIndex);
                aLocalData=oSettings.aoData[iThisIndex]._aData;
                nTds=nTrs[i].childNodes;
                jInner=0;
                for(j=0,jLen=nTds.length;j<jLen;j++){
                    if(nTds[j].nodeName.toUpperCase()=="TD"){
                        aLocalData[jInner]=nTds[j].innerHTML;
                        jInner++
                    }
                }
                }
        }
}
nTrs=_fnGetTrNodes(oSettings);
nTds=[];
for(i=0,iLen=nTrs.length;i<iLen;
    i++){
    for(j=0,jLen=nTrs[i].childNodes.length;j<jLen;j++){
        nTd=nTrs[i].childNodes[j];
        if(nTd.nodeName.toUpperCase()=="TD"){
            nTds.push(nTd)
            }
        }
    }
if(nTds.length!=nTrs.length*oSettings.aoColumns.length){
    alert("DataTables warning: Unexpected number of TD elements. Expected "+(nTrs.length*oSettings.aoColumns.length)+" and got "+nTds.length+". DataTables does not support rowspan / colspan in the table body, and there must be one cell for each row/column combination.")
}
for(iColumn=0,iColumns=oSettings.aoColumns.length;iColumn<iColumns;iColumn++){
    if(oSettings.aoColumns[iColumn].sTitle===null){
        oSettings.aoColumns[iColumn].sTitle=oSettings.aoColumns[iColumn].nTh.innerHTML
    }
    var bAutoType=oSettings.aoColumns[iColumn]._bAutoType,bRender=typeof oSettings.aoColumns[iColumn].fnRender=="function",bClass=oSettings.aoColumns[iColumn].sClass!==null,bVisible=oSettings.aoColumns[iColumn].bVisible,nCell,sThisType,sRendered;
    if(bAutoType||bRender||bClass||!bVisible){
        for(iRow=0,iRows=oSettings.aoData.length;
            iRow<iRows;iRow++){
            nCell=nTds[(iRow*iColumns)+iColumn];
            if(bAutoType){
                if(oSettings.aoColumns[iColumn].sType!="string"){
                    sThisType=_fnDetectType(oSettings.aoData[iRow]._aData[iColumn]);
                    if(oSettings.aoColumns[iColumn].sType===null){
                        oSettings.aoColumns[iColumn].sType=sThisType
                    }else{
                        if(oSettings.aoColumns[iColumn].sType!=sThisType){
                            oSettings.aoColumns[iColumn].sType="string"
                        }
                    }
                }
        }
        if(bRender){
        sRendered=oSettings.aoColumns[iColumn].fnRender({
            iDataRow:iRow,
            iDataColumn:iColumn,
            aData:oSettings.aoData[iRow]._aData,
            oSettings:oSettings
        });
        nCell.innerHTML=sRendered;
        if(oSettings.aoColumns[iColumn].bUseRendered){
            oSettings.aoData[iRow]._aData[iColumn]=sRendered
        }
    }
    if(bClass){
    nCell.className+=" "+oSettings.aoColumns[iColumn].sClass
    }
    if(!bVisible){
    oSettings.aoData[iRow]._anHidden[iColumn]=nCell;
    nCell.parentNode.removeChild(nCell)
    }
}
}
}
}
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 && oSettings.aoColumns[i].sWidth!=0){
                    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++){
        nTh=oSettings.aoColumns[i].nTh;
        nTh.innerHTML=oSettings.aoColumns[i].sTitle;
        if(oSettings.aoColumns[i].bVisible){
            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
            }
            nTr.appendChild(nTh)
            }
        }
    jQuery("thead:eq(0)",oSettings.nTable).html("")[0].appendChild(nTr)
}
if(oSettings.bJUI){
    for(i=0,iLen=oSettings.aoColumns.length;i<iLen;i++){
        oSettings.aoColumns[i].nTh.insertBefore(document.createElement("span"),oSettings.aoColumns[i].nTh.firstChild)
    }
    }
    if(oSettings.oFeatures.bSort){
    for(i=0;i<oSettings.aoColumns.length;i++){
        if(oSettings.aoColumns[i].bSortable!==false){
            _fnSortAttachListener(oSettings,oSettings.aoColumns[i].nTh,i)
        }else{
            jQuery(oSettings.aoColumns[i].nTh).addClass(oSettings.oClasses.sSortableNone)
            }
        }
    jQuery("thead:eq(0) th",oSettings.nTable).mousedown(function(e){
    if(e.shiftKey){
        this.onselectstart=function(){
            return false
        };

        return false
        }
    })
}
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,iLen;
    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(typeof oSettings.iInitDisplayStart!="undefined"&&oSettings.iInitDisplayStart!=-1){
        oSettings._iDisplayStart=(oSettings.iInitDisplayStart>=oSettings.fnRecordsDisplay())?0:oSettings.iInitDisplayStart;
        oSettings.iInitDisplayStart=-1;
        _fnCalculateEnd(oSettings)
        }
        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 aoData=oSettings.aoData[oSettings.aiDisplay[j]];
            var nRow=aoData.nTr;
            if(iStrips!==0){
                var sStrip=oSettings.asStripClasses[iRowCount%iStrips];
                if(aoData._sRowStripe!=sStrip){
                    jQuery(nRow).removeClass(aoData._sRowStripe).addClass(sStrip);
                    aoData._sRowStripe=sStrip
                    }
                }
            if(typeof oSettings.fnRowCallback=="function"){
            nRow=oSettings.fnRowCallback(nRow,oSettings.aoData[oSettings.aiDisplay[j]]._aData,iRowCount,j);
            if(!nRow&&!bRowError){
                alert("DataTables warning: 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=oSettings.oClasses.sRowEmpty;
    nTd.innerHTML=oSettings.oLanguage.sZeroRecords;
    anRows[iRowCount].appendChild(nTd)
    }
    if(typeof oSettings.fnHeaderCallback=="function"){
    oSettings.fnHeaderCallback(jQuery("thead:eq(0)>tr",oSettings.nTable)[0],_fnGetDataMaster(oSettings),oSettings._iDisplayStart,oSettings.fnDisplayEnd(),oSettings.aiDisplay)
}
if(typeof oSettings.fnFooterCallback=="function"){
    oSettings.fnFooterCallback(jQuery("tfoot:eq(0)>tr",oSettings.nTable)[0],_fnGetDataMaster(oSettings),oSettings._iDisplayStart,oSettings.fnDisplayEnd(),oSettings.aiDisplay)
}
var nBody=oSettings.nTable.getElementsByTagName("tbody");
if(nBody[0]){
    var nTrs=nBody[0].childNodes;
    for(i=nTrs.length-1;i>=0;i--){
        nTrs[i].parentNode.removeChild(nTrs[i])
        }
        for(i=0,iLen=anRows.length;
        i<iLen;i++){
        nBody[0].appendChild(anRows[i])
        }
    }
    for(i=0,iLen=oSettings.aoDrawCallback.length;
    i<iLen;i++){
    oSettings.aoDrawCallback[i].fn(oSettings)
    }
    oSettings.bSorted=false;
oSettings.bFiltered=false;
if(typeof oSettings._bInitComplete=="undefined"){
    oSettings._bInitComplete=true;
    if(oSettings.oFeatures.bAutoWidth&&oSettings.nTable.offsetWidth!=="100%"){
        oSettings.nTable.style.width=oSettings.nTable.offsetWidth
    }
}
}
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
                    });
                aoData.push({
                    name:"bSearchable_"+i,
                    value:oSettings.aoColumns[i].bSearchable
                    })
                }
            }
            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:"sSortDir_"+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:"sSortDir_"+(i+iFixed),
                value:oSettings.aaSorting[i][1]
                })
        }
        for(i=0;i<iColumns;i++){
            aoData.push({
                name:"bSortable_"+i,
                value:oSettings.aoColumns[i].bSortable
                })
        }
        }
        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=(typeof 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=oSettings.oClasses.sWrapper;
    if(oSettings.sTableId!==""){
        nWrapper.setAttribute("id",oSettings.sTableId+"_wrapper")
    }
    var nInsertNode=nWrapper;
    var sDom=oSettings.sDom.replace("H","fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix");
    sDom=sDom.replace("F","fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix");
    var aDom=sDom.split("");
    var nTmp,iPushFeature,cOption,nNewNode,cNext,sClass,j;
    for(var i=0;
        i<aDom.length;i++){
        iPushFeature=0;
        cOption=aDom[i];
        if(cOption=="<"){
            nNewNode=document.createElement("div");
            cNext=aDom[i+1];
            if(cNext=="'"||cNext=='"'){
                sClass="";
                j=2;
                while(aDom[i+j]!=cNext){
                    sClass+=aDom[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);
                    iPushFeature=1
                    }else{
                    if(cOption=="f"&&oSettings.oFeatures.bFilter){
                        nTmp=_fnFeatureHtmlFilter(oSettings);
                        iPushFeature=1
                        }else{
                        if(cOption=="r"&&oSettings.oFeatures.bProcessing){
                            nTmp=_fnFeatureHtmlProcessing(oSettings);
                            iPushFeature=1
                            }else{
                            if(cOption=="t"){
                                nTmp=oSettings.nTable;
                                iPushFeature=1
                                }else{
                                if(cOption=="i"&&oSettings.oFeatures.bInfo){
                                    nTmp=_fnFeatureHtmlInfo(oSettings);
                                    iPushFeature=1
                                    }else{
                                    if(cOption=="p"&&oSettings.oFeatures.bPaginate){
                                        nTmp=_fnFeatureHtmlPaginate(oSettings);
                                        iPushFeature=1
                                        }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);
                                                    if(nTmp){
                                                        iPushFeature=1
                                                        }
                                                        break
                                                }
                                            }
                                            }
                                    }
                        }
                }
        }
    }
}
}
}
if(iPushFeature==1){
    if(typeof oSettings.aanFeatures[cOption]!="object"){
        oSettings.aanFeatures[cOption]=[]
    }
    oSettings.aanFeatures[cOption].push(nTmp);
    
    }
}
nHolding.parentNode.replaceChild(nWrapper,nHolding)
}
function _fnFeatureHtmlFilter(oSettings){
	var tableId=getTableId(oSettings)
    var nFilter=jQuery("."+tableId+"_filter")
    if (nFilter==null){
        nFilter= document.createElement("div");
    }
    var sSpace=oSettings.oLanguage.sSearch===""?"":" ";
    var jqFilter=jQuery("input",nFilter);
    jqFilter.val(oSettings.oPreviousSearch.sSearch.replace('"',"&quot;"));
    jqFilter.keyup(function(e){
        var n=oSettings.aanFeatures.f;
        for(var i=0,iLen=n.length;i<iLen;i++){
            if(n[i]!=this.parentNode){
                jQuery("input",n[i]).val(this.value)
            }
        }
        _fnFilterComplete(oSettings,{
        sSearch:this.value,
        bEscapeRegex:oSettings.oPreviousSearch.bEscapeRegex
        })
    });
jqFilter.keypress(function(e){
    if(e.keyCode==13){
        return false
        }
    });
return nFilter
}
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)
        }
        oSettings.bFiltered=true;
    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(")(?=.*?")+").*jQuery";
    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(oSettings.asDataSearch[i].toLowerCase().indexOf(sInput.toLowerCase())!=-1){
                        	
                    oSettings.aiDisplay.push(oSettings.aiDisplayMaster[i])
                }
            }
            }else{
    var iIndexCorrector=0;
    for(i=0;i<oSettings.asDataSearch.length;i++){
        if(oSettings.asDataSearch[i].toLowerCase().indexOf(sInput.toLowerCase())==-1){
            oSettings.aiDisplay.splice(i-iIndexCorrector,1);
            iIndexCorrector++
        }
    }
    }
}
oSettings.oPreviousSearch.sSearch=sInput;
oSettings.oPreviousSearch.bEscapeRegex=bEscapeRegex
}
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 _fnSort(oSettings,bApplyClasses){
    var aaSort=[];
    var oSort=_oExt.oSort;
    var aoData=oSettings.aoData;
    var iDataSort;
    var iDataType;
    var i,j,jLen;
    if(!oSettings.oFeatures.bServerSide&&(oSettings.aaSorting.length!==0||oSettings.aaSortingFixed!==null)){
        if(oSettings.aaSortingFixed!==null){
            aaSort=oSettings.aaSortingFixed.concat(oSettings.aaSorting)
        }else{
            aaSort=oSettings.aaSorting.slice()
            }
            for(i=0;i<aaSort.length;i++){
            var iColumn=aaSort[i][0];
            var sDataType=oSettings.aoColumns[iColumn].sSortDataType;
            if(typeof _oExt.afnSortData[sDataType]!="undefined"){
                var iCorrector=0;
                var aData=_oExt.afnSortData[sDataType](oSettings,iColumn);
                for(j=0,jLen=aoData.length;
                    j<jLen;j++){
                    if(aoData[j]!==null){
                        aoData[j]._aData[iColumn]=aData[iCorrector];
                        iCorrector++
                    }
                }
                }
        }
    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+"] );if (iTest===0) return oSort['numeric-"+aaSort[aaSort.length-1][1]+"'](a, b); 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)
}
oSettings.bSorted=true;
if(oSettings.oFeatures.bFilter){
    _fnFilterComplete(oSettings,oSettings.oPreviousSearch,1)
}else{
    oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();
    oSettings._iDisplayStart=0;
    _fnCalculateEnd(oSettings);
    _fnDraw(oSettings)
    }
}
function _fnSortAttachListener(oSettings,nNode,iDataIndex,fnCallback){
    jQuery(nNode).click(function(e){
        if(oSettings.aoColumns[iDataIndex].bSortable===false){
            return
        }
        var fnInnerSorting=function(){
            var iColumn,iNextSort;
            if(e.shiftKey){
                var bFound=false;
                for(var i=0;i<oSettings.aaSorting.length;i++){
                    if(oSettings.aaSorting[i][0]==iDataIndex){
                        bFound=true;
                        iColumn=oSettings.aaSorting[i][0];
                        iNextSort=oSettings.aaSorting[i][2]+1;
                        if(typeof oSettings.aoColumns[iColumn].asSorting[iNextSort]=="undefined"){
                            oSettings.aaSorting.splice(i,1)
                        }else{
                            oSettings.aaSorting[i][1]=oSettings.aoColumns[iColumn].asSorting[iNextSort];
                            oSettings.aaSorting[i][2]=iNextSort
                            }
                            break
                    }
                }
                if(bFound===false){
                oSettings.aaSorting.push([iDataIndex,oSettings.aoColumns[iDataIndex].asSorting[0],0])
            }
        }else{
        if(oSettings.aaSorting.length==1&&oSettings.aaSorting[0][0]==iDataIndex){
            iColumn=oSettings.aaSorting[0][0];
            iNextSort=oSettings.aaSorting[0][2]+1;
            if(typeof oSettings.aoColumns[iColumn].asSorting[iNextSort]=="undefined"){
                iNextSort=0
            }
            oSettings.aaSorting[0][1]=oSettings.aoColumns[iColumn].asSorting[iNextSort];
            oSettings.aaSorting[0][2]=iNextSort
        }else{
            oSettings.aaSorting.splice(0,oSettings.aaSorting.length);
            oSettings.aaSorting.push([iDataIndex,oSettings.aoColumns[iDataIndex].asSorting[0],0])
        }
    }
    _fnSort(oSettings)
    };

if(!oSettings.oFeatures.bProcessing){
    fnInnerSorting()
    }else{
    _fnProcessingDisplay(oSettings,true);
    setTimeout(function(){
        fnInnerSorting();
        if(!oSettings.oFeatures.bServerSide){
            _fnProcessingDisplay(oSettings,false)
        }
    },0)
}
if(typeof fnCallback=="function"){
    fnCallback(oSettings)
    }
})
}
function _fnSortingClasses(oSettings){
    var i,iLen,j,jLen,iFound;
    var aaSort,sClass;
    var iColumns=oSettings.aoColumns.length;
    var oClasses=oSettings.oClasses;
    for(i=0;i<iColumns;i++){
        if(oSettings.aoColumns[i].bSortable){
            jQuery(oSettings.aoColumns[i].nTh).removeClass(oClasses.sSortAsc+" "+oClasses.sSortDesc+" "+oSettings.aoColumns[i].sSortingClass)
        }
    }
    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){
        sClass=oSettings.aoColumns[i].sSortingClass;
        iFound=-1;
        for(j=0;j<aaSort.length;j++){
            if(aaSort[j][0]==i){
                sClass=(aaSort[j][1]=="asc")?oClasses.sSortAsc:oClasses.sSortDesc;
                iFound=j;
                break
            }
        }
        jQuery(oSettings.aoColumns[i].nTh).addClass(sClass);
    if(oSettings.bJUI){
        var jqSpan=jQuery("span",oSettings.aoColumns[i].nTh);
        jqSpan.removeClass(oClasses.sSortJUIAsc+" "+oClasses.sSortJUIDesc+" "+oClasses.sSortJUI+" "+oClasses.sSortJUIAscAllowed+" "+oClasses.sSortJUIDescAllowed);
        var sSpanClass;
        if(iFound==-1){
            sSpanClass=oSettings.aoColumns[i].sSortingClassJUI
            }else{
            if(aaSort[iFound][1]=="asc"){
                sSpanClass=oClasses.sSortJUIAsc
            }else{
                sSpanClass=oClasses.sSortJUIDesc
                }
            }
        jqSpan.addClass(sSpanClass)
    }
}else{
    jQuery(oSettings.aoColumns[i].nTh).addClass(oSettings.aoColumns[i].sSortingClass)
}
}
sClass=oClasses.sSortColumn;
if(oSettings.oFeatures.bSort&&oSettings.oFeatures.bSortClasses){
    var nTds=_fnGetTdNodes(oSettings);
    if(nTds.length>=iColumns){
        for(i=0;i<iColumns;i++){
            if(nTds[i].className.indexOf(sClass+"1")!=-1){
                for(j=0,jLen=(nTds.length/iColumns);
                    j<jLen;j++){
                    nTds[(iColumns*j)+i].className=nTds[(iColumns*j)+i].className.replace(" "+sClass+"1","")
                }
                }else{
            if(nTds[i].className.indexOf(sClass+"2")!=-1){
                for(j=0,jLen=(nTds.length/iColumns);
                    j<jLen;j++){
                    nTds[(iColumns*j)+i].className=nTds[(iColumns*j)+i].className.replace(" "+sClass+"2","")
                }
                }else{
            if(nTds[i].className.indexOf(sClass+"3")!=-1){
                for(j=0,jLen=(nTds.length/iColumns);
                    j<jLen;j++){
                    nTds[(iColumns*j)+i].className=nTds[(iColumns*j)+i].className.replace(" "+sClass+"3","")
                }
                }
            }
    }
}
}
var iClass=1,iTargetCol;
for(i=0;i<aaSort.length;i++){
    iTargetCol=parseInt(aaSort[i][0],10);
    for(j=0,jLen=(nTds.length/iColumns);j<jLen;j++){
        nTds[(iColumns*j)+iTargetCol].className+=" "+sClass+iClass
    }
    if(iClass<3){
        iClass++
    }
}
}
}
function _fnFeatureHtmlPaginate(oSettings){

	var tableId=getTableId(oSettings)
    var nPaginate=jQuery("."+tableId+"_paging");
    if (nPaginate==null){
        nPaginate= document.createElement("div");
    }
    _oExt.oPagination[oSettings.sPaginationType].fnInit(oSettings,nPaginate,function(oSettings){
        _fnCalculateEnd(oSettings);
        _fnDraw(oSettings)
        });
    if(typeof oSettings.aanFeatures.p=="undefined"){
        oSettings.aoDrawCallback.push({
            fn:function(oSettings){
                _oExt.oPagination[oSettings.sPaginationType].fnUpdate(oSettings,function(oSettings){
                    _fnCalculateEnd(oSettings);
                    _fnDraw(oSettings)
                    })
                },
            sName:"pagination"
        })
        }
        return nPaginate
    }
    function _fnPageChange(oSettings,sAction){
    var iOldStart=oSettings._iDisplayStart;
    if(sAction=="first"){
        oSettings._iDisplayStart=0
        }else{
        if(sAction=="previous"){
            oSettings._iDisplayStart=oSettings._iDisplayLength>=0?oSettings._iDisplayStart-oSettings._iDisplayLength:0;
            if(oSettings._iDisplayStart<0){
                oSettings._iDisplayStart=0
                }
            }else{
        if(sAction=="next"){
            if(oSettings._iDisplayLength>=0){
                if(oSettings._iDisplayStart+oSettings._iDisplayLength<oSettings.fnRecordsDisplay()){
                    oSettings._iDisplayStart+=oSettings._iDisplayLength
                }
            }else{
            oSettings._iDisplayStart=0
            }
        }else{
    if(sAction=="last"){
        if(oSettings._iDisplayLength>=0){
            var iPages=parseInt((oSettings.fnRecordsDisplay()-1)/oSettings._iDisplayLength,10)+1;
            oSettings._iDisplayStart=(iPages-1)*oSettings._iDisplayLength
            }else{
            oSettings._iDisplayStart=0
        }
    }else{
    alert("DataTables warning: unknown paging action: "+sAction)
    }
}
}
}
return iOldStart!=oSettings._iDisplayStart
}
function _fnFeatureHtmlInfo(oSettings){

	var tableId=getTableId(oSettings)
    var nInfo=jQuery("."+tableId+"_info");
    if (nInfo==null){
        nInfo= document.createElement("div");
    }
    if(typeof oSettings.aanFeatures.i=="undefined"){
        oSettings.aoDrawCallback.push({
            fn:_fnUpdateInfo,
            sName:"information"
        });
        }
    return nInfo
}
function _fnUpdateInfo(oSettings){
    if(!oSettings.oFeatures.bInfo||oSettings.aanFeatures.i.length===0){    	
        return
    }
    var nFirst=oSettings.aanFeatures.i[0];
    if(oSettings.fnRecordsDisplay()===0&&oSettings.fnRecordsDisplay()==oSettings.fnRecordsTotal()){
        nFirst.html(oSettings.oLanguage.sInfoEmpty+oSettings.oLanguage.sInfoPostFix)
    }else{
        if(oSettings.fnRecordsDisplay()===0){
            nFirst.html(oSettings.oLanguage.sInfoEmpty+" "+oSettings.oLanguage.sInfoFiltered.replace("_MAX_",oSettings.fnRecordsTotal())+oSettings.oLanguage.sInfoPostFix)
        }else{
            if(oSettings.fnRecordsDisplay()==oSettings.fnRecordsTotal()){
                nFirst.html(oSettings.oLanguage.sInfo.replace("_START_",oSettings._iDisplayStart+1).replace("_END_",oSettings.fnDisplayEnd()).replace("_TOTAL_",oSettings.fnRecordsDisplay())+oSettings.oLanguage.sInfoPostFix)
            }else{
                nFirst.html(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)
            }
        }
    }
var n=oSettings.aanFeatures.i;
if(n.length>1){
    var sInfo=nFirst.html();
    for(var i=1,iLen=n.length;
        i<iLen;i++){
        n[i].innerHTML=sInfo
        }
    }
}
function getTableId(oSettings){
	var tableId=oSettings.sTableId.split(":");
	tableId=tableId[tableId.length-1]
	                return tableId
}
function _fnFeatureHtmlLength(oSettings){
	var tableId=getTableId(oSettings)
    var nLength=jQuery("."+tableId+"_anzahl")
    if(nLength==null){
        nLength=document.createElement("div");
    }
    jQuery('select option[value="'+oSettings._iDisplayLength+'"]',nLength).attr("selected",true);
    jQuery("select",nLength).change(function(e){
        var iVal=jQuery(this).val();
        var n=oSettings.aanFeatures.l;
        for(var i=0,iLen=n.length;i<iLen;i++){
            if(n[i]!=this.parentNode){
                jQuery("select",n[i]).val(iVal)
            }
        }
        oSettings._iDisplayLength=parseInt(iVal,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!==""&&typeof oSettings.aanFeatures.r=="undefined"){
        nProcessing.setAttribute("id",oSettings.sTableId+"_processing")
    }
    nProcessing.innerHTML=oSettings.oLanguage.sProcessing;
    nProcessing.className=oSettings.oClasses.sProcessing;
    oSettings.nTable.parentNode.insertBefore(nProcessing,oSettings.nTable);
    return nProcessing
}
function _fnProcessingDisplay(oSettings,bShow){
    if(oSettings.oFeatures.bProcessing){
        var an=oSettings.aanFeatures.r;
        for(var i=0,iLen=an.length;i<iLen;i++){
            an[i].style.visibility=bShow?"visible":"hidden"
        }
        }
    }
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 _fnNodeToDataIndex(s,n){
    for(var i=0,iLen=s.aoData.length;i<iLen;i++){
        if(s.aoData[i]!==null&&s.aoData[i].nTr==n){
            return i
        }
    }
    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 _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=jQuery("thead:eq(0)>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=jQuery(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=jQuery("tr:eq(1)>td",nCalcTmp);
var iIndex;
for(i=0;i<oNodes.length;i++){
    iIndex=oNodes[i].getAttribute("tag_index");
    var iContentWidth=jQuery("td",nCalcTmp).eq(i).width();
    var iSetWidth=oSettings.aoColumns[i].sWidth?oSettings.aoColumns[i].sWidth.slice(0,-2):0;
    oSettings.aoColumns[iIndex].sWidth=Math.max(iContentWidth,iSetWidth)+""
    }
    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++){
        if(oSettings.aoData[i]===null){
            aData.push(null)
        }else{
            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++){
        if(oSettings.aoData[i]===null){
            aNodes.push(null)
        }else{
            aNodes.push(oSettings.aoData[i].nTr)
            }
        }
    return aNodes
}
function _fnGetTdNodes(oSettings){
    var nTrs=_fnGetTrNodes(oSettings);
    var nTds=[],nTd;
    var anReturn=[];
    var iCorrector;
    var iRow,iRows,iColumn,iColumns;
    for(iRow=0,iRows=nTrs.length;
        iRow<iRows;iRow++){
        nTds=[];
        for(iColumn=0,iColumns=nTrs[iRow].childNodes.length;iColumn<iColumns;
            iColumn++){
            nTd=nTrs[iRow].childNodes[iColumn];
            if(nTd.nodeName.toUpperCase()=="TD"){
                nTds.push(nTd)
            }
        }
        iCorrector=0;
    for(iColumn=0,iColumns=oSettings.aoColumns.length;iColumn<iColumns;
        iColumn++){
        if(oSettings.aoColumns[iColumn].bVisible){
            anReturn.push(nTds[iColumn-iCorrector])
        }else{
            anReturn.push(oSettings.aoData[iRow]._anHidden[iColumn]);
            iCorrector++
        }
    }
    }
    return anReturn
}
function _fnEscapeRegex(sVal){
    var acEscape=["/",".","*","+","?","|","(",")","[","]","{","}","\\","jQuery","^"];
    var reReplace=new RegExp("(\\"+acEscape.join("|\\")+")","g");
    return sVal.replace(reReplace,"\\jQuery1")
}
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();
    oSettings.saved_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"){
    oInit.saved_aoColumns=[];
    for(i=0;i<oData.abVisCols.length;
        i++){
        oInit.saved_aoColumns[i]={};

        oInit.saved_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+"="+encodeURIComponent(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 decodeURIComponent(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,TDELEM=4;
    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=[];
    for(j=0,jLen=nTrs[i].childNodes.length;
        j<jLen;j++){
        if(nTrs[i].childNodes[j].nodeName.toUpperCase()=="TD"||nTrs[i].childNodes[j].nodeName.toUpperCase()=="TH"){
            nTds.push(nTrs[i].childNodes[j])
        }
    }
    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].nodeName.toUpperCase()=="TD")?TDELEM: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[0].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._fnPageChange=_fnPageChange;
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._fnNodeToDataIndex=_fnNodeToDataIndex;
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._fnGetTdNodes=_fnGetTdNodes;
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;
this.oApi._fnReDraw=_fnReDraw;
var _that=this;
/* FUNCTION CALL */
return this.each(function(){
    var i=0,iLen,j,jLen;
    for(i=0,iLen=_aoSettings.length;i<iLen;i++){
        if(_aoSettings[i].nTable==this){
            /*alert("DataTables warning: Unable to re-initialise DataTable. Please use the API to make any configuration changes required.");*/
            return _aoSettings[i]
            }
        }
    var oSettings=new classSettings();
    _aoSettings.push(oSettings);
    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,"fnInitComplete");
        _fnMap(oSettings,oInit,"fnServerData");
        _fnMap(oSettings,oInit,"aaSorting");
        _fnMap(oSettings,oInit,"aaSortingFixed");
        _fnMap(oSettings,oInit,"sPaginationType");
        _fnMap(oSettings,oInit,"sAjaxSource");
        _fnMap(oSettings,oInit,"iCookieDuration");
        _fnMap(oSettings,oInit,"sDom");
        _fnMap(oSettings,oInit,"oSearch","oPreviousSearch");
        _fnMap(oSettings,oInit,"aoSearchCols","aoPreSearchCols");
        _fnMap(oSettings,oInit,"iDisplayLength","_iDisplayLength");
        _fnMap(oSettings,oInit,"bJQueryUI","bJUI");
        if(typeof oInit.fnDrawCallback=="function"){
            oSettings.aoDrawCallback.push({
                fn:oInit.fnDrawCallback,
                sName:"user"
            })
        }
        if(oSettings.oFeatures.bServerSide&&oSettings.oFeatures.bSort&&oSettings.oFeatures.bSortClasses){
            oSettings.aoDrawCallback.push({
                fn:_fnSortingClasses,
                sName:"server_side_sort_classes"
            })
        }
        if(typeof oInit.bJQueryUI!="undefined"&&oInit.bJQueryUI){
            oSettings.oClasses=_oExt.oJUIClasses;
            if(typeof oInit.sDom=="undefined"){
                oSettings.sDom='<"H"lfr>t<"F"ip>'
                }
            }
        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);
        oSettings.aoDrawCallback.push({
            fn:_fnSaveState,
            sName:"state_save"
        })
    }
        
    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;
            jQuery.getJSON(oSettings.oLanguage.sUrl,null,function(json){
                _fnLanguageProcess(oSettings,json,true)
            });
            bInitHandedOff=true
            }else{
            _fnLanguageProcess(oSettings,oInit.oLanguage,false)
            }
        }
}else{
    oInit={}
}
if(typeof oInit.asStripClasses=="undefined"){
    oSettings.asStripClasses.push(oSettings.oClasses.sStripOdd);
    oSettings.asStripClasses.push(oSettings.oClasses.sStripEven)
    }
    var nThead=this.getElementsByTagName("thead");
var nThs=nThead.length===0?null:_fnGetUniqueThs(nThead[0]);
var bUseCols=typeof oInit.aoColumns!="undefined";
for(i=0,iLen=bUseCols?oInit.aoColumns.length:nThs.length;i<iLen;i++){
    var oCol=bUseCols?oInit.aoColumns[i]:null;
    var nTh=nThs?nThs[i]:null;
    if(typeof oInit.saved_aoColumns!="undefined"&&oInit.saved_aoColumns.length==iLen){
        if(oCol===null){
            oCol={}
        }
        oCol.bVisible=oInit.saved_aoColumns[i].bVisible
        }
        _fnAddColumn(oSettings,oCol,nTh)
}
for(i=0,iLen=oSettings.aaSorting.length;i<iLen;i++){
    var oColumn=oSettings.aoColumns[oSettings.aaSorting[i][0]];
    if(typeof oSettings.aaSorting[i][2]=="undefined"){
        oSettings.aaSorting[i][2]=0
        }
        if(typeof oInit.aaSorting=="undefined"&&typeof oSettings.saved_aaSorting=="undefined"){
        oSettings.aaSorting[i][1]=oColumn.asSorting[0]
    }
    for(j=0,jLen=oColumn.asSorting.length;j<jLen;j++){
        if(oSettings.aaSorting[i][1]==oColumn.asSorting[j]){
            oSettings.aaSorting[i][2]=j;
            break
        }
    }
    }
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);
