/* Globale Variablen */
		
var wCalendar1;			// YAHOO calendar widget 1
var wCalendar2;			// YAHOO calendar widget 2
var	dCalendar1;			// container calendar 1
var dCalendar2;			// container calendar 2
var itDatumVon;			// input text f. DatumVon
var itDatumBis;			// input text f. DatumBis
var itPLZVon;			// input text f. PLZVon
var itPLZBis;			// input text f. PLZBis
var ihDatumVon;			// input hidden f. DatumVon
var ihDatumBis;			// input hidden f. DatumBis
var spErrDatumVon;		// error message f. datumVon
var spErrDatumBis;		// error message f. datumBis
var spErrTimeRange;		// error message f. TimeRange
var spErrPLZVon;		// error message f. PLZVon
var slT1gruppe;			// turnier 1 gruppe
var slT1klasse;			// turnier 1 klasse
var slT1turnierart;		// turnier 1 turnierart
var slT2gruppe;			// turnier 1 gruppe
var slT2klasse;			// turnier 1 klasse
var slT2turnierart;		// turnier 1 turnierart
var irConjunction;		// and search
var irDisjunction;		// or search

var icTBW;
var icBayern;
var icBerlin;
var icLTVBr;
var icBremen;
var icHATV;
var icHTV;
var icTMV;
var icTNW;
var icNTV;
var icTRP;
var icSLT;
var icTVS;
var icTVSA;
var icTSH;
var icTTSV;

var icKat1;
var icKat2;
var icKat3;
var icKat4;
var icKat5;
var icKat6;
var icKat7;

var ltvs;
var kats;

var bDatumVonValid = true;
var bDatumBisValid = true;
var bCheckTimeRange = true;

function ge(id) {
	return document.getElementById(id);
}

function dateFromString(input,separator,year,month,day) {
	var a = input.split(separator);
	var d = new Date();
	d.setYear(Number(a[year]));
	d.setMonth(Number(a[month])-1,Number(a[day]));
	d.setHours(0);
	d.setMinutes(0);
	d.setSeconds(0);
	d.setMilliseconds(0);
	return d;
}

function init() {
	initGlobalVars();
	initCalendars();
	initComponents();
}

function initGlobalVars() {
	dCalendar1 = ge("dCalendar1");
	dCalendar2 = ge("dCalendar2");	
	itDatumVon = ge("itDatumVon");
	itDatumBis = ge("itDatumBis");
	itPLZVon = ge("itPLZVon");
	itPLZBis = ge("itPLZBis");
	ihDatumVon = ge("ihDatumVon");
	ihDatumBis = ge("ihDatumBis");
	spErrDatumVon = ge("spErrDatumVon");
	spErrDatumBis = ge("spErrDatumBis");
	spErrTimeRange = ge("spErrTimeRange");
	spErrPLZVon = ge("spErrPLZVon");
	slT1gruppe = ge("slT1gruppe");
	slT1klasse = ge("slT1klasse");
	slT1turnierart = ge("slT1turnierart");
	slT2gruppe = ge("slT2gruppe");
	slT2klasse = ge("slT2klasse");
	slT2turnierart = ge("slT2turnierart");
	icExtendedSearch = ge("icExtendedSearch");
	irConjunction = ge("irConjunction");
	irDisjunction = ge("irDisjunction");
	icTBW = ge("icTBW");
	icBayern = ge("icBayern");
	icBerlin = ge("icBerlin");
	icLTVBr = ge("icLTVBr");
	icBremen = ge("icBremen");
	icHATV = ge("icHATV");
	icHTV = ge("icHTV");
	icTMV = ge("icTMV");
	icTNW = ge("icTNW");
	icNTV = ge("icNTV");
	icTRP = ge("icTRP");
	icSLT = ge("icSLT");
	icTVS = ge("icTVS");
	icTVSA = ge("icTVSA");
	icTSH = ge("icTSH");
	icTTSV = ge("icTTSV");
	
	icKat1 = ge("icKat1");
	icKat2 = ge("icKat2");
	icKat3 = ge("icKat3");
	icKat4 = ge("icKat4");
	icKat5 = ge("icKat5");
	icKat6 = ge("icKat6");
	icKat7 = ge("icKat7");

	ltvs = new Array(icTBW,icBayern,icBerlin,icLTVBr,icBremen,icHATV,icHTV,icTMV,icTNW,icNTV,icTRP,icSLT,icTVS,icTVSA,icTSH,icTTSV);
	kats = new Array(icKat1,icKat2,icKat3,icKat4,icKat5,icKat6,icKat7);
	kats_foreign = new Array(icKat6, icKat7);
}

