/* +++++++++++++++++ Ausblenden von Elementen die mit registerElementForHide() registriert wurden +++++++++++++ */

//speichert alle Fenster mit den dazugehörigen Elementen die ausgeblendet werden sollen
var hide_windows = new Array();

var hide_debug = false;
var hide_debug_check = true;

/*
*	Container-Klasse: Speichert alle zu einem Fenster zugeordneten Elemente die versteckt werden sollen,
*	wenn diese mit einem anderen Fenster überdeckt werden.
*	
*	@param 	nr : Fenster nr (clientarea_5) => 5
*		win: das übergeordnete window Objekt z.B. top oder top.IF_2
*/
function HideWindow(nr, win) {

	this.nr = nr; 
	this.win = win;
	this.hide_elements = new Array();
	var z;

	// ein Element zu dem Fenster hinzufügen
	this.addElement = function(id) {
		var select, pos, size;

		select = document.getElementById(id);

		pos = hFindPos(select);

		size = hGetElementSize(select);

		if (this.win == top) {
			z = select.style.zIndex;
		} else {
			var win_id = window.name.slice(window.name.length-1, window.name.length);

			if (top.dd.elements["clientarea_"+win_id]) {
				z = top.dd.elements["clientarea_"+win_id].z;
			}
		}

		this.hide_elements[this.hide_elements.length] = new HideElement(id, pos.left, pos.top, z, size.width, size.height, this.win);
	}

	// gibt den z-index zurück
	this.getZ = function() {
		if (this.win == top) {
			return z;
		} else {
			return top.dd.elements["clientarea_"+this.nr].z;
		}
	}

	// alle elemente die zu diesem fenster gehören anzeigen
	this.showAll = function() {
		for (var i=0; i<this.hide_elements.length; i++) {
			this.hide_elements[i].show();
		}
	}

	// alle elemente in diesem fenster von frames verstecken
	this.hideElementsBy = function(frames) {

		if (frames) {

			for (var i=0; i < this.hide_elements.length; i++) {
				
				for (var x=0; x < frames.length; x++) {
					var element = document.getElementById(this.hide_elements[i].id);				

					if (this.hide_elements[i].parent_window == top.IF_2) { // padding für den iframe beachten
						var padding_top = 5;
						var padding_left = 10;

						// x - intervalle
						var i1_start = hFindPos(element).left + top.dd.elements["clientarea_2"].x + padding_left;
						var i1_end = i1_start + this.hide_elements[i].width;

						var i2_start = frames[x].x;
						var i2_end = i2_start + frames[x].w;

						// y - intervalle
						var i3_start = hFindPos(element).top + top.dd.elements["clientarea_2"].y + padding_top;
						var i3_end = i3_start + this.hide_elements[i].height;

						var i4_start = frames[x].y;
						var i4_end = i4_start + frames[x].h;
					} else {
						// x - intervalle
						var i1_start = hFindPos(element).left ;
						var i1_end = i1_start + this.hide_elements[i].width;

						var i2_start = frames[x].x;
						var i2_end = i2_start + frames[x].w;

						// y - intervalle
						var i3_start = hFindPos(element).top;
						var i3_end = i3_start + this.hide_elements[i].height;

						var i4_start = frames[x].y;
						var i4_end = i4_start + frames[x].h;
					}

					//wenn sich die intervalle überschneiden, verstecke das entsprechende Element
					if (hIntersect(i1_start, i1_end, i2_start, i2_end) && hIntersect(i3_start, i3_end, i4_start, i4_end)) {
						this.hide_elements[i].hideBy(frames[x].name);
					} else {
						this.hide_elements[i].showBy(frames[x].name);
					}
				}
			}
		}
	}
}

