//Querystring
function encode_utf8( s )
{
  return unescape( encodeURIComponent( s ) );
}

function decode_utf8( s )
{
  return decodeURIComponent( escape( s ) );
}


function QS(A){this.params={};if(A==null){A=location.search.substring(1,location.search.length)}if(A.length==0){return }A=A.replace(/\+/g," ");var C=A.split(/[&;]/);for(var D=0;D<C.length;D++){var F=C[D].split("=");var B=encodeURIComponent(F[0]);var E=(F.length==2)?encodeURIComponent(F[1]):B;this.params[B]=E}}QS.prototype.get=function(A,B){var C=this.params[A];return(C!=null)?C:B};QS.prototype.contains=function(A){var B=this.params[A];return(B!=null)};


/*
var QueryString = new Class({ initialize: function(){ $A(window.location.search.replace(/^?/,'').split('&')).each(function(s){ this[s.split('=')[0]] = unescape(s.split('=')[1]); }.bind(this)); } }); 
*/

/*
String.extend({
 
	parseQueryString: function() {
		var vars = this.split(/[&;]/);
		var rs = {};
		if (vars.length) vars.each(function(val) {
			var keys = val.split('=');
			if (keys.length && keys.length == 2) rs[encodeURIComponent(keys[0])] = encodeURIComponent(keys[1]);
		});
		return rs;
	},
 
	parseUri: function(){
		var bits = this.match(/^(?:([^:\/?#.]+):)?(?:\/\/)?(([^:\/?#]*)(?::(\d*))?)((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[\?#]|$)))*\/?)?([^?#\/]*))?(?:\?([^#]*))?(?:#(.*))?/);
		return (bits)?bits.associate(['uri', 'scheme', 'authority', 'domain', 'port', 'path', 'directory', 'file', 'query', 'fragment']): null;
	}
 
});
 
Hash.extend({
 
	toQueryString: function() {
		return Object.toQueryString(this.obj);
	}
 
});
*/