function initCalendars() {
	wCalendar1 = new YAHOO.widget.Calendar("wCalendar1", "dCalendar1", { pages: 1, title: "Anfangsdatum", 
		close: true, LOCALE_WEEKDAYS: "short", START_WEEKDAY: 1, MULTI_SELECT: false }
	);
	wCalendar2 = new YAHOO.widget.Calendar("wCalendar2", "dCalendar2", { pages: 1, title: "Enddatum", 
		close: true, LOCALE_WEEKDAYS: "short", START_WEEKDAY: 1, MULTI_SELECT: false }
	);
			
	calSetLocaleProperties(wCalendar1);
	calSetLocaleProperties(wCalendar2);

	calInitValuesAndRender();
	
	calRegisterSelectEvent(wCalendar1, onSelectCalendar1);
	calRegisterSelectEvent(wCalendar2, onSelectCalendar2);
}

function calSetLocaleProperties(cal) {
	cal.cfg.setProperty("MONTHS_SHORT",   ["Jan", "Feb", "M\u00E4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]);
	cal.cfg.setProperty("MONTHS_LONG",    ["Januar", "Februar", "M\u00E4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]);
	cal.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "D", "M", "D", "F", "S"]);
	cal.cfg.setProperty("WEEKDAYS_SHORT", ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]);
	cal.cfg.setProperty("WEEKDAYS_MEDIUM",["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"]);
	cal.cfg.setProperty("WEEKDAYS_LONG",  ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]);
}

function calInitValuesAndRender() {
	DateUtils.isValidDateShortDE(ihDatumVon.value, calInitDatumVon);
	DateUtils.isValidDateShortDE(ihDatumBis.value, calInitDatumBis);
}

function calInitDatumVon(valid) {
	if(valid) {
		bCheckTimeRange = false;
		calUpdateValue(wCalendar1, dateFromString(ihDatumVon.value.replace(/^[^\d]*(\d{1,2}\.\d{1,2}\.\d{1,4})[^\d]*$/,'$1'), ".", 2, 1, 0));
		bCheckTimeRange = true;
	}
	else {
		bDatumVonValid = false;
		bCheckTimeRange = false;
		calUpdateValue(wCalendar1, new Date());
		bDatumVonValid = true;
		bCheckTimeRange = true;
	}
	wCalendar1.render();
}

function calInitDatumBis(valid) {
	if(valid) {
		bCheckTimeRange = false;
		calUpdateValue(wCalendar2, dateFromString(ihDatumBis.value.replace(/^[^\d]*(\d{1,2}\.\d{1,2}\.\d{1,4})[^\d]*$/,'$1'), ".", 2, 1, 0));
		bCheckTimeRange = true;
	}
	else {
		bDatumBisValid = false;
		bCheckTimeRange = false;
		calUpdateValue(wCalendar2, new Date());
		bDatumBisValid = true;
		bCheckTimeRange = true;
	}
	wCalendar2.render();
}

function calUpdateValue(cal, date) {
	cal.select(date);
	cal.cfg.setProperty("pagedate", (date.getMonth()+1) + "/" + date.getFullYear());
}

function calRegisterSelectEvent(cal, callback) {
	cal.selectEvent.subscribe(callback, cal, true);
}

function onSelectCalendar1(type,args,obj) {
	if(bDatumVonValid) {
		updateDateTextComponent(itDatumVon,args[0]);
		updateDateTextComponent(ihDatumVon,args[0]);
		hideError(spErrDatumVon);
		checkTimeRange(ihDatumBis.value, ihDatumVon.value);
	}
	wCalendar1.hide();
}

function onSelectCalendar2(type,args,obj) {
	if(bDatumBisValid) {
		updateDateTextComponent(itDatumBis,args[0]);
		updateDateTextComponent(ihDatumBis,args[0]);
		hideError(spErrDatumBis);
		checkTimeRange(ihDatumBis.value, ihDatumVon.value);
	}
	wCalendar2.hide();
}

