/**
 * @class IDU.cardoMap.BergPass.Web.Client.Controls.UserProfileForm.controller.UserProfileForm
 * @extends Ext.ux.app.control.Controller
 * Controler für das Formular der Profildaten eines Nutzers, die er ändern kann
 * @author Nico
 * @date 2014-03-28
 */
Ext4.define('IDU.cardoMap.BergPass.Web.Client.Controls.UserProfileForm.controller.UserProfileForm', {
	extend: 'Ext.ux.app.control.Controller',

	models: [
		'User'
	],

	refs: [{
		ref: 'userProfileForm',
		selector: 'idu-cardomap-bergpass-web-client-controls-userprofileform-userprofileform'
	}],

	/**
	 * @inheritdoc
	 */
	init: function()
	{
		this.control({
			'idu-cardomap-bergpass-web-client-controls-userprofileform-userprofileform button#reset': {
				'click': this.userProfileFormResetButtonClick
			},
			'idu-cardomap-bergpass-web-client-controls-userprofileform-userprofileform button#save': {
				'click': this.userProfileFormSaveButtonClick
			}
		});
	},

	/**
	 * Handlerfunktion, wenn der Datensatz gespeichert werden soll
	 * @param {IDU.cardoMap.BergPass.Web.Client.Controls.UserProfileForm.model.User} record User-Record zum Speichern
	 * @param {String} [currentPassword] aktuelles Kennwort (erforderlich, wenn ein neues Kennwort gesetzt werden soll)
	 * @private
	 */
	saveUserRecord: function(record, currentPassword)
	{
		this.application.mask();
		IDU.cardoMap.BergPass.Web.Client.Controls.UserProfileForm.UserProfileFormControlRemote.AxUpdateUserData(
			record.getData(),
			currentPassword,
			Ext4.bind(this.onSaveUserRecord, this, [record], 0),
			this
		);
	},

	/**
	 * Ajax-Callback mit durchgeschleiftem Aufrufargument
	 */
	onSaveUserRecord: function(record, res)
	{
		this.application.unmask();
		if (res.error)
		{
			this.application.alertMessage(
				'Problem beim Speichern',
				Ext4.util.Format.nl2br(res.error.Message)
			);
		}
		else
		{
			this.application.showMessage(
				'Änderungen gespeichert',
				Ext4.util.Format.nl2br(res.value)
			);

			this.getUserProfileForm().setRecord(record); //frisch setzen, damit der Reset-Knopf sich dann auf diesen Stand bezieht und die Kennwortfelder auch wieder richtig sind
		}
	},

	/**
	 * Handlerfunktion, wenn Änderungen zurückgesetzt werden sollen
	 * @private
	 */
	userProfileFormResetButtonClick: function()
	{
		this.application.confirm(
			'Änderungen zurücksetzen',
			'Änderungen im Formular zurücksetzen auf den letzten gespeicherten Stand?',
			function(buttonId)
			{
				if (buttonId == 'yes')
					this.resetUserProfileForm();
			},
			this
		);
	},

	/**
	 * Setzt die Daten im Detailformular zurück
	 */
	resetUserProfileForm: function()
	{
		this.getUserProfileForm().resetForm();
	},

	userProfileFormSaveButtonClick: function()
	{
		var userProfileForm = this.getUserProfileForm(),
			form = userProfileForm.getForm(),
			vals = form.getFieldValues(),
			formIsValid = form.isValid(),
			recordToSave = userProfileForm.getCurrentRecord().copy(), //nicht das Original verfriemeln
			submitPassword = true,
			logInDataChanged = false;

		if (vals.setPasswordCheckbox) //ist der Haken drin bei "Passwort ändern"?
		{
			if (!vals.password)
			{
				formIsValid = false;
				form.findField("password").markInvalid("'Passwort setzen' ist aktiviert, aber es ist kein Passwort angegeben.");
			}
			if (vals.password != vals.passwordRepeated)
			{
				//errs.push("Das Passwort und die Wiederholung des Passwortes stimmen nicht überein!");
				formIsValid = false;
				form.findField("passwordRepeated").markInvalid("Die Wiederholung des Passwortes stimmt nicht mit dem Passwort überein!");
			}
			logInDataChanged = true;
		}
		else
		{
			//evtl. steht noch Mist im Paswort drin, aber der Haken "Passwort setzen" ist
			//wieder raus genommen worden, also dafür sorgen, dass es wirklich leer ist
			submitPassword = false;
		}

		if ((recordToSave.get("eMail") || "").toLowerCase() != (vals.eMail || "").toLowerCase())
			logInDataChanged = true;
		if (recordToSave.get("alternativeLogInName") != vals.alternativeLogInName)
			logInDataChanged = true;
		
		if (logInDataChanged && !vals.currentPassword)
		{
			formIsValid = false;
			form.findField("currentPassword").markInvalid("Sie müssen das bisherige Kennwort angeben, wenn Sie die E-Mail-Adresse, den Anmeldenamen oder Ihr Passwort ändern.");
		}
				
		if (!formIsValid)
		{
			var posY = userProfileForm.body.getY();
			if (Ext4.getBody().getScrollTop() > posY)
			{
				//das machen wir, damit auf kleinen Bildschirmen die ErrMsg garantiert zu sehen sind

				//Ext4.getBody().setScrollTop(0); //Heul - warum geht'n das Zeug immer nicht
				if (document.documentElement && document.documentElement.scrollTop)
					document.documentElement.scrollTop = posY;
			}
		}
		else
		{
			form.updateRecord(recordToSave);
			if (!submitPassword)
				recordToSave.set("password", null);

			this.saveUserRecord(recordToSave, logInDataChanged ? vals.currentPassword : null);
		}
	}
});