// Javascript Bibliothek
// Copyright MOBOTIX AG, Kaiserslauern
// Autor: Daniel Kabs
// $Id: jslib_dk.js,v 1.15.8.1 2006/04/24 11:34:58 cvs-daniel Exp $
// Einbinden mit <script SRC="./jslib_dk.js"></script>
// Hinweis: Aenderungen an dieser Datei koennen bei eingeschaltetem
//					Browsercaching nicht nicht beim Client ankommen.

// Erzeugen eines grafischen Submitbuttons in einer Tabellenzelle:
// 1. Angabe zweier GIF Dateien gleicher Abmessungen als Vordergrund:
//    - vollständig transparentes GIF
//    - GIF mit Auswahlrahmen
//	submitbutton_mouseout("player_empty32x20.gif");
//	submitbutton_mouseover("player_frame32x20.gif");
// 2. Anlegen eines Buttons
//	var a=new submitbutton("start");
//	a.setBackground("player_play.gif");
//	a.setText("Play!");
//	a.onclick=function () {alert("Play Button pressed");};
//	a.write();
// Achtung: Alle GIFs muessen die gleichen Abmessungen haben!
// Sonstiges: [Ent]sperren eines Buttons mittels a.[un]lock() Methode.

// Erzeugen eines grafischen Selectbuttons in einer Tabellenzelle
//   var c=new selectbutton("story");
//   c.setVar("testvar");  // Wert der Variable wird vom Button gesetzt
//   c.addValue(300);
//   c.addBackground("player_story_only.gif");
//   c.addText("Show this event only!");
//   c.addValue(100);
//   c.addOnclick(function () {alert("switching from only to story")});
//   c.addBackground("player_story_show.gif");
//   c.addText("Show event story!");
//   c.addValue(200);
//   c.addOnclick(function () {alert("story to hide")});
//   c.addBackground("player_story_hide.gif");
//   c.addText("Show events without story!");
//   c.addOnclick(function () {alert("hide to only")});
//   c.onclick=function() { alert("var:"+testvar) ;};
//   var testvar=1;
//   c.write();
// Hinweis: anders als im Beispiel oben
//          entweder .addOnclick() ODER .addValue() ODER .onclick verwenden!
// Hinweis: Für jede Auswahlmöglichkeit müssen die gleichen
//          ".add*" Funktionen aufgerufen werden!
// Setzen auf Einen Zustand (0.. Anzahl der Hintergrundbilder - 1):
//   c.setButtonState(0);
// Hinweis: Beim Auslesen der Variable muß sie mittels parseInt zu
//          Integer konvertiert werden, falls sie nicht von Javascript
//          als String behandelt werden soll (Hint: "+" Operator)

// sonstige Funktionen
// 	show_props(obj)
// 	Ausgabe der Eigenschaften eines Objekts

// Debugmodus hier aktivieren  
if (location.href.match(/debug_on$/))
	debug_on=1;
// CSS Stylesheets Definitionen einbinden
document.write('<style type="text/css">');
document.writeln('.libdkrel{position:relative}');
document.write('<\/style>');
// Browser Version ermittlen
var resultNE=0;
if ( navigator.appName.match(/Netscape/) ) 
	resultNE=parseInt(navigator.appVersion);
var isMac = (navigator.platform.substr(0,3) == 'Mac');
var resultie=navigator.appVersion.match(/MSIE +(\d)/);
if ((resultie!=null) && parseInt(resultie[1])<5)
	resultie=4;
else if (resultie!=null)
  resultie=parseInt(resultie[1]);
else
	resultie=0;
var resultCSS=0;
if (resultNE == 4) {
	document.write('<div id=csstest style="position:absolute"></div>');
	resultCSS=document.layers["csstest"]?1:0;
} else if (document.all || document.getElementById )
	resultCSS=1;

