// -*- coding: utf-8 -*-

var referrerQuery = encodeURIComponent(window.location.pathname+window.location.search);
var referrerUrl = encodeURI(window.location.pathname+window.location.search);
var treeTimout;
var toggleScreenWidth=1100; /* at what size should the tree be collapsed */
var toggleTinyScreenWidth=900; /* at what size should the tree be collapsed */

// Automatically attach a listener to the window onload, to show several elements only if JS is available
addEventS(window,"load",showOnlyWithJS);

function tamingselect() {} // ignore where not needed

// Utility function to add an event listener
function addEventS(o,e,f){
	if (o.addEventListener){ o.addEventListener(e,f,false); return true; }
	else if (o.attachEvent){ return o.attachEvent("on"+e,f); }
	else { return false; }
}

 function removeEventS(o,e,f) {
	if (o.removeEventListener){ o.removeEventListener(e,f,false); return true; }
	else if (o.detachEvent){ o.detachEvent("on"+e,f); return true; }
	else { return false; }
} 

function openNewWindow(LinkO) {
	if (LinkO.href) {
		window.open(LinkO.href,'');
		return false;
	} else {
		return true;
	}
}

function getViewportSize() {
	var size = [0, 0];

	if (typeof window.innerWidth != 'undefined')
	{
	size = [
	   window.innerWidth,
	   window.innerHeight
	];
	}
	else if (typeof document.documentElement != 'undefined'
	 && typeof document.documentElement.clientWidth !=
	 'undefined' && document.documentElement.clientWidth != 0)
	{
	size = [
	   document.documentElement.clientWidth,
	   document.documentElement.clientHeight
	];
	} else	{
		size = [
		   document.getElementsByTagName('body')[0].clientWidth,
		   document.getElementsByTagName('body')[0].clientHeight
		];
	}

	return size; // ARRAY!
}

function showOnlyWithJS () {	// show several elements only if JS is available
	document.getElementsByClassName("showwithjavascript").each( function(El,i)
		{ Element.removeClassName(El,"showwithjavascript"); }
	) 
}

function toggleClass( O, toggle ) {
	if ( toggle == "on" ) 
		Element.addClassName = (O, "pseudohover");
	else
		Element.removeClassName = (O, "pseudohover");
}

function toggleCheckboxes ( formName, min, max ) {
	var El = document.getElementsByName( formName );
	if(!min)
		min=1;
	if(!max)
		max=El.length;
	for (var i = min-1; i < max; i++)
		{ El[i].checked = !El[i].checked; }
}

function setEndTime (sourceEl, targetEl) {
	if ( sourceEl && sourceEl.value != null && sourceEl.value != "" 
		&& targetEl && targetEl.value != null && ( targetEl.value == "" || targetEl.value == "00:00" ) )
		targetEl.value = sourceEl.value;
}

// ===================== NEW ========================

function get_modinst_folder_select(Obj, modinst_id, folder_id ) {
	var url = '/_rxml/includes/modinst_folder_select.xml';
	var errorurl = '';
	var pars = 'modinst_id=' + modinst_id + '&folder_id=' + folder_id;
	var myAjax = new Ajax.Updater( {success: Obj.parentNode}, 
									url, 
									{ 
										method: 'get', 
										parameters: pars, 
										onComplete: function(t) { 
											tamingselect();
											$('location-inner').className='';  // IE recalc CSS
										},
										onFailure: function(t) { self.location=errorurl; }
									}
								)
	return false;
}

// **************************************************
// Deletes the Object "Obj" of type "moduleType" with Id "id"
// Confirms deletion with the question "dialog"
// Removes the Object from the View
// **************************************************
function deleteObject( id, Obj, moduleType, dialog ) {
	if ( ! confirm( dialog ) )
		return false;
	var url = '/_rxml/includes/delete_' + moduleType + '.xml';
// alert(url+"?"+moduleType + '_id=' + id + '&__state=1');
	var myAjax = new Ajax.Request(  
									url, 
									{ 	method: 'post', 
										parameters: moduleType + '_id=' + id + '&__state=1&referrer=' + encodeURIComponent( window.location.pathname), 
										onSuccess: function(request) {
											checkForErrorsAndRemove(request, Obj);
										},
										onComplete: function(t) { 
											$('location-inner').className='';  // IE recalc CSS
										},
										onFailure: function(t) { 
											alert('An transaction error occurred: Object could not be deleted');
										}
									}
								)
	return false;

}

