// $change: 27.01.2009 18:53:07
function popupOpen() {		// parameter.reihenfolge: URL, WIDTH, HEIGHT
	var w,h,url,aw,ah;
	var a=popupOpen.arguments;
	if (a.length==0) return;
	url=a[0];
	if (a.length>1) {
		w=a[1]; h=a[2];
	}
	else {
		w=665; h=500
	}
	win=window.open(url,'win','toolbar=no,location=no,directories=no,status=no,statusbar=no,menubar=no,scrollbars=1,resizable=yes,copyhistory=no,width='+w+',height='+h);
	if (screen) {
		aw=screen.availWidth;
		ah=screen.availHeight;
		win.moveTo(((aw/2)-(w/2)),((ah/2)-(h/2)));
	}
	win.focus();
}
function popupOpen2() {		// parameter.reihenfolge: URL, WIDTH, HEIGHT
	var w,h,url,aw,ah;
	var a=popupOpen2.arguments;
	if (a.length==0) return;
	url=a[0];
	if (a.length>1) {
		w=a[1]; h=a[2];
	}
	else {
		w=665; h=500
	}
	win2=window.open(url,'win2','toolbar=no,location=no,directories=no,status=no,statusbar=no,menubar=no,scrollbars=1,resizable=yes,copyhistory=no,width='+w+',height='+h);
	if (screen) {
		aw=screen.availWidth;
		ah=screen.availHeight;
		win2.moveTo(((aw/2)-(w/2)),((ah/2)-(h/2)));
	}
	win2.focus();
}

function openPicture() {		// parameter.reihenfolge: URL, WIDTH, HEIGHT -- wrapper um im Frontend die gleiche methode verwenden zu können
	var w,h,url,aw,ah;
	var a=openPicture.arguments;
	if (a.length==0) return;
	url=a[0];
	if (a.length>1) {
		w=a[1]; h=a[2];
	}
	else {
		w=665; h=500
	}
	popupOpen2(url,w,h);
}

function reloadParent(){	/// wenn reloadParent(true) aufgerufen wird, wird das Fenster anschließend geschlossen
	if (window.opener && !window.opener.closed) {
		var url=window.opener.location.href;
		window.opener.location.href=url;
//		window.opener.location.reload();
	}
	if (reloadParent.arguments.length>0) {
		if (reloadParent.arguments[0]==true) {
			window.close();
		}
	}
}

function updateParent(url){
	window.opener.location.href=url;
	//window.close();
}

function updateOpener(){
	window.opener.location.href=window.opener.reload_url;
	//window.close();
}

function closeWindow() {
	if (window.opener) {
		window.close();
	}
	else {
		parent.editFrame_open=false;
		parent.hideLoading();
		parent.$('ovl_space').innerHTML="&nbsp;";
	}
}

var old_bar="";
var ht_id=false;
var ignore_element=false;

function show_icons(el_id) {
	var token="toolbar_"+el_id;
	if (token!=old_bar) {
		stop_hide();
		exec_hide();
	}
	else stop_hide();
	
	Try.these(function(){
		$(token).show();
		$(token).setStyle({'z-index': 500});
	});
	
	old_bar=token;
}

function stop_hide() {
	if (ht_id) {
		clearTimeout(ht_id);
	}
}

function exec_hide() {
	if (old_bar) {
		Try.these(function() {
			$(old_bar).hide();
			$(token).setStyle({'z-index': 2});
		});
	}
}

function hide_icons(el_id) {
	if (el_id == ignore_element) {
		ignore_element=false;
	}
	else ht_id=setTimeout("exec_hide()",200);
}

function ignore_hide(el_id) {
	ignore_element=el_id;
}

var tracedepth=0;
var max_trace_depth=1;

function debug(msg) {
	if (debug.arguments.length==2) {
		msg="<textarea rows=10 cols=20 style='width:600px;height:360px'>"+msg.escapeHTML()+"</textarea>";
	}
	try {
		//throw new Exception();
		if (typeof w == "undefined" || w.closed) {
			w=window.open('','w','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,copyhistory=no,width=640,height=400');
			w.moveTo(screen.availWidth-640, 0);
		}
		w.document.write(msg+"<br>");
	}
	catch (e) {
		try{ $('debug_container').innerHTML += msg+"<br>"; }
		catch(e) {
			var div=document.createElement('div');
			div.id='debug_container';
			div.innerHTML=msg+'<br />';
			document.body.appendChild(div);
		}
	}
}

