/*
	parseUri 1.2.1
	(c) 2007 Steven Levithan <stevenlevithan.com>
	MIT License
*/

He.Bootstrap('He.Framework.Uri');

He.Framework.Uri.Parse = function(str)
{
	var	o = He.Framework.Uri.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) uri[o.q.name][$1] = $2;
	});

	return uri;
};

He.Framework.Uri.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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};

He.Framework.Uri.IsAbsolute = function(_url)
{
	var url = He.Framework.Uri.Parse(_url);
	return url.host != '';
};

He.Framework.Uri.MakeAbsolute = function(_url)
{
	if(!_url)
	{
		return _url;
	}

	var url = He.Framework.Uri.Parse(_url);
	if(!url.protocol)
	{
		var base = He.Framework.Uri.Parse(document.location.href);

		if(_url.charAt(0) != '/')
		{
			var spath = base.relative.replace(/\/#\//,'').split('/');
			var dpath = _url.replace(/\/#\//,'').split('/');

			while(dpath.length)
			{
				if(dpath[0] == '..')
				{
					spath.pop();
				}
				else
				{
					spath.push(dpath[0]);
				}
				dpath.shift();
			}

			_url = base.protocol + '://' + base.host + '/' + spath.join('/');
		}
		else
		{
			_url = base.protocol + '://' + base.host + _url;
		}
	}
	return _url

	if(_url.charAt(0) == '/')
	{
		_url = _url.substr(1);
	}

	var url = He.Framework.Uri.Parse(_url);
	var root = url.protocol + '://' + url.authority;

	return root + '/' + _url;
};

He.Framework.Uri.IsRelative = function(_url)
{
	return !He.Framework.Uri.IsAbsolute(_url);
};

He.Framework.Uri.MakeRelative = function(_url)
{
	var url = He.Framework.Uri.Parse(_url);
	var root = url.protocol + '://' + url.authority;

	_url = _url.replace(new RegExp('\/#\/'),'/').replace(new RegExp(root),'');
	if(!_url)
	{
		_url = '/';
	}
	return _url;
};

