var tracedepth=0;
var max_trace_depth=0;

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>");
		//w.document.close();
	}
	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 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=500; h=400
	}
	win=window.open(url,'win_front','toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=no,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();
}

// Flash-Detection
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion() {
	var version, axo, e;
	try {
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {}

	if (!version){
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			version = "WIN 6,0,21,0";
			axo.AllowScriptAccess = "always";
			version = axo.GetVariable("$version");

		} catch (e) {	}
	}
	if (!version) {
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {}
	}
	if (!version) {
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) { }
	}
	if (!version) {
		try {
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	if (version && version!=-1) {
		if( /([^ ]*) ([0-9]*),(.*)/.exec(version) ) {
			version=parseInt(RegExp.$2);
		}
	}	
	return version;
}
function GetSwfVer(){
	var flashVer = -1;	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var descArray = navigator.plugins["Shockwave Flash" + swVer2].description.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var flashVer = tempArrayMajor[0];
		}
	}
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}
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;
}
function parseAdURL(url) {
	var paras=new Array();
	var value;
	url=unescape(url);

	//try {
		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');
			//trace(para_array);
			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 (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;
			}
		}
	/*}
	catch(e) {
		paras=false;
	}*/
	return paras;
}

function extractContent(str, needle) {
	if (str.indexOf("<body")!=-1) {
		str=str.substring(str.indexOf('<body>')+6, str.lastIndexOf('</body>'));
	}
	var d=Element.extend(document.createElement("DIV"));
	d.update(str);
	return d.down(needle).innerHTML;
}

function _parseInt(arg) {
	if (arg==null) return 0;
	var a = arg.replace(/([0-9\.\-]*)(.*)/, "$1");
	return a.length>0 ? Number(a) : 0;
}
////////////////////////////////////////////////////
///    ///    ///    ///    ///    ///    ///    ///

var last_ds_container_id = false;
var next_ds_container_id = false;
var last_ds_container_pos = 0;

var busy = new Abort();