function checkTimeRange(txtDate1, txtDate2) {
	if(bCheckTimeRange) {
		if(YAHOO.widget.DateMath.before(dateFromString(itDatumBis.value,".",2,1,0), dateFromString(itDatumVon.value,".",2,1,0))) {
			showError(spErrTimeRange, "Das Anfangsdatum liegt vor dem Enddatum.");
		}
		else {
			hideError(spErrTimeRange);
		}
	}
}

function updateDateTextComponent(dateComponent,args) {
	var date = args[0];
	var year = date[0], month = date[1], day = date[2];
	dateComponent.value = day + "." + month + "." + year;
}

function onChangeDatumVonTxt() {
	ihDatumVon.value = itDatumVon.value.replace(/^[^\d]*(\d{1,2}\.\d{1,2}\.\d{1,4})[^\d]*$/,'$1');
	DateUtils.isValidDateShortDE(itDatumVon.value, datumVonTxtChange);
}

function onChangeDatumBisTxt() {
	ihDatumBis.value = itDatumBis.value.replace(/^[^\d]*(\d{1,2}\.\d{1,2}\.\d{1,4})[^\d]*$/,'$1');
	DateUtils.isValidDateShortDE(itDatumBis.value, datumBisTxtChange);
}
		
function datumVonTxtChange(valid) {
	if(valid) {
		calUpdateValue(wCalendar1, dateFromString(ihDatumVon.value.replace(/^[^\d]*(\d{1,2}\.\d{1,2}\.\d{1,4})[^\d]*$/,'$1'), ".", 2, 1, 0));
		wCalendar1.render();
		hideError(spErrDatumVon);
	}
	else {
		showError(spErrDatumVon, 'Bitte geben Sie ein g&#252;ltiges Datum ein.');	
	}
}

function datumBisTxtChange(valid) {
	if(valid) {
		calUpdateValue(wCalendar2, dateFromString(ihDatumBis.value.replace(/^[^\d]*(\d{1,2}\.\d{1,2}\.\d{1,4})[^\d]*$/,'$1'), ".", 2, 1, 0));
		wCalendar2.render();
		hideError(spErrDatumBis);
	}
	else {
		showError(spErrDatumBis, 'Bitte geben Sie ein g&#252;ltiges Datum ein.');	
	}
}

function hideError(span) {
	span.styleClass = "error_hidden";
	span.innerHTML = "";
}

function showError(span, error_msg) {
	span.styleClass = "error";
	span.innerHTML = error_msg;
}

function initComponents() {
	disableIfParentDefaultSelected(slT1gruppe, slT1klasse);
	disableIfParentDefaultSelected(slT1klasse, slT1turnierart);
	disableIfNoNotNullValues(slT1turnierart);
	disableIfParentDefaultSelected(slT2gruppe, slT2klasse);
	disableIfParentDefaultSelected(slT2klasse, slT2turnierart);
	disableIfNoNotNullValues(slT2turnierart);
	if(slT2gruppe.selectedIndex == 0) {
		disableComponent(irConjunction);
		disableComponent(irDisjunction);
	}
}

function disableIfParentDefaultSelected(parent, component) {
	if(parent.selectedIndex == 0) {
		setDefault(component);
		disableComponent(component);	
	}
}

function disableIfNoNotNullValues(component) {
	if(component.options.length == 1) {
		disableComponent(component);
	}
}

function disableComponent(component) {
	component.disabled = true;
}

function setDefault(component) {
	component.selectedIndex = 0;
}

function enableComponent(component) {
	component.disabled = false;
}

function onSlT1gruppeChange() {
	populateSelectKlasse(slT1gruppe, slT1klasse, slT1turnierart);	
}

function onSlT1klasseChange() {
	populateSelectTurnierart(slT1gruppe,slT1klasse,slT1turnierart);
}

function onSlT2gruppeChange() {
	populateSelectKlasse(slT2gruppe, slT2klasse, slT2turnierart);
	if(slT2gruppe.selectedIndex != 0) {
		onExtendedSearchChange(true);
	}
	else {
		onExtendedSearchChange(false);
	}
}

function onSlT2klasseChange() {
	populateSelectTurnierart(slT2gruppe,slT2klasse,slT2turnierart);
}

