﻿/*

	20.09.2008, dogan

	©2008 Tanyel Dogan, alle Rechte vorbehalten

*/

function cms4d_get_scroll_offset()
{
	var o = new Object();
	o.sx = 0;
	o.sy = 0;

	var sx = 0;
	var sy = 0;
	if(typeof(window.pageYOffset) == 'number')
	{
		//Netscape kompatibel
		sx = window.pageXOffset;
		sy = window.pageYOffset;
	}
	else if(document.body && (document.body.scrollLeft || document.body.scrollTop))
	{
		//Firefox u.ä. DOM kompatible, IE6+ im Normalmodus
		sx = document.body.scrollLeft;
		sy = document.body.scrollTop;
	}
	else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
	{
		//IE6+ im Kompatibilitätsmodus
		sx = document.documentElement.scrollLeft;
		sy = document.documentElement.scrollTop;
	}

	o.sx = sx;
	o.sy = sy;
	return(o);
}

function cms4d_get_client_size()
{
	var o = new Object();
	o.w = 1;
	o.h = 1;

	var cw = 0;
	var ch = 0;
	if(typeof(window.innerWidth) == 'number')
	{
		//alle ausser IE
		cw = window.innerWidth;
		ch = window.innerHeight;
	}
	else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
	{
		//IE 6 und höher, Kompatibilitätsmodus
		cw = document.documentElement.clientWidth;
		ch = document.documentElement.clientHeight;
	}
	else if(document.body && (document.body.clientWidth || document.body.clientHeight))
	{
		//IE 4 o. höher, nicht im Kompatibilitätsmodus
		cw = document.body.clientWidth;
		ch = document.body.clientHeight;
	}

	o.w = cw;
	o.h = ch;
	return(o);
}


function cms4d_edit_onpage(mtype, mdlid, idx, act)
{
	if(top.Cms4dModulEditOnPage)
	{
		top.Cms4dModulEditOnPage(mtype, mdlid, idx, act);
	}
	else
	{
		alert('Die Bearbeitungsfunktion ist in diesem Kontext nicht verfügbar.');
	}
}


//Crossbrowser Event-Bubbling verhindern
function cms4d_cancel_bubble(p_event)
{
	try
	{
		if(window.event)
		{
			//IE, OPERA, Safari
			event.cancelBubble = true;
		}
		else
		{
			//Firefox, Netscape, andere
			if(p_event.stopPropagation)p_event.stopPropagation();
		}
	}
	catch(e){}
}