// **************************************************
// first check for errors: check if <div class="failed"> has been returned
// second check for replacement: check if <div class="replace"> has been returned
// either display an error msg
// or replace the old object with the new one
// or remove the old object
// **************************************************

function checkForErrorsAndRemove( request, Obj ) {
	var Res = document.createElement('div');
	Res.innerHTML = request.responseText;
	if (Res.getElementsByTagName('div')[0] && Res.getElementsByTagName('div')[0].className == 'failed' ) {
		var error = Res.getElementsByTagName('div');
		var errorMsg = "";
		for ( var i = 0; i < error.length; i++) {
			if ( error[i].className=='error' && error[i].firstChild.nodeType==3 ) {
				errorMsg += error[i].firstChild.data + "\n";
			}
		}
		alert(errorMsg);
	} else if (Res.getElementsByTagName('div')[0] && Res.getElementsByTagName('div')[0].className == 'replace' ) {
		new Insertion.After( Obj, Res.getElementsByTagName('div')[0].innerHTML  );
		Element.remove( Obj ); 
	} else {
		Element.remove( Obj ); 
	}
}


// **************************************************
// Show / Hide Address Details
// **************************************************

function showAddressDetails( Obj, id ) {
	swapElement( 	Obj.parentNode.parentNode.parentNode, 
					'/_rxml/includes/view_addresses.xml', 
					'/_action/modules/calendar/view_addresses.html?addresses_id=' + id + '&referrer=' + referrerQuery, 
					'addresses_id=' + id + '&referrer=' + referrerQuery 
				)
	return false;
}

function hideAddressDetails( Obj, id ) {
	swapElement( 	Obj.parentNode.parentNode, 
					'/_rxml/includes/view_addresses.xml', 
					referrerUrl, 
					'addresses_id=' + id + '&referrer=' + referrerQuery + '&show=plain' 
				)
	return false
}



// **************************************************
// Show / Hide Event Details
// **************************************************

function showEventDetails( Obj, id ) {
	swapElement( 	Obj.parentNode.parentNode.parentNode, 
					'/_rxml/includes/viewevents.xml', 
					'/_action/modules/calendar/view_event.html?calendar_id=' + id + '&referrer=' + referrerQuery, 
					'calendar_id=' + id + '&referrer=' + referrerQuery 
				)
	return false;
}

function hideEventDetails( Obj, id ) {
	swapElement( 	Obj.parentNode.parentNode, 
					'/_rxml/includes/viewevents.xml', 
					referrerUrl, 
					'calendar_id=' + id + '&referrer=' + referrerQuery + '&show=plain' 
				)
	return false
}

function swapElement( Obj, url, errorurl, pars ) {
	var myAjax = new Ajax.Request( url, 
									{ 	method: 'get', 
										parameters: pars, 
										onSuccess: function(t) { 
											new Insertion.Before(Obj, t.responseText); 
										},
										onComplete: function(t) { 
											Element.remove(Obj);
											$('location-inner').className='';  // IE recalc CSS
										},
										onFailure: function(t) { 
											if( errorurl != '' ) 
												self.location=errorurl; }
									}
								)
}


// **************************************************
// show / hide old events
// 
// 
// **************************************************


