/**************************
 * EventHandling          *
 *                        * 
 * requires: tg_common.js *
 *************************/

var lastFocusField = null;
var eventHandlers = $H();

/**
 * Fügt einem Element einen Eventhandler hinzu
 * 
 * field: ID des Elements oder das Element selbst
 * eventName: Name des Events
 * handler: Die zu registrierende Handlerfunktion
 */
function addEventHandler(field, eventName, handler) {
	Event.observe($(field), eventName, handler);
	
	if(!eventHandlers[$(field).id]) {
		eventHandlers[$(field).id] = $H();
	}
	
	if(!eventHandlers[$(field).id][eventName]) {
		eventHandlers[$(field).id][eventName] = new Array();
	}
	
	eventHandlers[$(field).id][eventName].push(handler);
}

/**
 * Entfernt alle mit addEventHandler hinzugefügten Handler von einem Element
 * 
 * field: ID des Elements oder das Element selbst
 */
function removeAllEventHandlers(field) {
	if(!eventHandlers[$(field).id]) {
		return;
	}

	eventHandlers[$(field).id].keys().each(function(eventName) {
		eventHandlers[$(field).id][eventName].each(function(handler) {
			Event.stopObserving($(field), eventName, handler);
			eventHandlers[$(field).id][eventName] = eventHandlers[$(field).id][eventName].without(handler);
		});
	});
}

/**
 * Entfernt alle mit eddEventHandler hinzugefügten Handler für eine bestimmes Event.
 * 
 * field: ID des Elements oder das Element selbst
 * eventName: Name des Events
 */
function removeEventHandlers(field, eventName) {
	if(!eventHandlers[$(field).id]) {
		return;
	}
	
	if(!eventHandlers[$(field).id][eventName]) {
		return;
	}
	
	eventHandlers[$(field).id][eventName].each(function(handler) {
		Event.stopObserving($(field), eventName, handler);
	});
}

/**
 * Allgemeine Eventhandler Funktionen
 */
var eventHandlerFunctions = {
	
	// Focus: Feldinhalt markieren
	onFocus: function(event) {
		$(Event.element(event).id).select();
	},
	
	// Keydown: merken
	onKeydown: function(event) {
		lastFocusField = $(Event.element(event).id);
	},
	
	// Keyup: auf Zahl prüfen, ins näcshte Feld springen, ggf. Livesuche 
	onKeyup: function(event, jumpToField) {
		
		var field = $(Event.element(event).id);
		
        //alert(event.keyCode);
        
        if(field != lastFocusField) {
            return false;
        }
        
        // Wenn kein Buchstabe/Zahl gedrückt, ignorieren
        if(!(  (event.keyCode >= 48 && event.keyCode <= 57) 
            || (event.keyCode >= 96 && event.keyCode <= 105)
            || (event.keyCode >= 65 && event.keyCode <= 90) 
            || (event.keyCode == 32))) {
            
            return true;
        }
        
		// Feld ist Zahl?
		if(!checkFieldIsNumber(field) || $F(field).strip() == '') {
			field.style.backgroundColor = '#B62026';
			field.focus();
			field.value = '';
			return false;
		}
		
		field.style.backgroundColor = 'white';

		var nextFieldId = '';
		if(jumpToField) {
			if($(jumpToField)) {
				nextFieldId = $(jumpToField).id;
			}
			
		} else {
			// Nächstes Feld aufgrund des Namens bestimmen
			// (funtioniert z.Zt. nur für (nicht-Lastminute-)-Bestellungen
			var id_split = field.id.split('_');
			if(id_split[0] != 'bestellung') {
				alert('Wrong field id: ' + field.id);
				return false;
			}
			
			var bestellNum = parseInt(id_split[1]);
			var prefix     = 'bestellung_' + bestellNum;
			var what       = id_split[2];

			switch(what) {
				// Aktuelles Feld ist Kartenanzahl
				case 'anzahl':
					anz    = parseInt(id_split[3]);
					anzNum = parseInt(id_split[4]);
					
					// Wenn Feld 1, einfach zum n�chsten Ziffernfeld
					if(anzNum == 1) {
						nextFieldId = prefix + '_anzahl_' + anz + '_2';
					} else {
						// Wenn 'Anzahl Mitglieder' -> 'Anzahl G�ste'
						if(anz == 1 || anz == 3) {
							nextFieldId = prefix + '_anzahl_' + (anz + 1)  + '_1';
						} else {
							switch(anz) {
								// 'Anzahl G�ste 1' -> 'Bestellnummer 1'
								case 2:
									nextFieldId = prefix + '_ausweich_0_bestnr_1';
									break;
								// 'Anzahl G�ste 2 ("mit Mitglied gehen")' -> 'Email von Mitglied
								case 4:
									nextFieldId = prefix + '_email';
									break;
							}
						}
					}
					break;
					
				// Mitgliedsnr
				case 'mglnr':
					fieldNum = parseInt(id_split[3]);
					
					// N�chsts Ziffernfeld
					if(fieldNum < 5) {
						nextFieldId = prefix + '_mglnr_' + (fieldNum + 1);
					} 
					// 'Anzahl 3'
					else {
						nextFieldId = prefix + '_anzahl_3_1';
					}
					break;
					
				// Ausweichnr -> Wir sind in einer Bestellzeile
				case 'ausweich':
					var ausweichNum = parseInt(id_split[3]);
					var what2       = id_split[4];
					
					switch(what2) {
						// Feld ist Bestellnr
						case 'bestnr':
							var fieldNum = parseInt(id_split[5]);
							
							// -> n�chstes Ziffernfeld
							if(fieldNum < 4) {
								nextFieldId = prefix + '_ausweich_' + ausweichNum + '_bestnr_' + (fieldNum + 1);
							} 
							// -> Spielst�tte, au�erdem noch die Livesuche triggern
							else {
								nextFieldId = prefix + '_ausweich_' + ausweichNum + '_spielstaette';
								liveSearch(bestellNum, ausweichNum);
							}
							
							break;
					}
					break;
			}
		}
		
		// N�chstes Feld fokussieren
		if(nextFieldId != 'NOJUMP' && nextFieldId != '' && $(nextFieldId) && !$(nextFieldId).disabled) {
			$(nextFieldId).focus();
		}
	}
};

/**
 * Response Handler
 */
var responseHandlerFunctions = {
	
	onComplete: function(requester, request, response) {
		if(response.error) {
			if(response.error_message) {
				alert(response.error_message);
			}
			
			switch(parseInt(response.error)) {
				case 302:
					redirect(baseUrl + response.location);
					break;
			}
		}
		
	}
	
};