function trace(o) {
	var out="";
	var nofunctions = (trace.arguments.length>1 && trace.arguments[1]);
	var do_return  = (trace.arguments.length>2 && trace.arguments[2]);
	
	try {
		for (z in o) {
			try {
				if (o[z]!="" && o[z]!=null)
					if (z=="innerHTML" || z=="outerHTML") out+=z+" = [..HTML-Code..]; <br>\n";
					if (typeof o[z] == "function" && nofunctions) {
						//out += z+": [..Function..]<br>\n";
						continue;
					}
					if (typeof o[z] == "object") {
						out += z+" : {<div style='margin-left: 20px'>";
						if (++tracedepth>max_trace_depth || z.indexOf('parent')!=-1 || z.indexOf('own')!=-1) out += " [ object ] ";
						else out += trace(o[z], nofunctions, true);
						tracedepth--;
						out += "</div>}<br>";
					}
					else out+=z+" = "+o[z]+"; <br>";
			}
			catch(e) {
				out+="<i>Fehler in "+z+": "+e+"</i><br />\n";
			}
		}
	}
	catch(ee) {
		out+="<b>Fatal Error in tracing: "+ee+"</b>";
	}
	if (do_return) return out;
	else debug(out)
}
function traceAttrib(o, attrib) {
	var out="";
	//var nofunctions = (trace.arguments.length>1 && trace.arguments[1]);
	var do_return  = (traceAttrib.arguments.length>2 && traceAttrib.arguments[2]);
	
	try {
		for (z in o) {
			try {
				if (o[z]!="" && o[z]!=null)
					if (z.toLowerCase()==attrib.toLowerCase()) {
						out+=z+" = "+o[z]+"; <br>";
					}
					if (typeof o[z] == "object") {
						out += z+" : {<div style='margin-left: 20px'>";
						if (++tracedepth>max_trace_depth || z.indexOf('parent')!=-1 || z.indexOf('own')!=-1) out += " [ object ] ";
						else out += traceAttrib(o[z], attrib, true);
						tracedepth--;
						out += "</div>}<br>";
					}
					
			}
			catch(e) {
				out+="<i>Fehler in "+z+": "+e+"</i><br />\n";
			}
		}
	}
	catch(ee) {
		out+="<b>Fatal Error in tracing: "+ee+"</b>";
	}
	if (do_return) return out;
	else debug(out)
}

function getBrowser() {
	if (!window.RegExp) return false;
	var ret={ name:'', version: 0 };
	var AGENTS = ["opera","msie","safari","firefox","netscape","mozilla"];
	var agent = navigator.userAgent.toLowerCase();
	for (var i = 0; i < AGENTS.length; i++) {
		var agentStr = AGENTS[i];
		if (agent.indexOf(agentStr) != -1) {
			var versionExpr = new RegExp(agentStr + "[ \/]?([0-9]+(\.[0-9]+)?)");
			var version = 0;
			if (versionExpr.exec(agent) != null) {
				ret.version = parseFloat(RegExp.$1);
				ret.name=agentStr;
				return ret;
			}
		}
	}
	return ret;
}
/*
Array.prototype.insert=function(value, index) {
	var tmp=this.slice(0,index);
	if (typeof value == "object") {
		do {
			tmp.push(value.shift());
		}
		while(value.length>0);
	}
	else {
		tmp.push(value);
	}
	return tmp.concat(this.slice(index));
}
*/

/* Prototype-Style Extension */

Object.extend(Array.prototype, {
	insert: function(value, index) {
		var tmp=this.slice(0,index);
		if (typeof value == "object") {
			do {
				tmp.push(value.shift());
			}
			while(value.length>0);
		}
		else {
			tmp.push(value);
		}
		return tmp.concat(this.slice(index));
	}
});

//////////////////////// PASTE-HACK ///////////////////////////////////////////
setTimeout("setPasteEvents()",300);

function setPasteEvents() {

	var body = document.body;
	var hack_bp=function () {
		_BeforePaste(window);
	};
	try {
		body.onbeforepaste = hack_bp;
	} catch(e) {
		setTimeout("setPasteEvents()",300);
	}
}

function _BeforePaste(win) {
	win.event.returnValue = false;

	var data=window.clipboardData.getData("Text")	
	window.clipboardData.setData("Text",data);
}

///////////////////////////////////////////////////////////////////////////////
// AdhocCo 3
// benötigt prototype-Framework

// generelle Fehlerbehandlung in Ajax-Dingen 
Ajax.Responders.register({
	onException: function(data, ex){
		hideLoading();
		busy=false;
		if (typeof ex.number != "undefined" && ex.number == -2147418094) return; // IE
		else if (typeof ex.result != "undefined" && ex.result == 2147746065) return; //Gecko
		else {
			debug('<strong>Eine Ausnahme ist aufgetreten:</strong>');
			trace(ex);
		} 
	},
	onFailure: function(){ alert('Something went wrong...'); hideLoading(); busy=false;}
});

function toPostString(data) {
	var out='';
	for (var z in data) {
		if (typeof data[z] == 'string') {
			out += '&'+z+'='+escape(data[z]);
		}
		else if (typeof data[z] == 'number') {
			out += '&'+z+'='+data[z];
		}
	}
	return out.substr(1);
}

