/**
 * @name node.querystring
 * @namespace
 * This module provides utilities for dealing with query strings.
 * It provides the following methods:
 */

goog.provide("node.querystring");

/**
 * @param {string} s
 * @param {string} decodeSpaces
 */
node.querystring.unescapeBuffer = function(s, decodeSpaces) {
  return node.querystring.core_.unescapeBuffer(s, decodeSpaces);
};

/**
 * The unescape function used by <code>querystring.parse</code>,
 * provided so that it could be overridden if necessary.
 * @param {string} s
 * @param {string} decodeSpaces
 */
node.querystring.unescape = function(s, decodeSpaces) {
  return node.querystring.core_.unescape(s, decodeSpaces);
};

/**
 * The escape function used by <code>querystring.stringify</code>,
 * provided so that it could be overridden if necessary.
 * @param {string} str
 */
node.querystring.escape = function(str) {
  return node.querystring.core_.escape(str);
};

/**
 * @param {Object} obj
 * @param {string} sep
 * @param {string} eq
 * @param {string} name
 */
node.querystring.encode = function(obj, sep, eq, name) {
  return node.querystring.core_.encode(obj, sep, eq, name);
};

/**
 * Serialize an object to a query string.
 * Optionally override the default separator and assignment characters.
 *
 * Example:
 * <pre>
 *     querystring.stringify({foo: 'bar'})
 *     // returns
 *     'foo=bar'
 *
 *     querystring.stringify({foo: 'bar', baz: 'bob'}, ';', ':')
 *     // returns
 *     'foo:bar;baz:bob'
 * </pre>
 * @param {Object} obj
 * @param {string} sep
 * @param {string} eq
 * @param {string} name
 */
node.querystring.stringify = function(obj, sep, eq, name) {
  return node.querystring.core_.stringify(obj, sep, eq, name);
};

/**
 * @param {string} qs
 * @param {string} sep
 * @param {string} eq
 */
node.querystring.decode = function(qs, sep, eq) {
  return node.querystring.core_.decode(qs, sep, eq);
};

/**
 * Deserialize a query string to an object.
 * Optionally override the default separator and assignment characters.
 *
 * Example:
 * <pre>
 *     querystring.parse('a=b&b=c')
 *     // returns
 *     { a: 'b', b: 'c' }
 * </pre>
 * @param {string} qs
 * @param {string} sep
 * @param {string} eq
 */
node.querystring.parse = function(qs, sep, eq) {
  return node.querystring.core_.parse(qs, sep, eq);
};


/**
 * @private
 * @type {*}
 */
node.querystring.core_ = require("querystring");