﻿var DOMBuilder = {
	node:		function(elementName) {
		var element = document.createElement(elementName.toUpperCase());
		
		if (arguments[1]) {
			for (arg in arguments[1]) {
				switch (typeof arguments[1][arg]) {
				case 'function':
					Event.observe(element, arg, arguments[1][arg]);
					break;
				
				default:
					if (arg == 'style') {
						Element.setStyle(element, arguments[1][arg]);
					} else {
						element[arg] = arguments[1][arg];
					}
				}
			}
		}
		
		if (arguments[2]) {
			if (Object.isString(arguments[2]) || Object.isNumber(arguments[2])) {
				element.appendChild(document.createTextNode(arguments[2]));
			} else {
				for (var i = 0; i < arguments[2].length; i++) {
					if (arguments[2][i].tagName) {
						element.appendChild(arguments[2][i]);
					} else {
						element.appendChild(document.createTextNode(arguments[2][i]));
					}
				}
			}
		}
		
		return element;
	}
}

var Data = {
	FASHION_BRIDE:				'Brautmode',
	FASHION_GROOM:				'Bräutigam',
	FASHION_REGISTRY_OFFICE:	'Standesamtmode',
	
	VARIATION_STANDARD:			'Standard',
	VARIATION_EXCLUSIVE:		'Exklusiv',
	
	DATE_DESIRED:				1, // Wunschtermin
	DATE_ALTERNATIVE:			2, // Alternativtermin

	weekday:	[
		'Sonntag',
		'Montag',
		'Dienstag',
		'Mittwoch',
		'Donnerstag',
		'Freitag',
		'Samstag'
	],
	
	time_list:					function(fashion, variation, date) {
		switch (fashion) {
			// Brautmode
			case Data.FASHION_BRIDE:
				switch (variation) {
					// Standardberatung
					case Data.VARIATION_STANDARD:
						switch (date) {
							// Wunschtermin
							case Data.DATE_DESIRED:
								return [
									[],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									[],	// ['10:00', '14:00', '16:30'],
									[]	// ['09:00', '12:00', '15:00']
								];
								
							// Alternativtermin
							case Data.DATE_ALTERNATIVE:
								return [
									[],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									[],	// ['10:00', '14:00', '16:30'],
									[]
								];
							
							default:
								return [];
						}
						
					// Exklusivberatung
					case Data.VARIATION_EXCLUSIVE:
						switch (date) {
							// Wunschtermin
							case Data.DATE_DESIRED:
								return [
									[],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['09:00', '12:00', '15:00']
								];
								
							// Alternativtermin
							case Data.DATE_ALTERNATIVE:
								return [
									[],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									[]
								];
							
							default:
								return [];
						}
						
					default :
						return [];
				}
			
			// Bräutigam
			case Data.FASHION_GROOM:
				switch (variation) {
					// Standardberatung
					case Data.VARIATION_STANDARD:
						switch (date) {
							// Wunschtermin
							case Data.DATE_DESIRED:
								return [
									[],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['09:00', '10:30', '12:00', '13:30', '15:00', '16:30', '18:00']
								];
								
							// Alternativtermin
							case Data.DATE_ALTERNATIVE:
								return [
									[],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									['10:00', '11:30', '14:00', '15:30', '17:00'],
									[]
								];
							
							default:
								return [];
						}
						
					// Exklusivberatung
					case Data.VARIATION_EXCLUSIVE:
						switch (date) {
							// Wunschtermin
							case Data.DATE_DESIRED:
								return [];
								
							// Alternativtermin
							case Data.DATE_ALTERNATIVE:
								return [];
			
							default:
								return [];
						}
						
					default :
						return [];
				}
				
			// Standesamtmode
			case Data.FASHION_REGISTRY_OFFICE:
				switch (variation) {
					// Standardberatung
					case Data.VARIATION_STANDARD:
						switch (date) {
							// Wunschtermin
							case Data.DATE_DESIRED:
								return [
									[],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									[],	// ['10:00', '14:00', '16:30'],
									[]	// ['09:00', '12:00', '15:00']
								];
								
							// Alternativtermin
							case Data.DATE_ALTERNATIVE:
								return [
									[],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									['10:00', '14:00', '16:30'],
									[],	// ['10:00', '14:00', '16:30'],
									[]
								];
							
							default:
								return [];
						}
						
					// Exklusivberatung
					case Data.VARIATION_EXCLUSIVE:
						switch (date) {
							// Wunschtermin
							case Data.DATE_DESIRED:
								return [];
								
							// Alternativtermin
							case Data.DATE_ALTERNATIVE:
								return [];
							
							default:
								return [];
						}
						
					default :
						return [];
				}
				
			default:
				return [];
		}
	},
	
	price_list:					function(fashion) {
		switch (fashion) {
		case Data.FASHION_BRIDE:
			return ['ab 699 bis 999 EUR', 'ab 999 bis 1499 EUR', 'ab 1499 EUR'];
			
		case Data.FASHION_GROOM:
			return ['ab 479 EUR', 'ab 679 EUR'];
			
		case Data.FASHION_REGISTRY_OFFICE:
			return ['ab 279 EUR', 'ab 479 EUR', 'ab 979 EUR'];
			
		default:
			return [];
		}
	},
	
	variation_list:				function(fashion) {
		switch (fashion) {
		case Data.FASHION_BRIDE:
			return [Data.VARIATION_EXCLUSIVE, Data.VARIATION_STANDARD];
			
		case Data.FASHION_GROOM:
			return [Data.VARIATION_STANDARD];
			
		case Data.FASHION_REGISTRY_OFFICE:
			return [Data.VARIATION_STANDARD];
			
		default:
			return [];
		}
	}
}