function getURLParameter(url) {
	var paras=new Array();
	var value;
	url=unescape(url);
	if (url.indexOf('?')==-1) {
		var para_string=url.substr(Math.max(Math.max(url.indexOf(".php")+5, url.indexOf(".php5")+6), url.indexOf(".php5")+6));
		var var_names= para_string.indexOf('node_id') != -1;
		var para_array=para_string.split("/");
		var arr_var_names=new Array('node_id','lang_id','scope','element_id','cmd','subcmd','type','index','child');
		for (var z=0; z<para_array.length; z++) {
			if (var_names) {
				var zz= Number(z)+1;
				paras[ para_array[z] ] = para_array[zz].indexOf(';') ? unescape(para_array[zz].substr(para_array[zz].indexOf(';')+1)) : unescape(para_array[zz]);
				z++;
			}
			else {
				paras[ arr_var_names[z] ] = para_array[z].indexOf(';') ? unescape(para_array[z].substr(para_array[z].indexOf(';')+1)) : unescape(para_array[z]);
			}
		}
	}
	else {
		var para_string=url.substr(url.indexOf("?")+1);
		var para_array=para_string.split("&");
		for (var z=0; z<para_array.length; z++) {
			value=unescape(para_array[z].substr(para_array[z].indexOf("=")+1));
			paras[para_array[z].substr(0,para_array[z].indexOf("="))] = value.indexOf(';') != -1 ? value.substr(value.indexOf(';')+1) : value;
		}
	}
	return paras;
}

/////////////////////////////////////////
///////////  Ajax-Tools  ///////////////
///////////////////////////////////////

var cur_element_id=0;
var elements=new Array();
var busy=false;

function updateElement(element_id) {
	if (updateElement.arguments.length>1) {
		var paras=updateElement.arguments[1];
		if (typeof paras == 'object') {
			paras['element_id']=element_id;
			paras['using_xml_object']=1;
			paras['type']=Type;
			var my_paras = toPostString(paras);
		}
		else var my_paras = paras + "&type="+Type+"&element_id="+element_id+"&using_xml_object=1";
	}
	else {
		var my_paras=ajax_update_paras+"&type="+Type+"&element_id="+element_id+"&using_xml_object=1";
	}
	cur_element_id=element_id;
	showLoading('lade '+(elements.length+1)+' Element'+(elements.length>0 ? 'e':''));
	
	//debug("update Element "+element_id);
	//debug(base_url+index_php+'?'+my_paras);
	//debug(Type);
	new Ajax.Request(base_url+index_php, {
		method:'post',
		parameters: my_paras,
		onSuccess: function(data) {
			//debug(data.responseText, true);
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			// ist es ein Container ?:
			// dann nur die Icons des Openers und Closers erneuern
			if ( Try.these(function(){ return $('Element_'+cur_element_id).down().next('.el_cont');})) {
				
				var icons_html=getTextContent( data.responseText, "toolbar_"+cur_element_id);
				$('toolbar_'+cur_element_id).update( icons_html );
				
				var closer_obj = Try.these(
										function() {
											var sib=$('Element_'+cur_element_id).down().nextSiblings();
											return sib.detect(function(n){ return n.hasClassName('elementkopf');});
										},
										function() { 
												var el=$('Element_'+cur_element_id).down().next('.elementkopf',1);
												if (el.length) return el;
												else throw false;
										},
										function() { return $('Element_'+cur_element_id).down().next('.elementkopf'); } );

				if (closer_obj) {
					var closer_id=closer_obj.readAttribute('id');
					closer_obj.update( getTextContent( data.responseText, closer_id) );
				}
				
			}
			else {
				Try.these(function() {$('Element_'+cur_element_id).update( getTextContent(data.responseText,'Element_'+cur_element_id));},
							function() { debug("Element_"+cur_element_id+" nicht gefunden.");})
			}
			
			//SWdebug("Element "+cur_element_id+":");
			//debug(data.responseText, true);
			
			if (elements.length) {
				updateElement( elements.shift());
			}
			else {
				busy=false;
				hideLoading();
				initSort();
			}
			
		}
		/* onComplete: function(data) {
			debug(data.responseText, true);
		}, */
	});
}

// wird von update_opener.tpl aufgerufen

function removeContainerFrame(top_id) {
	var out=new Array();
	
	var html=document.body.innerHTML;
	var el_id = top_id.sub("Element_",'');
	
	var _s=html.indexOf('cont_'+el_id+'_');
	var _h=html.substr(_s-1, 1, 1);
	var lookup_id = html.substr( _s, html.indexOf(_h, _s+2)-_s);
	var child=$(lookup_id).down(1);
	//var child=$(top_id).down().next('.el_cont').down(1);
	var id, z=0;
	
	do {
		Try.these( function() {
			if (child.readAttribute('class').indexOf("adelementback")==-1 && child.readAttribute('class').indexOf("el_kombi") == -1) {
				return;
			}
			id=child.readAttribute('id');
			if (z==0) out[0]=id;
			new Insertion.Before(top_id, recreateElement(id, child));
		});
		z++;
	}
	while (child=child.next('div'));
	
	if (z>1) {
		out[1]=id;
	}
	$(top_id).remove();
	
	return out;
}

