////////////////////////////////////////////////////////////////////////////////
// Simon Wunderlin [simon@wunderlin.net]
// 26.10.2000
//
// Version info:
//   28.11.2000/sw
//   added new properties to oEvent: pageX, pageY, screenX, screenY
//
// Known problems:
//   - MSIE 4.0 SP/WinNT does not support capturing of Mouse-Buttons
//

var oEvent = new Object();
////////////////////////////////////////////////////////////////////////////////
// EVENT HANDLING FOR NN 4+ and IE 4+
//
// Diese librariy funktioniert nur in IE 4+ und NN 4+, da das Eventhaldling 
// in IE 3 (JScrit 1.0) noch nicht implemntiert war. Netscape 3 unterstuetzt
// bereits eventcapturing, jedoch erst NN 3.04 versteht JavaScript 1.2, 
// deshalb wird dieses Script auch erst ab NN 3.04 unterstuetzt!
//
// Wenn ein event abgefangen wird (kann mit switch<EventName> = true
// eingeschaltet werden) wird ein neues Objekt angelegt. Dies ist 
// noetig, da IE und NN verschiedene eventobjekte haben. 
//
// oEvent:
// 
// PROPERTIES
// oEvent.o          : objekt, welches den Event ausgeloest hat
// oEvent.type       : string, typ des events (siehe weiter unten)
// oEvent.button     : int,    0=default, 1=links, 2=mitte, (3=rechts)
// oEvent.keyCode    : int,    ASCII keycode der gedrueckten taste
// oEvent.keyLetter  : char,   Zeichen, dass gedrueckt wurde
// oEvent.keyAlt     : bool,   alt Taste
// oEvent.keyControl : bool,   control Taste
// oEvent.keyShift   : bool,   Shift Taste
// oEvent.pageX      : int,    X-position vom ausloesenden objekt, die 
//                             koordinaten sind immer absolut zu dokument
//                             und nicht zum Fenster!
// oEvent.pageY      : int,    Y-position vom ausloesenden objekt
// oEvent.screenX    : int,    X-position vom ausloesenden objekt zum bildschirmrand
// oEvent.screenY    : int,    Y-position vom ausloesenden objekt zum bildschirmrand
//
// METHODS
// oEvent.focus()    : void,   setzt den focus auf das ausloesende element
// oEvent.clear()    : void,   setzt value auf '', wenn das objekt ein 
//                             Formular-Elemt ist
// oEvent.submit()   : void,   uebermittelt das Formular, welches den event
//                             ausloeste (oder eines dessen elemente)
// oEvent.enter()    : bool,   true wenn letzte Taste enter war, sonst false
//
//
// Event typen (case-sensitive!):
//

// mouse Events 
var switchClick     = false;    var switchDblClick  = false;
var switchMouseDown = false;    var switchMouseUp   = false;
var switchMouseOut  = false;    var switchMouseMove = false;
var switchMouseOver = false;

//key events 
var switchKeyDown   = false;    var switchKeyUp     = false;
var switchKeyPress  = false;
	
// window events 
var switchAbort     = false;    var switchLoad      = false;
var switchResize    = false;    var switchUnload    = false;
	
// other 
var switchBlur      = false;    var switchChange    = false;
var switchDragDrop  = false;    var switchError     = false;
var switchFocus     = false;    var switchMove      = false;
var switchReset     = false;    var switchSelect    = false;
var switchSubmit    = false;

//------------------------------------------------------------------------------



////////////////////////////////////////////////////////////////////////////////
// Da das event Objekt in IE und NN verschieden sind, wird hier ein eigenes,
// einheitliches Event Objekt zusammen getrickt.
//
function initEventObject(e) {
	oEvent.keyAlt     = false;
	oEvent.keyControl = false;
	oEvent.keyShift   = false;
	oEvent.keyLetter  = false;

	if ( document.all ) { // IE 4+
		oEvent.o =        window.event.srcElement; // Object which caused event
		oEvent.type =     window.event.type;       // Event type
		oEvent.button =   window.event.button;     // mouse button
		oEvent.keyCode =  window.event.keyCode;    // ASCII key code
		
		oEvent.keyAlt     = window.event.altKey;
		oEvent.keyControl = window.event.ctrlKey;
		oEvent.keyShift   = window.event.shiftKey;

		oEvent.pageX      = window.event.clientX + document.body.scrollLeft;
		oEvent.pageY      = window.event.clientY + document.body.scrollTop;
		oEvent.screenX    = window.event.screenX;
		oEvent.screenY    = window.event.screenY;

	} else { // NN 4+
		oEvent.o =        e.target;                // Object which caused event
		oEvent.type =     e.type;                  // Event type
		
		if ( oEvent.type == 'mousedown' || oEvent.type == 'mousemove' || 
		     oEvent.type == 'mouseout'  || oEvent.type == 'mouseover' || 
		     oEvent.type == 'mouseup'   || oEvent.type == 'click' ) {
			oEvent.button  =  e.which;               // mouse button
			oEvent.keyCode =  0;                     // ASCII key code
		} else {
			oEvent.button  =  0;                     // mouse button
			oEvent.keyCode =  e.which;               // ASCII key code
		}
		if ( e.modifiers == 1 ) { oEvent.keyAlt     = true; }
		if ( e.modifiers == 2 ) { oEvent.keyControl = true; }
		if ( e.modifiers == 4 ) { oEvent.keyShift   = true; }
		
		oEvent.pageX     = e.pageX;
		oEvent.pageY     = e.pageY;
		oEvent.screenX   = e.screenX;
		oEvent.screenY   = e.screenY;
	}
	
	oEvent.keyLetter= String.fromCharCode(oEvent.keyCode); // Zeichen

	// fire the function for this event
	eval( 'EV' + oEvent.type + '()' );
	
}