// Aufrufen, bevor CSS unter NE verwendet wird.
function NE_cssalert() {
	if (resultNE ==4 && resultCSS==0)
		alert(resultNE+"Netscape Users: This page does not work unless stylesheets are enabled!\nIn Preferences, open Advanced category and check Enable Style Sheets.");
}			 
function show_props(obj,st)  {
//alert(obj+":"+arguments.length);
	if (typeof obj=="undefined" && arguments.length==0)
		var obj=this;
	if (typeof st=="undefined")
		var st="";
	else 
		st+=" ->";
	if (st.length >4 )
		return st+" ...\n";
	var prop_i=null;
	var str=(arguments.length==0)?"this\n":"";
	for (prop_i in obj) {
		var prop_val=obj[prop_i];
//		alert(arguments.length+"  "+obj+":"+st+":"+prop_i);
		switch (typeof obj[prop_i]) {
		  case 'function': 
					str+=st+"Func "+prop_i+"()\n"; 
					break;
			case 'object':
					str+=st+"Obj "+prop_i+"[]\n"+show_props(obj[prop_i],st);
					break;
			case 'string':
					str+=st+typeof obj[prop_i]+" "+prop_i+"='"+prop_val+"'\n";
					break;
			default:
				str+=st+typeof obj[prop_i]+" "+prop_i+"="+prop_val+"\n";
		}
	}
  if (arguments.length!=2) {
		var a_win=window.open();
		var a_doc=a_win.document;
		a_doc.open();
		a_doc.write('<pre>');
		a_doc.write(str);
		a_doc.write('<\/pre>');
		a_doc.close();
	}	else
		return str;
}

// Objekt "submitbutton"
function submitbutton (name) {
	// interne Buchhaltung
	this._counter=submitbutton.Counter++;
  // Eigenschaften "public"
	this.onclick=null;
	this.onmousedown=null;
	this.onmouseup=null;
	this.onmouseover=null;
	this.onmouseout=null;
	// Eigenschaften "private"
	this.name=name || "unnamed";
	this._onclick=null;  //interne Funktion (siehe selectbutton)
	// Vom Benutzer (über Funktionen) zu setzen 
	this._background_src="";
	this._text=""; // Text des ALT Tags
	this._a_href=""; // evtl. Link Ziel
	this._locked=0; // Schalter deaktiviert?
	// Interne Namen
	debugmsg("submit constructor of "+name+" #"+this._counter);
	this._td_name="submitbutton_bg_"+this._counter;
	this._a_name="submitbutton_a_"+this._counter;
	this._img_name="submitbutton_fg_"+this._counter;
	// Objektreferenzen
	this._td_obj=null; 		// Referenz auf Tabellenzelle (-> Hintergrund)
	this._a_obj=null;  		// Referenz auf Link (-> Events)
	this._img_obj=null;		// Referenz auf Bild (-> Vordergrund)
	// Funktionen
	this.debug=show_props;
	this.addimgbuffer=button_addimgbuffer;
	this.write=button_write;
	this.getHtml=button_html;
	this.update=button_update;
	this.setBackground=function (src) { this._background_src=src;};
	this.setText=function (str) { this._text=str;};
	this.setHref=function (str) { this._a_href=str;};
	this.lock=function() {this._locked=1;};
	this.unlock=function() {this._locked=0;};
}
// Prototypen-Eigenschaften
submitbutton.prototype._emptysrc="";
submitbutton.prototype._framesrc="";
submitbutton.prototype._width=-1;
submitbutton.prototype._height=-1;
submitbutton.prototype._class="libdkrel";
// User kann Prototyp Eigenschaften ueber folg. Funktionen aendern
function submitbutton_mouseover(src) {
	submitbutton.prototype._framesrc=src;
// Preloading einsetzen
	submitbutton.buffer1=new Image();
	submitbutton.buffer1.src=src;
}
function submitbutton_mouseout(src) {
	submitbutton.prototype._emptysrc=src;
}
function submitbutton_size(x,y) {
	submitbutton.prototype._width=x;
	submitbutton.prototype._height=y;
}
// Class Variable
submitbutton.Counter=1;
submitbutton.img_array=new Array();
function button_addimgbuffer (name){
	// Preloading von Hintergrundbildern
	var img=submitbutton.img_array[submitbutton.img_array.length]=new Image();
	img.src=name;
	debugmsg("addimgbuffer():"+img.src);
	return img.src;
}