function recreateElement(id, n_el) {
	var new_element="<div id='"+id+"'";
	if (n_el.readAttribute('class')) new_element+=" class='"+n_el.readAttribute('class')+"'";
	if (n_el.readAttribute('style')) new_element+=" style='"+n_el.readAttribute('style')+"'";
	if (n_el.readAttribute('onmouseover')) new_element+=" onmouseover='"+n_el.readAttribute('onmouseover')+"'";
	if (n_el.readAttribute('onmouseout')) new_element+=" onmouseout='"+n_el.readAttribute('onmouseout')+"'";
	new_element+=">"+n_el.innerHTML+"</div>";
	return new_element;
}

function changeVisibilty(element, link_obj, type) {
	if (busy) return;
	busy=true;
	Type = type;
	
	elements=new Array();
	visibility= Number(link_obj.rel);
	var element_id="Element_"+element;
	
	var update_paras = getURLParameter( '?' + ajax_update_paras );
	update_paras['subcmd']='visibility';
	
	updateElement(element, update_paras);
	
	// Container-visibilty?
	var new_vis= visibility==1 ? 0 : 1;
	if (arguments.length>2 && arguments[2]) {
		var sublinks=$$('#'+element_id+' a[rel="'+visibility+'"]');
		var subcontent=$$('#'+element_id+' div.adshowelement');
		if (visibility) {
			sublinks.each(function(n) {
				n.down().src=n.down().src.replace('visible_yes.gif', 'visible_no.gif');
				n.rel=new_vis;
				n.down().alt=n.down().title=n.down().title.replace(' sichtbar', ' unsichtbar');
			});
			subcontent.each(function(n) {
				n.setStyle({opacity: 0.25, filter: 'alpha(opacity=25)', width:'100%'});
			});
		}
		else {
			sublinks.each(function(n) {
				n.down().src=n.down().src.replace('visible_no.gif', 'visible_yes.gif');
				n.down().alt=n.down().title=n.down().title.replace(' unsichtbar', ' sichtbar');
				n.rel=new_vis;
			});
			subcontent.each(function(n) {
				n.setStyle({opacity:1, filter: 'alpha(opacity=100)', width: '100%'});
			});
		}		
	}
		
	showPEpublish();
}
function duplicateElement(element, type) {
	if (busy) return;
	busy=true;
	Type=type;
	
	var element_id="Element_"+element;
	cur_element_id=element;
	
	var update_paras = getURLParameter( '?' + ajax_update_paras );
	update_paras['subcmd']='duplicate';
	update_paras['using_xml_object']=1;
	update_paras['element_id']=element;
	update_paras['type']=type;
	
	var my_paras=toPostString(update_paras);
		
	new Ajax.Request(base_url+index_php, {
		method:'post',
		parameters: my_paras,
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			var str=data.responseText;
			str=str.substring(str.indexOf('<body>')+6, str.lastIndexOf('</body>'));
			//debug(str, true);
			new Insertion.After('Element_'+cur_element_id, str);
			updateElement(cur_element_id);
		}
	});
	showLoading('dupliziere Element');
	showPEpublish();
}

function addElement(form_id, kac_id, kombi_flag) {
	if (busy) return;
	busy=true;
	
	$(form_id).request({
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			var _d=data.responseText;
			//debug(_d, true);
			var html=_d.substring(_d.indexOf('<body>')+6, _d.indexOf('</body>'));
			
			var el_id_beyond=false;
			var type=$(form_id).type.value;
			/*
			if ((type == 'footer' || type=='range') && !kombi_flag) {
				var cur_element, z=0;
				var target_div='a_'+type+'_back';
				new Insertion.Bottom(target_div , html);
			}
			else if (type=='dataset' && !kombi_flag) {
				new Insertion.Before('addElementDiv'+kac_id, html);
			}
			else {
			*/
				new Insertion.Before('addElementDiv'+kac_id, html);
				//new Insertion.Before('add_element_space_'+kac_id, html);
				//debug(html, true);
			//}
			// select-box zurückstellen
			$(form_id)['type_id'].options[$(form_id)['type_id'].selectedIndex].selected=false;
			$(form_id)['type_id'].options[0].selected=true;
			
			// mal an mal aus.. warum nur? .. manchmal werden sonst Skripte doppelt ausgeführt
			html.evalScripts();
			//debug("SubContainments nach Hinzufügen:");
			//trace(sub_containments, true);
			initSort();
			onSortUpdate();
			//hideLoading();
			busy=false;
			
		}
	});
	
	showLoading('lade neues Element');
	showPEpublish();
}

function sendSimpleForm(form_id, hide_div, show_div) {
	if (busy) return;
	busy=true;
	$(form_id).request({
		parameters: {suppress_output: '1'},
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			$(hide_div).hide();
			$(show_div).show();
			hideLoading();
			busy=false;
		}
	});
	showLoading('speichern');
	showPEpublish();
}