/*=== automatisierte Zoomfunktion ====*/
var cms4d_zoom_navcursor = 0;
var cms4d_zoom_loader_image_src = Cms4dGlobals.arps + 'css/icons/cms4d-zoom-loader-image-anim-1-1.gif';
function cms4d_zoom(imgcounter, imgid, p_event)
{
	if(! document.documentElement)return;
	if(imgid == undefined || imgid == null || isNaN(imgid))return;

	//Fortlaufenden Zähler des Bildes merken, mit dem das Zoomfenster geöffnet wurde.
	//Dies dient als aktuelle Cursorposition für die Navigation über die Pfeiltasten (s.u.)
	cms4d_zoom_navcursor = imgcounter;

	var imgsrc = 'image.aspx?id=' + imgid + '&size=3';

	//ScrollOffset der Seite
	var soff = cms4d_get_scroll_offset();
	var sx = soff.sx;
	var sy = soff.sy;

	//Sicherstellen, dass nur GENAU 1 Zielcontainer im DOM vorhanden ist
	var wc = document.getElementById('cms4d_zoom_window_container');
	if(wc != null)
	{
		wc.parentNode.removeChild(wc);
	}

	wc = document.createElement('div');
	wc.id = 'cms4d_zoom_window_container';
	wc.className = 'cms4d_zoom_window_container';
	with(wc.style)
	{
		left = sx + 'px';
		top = sy + 'px';
		position = 'absolute';
		width = '100%';
		height = '100%';
	}

	var t = '';
	t += '<table border="0" cellpadding="0" cellspacing="0">\n';
		t += '<tr>\n';
			t += '<td><div id="cms4d_zoom_window_but_prev" class="cms4d_zoom_window_but_prev" onclick="cms4d_cancel_bubble(event);cms4d_zoom_navigate(-1);"></div></td>\n';
			t += '<td>&nbsp;</td>\n';
			t += '<td><div id="cms4d_zoom_window_but_next" class="cms4d_zoom_window_but_next" onclick="cms4d_cancel_bubble(event);cms4d_zoom_navigate(1);"></div></td>\n';
		t += '</tr>\n';
	t += '</table>\n';
	var nav_str = t;

	//Tabelle, um alles in Clientbereich zu zentrieren
	//Wird hierauf geklickt, so wird das Fenster geschlossen. Dies entspricht einem Contextmenu.
	t = '';
	t += '<table id="cms4d_zoom_window_container_table" onclick="cms4d_zoom_close();" class="cms4d_zoom_window_container_table" border="0" cellpadding="0" cellspacing="0">\n';
		t += '<tr>\n'
			t += '<td align="center" valign="middle">';

	//Tabelle für ggf. äusseren Schmuckrand.  KEINE CSS-width/height angeben wg. NS7 !
	//BEACHTE: hier wird das onclick-Event gestoppt, damit nicht jeder Click im inneren Fenster
	//sofort die Zoomfunktion schliesst.
	t += '<table onclick="cms4d_cancel_bubble(event);" class="cms4d_zoom_window_outer_table" border="0" cellpadding="0" cellspacing="0">\n';
		t += '<tr>\n'
			t += '<td class="cms4d_zoom_window_outer_cell">';


				//Tabelle mit Inhalten. KEINE CSS-width/height angeben
				t += '<table class="cms4d_zoom_window_content_table" border="0" cellpadding="0" cellspacing="0">\n';
					t += '<tr>\n'
						t += '<td>';
							//AHTUNG: für Firefox muss die Tabelle 100% gesetzt haben. S. css
							t += '<table class="cms4d_zoom_window_controls_table" border="0" cellpadding="2" cellspacing="0">\n';
								t += '<tr>\n';
									t += '<td width="1%">';
										//Um während dem Ladevorgang das Ladeschleifenbild anzuzeigen wird
										//hier folgende Vorgehensweise gewählt.
										//Leider feuert Opera kein zuverlässiges onload-Event, wenn das Bild mit
										//display:none oder visibility:hidden unsichtbar gemacht wird.
										//Ein Umschalten der display-Eigenschaft kann also hier nicht verwendet werden.
										//Deshalb wird hier ein Hilfsbild
										//eingesetzt, in das die gewünschte Bildquelle vorgeladen wird und das
										//mit visibility:hidden unsichttbar gesetzt ist. Das sichtbare Zoombild
										//erhält die Quelle des animierten Ladeschleifenbildes und behält diese solange,
										//bis die gewünschte Bildquelle vorgeladen wurde.
										//Das Vorladebild feuert dann immer das onload-Event.
										//Im Handler wird in der Folge die gecachte Quelle auf das
										//sichtbare Zoombild übertragen (s.u.).
										//Das Vorladebild hat 0px x 1px Grösse (s. css).
										t += '<img id="cms4d_zoom_window_zoom_preloaderimage" class="cms4d_zoom_window_zoom_preloaderimage" src="' + imgsrc + '" onload="cms4d_zoom_image_onload(this);"/>';
									t += '</td>\n';
									t += '<td width="99%" align="center">';
										t += nav_str;
									t += '</td>\n';
									t += '<td width="1%">';
										t += '<div class="cms4d_zoom_window_but_close" onclick="cms4d_zoom_close();" title="close"></div>';
									t += '</td>\n';
								t += '</tr>\n';
							t += '</table>\n';
						t += '</td>\n';
					t += '</tr>\n';
					t += '<tr>\n';
						t += '<td class="cms4d_zoom_window_content_td" align="center" valign="middle">\n';
							t += '<div id="cms4d_zoom_window_content" class="cms4d_zoom_window_content">';
								t += '<img id="cms4d_zoom_window_zoom_image" class="cms4d_zoom_window_zoom_image" src="' + cms4d_zoom_loader_image_src + '" onclick="cms4d_zoom_close();" alt="close" title="close"/>';
							t += '</div>\n';
						t += '</td>\n';
					t += '</tr>\n';
				t += '</table>\n';

			//Ende outer_table
			t += '</td>\n';
		t += '</tr>\n';
	t += '</table>\n';


			//Ende container_table
			t += '</td>\n';
		t += '</tr>\n';
	t += '</table>\n';

	wc.innerHTML = t;

	document.body.appendChild(wc);

	//Container positionieren
	cms4d_zoom_pos_container();

	//Funktion für Tastaturabfrage und Scrollen/Fenstervergrösserung registieren.
	//Werden beim Schliessen wieder deregistriert (s.u.).
	if(Cms4dDocumentEventControl != null)
	{
		Cms4dDocumentEventControl.add_event('keydown', 'cms4d_zoom_onkeydown', cms4d_zoom_keycheck);
	}
}
function cms4d_zoom_image_onload(preloaderimage)
{
	//gecachte Bildquelle auf sichtbares Zoombild übertragen.
	//BEACHTE: Opera feuert leider beim Navigieren trotzdem ein Onload-Event, auch wenn
	//das Bild nicht geladen werden kann. Dann zeigt der Browser das standardmässige Fehler-Icon an.
	var myimage = document.getElementById('cms4d_zoom_window_zoom_image');
	if(myimage != null)
	{
		myimage.src = preloaderimage.src;
	}
	cms4d_zoom_pos_container();
}
function cms4d_zoom_pos_container()
{
	if(! document.documentElement)return;
	var wc = document.getElementById('cms4d_zoom_window_container');
	if(wc == null)return;
	var zwct = document.getElementById('cms4d_zoom_window_container_table');
	if(zwct == null)return;

	//Innenraum Seite
	var cs = cms4d_get_client_size();
	var csw = cs.w;
	var csh = cs.h;

	//ScrollOffset der Seite
	var soff = cms4d_get_scroll_offset();
	var sx = soff.sx;
	var sy = soff.sy;

	//Für IE6 auch Höhe der beiden Container explizit setzen, da 100% dort nur wirkt, wenn
	//auch HTML und BODY in CSS heigh:100% gesetzt sind.
	with(wc.style)
	{
		left = sx + 'px';
		top = sy + 'px';
		height = csh + 'px';
	}

	with(zwct.style)
	{
		height = csh + 'px';
	}
}
function cms4d_zoom_close()
{
	//Handler deregistrieren
	if(Cms4dDocumentEventControl != null)
	{
		Cms4dDocumentEventControl.remove_event('keydown', 'cms4d_zoom_onkeydown', cms4d_zoom_keycheck);
	}

	cms4d_zoom_navcursor = 0;

	var wcbg = document.getElementById('cms4d_zoom_window_background');
	if(wcbg != null)
	{
		wcbg.parentNode.removeChild(wcbg);
	}

	var wc = document.getElementById('cms4d_zoom_window_container');
	if(wc != null)
	{
		wc.parentNode.removeChild(wc);
	}
}

