ling .
		if (file.substring(file.length - 2, file.length) == "/.")
		//if (file.endsWith("/."))
			file = file.substring(0, file.length() -1);
	}

	setURL(u, protocol, host, port, authority, userInfo, file, query, ref);
}
// ---------------------------------------------------------------------
function setURL(u, protocol, host, port, authority, userInfo, path, query, ref) {
	u.set(u.protocol, host, port, authority, userInfo, path, query, ref);
}
// ---------------------------------------------------------------------
function URL_isValidProtocol(protocol) {
	return true;
	/*var len = protocol.length;

	if (len < 1)
		return false;

    var c = protocol.charAt(0);

	//if (!Character.isLetter(c))
	if (!isNaN(c))
		return false;

	for (var i = 1 ; i < len ; i++) {
	    c = protocol.charAt(i);

	    if (!Character.isLetterOrDigit(c) && c != '.' && c != '+' && c != '-') {
			return false;
	    }
	}
	return true;*/
}
// ---------------------------------------------------------------------
function URL_setParameter(key, val, replace) {
	if (!key)
		return;

	if (replace || this.qParams[key] == null) {
		this.qParams[key] = new Array();
	}

	this.qParams[key][this.qParams[key].length] = val;
}
// ---------------------------------------------------------------------
function URL_removeParameter(key) {
	var _key;
	var newQParams = new Object();

	for (_key in this.qParams) {
		if (_key != key) {
			newQParams[_key] = this.qParams[_key];
		}
	}

	this.qParams = newQParams;
}
// ---------------------------------------------------------------------
function URL_removeAllParams() {
	var newQParams = new Object();
	this.qParams = newQParams;
}
// ---------------------------------------------------------------------
function URL_parseQueryString() {
	var s;

	if (this.query == null || this.query.length == 0)
		return;
	else
		s = "&" + this.query;

	var idx2;
	var idx = s.indexOf("&");

	while (idx != -1) {
		var kvPair = null;
		var kvPos = 0;

		idx2 = s.indexOf("&", idx+1);

		if (idx2 != -1) {
			kvPair = s.substring(idx+1, idx2);
		} else {
			kvPair = s.substr(idx+1);
		}

		kvPos = kvPair.indexOf("=");

		if (kvPos != -1) {
			var key = kvPair.substring(0, kvPos);
			var val = kvPair.substr(kvPos+1);

			this.setParameter(key, val);
		}

		idx = idx2;
	}
}
// ---------------------------------------------------------------------
function URL_toExternalForm() {
	var result = this.protocol;

	result += ":";

	if (this.authority != null && this.authority.length > 0) {
		result += "//";
		result += this.authority;
	}

	/*if (this.file != null) {
		result += this.file;
	}*/
	if (this.path != null) {
		result += this.path;
	}

	var query = "";
	var key;

	for (key in this.qParams) {
		var vals = this.qParams[key];

		for (var i = 0 ; i < vals.length ; i++) {
			if (query.length == 0) {
				query += key + "=" + vals[i];
			} else {
				query += "&" + key + "=" + vals[i];
			}
		}
	}

	if (query.length > 0) {
		result += "?" + query;
	}

	if (this.ref != null) {
		result += "#";
		result += this.ref;
	}

	return result;
}
// ---------------------------------------------------------------------
function URL_setSession() {
	var sess_pair = getSessionPair();

	if (sess_pair[0] && sess_pair[1]) {
		this.setParameter(sess_pair[0], sess_pair[1], true);
		this.setParameter(CM_SESSION_KEY_KEY, sess_pair[0], true);

		return true;
	}

	return false;
}
// ---------------------------------------------------------------------