function sendButtonSwitch(paras, success_callback) {
	if (busy) return;
	busy=true;
	var return_body = (sendButtonSwitch.arguments.length==3 && sendButtonSwitch.arguments[2]);
	if (!return_body) paras+="&suppress_output=1";
	
	new Ajax.Request(base_url+index_php, {
		method:'post',
		parameters: paras,
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			hideLoading();
			if (return_body) {
				var str=data.responseText;
				str=str.substring(str.indexOf('<body>')+6, str.lastIndexOf('</body>'));
				success_callback.call(null, str);
			}
			else 	success_callback.call(null);
			busy=false;
		}
	}
	);
	
	showLoading('speichern');
	if (arguments.length<=2 || arguments[2]==false) {
		showPEpublish();
	}
} 

////////////////////////////////////////////
var selChr = "+";
		
function multiSelect(obj, sel_index, save){
	var dropdown = $(obj);
	if (sel_index==0) return false;
	var final_value=[];
	
	if (typeof save == 'undefined') save=true;
	
	var t=dropdown.options[sel_index].text;
	dropdown.options[sel_index].text=  t.substr(0,1)==selChr ? t.substr(1) : selChr+t;
	
	for (i = 0; i < dropdown.options.length; i++) {
		if (dropdown.options[i].value != '') {
			var item=$(dropdown.options[i]);
			if (item.text.substr(0,1) == selChr){
				final_value.push(item.value);
				item.setStyle({backgroundColor: "#93E154", color:"#000000"});
			}
			else {
				item.setStyle({backgroundColor: "#92A9BA", color:"#262E34"});
			}
		}
	}
	dropdown.form.getInputs().find(function(e){ return e.name==dropdown.name && e.type=='hidden';}).value=final_value.join(',');
	//dropdown.options[0].selected=true;
	
	if (!save) return;
	// speichern und neu laden
	
	var my_element_id = $F($(dropdown.form)['element_id']);
	$(dropdown.form).request({
		parameters: {using_xml_object: '1'},
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			Try.these(function() {$('Element_'+my_element_id).update( getTextContent(data.responseText,'Element_'+my_element_id));},
							function() { debug("Element_"+my_element_id+" nicht gefunden.");})
			hideLoading();
			busy=false;
		}
	});
	showLoading('speichern');
	showPEpublish();
}

/////////////////////////////////////
///////    Page Lock    /////////////
/////////////////////////////////////
 
// schaltet die Edit-Funktionen des PageEditors aus indem über die entsprechenden Editbereiche ein Layer gelegt wird
function lockPage() {
	var ovl_elements=['ad_content_edit','show_layout_edit','footer_edit','management_tools'];
	var z=20;
	if (getBrowser().name=='msie') {
		var wsub=2, hsub=12;
	}
	else {
		var wsub=5, hsub=16;
	}
	ovl_elements.each( function(item){
		var ove_id="lock_"+$(item).id;
		var ove="<div id='"+ove_id+"' class='ad_disable_overlay' style='";
		ove+="width:"+($(item).getWidth()-wsub)+"px; ";
		ove+="height:"+($(item).up().getHeight()-hsub)+"px; ";
		ove+="z-index:"+z+";'";
		ove+="></div>";
		new Insertion.Bottom($(item).id, ove);
		$(item).makePositioned();
		z++;
	});
}
pageLock={};

function refreshPageLock(node_id, lang_id) {
	// setzt den PageLock alle 28 Sekunden
	new PeriodicalExecuter(function(pe){
		new Ajax.Request(base_url+index_php, {
			method: 'post',
			parameters: {node_id: node_id, lang_id: lang_id, source: 'pagelock'},
			onSuccess: function(data) {
				eval(data.responseText);
				if (typeof pageLock.error != 'undefined') {
					alert(pageLock.error);
					pe.stop();
				}
				if (pageLock.currentLockState) {
					page_locked=true;
					lockPage();
					alert("Ein anderer Benutzer hat die Editierrechte für diese Seite bekommen.");
					checkPageLock(node_id, lang_id);
				}
			},
			onException: function(data, ex) {
				pe.stop();
			}
		});
	},28);
}
function checkPageLock(node_id, lang_id) {
	// überprüft alle 30 Sekunden, ob der PageLock eines andern noch besteht
	new PeriodicalExecuter(function(pe){
		new Ajax.Request(base_url+index_php, {
			method: 'post',
			parameters: {node_id: node_id, lang_id: lang_id, source: 'pagelock'},
			onSuccess: function(data) {
				eval(data.responseText);
				if (typeof pageLock.error != 'undefined') {
					alert(pageLock.error);
				}
				if (pageLock.currentLockState==0) {
					page_locked=false;
					pe.stop();
					alert("Der bisherige Editor hat die Seite verlassen. Die Seite wird jetzt neu geladen.");
					location.href=reload_url;
				}
			},
			onException: function(data, ex) {
				pe.stop();
			}
		});
	},30);
	
}