var EMPTY_IMAGE=new Image();
EMPTY_IMAGE.src= document.URL.replace(/(.*)((\/index.php(5?))|(\#))(.*)/, "$1") + "pix/leer.gif";

// wird bei onLoad gefüllt;
var ds_entries_positions=[];
var ccont_offset_height;

var cur_gal_id;

var Browser=getBrowser();
function _StopEvent(ev) {
	Event.stop(ev);
	if (Browser.name=="safari" && Browser.version < 400) {
		ev.target.onclick=function(e) {
			e.target.onclick = function(evn) { return true;	}
			return false;
		};
	}
}

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


function showDBEntry(ev) {
	var el;
	
	switch((typeof ev)) {
		case "object":
			el=Event.element(ev);
			if (el.tagName.toUpperCase() != "A") {
				el=el.up("a");
			}
			_StopEvent(ev);
			break;
		case "number":
		case "string":
			try {
				el=$("ds_entry_"+ev).down("a");
			}
			catch (e) {
				alert("Project "+ev+" not found in list.");
				return;
			} 
			break;
	}

	if (!busy.abort()) {
		return;
	}
	
	var paras=parseAdURL(el.href);
	var node_id = paras["node_id"];
	var tg_el = $("ds_entry_"+node_id);
	
	// argument 2 kommt aus loadPage-Callback
	if (arguments.length<2) {
		if ( next_ds_container_id == "ds_container_"+node_id) {
			return false;
		}
		if (next_ds_container_id) {
			last_ds_container_id = next_ds_container_id;
		}
	}
	// 
	// Eigentlich ein übler Hack, da die Node-ID der Projekte-Seite fest auf "3" steht
	if (tg_el==null) {
		var href = el.href.replace(/(.*\/index.php(5?))(.*)/, "$1");
		if (node_id.split(".")[0] == 9) {
			href +="?node_id=Aktuell;1";
		}
		else {
			var dsl_kind=Try.these(
				function() { return el.up(".c_dsl").readAttribute("datasrc").toLowerCase();},
				function() {return ''}
			);
			switch(dsl_kind) {
				case "wettbewerbe":
					href += "?node_id=Wettbewerbe;86";
					break;
				default:
					href +="?node_id=Projects;3"; 
			}
		}
		
		var callback=function() {
			// 2. Parameter verhindert das erneute setzen des last_ds_container_ids
			showDBEntry(node_id, "forced");
		}
		loadPage(href, callback);
		return;
	}
	next_ds_container_id = "ds_container_"+node_id;
	
	destroyFrameScroller()
	// hier stand's mit den next_cont_ds_ids..
	
	// wurde es schon mal geladen? dann nur einblenden
	if (document.getElementById(next_ds_container_id) != null && last_ds_container_id) {
	
		busy.registerTask(true);
		Effect.BlindDown( next_ds_container_id, {
			duration: 0.5,
			afterFinish:function(){
				tg_el.addClassName("ds_open"); 
				busy.deleteTask();
			}  
		});
		Effect.BlindUp( last_ds_container_id, {duration: 0.5});
		// Galerie schließen
		var last_node_id = last_ds_container_id.substr( last_ds_container_id.lastIndexOf("_") + 1 );
		_closeGallery(last_node_id);
		
		moveContentToTop(node_id);
		
		$(last_ds_container_id).up(".c_entry").removeClassName("ds_open");
		
		disableHeadLink(node_id);
		enableHeadLink( last_ds_container_id.substr( last_ds_container_id.lastIndexOf("_")+1 ));
		//last_ds_container_id = next_ds_container_id;
		createEntryHeadLinks(node_id);
		createDSScroller();
	}
	else {
		try {
			tg_el.down("h2").id="ds_head_"+node_id;
			var html_data = "<div class='c_cont' style='display:none;' id='"+next_ds_container_id+"'></div>";
			if (tg_el.down(".c_head")) {
				tg_el.down(".c_head").id="ds_head_cont_"+node_id;
				new Insertion.After("ds_head_cont_"+node_id, html_data);
			}
			else {
				new Insertion.After("ds_head_"+node_id, html_data);
			}
			disableHeadLink(node_id);
			if (last_ds_container_id)
				enableHeadLink( last_ds_container_id.substr( last_ds_container_id.lastIndexOf("_")+1 ));
		}
		catch (e) {
			try {	console.log(e); } catch(e) {}
			return false;
		}
		// Animation
		Effect.BlindDown( next_ds_container_id, {
				duration: 0.5, 
				afterFinish: function() { 
					tg_el.addClassName("ds_open");
				}
			}
		);
		if (last_ds_container_id && last_ds_container_id != next_ds_container_id) {
			Effect.BlindUp( last_ds_container_id, {duration: 0.5, afterFinish:function(){ 
				tg_el.addClassName("ds_open");
			}});
			// Galerie schließen
			var last_node_id = last_ds_container_id.substr( last_ds_container_id.lastIndexOf("_") + 1 );
			_closeGallery(last_node_id);
		}
		//doImgTowerEffect(node_id);
		// -> DS-Content nach oben bewegen, danach doImgTowerEffect
		moveContentToTop(node_id);

		
		$$(".a_content")[0].addClassName("open");
		if (last_ds_container_id) {
			$(last_ds_container_id).up(".c_entry").removeClassName("ds_open");
		}
		
		//last_ds_container_id = next_ds_container_id;
		 
		//el.setStyle({borderWidth:"2px", borderStyle:"solid", borderColor: "red"});
		 
		var href=el.href;
		//el.href="javascript:void(3)";
		//var el_id = el.identify();
		var req=new Ajax.Request(href,{
			method: "GET",
			parameters: {no_range: "true"},
			onSuccess: function(data) {
				html_data = extractContent(data.responseText, ".c_cont");
				html_data = '<div class="c_frame" style="position:relative; top:0px">'+html_data+"</div>";
				$(next_ds_container_id).update(html_data);
				
				createEntryHeadLinks(node_id);
				observeFrameLinks();
				createDSScroller();
				busy.deleteTask();
				//$(el_id).writeAttribute("href",href);
				//el.setStyle({borderWidth:"", borderStyle:"", borderColor: ""});
			}
		});
		var timeout = new Date();
		busy.registerTask(function(){
			//el.href=href;
			//$(el_id).writeAttribute("href",href);
			// 5 Sekunden timeout
			if ((new Date())-timeout > 5000) {
				req=null;
				delete req;
				return true;
			}
			else {
				return false;
			}
		});

	}
	Effect.Fade("Scrollbar-Container", {duration: 0.5});
	return false;
}
var ds_scroller;

function createDSScroller(cont_index) {
	try {
		cont_index= cont_index==null ? 0 : cont_index;
		
		var scroll_frame = $(next_ds_container_id).down(".c_cont_single", cont_index).down(".c_ds_scroll_frame");
		if (scroll_frame.scrollHeight > 380) {
			
			scroll_frame.setStyle({position:"relative"});
			$("Scrollbar-Container").addClassName("DS_mode");
			$("Scrollbar-Container").show();
			
			if (Browser.name=="msie") $("Scrollbar-Container").setStyle({filter:"alpha(opacity=100)"});
			else $("Scrollbar-Container").setStyle({opacity:"1"});
			
			ds_scroller = new jsScroller(scroll_frame, 380, 380);
			
			if (scrollbar==undefined) {
				scrollbar = new jsScrollbar(  $("Scrollbar-Container"), ds_scroller, false);
			}
			else {
				scrollbar.swapContent(ds_scroller, 380, 362);
			}
			//scrollbar = new jsScrollbar(  $("Scrollbar-Container"), ds_scroller, false);
		}
		else {
			$("Scrollbar-Container").fade({duration: 0.3});
			ds_scroller=null;
		}
	}
	catch(e) { 
		if (typeof console != "undefined") console.log(e); 
	}
}

var ls_pe, ls_scroll, ls_scroll_pe;
var ls_speed=0;
var ls_acc=0;


function createFrameScroller(reset) {
	// reset==true: nach loadPage, next_ds_container_id != false: ein Projekt ist geöffnet 
	if (reset && next_ds_container_id != false) {
		return;
	}
	if (view_height==0) {
		view_height=document.viewport.getHeight();
		if (view_height == 0) return;
	}
	
	$("Scrollbar-Container").down(".Scrollbar-Track").setStyle({height: (view_height-70)+"px"});
	$("Scrollbar-Container").down(".Scrollbar-Down").setStyle({top: (view_height-59)+"px"});
	//console.log($("Scroll-Content").scrollHeight+" > "+(view_height-60));
	if ($("Scroll-Content").scrollHeight > view_height-60) {
		$("Scrollbar-Container").show();
		$("Scrollbar-Container").removeClassName("DS_mode");
		
		scroller = new jsScroller( $$(".a_wrapper")[0], 400, view_height-60);
		if (scrollbar==undefined) {
			scrollbar = new jsScrollbar(  $("Scrollbar-Container"), scroller, false, false, reset);
		}
		else {
			var ccont=$$(".a_wrapper")[0];
			// aus scroller.js abgeschaut, berechnet die korrekte Position des Scroll-Handlers
			var sb_handle = $$(".Scrollbar-Handle")[0];
			var ratio = ( ccont.offsetHeight - view_height + $("Scroll-Content").offsetTop) / ($$(".Scrollbar-Track")[0].offsetHeight - sb_handle.offsetHeight);
			
			var c_offset = -ccont.offsetTop + $("Scroll-Content").offsetTop;
			var sb_handle_y = Math.round(c_offset / ratio);
			
			sb_handle.setStyle({top: sb_handle_y+"px"});
			scrollbar.swapContent(scroller, 400, view_height-60, reset);
		}
		Effect.Appear("Scrollbar-Container", {duration: 0.5});
		
		// neu: rollover Scroller
		var list=$$(".a_wrapper")[0];
		var ls_left=list.viewportOffset()[0];
		
		list.observe("mousemove", function(ev) {
			var px=ev.pointerX();
			var py=ev.pointerY();
			if (px > ls_left && px < ls_left+360) { 
				if (py<110)
					ls_scroll="down";
				else if (py > view_height-55)
					ls_scroll="up";
				else
					ls_scroll=false;
			}
			else
				ls_scroll=false;
		});
		
		list.observe("mouseout", function(ev) {
			if (ev.pointerX() < ls_left || ev.pointerX() > view_width) {
				ls_scroll=false;
			}
		});
		if (!ls_scroll_pe) {
			ls_scroll_pe = new PeriodicalExecuter(function(pe) {
				var ty=_parseInt(list.getStyle("top"));
				switch (ls_scroll) {
					case 'up':
						if (list.getHeight()+ty+64 > view_height) {
							ls_acc = -6;
						}
						else ls_acc = 0;
						break;
					case 'down':
						if (ty <= 0) {
							ls_acc = 6;
						}
						else ls_acc = 0;
						break;
					default:
						ls_acc=0;
				}
				ls_speed+= ls_acc*0.18;
				ls_speed = ls_speed*0.85;
				if (ls_speed>0) {
					var down_min = -(ty-ls_speed)/6;
					ls_speed = Math.min(ls_speed, down_min);
				}
				else if (ls_speed<0) {
					var up_min = (list.getHeight()+ty-view_height+64)/6;
					ls_speed = -Math.min(-ls_speed, up_min)
				}
				scrollbar.scrollBy(0, Math.round(-ls_speed));
			}, 1/30);
		}
	}
	else {
		$("Scrollbar-Container").hide();
	}
	ds_scroller=null;
}

function destroyFrameScroller() {
	if (ls_scroll_pe) {
		ls_scroll_pe.stop();
		ls_scroll_pe=false;
	}
	var list=$$(".a_wrapper")[0];
	list.stopObserving("mousemove");
	list.stopObserving("mouseout");
}

function disableHeadLink(node_id) {
	var link=$("ds_head_"+node_id).down("a");
	var div=document.createElement("DIV");
	div.innerHTML = link.innerHTML;
	$("ds_head_"+node_id).appendChild(div);
	link.hide();
}
function enableHeadLink(node_id) {
	var link=$("ds_head_"+node_id).down("a");
	if ($("ds_head_"+node_id).down("div")) {
		$("ds_head_"+node_id).removeChild( $("ds_head_"+node_id).down("div") );
	}
	link.show();
}

function moveContentToTop(node_id) {
	var a_wrapper=$$(".a_wrapper")[0];
	var cont_top;
	last_ds_container_pos = cont_top = _parseInt(a_wrapper.getStyle("top"));
	
	// Verschiebe Content-Container an den oberen Bildschirmrand
	var pos=ds_entries_positions["ds_entry_"+node_id]
	//var pos = $("ds_entry_"+node_id).offsetTop;
	pos-=4;
	
	cont_top = (isNaN(cont_top) ? 0 : cont_top);

	var fx=new Effect.Tween(null, cont_top, -pos, {	duration: 0.5 }, 
		function(p) {
			if (cont_top < -pos) {
				p=Math.min(p, -$("ds_entry_"+node_id).offsetTop+4);
			}
			else {
				p=Math.max(p, -$("ds_entry_"+node_id).offsetTop+4);
			}
			a_wrapper.setStyle({"top": p+"px"});
		}
	);
	doImgTowerEffect.delay(0.5, node_id);
}

function doImgTowerEffect(node_id) {
	var a_range=$$(".a_range")[0];
	var cont_top=_parseInt(a_range.getStyle('top'));
	var pic_top;
	if (!(pic_top = Try.these(function() { return parseInt($("ds_gal_"+node_id).offsetTop);}, false))) {
		//if (document.getElementById("ds_gal_data_"+node_id)==null)
		//	return;
		pic_top=0;
	}
	
	if ( getGallery(node_id) != null) {
		destroyImgTowerScroller();
	}
	// Verschiebe Bilder-Tower
	if (pic_top !== false) {
		pic_top -= 56; //pic_top>0 ? 56 : 0;
		new Effect.Tween(null, cont_top, -pic_top, {duration: 0.5, 
			afterFinish: function(){
				__showGalleryPics(node_id);
			}}, 
			function(p){
				if (isNaN(p)) return;
				a_range.setStyle({ top: p+"px"});
			}
		);
	}
	// # moveContentToTop()
	
	if (last_ds_container_id) {
		var last_node_id = last_ds_container_id.substr( last_ds_container_id.lastIndexOf("_") + 1 );
		var gallery=getGallery( last_node_id );
		var gal_id = gallery.id.split("_").pop();
		_closeGallery(gal_id);
	}
}

function getGallery(node_id) {
	if (document.getElementById("ds_gal_"+node_id)==null)
		return $$(".a_range .c_dsl .c_entry div")[0];
	else
		return $("ds_gal_"+node_id);
	
}

var tpl_gallery_entry = new Template('<a href="#{pic}" title="#{txt}" rel="lightbox[dash]" alt="">'
												+'<img src="#{thumb}" alt="#{txt}" class="colorPic" style="position:relative; z-index:1; left:-#{offsetLeft}px;"></a>');

// wird als "afterFinish" von doImgTowerEffect() aufgerufen
function __showGalleryPics(node_id) {
	var node=getGallery(node_id); //$("ds_gal_"+node_id);
	if (node!=null) { 
		try {
			var json=$("ds_gal_data_"+node_id).innerHTML;
			var pics=json.evalJSON();
			// Backup
			var gal_id = node.id.split("_").pop()
			cur_gal_id = gal_id;
			
			// Bilder erzeugen
			node.down("img").setStyle({position:"absolute"});
			node.down("img").fade({duration:0.5, delay: 0.5});
			
			var offsetLeft = 0;// parseInt(node.down("img").readAttribute("width"))+2;
			var new_html="";
			
			$H(pics).values().each(function(pic) {
				pic.offsetLeft = offsetLeft;
				new_html += tpl_gallery_entry.evaluate(pic);
			});
			
			var sw_pic=node.down();

			sw_pic.insert({after: new_html});
			var pic_watcher = new ImageWatcher();
			$$(".colorPic").each(function(pic_link){
				pic_watcher.addImage( pic_link );
			});

			node.setStyle({height: "274px"});
			createGalleryScroller(node);
		}
		catch(e) {
			if (typeof console != "undefined") console.log(e);
		}
	}
}

var gallery_scroll=false;
var gallery_pe;

var view_width, view_height;

Event.observe(window, "resize", function(e) {
	view_width=document.viewport.getWidth();
	view_height=document.viewport.getHeight();
	if ($("Scrollbar-Container").visible()) {
		$("Scrollbar-Container").down(".Scrollbar-Track").setStyle({height: (view_height-70)+"px"});
		$("Scrollbar-Container").down(".Scrollbar-Down").setStyle({top: (view_height-59)+"px"});
		if (scrollbar!=undefined) {
			scrollbar.setNewHeight(view_height-60);
		}
	}
});

var gl_speed=0;
var gl_acc=0;
function createGalleryScroller(gal_node) {
	var view_offset_x=gal_node.viewportOffset()[0];
	var view_offset_y=gal_node.viewportOffset()[1];
	var width = view_width - view_offset_x;
	var height = gal_node.getHeight();
	
	gal_node.setStyle({position:"relative"});
	
	gal_node.observe("mousemove", function(ev){
		var px=ev.pointerX();
		//debug("px="+px+" vox="+view_offset_x+" vw="+view_width);
		if (px > view_offset_x && px < view_offset_x+150) {
			gallery_scroll="right";
		}
		else if (px > view_width-150) {
			gallery_scroll="left";
		}
		else {
			gallery_scroll=false;
		}
	});
	gal_node.observe("mouseout", function(ev) {
		var px=ev.pointerX();
		var py=ev.pointerY();
		if (px > view_offset_x && px < view_width && py>view_offset_y && py < view_offset_y+274) 
			return;
		gallery_scroll=false;
	});
	
	var ms_offset = Browser.name=="msie" ? 1 : 0;
	last_img = gal_node.down("code").previous("a",ms_offset).down("img");
	
	// zum debuggen
	// last_img.setStyle({border:"2px dashed #FF0000"});
	
	gallery_pe = new PeriodicalExecuter(function(pe){
		var speed=15;
		var left = gal_node.getStyle("left");
		left = left==null ? 0 : parseInt(left.replace(/([0-9\-]*)(.*)/,"$1"));
		
		last_img_offset = last_img.offsetLeft + last_img.offsetWidth + view_offset_x;
				
		if (gallery_scroll=="left" &&  last_img_offset + left >= view_width) {
			gl_acc= -speed;
			//gal_node.setStyle({left: (left-speed)+"px"});
		}
		else if (gallery_scroll=="right" && left+speed<=0) {
			gl_acc = speed;
			//gal_node.setStyle({left: (left+speed)+"px"});
		}
		if (gallery_scroll==false) {
			gl_acc = 0;
		}
		gl_speed+= gl_acc*0.18;
		gl_speed = gl_speed*0.85;
		
		if (gl_speed>0) {
			var left_min = -(left-gl_speed)/6;
			gl_speed = Math.min(gl_speed, left_min);
		}
		else if (gl_speed<0) {
			var left_min = (last_img_offset-view_width+left)/6;
			gl_speed = -Math.min(-gl_speed, left_min)
		}
		gal_node.setStyle({left: (left + Math.round(gl_speed))+"px"});
		
	}, 1/30);
}
function destroyGalleryScroller(gal_node) {
	gal_node.stopObserving("mousemove");
	gal_node.stopObserving("mouseout");
	if (gallery_pe) {
		gallery_pe.stop();
		gallery_pe = false;
		gl_speed=0;
		gl_acc=0;
		gallery_scroll=false;
		new Effect.Tween(null, gal_node.offsetLeft, 0, {duration: 0.5}, 
			function(p) { 
				gal_node.setStyle({"left": p+"px"});
			}
		);
	}
}

var tw_pe, tw_scroll, scroll_pe;
var tw_speed=0;
var tw_acc=0;

function createImgTowerScroller() {
	var tower=$$(".a_range")[0];
	var tw_left=tower.viewportOffset()[0];
	
	tower.observe("mousemove", function(ev) {
		var px=ev.pointerX();
		var py=ev.pointerY();
		if (px > tw_left && px < tw_left+430) {
			if (py<110) {
				tw_scroll="down";
			}
			else if (py > view_height-55) {
				tw_scroll="up";
			}
			else {
				tw_scroll=false;
			}
		}
		else {
			tw_scroll=false;
		}
	});
	tower.observe("mouseout", function(ev) {
		if (ev.pointerX() < tw_left || ev.pointerX() > view_width) {
			tw_scroll=false;
		}
	});
	scroll_pe = new PeriodicalExecuter(function(pe) {
		var ty=_parseInt(tower.getStyle("top"));
		switch (tw_scroll) {
			case 'up':
				if (tower.getHeight()+ty > view_height) {
					tw_acc = -16;
				}
				else tw_acc = 0;
				break;
			case 'down':
				if (ty <= 62) {
					tw_acc = 16;
				}
				else tw_acc = 0;
				break;
			default:
				tw_acc=0;
		}
		tw_speed+= tw_acc*0.18;
		tw_speed = tw_speed*0.85;
		if (tw_speed>0) {
			var down_min = (-(ty-tw_speed)+56)/6;
			tw_speed = Math.min(tw_speed, down_min);
		}
		else if (tw_speed<0) {
			var up_min = (tower.getHeight()+ty-view_height)/6;
			tw_speed = -Math.min(-tw_speed, up_min)
		}
		tower.setStyle({top: (ty + Math.round(tw_speed))+"px"});
		
	}, 1/30);
}
Event.observe(document, "mouseout", function(ev){
	if (tw_scroll) {
		if (ev.pointerX()<=0 || ev.pointerX()>=view_width) {
			tw_scroll=false;
			ls_scroll=false;
		}
		if (ev.pointerY()<=0 || ev.pointerY() >= view_height) {
			tw_scroll=false;
			ls_scroll=false;
		}
	}
});
Event.observe(document, "blur", function(ev){
	tw_scroll=false;
	ls_scroll=false;
});
function destroyImgTowerScroller() {
	if (scroll_pe) {
		scroll_pe.stop();
		scroll_pe=false;
	}
	var tower=$$(".a_range")[0];
	tower.stopObserving("mousemove");
	tower.stopObserving("mouseout");
}

function getLangId() {
	if (typeof __lang_id != "undefined")
		return __lang_id;
	
	var regex = /\/index.php(5?)((\?(.*)lang_id=([0-9]))|(\/[\w\+;\.]*\/([0-9])))+(\/.*)?/;
	var match = regex.exec(document.URL);
	if (match!=null ) {
		found = RegExp.$5 ? RegExp.$5 : RegExp.$7;
	}
	if (!found && document.links.length>0) {
		var found=false;
		for (var i=0; i<document.links.length && !found; i++) {
			match= regex.exec(document.links[i].href);
			if (match != null) {
				found = RegExp.$5 ? RegExp.$5 : RegExp.$7 
			}
		}
	}
	if (found) {
		__lang_id=parseInt(found);
	}
	return __lang_id;
}

var tpl_gallery_nav = new Template('<li><a href="#{pic}" rel="lightbox[gal]"><span>#{txt}</span></a></li>');

var tpl_entryNav_Link = new Template('<li><a href="#{anchor}" #{style} rel="txt_#{txt_index}">#{name}</a>#{space}');

var tpl_entryNav_Full = new Template('<ul>#{navi_links}</ul><ul class="cont_navi_pic">#{gallery_nav}</ul> <a href="javascript:void(0)" class="close" id="#{node_id}">#{close_text}</a>');
var tpl_entryNav_Gal = new Template('<ul class="cont_navi_pic">#{gallery_nav}</ul><a href="javascript:void(0)" class="close" id="#{node_id}">#{close_text}</a>');
var tpl_entryNav_Anchor = new Template('<ul>#{navi_links}</ul> <a href="javascript:void(0)" class="close" id="#{node_id}">#{close_text}</a>');

function createEntryHeadLinks(node_id) {
	var mode = 3;	// Bit0 = pic-links, Bit1 = Anker-Links
	var navi_html = '';
	var navi_links = '';
	
	var node=getGallery(node_id); //$("ds_gal_"+node_id);
	if (node==null) { 
		mode = 2;
		// return;
	}
	if ($("ds_container_"+node_id).down('a[name="daten"]') != undefined) {
		var first_run=true;
		var txt_cont_index = -1
		
		$("ds_container_"+node_id).down(".c_frame").childElements().each(function( anchor) {
			if (anchor.tagName.toUpperCase() != "A") return;
			
			txt_cont_index++;
			var a_name = anchor.name;
			if (anchor.next(".c_cont_single").down(".c_ds_scroll_frame").childElements().length>1) {
				var name= new String(anchor.name);
				var style= first_run ? "class='sel'" : '';
				first_run=false;
				
				navi_links += tpl_entryNav_Link.evaluate({ 
					anchor: '#'+name, 
					name: name.capitalize(), 
					style: style, 
					txt_index: txt_cont_index, 
					space:"&nbsp;|&nbsp;" 
				});
			}
		});
		var lnsp=navi_links.lastIndexOf("&nbsp;|&nbsp;");
		navi_links=navi_links.substr(0,lnsp) + navi_links.substr(lnsp+13);
	}
	else {
		mode = mode & 1;
	}
	// Pic-Links HTML erzeugen
	if ((mode & 1) == 1) {
		try {
			var pics=$("ds_gal_data_"+node_id).innerHTML.evalJSON(); // node.down("code").innerHTML.evalJSON();
			// Strich-Navi erzeugen
			
			$H(pics).each(function(pic) {
				pic.value.txt = pic.value.txt=="" ? "void" : pic.value.txt;
				navi_html += tpl_gallery_nav.evaluate(pic.value);
			});
		}
		catch(e) {}
	}
	var close_text = (getLangId()>1 ? "close" : "schließen" );
	switch (mode) {
		case 0: case 1: 
			navi_html = tpl_entryNav_Gal.evaluate({ node_id: node_id, gallery_nav: navi_html, close_text: close_text});
			break;
		case 2:
			navi_html = tpl_entryNav_Anchor.evaluate({ node_id: node_id, navi_links: navi_links, close_text: close_text});
			break;
		case 3:
			navi_html = tpl_entryNav_Full.evaluate({ node_id: node_id, navi_links: navi_links, gallery_nav: navi_html, close_text: close_text });
			break;
	}
	
	if ($("Entry_Navi") == null) {
		// erzeugt ein <div id="Entry_Navi" class="cont_navi"> um die Strich-Bildernavigation
		var div=Element.extend(document.createElement("DIV"));
		div.id="Entry_Navi";
		div.className = "cont_navi";
		div.innerHTML=navi_html;
		document.body.appendChild(div);
	}
	else {
		$("Entry_Navi").update(navi_html);
	}
	$("Entry_Navi").down("a.close").observe("click", closeDBEntry);
	
	if (mode > 1) {
		// setzt .sel auf den angeklickten Link..
		$$("#Entry_Navi>ul>li>a").each(function(el){
			el.observe("click",function(ev){
				var el=Event.element(ev);
				if (el.tagName.toUpperCase()!="A") {
					el = el.up("a");
				}
				try {
					el.up(1).down(".sel").removeClassName("sel");
					el.addClassName("sel");
				} catch(e) {}
				if (el.hash!="") {
					_StopEvent(ev);
					var anchor = $(next_ds_container_id).down(el.hash);
					// läßt den Textcontainer nach oben springen
					$(next_ds_container_id).down(".c_frame").setStyle( { top: -anchor.offsetTop+"px" });
					// oder: läßt ihn scrollen ..
					/*new Effect.Tween(null, $(last_ds_container_id).down(".c_frame").offsetTop, -anchor.offsetTop, {duration: 0.5}, 
						function(p) { 
							$(last_ds_container_id).down(".c_frame").setStyle( { top: p+"px" });
						}
					);
					*/
					createDSScroller( parseInt( el.readAttribute("rel").substr(4) ));
				}
			}, true);
		});
	}
	try {
		lightboxInstance.updateImageList();
	}
	catch(e) {}
}

function closeDBEntry(arg) {
	// zu schließenden Container suchen
	var ds_container_id = last_ds_container_id ? last_ds_container_id : next_ds_container_id;
	// ist es der close-Button
	if (typeof arg == "object") {
		var node_id= Event.element(arg).id;
		ds_container_id = "ds_container_"+node_id; 
	}
	if (ds_container_id) {
		$(ds_container_id).up(".c_entry").removeClassName("ds_open");
		$$("#Entry_Navi a").invoke("stopObserving","click");
		// Headlinks (Text/Daten...) entfernen
		$("Entry_Navi").remove();
		// DS-Content schließen
		Effect.BlindUp(ds_container_id, {
			duration: 0.6, 
			afterFinish: function(){
				var sc_content=$("Scroll-Content").down(); // .a_wrapper
				var c_height=sc_content.offsetHeight+sc_content.offsetTop;
				if (c_height < view_height-30) {
					// Falls darunter zuviel Platz ist diesen schließen
					new Effect.Tween(null, sc_content.offsetTop, sc_content.offsetTop+(view_height-c_height)-64, { 
							duration: 0.4,
							afterFinish: function() {
								if (arg!="noTween") {
									createFrameScroller();
								}
							}
						}, 
						function (diff) {
							diff = Math.min(0,diff);
							sc_content.setStyle({top: diff+"px"});
						}
					);
				}
				else if (arg != "noTween") {
					createFrameScroller();
				}
				$$(".a_content")[0].removeClassName("open");
			}
			/*afterUpdate: function(sc_data) {
				var sc_content=$("Scroll-Content").down(); // .a_wrapper
				c_height=sc_content.offsetHeight+sc_content.offsetTop;
				if (c_height < view_height-30) {
					var diff=view_height-c_height;
					diff += sc_content.offsetTop;
					diff = Math.min(0,diff);
					sc_content.setStyle({top: diff+"px"});
				}
			}
			*/
		}); 
		// Ende BlindUp TextContent
		
		// Offene Galerie schließen
		_closeGallery(cur_gal_id);
		
		if (arguments.length==0) {
			var a_wrapper=$$(".a_wrapper")[0];
			var cont_top = _parseInt(a_wrapper.getStyle("top"));
			new Effect.Tween(null, (isNaN(cont_top) ? 0 : cont_top), last_ds_container_pos, {duration: 0.5}, 
				function(p) {
					if (isNaN(p)) return; 
					a_wrapper.setStyle({ top: p+"px"});
				}
			);
		}
		var last_node_id = ds_container_id.substr( ds_container_id.lastIndexOf("_") + 1 );
		last_ds_container_id = false;
		next_ds_container_id = false;
		enableHeadLink( last_node_id );
		createImgTowerScroller();
	}
	else if (arg!="noTween") createFrameScroller(); 
	else _closeGallery();
}

function _closeGallery(gal_id) {
	//var gal_id = gallery.id.split("_").pop();
	if (gal_id==null) {
		gal_id = cur_gal_id;
	}
	var gallery= getGallery( gal_id );
	if($("ds_gal_"+gal_id) != undefined) {
		destroyGalleryScroller(gallery);
		$("ds_gal_"+gal_id).childElements().each(function(el, index) {
			if (el.tagName.toUpperCase()=="A") {
				// SW-Bilder wieder zeigen
				if (el.readAttribute('rel') == null) {
					if (Browser.name=="msie") el.style.filter="alpha(opacity=100)";
					else	el.style.opacity = 1;
					el.show();
				}
				else {
					// Farbbilder entfernen
					el.stopObserving("click");
					el.fade({duration: 0.3, afterFinish:function() {el.remove();}});
				}
			}
			else if (el.tagName.toUpperCase()=="IMG") {
				if (Browser.name=="msie") el.style.filter="alpha(opacity=100)";
				else	el.style.opacity = 1;
				el.show();
			}
		});
		// Hack, eigentlich sollte das Event noch gebunden sein, doch kommt es
		// irgendwie abhanden, also sicher gehen: entfernen und neu zuweisen.
		/*
		var sw_pic_link = $("ds_gal_"+gal_id).down('a');
		if (sw_pic_link) {
			sw_pic_link.stopObserving("click");
			sw_pic_link.observe("click", showDBEntry, true);
		}
		*/
		$("ds_gal_"+gal_id).setStyle({left:"0px"});
		cur_gal_id=false;
	}
	Effect.Appear(gallery.down("img"), {duration: 0.3});
}

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

function loadPage(ev) {
	var el, href, callback = Prototype.K;
		
	if (arguments.length>1) {
		href = ev;
		callback=arguments[1];
	}
	else {
		el=Event.element(ev);
		
		if (el.tagName.toUpperCase() != "A") {
			el=el.up("a");
		}
		_StopEvent(ev);
		
		if (!busy.abort()) {
			return;
		}
		
		href=el.href;
		el.href="javascript:void(2)";
	}
	
	closeDBEntry("noTween");
	destroyFrameScroller();
	
	/*if (next_ds_container_id) {
		var last_node_id = next_ds_container_id.substr( next_ds_container_id.lastIndexOf("_") + 1 );
		disableHeadLink(last_node_id);
	}
	*/
	var a_wrapper = $$(".a_wrapper")[0];
	var fadeOut_fx=new Effect.Fade(a_wrapper, {duration: 0.4});
	var pl_request = new Ajax.Request(href, {
		method: "GET",
		parameters: {no_range: "true"},
		onSuccess: function(data) {
			// Navigation updaten
			if (el) {
				el.href = href;
			}
			//$$(".a_navi")[0].innerHTML = extractContent(data.responseText, ".a_navi");
			var delayed = _doNaviAnimation(extractContent(data.responseText, ".a_navi"));
			
			fadeOut_fx.cancel();
			a_wrapper.setStyle({top: "0px", display:"none", opacity:"1"});
			
			
			var initial_delay = delayed ? 0.4 : 0;
			var total_delay = 0;
			
			a_wrapper.innerHTML = extractContent(data.responseText, ".a_wrapper");

			var dsl_entries = $$(".a_wrapper .c_dsl .c_entry");
			// Abgestuftes Fade-In von DSL-Einträgen
			if (dsl_entries.length>0) {
				dsl_entries.each(function(entry, index) {
					if (entry.offsetTop<view_height) {
						entry.setOpacity(0);
						Effect.Appear(entry, {duration: 0.2, delay: initial_delay + index*0.07, 
							afterFinish:function(fx){ 
								ds_entries_positions[fx.element.id] = parseInt(fx.element.offsetTop);
							}
						});
						if (entry.next(".line")) {
							entry.next(".line").hide();
							Effect.Appear( entry.next(".line"), {duration: 0.2, delay: initial_delay+ index*0.07 + 0.03});
						}
						total_delay = initial_delay + index*0.07;
					}
				});
			}
			else {
				a_wrapper.childElements().each( function(entry, index) {
					if (entry.offsetTop<view_height) {
						/*if (entry.className=="c_dsl") {
							entry.childElements().each( function(dsl_entry, dsl_index) {
								dsl_entry.setOpacity(0);
								Effect.Appear(dsl_entry, {duration: 0.1, delay: initial_delay + (index+dsl_index)*0.05});
							});
							initial_delay += entry.childElements().length*0.05;
						}
						else {
						*/
							entry.setOpacity(0);
							Effect.Appear(entry, {duration: 0.18, delay: initial_delay + index*0.07});
							total_delay = initial_delay + index*0.07;
						//}
					}
				});
			}
			a_wrapper.show();
			
			createFrameScroller.delay(total_delay, true);
			initLinks();
			callback.delay(total_delay);
			busy.deleteTask();
		}
	});
	busy.registerTask(function() {
		pl_request=null;
		delete pl_request;
		if (el) {
			el.href = href;
		}
		return true;
	});	
}
function _doNaviAnimation(new_html) {
	// vergleiche momentane STruktur mit neuer, finde .sel und neue Unterknoten
	var new_nav=Element.extend(document.createElement("div"));
	new_nav.innerHTML=new_html;
	return __findNavDiff($$(".a_navi")[0].down("ul"), new_nav.down("ul"));
}

function __findNavDiff(old_ul, new_ul) {
	new_ul = new_ul.childElements();
	var res=0;
	old_ul.childElements().each(function(old_child, index){
		// CSS-Klassen anpassen
		if (old_child.down("a").className != new_ul[index].down("a").className) {
			old_child.down("a").removeClassName(old_child.down("a").className);
			old_child.down("a").addClassName(new_ul[index].down("a").className);
		}
		// alte Subnavi entfernen
		if (old_child.select("ul").length > 0 && new_ul[index].select("ul").length==0) {
			Effect.BlindUp( old_child.down("ul"), {duration: 0.3, afterFinish:function(fx){ fx.element.remove(); }  });
			res = 1; 
		}
		// beide haben eine Subnavi, also Iteration..
		else if (old_child.select("ul").length > 0 && new_ul[index].select("ul").length>0) {
			res |= __findNavDiff( old_child.down("ul"), new_ul[index].down("ul") );
		}
		// neue Subnavi
		else if (old_child.select("ul").length == 0 && new_ul[index].select("ul").length>0) {
			var sn_id = "subnav_"+Math.random();
			old_child.down("a").insert({after: "<ul id='"+sn_id+"' style='display:none'>"+new_ul[index].down("ul").innerHTML +"</ul>"});
			Effect.BlindDown( sn_id, {duration: 0.3});
			res=true;
		}
	});
	return res;
}


function initLinks(){
	$$(".c_entry h2 a").each( function(h2a) {
		h2a.observe("click", showDBEntry);
		var entry=h2a.up(".c_entry");
		ds_entries_positions[entry.id] = parseInt(entry.offsetTop);
	});
	$$(".a_navi a").each(function(nav_a){
		nav_a.observe("click", loadPage);
	});
	
	observeFrameLinks();

	// Bilder im Tower 
	$$(".a_range .c_entry a").each( function(a_img) {
		a_img.observe("click", showDBEntry);
	});
	// für scroll-handler Positionierung, nachdem ein Eintrag geschlossen wurde
	//ccont_offset_height=$$(".a_wrapper")[0].offsetHeight;
}

function observeFrameLinks() {
	$$(".a_wrapper .pfeil a").each( function(link){
		if (link._observing == undefined) {
			if (link.hash != "" || link.hostname != location.host ) {
				return;
			}
			var link_data = parseAdURL(link.href);
			if (link_data["node_id"].indexOf(".") != -1) {
				link.observe("click", showDBEntry);
			}
			else {
				link.observe("click", loadPage);
			}
			link._observing = true;
		}
	});
}

Event.observe(document, "dom:loaded", initLinks);

var ImageWatcher = Class.create();
ImageWatcher.prototype = {
	initialize: function() {
		this.id = Math.random();
		this.stack = new Array();
		this.pointer=-1;
		this.pics_loaded=0;
		this.picLoadedCallback = this.picLoaded.bind(this);
		this.pe=new PeriodicalExecuter(this.run.bind(this), 0.3);
	},
	run: function() {
		if (this.pointer > -1 && this.stack.length>0 && (this.pics_loaded == this.pointer )) {
			if (this.pointer >= this.stack.length) {
				this.pe.stop();
				return;
			}
			var pic = this.stack[this.pointer];
			if (pic._complete) {
				pic.src=pic._src;
				this.picLoaded();
			}
			else if (pic.src == EMPTY_IMAGE.src) {
				pic.src = pic._src;
			}
			else if (pic.complete && !pic._complete && pic.src != EMPTY_IMAGE.src) {
				this.picLoaded();
			}
		}
	},
	picLoaded: function() {
		var pic = this.stack[this.pointer];
		
		if (pic.viewportOffset()[1] < view_height) {
			Effect.Appear(pic, {from:0.01, to: 1, duration: 0.6});
			//pic.style.display="block";
		}
		else {
			if (Browser.name=="msie") {
				pic.style.filter="alpha(opacity=100)";
			}
			else {
				pic.style.opacity = 1;
			}
		}
		this.pics_loaded++;
		this.pointer++;
		
	},
	addImage: function(img) {
		if (!img.complete) {
			img._src = img.src;
			img.src = EMPTY_IMAGE.src;
			img._complete = false;
		}
		else {
			img._complete=true;
			img._src = img.src;
		}
		//img.style.display="none";
		if (Browser.name=="msie") {
			img.style.filter="alpha(opacity=0.001)";
		}
		else {
			img.style.opacity = 0.001;
		}
		
		
		this.stack.push(img);
		if (this.pointer==-1) 
			this.pointer=0;

	}
};

var dom_image_loader = new ImageWatcher();

Event.observe(document, "dom:loaded", function() {
	$$(".a_range img").each( function(img) {
		dom_image_loader.addImage(img);
	});
	view_width=document.viewport.getWidth();
	view_height=document.viewport.getHeight();
});



