Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
YUI.add('querystring-stringify', function (Y, NAME) {
2
 
3
/**
4
 * Provides Y.QueryString.stringify method for converting objects to Query Strings.
5
 *
6
 * @module querystring
7
 * @submodule querystring-stringify
8
 */
9
 
10
var QueryString = Y.namespace("QueryString"),
11
    stack = [],
12
    L = Y.Lang;
13
 
14
/**
15
 * Provides Y.QueryString.escape method to be able to override default encoding
16
 * method.  This is important in cases where non-standard delimiters are used, if
17
 * the delimiters would not normally be handled properly by the builtin
18
 * (en|de)codeURIComponent functions.
19
 * Default: encodeURIComponent
20
 *
21
 * @method escape
22
 * @for QueryString
23
 * @static
24
 **/
25
QueryString.escape = encodeURIComponent;
26
 
27
/**
28
 * <p>Converts an arbitrary value to a Query String representation.</p>
29
 *
30
 * <p>Objects with cyclical references will trigger an exception.</p>
31
 *
32
 * @method stringify
33
 * @for QueryString
34
 * @public
35
 * @param obj {Any} any arbitrary value to convert to query string
36
 * @param cfg {Object} (optional) Configuration object.  The three
37
 * supported configurations are:
38
 * <ul><li>sep: When defined, the value will be used as the key-value
39
 * separator.  The default value is "&".</li>
40
 * <li>eq: When defined, the value will be used to join the key to
41
 * the value.  The default value is "=".</li>
42
 * <li>arrayKey: When set to true, the key of an array will have the
43
 * '[]' notation appended to the key.  The default value is false.
44
 * </li></ul>
45
 * @param name {String} (optional) Name of the current key, for handling children recursively.
46
 * @static
47
 */
48
QueryString.stringify = function (obj, c, name) {
49
    var begin, end, i, l, n, s,
50
        sep = c && c.sep ? c.sep : "&",
51
        eq = c && c.eq ? c.eq : "=",
52
        aK = c && c.arrayKey ? c.arrayKey : false;
53
 
54
    if (L.isNull(obj) || L.isUndefined(obj) || L.isFunction(obj)) {
55
        return name ? QueryString.escape(name) + eq : '';
56
    }
57
 
58
    if (L.isBoolean(obj) || Object.prototype.toString.call(obj) === '[object Boolean]') {
59
        obj =+ obj;
60
    }
61
 
62
    if (L.isNumber(obj) || L.isString(obj)) {
63
        return QueryString.escape(name) + eq + QueryString.escape(obj);
64
    }
65
 
66
    if (L.isArray(obj)) {
67
        s = [];
68
        name = aK ? name + '[]' : name;
69
        l = obj.length;
70
        for (i = 0; i < l; i++) {
71
            s.push( QueryString.stringify(obj[i], c, name) );
72
        }
73
 
74
        return s.join(sep);
75
    }
76
    // now we know it's an object.
77
 
78
    // Check for cyclical references in nested objects
79
    for (i = stack.length - 1; i >= 0; --i) {
80
        if (stack[i] === obj) {
81
            throw new Error("QueryString.stringify. Cyclical reference");
82
        }
83
    }
84
 
85
    stack.push(obj);
86
    s = [];
87
    begin = name ? name + '[' : '';
88
    end = name ? ']' : '';
89
    for (i in obj) {
90
        if (obj.hasOwnProperty(i)) {
91
            n = begin + i + end;
92
            s.push(QueryString.stringify(obj[i], c, n));
93
        }
94
    }
95
 
96
    stack.pop();
97
    s = s.join(sep);
98
    if (!s && name) {
99
        return name + "=";
100
    }
101
 
102
    return s;
103
};
104
 
105
 
106
}, '3.18.1', {"requires": ["yui-base"]});