// eventcapturing initialisieren

function initEvent() {
	// mouse Events
	if (switchClick)     { document.onclick     = initEventObject; }
	if (switchDblClick)  { document.ondblclick  = initEventObject; }
	if (switchMouseDown) { document.onmousedown = initEventObject; }
	if (switchMouseUp)   { document.onmouseup   = initEventObject; }
	if (switchMouseOut)  { document.onmouseout  = initEventObject; }
	if (switchMouseMove) { document.onmousemove = initEventObject; }
	if (switchMouseOver) { document.onmouseover = initEventObject; }

	//key events 
	if (switchKeyDown)   { document.onkeydown   = initEventObject; }
	if (switchKeyUp)     { document.onkeyup     = initEventObject; }
	if (switchKeyPress)  { document.onkeypress  = initEventObject; }
	
	// window events 
	if (switchAbort)     { document.onabort     = initEventObject; }
	if (switchLoad)      { document.onload      = initEventObject; }
	if (switchResize)    { document.onresize    = initEventObject; }
	if (switchUnload)    { document.onunload    = initEventObject; }
	
	// other 
	if (switchBlur)      { document.onblur      = initEventObject; }
	if (switchChange)    { document.onchange    = initEventObject; }
	if (switchDragDrop)  { document.ondragdrop  = initEventObject; }
	if (switchError)     { document.onerror     = initEventObject; }
	if (switchFocus)     { document.onfocus     = initEventObject; }
	if (switchMove)      { document.onmove      = initEventObject; }
	if (switchReset)     { document.onreset     = initEventObject; }
	if (switchSelect)    { document.onselect    = initEventObject; }
	if (switchSubmit)    { document.onsubmit    = initEventObject; }


	if ( !document.all ) { // NN only 
		// mouse Events
		if (switchClick)     { document.captureEvents(Event.CLICK); }
		if (switchDblClick)  { document.captureEvents(Event.DBLCLICK); }
		if (switchMouseDown) { document.captureEvents(Event.MOUSEDOWN); }
		if (switchMouseUp)   { document.captureEvents(Event.MOUSEUP); }
		if (switchMouseOut)  { document.captureEvents(Event.MOUSEOUT); }
		if (switchMouseMove) { document.captureEvents(Event.MOUSEMOVE); }
		if (switchMouseOver) { document.captureEvents(Event.MOUSEOVER); }

		//key events 
		if (switchKeyDown)   { document.captureEvents(Event.KEYDOWN); }
		if (switchKeyUp)     { document.captureEvents(Event.KEYUP); }
		if (switchKeyPress)  { document.captureEvents(Event.KEYPRESS); }
		
		// window events 
		if (switchAbort)     { document.captureEvents(Event.ABORT); }
		if (switchLoad)      { document.captureEvents(Event.LOAD); }
		if (switchResize)    { document.captureEvents(Event.RESIZE); }
		if (switchUnload)    { document.captureEvents(Event.UNLOAD); }
		
		// other 
		if (switchBlur)      { document.captureEvents(Event.BLUR); }
		if (switchChange)    { document.captureEvents(Event.CHANGE); }
		if (switchDragDrop)  { document.captureEvents(Event.DRAGDROP); }
		if (switchError)     { document.captureEvents(Event.ERROR); }
		if (switchFocus)     { document.captureEvents(Event.FOCUS); }
		if (switchMove)      { document.captureEvents(Event.MOVE); }
		if (switchReset)     { document.captureEvents(Event.RESET); }
		if (switchSelect)    { document.captureEvents(Event.SELECT); }
		if (switchSubmit)    { document.captureEvents(Event.SUBMIT); }
	}
}


// prototype functions of oEvent ///////////////////////////////////////////////
function __focus() {
	this.o.focus();
}

function __focusNext( step ) {
	if ( !step )
		step = 1;

	if ( this.o.form ) { 
		ix = -1;
		ix = __findCurrentElement( this.o );
		if ( ix > -1 ) {
			if ( this.o.form.elements[ix+step]) {
				this.o.form.elements[ix+step].focus();
			}
		} else {
			return false;
		}
	
	} else if ( this.o.href ) { 
		oNext = this.o.href; 
	} else { 
		return false; 
	}
	
	/*name = this.o.name;
	myself = __findCurrentElement( oNext, name );
	if ( oNext[ myself+1 ] && myself ) {
		oNext[ myself+1 ].focus();
	} */
	
}

function __findCurrentElement( o ) {
	// find the position of the current element in o.form or or o.href 
	// array.
	i=0;
	while ( o.form.elements[i] ) {
		if ( o.form.elements[i].name == o.name ) {
			return i;
		}
		i++;
	} 
	return false;
}

/*
function __focusNext() {
}
*/

function __clear() {
	if ( this.o.value ) 
		this.o.value = '';
}

function __submit() {
	if ( this.o.form ) 
		this.o.form.submit();
}

function __enter() {
	if ( this.keyCode == 13 || this.keyCode == 10 )
		return true;
	else 
		return false;
}

////////////////////////////////////////////////////////////////////////////////
// assignt prototype funxtions as methods to oEvent
//

oEvent.focus      = __focus;
oEvent.clear      = __clear;
oEvent.submit     = __submit;
oEvent.enter      = __enter;
oEvent.focusNext  = __focusNext;


