// mehrere onLoadactions verarbeiten, vgl Ajax in Action S. 110
// Testweise, inkompatible mit bestehendem Code
/*
window.onloadListeners = new Array();
window.addOnloadListener(listener) {
	window.onloadListeners[window.onloadListeners.length] = listener
}
window.onload = function() {
	for(var i=0;i<window.onloadListeners.length;i++) {
	var func = windows.onloadListeners[i]
	func.call()
	}checkbrowser

}
*/
var is_ie
var is_ie7
var is_mac
var is_safari
var is_mac_ie
var is_gecko
var is_mac_moz
var browser

initContains(window);


function imgPreloader(arr) {
	// report(arr.length)
	for (i=0;i<arr.length;i++) {var img = new Image(); img.src = arr[i]}
}

function getTime(str,br,outputMode) {
	if (window.timer) {
		if (!outputMode) 	report(timer.getTime(str,br));
		else 				alert( timer.getTime(str,br));			
	}
}


function replaceIEFlashObjects() {
	agt       = navigator.userAgent.toLowerCase();
	//return;
	// alert(agt)
	// if (agt.indexOf("msie 7") != -1) {
		if (document.all) {
			o = document.getElementsByTagName("object");  
			for(i=0; i<o.length; i++) { 
				// alert(o[i].nodeName) 
		    	o[i].outerHTML = o[i].outerHTML.replace('wait=1','wait=0');  // triggert Ladebalken
				// alert(o[i].outerHTML)
			}
		}
	// }
}

function initContains(windowObj) {
	// ergaenzt die contains Funktion fuer geckeo
	// alert("initContains " + windowObj)
	if (!document.all) {
		windowObj.HTMLElement.prototype.contains = function(node) {
			// alert("contains "+node.nodeName)
			if (node == null)
				return false;
			if (node == this)
				return true;
			else
				return this.contains(node.parentNode);
		}
	}
}
function openDialog(DialogData) {
		url = DialogData.url
		//alert(url)
		if (!DialogData.h)        h       = 100;        else h = DialogData.h;
		if (!DialogData.w)        w       = 100;        else w = DialogData.w;
		if (!DialogData.t)        t       = 100;        else t = DialogData.t;
		if (!DialogData.left)     left    = 100;        else left = DialogData.left;
		if (!DialogData.resize)   resize  = 0;          else resize = DialogData.resize;
		if (!DialogData.status)   status  = 0;          else status = DialogData.status;
		if (!DialogData.scrollen) scrollen= 0;          else scrollen = DialogData.scrollen;
		if (!DialogData.edge)     edge    = "raised";   else edge = DialogData.edge;
		if (!DialogData.loc)      loc     = 0;    		else loc = DialogData.loc;
		myDialogArguments = DialogData.args // wird von Mozilla abgerufen, wenn ein Fenster geoeffnet wurde
		aktueldialogEditor = window.open(url, "", 'menuebar = 0, width='+(w-6)+', height='+(h-26)+', left='+left+', top='+t+',status='+status+', toolbar=0, scrollbars='+scrollen+', resizable='+resize+', location='+loc+',fullscreen = 0');
}

function clapWindow(elname,height,mozdiff) { 
		// macht ein Element sichtbar und vergoessert das Fenster
		// height = heoehe des fensters ie
		if(!window.fensterhoehe_start) {
			if (document.all) 	fensterhoehe_start = document.body.clientHeight + 29 // Fenster mit Titelleiste
			else 	  		 	fensterhoehe_start = window.outerHeight
		}
		// alert(fensterhoehe_start)
		mozdiff = 90;
		if (!document.getElementById(elname)) return;
		klappbereich = document.getElementById(elname)
		if (document.all) 	fensterbreite = document.body.clientWidth + 8 // fuer Border
		else 	   			fensterbreite = window.outerWidth
		//alert(fensterbreite)
		if (klappbereich.style.display == "none")  {
			klappbereich.style.display = "inline";
			document.getElementById("img_"+elname).src = "../cms/images/icon_klapppfeildown.gif";
			if (document.all) 	window.resizeTo(fensterbreite,height);
			else 	  		 	window.outerHeight = height + mozdiff;
		} else {
			klappbereich.style.display = "none";
			document.getElementById("img_"+elname).src = "../cms/images/icon_klapppfeilup.gif";
			if (document.all) 	window.resizeTo(fensterbreite,fensterhoehe_start);
			else 				window.outerHeight = fensterhoehe_start;
		}
	}
	
	
