/**
 * jQuery.url
 *  
 * Implements parseUri 1.2.2, (c) Steven Levithan <stevenlevithan.com> (MIT License)
 * 
 * @author AK|Peppered
 * @version 1.0.0
 * 
 */
;(function($){

$.url = {};

/**
 * $.url.set
 * 
 * Sets a part of a URI, and returns new URI
 * 
 * @param {String} url
 * @param {Object} options
 * 
 * requires:
 * window.isEmpty()
 */
$.url.set = function(url, options) {
	var parsed = parseUri(url);
		
	options = $.extend({
		protocol: parsed.protocol,
		host: parsed.host,
		path: parsed.path,
		query: parsed.query,
		queryKey: parsed.queryKey,
		fragment: parsed.anchor
	}, options);
		
	var protocol = options.protocol;
	var host = options.host;
	var path = options.path;
	var query = options.query;
	var queryKey = options.queryKey;
	var fragment = options.fragment;
	
	var newUrl = (!isEmpty(protocol) ? protocol + '://' : '') + (!isEmpty(host) ? host : '' ) + path + (query.length ? ('?'+query) : '') + (fragment.length ? ('#'+fragment) : '');		
	return newUrl;	
}

$.url.query = {};

/**
 * $.url.query.set
 * 
 * Sets/adds query variables to query part of URI
 * Calls $.url.set and returns it's results
 * 
 * @param {String} url
 * @param {Object} pairs
 * 
 * @todo fix double parsing of url
 */
$.url.query.set = function(url, pairs) {
	var parsed = parseUri(url);
	var queryKey = parsed.queryKey;
	
	$.each(pairs, function(k, v){
		queryKey[k] = v;
	});
	var query = '';
	
	$.each(queryKey, function(k, v){
		query += k + '=' + v + '&';
	});
	query = query.slice(0, -1);
	
	return $.url.set(url, {query: query});
};


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) uri[o.q.name][$1] = $2;
	});

	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*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
	}
};

})(jQuery);
	