(function() {

  /**
   * The QueryString utility class is used to ... 
   */
  
  var QueryString = function(qs) {

    this.init();

    if (!qs || qs === '') {
      return;
    }

    var keyValPairs = qs.substr(1).split('&');
    
    for (var i = 0, len = keyValPairs.length; i < len; ++i) {
      var keyVal = keyValPairs[i].split('=');
      var key = keyVal.shift();
      var val = (keyVal.length > 0) ? keyVal.join('=') : null;
      this.values[key] = val;
    }
    
  };
  
  /**
   * Returns the value of a given key from the query string
   * @method get 
   * @param {string} 
   * @return {string}
   */
  QueryString.prototype.get = function(key) {
    return this.values[key];
  };
  

  /**
   * Returns the value of a given key from the query string
   * @method get 
   * @param {string} 
   * @return {string}
   */
  QueryString.prototype.unset = function(key) {
    this.values[key] = null;
    delete this.values[key];
  };

  

  /**
   * Returns the value of a given key from the query string
   * @method get 
   * @param {string} 
   * @return {string}
   */
  QueryString.prototype.init = function() {
    this.values = {};
  };
  

  /**
   * Returns the value of a given key from the query string
   * @method get 
   * @param {string} 
   * @return {string}
   */
  QueryString.prototype.set = function(key, val) {
    this.values[key] = val;
  };
  
  
  /**
   * Returns the value of a given key from the query string
   * @method get 
   * @param {string} 
   * @return {string}
   */
  QueryString.prototype.serialize = function(includeQuestionMark) {

    var qs = (includeQuestionMark == true) ? '?' : '';
    
    var keyValPairs = [];
    
    for (var key in this.values) {
      keyValPairs.push([key, escape(this.values[key])].join('='));
    }
    
    return qs + keyValPairs.join('&');
  };
  
  
  

  // Add QueryString to TIME.util namespace
  window.TIME = window.TIME || YAHOO.namespace('TIME');
  YAHOO.namespace('TIME.util');
  TIME.util.QueryString = QueryString;
  
})();