function showOldEvents( Obj, id ) {
	Obj = Obj.parentNode;
	var url = '/%3Cshowallevents' + id + '%3E/_rxml/includes/loadoldevents.xml';
	var errorurl = '/%3Cshowallevents' + id + '%3E' + referrerUrl;
	var pars = 'modinst_id=' + id + '&referrer=' + referrerQuery;

	var myAjax = new Ajax.Request( url, 
									{ 	method: 'get', 
										parameters: pars, 
										onSuccess: function(t) { 
											new Insertion.Before(Obj, t.responseText); 
											Element.remove(Obj);
										},
										onComplete: function(t) { 
											$('location-inner').className='';  // IE recalc CSS
										},
										onFailure: function(t) { self.location=errorurl; }
									}
	)

	return false;
}

function hideOldEvents( Obj, id ) {
	var url = '/%3C-showallevents' + id + '%3E/_rxml/includes/hideoldevents.xml';
	var errorurl = '/%3C-showallevents' + id + '%3E' + referrerUrl;
	var pars = 'modinst_id=' + id + '&referrer=' + referrerQuery;
	var Uls = Obj.parentNode.parentNode.getElementsByTagName("ul");

	var myAjax = new Ajax.Updater( 
									{ success: Obj.parentNode.parentNode },
									url, 
									{ 
										method: 'get', 
										parameters: pars, 
										onComplete: function(t) { 
												$('location-inner').className='';  // IE recalc CSS
											},
										onFailure: function(t) { self.location=errorurl; }
									}
									)
	return false;
}


// **************************************************
// save / edit modinst
// 
// 
// **************************************************

function saveModinst(Obj) {
	var pars=Form.serialize(Obj.parentNode);
	postModinstContentTop( Obj.parentNode, '/_rxml/includes/savemodinst.xml', '', pars, 'swapModinstS(Obj)');
	return false;
}

function cancelModinst(Obj) {
	var pars=Form.serialize(Obj.parentNode)+'&cancel=cancel';
	postModinstContentTop( Obj.parentNode, '/_rxml/includes/savemodinst.xml', '', pars, 'swapModinstS(Obj)');
	return false;
}

function editModinst( Obj, id ) {
	Obj.setAttribute('onclick', "return false");
	Obj = Obj.parentNode.parentNode.parentNode;
	var url = '/_rxml/includes/updatemodinst.xml';
	var errorurl = '/_action/edit_modinst.html?modinst_id=' + id + '&referrer=' + referrerQuery;
	var pars = 'modinst_id=' + id + '&referrer=' + referrerQuery;
	postContentTop( Obj, url, errorurl, pars, 'swapModinstE(Obj)');
	return false;
}

function isModinstEdit( Obj ) {
	if (Obj.elements['modinst_name']) {
		return saveModinst($('modinst-name').parentNode.parentNode);
	} else {
		return true;
	}
}

function postModinstContentTop( Obj, url, errorurl, pars, successF ) {
	var myAjax = new Ajax.Request( url, 
									{ 	method: 'post', 
										parameters: pars, 
										onSuccess: function(t) { 
											eval(successF);
											new Insertion.Top(Obj, t.responseText); 
										},
										onComplete: function(t) { 
											if (checkForRedirect(Obj)) {
												updateSortButtonsModinst();
												$('location-inner').className=''; // IE recalc CSS
												Element.toggle(Obj); // Gecko's legend off
												Element.toggle(Obj); // Gecko's legend on
											}
										},
										onFailure: function(t) { self.location=errorurl; }
									}
	)
}

function checkForRedirect(Obj) {
	if ($('redirect-'+Obj.id)) {
		self.location=$('redirect-'+Obj.id).getAttribute('href');
		return false;
	}
	return true;
}

function swapModinstS(Obj) {
	Element.remove(Obj.getElementsByTagName('h3')[0]); 
	var divs=Obj.getElementsByTagName('div');
	Element.remove(divs[0]);
	Element.remove(divs[0]);
}

function swapModinstE(Obj) {
	Element.remove(Obj.getElementsByTagName('h3')[0]); 
	var divs=Obj.getElementsByTagName('div');
	Element.remove(divs[0]);
}

