/* *******************************
#kesrequire(share/jsbase/Array.js)
******************************* */

/**
 * Klasse zur Verwaltung von QueryString-Daten.
 */
qx.Class.define("nx4.jsbase.util.QueryString",
{
  extend : qx.core.Object,

  /**
   * Construct.
   * @param str|null QueryString-Daten aus diesem String einlesen wenn vorhanden.
   */
  construct : function(str)
  {
    this._data = [];

    if(str)
      this.fromString(str);
  },

  members :
  {
    length : 0,
    _data : null,



    /*
    --------------------------------------------------------
      Parameterverwaltung.
    --------------------------------------------------------
    */

    /**
     * Fuegt einen Parameter hinzu bzw ueberschreibt einen gleichlautenden.
     * @param param Name des Parameters.
     * @param value Wert des Parameters.
     */
    addParam : function(param, value)
    {
      //bereits vorhandene Werte ueberschreiben, ansonsten anhaengen
      if(nx4.jsbase.Array.hasEntryBySecondIndex(this._data, "name", param))
      {
        for(var i = 0; i < this._data.length; i++)
        {
          if(this._data[i].name == param)
            this._data[i].value = value;
          break;
        }
      }
      else
        this._data.push(
        {
          name  : param,
          value : value
        });

      //Laengenwert updaten
      this.length = this._data.length;
    },

    /**
     * Hohlt den Wert eines Parameters.
     * @param param Name des Parameters.
     * @return Wert des Parameters oder null
     */
    getParam : function(param)
    {
      var p = nx4.jsbase.Array.getEntryBySecondIndex(this._data, "name", param);
      return (p) ? p.value : null;
    },

    /**
     * Entfernt einen Parameter.
     * @param param Name des Parameters.
     */
    removeParam : function(param)
    {
      for(var i = 0; i < this._data.length; i++)
      {
        if(this._data[i].name == param)
          qx.lang.Array.removeAt(this._data, i);
        break;
      }

      //Laengenwert updaten
      this.length = this._data.length;
    },



    /*
    --------------------------------------------------------
      Import und Export
    --------------------------------------------------------
    */

    /**
     * Fasst die Daten zu einem QueryString zusammen.
     * @return QueryString-String.
     */
    toString : function()
    {
      var ret = "";
      for(var i = 0; i < this._data.length; i++)
      {
        if(ret != "")
          ret+= "&";
        ret+= escape(this._data[i].name)+"="+escape(this._data[i].value);
      }
      return ret;
    },

    /**
     * Liest die QueryString-Daten aus einem String ein.
     * Dabei werden bereits vorhandene Daten in der Objektinstanz entfernt.
     * @param str Quell-String.
     */
    fromString : function(str)
    {
      this._data = [];
      var tmp = str.split('&');
      for(var i = 0; i < tmp.length; i++)
      {
        var d = tmp[i].split("=");

        //nur nicht-leere Parameter mit aufnehmen
        if(d.length == 2 && d[0].length > 0)
          this._data.push(
          {
            name  : d[0],
            value : d[1]
          });
      }

      //Laengenwert updaten
      this.length = this._data.length;
    }
  }
});

