/*
	parseUri 1.2.1
	(c) 2007 Steven Levithan <stevenlevithan.com>
	MIT License
*/

function parseUri (str) {
	var	o   = parseUri.options,
		m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
		uri = {},
		i   = 14;

	while (i--) uri[o.key[i]] = m[i] || "";

	uri[o.q.name] = {};
	uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
		if ($1) {
                  if (uri[o.q.name][$1]) {
                    var arry = new Array();
                    if (typeof(uri[o.q.name][$1]) == "object") {
                      arry = uri[o.q.name][$1];
                      arry.push($2);
                    } else {
                      arry.push(uri[o.q.name][$1]);
                      arry.push($2);
                    }
                    uri[o.q.name][$1] = arry;
                  } else {
                    uri[o.q.name][$1] = $2;
                  }
                }
	});

    // FIXED: add function to uri object
    uri.href = function() {
	var params_arry = new Array();
	for (i in this.queryKey) {
            if (typeof(this.queryKey[i]) == "object") {
              var arry = new Array();
              for(var j=0; j<this.queryKey[i].length; j++) {
                arry.push(i + '=' + this.queryKey[i][j]);
              }
              params_arry.push(arry.join('&'));
            } else {
              params_arry.push(i + '=' + this.queryKey[i]);
            }
	}
	if (params_arry) {
	    return this.protocol + '://' + this.authority + this.path +
		'?' + params_arry.join('&');
	} else {
	    return this.source;
	}
    };

	return uri;
};

parseUri.options = {
	strictMode: false,
	key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
	q:   {
		name:   "queryKey",
		parser: /(?:^|&)([^&=]*)=?([^&]*)/g
	},
	parser: {
		strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
		loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};
