/* *****************************************
#kesrequire(share/jsbase/sort/BaseSorter.js)
***************************************** */

qx.Class.define("nx4.jsbase.Array",
{
  type:"static",

  statics :
  {
    /**
     * Hilfsfunktion die von arraySortBySecondIndex fuer die sort-Routine genutzt wird.
     * @param idx Array-Index der verglichen werden soll (wird vom curry-Aufruf selbst gesetzt)
     * @param a erster Wert
     * @param b zweiter Wert
     * @return -1 wenn a<b, 0 wenn a=b und 1 wenn a > b
     */
    sortHelper : function(idx, sorter, a, b)
    {
      var x = (a[idx]) ? a[idx] : "";
      var y = (b[idx]) ? b[idx] : "";

      return sorter(x, y);
    },

    /**
     * Sortiert ein mehrdimensionales Array nach einem Unter-Indexwert und einer Richtung.
     * gemobbst von unserer selben Funktion aus baseall::ArrayMisc
     * @param multiArray das zu sortierende Array
     * @param secondIndex der Name des Indexes in der tieferen Ebene nach dem sortiert werden soll
     * @param SortOrder Sortierrichtung. (1 ... A -> Z, 2 ... Z -> A)
     * @return sortietes Array
     */
    sortBySecondIndex : function(multiArray, secondIndex, SortOrder, Sorter)
    {
      //wenn keine Sortierfunktion uebergeben wurde, den Std-Sortierer verwenden
      if(!Sorter)
        Sorter = nx4.jsbase.sort.BaseSorter.sortAscending;

      return nx4.jsbase.Array.sortByCallback(multiArray, qx.lang.Function.curry(nx4.jsbase.Array.sortHelper, secondIndex, Sorter), SortOrder);
    },

    sortByCallback : function(sArray, func, SortOrder)
    {
      //wenn SortOrder nicht gesetzt ist, default A->Z
      if(!SortOrder)
        SortOrder = 1;

      //Array sortieren mittels unserer Hilfsfunktion als Indikator
      sArray.sort(func);

      //wenn noetig das Ganze noch umdrehen
      if(SortOrder == 2)
        sArray.reverse();

      return sArray;
    },

    getEntryBySecondIndex : function(multiArray, secondIndex, val)
    {
      for(var i = 0; i < multiArray.length; i++)
        if(multiArray[i][secondIndex] == val)
          return multiArray[i];
      return false;

    },

    hasEntryBySecondIndex : function(multiArray, secondIndex, val)
    {
      return (!!this.getEntryBySecondIndex(multiArray, secondIndex, val));
    },

    inArray : function(val, array)
    {
      for(var i = 0; i < array.length; i++)
        if(array[i] == val)
          return true;
      return false;
    }

  }
});

qx.Class.define("kes.jsbase.Array",
{
  type:"static",

  statics :
  {
    sortHelper : function(idx, a, b)
    {
      return nx4.jsbase.Array.sortHelper(idx, nx4.jsbase.sort.BaseSorter.sortAscending, a, b);
    },

    sortBySecondIndex : function(multiArray, secondIndex, SortOrder)
    {
      qx.log.Logger.warn("kes.jsbase.Array is deprecated");
      return nx4.jsbase.Array.sortByCallback(multiArray, qx.lang.Function.curry(nx4.jsbase.Array.sortHelper, secondIndex, nx4.jsbase.sort.BaseSorter.sortAscending), SortOrder);
    },

    sortByCallback : function(sArray, func, SortOrder)
    {
      qx.log.Logger.warn("kes.jsbase.Array is deprecated");
      return nx4.jsbase.Array.sortByCallback(sArray, func, SortOrder);
    },

    hasIdxBySecondIndex : function(multiArray, secondIndex, val)
    {
      qx.log.Logger.warn("kes.jsbase.Array is deprecated");
      return nx4.jsbase.Array.hasEntryBySecondIndex(multiArray, secondIndex, val);
    },

    inArray : function(val, array)
    {
      qx.log.Logger.warn("kes.jsbase.Array is deprecated");
      return nx4.jsbase.Array.inArray(val, array);
    }
  }
});