////////////////////////////////////////////////////////
////////////   Drag'n'Drop Sortierung   ///////////////
// benötigt dragdrop und effects von script.aculo.us//
/////////////////////////////////////////////////////

var last_update = new Date();
var arr_sortables = [];
var sub_containments = [];
var ignore_update = false;

// Erweiterung, deaktiviert alle Elemente mit pre="fixed" aus den 
// Draggables und Droppables ... für Datensätze gedacht...

Sortable.destroyUndraggables = function(element) {
	var s = Sortable.options(element);
	if(s) {
		var count=s.length;
		var z=0;
		var acii=null;
		s.droppables.each(function(d, i){
			Try.these(function(){
				if (d.id=="ad_content_edit") acii = i;
				if (d.readAttribute("pre") == "fixed") { 
					Droppables.remove(d);
					Draggables.unregister( s.draggables[i] );
					z++;
				}
			});
		});
		if (z>0 && acii != null) {
			Droppables.remove( s.droppables[acii] );
		}
		if (count == z) {
			s.draggables.invoke('destroy');
			Draggables.removeObserver(s.element);
			delete Sortable.sortables[s.element.id];
		}
	}
}


function initSort() {
	if (arr_sortables.length>0) {
		arr_sortables.each( function(sortable) {
			if ($(sortable) == null) return;
			Sortable.destroy(sortable);
		});
	}
	arr_sortables=[];

	sub_containments.each( function(sub_cont) {
		createSortable( sub_cont );
	});
	if (typeof main_containment=="undefined") return;
	
	createSortable( main_containment );
	arr_sortables = arr_sortables.uniq();
}

function createSortable( containments ) {
	containments.each( function(containment, i) {
		if ($(containment) == null) return;
		try {
			Sortable.create(containment, {
				tag: "div",
				only: $w("adelementback el_kombi adadd_element"),
				containment: containments,
				handle: "adelement_move_handler",
				dropOnEmpty: true,
				markDropZone:true,
				scroll: window,
				onUpdate: onSortUpdate,
				onChange: onSortChange
			});
			Sortable.destroyUndraggables(containment);
		} 
		catch(e) {
			debug(containment+" "+e);
		}
		arr_sortables.push(containment);
	});
}

/* 
	onSortChange, wird ständig während des Drag-Vorgangs aufgerufen
	und prüft, ob das Element dort abgelegt werden darf 
	
	CHECK: vielleicht muss der cache am Ende des dragens geleert werden.
*/
var topElements = $w("ad_content_ col_ DSLCont_ cont_");
var el_widths_cache= [];
var top_widths_cache= [];
var add_cont_ids_cache = [];

function onSortChange(element, dropon) {
	var el_width, top_width, result;
	if (typeof el_widths_cache[ element.id ] == "undefined") {
		el_width = getAdElementWidth(element);
		el_widths_cache[ element.id ] = el_width;
	}
	else {
		el_width = el_widths_cache[ element.id ];
	}
	
	//$("dbg_el_width").value=el_width;
	// Spezialbehandlung für Element-hinzufügen
	if (element.id.indexOf("addElementDiv")===0) {
		// verhindern, daß nach dem Loslassen des [+] die Sortierung gespeichert wird
		ignore_update = true;
		if (typeof add_cont_ids_cache[element.id] == "undefined") {
			var a_cont_id = element.classNames().detect(function(cn){ return cn.indexOf("_IN")==0;}).substr(3);
			add_cont_ids_cache[ element.id ] = a_cont_id;
		}
		else var a_cont_id = add_cont_ids_cache[ element.id ];
		
		var top_element = dropon;
		var z=0;
		var top_elements=["ad_content_", "col_","DSLCont_"];
		while ( z++ < 20 && !top_elements.find( function(te) { return top_element.id.indexOf(te)===0; } ) ) {
			top_element = Try.these( 
				function() { return top_element.up();},
				function() { z = 21; return false; }
			);
		}
		//$("dbg_cont_width").value = top_element.id;
		//$("dbg_el_width").value = a_cont_id;
		return (!top_element || top_element.id != a_cont_id) ? false : true;
	}
	
	if (typeof top_widths_cache[ dropon.id ] == "undefined") {
		var top_element = dropon;
		var z=0;
		while ( z++ < 20 && !topElements.find( function(te) { return top_element.id.startsWith(te); } ) ) {
			top_element = Try.these( 
				function() { return top_element.up();},
				function() { z = 21; return false; }
			);
		}
		if (!top_element || top_element.id == "ad_content_edit") {
			top_width = 0;
		}
		top_width = getAdElementWidth( top_element );
		top_widths_cache[ dropon.id ] = top_width;
	}
	else {
		top_width = top_widths_cache[dropon.id];
	}
	//$("dbg_cont_width").value = top_width;
	if (!top_width) 
		result = true;
	else if (el_width>top_width) 
		result = false;
	else	
		result = true;
	
	//$("dbg_result").value = result;
	return result;	
}