function getAsQuerystring(formname) {
	inputArr 	= document[formname].getElementsByTagName('input');
	selectArr 	= document[formname].getElementsByTagName('select');
	textareaArr = document[formname].getElementsByTagName('textarea');
	str = '';
	for(i=0;i<inputArr.length;i++) {
		input = inputArr[i]
		if (input.type=='checkbox') {
			if (input.checked) str += '&' + input.name + '=' + input.value
		} else if (input.type=='radio') {
			if (input.checked) str += '&' + input.name + '=' + input.value
		} else {
			str += '&' + input.name + '=' + input.value
		}
	}
	for(i=0;i<selectArr.length;i++) {
		str += '&' + selectArr[i].name + '=' + selectArr[i].value
	}
	
	for(i=0;i<textareaArr.length;i++) {
		val = textareaArr[i].value
		val = val.replace("'","\'"); 				// Da ich mit einfachen Anfuehrungszeichen arbeite, diese escapen!
		str += '&' + textareaArr[i].name + '=' + val
	}
	// alert(str);
	return str;
}


function report(info,clr) {
	// alert(info)
	if (document.getElementById("infodiv")) {
		document.getElementById("infodiv").style.display = 'block'
	} else {
		// alert("create div")
		div = document.createElement("div");
		div.id = "infodiv"
		div.style.backgroundColor 	= "#FFFF00";
		div.style.position 			= "absolute";
		div.style.fontFamily 		= "verdana";
		div.style.fontSize 			= "9px";
		div.style.width 			= "100%";
		//div.style.height = "200px";
		//div.style.display = "block";
		div.style.zIndex = 100000;
		document.body.insertBefore(div,document.body.firstChild)
		
		//document.body.appendChild(div)
	}
	if(clr) document.getElementById("infodiv").innerHTML = '';
	document.getElementById("infodiv").innerHTML += (" " +info)
}


var changedFieldsObj = {}
function listChanges(fieldname) {
	// alert("listChanges " + fieldname)
	changedFieldsObj.fieldname = 1;
}


// alert("jbasics")
// Window class
function windowInfo() {
	this.getOuterWidth = function() {
		if (is_ie) 	return document.body.clientWidth // provisorisch: IE aeussere Fenstergoesse?
		else 		return window.outerWidth
	}
	this.getOuterHeigth = function() {
		if (is_ie) 	return document.body.clientHeight
		else 		return window.outerHeight
	}
	/*
	if (is_ie) {
		 	mouseX = window.event.clientX;
		   	mouseY = window.event.clientY;
			windowWidth = document.body.clientWidth
			windowHeight= document.body.clientHeight
	} else {
			mouseX = e.clientX;
		   	mouseY = e.clientY;
			windowWidth = window.innerWidth
			windowHeight= window.innerHeight
	}
	*/
}

function getCSSStyle(el,attribut) {   
	// alert ("el " + el.nodeName + " getCSSStyle " + attribut)
	// INPUT: attribut = "background-color" nicht Javascript Schreibweise "backgroundColor"
	if (window.getComputedStyle) { // Moz
		 attributVal = window.getComputedStyle(el,"").getPropertyValue(attribut);
	  } else if (el.currentStyle) { // IE
		 attributVal= el.currentStyle[attribut];
	}
	// alert(attributVal)
	return attributVal;
}

function cargoWindow(type,vars,url,pars) {
	// alert("type: "+type + " vars: "+ vars + " url: " + url + " pars: " + pars);
	// alert('/cms/popups/uploadcsv.php?'           +vars)
	if (type=="importcsv") 			{F2 = window.open('http://www.kaercher.at/cms/popups/uploadcsv.php?'           +vars,'','toolbar=no,location=no,menubar=no,scrollbars=yes,resizable=yes,width=1000,height=500,left=10,top=10');}
	else 							{F2 = window.open(url+vars,'',pars)}
}


function selectAll(idStr, onOff, formname) {
	// onOff: 1 | 0
	// alert("idStr " + idStr + " onOff " + onOff + " formname " + formname);
	if (!formname) formname = 'edit';
	flength = document[formname].elements.length
	//alert("document[formname].elements.length " + document[formname].elements.length)
	for (i=0;i<flength;i++){
		// alert(document[formname].elements[i].id)
		if(document[formname].elements[i].name && document[formname].elements[i].name.indexOf(idStr)!= -1) {
			document[formname].elements[i].checked = onOff;
		}
	}
	moreCheckboxAction(idStr,onOff,'selectAll') // eine viewbezogen Funktion aufrufen, wenn sie vorhanden ist
}
function moreCheckboxAction(idStr,onOff,mode) {
	idstrArr = idStr.split('__');
	viewname = idstrArr[1];
	// alert("moreCheckboxAction " + idStr + " onOff " + onOff + " mode " + mode + " viewname " + viewname);
	// alert(window[viewname+"_checkboxaction")
	functionName = viewname+"_"+ mode+ "_checkBoxAction"
	// alert("functionName: " + functionName + " " + window[functionName])
	if (window[functionName]) eval(functionName+"("+onOff+")");
}