function button_html () {
// Zusammenbasteln der HTML Repräsentation des Buttons
// IE: Zelle mit Hintergrundbild enthält Rahmen als Vordergrund
//     Events nur ueber Handler
// NE: Zelle wird zum Layer mit Hintergrundbild
//		 In der Zelle ist ein Link mit Verweis und Eventhandlern
//     plus Bild, das aber wg. NE Bug nicht adressiert werden kann.
  var str="";
	var quoted_text=this._text.replace(/"/,'&quot;');
	str+='<td ID="'+this._td_name+'" title="'+quoted_text+'"';
	if (this._width>0)
		str+=' width='+this._width;
	if (this._height>0)
		str+=' height='+this._height;
	if (resultNE == 4) // Fuer NE: Layer erzeugen
		str+=' class="'+this._class+'"';
	str+=' background="'+this._background_src+'">';
	if (resultNE == 4) { // Fuer NE: Link erzeugen
		str+='<a ID="'+this._a_name+'"';
		if (this._a_href=="")
			str+=' href="javascript:void 0;" >';
		else	
			str+=' href="'+this._a_href+'" >';
	}
	str+='<img name="'+this._img_name+'" ID="'+this._img_name+'" src="'+this._emptysrc+'"';
	if (this._width>0)
		str+=' width='+this._width;
	if (this._height>0)
		str+=' height='+this._height;
	str+=' border=0 alt="'+quoted_text+'">';
	if (resultNE == 4) // Fuer NE: Link (beenden)
		str+='<\/a>';
	str+='<\/td>';
 	return str;
}
function button_update() {
// Erneuern der Darstellung des Buttons bzgl.
// Background/Text
	debugmsg("update("+this.name+") bg:"+this._background_src+" style:"+this._td_obj.style);
	if (this._td_obj.style) 
		this._td_obj.style.backgroundImage='url('+this._background_src+')';
	else
		this._td_obj.background.src=this._background_src;
	if (this._img_obj)
		this._img_obj.alt=this._text;
	if (this._td_obj)
		this._td_obj.title=this._text;
}
function button_write() {
// Ausgabe des Buttons und setzen der Event Handler
  var str=this.getHtml();
	document.write(str);
	// Referenzen abspeichern
	if (document.all) {
		this._td_obj=document.all[this._td_name]; 		// Zelle
		this._a_obj=this._td_obj;   				// Zelle (Obj fuer Handler)
		this._img_obj=document.all[this._img_name];		// Bild
	} else if (document.getElementById) {
		this._td_obj=document.getElementById(this._td_name); 		// Zelle
		this._a_obj=this._td_obj;   				// Zelle (Element fuer Handler)
		this._img_obj=document.getElementById(this._img_name);		// Bild	
	} else if (document.layers) {
		this._td_obj=document.layers[this._td_name]; // nur Layer
		this._a_obj=this._td_obj.document.links[0]; // Link (im Layer)
		// NE Bug: Kein Zugriff auf Bild in Layer in verschachtelten Tabellen
		if (this._td_obj.document.images.length > 0) 
			this._img_obj=this._td_obj.document.images[0];	
		else
			this._img_obj=null; 		
	}
	debugmsg("write "+this._a_name+": td="+this._td_obj+" a="+this._td_obj+" img="+this._img_obj);
	// Events des anchors setzen
	this._a_obj.ref=this; // Im Link: Referenz auf Button-Objekt speichern
	// Mouseover Effekt
	if (this._img_obj) // Vordergrundbild kann bei NE fehlen
		this._a_obj.onmouseover=function () { var obj=this.ref;
				 																	if (obj._locked == 1)
																						return false;
																			  obj._img_obj.src=obj._framesrc;
																				if (obj.onmouseover)
																					obj.onmouseover()
																				if (window.event)
																					window.event.cancelBubble=true;
																			}
	if (this._img_obj) // Vordergrundbild kann bei NE fehlen
		this._a_obj.onmouseout=function () {  var obj=this.ref; 
																				if (obj._locked == 1)
																					return false;
																			 	obj._img_obj.src=obj._emptysrc;
																				if (obj.onmouseout)
																					obj.onmouseout()
																				if (window.event)
																					window.event.cancelBubble=true;
																			}
  // Mousedown/Up - Handler
	this._a_obj.onmousedown=function (evt){ var obj=this.ref;
																					debugmsg("onmousedown():"+obj.onmousedown);
																					if (obj.onmousedown)
																						obj.onmousedown((window.event)?window.event:evt)
																					if (window.event)
																						window.event.cancelBubble=true;
																				}
	this._a_obj.onmouseup=function ()   { var obj=this.ref;
																			debugmsg("onmouseup() "+obj.onmouseup);
																				if (obj.onmouseup)
																					obj.onmouseup()
																				if (window.event)
																					window.event.cancelBubble=true;
																			}
//	if (this.onclick || this._onclick) immer ausführen wg. href
	this._a_obj.onclick=function () {
		var obj=this.ref;
		debugmsg("onclick ID="+this.id+" -> obj="+obj.name+" locked="+obj._locked);
		if (obj._locked == 1)
			return false;
		if (obj._onclick)
			obj._onclick(); 	// intern genutzte Fkt. (siehe selectbutton)
		if (obj.onclick) {	// User Fkt.
			if (resultNE == 4)
// Ne BUG: Ausführung mancher Funktionen (->go_one()) ist fehlerhaft, 
// wenn die Funktion aus dem onclick Handler heraus direkt aufgerufen wird.
				setTimeout(obj.onclick,100); 	
			else
				obj.onclick();
		}
		if (window.event)
			window.event.cancelBubble=true;
		if (obj._a_href!="") { // Link simulieren
			location.href=obj._a_href;
			return false;
		}
	}
}
// Ende Objekt "submitbutton"

// Objekt "selectbutton"
function selectbutton(name) {
	var self = this; // make this available to inner functions
	this._counter=selectbutton.Counter++;
	this.name = name || "unnamed";
	var updateSelectButtonToSelectedState = function() {
		self.setBackground(self._background_src_array[self._selected]);
		if (self._text_array[self._selected]) {
			self.setText(self._text_array[self._selected]);
		}
		if (self._var != "") {
			debugmsg("eval! set " + self._var + " to " + self._value_array[self._selected]);
			eval("window."+self._var+"='"+self._value_array[self._selected]+"';");
		}
		self.update();
	};
	this._onclick=function () {
		// switch to next button state
		if (this._onclick_array[this._selected]) {
			var handler_ret = this._onclick_array[this._selected]();
			if (typeof handler_ret != "undefined" &&
					handler_ret == false) {
					return;
			}
		}
		this.setButtonState(++this._selected);
	};
	this.setButtonState = function (nr) {
		if (nr >= this._background_src_array.length) {
			nr = 0;
		}
		this._selected = nr;
		updateSelectButtonToSelectedState();
	};
	this._selected=0; // ausgewählte Option
	// Vom Benutzer (über Funktionen) zu setzen 
	this._var="";
	this._value_array=new Array();
	this._background_src_array=new Array();
	this._text_array=new Array(); // Text des ALT Tags
	this._onclick_array=new Array(); // Onclick Funktionen
	// Interne Namen
	debugmsg("select constructor of "+name+" #"+this._counter);
	this._td_name="selectbutton_bg_"+this._counter;
	this._a_name="selectbutton_a_"+this._counter;
	this._img_name="selectbutton_fg_"+this._counter;
	// Funktionen
	this.setVar=function (str) { this._var=str;};
	this.addValue=function (val) {  this._value_array[this._value_array.length]=val; };
	this.addBackground=function (str) {
		str = this.addimgbuffer(str);
		if (this._background_src_array.length == 0)
			this.setBackground(str);
		this._background_src_array[this._background_src_array.length]=str; 
	}
	this.addText=function (str) {
		if (this._text_array.length == 0)
			this.setText(str);
		this._text_array[this._text_array.length]=str;
	}
	this.addOnclick=function (ptr) {
		this._onclick_array[this._onclick_array.length]=ptr;
	}
	this._oldwrite=this.write;
	this.write=function() {
		var az=this._background_src_array.length;
		if (this._text_array.length>0 &&
				 this._text_array.length != az){
				 alert("Select "+this.name+": # of alt texts wrong."+
								"\n Expecting "+az);
				 return;
			}
		 if (this._onclick_array.length>0 &&
				 this._onclick_array.length != az){
				 alert("Select "+this.name+": # of onclick functions wrong."+
								"\n Expecting "+az);
				 return;
			}
		if (this._var != "") {
			if (this._value_array.length != az){
				 alert("Select "+this.name+": # of values wrong."+
								"\n Expecting "+az);
				 return;
				} else
				eval("window."+this._var+"='"+this._value_array[this._selected]+"';");
		}
		this._oldwrite(); 
	};
}
// Klassenvariable
selectbutton.Counter=1;
// Vererbung aktivieren: selectbutton ist Unterklasse von submitbutton
selectbutton.prototype=new submitbutton();
// Ende Objekt "selectbutton"

// Debug Fenster
if (window.debug_on) {
	debug_winh = window.open('','mxDebug','width=370,height=320,scrollbars=yes,resizable=yes');
	debug_doc = debug_winh.document;
	debug_doc.open();
	debug_doc.write('<HTML><HEAD>');
	debug_doc.write('<STYLE type="text/css">');
	debug_doc.write('body{font-size:100%;font-family:Helvetica,Arial,sans-serif;} ');
	debug_doc.write('pre{font-size:8pt;}');
	debug_doc.write('<\/STYLE>');
	debug_doc.write('<TITLE>debug<\/TITLE>');
	debug_doc.write('<\/HEAD><BODY>');
	debug_doc.write('<pre>');
	debug_doc.writeln('resultNE='+resultNE+" resultie="+resultie+" resultCSS="+resultCSS+" isMac="+isMac);
	debug_winh.focus();
}
/*
window.printfire = function () {
	if (document.createEvent) {
		printfire.args = arguments;
		var ev = document.createEvent("Events");
		ev.initEvent("printfire", false, true);
		dispatchEvent(ev);
	}
}
*/

