
/**
 * Determines if form values have changed. Requires that old values are
 * available as (hidden) input fields with name prefix "Old".
 *  
 * @param formValues
 * @return true if form values have changed
 */
function formValuesChanged(formValues) {
	var formHash = {};
	for(var i = 0; i < formValues.length; i++) {
		formHash[formValues[i].name] = formValues[i].value;
	}

	for(var key in formHash) {
		if(key.substr(0,3) == 'Old') {
			continue;
		} else {
			if(typeof(formHash['Old'+key]) == 'undefined') {
				continue;
			}
			if(formHash['Old'+key] != formHash[key]) {
				return true;
			}
		}
	}
	return false;
}

/**
 * Wraps a function behind an additional pw/pin check if required.
 * 
 * @param protectedFunction the function to call
 */
function pinPasswordWrapper(protectedFunction) {
	$.getJSON(sitevars.mysite.checkAccessUrl, function(data) {
		if(data.access == 'granted') {
			// call final destination
			protectedFunction();
		} else if (data.access == 'pinRequired') {
			$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.requestPinLayerUrl),
					null,
					function(btn, verified) {
						if (btn == 'MBRIGHT') { // right hand button.
							document.PinForm.PinForm_KeyNumber.value=document.PinForm.KeyNumber.value;
							// TODO: White spaces killen / testen auf leer
							resetFormErrors('PinForm');
							// get all form values
							var params = $('form#PinForm').serializeArray();
							// make them queryable
							var queryParams = $.param(params);
							// post request
							$.layer.showBusy();
							// only for our favourite browser
							$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
							$.post(sitevars.mysite.requestPinUrl,
									queryParams,
									function(response) {
										var result = $.parseJSON(response);
										if(result.result != 'success') {
											$.layer.hideBusy();
											displayFormErrors('PinForm', result);
											$.layer.recalculatePosition();
											verified(btn, false);
										} else {
											verified(btn, true);
											$.layer.showBusy();
											// call final destination
											protectedFunction();
										}
									}
								);
						} else {
							verified(btn, true);
						}
					},
					"abbrechen",
					"weiter");
		} else if (data.access == 'passwordRequired') {
			$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.requestPasswordLayerUrl),
					null,
					function(btn, verified) {
						if (btn == 'MBRIGHT') { // right hand button.
							// TODO: White spaces killen / testen auf leer
							resetFormErrors('PasswordForm');
							// get all form values
							var params = $('form#PasswordForm').serializeArray();
							// make them queryable
							var queryParams = $.param(params);
							// post request
							$.layer.showBusy();
							// only for our favourite browser
							$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
							$.post(sitevars.mysite.requestPasswordUrl,
									queryParams,
									function(response) {
										var result = $.parseJSON(response);
										if(result.result != 'success') {
											$.layer.hideBusy();
											displayFormErrors('PasswordForm', result);
											$.layer.recalculatePosition();
											verified(btn, false);
										} else {
											verified(btn, true);
											$.layer.showBusy();
											// call final destination
											protectedFunction();
										}
									}
								);
						} else {
							verified(btn, true);
						}
					},
					"abbrechen",
					"weiter");
		} else {
			// TODO: message box with error? Should never happen.
		}
	});
}

/**
 * Request pin layer for additional authorization.
 * Can replaced by pinPasswordWrapper, maybe.
 * 
 * @param formId
 * @return
 */
function requestPinLayer(formId, reload) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.requestPinLayerUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				// TODO: jquery?
				document.PinForm.PinForm_KeyNumber.value=document.PinForm.KeyNumber.value;
				// TODO: White spaces killen / testen auf leer
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.requestPinUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.result != 'success') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								if(reload) {
									$.layer.showBusy();
									document.location.reload();
								}
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"weiter");
}



/**
 * Request password layer for additional authorization.
 * Can replaced by pinPasswordWrapper, maybe.
 * 
 * @param formId
 * @return
 */
function requestPasswordLayer(formId, reload) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.requestPasswordLayerUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				// TODO: White spaces killen / testen auf leer
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.requestPasswordUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.result != 'success') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								if(reload) {
									document.location.reload();
								}
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"weiter");
}