function updateSortButtonsModinst() {
	var ModInst = document.getElementsByClassName('modinst');
	if ( ModInst.length > 1 ) {
		for ( var i = 0; i < ModInst.length; i++ ) {
			switch( i ) {
				case 0:
					if ( ModInst[i].getElementsByTagName('INPUT').length == 2 ) {
						new Insertion.Bottom(ModInst[i].getElementsByTagName( 'INPUT')[0].parentNode, firstUp + Down );
					}
					break;
				case ModInst.length - 1:
					if ( ModInst[i].getElementsByTagName('INPUT').length == 2 ) {
						new Insertion.Bottom(ModInst[i].getElementsByTagName( 'INPUT')[0].parentNode, Up + lastDown );
					}
					break;
				default:
					if ( ModInst[i].getElementsByTagName('INPUT').length < 4 ) {
						if (ModInst[i].getElementsByTagName('INPUT')[2]) 
							Element.remove(ModInst[i].getElementsByTagName('INPUT')[2]);
						new Insertion.Bottom(ModInst[i].getElementsByTagName( 'INPUT')[0].parentNode, Up + Down );
					}
					break;
			}
		}
	}
}

function getContent( Obj, url, errorurl, pars ) {
	var myAjax = new Ajax.Updater( {success: Obj}, 
									url, 
									{ 
										method: 'get', 
										parameters: pars, 
										onComplete: function(t) { $('location-inner').className=''; }, // IE recalc CSS
										onFailure: function(t) { self.location=errorurl; }
									}
								)
}

function postContent( Obj, url, errorurl, pars ) {
	var myAjax = new Ajax.Updater( {success: Obj}, 
									url, 
									{ 	method: 'post', 
										parameters: pars, 
										onComplete: function(t) { $('location-inner').className=''; }, // IE recalc CSS
										onFailure: function(t) { self.location=errorurl; }
									}
								)
}

function postContentBefore( Obj, url, errorurl, pars ) {
	var myAjax = new Ajax.Request( url, 
									{ 	method: 'post', 
										parameters: pars, 
										onSuccess: function(t) { new Insertion.Before(Obj, t.responseText); },
										onComplete: function(t) { $('location-inner').className=''; }, // IE recalc CSS
										onFailure: function(t) { self.location=errorurl; }
									}
								)
}

function postContentAfter( Obj, url, errorurl, pars ) {
	var myAjax = new Ajax.Request( url, 
									{ 	method: 'post', 
										parameters: pars, 
										onSuccess: function(t) { new Insertion.After(Obj, t.responseText); },
										onComplete: function(t) { $('location-inner').className=''; }, // IE recalc CSS
										onFailure: function(t) { self.location=errorurl; }
									}
								)
}

function getContentBefore( Obj, url, errorurl, pars, removeObj ) {
	var myAjax = new Ajax.Request( url, 
									{ 	method: 'get', 
										parameters: pars, 
										onSuccess: function(t) { 
											new Insertion.Before(Obj, t.responseText); 
											if (removeObj) {
												Element.remove(removeObj);
											}
										},
										onComplete: function(t) { 
											$('location-inner').className='';  // IE recalc CSS
										},
										onFailure: function(t) { self.location=errorurl; }
									}
								)
}


function postContentTop( Obj, url, errorurl, pars, successF ) {
	var myAjax = new Ajax.Request( url, 
									{ 	method: 'post', 
										parameters: pars, 
										onSuccess: function(t) { 
											eval(successF);
											new Insertion.Top(Obj, t.responseText); 
										},
										onComplete: function(t) { 
											$('location-inner').className=''; // IE recalc CSS
											Element.toggle(Obj); // Gecko's legend off
											Element.toggle(Obj); // Gecko's legend on
										},
										onFailure: function(t) { self.location=errorurl; }
									}
	)
}

// Helper für Treenavigation, wenn Screen zu klein ist
// Prüft screen width beim laden und wenn resized wird