function populateSelectKlasse(slGruppe, slKlasse, slTurnierart) {
	var callbackFunction = function(data) {
		resetSelect(slKlasse, "Klasse (alle)", "");
		resetSelect(slTurnierart, "Art (alle)", "");
		if(data.length > 0) {
			enableComponent(slKlasse);
			disableComponent(slTurnierart);
			DWRUtil.addOptions(slKlasse,data);
		}
	}
	if(slGruppe.selectedIndex != 0) {
		TDBService.getKlassenByGruppe(slGruppe.options[slGruppe.options.selectedIndex].value,callbackFunction)
	}
	else {
		resetSelect(slKlasse, "Klasse (alle)", "");
		resetSelect(slTurnierart, "Art (alle)", "");
		disableComponent(slKlasse);
		disableComponent(slTurnierart);
	}
}

function populateSelectTurnierart(slGruppe, slKlasse, slTurnierart) {
	var callbackFunction = function(data) {
		resetSelect(slTurnierart, "Art (alle)", "");
		if(data.length > 0) {
			enableComponent(slTurnierart);
			DWRUtil.addOptions(slTurnierart,data);
		}
	}
	if(slKlasse.selectedIndex != 0) {
		TDBService.getTurnierartenByGruppeKlasse(slGruppe.options[slGruppe.options.selectedIndex].value,
			slKlasse.options[slKlasse.selectedIndex].value,callbackFunction);
	}
	else {
		resetSelect(slTurnierart, "Art (alle)", "");
		disableComponent(slTurnierart);
	}
}

function resetSelect(component,defaultOptionText,defaultOptionValue) {
	DWRUtil.removeAllOptions(component);
	var option = new Option(defaultOptionText,defaultOptionValue,true,true);
	component.options[component.options.length] = option;
	component.selectedIndex = 0;
}

function onExtendedSearchChange(enable) {
	if(enable) {
		enableComponent(irConjunction);
		enableComponent(irDisjunction);
	}
	else {
		disableComponent(slT2klasse);
		disableComponent(slT2turnierart);
		disableComponent(irConjunction);
		disableComponent(irDisjunction);
	}
}

function onChangePLZVon() {
	checkPlzRange();
}

function onChangePLZBis() {
	checkPlzRange();
}

function checkPlzRange() {
	var plzVon = itPLZVon.value.replace(/^[^\d]*(\d+)[^\d]*$/,'$1');
	var plzBis = itPLZBis.value.replace(/^[^\d]*(\d+)[^\d]*$/,'$1');

	var nVon = Number(plzVon);
	var nBis = Number(plzBis);
	
	if(isNaN(nVon) || isNaN(nBis)) {
		showError(spErrPLZVon, "Bitte geben Sie g&#252;ltige PLZen ein.");	
	}
	else {
		if(nVon == 0 || nBis == 0) {
			hideError(spErrPLZVon);
		}
		else {
			if(nBis >= nVon) {
				hideError(spErrPLZVon);
			}
			else {
				showError(spErrPLZVon, "Die 2. PLZ muss gr&#246;&#223;er oder gleich der 1. sein.");
			}
		}
	}
}

function onIbCalendar1Show() {
	wCalendar1.show();
}

function onIbCalendar2Show() {
	wCalendar2.show();
}

/* Events registrieren */
		
// load event f. d. Seite //
YAHOO.util.Event.addListener(window, "load", init);

// blur event f. manuelle Datumseingaben //
YAHOO.util.Event.addListener("itDatumVon", "blur", onChangeDatumVonTxt);
YAHOO.util.Event.addListener("itDatumBis", "blur", onChangeDatumBisTxt);

// blur event f. PLZ-Eingabe
YAHOO.util.Event.addListener("itPLZVon", "blur", onChangePLZVon);
YAHOO.util.Event.addListener("itPLZBis", "blur", onChangePLZBis);

// change event f. turnierauswahl //
YAHOO.util.Event.addListener("slT1gruppe", "change", onSlT1gruppeChange);
YAHOO.util.Event.addListener("slT1klasse", "change", onSlT1klasseChange);
YAHOO.util.Event.addListener("slT2gruppe", "change", onSlT2gruppeChange);
YAHOO.util.Event.addListener("slT2klasse", "change", onSlT2klasseChange);

// click event f. kalender //
YAHOO.util.Event.addListener("ibCalendar1Show", "click", onIbCalendar1Show);
YAHOO.util.Event.addListener("ibCalendar2Show", "click", onIbCalendar2Show);