/**
 * Add email layer.
 *
 * @param formId
 * @return
 */
function addEmailLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.addEmailUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateEmailUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.updateEmail == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Email wurde erfolgreich hinzugefügt.");
								$('#profile_email').load(sitevars.mysite.updateEmailDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		null,
		null);
}

/**
 * Add email and password layer.
 * 
 * @param formId
 * @return
 */
function addEmailPasswordLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.addEmailPasswordUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateEmailPasswordUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							// TODO: change json response
							if(result.updateEmailPassword == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Email und Passwort wurden erfolgreich hinzugefügt.");
								$('#profile_email').load(sitevars.mysite.updateEmailDisplayUrl);
								$('#profile_password').load(sitevars.mysite.updatePasswordDisplayUrl);
								
								// InfoServices have to be updated too, after migration
								$('#profile_info_services').load(sitevars.mysite.updateInfoServiceDisplayUrl);
								
								// Updating shown buttons
								$('#credential_buttons').load(sitevars.mysite.updateEmailDisplayButtonUrl);
								$('#info_services_buttons').load(sitevars.mysite.updateInfoServiceDisplayButtonUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change password layer.
 * 
 * @param formId
 * @return
 */
function changePasswordLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.changePasswordUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updatePasswordUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.updatePassword == 'failure') {
								if(typeof(result.Failure) != 'undefined') {
									verified(btn, true);
									$.layer.showMessageBox(result.Failure);
								} else {
									$.layer.hideBusy();
									displayFormErrors(formId, result);
									$.layer.recalculatePosition();
									verified(btn, false);
								}
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Passwort wurde erfolgreich geändert.");
								$('#profile_password').load(sitevars.mysite.updatePasswordDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Add password layer.
 * 
 * @param formId
 * @return
 */
function addPasswordLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.addPasswordUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updatePasswordUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.updatePassword == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Passwort wurde erfolgreich ge&auml;ndert.");
								$('#profile_password').load(sitevars.mysite.updatePasswordDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change email layer.
 * 
 * @param formId
 * @return
 */
function changeEmailLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.changeEmailUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateEmailUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.updateEmail == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Email wurde erfolgreich geändert.");
								$('#profile_email').load(sitevars.mysite.updateEmailDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change contact data layer
 * 
 * @param formId
 */
function changeContactLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.changeContactUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateContactUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.validationResult == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Ihre Kontaktdaten wurden erfolgreich geändert.");
								$('#profile_contact').load(sitevars.mysite.updateContactDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change address data layer.
 * 
 * @param formId
 */
function changeAccountAddressLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.changeAccountAddressUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				if(formValuesChanged(params)) {
					// make them queryable
					var queryParams = $.param(params);
					// post request
					$.layer.showBusy();
					// only for our favourite browser
					$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
					$.post(sitevars.mysite.updateAccountAddressUrl,
							queryParams,
							function(response) {
								var result = $.parseJSON(response);
								if(result.updateAccountResult == 'failure') {
									$.layer.hideBusy();
									displayFormErrors(formId, result);
									$.layer.recalculatePosition();
									verified(btn, false);
								} else {
									verified(btn, true);
									$.layer.showMessageBox("Ihre Adresse wurde erfolgreich geändert.");
									$('#profile_customer_address').load(sitevars.mysite.updateAccountAddressDisplayUrl);
								}
							}
						);
				} else {
					verified(btn, true);
				}
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change delivery address layer.
 * 
 * @param formId
 */
function changeDeliveryAddressLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.changeDeliveryAddressUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				if(formValuesChanged(params)) {
					// make them queryable
					var queryParams = $.param(params);
					// post request
					$.layer.showBusy();
					// only for our favourite browser
					$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
					$.post(sitevars.mysite.updateDeliveryAddressUrl,
							queryParams,
							function(response) {
								var result = $.parseJSON(response);
								if(result.updateDeliveryResult == 'failure') {
									$.layer.hideBusy();
									displayFormErrors(formId, result);
									$.layer.recalculatePosition();
									verified(btn, false);
								} else {
									verified(btn, true);
									$.layer.showMessageBox("Ihre Lieferanschrift wurde erfolgreich geändert.");
									$('#profile_delivery_address').load(sitevars.mysite.updateDeliveryAddressDisplayUrl);
								}
							}
						);
				}
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Add email info services layer.
 * 
 * @param formId
 */
function addEmailInfoServicesLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.addEmailUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateEmailUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.updateEmail == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Email wurde erfolgreich hinzugefügt.");
								$('#profile_email').load(sitevars.mysite.updateEmailDisplayUrl);
								$('#profile_info_services').load(sitevars.mysite.updateInfoServiceDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change info services layer.
 * 
 * @param formId
 */
function changeInfoServicesLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.changeInfoServicesUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateEmailPermissionsUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							// currently the response returns no information about failures
							verified(btn, true);
							if(result.updateResult == 'success') {
								$.layer.showMessageBox("Einstellungen für Info-Dienste wurden übernommen.");
								$('#profile_info_services').load(sitevars.mysite.updateInfoServiceDisplayUrl);
							} else {
								$.layer.showMessageBox("Einstellungen für Info-Dienste konnten nicht übernommen werden.");
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Add address layer.
 * 
 * @param formId
 */
function addAddressLayer(formId) {
	$.layer.getConfirmationBox($.urlAppend(sitevars.mysite.addAddressBookAddressUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.createAddressBookAddressUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							if(result.updateAddressResult == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Adresse wurde erfolgreich hinzugefügt.");
								$('#addressbook').load(sitevars.mysite.updateAddressBookDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Change address layer.
 * 
 * @param formId
 * @param changeUrl
 */
function changeAddressLayer(formId, changeUrl) {
	$.layer.getConfirmationBox($.urlAppend(changeUrl),
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				resetFormErrors(formId);
				// get all form values
				var params = $('form#'+formId).serializeArray();
				// make them queryable
				var queryParams = $.param(params);
				// post request
				$.layer.showBusy();
				// only for our favourite browser
				$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/x-www-form-urlencoded; charset=utf-8"});
				$.post(sitevars.mysite.updateAddressBookAddressUrl,
						queryParams,
						function(response) {
							var result = $.parseJSON(response);
							// TODO: change json response
							if(result.updateAddress == 'failure') {
								$.layer.hideBusy();
								displayFormErrors(formId, result);
								$.layer.recalculatePosition();
								verified(btn, false);
							} else {
								verified(btn, true);
								$.layer.showMessageBox("Adresse wurde erfolgreich geändert.");
								$('#addressbook').load(sitevars.mysite.updateAddressBookDisplayUrl);
							}
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"speichern");
}

/**
 * Delete address layers.
 * 
 * @param deleteUrl
 */
function deleteAddressLayer(deleteUrl) {
	$.layer.showConfirmationBox("<p>Adresse wirklich löschen?</p>",
		null,
		function(btn, verified) {
			if (btn == 'MBRIGHT') { // right hand button.
				$.layer.showBusy();
				$.post(deleteUrl,
						null,
						function(response) {
							$('#addressbook').load(sitevars.mysite.updateAddressBookDisplayUrl);
							verified(btn, true);
						}
					);
			} else {
				verified(btn, true);
			}
		},
		"abbrechen",
		"löschen");
}

function addressPager(url) {
	$('#addressbook').load(url);
}

/**
 * Delete order confirmation layer.
 * 
 * @param deleteUrl
 */
function deleteOrderLayer(formId) {
	if($('form#'+formId).find('input:checked').size() > 0) {
		$.layer.showConfirmationBox("<p>Ausgewählte Artikel wirklich stornieren?</p>",
			null,
			function(btn, verified) {
				if (btn == 'MBRIGHT') { // right hand button.
					$('form#'+formId).submit();
				} else {
					verified(btn, true);
				}
			},
			"abbrechen",
			"löschen");
	} else {
		$.layer.showMessageBox("<p>Sie haben keine Artikel ausgewählt!</p>");
	}
}

