/**
 * jQuery.query - Query String Modification and Creation for jQuery
 * Written in 2007 by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2008/01/03
 *
 * @author Blair Mitchelmore
 * @version 1.1.1
 *
 **/
jQuery.query = new function() {
	var queryObject = function(a, destructive) {
		var self = this;
		self.keys = {};
		self.destructive = destructive === true ? true : false;
		if (a.queryObject) {
			jQuery.each(a.keys, function(key, val) {
				self.destructiveSet(key, val);
			});
		} else {
			var q = "" + a;
			q = q.replace(/^\?/,''); // remove any leading ?
			q = q.replace(/\&$/,''); // remove any trailing &
			jQuery.each(q.split('&'), function(){
				var key = this.split('=')[0];
				var val = this.split('=')[1];
				if(/^[0-9.]+$/.test(val))
					val = parseFloat(val);
				else if (/^[0-9]+$/.test(val))
					val = parseInt(val);
				self.destructiveSet(key, val || true);
			});
		}
		return self;
	};
	
	queryObject.prototype = {
		queryObject: true,
		get: function(key) {
			return this.keys[key];
		},
		destructiveSet: function(key, val) {
			if (val == undefined || val === null)
				this.destructiveRemove(key);
			else
				this[key] = this.keys[key] = val;
			return this;
		},
		set: function(key, val, destructive) {
			var self = ((destructive === true ? true : this.destructive) === true) ? this : this.copy();
			return self.destructiveSet(key, val);
		},
		destructiveRemove: function(key) {
			if (typeof this.keys[key] != 'undefined') {
				delete this.keys[key];
				delete this[key];
			}
			return this;
		},
		remove: function(key, destructive) {
			var self = ((destructive === true ? true : this.destructive) === true) ? this : this.copy();
			return self.destructiveRemove(key);
		},
		destructiveEmpty: function() {
			var self = this;
			jQuery.each(self.keys, function(key, value) {
				delete self.keys[key];
				delete self[key];
			});
			return self;
		},
		copy: function() {
			return new queryObject(this);
		},
		empty: function(destructive) {
			var self = ((destructive === true ? true : this.destructive) === true) ? this : this.copy();
			return self.destructiveEmpty();
		},
		toString: function() {
			var i = 0, queryString = [];
			jQuery.each(this.keys, function(key, value) {
				var o = [];
				if (value !== false) {
					if (i++ == 0)
						o.push("?");
					o.push(key);
					if (value !== true) {
						o.push("=");
						o.push(encodeURIComponent(value));
					}
				}
				queryString.push(o.join(""));
			});
			return queryString.join("&");
		}
	};
	
	return new queryObject(location.search);
};