var Appointment = {
	config: {
		dates:	[
			[ /* Brautmode */
				[],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['09:00', '12:00', '15:00']
			],
			
			[ /* Standesamtmode */
				[],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['09:00', '12:00', '15:00']
			],
			
			[ /* Bräutigam */
				[],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['09:00', '10:30', '12:00', '13:30', '15:00', '16:30', '18:00']
			]
		],
		
		dates_alternative:	[
			[ /* Brautmode */
				[],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				/*['10:00', '14:00', '16:30'],*/ [],
				[]
			],
			
			[ /* Standesamtmode */
				[],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				['10:00', '14:00', '16:30'],
				/*['10:00', '14:00', '16:30'],*/ [],
				[]
			],
			
			[ /* Bräutigam */
				[],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				['10:00', '11:30', '14:00', '15:30', '17:00'],
				/*['10:00', '11:30', '14:00', '15:30', '17:00'],*/ [],
				[]
			]
		],
		
		variation: [
			['Exklusiv', 'Standard'],
			['Exklusiv', 'Standard'],
			['Standard']
		],
		
		price: [
			['ab 699 bis 999 EUR', 'ab 999 bis 1499 EUR', 'ab 1499 EUR'],
			['ab 299 EUR', 'ab 499 EUR', 'ab 999 EUR'],
			['bis 500 EUR', 'bis 800 EUR', 'bis 1200 EUR'],
		],
		
		weekday:	[
			'Sonntag',
			'Montag',
			'Dienstag',
			'Mittwoch',
			'Donnerstag',
			'Freitag',
			'Samstag'
		]
	},

	getWeekDay:				function(dd, mm, yyyy) {
		// Referenz ist Donnerstag, der 01.01.1970 00:00:00 Uhr
		// Von diesem Datum bis zum gesuchten Tag werden mit
		// dem JavaScript-Objekt Date die Millisekunden gezählt
		// und der Wochentag abgefragt.
		// Für Jahre seit 1970 und vor 0100
		// sind die mSek-Angaben positiv, dazwischen negativ

		// Eingabe-Datum in mSek umwandeln
		var timeObj = new Date();
		var time = Date.UTC(yyyy, (mm - 1), dd);

		// Kalenderreform berücksichtigen, d.h. + 10 Tage
		if (yyyy < 1582 || yyyy == 1582 && (mm < 10 || mm == 10 && dd < 15))
			time+= 10 * 24 * 60 * 60 * 1000;
		// Über das Date-Objekt werden die Schaltjahre
		// vor der Reform genauso berechnet wie danach.
		// Also müssen die Schalttage in den vollen
		// Jahrhunderten, die nicht durch 400 teilbar sind,
		// wieder 'hinzugezählt' werden (Vorzeichen beachten)
		for (k = 0; k < 4; k++) {
			for (year = 1500 - k * 400; year > 1200 - k * 400; year-=100) {
				if (yyyy < year || yyyy == year && mm < 3)
					time-= 24 * 60 * 60 * 1000;
			}
		}

		// Wegen internem Vorzeichen-Wechsel zwischen
		// dem 31.12.0099 und dem 01.01.0100 (??!)
		// muss hier ein weiterer Tag 'addiert' werden.
		if (yyyy < 100)
			time-= 24 * 60 * 60 * 1000;

		// Wochentag auslesen (0-6)
		timeObj.setTime(time);
		weekday = timeObj.getDay();

		return weekday;
		/*
		// Ergebnis anzeigen
		var week = "SoMoDiMiDoFrSa";
		alert(week.substr(weekday*2,2)+",  "+ dd+"."+mm+"."+yyyy);
		*/
	},

	checkDates:				function(type) {
		// type 0=alle 1=wunschtermin 2=alternativer wunschtermin
		
		var form = document.forms['mail'];
		var selectedMode = form.elements['Mode'].selectedIndex;
		
		if (type == 0 || type == 1) {
			var weekday = Appointment.getWeekDay(form.elements['Meeting_Day'].value, form.elements['Meeting_Month'].value, form.elements['Meeting_Year'].value);
			var uhrzeit = form.elements['Uhrzeit'];
		
			document.getElementById('mail_weekday').innerHTML = Data.weekday[weekday];
			
			while (uhrzeit.hasChildNodes())
				uhrzeit.removeChild(uhrzeit.lastChild);
			
			var time_list = Data.time_list(form.elements['Mode'].value, form.elements['Beratungsvariante'].value, Data.DATE_DESIRED);
			time_list = time_list.length == 0 ? [] : time_list[weekday];
			for (var i = 0; i < time_list.length; i++)
				uhrzeit.appendChild(DOMBuilder.node('option', {
					value:	time_list[i]
				}, time_list[i]));
		}
		
		if (type == 0 || type == 2) {
			var weekday_alt = Appointment.getWeekDay(form.elements['Meeting_alternative_Day'].value, form.elements['Meeting_alternative_Month'].value, form.elements['Meeting_alternative_Year'].value);
			var uhrzeit_alt = form.elements['Uhrzeit_alt'];

			document.getElementById('mail_weekday_alternative').innerHTML = Data.weekday[weekday_alt];
			
			while (uhrzeit_alt.hasChildNodes())
				uhrzeit_alt.removeChild(uhrzeit_alt.lastChild);
				
			var time_list = Data.time_list(form.elements['Mode'].value, form.elements['Beratungsvariante'].value, Data.DATE_ALTERNATIVE);
			time_list = time_list.length == 0 ? [] : time_list[weekday_alt];
			for (var i = 0; i < time_list.length; i++)
				uhrzeit_alt.appendChild(DOMBuilder.node('option', {
					value:	time_list[i]
				}, time_list[i]));
		}
	},

	setTime:				function(time) {
		var element = document.forms["mail"].elements["Uhrzeit"];
		
		for (var i = 0; i < element.options.length; i++)
			element.options[i].selected = (element.options[i].value == time);
	},

	setTimeAlternative:		function(time) {
		var element = document.forms["mail"].elements["Uhrzeit_alt"];
		
		for (var i = 0; i < element.options.length; i++) {
			element.options[i].selected = (element.options[i].value == time);
		}
	},
	
	checkVariation:			function() {
		var form = document.forms['mail'];
		var selectedIndex = form.elements['Mode'].selectedIndex;
		
		var element = form.elements['Beratungsvariante'];
		while (element.hasChildNodes())
			element.removeChild(element.lastChild);
		
		var variation_list = Data.variation_list(form.elements['Mode'].value);
		for (var i = 0; i < variation_list.length; i++)
			element.appendChild(DOMBuilder.node('option', {
				value:	variation_list[i]
			}, variation_list[i]));
	},
	
	checkPrice:				function() {
		var form = document.forms['mail'];
		var selectedIndex = form.elements['Mode'].selectedIndex;
		
		var element = form.elements['Preislage'];
		while (element.hasChildNodes())
			element.removeChild(element.lastChild);
		
		var price_list = Data.price_list(form.elements['Mode'].value);
		for (var i = 0; i < price_list.length; i++)
			element.appendChild(DOMBuilder.node('option', {
				value:	price_list[i]
			}, price_list[i]));
	},

	setPrice:				function(price) {
		var element = document.forms["mail"].elements["Preislage"];
		
		for (var i = 0; i < element.options.length; i++)
			element.options[i].selected = (element.options[i].value == price);
	},
	
	checkForm:				function() {
		var form = document.forms['mail'];
		
		/*
		var weekday = Appointment.getWeekDay(form.elements['Meeting_Day'].value, form.elements['Meeting_Month'].value, form.elements['Meeting_Year'].value);
		if (weekday < 1 || weekday > 4) {
			alert('Bitte wählen sie einen Wunschtermin zwischen Montag und Donnerstag aus.');
			form.elements['Meeting_Day'].focus();
			return false;
		}
		
		var weekday_alt = Appointment.getWeekDay(form.elements['Meeting_alternative_Day'].value, form.elements['Meeting_alternative_Month'].value, form.elements['Meeting_alternative_Year'].value);
		if (weekday_alt < 1 || weekday_alt > 4) {
			alert('Bitte wählen sie einen alternativen Wunschtermin zwischen Montag und Donnerstag aus.');
			form.elements['Meeting_alternative_Day'].focus();
			return false;
		}
		*/

		if (form.elements['Uhrzeit'].value == '') {
			alert('Bitte wählen Sie einen Wunschtermin aus, an dem Beratungen angeboten werden.');
			form.elements['Meeting_Day'].focus();
			return false;
		}

		if (form.elements['Uhrzeit_alt'].value == '') {
			alert('Bitte wählen Sie einen Alternativtermin aus, an dem Beratungen angeboten werden.');
			form.elements['Meeting_alternative_Day'].focus();
			return false;
		}

		if (form.elements['Name_Vorname'].value == '') {
			alert('Bitte geben Sie einen Namen an.');
			form.elements['Name_Vorname'].focus();
			return false;
		}
		
		if (form.elements['Telefon'].value == '') {
			alert('Bitte geben Sie eine Telefonnummer an.');
			form.elements['Telefon'].focus();
			return false;
		}
		
		if (form.elements['eMail'].value == '') {
			alert('Bitte geben Sie eine eMail-Adresse an.');
			form.elements['eMail'].focus();
			return false;
		}
		
		if (form.elements['Konfektionsgroesse'].value == '') {
			alert('Bitte geben Sie eine Konfektionsgröße an.');
			form.elements['Konfektionsgroesse'].focus();
			return false;
		}
		
		if (form.elements['Koerpergroesse'].value == '') {
			alert('Bitte geben Sie eine Körpergröße an.');
			form.elements['Koerpergroesse'].focus();
			return false;
		}
		
		if (form.elements['Begleitung'].value == '') {
			alert('Bitte geben Sie eine Begleitung an.');
			form.elements['Begleitung'].focus();
			return false;
		}
		
		if (form.elements['Bemerkung'].value == '') {
			alert('Bitte geben Sie eine Beschreibung Ihres Brautkleides an.');
			form.elements['Bemerkung'].focus();
			return false;
		}
		
		if (form.elements['captcha'].value == '' || !form.elements['captcha'].value.match(/\d{5}/)) {
			alert('Bitte geben Sie einen gültigen Sicherheitscode ein.');
			form.elements['captcha'].focus();
			return false;
		}
		
		return true;
	}
}