function cms4d_zoom_navigate(d)
{
	if(! document.documentElement)return;

	var target_img = document.getElementById('cms4d_zoom_window_zoom_image');
	if(target_img == null)return;

	//Liste aller IDs der CMS Zoombilder dieser Seite
	var idlist = new Array();
	for(var i = 0; i < document.images.length; i++)
	{
		var myimg = document.images[i];
		var i_id = myimg.id;
		if(i_id.indexOf('cms4dzoomimg_') != -1)
		{
			var sa = i_id.split('_');
			if(sa.length == 3)
			{
				var imgid = sa[2];
				if(! isNaN(imgid))
				{
					idlist.push(parseInt(imgid, 10));
				}
			}
		}
	}
	var idmax = idlist.length - 1;

	//Zoombild erhält wieder die Quelle des Ladenschleifenbildes
	target_img.src = cms4d_zoom_loader_image_src;


	//Cursor verschieben und nächstes zu ladendes Bild ermitteln
	cms4d_zoom_navcursor += d;
	if(cms4d_zoom_navcursor < 0)cms4d_zoom_navcursor = idmax;
	if(cms4d_zoom_navcursor > idmax)cms4d_zoom_navcursor = 0;
	var nextid = idlist[cms4d_zoom_navcursor];
	var nextsrc = 'image.aspx?id=' + nextid + '&size=3';
	//Vorladdebild neue Quelle zuweisen
	var preloaderimage = document.getElementById('cms4d_zoom_window_zoom_preloaderimage');
	if(preloaderimage != null)preloaderimage.src = nextsrc;
}