function btn_Set(obj,className) 		{obj.className=className}
function btn_hover(obj) 	{obj.className="btn_hover"}
function btn_out(obj) 		{obj.className="btn"}
function btn_down(obj) 		{obj.className="btn_active"}
function btn_up(obj) 		{obj.className="btn"}
function btntop_hover(obj) 	{obj.className="btntop_hover"}
function btntop_out(obj) 	{obj.className="btntop"}
function btntop_down(obj) 	{obj.className="btntop_active"}
function btntop_up(obj) 	{obj.className="btntop"}
function btnhell_hover(obj) {obj.className="btnhell_hover"}
function btnhell_out(obj) 	{obj.className="btnhell"}
function btnhell_down(obj) 	{obj.className="btnhell_active"}
function btnhell_up(obj) 	{obj.className="btnhell"}




function activateHighlightRowOnClick(el,colOver,colClick) {
	var trArr = getElementsByClassNameM(el,'tr','row')
	var L = trArr.length
	for (var i=0; i<L; i++) {
		tr = trArr[i]
		prevCol = getCSSStyle(tr,"background-color")
		if (!prevCol) prevCol = 'transparent';
		registerEventListeners(tr,'click',		function(){highlightRow('click',this,colClick,prevCol);},		false) 
		registerEventListeners(tr,'mouseover',	function(){highlightRow('over',this,colOver,prevCol,colClick);},false) 
		registerEventListeners(tr,'mouseout', 	function(){highlightRow('out',this,prevCol,colOver,colClick);},false) 
	}
}
function highlightRow(mode,tr,col,prevCol,colClick) {  // Evtl. muss ein Hover style deactivert werden
	// keine per Click aktivierten Rows ueberschreiben
	if (tr.style && tr.style.backgroundColor == colClick) return
	if (tr.style && tr.style.backgroundColor != col) {
		tr.style.backgroundColor  = col
	} else {
		if (mode != 'out') tr.style.backgroundColor = prevCol
	}
}




// BROWSERCHECKS
function checkbrowser() {
	agt       = navigator.userAgent.toLowerCase();
	// alert("checkbrowser" +agt)
	is_ie	  = ((agt.indexOf("msie")  != -1) && (agt.indexOf("opera") == -1));
	is_ie7	  = (agt.indexOf("msie 7") != -1);
	is_opera  = (agt.indexOf("opera")  != -1);
	is_mac	  = (agt.indexOf("mac")    != -1);
	is_safari = (agt.indexOf("safari") != -1); // Safari
	is_mac_ie = (is_ie && is_mac);
	is_win_ie = (is_ie && !is_mac);
	is_gecko  = (navigator.product == "Gecko");
	is_mac_not_moz = (!is_gecko && is_mac);
	is_mac_moz= (is_gecko && is_mac);
	// alert("is_safari "+ is_safari)
	// alert("is_mac_not_moz "+ is_mac_not_moz)
	// alert("is_gecko "+ is_gecko)
	// alert("is_mac_ie "+ is_mac_ie)
	// alert("checkbrowser " + is_ie7)
}


// E V E N T S 
function openNewWindow(theURL,winName,features) {
	//toolbar=no,location=no,menubar=no,scrollbars=no,resizable=yes,width=520,height=280,left=0,top=0
	// alert(features)
	window.open(theURL,winName,features);
}
function addevent(el, evname, func) {
	// alert("is_ie " + is_ie + " el: " + el + "   evname: " + evname + " func: " + func);
	if(el) {
		if (is_ie) el.attachEvent("on" + evname, func);
		else       el.addEventListener(evname, func, true);
	} else {
		if (is_ie) attachEvent("on" + evname, func); 			// geht nicht mit document.body
		else       addEventListener(evname, func, true);
	}
}
// E V E N T S  F U E R    O B J E K T E , vgl:registerEventListenersObj(document, 	"mousedown",	this, false, 'startdrag');

