function myReplace(s, s1, s2) {
	var n = s.length;
	var n1 = s1.length;
	var n2 = s2.length;

	var j = 0;
	var i = s.indexOf( s1, j);

	while ( typeof i == "number" && i != -1 ) {
		s = s.substring( 0, i ) + s2 + s.substring( i+n1 , n );
		n += (n2 - n1);
		j = i+n2;
		i = s.indexOf( s1, j);
	}
	return s;
}

function isEmpty(value){
	return (myReplace(value, " ", "").length==0);
}

function escapeAmpersands(s) {
	return myReplace(s, "&", "&&" );
}

function unescapeAmpersands(s) {
	return myReplace(s, "&&", "&" );
}

function myRequest( sQueryString ) {
	this.keys = new Array();
	if ( sQueryString == null) {
		return;
	}
	var sKey = '';
	var n = 0;
	var s = unescape( sQueryString );
	if ( s.substring(0,1) == '?' ) {
		s = s.substring(1, s.length );
	}
	
	var i;
	var j;
	var k;

	i = 0;
	while (true) {
		j = s.indexOf('=', i);
		if (typeof j != "number" || j == -1) {
			return;
		}
		k = s.indexOf('&', j+1);
		if ( typeof k != "number" || k == -1 ) {
			k = s.length;
		}
		else {
			while ( s.substring(k+1,k+2) == '&' ) {
				k = s.indexOf('&', k+2);
				if ( typeof k != "number" || k == -1 ) {
					k = s.length;
					break;
				}
			}
		}
		sKey = s.substring(i,j);
		this[ sKey ] = unescapeAmpersands( s.substring(j+1,k) );
		this.keys[n++] = sKey;
		i = k+1;
	}
}

myRequest.prototype.toQueryString = toQueryString_myRequest;
myRequest.prototype.add = add_myRequest;
myRequest.prototype.merge = merge_myRequest;

function add_myRequest( sKey, sValue) {
	if ( this[ sKey ] == null ) {
		this.keys[ this.keys.length ] = sKey;
	}
	this [ sKey ] = sValue;
}

function toQueryString_myRequest() {
	var s = '?';
	var n = this.keys.length;
	for ( var i = 0; i < n; i++ ) {
		var sKey = this.keys[i];
		s += escapeAmpersands( sKey + '=' + this[ sKey ] );
		if ( i < (n-1) ) {
			s += '&';
		}
	}
	return s;
}

// If a key already exists, its value will be overwritten 
function merge_myRequest( oRequest ) {
	if ( oRequest != null && oRequest.keys != null ) {
		var n1 = this.keys.length;
		var n2 = oRequest.keys.length;
		for ( var i = 0; i < n2; i++ ) {
			var sKey = oRequest.keys[i];
			var sValue = oRequest[ sKey ];
			if ( this[ sKey ] == null ) {
				this.keys[ n1++ ] = sKey;
			}
			this [ sKey ] = sValue;
		}
	}
}

