$.extend({
    /**
     * @param {string} [queryUrl|propertyName]
     * @param {string} [propertyName]
     * @return {object|string} Returns a object of a URL query. If a parameter 
     *      was passed'd returned a string. Isn't query parameter defined returns 'undefined'; 
     * @example
     * // example URL: http://www.google.com/search?hl=de&source=hp&q=JQUERY
     *  
     * // read a URL query
     * $.urlVars(); // result is a object: {hl: 'de', source:'hp', q: 'JQUERY'}
     * $.urlVars('q'); // result is a string: 'JQUERY'
     * 
     * // read a URL query as a parameter
     * $.urlVars('http://www.google.com/search?hl=de&source=hp&q=JQUERY'); // result is a object: {hl: 'de', source:'hp', q: 'JQUERY'}
     * $.urlVars('http://www.google.com/search?hl=de&source=hp&q=JQUERY', 'p'); // result is a string: 'JQUERY'
     * 
     * // undefined property name behavior
     * $.urlVars('undefinedParam'); // result is a undefined : 'undefined'
     */
    urlVars: function(options, key) {
        var result = {},
        args = arguments,
        argsSize = args.length,
        isQuery = argsSize > 0 && /=/.test(args[0]),
        vars = isQuery ? args[0] : window.location.search,
        isEmpty,
        undefined,
        key = !isQuery && argsSize == 1 ? args[0] : (argsSize > 1 ? args[1] : undefined);
        
        $.map(vars.replace(/\?/, '').split(/&/), function (pair) {
            var p = pair.split(/=/);
            result[p[0]] = p[1]; 
        });
        
        isEmpty = $.isEmptyObject(result);
        if (key && !isEmpty) {
            result = result[key];
        }
        return isEmpty ? undefined : result;
    }
});