// registerEventListenersObj(this.lis[i], "mousedown", this, false, 'show');
function registerEventListenersObj(element,eventtype,listener,captures,f,pars) {
	// listener ist das object
	if (document.addEventListener) element.addEventListener(eventtype,  function(event) 		{listener[f](event,element,pars)}, captures)
	else 						   element.attachEvent("on" +eventtype, function() 				{listener[f](event,element,pars)})
}
function registerEventListeners(element,eventtype,listenerfunction,captures) {
	if (document.addEventListener)  element.addEventListener(eventtype,  listenerfunction, captures)
	else 							element.attachEvent("on" +eventtype, listenerfunction)
}
function registerEventListenersWithPars(element,eventtype,listener,captures,pars) {
	if (document.addEventListener) element.addEventListener(eventtype,  function(){eval(listener)},true)
	else 						   element.attachEvent("on" +eventtype, function(){eval(listener)})
}
function hasClassName(el,thisClassName) {
	if (!el.className) return false;
	if (el.className == thisClassName || el.className.match(new RegExp("(^|\\s)" + thisClassName + "(\\s|$)"))) return true
}
// vgl: http://www.dcljs.de/faq/antwort.php?Antwort=dhtml_koordinaten
function absLeft(el) {
	// alert(el.nodeName + " " + el.offsetLeft)
	return (el.offsetParent) ? el.offsetLeft + absLeft(el.offsetParent) : el.offsetLeft;
}
function absTop(el) {
	return (el.offsetParent)? el.offsetTop+absTop(el.offsetParent) : el.offsetTop;
}

function getSize(el) {
	return {left:absLeft(el), top:absTop(el), width:el.offsetWidth, height:el.offsetHeight}
}

function hasClassName(el,thisClassName) {
	// report(el.nodeName)
	if (!el.className) return false;
	if (el.className == thisClassName || el.className.match(new RegExp("(^|\\s)" + thisClassName + "(\\s|$)"))) return true
}

function getElementsByClassNameM(el,tag,thisclass) {
// el:			startelement oder body
// tag:			welche elemente?, <div>, <span></span> oder alle '*'
	if (!tag) tag = '*';
	var elArr = (document.el || document.body).getElementsByTagName(tag);
	// alert("elArr.length ".elArr.length)
	l = elArr.length
	var elements = [], child; // array
   	for (var i=0; i<l; i++) {
      	child = elArr[i];
     	//if (child.className.indexOf(thisclass)!=-1) elements.push(child)
		// var reg = "\b" + thisclass + "\b"
		// r = new RegExp(( thisclass$)|(^thisclass )|( thisclass ))
		r = new RegExp("( "+thisclass+"$)|(^"+thisclass+" )|( "+thisclass+" )")
		if (child.className.match(r)) elements.push(child)


		// if (child.className.match(new RegExp("\b" + thisclass + "\b"))) 		elements.push(child)
		
	}
	// report("getElementsByClassNameM:" +elements+ "<br>")
    return elements;
}


function findParentWidthClassName(el,thisClassName) {
	// alert(el.nodeName)
	if (el.nodeName.toLowerCase() != 'html') return (hasClassName(el,thisClassName)) ? el : findParentWidthClassName(el.parentNode,thisClassName);
}

function findParentElementByNodeName(el,tragetNodeName) {
	// alert(el.id)
	// such ein bestimmte parentelement, z. B. ein <form>
	// Input: erwartet ein Element!
	// alert("findParentElementByNodeName el " + el + " tragetNodeName " + tragetNodeName)
	if (el.nodeName.toLowerCase() != 'html') return (el.nodeName.toLowerCase() == tragetNodeName.toLowerCase()) ? el :  findParentElementByNodeName(el.parentNode,tragetNodeName);
}
function getQueryStr() {
	queryStr 		= window.location.search
	queryStr 		= queryStr.replace(/\?/,"");
	return queryStr
}
function parseQueryStr(qs,withoutFullQueryStr) {
	// gibt den Querystring als Object/Assoc Array zurueck
	// enthält als erste Property den kompellten queryString, dann dei einzelene VAriablen
	// Bsp: ?test=nase&pageID=99  -> {querystring:'?test=nase&pageID=99',test:'nase',pageID:99}
 	queryVarObj = {}
	if (window.location.search) {
		if (!qs) {												// nur wenn qs nicht gegeben ist, den queryString des Fensters nehmen
			qs = window.location.search
			qs = qs.replace(/\?/,"");
		}
		qsParts = qs.split("&");
		if (!withoutFullQueryStr) queryVarObj.querystring = qs		// kompletten QS mit ins Object packen?
		for (i=0;i<qsParts.length;i++) {
			varArr = qsParts[i].split("=");
			// alert("varArr[0]" + varArr[0] + "\n" + " varArr[1] " + varArr[1])
			if (varArr[0]) {
				queryVarObj[varArr[0]] = varArr[1]
			}
		}
	}
	return queryVarObj;
}