function toggleSidebarOn( sidebar, width ) { 
	var screenW = getViewportSize()[0];
	if (screenW <= width ) { // sometimes IE does not remove the event properly
		var sidebarO, sidebaropenerO;
		window.clearTimeout(treeTimout);
		if( $(sidebar+'-opener') ) {
			sidebaropenerO = $(sidebar+'-opener');
			sidebaropenerO.className="collapsed";
		}
		if( $(sidebar) ) {
			sidebarO = $(sidebar);
			sidebarO.className="open";
		}
	}
}

function toggleSidebarOff( sidebar, width ) { 
	var screenW = getViewportSize()[0];
	if (screenW <= width ) { // sometimes IE does not remove the event properly
		treeTimout = window.setTimeout("toggleSidebarOffHelper( '"+sidebar+"' ) ", 300);
	}
}

function toggleSidebarOffHelper( sidebar ) { 
	var sidebarO, sidebaropenerO;
	if( $(sidebar+'-opener') ) {
		sidebaropenerO = $(sidebar+'-opener')
		sidebaropenerO.className="open";
	}
	if( $(sidebar) ) {
		sidebarO = $(sidebar);
		sidebarO.className="collapsed";
	}
}

function toggleTreeOn() {
	toggleSidebarOn( 'tree', toggleScreenWidth );
}

function toggleNewsOn() {
	toggleSidebarOn( 'news', toggleTinyScreenWidth );
}

function toggleTreeOff() {
	toggleSidebarOff( 'tree', toggleScreenWidth );
}

function toggleNewsOff() {
	toggleSidebarOff( 'news', toggleTinyScreenWidth );
}

function initTreeNav() {
//	initialWidthCheck();
	var tree, treeopener, content, news, newsopener;
	if( $('tree-opener') ) {
		treeopener = $('tree-opener');
		addEventS( treeopener, 'mouseover', toggleTreeOn ); 
	}
	if( $('news-opener') ) {
		newsopener = $('news-opener');
		addEventS( newsopener, 'mouseover', toggleNewsOn ); 
	}
	if( $('tree') ) {
		tree = $('tree');
		addEventS( tree, 'mouseover', toggleTreeOn );  
		addEventS( tree, 'mouseout', toggleTreeOff );  
	}
	if( $('news') ) {
		news = $('news');
		addEventS( news, 'mouseover', toggleNewsOn );  
		addEventS( news, 'mouseout', toggleNewsOff );  
	}
	addEventS(window,"resize",toggleNavTree);
	toggleNavTree();
}

function toggleNavTree() {
	var screenW = getViewportSize()[0];
	var tree, treeopener, news, newsopener, content;
	if (screenW > toggleScreenWidth ) { /* widescreen */
		if( $('tree-opener') ) {
			treeopener = $('tree-opener');
			treeopener.className = "collapsed";
		}
		if( $('news-opener') ) {
			newsopener = $('news-opener');
			newsopener.className = "collapsed";
		}
		if( $('tree') ) {
			tree = $('tree');
			tree.className = "open";
		}
		if( $('news') ) {
			news = $('news');
			news.className = "open";
		}
		if( $('content-o') ) {
			content = $('content-o');
			content.className = "widescreen";
		}
	} else if (screenW > toggleTinyScreenWidth) { /* mediumscreen */
		if( $('tree-opener') ) {
			treeopener = $('tree-opener');
			treeopener.className = "open";
		}
		if( $('news-opener') ) {
			newsopener = $('news-opener');
			newsopener.className = "collapsed";
		}
		if( $('tree') ) {
			tree = $('tree');
			tree.className = "collapsed";
		}
		if( $('news') ) {
			news = $('news');
			news.className = "open";
		}
		if( $('content-o') ) {
			content = $('content-o');
			content.className = "mediumscreen";
		}
	} else { /* smallscreen */
		if( $('tree-opener') ) {
			treeopener = $('tree-opener');
			treeopener.className = "open";
		}
		if( $('news-opener') ) {
			newsopener = $('news-opener');
			newsopener.className = "open";
		}
		if( $('tree') ) {
			tree = $('tree');
			tree.className = "collapsed";
		}
		if( $('news') ) {
			news = $('news');
			news.className = "collapsed";
		}
		if( $('content-o') ) {
			content = $('content-o');
			content.className = "smallscreen";
		}
	}
}