function getAdElementWidth(element) {
	/** sucht die definierte Breite des verschobenen Elements */
	var w = element.classNames().detect(function(cn){ return cn.indexOf("_w")==0;});
	
	w = Try.these(
		function() { return parseInt(w.substr(2));},
		function() { return 0;}
	);
	return isNaN( w ) ? 0 : w;
}

function disableFatOptions(element) {
	var top_element = $(element);
	var z=0;
	while ( z++ < 20 && !topElements.find( function(te) { return top_element.id.startsWith(te); } ) ) {
		top_element = Try.these( 
			function() { return top_element.up();},
			function() { z = 21; return false; }
		);
	}
	if (!top_element || top_element.id == "ad_content_edit") {
		max_width = Number.MAX_VALUE;
	}
	max_width = getAdElementWidth( top_element );
	max_width = max_width==0 ? Number.MAX_VALUE : max_width;
	
	$(element).descendants().each(function(e, i){
		if (e.tagName!='OPTION') return;
		if (i==0) return;
		if (getAdElementWidth(e) > max_width) {
			Form.Element.disable( e );
		}
		else {
			Form.Element.enable( e );
		}
	});
}

/* 
	sendet die Speicheranfrage an den Server,
	wird beim beenden des Dragvorgangs aufgerufen
*/
function onSortUpdate() {
	/**
	 da pro Containment ein Aufruf erfolgen kann 
	 gibt es eine Mindestwartezeit von 1000 ms
	*/
	var this_update = new Date();
	if ((this_update - last_update) < 1000 || ignore_update) {
		last_update = this_update;
		ignore_update = false;
		return;
	}
	
	last_update = this_update;
	
	var serials = [];
	arr_sortables.each( function( sortable ){
		serials.push( Sortable.serialize( sortable ) );
	} );
	
	
	var update_paras = getURLParameter( '?' + ajax_update_paras );
	update_paras['source']='page';
	update_paras['using_xml_object']=1;
	update_paras['cmd']="setSort";
	update_paras['type']=Type;
	update_paras["suppress_output"]=1;
	
	
	var my_paras=toPostString(update_paras);
	my_paras += "&"+serials.join("&");
	
	new Ajax.Request(base_url+index_php, {
		method: 'post',
		parameters: my_paras, 
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			showPEpublish();
			if (elements.length) {
				updateElement( elements.shift() );
			}
			else {
				hideLoading();
			}
		}
	});
	showLoading("speichern..");
	
	//serials.each(function(p){ trace(p.toQueryParams());} );
}

var UpdateOnDrop = Class.create();
UpdateOnDrop.prototype = {
	idRegExp: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
	initialize: function(element) {	},
	onEnd: function(a, b) {
		var match = b.element.id.match( this.idRegExp );
		var element_id = match ? match[1] : null;
		if (element_id) {
			elements.push(element_id);
			elements = elements.uniq();
		}
	}
}

/////////////////////////////////////////////
/////////  Node-Editor Funktionen  /////////
///////////////////////////////////////////
function editNodeName(element, name, paras) {
	var out="<form class='adform' action='"+base_url+index_php+"' method='post' id='"+element+"_rn_form' onSubmit=\"saveNodeName('"+element+"_rn_form','"+element+"');return false;\">";
	out+="<div id='adpara' class='adadd'><div id='adpara' class='adadd'>";
	$H(paras).each(function(p){
		out+="<input type='hidden' name='"+p.key+"' value='"+p.value+"'>";
	});
	out+="<input type='text' name='edit_name' class='adedit_eintrag' value=\""+name+"\">";
	out+="<a href=\"javascript:void('save_rename')\" class='ad' onclick=\"saveNodeName('"+element+"_rn_form','"+element+"')\" >";
	out+="<img src='"+base_url+"pix/save.gif' width='20' height='20' border='0' alt='Speichern' title='Speichern' hspace='0' vspace='0' align='left' class='adimg'>";
	out+="</a></div></form>";
	$(element).update(out);
}

function saveNodeName(form_id, node_div) {
	showLoading('speichern');
	
	$(form_id).request({
		parameters: {single_node: '1', using_xml_object: '1'},
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			var str=data.responseText;
			str=str.substring(str.indexOf('<body>')+6, str.lastIndexOf('</body>'));
			$(node_div).update(str);
			hideLoading();
		}
	});
}
//		 updateNode(node_id [, zusätzliche Variablen zum Versenden als Hash] )
function updateNode(node_id) {
	showLoading('laden');
	var paras=$H(basic_paras);
	if (arguments.length>1 && typeof arguments[1] =='object') {
		paras.merge( $H(arguments[1]) );
	}
	if (typeof node_id=='number') {
		node_id=[node_id];
	}
	var cur_node_id=node_id.shift();
	paras.merge({single_node: '1', using_xml_object:'1', node_id: cur_node_id});
	new Ajax.Request(base_url+index_php, {
		parameters: paras,
		method: 'post',
		onSuccess: function(data) {
			var alert_msg = Try.these(function(){ return getTextContent(data.responseText,'adalert');});
			if (alert_msg) {
				debug(alert_msg);
			}
			var str=data.responseText;
			str=str.substring(str.indexOf('<body>')+6, str.lastIndexOf('</body>'));
			$('node_'+cur_node_id).update(str);
			if (node_id.length) {
				updateNode(node_id);	
			}
			else {
				hideLoading();
			}
		}
	});
}
////////////////////////////////////////////
/////////////  Edit-Layer ////////////////

