protected void btnSaveNewCourse_Click(object sender, EventArgs e)
        {
            customValidator validator = new customValidator();
            validator.addValidationRule(new customValidationRule(txtNewName, validator.required, null, "Gelieve een naam in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewDescription, validator.required, null, "Gelieve een omschrijving in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewStartDate, validator.required, null, "Gelieve een startdatum in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewStartDate, validator.validDate, null, "Gelieve een geldige startdatum in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewEndDateInclusive, validator.required, null, "Gelieve een einddatum in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewEndDateInclusive, validator.validDate, null, "Gelieve een geldige einddatum in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewStartHour, validator.required, null, "Gelieve een startuur in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewStartHour, validator.hour, null, "Gelieve een geldig startuur in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewEndHour, validator.required, null, "Gelieve een einduur in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewEndHour, validator.hour, null, "Gelieve een geldig einduur in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewMaxSubscriptions, validator.required, null, "Gelieve het maximum aantal inschrijvingen in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewMaxSubscriptions, validator.numeric, null, "Gelieve het maximum aantal inschrijvingen in te vullen als geheel getal"));
            validator.addValidationRule(new customValidationRule(txtNewPrice, validator.required, null, "Gelieve een prijs in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNewPrice, validator.numeric, null, "Gelieve een prijs in te vullen als geheel getal"));

            List<string> errors = validator.validate();
            StringBuilder messageText = new StringBuilder();
            if (errors.Count > 0) {
                foreach (string error in errors) {
                    messageText.Append(error + "<br>");
                }

                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, messageText.ToString());

                return;
            }

            if (selectedCourseType == null || selectedLocation == null) {
                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, "Gelieve een cursustype en locatie te selecteren");
                return;
            }

            crud crud = new crud();

            course course = new course() {
                name = txtNewName.Text,
                description = txtNewDescription.Text,
                courseType = selectedCourseType,
                location = selectedLocation,
                startDate = Convert.ToDateTime(txtNewStartDate.Text),
                endDateInclusive = Convert.ToDateTime(txtNewEndDateInclusive.Text),
                startHour = txtNewStartHour.Text,
                endHour = txtNewEndHour.Text,
                maxSubscriptions = Convert.ToInt32(txtNewMaxSubscriptions.Text),
                price = Convert.ToInt32(txtNewPrice.Text)
            };

            crud.insertCourse(course);

            clearNewCourseForm();
            fillCoursesList(crud);
        }
        protected void btnAddNewChild_Click(object sender, EventArgs e)
        {
            // validate fields before continuing
            customValidator validator = new customValidator();
            validator.addValidationRule(new customValidationRule(txtName, validator.required, null, settingsHelper.get("validator_required_name")));
            validator.addValidationRule(new customValidationRule(txtFirstName, validator.required, null, settingsHelper.get("validator_required_firstname")));
            validator.addValidationRule(new customValidationRule(txtDateOfBirth, validator.required, null, settingsHelper.get("validator_required_date_of_birth")));
            validator.addValidationRule(new customValidationRule(txtDateOfBirth, validator.validDate, null, settingsHelper.get("validator_valid_date")));

            List<string> errors = validator.validate();
            StringBuilder messageText = new StringBuilder();
            if (errors.Count > 0) {
                foreach (string error in errors) {
                    messageText.Append(error + "<br>");
                }

                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, messageText.ToString());

                return;
            }

            // if all is validated, continue...
            List<child> subscribedChildren = (List<child>) Session["subscribedChildren"] ?? new List<child>();

            try {
                child newChild = new child();
                newChild.name = txtName.Text;
                newChild.firstName = txtFirstName.Text;
                newChild.dateOfBirth = CreateDate(txtDateOfBirth.Text);
                newChild.id = generateTemporaryChildID(subscribedChildren.Select(child => child.id).ToList());
                newChild.userProfileID = Convert.ToInt32(Session["userID"]);

                int courseID = Convert.ToInt32(Request.QueryString["courseID"]);
                course course = new crud().selectCourse(courseID);

                if (childHasCorrectAge(newChild.dateOfBirth, course.courseType.ageFrom, course.courseType.ageToInclusive)) {
                    subscribedChildren.Add(newChild);
                    Session["subscribedChildren"] = subscribedChildren;

                    refreshLists(courseID);
                    clearNewChildUI();
                } else {
                    ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, settingsHelper.get("error_child_wrong_age"));
                }

            } catch {
                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, settingsHelper.get("error_complete_all_fields"));
            }
        }
        // UI handlers
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            customValidator validator = new customValidator();
            validator.addValidationRule(new customValidationRule(txtUsername, validator.required, null, "Gelieve een gebruikersnaam in te vullen"));
            validator.addValidationRule(new customValidationRule(txtUsername, validator.maxLength, "50", "Gebruikersnaam mag niet langer zijn dan 50 karakters"));
            validator.addValidationRule(new customValidationRule(txtPassword, validator.required, null, "Gelieve een wachtwoord in te vullen"));
            validator.addValidationRule(new customValidationRule(txtPassword, validator.maxLength, "50", "Wachtwoord mag niet langer zijn dan 50 karakters"));

            List<string> errors = validator.validate();
            StringBuilder messageText = new StringBuilder();
            if (errors.Count > 0) {
                foreach (string error in errors) {
                    messageText.Append(error + "<br>");
                }

                ((NinaSubscriptionsMaster)this.Master).setMessage(messageClasses.messageError, messageText.ToString());

                return;
            }

            // if all is validated, continue...
            NinaSubscriptionsMaster master = this.Master as NinaSubscriptionsMaster;

            if (master.login(txtUsername.Text, txtPassword.Text)) {
                master.setUIatLogin();

                string redirectUrl = "bekijkAanbod.aspx";
                if (Session["urlBeforeLogin"] != null) { redirectUrl = Session["urlBeforeLogin"].ToString(); };

                Response.Redirect(redirectUrl);

            } else {
                //lblErrorMessage.Text = "Gebruikersnaam of paswoord is onjuist.";
                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, "Gebruikersnaam of paswoord is onjuist.");
                txtUsername.Focus();
            };
        }
        protected void btnRegister_Click(object sender, EventArgs e)
        {
            customValidator validator = new customValidator();
            validator.addValidationRule(new customValidationRule(txtUsername, validator.required, null, "Gelieve een gebruikersnaam in te vullen"));
            validator.addValidationRule(new customValidationRule(txtName, validator.required, null, "Gelieve een naam in te vullen"));
            validator.addValidationRule(new customValidationRule(txtFirstName, validator.required, null, "Gelieve een voornaam in te vullen"));
            validator.addValidationRule(new customValidationRule(txtEmailAddress, validator.required, null, "Gelieve een emailadres in te vullen"));
            validator.addValidationRule(new customValidationRule(txtEmailAddress, validator.email, null, "Gelieve een geldig emailadres in te vullen"));
            validator.addValidationRule(new customValidationRule(txtPhone, validator.required, null, "Gelieve een telefoonnummer in te vullen"));
            validator.addValidationRule(new customValidationRule(txtStreet, validator.required, null, "Gelieve een straat in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNumber, validator.required, null, "Gelieve een huisnummer in te vullen"));
            validator.addValidationRule(new customValidationRule(txtNumber, validator.numeric, null, "Gelieve een geheel getal in te vullen"));
            validator.addValidationRule(new customValidationRule(txtPostalCode, validator.required, null, "Gelieve een postcode in te vullen"));
            validator.addValidationRule(new customValidationRule(txtPlace, validator.required, null, "Gelieve een plaats in te vullen"));
            validator.addValidationRule(new customValidationRule(txtPassword, validator.required, null, "Gelieve een wachtwoord in te vullen"));
            validator.addValidationRule(new customValidationRule(txtPasswordRepeat, validator.required, null, "Gelieve een wachtwoord in te vullen"));

            List<string> errors = validator.validate();
            StringBuilder messageText = new StringBuilder();
            if (errors.Count > 0) {
                foreach (string error in errors) {
                    messageText.Append(error + "<br>");
                }

                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, messageText.ToString());

                return;
            }

            if (txtPassword.Text != txtPasswordRepeat.Text) {
                ((NinaSubscriptionsMaster) this.Master).setMessage(messageClasses.messageError, "De ingegeven wachtwoorden komen niet overeen.");
                return;
            }

            // if all is validated, continue...
            crud crud = new crud();

            userProfile profile = new userProfile();
            profile.userName = txtUsername.Text;
            profile.passwordHash = new PNV_Cryptor.PNV_Cryptor("forgirlswholoveskateboarding", PNV_Cryptor.PNV_Cryptor.EncryptionMethods.TripleDes).EncryptData(txtPassword.Text);
            profile.name = txtName.Text;
            profile.firstName = txtFirstName.Text;
            profile.emailAddress = txtEmailAddress.Text;
            profile.phone = txtPhone.Text;
            profile.street = txtStreet.Text;
            profile.number = Convert.ToInt32(txtNumber.Text);
            profile.postalCode = Convert.ToInt32(txtPostalCode.Text);
            profile.place = txtPlace.Text;
            profile.isAdmin = false;

            if (crud.insertUserProfile(profile) > 0) {
                NinaSubscriptionsMaster master = this.Master as NinaSubscriptionsMaster;
                if (master.login(txtUsername.Text, txtPassword.Text)) {
                    master.setUIatLogin();
                };

                string redirectUrl = "bekijkAanbod.aspx";
                if (Session["urlBeforeLogin"] != null) { redirectUrl = Session["urlBeforeLogin"].ToString(); };

                string redirect = "<a href=\"" + redirectUrl + "\">U heeft zich succesvol geregistreerd. Klik hier om terugkeren naar de vorige pagina.</a>";
                master.setMessage(messageClasses.messageSuccess, redirect);

                clearUI();

            } else {
                NinaSubscriptionsMaster master = this.Master as NinaSubscriptionsMaster;
                master.setMessage(messageClasses.messageError, "Gelieve alle velden correct in te vullen.");
            };
        }