/*
*	Element das versteckt wird
*/
function HideElement(id, x, y, z, width, height, parent_window) {
	this.id = id;
	this.x = x;
	this.y = y;
	this.z = z;
	this.height = height;
	this.width = width;
	this.parent_window = parent_window;

	this.hidden = false;
	this.hidden_by = new Array();

	// Element verstecken
	this.hideBy = function(id) {
		this.hidden_by[this.hidden_by.length] = id;
		this.hide();
	}
	
	// Element wieder sichtbar machen (kann nur von der id wider sichtbar gemacht werden,
	// von der es auch versteckt wurde)
	this.showBy = function(id) {

		 for (var i=0; i < this.hidden_by.length; i++) {
			 if (this.hidden_by[i] != null && this.hidden_by[i] == id) {
				this.hidden_by[i] = null;
			 }
		 }

		this.hidden = false;

		this.hidden = this.isHidden();	

		if (!this.hidden)
			this.show();
	}

	// brute force sichtbar machen, egal ob das element noch verdeckt wird
	this.show=function() {
		document.getElementById(this.id).style.visibility = 'visible';
		this.hidden_by = new Array();
	}

	// verstecken
	this.hide=function() {
		this.hidden = true;
		document.getElementById(this.id).style.visibility = 'hidden';
        }

	// ist das element versteckt?
	this.isHidden=function() {
		for (var i=0; i < this.hidden_by.length; i++) {
			if (this.hidden_by[i] != null) return true;
		}
		return false;
	}
}


function hIsIE7() {
	return false;
	//return window.clipboardData && document.compatMode && window.XMLHttpRequest;
}


function hRegisterAllSelects() {
	var selects;

	if (selects = document.getElementsByTagName("select")) {
		for (var i=0; i<selects.length; i++) {
			if (selects[i].id != "") {
				registerElementForHide(selects[i].id);
			} else if (selects[i].name != ""){
				selects[i].id = selects[i].name;
				registerElementForHide(selects[i].id);
			}
		}
	}
}

// ein Element für das Verstecken registrieren
function registerElementForHide(id) {
	if (window == top) {
		win_id = 0;
	} else {
		win_id = Number(window.name.slice(window.name.length-1, window.name.length));
	}

	if (hide_windows[win_id]) {
		hide_windows[win_id].addElement(id);
	} else {
		var new_win = new HideWindow(win_id, window);

		new_win.addElement(id);

		hide_windows[win_id] = new_win;
	}
}

// wird aufgerufen, wenn ein Fenster bewegt wird
function hHideElementsOnMove() {

	var win_id;

	if (top.dd.ie && !hIsIE7() && top.dd.obj != null) {
		var frames = hGetFrameProps(top.dd.obj.name);

		win_id = Number(top.dd.obj.name.slice(top.dd.obj.name.length-1, top.dd.obj.name.length));

		if (hide_windows[win_id]) { // wenn das Fenster bewegt wird sollen alle  
					    // Elemente die in diesem versteckt sind wieder sichtbar gemacht werden
			hide_windows[win_id].showAll();
		} 

		if (frames) {
			for (var i=0; i<hide_windows.length; i++) {
				if (hide_windows[i] && i != win_id) {
					hide_windows[i].hideElementsBy(frames);
				}
			}
		}
	}
}


// alle registrierten Elemente verstecken, die verdeckt werden
function hInitAll() {
	
	if (top.dd.ie && !hIsIE7()) {
		
		var frames = new Array();

		for (var z=0; z<hide_windows.length; z++) {

			if (hide_windows[z]) {

				hide_windows[z].showAll();

				for (var i=0; i < top.dd.elements.length; i++) {

					if (top.dd.elements[i] && top.dd.elements[i].visible && top.dd.elements[i].z > hide_windows[z].getZ()) {
						var new_frames = hGetFrameProps(top.dd.elements[i].name);

						if (new_frames != null) {
							for (var x=0; x<new_frames.length; frames[frames.length] = new_frames[x++]); 
						}
					} 
				}

				hide_windows[z].hideElementsBy(frames);
			}
		}
	}
}