function cms4d_zoom_keycheck(org_event, event_object)
{
	var wc = document.getElementById('cms4d_zoom_window_container');
	if(wc == null)return;

	if(event_object == null)return;
	if(event_object.key_code == null)return;
	var kc = event_object.key_code;

	//Schliessen bei ESCAPE
	if(kc == 27)cms4d_zoom_close();

	//blättern mit Pfeiltasten, wenn es sich um eine Galerie handelt.
	if(kc == 37)
	{
		cms4d_zoom_navigate(-1);
	}
	else if(kc == 39)
	{
		cms4d_zoom_navigate(1);
	}
}


//======================
function cms4d_form_check_maxlength(obj, lmax)
{
	var oid = obj.id;

	//Versuchen einen Kontroll-DIV auszugeben.
	//Ist dieser schon einmal hinzugefügt worden, dann wird er weiter verwendet.
	var mydiv = null;
	if(oid != null && document.documentElement)
	{
		var mydiv_id = oid + '_cms4d_form_check_status';
		var mydiv = document.getElementById(mydiv_id);
		if(mydiv == null)
		{
			pnode = obj.parentNode;
			mydiv = pnode.insertBefore(document.createElement('div'), obj);
			mydiv.id = mydiv_id;
		}
	}

	var v = obj.value;
	var l = v.length;
	if(l > lmax)
	{
		var new_v = v.substr(0, lmax);
		obj.value = new_v;

		l = lmax;
	}

	if(mydiv != null)
	{
		var scolor = 'black';
		var objbgcolor = 'transparent';
		if(l >= lmax)
		{
			scolor = 'red';
			objbgcolor = 'rgb(255,240,240)';
		}
		with(mydiv.style)
		{
			color = scolor;
			fontWeight = 'bold';
		}
		with(obj.style)
		{
			backgroundColor = objbgcolor;
		}

		var t = '';
		t += l + '/' + lmax;
		mydiv.innerHTML = t;
	}
}






//==============================


function cms4d_document_event_object()
{
	this.eobj = null;
	this.etype = null;
	this.key_code = null;
	this.src_element = null;
	this.toString = function()
	{
		var t = '';
		t += 'eobj: ' + this.eobj + '\n';
		t += 'etype: ' + this.etype + '\n';
		t += 'key_code: ' + this.key_code + '\n';
		t += 'src_element: ' + this.src_element + '\n';
		return(t);
	}
}
function cms4d_document_event_handler()
{
	this.last_event = null;

	this.add_event = function(ename, fn_key, fn)
	{
		var hkey = ename + '_handlers';
		var hlist = this[hkey];
		if(hlist == undefined || hlist == null)
		{
			this[hkey] = new Object();
			hlist = this[hkey];
		}
		hlist[fn_key] = fn;
	}
	this.remove_event = function(ename, fn_key)
	{
		try
		{
			var hkey = ename + '_handlers';
			var hlist = this[hkey];
			hlist[fn_key] = undefined;
		}
		catch(e)
		{
		}
	}

	this.do_events = function(evnt)
	{
		var o = Cms4dDocumentEventControl;
		try
		{
			if(window.event)
			{
				o.last_event = new cms4d_document_event_object();
				o.last_event.eobj = window.event;
				o.last_event.etype = window.event.type.toLowerCase();
				o.last_event.key_code = window.event.keyCode;
				o.last_event.src_element = window.event.srcElement;
			}
			else if(evnt != undefined)
			{
				o.last_event = new cms4d_document_event_object();
				o.last_event.eobj = evnt;
				o.last_event.etype = evnt.type.toLowerCase();
				o.last_event.key_code = evnt.which;
				o.last_event.src_element = evnt.target;
			}

			if(o.last_event != null)
			{
				try
				{
					var hkey = o.last_event.etype + '_handlers';
					if(hkey != undefined && hkey != null)
					{
						var hlist = o[hkey];
						for(var i in hlist)
						{
							var fn = hlist[i];
							if(fn != undefined)fn(o.last_event.eobj, o.last_event);
						}
					}
				}
				catch(e)
				{
				}
			}
		}
		catch(e)
		{
		}
	}
}
var Cms4dDocumentEventControl = new cms4d_document_event_handler();


document.onkeydown = Cms4dDocumentEventControl.do_events;
window.onscroll = Cms4dDocumentEventControl.do_events;
window.onresize = Cms4dDocumentEventControl.do_events;


/*==============================================*/
