(function ($) {
    $.fn.fcbTvStatsTable = function(options) {
        this._htmlTable      = this;
        this._dataTable      = null;
        this._nrTotalColumns = null;
        this._aHiddenColumns = null;
        this._settings = {
            'iMaxColumns'     : 12,
            "iDisplayLength"  : 18,
            "bPaginate"       : true,
            "bInfo"           : false,
            "bLengthChange"   : false,
            "sPaginationType" : "fcbtv",
            "bFilter"         : true,
            "bSort"           : true,
            "bAutoWidth"      : false
        };
        var _that = this;


        //Trennungszeichen fuer tausender nach Sprache auswaehlen
        if(pageParameters['cc']=='en'){
          var sep=',';
        }
        else{
          var sep='.';
        }

        var getSeps=function (sep, str){
           //1000er punkte/kommata wieder hinzufuegen

            var idx=str.length;

            var neu='';
            while(idx > 0){

              if(idx - 3 > 0) {
              neu = sep + str.substring( idx - 3, idx) + neu;

              }
              else {
                neu = str.substring(0, idx) + neu;
              }
                idx -= 3;
            }
            return neu;
        };

        var _fnNumberFormat = function(nr, sep) {
          if (typeof(nr) != 'number' || isNaN(nr)) {
            return "&nbsp;";
          }

          var str = nr.toString();
          var mod = str.length % 3;
          switch (mod) {
            case 0:
              return str.replace(/(\d{3})/g,        sep + "$1").substr(1);
              break;
            case 1:
              return str.replace(/(^\d{1}|\d{3})/g, sep + "$1").substr(1);
              break;
            case 2:
              return str.replace(/(^\d{2}|\d{3})/g, sep + "$1").substr(1);
              break;
          }
        }

        /**
        *
        */
        this._fnCalculateTotals = function(oTable) {
          /*if ($('thead tr:eq(1)').length == 0) {
            // Calculate Total
            var aResults = {};
            var i;

            $('tbody > tr > td[class!=Label]', oTable).each(function () {
              i = $(this).index();
              if (aResults[i] == undefined) {
                  aResults[i] = 0;
              }
              if($(this).hasClass('Score')){aResults[i] = 'NaN';}
              if ($(this).text() != '0' && !$(this).hasClass('Score')) {
                aResults[i] += parseInt($(this).text().replace(/[,\.]\d\d$|[,\.]/g,''));
              }
            });

            var oRow = $("<tr>");

            oRow.append($("<td>").addClass("Label").append("<p>Gesamt"));
            for (i in aResults) {
              oRow.append(
                $(document.createElement('td'))
                  .append(
                     _fnNumberFormat(aResults[i], sep)
                  )
              );
            }

            $('thead', $(oTable)).append(oRow);
          }*/
        }

        /**
        *
        */
        this._fnColumnControlsShiftRight = function() {
            var dataTable = _that.dataTable();
            var aHiddenColumns = _that._aHiddenColumns;
            var nrTotalColumns = _that._nrTotalColumns - 1;
            var aNewHiddenColumns = [];

            if (aHiddenColumns[aHiddenColumns.length - 1] != aHiddenColumns.length + 1)  {
                // Shift hidden columns array to the right (skipping column zero)
                for (i=0;i < aHiddenColumns.length;i++) {
                    var tmp = (aHiddenColumns[i] + 1) % nrTotalColumns;
                    if (tmp == 0) {
                        aNewHiddenColumns[i] = 2;
                    } else {
                        aNewHiddenColumns[i] = tmp;
                    }
                }
                dataTable.fnSetColumnVis(aHiddenColumns[0],                                true);
                dataTable.fnSetColumnVis(aNewHiddenColumns[0],                            false);
                dataTable.fnSetColumnVis(aNewHiddenColumns[aNewHiddenColumns.length - 1], false);
                dataTable.fnSetColumnVis(1, true);
                _that._aHiddenColumns = aNewHiddenColumns;

                if (aNewHiddenColumns[aNewHiddenColumns.length - 1] == (aNewHiddenColumns.length + 1)) {
                    // Hide Left Elipsis Control
                   // $('thead > tr > th.EllipRight', _that).addClass('InActiveRight');
                    $('.EllipRight', _that).addClass('InActiveRight');
                }
            }
        };

        /**
        *
        */
        this._fnColumnControlsShiftLeft = function() {
            var dataTable = _that.dataTable();
            var aHiddenColumns = _that._aHiddenColumns;
            var nrTotalColumns = _that._nrTotalColumns - 1;
            var aNewHiddenColumns = [];

            // Shift hidden columns array to the right (skipping column zero)
            for (i=0;i < aHiddenColumns.length;i++) {
                var tmp = (aHiddenColumns[i] - 1) % nrTotalColumns;
                aNewHiddenColumns[i] = (tmp > 0)?tmp:2;
                if (tmp < 2) {
                    aNewHiddenColumns[i] = nrTotalColumns - 1;
                } else {
                    aNewHiddenColumns[i] = tmp;
                }
            }

            dataTable.fnSetColumnVis(aHiddenColumns[aHiddenColumns.length - 1],      true);
            dataTable.fnSetColumnVis(aNewHiddenColumns[aHiddenColumns.length - 1],  false);
            dataTable.fnSetColumnVis(aNewHiddenColumns[0], false);
            dataTable.fnSetColumnVis(1, true);

            // Update Array
            _that._aHiddenColumns = aNewHiddenColumns;

            //$('thead > tr > th.EllipRight', _that).removeClass('InActiveRight');
            $('.EllipRight', _that).removeClass('InActiveRight');

            var lastVisible = 2 + _that._settings['iMaxColumns'];
            if (aNewHiddenColumns[0] == lastVisible) {
                // Hide Left Elipsis Control
                dataTable.fnSetColumnVis(1, false);
            }
        };

        /**
        *
        */
        this._fnBuildColumnControls = function(oTable) {
            var ellip    = null;
            var table_id = '#' + oTable.attr('id');

            // ************** ELLIPSIS RIGHT *************

            // Header
            $('thead tr:eq(0)', oTable).each(function () {
                ellip = $('.EllipRight', this).detach();
                if (ellip.length < 1) {
                    ellip = $(document.createElement('th'))
                                .append('&nbsp;')
                                .attr('id', 'ellipsis_test')
                                .addClass('EllipRight')
                                .click(function () {
                                    oTable._fnColumnControlsShiftRight();
                                });
                }
                $(this).append(ellip);
            });
            // Header Total
            $('thead tr:eq(1)', oTable).each(function() {
                ellip = $('.EllipRight', this).detach();
                if (ellip.length < 1) {
                    ellip = $(document.createElement('td'))
                                .append('&nbsp;')
                                .addClass('EllipRight')
                }
                $(this).append(ellip);
            });
            // Rows
            $('tbody tr', oTable).each(function () {
                ellip = $('.EllipRight', this).detach();
                if (ellip.length < 1) {
                    ellip = $(document.createElement('td'))
                                .append('&nbsp;')
                                .addClass('EllipRight');
                }
                $(this).append(ellip);
            });


            // ************** ELLIPSIS LEFT *************
            $('thead tr:eq(0)', oTable).each(function () {  // Header
                ellip = $('.EllipLeft', this).detach();
                if (ellip.length < 1) {
                    ellip = $(document.createElement('th'))
                                .append('&nbsp;')
                                .addClass('EllipLeft')
                                .click(function () {
                                    oTable._fnColumnControlsShiftLeft();
                                });
                }
                $('th:eq(0)', this).after(ellip);
            });
            $('thead tr:eq(1)', oTable).each(function() {// Header Total
                ellip = $('.EllipLeft', this).detach();
                if (ellip.length < 1) {
                    ellip = $(document.createElement('td'))
                                .append('&nbsp;')
                                .addClass('EllipLeft')
                }
                $('td:eq(0)', this).after(ellip);
            });
            $('tbody tr', oTable).each(function () {// Rows
                ellip = $('.EllipLeft', this).detach();
                if (ellip.length < 1) {
                    ellip = $(document.createElement('td'))
                                .append('&nbsp;')
                                .addClass('EllipLeft')
                }
                $('td:eq(0)', this).after(ellip);
            });
        };

        /**
        *
        */
        this._fnGetTotalColumns = function(oTable) {
            return $('tbody > tr:eq(0) > td', oTable).size();
        };

        /**
        *
        */
        this._fnGetHiddenColumns = function (oTable, nrVisibleColumns) {
            var out              = new Array();
            var idxEllipsisLeft  = 1;                           // Left ellipsis is always the second column
            var idxEllipsisRight = oTable._nrTotalColumns - 1;  // Rigth ellipsis is always the last column

            for (var h=idxEllipsisLeft + nrVisibleColumns + 1;h < idxEllipsisRight;h++) {
                out.push(h);
            }

            return out;
        };

        return this.each(function () {
//            console.time('dataTable init');

            if (options) {
                $.extend(_that._settings, options);
            }
            _that._fnCalculateTotals(_that);
            _that._fnBuildColumnControls(_that);
            _that._nrTotalColumns = _that._fnGetTotalColumns(_that);
            _that._aHiddenColumns = _that._fnGetHiddenColumns(_that, _that._settings['iMaxColumns']);
            _that._settings["aoColumnDefs"] = [];

            var not_sortable = [1, _that._nrTotalColumns - 1];
//            if (document.getElementById('PlayerOrder') != null ) {
//              not_sortable.unshift(0);
//            }
            if (_that._aHiddenColumns.length > 0) {
                _that._settings["aoColumnDefs"].push(
                    { "bVisible": false, "aTargets" : _that._aHiddenColumns },
                  //  { "bSortable": false, "aTargets": [ 1, _that._nrTotalColumns - 1 ]}
                    { "bSortable": false, "aTargets": not_sortable }
                );
            }
            if (document.getElementById('PlayerOrder') != null) {
            //Spieler alph. nach Nachnamen sortieren
              _that._settings["aoColumnDefs"].push(
                { "sType": "Name", "aTargets": [ 0 ] }
              );
            }
            else if($('.Label a').attr('date')){
                //"Runden" chronolog. ordnen
                _that._settings["aoColumnDefs"].push(
                { "sType": "Round", "aTargets": [ 0 ] }
              );
            }
            else{
              _that._settings["aoColumnDefs"].push(
                { "sType": "Label", "aTargets": [ 0 ] }
              );
            }



            _that._settings["fnInitComplete"] = function() {
                this.fnSetColumnVis(1, false);
                if (_that._aHiddenColumns.length == 0) {
                    this.fnSetColumnVis(_that._nrTotalColumns - 1, false);
                }

            };
            _that._settings["fnDrawCallback"] = function() {
                // Shift Calculate Fields
                var aoColumns = this.fnSettings().aoColumns;
                var calColumns = $('thead tr:eq(1) td', this);

                for (var idx in aoColumns) {
                    if (!aoColumns[idx].bVisible) {
                        $(calColumns[idx]).hide();
                    } else {
                        $(calColumns[idx]).show();
                    }
                }
            };
//            console.timeEnd('dataTable init');
//            console.time('dataTable');
            _that.dataTable(_that._settings);
//            console.timeEnd('dataTable');
        });
    };


    $.fn.dataTableExt.oSort['natural-asc']  = function(a, b) {

      var aa = a.split(/\s+/);
      var bb = b.split(/\s+/);
      for (x = 0; aa[x] && bb[x]; x++) {
        if (aa[x] !== bb[x]) {
          var c = Number(aa[x]), d = Number(bb[x]);

          if (c == aa[x] && d == bb[x]) {
            return c - d;
          } else {
            return  (aa[x] > bb[x]) ? 1 : -1;
          }
        }
      }

      return aa.length - bb.length;
    };
    $.fn.dataTableExt.oSort['natural-desc']  = function(a, b) {
        return $.fn.dataTableExt.oSort['natural-asc'](b, a);
    };

    $.fn.dataTableExt.oSort['Label-asc']  = function(a,b) {
     //Saison-Jahresangaben absteigend ordnen
      if (document.getElementById('OrderDesc') != null) {

          return $.fn.dataTableExt.oSort['natural-desc'](a, b);
      }
      return $.fn.dataTableExt.oSort['natural-asc']($(a).text(), $(b).text());
    };

    $.fn.dataTableExt.oSort['Label-desc']  = function(a,b) {
       //Saison-Jahresangaben aufsteigend ordnen
      if (document.getElementById('OrderDesc') != null) {
          return $.fn.dataTableExt.oSort['natural-asc'](a, b);
      }
      return $.fn.dataTableExt.oSort['natural-desc']($(a).text(), $(b).text());
    };

    $.fn.dataTableExt.oSort['Round-asc']  = function(a,b) {
      return $.fn.dataTableExt.oSort['natural-asc']($('a', a).attr('date'), $('a', b).attr('date'));
    };

    $.fn.dataTableExt.oSort['Round-desc']  = function(a,b) {
      return $.fn.dataTableExt.oSort['natural-desc']($('a', a).attr('date'), $('a', b).attr('date'));
    };

    $.fn.dataTableExt.oSort['Name-asc']  = function(a,b) {
      a = $(a).text();
      b = $(b).text();
      a = a.replace(/\b[a-züöäß]* /, '');
      b = b.replace(/\b[a-züöäß]* /, '');
      /*a = a.substr(a.lastIndexOf(' ') + 1);
      b = b.substr(b.lastIndexOf(' ') + 1);*/

      return $.fn.dataTableExt.oSort['natural-asc'](a, b);
    };
    $.fn.dataTableExt.oSort['Name-desc']  = function(a,b) {
      a = $(a).text();
      b = $(b).text();
    a = a.replace(/\b[a-züöäß]* /, '');
      b = b.replace(/\b[a-züöäß]* /, '');
      /*a = a.substr(a.lastIndexOf(' ') + 1);
      b = b.substr(b.lastIndexOf(' ') + 1);*/

      return $.fn.dataTableExt.oSort['natural-desc'](a, b);
    };

    //Ueberschreiben der numerical Sortierfunktionen, damit trotz 1000er-Trennzeichen richtig sortiert wird
    $.fn.dataTableExt.oSort['numeric-asc']  = function(a,b) {
      if (typeof(a) == 'string') {
        a=parseInt(a.replace(/[,\.]\d\d$|[,\.]/g,''));
      }
      if (typeof(b) == 'string') {
        b=parseInt(b.replace(/[,\.]\d\d$|[,\.]/g,''));
      }
            return a - b;
    };

        $.fn.dataTableExt.oSort['numeric-desc']  = function(a,b) {
      return $.fn.dataTableExt.oSort['numeric-asc'](b, a);
    };


    $.fn.dataTableExt.afnFiltering.push(
      function (oSettings, aData, iDataIndex) {
        var iColumn = 0;
        var letter  = $("#LetterMenu").attr('chosen');

        var help    = aData[iColumn].replace(/<p><a[^>]*>/i, '');
        help    = help.replace(/\b[a-züöäß]* /, '');

        //var help=aData[iColumn].match(/([a-zA-Züäöß])*\b<span>/i);
        //var help=aData[iColumn].match(/[A-ZÜÄÖ]+([a-zA-ZüäößÜÄÖ])*<span>/);

        if(letter && letter.length==1){
          if(help.charAt(0)==letter){
            return true;
          } else{
            return false;
          }
        }
        return true;
      }
    );


})(jQuery);

