// #5338 Lib Update
(function(){
  angular
  .module("izApp")
  .controller("VeranstaltungBuchenController", VeranstaltungBuchenController);

VeranstaltungBuchenController.$inject = ['veranstaltung', 'preis', 'tickettitle', '$filter', '$uibModal', '$location','$scope', '$rootScope', '$document', '$anchorScroll', '$state', '$timeout', 'Logger', 'VeranstaltungenService','$translate'];

function VeranstaltungBuchenController(veranstaltung, preis, tickettitle, $filter, $uibModal, $location, $scope, $rootScope, $document, $anchorScroll, $state, $timeout, Logger, VeranstaltungenService,$translate){

  /*
  Controller für das Buchen von Veranstaltungen
  ---------------------------------------------
  ACHTUNG: Da wir aktuell noch keine echten Tickets haben, werden die Buchungsdaten (Ticketname, Ticketpreis) durch
  das Parsen einer Contentbox ermittelt. Das ist ein mehr als suboptimales Provisorium!
  @see heuer.app state veranstaltung_buchen
  @see Template "Tickets"
  */

  var vm = this;
  vm.langChange=function(){
  if(veranstaltung.code=="10827"){
	  $translate.use('en');
	}
  }();
  vm.buchung = {};
  vm.buchung.firma = true;
  // Beschriftungen für Radiobuttons "Firma?"
  vm.alsfirma = {
	'value': true,
	'label': $translate.instant('COMPANY_LABEL'),//'Firma',
	'toolTip': $translate.instant('COMPANY_TOOLTIP')//'Wenn Sie sich als Firma anmelden wollen, klicken Sie hier.'
  };
  vm.alsprivatperson = {
	'value': false,
	'label': $translate.instant('PRIVATE_PERSON_LABEL'),//'Privatperson',
	'toolTip': $translate.instant('PRIVATE_PERSON_TOOLTIP')//'Wenn Sie sich als Privatperson anmelden wollen, klicken Sie hier.'
  };
  // Beschriftungen der Ceckboxen zu den Zustimmungspflichtigen Bedingungen
  vm.buchung.agb = {
	'value': false,
	'label': $translate.instant('AGB_LABEL'),//'Ich erkläre mich mit den <a href="javascript:;" ng-click="vm.openHilfe(\'agb.popup\');">AGB</a> einverstanden.',
	'toolTip': $translate.instant('AGB_TOOLTIP')//'Sie müssen den AGB zustimmen.'
  };
  vm.buchung.datenschutz = {
	'value': false,
	'label': $translate.instant('DATA_PROTECTION_LABEL'), //'Ich habe die <a href="javascript:;" ng-click="vm.openHilfe(\'datenschutz.popup\');">Datenschutzerklärung</a> zur Kenntnis genommen und erkläre mich mit Speicherung meiner Daten in diesem Sinne einverstanden.',
	'toolTip': $translate.instant('DATA_PROTECTION_TOOLTIP') //'Sie müssen den Datenschutzbestimmungen zustimmen.'
  };
  vm.buchung.widerrufsrecht = {
	'value': false,
	'label': $translate.instant('WITHDRAW_LABEL'),//'Das <a href="javascript:;" ng-click="vm.openHilfe(\'widerrufsrecht.popup\');">Widerrufsrecht für private Teilnehmer</a> habe ich zur Kenntnis genommen.',
	'toolTip': $translate.instant('WITHDRAW_TOOLTIP')//'Sie müssen bestätigen, dass Sie die Regelung zum Widerrufsrecht verstanden haben.'
  };
  // Beschriftungen für Zusatzinformationen
  vm.buchung.vertragsnummer = {
	'value': '',
	'label': $translate.instant('CONTRACT_NUMBER_LABEL'),//'Heuer Dialog Vertragsnummer',
	'toolTip': $translate.instant('CONTRACT_NUMBER_TOOLTIP')//'Falls Sie bereits eine Heuer Dialog Vertragsnummer haben, geben Sie diese hier ein.'
  };
  vm.buchung.bemerkung = {
	'value': '',
	'label': $translate.instant('COMMENT_LABEL'),//'Bemerkungen',
	'toolTip': $translate.instant('COMMENT_TOOLTIP')//'Weitere Mitteilungen können Sie hier eingeben'
  };

  // Die Daten der Veranstaltung brauchen wir während der Bestellung auch
  vm.veranstaltung;

  // Der Nutzer soll für 1 bis n Teilnehmer bstellen können
  vm.buchung.teilnehmerListe = [];

  // Auswahlmöglichkeiten für select-Box "Anrede"
  vm.anrede = [
	'Herr',
	'Frau'
  ];

  // Vorlage für Teilnehmerobjekt, inklusive aller Beschriftungen für das Formular
  // Wird in vm.buchung.teilnehmerListe gepusht.
  
  var templateClass = (function(){
		var template = function(value,label,tooltip){
			this.value = value;
		  	this.label = label;
		    this.tooltip = tooltip;
		  	this.get = function(){
				return {
					value : this.value,
				  	label : this.label,
				    toolTip : this.tooltip,
				};
			};
		};
		return template;
  }());

  vm.teilnehmerTemplate = {
	'firma': {
	  'value': null,
	  'label':$translate.instant('COMPANY_LABEL'),//'Firma', 
	  'toolTip':$translate.instant('COMPANY_NAME_TOOLTIP') //Geben Sie den Namen Ihrer Firma an.'
	},
	'anrede': {
	  'value': $translate.instant('SALUTATION_MAN'),//'Herr',
	  'label':$translate.instant('SALUTATION_LABEL'),//'Anrede', 
	  'toolTip':$translate.instant('SALUTATION_TOOLTIP')//'Wählen Sie eine Anrede.'
	},
	'vorname': {
	  'value': null,
	  'label':$translate.instant('FIRSTNAME_LABEL'),//'Vorname', 
	  'toolTip':$translate.instant('FIRSTNAME_TOOLTIP')//'Geben Sie Ihren Vornamen ein.'
	},
	'nachname': {
	  'value': null,
	  'label':$translate.instant('LASTNAME_LABEL'),//'Nachname', 
	  'toolTip':$translate.instant('LASTNAME_TOOLTIP')//'Geben Sie Ihren Familiennamen ein.'
	},
	'email': {
	  'value': null,
	  'label':$translate.instant('EMAIL_LABEL'),//'E-Mail', 
	  'toolTip':$translate.instant('EMAIL_TOOLTIP')//'Geben Sie eine gültige E-Mail-Adresse ein.'
	},
	'telefon': {
	  'value': null,
	  'label':$translate.instant('TELEFON_LABEL'), //'Telefon', 
	  'toolTip':$translate.instant('TELEFON_TOOLTIP') //'Geben Sie eine Telefonnumer ein, unter der wir Sie erreichen können.'
	},
	'titel': {
	  'value': null,
	  'label':$translate.instant('TITEL_LABEL'),//'Titel', 
	  'toolTip':$translate.instant('TITEL_TOOLTIP')//'Geben Sie Ihren Titel ein, z.B.: Prof. Dr.'
	},
	'geburtsdatum': {
	  'value': null,
	  'label':$translate.instant('BIRTH_DATE_LABEL'),//'Geburtsdatum', 
	  'toolTip':$translate.instant('BIRTH_DATE_TOOLTIP')//'Geben Sie Ihr Geburtsdatum ein'
	},
	'funktion': {
	  'value': null,
	  'label':$translate.instant('FUNCTION_LABEL'),//'Funktion', 
	  'toolTip':$translate.instant('FUNCTION_TOOLTIP')//'Geben Sie Ihre Funktion/Tätigkeit innerhalb Ihrer Firma ein'
	},
	'abteilung': {
	  'value': null,
	  'label':$translate.instant('DEPARTMENT_LABEL'),//'Abteilung', 
	  'toolTip':$translate.instant('DEPARTMENT_TOOLTIP')//'Geben Sie Ihre Abteilung innerhalb Ihrer Firma ein'
	},
	'extras':[]
  };

  // Vorlage für Rechnungsanschriftobjekt, inklusive aller Beschriftungen für das Formular		 
  vm.buchung.rechnungsanschrift = {
	'firma': {
	  'value': null,
	  'label':$translate.instant('COMPANY_LABEL'),//'Firma', 
	  'toolTip':$translate.instant('COMPANY_NAME_TOOLTIP') //'Geben Sie den Namen Ihrer Firma an.'
	},
	'anrede': {
	  'value': $translate.instant('SALUTATION_MAN'),//'Herr',
	  'label':$translate.instant('SALUTATION_LABEL'),//'Anrede', 
	  'toolTip':$translate.instant('SALUTATION_TOOLTIP')//'Wählen Sie eine Anrede.'
	},
	'vorname': {
	  'value': null,
	  'label':$translate.instant('FIRSTNAME_LABEL'),//'Vorname', 
	  'toolTip':$translate.instant('FIRSTNAME_TOOLTIP')//'Geben Sie Ihren Vornamen ein.'
	},
	'nachname': {
	  'value': null,
	  'label':$translate.instant('LASTNAME_LABEL'),//'Nachname', 
	  'toolTip':$translate.instant('LASTNAME_TOOLTIP')//'Geben Sie Ihren Familiennamen ein.'
	},
	'email': {
	  'value': null,
	  'label':$translate.instant('EMAIL_LABEL'),//'E-Mail', 
	  'toolTip':$translate.instant('EMAIL_TOOLTIP')//'Geben Sie eine gültige E-Mail-Adresse ein.'
	},
	'telefon': {
	  'value': null,
	  'label':$translate.instant('TELEFON_LABEL'),//'Telefon', 
	  'toolTip':$translate.instant('TELEFON_TOOLTIP'), //'Geben Sie eine Telefonnumer ein, unter der wir Sie erreichen können.'
	},
	'strasse': {
	  'value': null,
	  'label':$translate.instant('STREET_LABEL'),//'Straße / Hausnummer', 
	  'toolTip':$translate.instant('STREET_TOOLTIP')//'Geben Sie Straße mit Hausnummer ein.'
	},
	'plzort': {
	  'value': null,
	  'label':$translate.instant('POST_CODE_CITY_LABEL'),//PLZ/Ort', 
	  'toolTip':$translate.instant('POST_CODE_CITY_TOOLTIP')//'Geben Sie Postleitzahl und Ort ein.'
	},
	'land': {
	  'value': null,
	  'label':$translate.instant('COUNTRY_LABEL'),//'Land', 
	  'toolTip':$translate.instant('COUNTRY_TOOLTIP')//'Geben Sie das Land ein.'
	}
  };

  
  // Da wir, statt dem ganzen Formular, auch einzelne Felder validieren können wollen,
  // brauchen wir dieses Steuer-Array mit Pflichtfeldern.
  // @see buchen()
  vm.plichtfelderTeilnehmer = [
	'anrede',
	'vorname',
	'nachname',
	'firma',
	'email'
  ];

  // Controller-Variablen
  vm.error = false;
  vm.requestInProgress = false;
  vm.heuerdialog_vertragsnummer;
  vm.kommentar;
  vm.buchung.preis;
  vm.buchung.preis_number;
  vm.buchung.title;
  vm.close_others;
  vm.buchung.firmenrabattProPerson;
  vm.buchung.firmenrabattWert = 0;
  vm.buchung.firmenrabattText = null;
  vm.buchung.firmenrabattAktiv = false;
  vm.buchung.firmenrabattPreisProPerson;
  vm.buchung.discountAmount;

  // Controllerfunktionen
  vm.init = init;
  vm.addTeilnehmer = addTeilnehmer;
  vm.removeTeilnehmer = removeTeilnehmer;
  vm.copyTeilnehmer = copyTeilnehmer;
  vm.copyToBillingDetails = copyToBillingDetails;
  vm.buchen = buchen;
  vm.openHilfe = openHilfe;
  vm.summe = summe;
  vm.givenDiscount = givenDiscount;
  vm.gesamtSumme=gesamtSumme;
  vm.summeUst=summeUst;
  vm.rabattCodeCheck = rabattCodeCheck;
  vm.discountCalculated = false;
  
  vm.init();

  function init() {
	// Bei der Überprüfung einzelner Formularfelder, brauchen wir die Möglichkeit alle Gruppen 
	// des uib-accordions (mit den Teilnehmern) aufklappen zu können
	// @see buchen
	// @see vm.plichtfelderTeilnehmer
	
	vm.close_others = true;

	vm.veranstaltung = veranstaltung;
	
	//if(vm.veranstaltung.code=="10827"){$translate.use('en');}
	
	vm.buchung.veranstaltung = vm.veranstaltung;
	// Wir brauchen den Preis des Tickets mit Komma, zum Ausgeben und mit Punkt zum Berechnen der Bestellsumme.
	// @see summe()
	// @see inject
	if(preis) {
	  vm.buchung.preis = preis;
	  vm.buchung.preis_number = preis.replace(',','.');
	}
	// @see inject	
	vm.buchung.title = tickettitle;

	// Firmenrabatt
	if(veranstaltung.firmenrabattAktiv){
	  if((tickettitle == "Reguläres Ticket" && (veranstaltung.firmenrabattTicketName == null || veranstaltung.firmenrabattTicketName == "")) || veranstaltung.firmenrabattTicketName != null && tickettitle == veranstaltung.firmenrabattTicketName){
		vm.buchung.firmenrabattAktiv = true;
		vm.buchung.firmenrabattWert = veranstaltung.firmenrabattProzent;
		vm.buchung.firmenrabattText = "Ab 2 Personen: Jede weitere Person " + $filter('number')(veranstaltung.firmenrabattProzent,2) + "% Rabatt!";
	  }
	}

	// Den angemeldeten User als Teilnehmer hinzufügen
	// und in die Rechnungsanschrift einfügen
	if(IZConstants != null && IZConstants.accountData != null) {
	  var teilnehmer = angular.copy(vm.teilnehmerTemplate);

	  teilnehmer.extras = angular.copy(vm.buchung.veranstaltung.extras);

	  if(IZConstants.accountData.firstName != null) {
		teilnehmer.vorname.value = IZConstants.accountData.firstName;
		vm.buchung.rechnungsanschrift.vorname.value = IZConstants.accountData.firstName;
	  }
	  if(IZConstants.accountData.lastName != null) {
		teilnehmer.nachname.value = IZConstants.accountData.lastName;
		vm.buchung.rechnungsanschrift.nachname.value = IZConstants.accountData.lastName;
	  }
	  if(IZConstants.accountData.salutation != null) {
		teilnehmer.anrede.value = IZConstants.accountData.salutation;
		vm.buchung.rechnungsanschrift.anrede.value = IZConstants.accountData.salutation;
	  }
	  if(IZConstants.accountData.email != null) {
		teilnehmer.email.value = IZConstants.accountData.email;
		vm.buchung.rechnungsanschrift.email.value = IZConstants.accountData.email;
	  }

	  vm.buchung.teilnehmerListe.push(angular.copy(teilnehmer));

	} else {
	  // Einen leeren Teilnehmer einfügen
	  vm.addTeilnehmer();
	}

	// Immer ordentlich nach oben scrollen, wenn in diesen State gewechselt wurde.
	$document.scrollToElementAnimated(document.getElementById('buchung_top'), 50, 750);
  }

  // Einen neuen, leeren Teilnehmer hinzufügen
  // @see copyTeilnehmer()
  function addTeilnehmer() {
	var teilnehmer = angular.copy(vm.teilnehmerTemplate);
	teilnehmer.extras = angular.copy(vm.buchung.veranstaltung.extras);
	vm.buchung.teilnehmerListe.push(teilnehmer);
  }

  // Ein Teilnehmer muss auch wieder entfernt werden können
  function removeTeilnehmer(index) {
	vm.buchung.teilnehmerListe.splice(index,1);
	return vm.buchung.teilnehmerListe;
  }

  
  
  
  /* 
  Um dem Benutzer das Eingeben des Rechungsanschift zu erleichtern, kopieren wir den die Angaben von dem ausgewählten Teilnehmer
  21.06.2016, barwicki@iz.de
  */
  function copyToBillingDetails(teilnehmer, index, form) {

	if(!teilnehmer){
		return console.error("Initial teilnehmer");
	}
	
	vm.buchung.rechnungsanschrift.nachname=angular.copy(teilnehmer.nachname);
	vm.buchung.rechnungsanschrift.vorname=angular.copy(teilnehmer.vorname);
	vm.buchung.rechnungsanschrift.anrede=angular.copy(teilnehmer.anrede);
	vm.buchung.rechnungsanschrift.firma=angular.copy(teilnehmer.firma);
	vm.buchung.rechnungsanschrift.telefon=angular.copy(teilnehmer.telefon);
	vm.buchung.rechnungsanschrift.email=angular.copy(teilnehmer.email);
  }
  
  
  // Um dem Benutzer das eingeben zu erleichtern, kopieren wir den aktuellen Teilnhemer
  // und ändern folgende Felder:
  // - Vorname und Nachname werden geleert
  // - Der localpart der E-Mail-Adresse wird entfernt.
  // - Es wird versucht, eine per Bindestrich abgetrennte Durchwahl aus der Telefonnummer zu entfernen.
  function copyTeilnehmer(teilnehmer, index, form) {

	// Felder einzeln überprüfen
	var allValid = true;
	var feld = angular.element(document.getElementById('teilnehmer_' + index))
	for(key in vm.plichtfelderTeilnehmer) {

	  // Bei einer Privatperson ist "firma" kein Pflichtfeld
	  if(vm.plichtfelderTeilnehmer[key] == 'firma' && !vm.buchung.firma) {
		continue;
	  }

	  var member = vm.plichtfelderTeilnehmer[key] + '_' + index;

	  if(form[member].$invalid) {
		form[member].$setDirty();
		// Wenn ein Feld ungültig ist, darf kein neuer Teilnehmer hinzugefügt werden.
		// Und er wird als ungültig markiert
		feld.addClass('teilnehmer_invalid');
		allValid = false;
		return false;
	  }
	}
	if(allValid) {
	  feld.removeClass('teilnehmer_invalid');
	}

	teilnehmerCopy=angular.copy(teilnehmer);
	teilnehmerCopy.vorname.value=null;
	teilnehmerCopy.nachname.value=null;
	if(teilnehmerCopy.email.value){
	  teilnehmerCopy.email.value=teilnehmerCopy.email.value.replace(/.*(?=@)/g,"");
	}
	if(teilnehmerCopy.telefon.value && teilnehmerCopy.telefon.value.match(/^.*[^-]$/)){
	  teilnehmerCopy.telefon.value=teilnehmerCopy.telefon.value.replace(/-[^-]+/,"")+'-';
	}
	teilnehmerCopy.extras = angular.copy(vm.buchung.veranstaltung.extras);

	vm.buchung.teilnehmerListe.push(teilnehmerCopy);

  }

  function openHilfe(templateName) {

	var modalInstance = $uibModal.open({
	  animation : false,
	  templateUrl : '/backend/resources/api/templates/name/' + templateName + '/render',
	  controller : "HelpDialogController as vm",
	  size : 'lg',
	  backdrop : 'static',
	  resolve : {
		data:function() {
		  return null;
		}
	  }
	});
	modalInstance.result.then(function (response) {
	  Logger.info("Dialog geschlossen Daten: " + response);
	}, function () {
	  Logger.info("Dialog geschlossen");
	});
  }

  function kalkuliereSumme() {
	var summe = vm.buchung.teilnehmerListe.length * vm.buchung.preis_number;
	if(vm.buchung.firmenrabattAktiv && vm.buchung.teilnehmerListe.length > 1 && vm.buchung.firma){
	  var a = vm.buchung.preis_number * vm.buchung.firmenrabattWert / 100;
	  var w = vm.buchung.preis_number - a;
	  vm.buchung.firmenrabattProPerson = $filter('number')(a, 2);
	  vm.buchung.firmenrabattPreisProPerson = $filter('number')(w, 2);
	  summe = parseFloat(vm.buchung.preis_number) + (vm.buchung.teilnehmerListe.length - 1) * (vm.buchung.preis_number - (vm.buchung.preis_number * vm.buchung.firmenrabattWert / 100));
	}
	return summe;
  }
  // Wird verwendet um die Buchungssumme zu berechnen und mit einem Komma auszugeben.
  function summe() {
	var summe=kalkuliereSumme();
	return $filter('number')(summe, 2);
  }
  
  function givenDiscount() {
	var calculatedDiscount = (vm.buchung.old_price - vm.buchung.preis) * vm.buchung.teilnehmerListe.length;
  	return $filter('number')(calculatedDiscount, 2);
  }

  function gesamtSumme() {
	var gesamtSumme=kalkuliereSumme();
	gesamtSumme= parseFloat(gesamtSumme) *1.19;
	return $filter('number')(gesamtSumme, 2);
	
  }
  
  function summeUst() {
  	var summeUst=kalkuliereSumme();
	var summeUst=parseFloat(summeUst)/100*19;
	return $filter('number')(summeUst, 2);
	
  }
  
  function rabattCodeCheck(vmBuchung) {
	var buchungToSend = {};
	buchungToSend.preis = vmBuchung.preis;
	vmBuchung.teilnehmer = [];
	generateTeilnehmerListe(vmBuchung);
	buchungToSend.teilnehmer = angular.copy(vmBuchung.teilnehmer);
	if (vmBuchung.rabattcode && vmBuchung.rabattcode.value) {
	  
	  // Das Geburtsdatum der Teinehmer muss vor dem Abschicken transformiert werden
	  angular.forEach(buchungToSend.teilnehmer, function(teilnehmer, key) {
		if(buchungToSend.teilnehmer[key].geburtsdatum != "" && buchungToSend.teilnehmer[key].geburtsdatum != null) {
		  var dateFields=buchungToSend.teilnehmer[key].geburtsdatum.split(".");
		  var geburtsDatum=new Date();
		  geburtsDatum.setFullYear(dateFields[2]);
		  geburtsDatum.setDate(dateFields[0]);
		  geburtsDatum.setMonth(dateFields[1]-1) ;
		}
        buchungToSend.teilnehmer[key].geburtsdatum = geburtsDatum;
	  });
	  
		VeranstaltungenService.checkRabattCode(buchungToSend, vmBuchung.rabattcode.value, vm.veranstaltung.code)
		  .then(function (data) {
			console.log(data, vm);
		  data.preis = parseFloat(data.preis.replace(',','.'));
		  vm.buchung.rabattcode.error = false;
		  vm.buchung.preis = data.preis;
		  vm.buchung.old_price = data.oldPrice;
		  vm.buchung.preis_number = data.preis;
		  vm.buchung.discountAmount = data.discountAmount;
		  vm.summe();
		  vm.gesamtSumme();
		  vm.summeUst();
		  vm.discountCalculated = true;
		})
		.catch(function (error) {
		    console.log(error);
			vm.buchung.rabattcode.errorMessage = error.data.message;
			vm.discountCalculated = false;
		  	vm.buchung.rabattcode.error = true;
		});
	}
  }
  
  function buchen(vmbuchung) {
	
	angular.forEach(vmbuchung.teilnehmerListe, function(teilnehmer, key) {
		if(vmbuchung.teilnehmerListe[key].geburtsdatum.value!= "" && vmbuchung.teilnehmerListe[key].geburtsdatum.value!= null) {
		  var dateFields=vmbuchung.teilnehmerListe[key].geburtsdatum.value.split(".");
		  var geburtsDatum=new Date();
		  geburtsDatum.setFullYear(dateFields[2]);
		  geburtsDatum.setDate(dateFields[0]);
		  geburtsDatum.setMonth(dateFields[1]-1) ;
			//var geburtsDatum=new Date(dateFields[2],dateFields[1],dateFields[0]);
			if(isNaN(geburtsDatum.getMilliseconds())) {
		  		var member="geburtsdatum_"+key;
		  		$scope.veranstaltungBuchenForm[member].$valid=false;
			  	$scope.veranstaltungBuchenForm[member].$invalid=true;
			  	$scope.veranstaltungBuchenForm[member].$setValidity("pattern",false);
				$scope.veranstaltungBuchenForm.$valid=false;
	  			return false;
			}
		//	vmbuchung.teilnehmerListe[key].geburtsdatum.value=geburtsDatum;
		}
	});
	
	if( !$scope.veranstaltungBuchenForm.$valid ) {
	  // Alles aufklappen, damit der User die Felder mit den Fehlern sehen kann
	  vm.close_others = false;
	  for(gruppe in $scope.accordion.groups) {
		$scope.accordion.groups[gruppe].isOpen = true;
	  }
	  var element=angular.element("[name='veranstaltungBuchenForm']").find('.ng-invalid:visible:first');
	  if(element.length == 0) {
		element=angular.element("[name='veranstaltungBuchenForm']").find('.ng-invalid-pattern:visible:first');
	  }
	  if(element.length !=0){
	  	$document.scrollToElementAnimated(element, 50, 750);
	  }
		return false;
	}

		angular.forEach(vmbuchung.teilnehmerListe, function(teilnehmer, key) {
		if(vmbuchung.teilnehmerListe[key].geburtsdatum.value!= "" && vmbuchung.teilnehmerListe[key].geburtsdatum.value!= null) {
			
		  		  var dateFields=vmbuchung.teilnehmerListe[key].geburtsdatum.value.split(".");
		  var geburtsDatum=new Date();
		  geburtsDatum.setFullYear(dateFields[2]);
		  geburtsDatum.setDate(dateFields[0]);
		  geburtsDatum.setMonth(dateFields[1]-1) ;
		  
			if(isNaN(geburtsDatum.getMilliseconds())) {

	  			return false;
			}
			vmbuchung.teilnehmerListe[key].geburtsdatum.value=geburtsDatum;
		}
	});
	
	// Und der Rquest ist aktiv damit der Button deaktiviert werden kann.
	vm.requestInProgress = true;

	var buchung = angular.copy(vmbuchung);
	//var buchung = {};
	buchung.teilnehmer = [];
	generateTeilnehmerListe(buchung);

	var rechnungsanschrift = {};
	angular.forEach(buchung.rechnungsanschrift, function(anschrift, key) {
	  rechnungsanschrift[key] = anschrift.value;
	});
	buchung.rechnungsanschrift = rechnungsanschrift;

	buchung.agb = buchung.agb.value;
	buchung.datenschutz = buchung.datenschutz.value;
	buchung.widerrufsrecht = buchung.widerrufsrecht.value;

	buchung.vertragsnummer = buchung.vertragsnummer.value;
	buchung.bemerkung = buchung.bemerkung.value;
	
	
	buchung.rabattCode = '';
	if (buchung.rabattcode) {
		buchung.rabattCode = buchung.rabattcode.value;
		delete buchung.rabattcode;
	}
	
	buchung.oldPrice = buchung.old_price || '';
	delete buchung.old_price;

	delete buchung.teilnehmerListe;
	delete buchung.veranstaltung;
	delete buchung.preis_number;

	delete buchung.firmenrabattWert;
	delete buchung.firmenrabattProPerson;
	delete buchung.firmenrabattPreisProPerson;
	delete buchung.firmenrabattAktiv;
	delete buchung.firmenrabattText;	

	// @TODO Hier muss noch ein Ticket geschrieben werden, welches 
	// Dazu führt das die API in beiden Fällen das gleiche DTO liefert.
	// Dann wäre dies nicht mehr zu beachten.
	if (typeof buchung.preis === "string") {
		buchung.preis = parseFloat(buchung.preis.replace(',','.'));
	}
	
	VeranstaltungenService.buchen(buchung, vm.veranstaltung.code).then(
	  function(response) {
		vm.requestInProgress = false;
		if(response){
		  vm.error = false;
		  $state.go('veranstaltung_buchen_erfolg', {code:vm.veranstaltung.code});
		} else {
		  vm.error = true;
		}
	  }
	);
  }  
  
  function generateTeilnehmerListe(buchung) {
  	// Teilnehmerliste. Wir wollen jeweils nur den value haben
	// Um das DTO für die Buchung abbilden zu können, müssen wir
	// das JSON ummappen.
	angular.forEach(buchung.teilnehmerListe, function(teilnehmer, key) {

	  var teilnehmerObjekt = {};
	  angular.forEach(teilnehmer, function(eintrag, key2) {
		teilnehmerObjekt[key2] = eintrag.value;
	  });
	  // Achtung: teilnehmer.extras ist kein JSON-Objekt sondern ein Array.
	  // Das übernehemen wir direkt.
	  teilnehmerObjekt.extras = [];
	  teilnehmerObjekt.extrasNot = [];
	  for(index in teilnehmer.extras) {
		if(teilnehmer.extras[index].checked == true) {
		  teilnehmerObjekt.extras.push(teilnehmer.extras[index]);
		} else {
		  // NICHT gewählte Extras
		  teilnehmerObjekt.extrasNot.push(teilnehmer.extras[index]);
		}
	  }
	  buchung.teilnehmer.push(angular.copy(teilnehmerObjekt));
	});
  }
}

angular
  .module("izApp")
  .directive("scrollToLastTeilnehmer", ['$document', function($document) {
	return {
	  restrict: 'A',
	  link: function(scope, element, attrs) {
		var index = parseInt(attrs.id.substr("teilnehmer_".length));
		if (index > 0  && index == scope.$parent.vm.buchung.teilnehmerListe.length - 1) {
		  window.setTimeout(function() {
			$document.scrollToElementAnimated(element, 100, 750);
		  }, 500);
		}
	  },
	  template: ''
	};
  }]);

angular
  .module("izApp")
  .controller("HelpDialogController", ['$scope', '$uibModalInstance', function($scope, $modalInstance){
	vm = this;
	vm.dialogClose = dialogClose;
	vm.dialogOk = dialogOk;
	function dialogClose() {
	  $modalInstance.dismiss('cancel');
	};
	function dialogOk(){
	  $modalInstance.close("--- Dialog Daten ---");
	};
  }]);
  

}());