var editFrame_open=false;

function openEdit(url) {
	var width, height;
	if (openEdit.arguments.length==3) {
		width=openEdit.arguments[1];
		height=openEdit.arguments[2]
	}
	else {
		width=665;
		height=400;
	}
	showLoading("laden..");
	$("ovl_div").hide();
	$('Busy_Decker').show();
	var iframe=Element.extend(document.createElement("IFRAME"));
	iframe.id="OvlEditFrame";
	iframe.width = width;
	iframe.height = height;
	iframe.frameBorder=0;
	iframe.scrolling="no";
	iframe.src=url;
	Event.observe(iframe, "load", function(ev){
		editFrame_open = true;
		$("ovl_div").show();
		$('loading').hide();
		$('inloading').hide();
		var iHeight=Position.getScrollHeight( iframe.contentWindow.document );
		if (iHeight>height) {
			iframe.height=iHeight+10;
		}
		// Schließen-Button
		var cb=Element.extend(document.createElement("A"));
		
		cb.setStyle({
			backgroundImage: "url("+base_url+"pix/edit_close.gif)",
			backgroundRepeat: "no-repeat",
			width:"12px", height:"12px", overflow:"hidden",
			position:"absolute", top: "12px", left:"625px"
		});
		cb.href="javascript:void(0)";
		
		iframe.contentWindow.document.body.appendChild(cb);
		Event.observe(cb, "mouseover", function(ev) {
			Event.element(ev).style.backgroundPosition="0px -36px";
		});
		Event.observe(cb, "mouseout", function(ev) {
			Event.element(ev).style.backgroundPosition="0px 0px";
		});
		Event.observe(cb, "click", closeWindow);
		
		/// Escape-Key
		Event.observe(iframe.contentWindow.document, "keydown", function(ev) {
			if (ev.keyCode == 27) {
				var success=Try.these( function() {
						parent.editFrame_open=false;
						parent.hideLoading();
						parent.$('ovl_space').innerHTML="&nbsp;";
						return true;
					}, 
					function() {return false;}
				);
				if (success) {
					Event.stop(ev);
				}
			}
		});
	});
	$("ovl_space").appendChild(iframe);	
	//trace(iframe,true);
}

function resizeDocument() {
	var c_height=Position.getScrollHeight();
	var if_height=Position.getWindowHeight();
	//debug(c_height+" <> "+if_height);
	if (c_height > if_height) {
		if(typeof this.frameElement != "undefined") {
			if (c_height > top.innerHeight-10) {
				this.frameElement.scrolling="yes";
				c_height=top.innerHeight-10;
			}
			this.frameElement.height=c_height+10;
		}
		else {
			var rb=c_height-if_height;
			window.resizeBy(0, c_height-if_height);
			window.moveBy(0,Math.round(-rb/2));
		}
	}
}

Object.extend(Position, {
	getWindowWidth:function(){
		var doc= arguments.length>0 ? arguments[0] : document;
		if(!Prototype.BrowserFeatures.XPath && Prototype.Browser.WebKit ){
			return doc.innerWidth;
		}
		if(Prototype.Browser.Opera){
			return doc.body.clientWidth;
		}
		//return doc.documentElement.clientWidth;
		return doc.documentElement.offsetWidth;
	},
	getWindowHeight:function(){
		var doc= arguments.length>0 ? arguments[0] : document;
		if(!Prototype.BrowserFeatures.XPath && Prototype.Browser.WebKit){
			return doc.innerHeight;
		}
		if(Prototype.Browser.Opera){
			return doc.body.clientHeight;
		}
		return doc.body.parentNode.clientHeight
	},
	getScrollTop:function() {
		return this.pageYOffset||document.documentElement.scrollTop;
	},
	getScrollHeight:function() {
		var doc= arguments.length>0 ? arguments[0] : document;
		return doc.body.parentNode.scrollHeight;
	}
});

////////////////////////////////////////////

function mother() {
	return $((typeof this.frameElement != "undefined") ? this.parent : ((window.opener && !window.opener.closed) ? window.opener : this));
}

function showPEpublish() {
	mother().$('_PE_publish').show();
	Try.these(function(){ mother().$('_PE_Newsletter').show();});
}

function showLoading(msg) {
	$('loading').show();
	$('inloading').show();
	$('Busy_Decker').show();
	$('status_message').update(msg);
	try {
		$("ovl_div").hide();
	} catch(e) {}
}

function hideLoading() {
	if (editFrame_open==false) {
		$('loading').hide();
		$('inloading').hide();
		$('Busy_Decker').hide();
	}
}
