
function createBengRequestUrl(url, parameterObj, headerObj, translationParameter, noCacheControl) {
	// Diese Methode erstellt eine URL, die einen direkten Request vom Browser an das ControlPanel ermöglicht,
	// ohne dazu widgets zu benötigen.
	// Parameter und Header müssen aus technischen Gründen als ExtraPathInfo übergeben werden.
	// In dieser EPI müssen % durch $ ersetzt und serverseitig zurückgesetzt werden.

	headerObj 				= (headerObj || {});
	parameterObj 			= (parameterObj || {});
	translationParameter 	= (translationParameter || {});
	var parameter = "";
	var header = "";
	var tparameter = "";
	var name, value;

	for (name in headerObj) {
		header += name + "=" + headerObj[name] + "&";
	}

	for (name in translationParameter) {
		tparameter += name + "=" + translationParameter[name] + "&";
	}

	header = jencode(header);
	var re = /%/g;

	header = header.replace(re, "$");

	for (var name in parameterObj) {
		value = jencode(parameterObj[name]);
		value = value.replace(re, "$");
		url += "/" + name + "=" + value;
	}

	if (header)
		url += "/header=" + header;

	if (!noCacheControl) {
		url += "/cc=" + new Date().getTime();
	}

    var sessionId = "";
    try {
        sessionId = getTopWindow().urlSessionId || "";
    } catch(e) {}

	url = beng_widget_uri(url,
                sessionId,
                null, null, null, null,
                (tparameter!=""?tparameter:null)
        );
	return url;
}


BengWidget = Class.create(
	{
		initialize : function(path, base, session, frame, clsId) {

			this.path = path;
			this.base = base;
			this.session = session;
			this.frame = frame;
			this.clsId = clsId;
		},

		// just for internal debuging.
		getInfo : function() {
			return this.path+"#"+this.base;
		},

		// Sole use for this as of jun 09 is in marketing.js, for dowloading .csv file
		doGetUrl : function(uri, options, params) {
			var url = this.translateURI(uri, "proxy");
			url += (url.indexOf("?") == -1 ? "?" : "&") + "cc=" + new Date().getTime();
			for (var p in params) {
				url += "&" + p + "=" + params[p];
			}
			return url;
		},

		doRequest : function(uri, options, params, cc) {

			var url = this.translateURI(uri, "proxy");

			url += (url.indexOf("?") == -1 ? "?" : "&") + "cc=" + new Date().getTime();

			for (var p in params) {
				url += "&" + p + "=" + params[p];
			}
			return new Ajax.Request(url, options);
		},

		reload : function(uri, params, options ) {
			uri = (uri || "");
			var url = this.translateURI(uri, "partial");
			url += (url.indexOf("?") == -1 ? "?" : "&") + "cc=" + new Date().getTime();
			for (var p in params) {
				url += (url.indexOf("?") == -1 ? "?" : "&") + p + "=" + params[p];
			}
			options = ( options || {} );
			options.method = "get";
			options.evalScripts = true;
			
			var oldOnComplete = options.onComplete || null;
			
			options.onComplete = function() {
				/* repair FFF window.frames array: when an iframe in a div is removed and inserted
					again, the reference under the old name is still valid but unusable */
				for (var i=0; i < window.frames.length; i++) {
					try {
						var name = window.frames[i].name;
						if (name && window.frames[name] && window.frames[name].closed) {
							window.frames[name] = window.frames[i];
						}
					} catch (ignore) {}
				}

				if (oldOnComplete)
					oldOnComplete();
			}
			
			var elem = this.getElement();
			return new Ajax.Updater(elem, url, options );
		},

		translateURI : function(uri, mode) {
			mode = mode || "";
			var ret = beng_widget_uri(this.base, this.session, this.frame, this.path, mode);

			if (uri)
				ret += uri;

			return ret;
		},

		setElement : function(newWidgetElement) {
			this.widgetElement = newWidgetElement;
		},

		getElement : function() {
			if (!this.widgetElement)
        		this.widgetElement = $("beng_widget_" + "__" + this.path.replace(/\//g, "__") + "__");
        	//if (!this.widgetElement)
        	//   alert("beng_widget_" + "__" + this.path.replace(/\//g, "__") + "__")
        	return this.widgetElement;
    	}
	}
);
