var Fenster = Class.create();
Fenster.prototype = {
	initialize: function(ausgabe, id, url, hoehe)
	{
		this.ausgabe = $(ausgabe);
		this.fenster = id;
		this.url = url;
		this.anzeige = true;
		this.hoehe = hoehe;
		    
		this.container = document.createElement('div');
		this.container.className = 'fenster';
		this.container.id = this.fenster;
		
		var closeContainer = document.createElement('div');
		closeContainer.className = 'fensterSchliessen';
		closeContainer.id = this.fenster + 's';
		
		var closeContainerImage = document.createElement('img');
		closeContainerImage.src = 'images/x.png';
		closeContainer.appendChild(closeContainerImage);
		
		var indicator = document.createElement('div');
		indicator.className = 'fensterLaden';
		indicator.id = this.fenster + 'i';
		
		var indicatorImage = document.createElement('img');
		indicatorImage.src = 'images/indicator.gif';
		indicator.appendChild(indicatorImage);
		
		var content = document.createElement('div');
		content.className = 'fensterInhalt';
		content.id = this.fenster + 'c';
		
		var track = document.createElement('div');
		track.className = 'track';
		track.id = this.fenster + 't';
		
		var handle = document.createElement('div');
		handle.className = 'handle';
		handle.id = this.fenster + 'h';		
		track.appendChild(handle);
				
		this.container.appendChild(closeContainer);
		this.container.appendChild(indicator);
		this.container.appendChild(track);
		this.container.appendChild(content);
		
		this.ausgabe.appendChild(this.container);
	},
	
	holeURL: function()
	{
		return this.url;
	},
	
	setzePosition: function(i, breite)
	{                                      
		var abstand = (i+1) * 40;
		var track = this.fenster + 't';
		var inhalt = this.fenster + 'c';
		$(this.fenster).setStyle({
			left: abstand,
			top: abstand,
			width: breite,
			height: this.hoehe
		});
		var breite = breite - 2 * parseInt($(track).getStyle("right")) - parseInt($(track).getStyle("width"))
		$(inhalt).setStyle({
 			width: breite
		});
		var hoehe = this.hoehe - parseInt($(track).getStyle("top"));
		$(track).setStyle({
			height: hoehe  
		});
		$(track).hide(); 	
	},

	setzeUeberlagerung: function(z)
	{
		$(this.fenster).setStyle({
			zIndex: z
		});		
	},
	
	setzeAnzeige: function(anzeige)
	{              
		if(anzeige == true)
		{
			$(this.fenster).show();
			this.setzeTransparenz(1.0);
		}
		else
		{
			$(this.fenster).hide(); 
		}
		this.anzeige = anzeige;
	},
	
	setzeTransparenz: function(t)
	{
		if(this.anzeige == true && $(this.fenster).getOpacity() != t)
		{
			new Effect.Opacity(this.fenster, {
				duration: 0.5,
				from: $(this.fenster).getOpacity() || 0.0,
				to: t
			});
		}
	},
	
	slide: function(v)
	{  
		var inhalt = this.id + 'c';
		var oben = - v * ($(inhalt).offsetHeight - this.hoehe);
		$(inhalt).setStyle({
			top: oben  
		});
	},
	
	render: function()
	{
		var id = this.fenster + 'i';
		var handle = this.fenster + 'h';
		var track = this.fenster + 't';
		var inhalt = this.fenster + 'c';
		var height = this.hoehe;
		var fenster = this.fenster;
		var slide = this.slide;                                                     		
		new Ajax.Updater(this.fenster + 'c', this.url, { evalScripts: true,
			onComplete: function(request) {
				$(id).hide();
				if($(inhalt).offsetHeight > height)
				{    
					$(track).show();
					var slider = new Control.Slider(handle, track, {
						axis: 'vertical',
						hoehe: height,
						id: fenster,
						onSlide: slide,
						onChange: slide 
					});
					
					function wheel(e)
					{  
						var delta = 0;
						var faktor = ($(inhalt).offsetHeight / height) * 500;
						if(!e)
						{
							e = window.event;
						}
						if(e.wheelDelta)
						{
							delta = e.wheelDelta / faktor; 
						}
						if(window.opera)
						{
							delta = -delta;
						}
						else if(e.detail)
						{
							delta = (-e.detail * 12) / faktor;
						}
						if(delta)
						{
							slider.setValueBy(-delta);
						}
						if(e.preventDefault)
						{
							e.preventDefault();
						}
						e.returnValue = false; 
					}
						
					Event.observe(fenster, "mousewheel", wheel);
					Event.observe(fenster, "DOMMouseScroll", wheel);
				}
			}
		});	
		new Draggable(this.fenster, {starteffect: null, endeffect: null, snap: function(x,y,draggable) { function constrain(n, lower, upper) { if (n > upper) return upper; else if (n < lower) return lower; else return n; } element_dimensions = Element.getDimensions(draggable.element); parent_dimensions = Element.getDimensions(draggable.element.parentNode); return[constrain(x, 0, parent_dimensions.width - element_dimensions.width), constrain(y, 0, parent_dimensions.height - element_dimensions.height)]; }});   
	}
};

var Fensterverwaltung = Class.create();
Fensterverwaltung.prototype = {
	initialize: function(ausgabe, hoehe)
	{
		this.ausgabe = ausgabe;
		this.fenster = new Array();
		this.id = 0;
		this.zindex = 0;
		this.hoehe = hoehe;   	
	},
	
	neu: function(url, breite)
	{           
		this.id++;
		var neu = true;
		this.fenster.each(function(f)
		{
	   		f.setzeTransparenz(0.1); 
   		});
        var setzeUeberlagerung = this.setzeUeberlagerung;
		var aktiv;
		this.fenster.each(function(f, index)
		{
			if(f.holeURL() == url)
			{                          
				f.setzeAnzeige(true);
				aktiv = index;             
				neu = false;
			}					
		});
		if(aktiv)
		{  
			this.auswaehlen(null, aktiv);
		}
		if(neu == true)
		{              
			var id = "fenster" + this.id; 
			this.aktiv = this.fenster.length;                                                                    
			this.fenster[this.aktiv] = new Fenster(this.ausgabe, id, url, this.hoehe);
			this.fenster[this.aktiv].setzePosition(this.aktiv, breite);
			this.fenster[this.aktiv].render();
			this.auswaehlen(null, this.aktiv);
			Event.observe(id + "s", 'click', this.entfernen.bindAsEventListener(this, this.aktiv));
			Event.observe(id, 'mousedown', this.auswaehlen.bindAsEventListener(this, this.aktiv));
		}                            
	},
	
	auswaehlen: function(obj, id)
	{   
		if(this.aktiv != id)
		{
			this.fenster[this.aktiv].setzeTransparenz(0.1);
			this.aktiv = id;
		}
		this.fenster[id].setzeTransparenz(1.0);
		this.setzeUeberlagerung(id);  	
	},
	
	setzeUeberlagerung: function(id)
	{    
		this.zindex++;
		this.fenster[id].setzeUeberlagerung(this.zindex);
	},
	
	entfernen: function(obj, id)
	{
		this.fenster[id].setzeAnzeige(false);
	} 
};