function setAutoUpdateLockText ( moduleType_id, object_id, interval, debug ) {
	var autoLocks = new PeriodicalExecuter ( 
		function() {
			var myAjax = new Ajax.Request( 
											'/_rxml/includes/update_lock.xml', 
											{ 	method: 'post', 
												parameters: 'moduleType_id=' + moduleType_id + '&object_id=' + object_id, 
												onSuccess: function(t) {
													if(debug) showResponse (t.responseText);
												},
												onFailure: function(t) { 
													if(debug) alert('Failed to update lock');
												}
											}
										)
		}, 
		interval
	)
}

function showResponse (responseText) {
	var Res = document.createElement('div');
	Res.innerHTML = responseText;
	if (Res.getElementsByTagName('div')[0] && Res.getElementsByTagName('div')[0].id == 'status' ) {
		alert(Res.getElementsByTagName('div')[0].firstChild.data);
	}
}

function intermediateSaveText ( formO ) {
	$('result-msg').innerHTML = '<p><img src="/_img/progress_xs.gif" alt="" /></p>';
	var pars = Form.serialize(formO);
	// $('result-msg').innerHTML = 'Debug: /_rxml/includes/save_text.xml?' + pars;
	var myAjax = new Ajax.Request( 
									'/_rxml/includes/save_text.xml', 
									{ 	method: 'post', 
										parameters: pars, 
										onSuccess: function(t) {
											showResponseIntermediateSave(t.responseText);
											changes = false;
										},
										onFailure: function(t) { 
											window.location.pathname=window.location.pathname + '?' + Form.serialize(formO) + 'noredir=noredir';
										}
									}
								)
	return false;
}

function showResponseIntermediateSave( responseText ) {
	var Res = document.createElement('div');
	Res.innerHTML = responseText;
	var ResEl = Res.getElementsByTagName('div');
	for( var i = 0; i < ResEl.length ; i++ ){ 
		if (ResEl[i].id == 'status' ) {
			//	alert(ResEl[i].innerHTML);
			$('result-msg').innerHTML = ResEl[i].innerHTML;
		} else if (ResEl[i].id == 'text_id' ) {
			// alert('id='+ResEl[i].innerHTML);
			$('text-id').value = ResEl[i].innerHTML;
			document.getElementsByClassName('buttonfloatright').each(	// update cancel link
				function(El, i) {
					if ( El.firstChild.nodeName.toLowerCase() == 'a'  ) {
						El.firstChild.href = El.firstChild.href.replace('lock_object_id=0', 'lock_object_id='+ ResEl[i].innerHTML );
					}
				}
			)
			// setAutoUpdateLockText ( &var.moduletype_id;, &form.text_id;, &var.halbwertszeit;, <if config="debug">true</if><else>false</else> );
		} else if (ResEl[i].id == 'preview' ) {
			// show formatted preview
			$('result-preview').innerHTML = ResEl[i].innerHTML;
		}
	}
}

function loadCSS( stylesheet ) {
  var i, a, main;
	for(i=0; (a = document.getElementsByTagName("link")[i]); i++) 
	{
		if(a.getAttribute("rel") && a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
			a.disabled = true;
			if(a.getAttribute("title") == stylesheet ) {
				a.disabled = false;
//				alert("show: "+a.getAttribute("title"));
			} else {
//				alert("hide: "+a.getAttribute("title"));
			}
		}
	}
}

function initialWidthCheck() {
	var screenW = getViewportSize()[0];
	if (screenW > toggleScreenWidth ) {
		loadCSS( 'widescreen' )
	} else if (screenW > toggleTinyScreenWidth) {
		loadCSS( 'mediumscreen' )
	} else {
		loadCSS( 'smallscreen' )
	} 
}
initialWidthCheck();
addEventS(window,"load",initTreeNav);