function showObject(object) {
  var attribute;
  var result = ''
  for (attribute in object) {
    result += (attribute + ': '+ object[attribute]+"\n")
  }
  return result;
}


function getOuterHTML(thisnode) {
	// verschiebt den Inhalt in ein uebergeoardnetes Element, und gibt dessen innerHTML zurueck
	divtemp = document.createElement("div")
	divtemp.appendChild(thisnode.cloneNode(true))
	return divtemp.innerHTML
}
function findNextSibling(el,nodeName) {
	while(el.nextSibling) {
		el = el.nextSibling
		if (el.nodeName.toLowerCase() == nodeName) return el
	}
}
function findPreviousSibling(el,nodeName) {
	while(el.previousSibling) {
		el = el.nextSibling
		if (el.nodeName.toLowerCase() == nodeName) return el
	}
}


// changeQueryPars
function modifyQueryString(qs,useWindwowQs,varNameOrArray,varValue) {
	// alert("modifyQueryString")
	sq = '';
	if (sq) {
		alert(	"modifyQueryString Input: " + "\n" + 
				"qs: " 				+ qs 				+ "\n" + 
				"useWindwowQs: " 	+ useWindwowQs 		+ "\n" + 
				"varNameOrArray: " 	+ varNameOrArray 	+ "\n" + 
				"varValue: " 		+ varValue 			+ "\n" 
		)
	}
	// Bsp: var1=x&var2=y&...
	/*
	+++ Achtung: 	newUrl = modifyQueryString('',1,'',window.queryStr)	geht, 
	aber nicht 		newUrl = modifyQueryString('',1,window.queryStr,'') !			der 4. Parameter kann var=value enthöten, der 3. nur einen varname
	
	
	Input:   	qs: ein Querystring, 
				useWindwowQs: Es wird derQuerystring des Fenster ermittel und als Basis verwendet
				varNameOrArray, varvalue										2 Werte										
				oder Object {varname: 'value', varname2:'none', ...				1 Array/Object Assoc
				varValue: QueryString Teilstring:								&test=nase&test2=gurke
				
	Regeln:		wenn !useWindwowQs && !varNameOrArray				-> return qs
				
	nimmt einen optionalen QueryString und ersetzt dessen Parameter
	Wenn kein Querystring gegeben ist, dann wird der aktuelle QueryString ermittelt (Ausnahme: 'none')
	Werte die 'none' sind, werden entfern
	löscht doppelte und gibt den Querystr oder dei kompßlette url zurueck
	
	varNameOrArray : String oder Object  {varname: 'varvalue', ...}	
	
	Aufrufvarianten:
	// mit qs als queryString der Seite
	// modifyQueryString('',1,'testname','testvalue')							// normal: 			varname, varvalue		
	// modifyQueryString('',1,'&testname','testvalue')							// mit 				&varname
	// modifyQueryString('',1,'','varname=varvalue')							// mit varvalue  	varname=varvalue
	// modifyQueryString('',1,'','&varname=varvalue')							// mit varvalue  	&varname=varvalue
	// modifyQueryString('',1,'','varname=varvalue&nase=test')					// mit varvalue 	varname=varvalue&nase=test
	// modifyQueryString('',1,'','&varname=varvalue&nase=test')					// mit varvalue  	&varname=varvalue&nase=test
	// modifyQueryString('',1,'varname','&varname=varvalue&nase=test')			// gemischt: 		varname +  &varname=varvalue&nase=test
	
	// mit qs als Object
	// modifyQueryString('',1, {varname:'varvalue', nase:'test'},'')								// mit object {varname:'varvalue', nase:'test'}
	// modifyQueryString('',1, {varname:'varvalue', nase:'test'},'&varname=varvalue&nase=test')		// mit object gemsischt {varname:'varvalue', nase:'test'}
	
	// mit qs als Parameter
	// modifyQueryString('?varname=varvaluexxx&nase=testxxx',0,'varname','varvalue')							// mit '?'
	// modifyQueryString('varname=varvaluexxx&nase=testxxx',0,'varname','varvalue')							// ohne '?'
	// modifyQueryString('www.spiegel.de?varname=varvaluexxx&nase=testxxx',0,'varname','varvalue')							// ohne '?'
	// modifyQueryString('www.spiegel.de?varname=varvaluexxx&nase=testxxx',0,{varname:'varvalue', nase:'test'},'varname=varvalue2&nase=test2')							// ohne '?'
	
	
	*/
	//alert("typeof: " + typeof(varNameOrArray))
	var qsOutput 	= ''
	var output 		= ''
	var url 	 	= ''
	
	if (qs.indexOf('?') !=-1) {				// komplette url?   dann splitten in url + querystr
		qsArr = qs.split('?'); 
		url = qsArr[0]; 
		qs = qsArr[1];
		hasQuestionmark = 1;
	}
	// kein qs als Parameter und useWindwowQs?
	if 		( useWindwowQs) qs = getQueryStr()					// +++ Achtung: wenn kein qs gegeben ist, dann aktuellen Query String nehmen, kann mit 'none' explizit ausgeschaltet werden
	else if (!useWindwowQs && !varNameOrArray) return qs;		// qs wird direkt zurueckgegeben
	qs = qs.replace(' ','')
	if (qs == '&' || qs == '?' || qs == '?&' ) qs = ''
	//alert("qs nach getQueryStr: " + qs)
	qsArr2 = qs.split("&");	// Querystr in Array 
	len = qsArr2.length
	qsArrInput 	= {}
	qsArrtemp 	= {}	
	if (sq) {
		alert(	"modifyQueryString Input: " + "\n" + 
				"qs: " 				+ qs 				+ "\n" + 
				"len: " 			+ len 				+ "\n" + 
				"useWindwowQs: " 	+ useWindwowQs 		+ "\n" + 
				"varNameOrArray: " 	+ varNameOrArray 	+ "\n" + 
				"varValue: " 		+ varValue 			+ "\n" 
		)
	}
	// Aus dem Basis-Input qs wird eine Object gebildet
	for (i=0; i<len; i++) {						 		// Array/Object bilden  {varname: 'varvalue', ...}	
		keyValStr = qsArr2[i]
		if (keyValStr) {
			keyValArr = keyValStr.split('=')		
			qsArrInput[keyValArr[0]] = keyValArr[1];
		}
	}
	if(sq) alert(showObject(qsArrInput));
	// Umwandeln: string in Arrays/Oject
	// Aus dem mdyfy Input wird ein 2. Array gebildet
	if (typeof(varNameOrArray) == 'string')	qsArrtemp[varNameOrArray.replace('&','')] = varValue			// normaler string
	else 									qsArrtemp  = varNameOrArray;
	// wenn der varValue ein queryTeilstring ist: &test=1&test2=2...
	// dann wird der varValue geparst
	if (varValue && (varValue.indexOf('=') != -1 || varValue.indexOf('&') != -1)) {
		qsArrtemp = parseQueryStr(varValue,'withoutFullQueryStr')
		// alert("qsArrtemp " + showObject(qsArrtemp));
	} 
	if(sq)  alert(showObject(qsArrtemp));
	// mergen der Arrays/Ojecte
	for (var key in qsArrtemp) {qsArrInput[key] = qsArrtemp[key]} // es werden bestehende key in qsArrInput ersetz oder neu hinzugefuegt
	if(sq) alert(showObject(qsArrInput));
	for (key in qsArrInput) {	
		if (key) {							// +++ Achtung: es kann auch leere keys geben!
			val = qsArrInput[key]
			if (val == 'none') continue;			// werte die 'none' sind werden entfernt"
			// if (val) {qsOutput ? qsOutput += ('&'+ key + '=' + val) : qsOutput += (key + '=' + val)};
			if (val) 	qsOutput ? qsOutput += ('&'+ key + '=' + val) : qsOutput += (key + '=' + val);  	//  Standard: 		"&key=value"
			else 		qsOutput ? qsOutput += ('&'+ key)             : qsOutput += (key);					// leerer Value: 	"&key"
		}
	}
	// alert("hasQuestionmark " + hasQuestionmark)
	if (url || useWindwowQs || hasQuestionmark) {					// es gibt eine Url...
		output = url
		if (qsOutput) output += ('?' + qsOutput)
	} else {
		if (qsOutput) output += '&' + qsOutput; 
	}
	if(sq) alert("output " + output)
	// alert("output " + output)
	return output
}