/*
*	Liefert die Eigenschaften der Fenster (Abmessungen, Position)
*	diese werden für hideElementBy() benötigt
*
*/
function hGetFrameProps(name) {

	var props = new Array();

	if (name.match(/cont\d_title/)) { //Menu

		for (var i=0; i < top.menu_active_card.length; i++) {

			if (top.menu_active_card[i] && top.menu_active_card[i] != -1) {
				var prop = new Object();
				
				var title = "cont"+top.menu_active_card[i]+"_title";
				var content = "cont"+top.menu_active_card[i]+"_content";
				var footer = "cont"+top.menu_active_card[i]+"_footer";

				if (i == 0) { //TOP-MENU
					prop.x = top.dd.elements[title].x;
					prop.y = top.dd.elements[title].y;
					prop.w = top.dd.elements[title].w;
					prop.h = top.dd.elements[title].h + top.dd.elements[content].h + top.dd.elements[footer].h;

					prop.name = title;

					props[props.length] = prop;
				} else { //andere Menu-Cards
					prop.x = top.dd.elements[content].x;
					prop.y = top.dd.elements[content].y;
					prop.w = top.dd.elements[content].w;
					prop.h = top.dd.elements[content].h + top.dd.elements[footer].h;

					prop.name = content;

					props[props.length] = prop;
				}
			}
		}

		return props;

	} else if (name.match(/menu_footer_title/)) { //footer menu
		var prop = new Object();
		prop.x = top.dd.elements[name].x;
		prop.y = top.dd.elements[name].y;
		prop.w = top.dd.elements[name].w;
		prop.h = top.dd.elements["menu_footer_title"].h + top.dd.elements["menu_footer_footer"].h;

		prop.name = "menu_footer_title";

		props[props.length] = prop;

		return props;

	} else if (name.match(/menu_infokasten_title/)) { //info kasten
		var prop = new Object();
		prop.x = top.dd.elements[name].x;
		prop.y = top.dd.elements[name].y;
		prop.w = top.dd.elements[name].w;
		prop.h = top.dd.elements["menu_infokasten_title"].h + top.dd.elements["menu_infokasten_content"].h + top.dd.elements["menu_infokasten_footer"].h;

		prop.name = "menu_infokasten_title";

		props[props.length] = prop;

		return props;

	} else if (name.match(/titlebar_\d/)) { //sonstige Fenster
		var id = name.slice(name.length-1, name.length); //name=frame_1
		
		var prop = new Object();

		prop.x = top.dd.elements["frame_"+id].x;
		prop.y = top.dd.elements["frame_"+id].y;
		prop.w = top.dd.elements["frame_"+id].w;
		prop.h = top.dd.elements["frame_"+id].h;

		prop.name = "frame_"+id;

		props[props.length] = prop;

		return props;
	}

	return null;
}

/*
*	Überschneiden sich die durch start und end definierten Intervalle?
*/
function hIntersect(start1, end1, start2, end2) {

	if (start1 < start2 && end1 > end2 ) {  // intervall2 komplett in intervall1
		return true;
	} else if (start1 > start2 && end1 < end2) { //intervall1 komplett in intervall2
		return true;
	} else if (start1  <= start2 && start2 < end1 && end1 < end2) { // intervall2 überlappt intervall1 rechts
		return true;
	} else if (start2 < start1 && end2 > start1 && end2 <= end1) { // intervall2 überlappt intervall1 links
		return true;
	}

	return false;
}


function hGetElementSize(obj) {
	var size = new Object;

	size.width = obj.offsetWidth;
	size.height = obj.offsetHeight;

	return size;
}


function hFindPos(obj) {
  var pos = new Object;

  var text = "";

  pos.left = 0;
  pos.top = 0;
	if (obj.offsetParent)	{
		while (obj.offsetParent) {
		  pos.left += obj.offsetLeft;
			pos.top  += obj.offsetTop;

			obj = obj.offsetParent;
		};
	}	else if (obj.x) {
	  pos.left = obj.x;
	  pos.top = obj.y;
	};

	return pos;
}

