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);
        }
        public string saveChangesToCourse(string courseID, string description, string courseTypeID,
										string startDate, string endDate, string locationID,
										string maxSubscriptions, string price, string startHour,
										string endHour, string name)
        {
            const string success = "success";
            const string failed = "failed";

            // validate fields before continuing
            if (string.IsNullOrWhiteSpace(courseID) ||
                string.IsNullOrWhiteSpace(description) ||
                string.IsNullOrWhiteSpace(courseTypeID) ||
                string.IsNullOrWhiteSpace(startDate) ||
                string.IsNullOrWhiteSpace(endDate) ||
                string.IsNullOrWhiteSpace(locationID) ||
                string.IsNullOrWhiteSpace(maxSubscriptions) ||
                string.IsNullOrWhiteSpace(price) ||
                string.IsNullOrWhiteSpace(startHour) ||
                string.IsNullOrWhiteSpace(endHour) ||
                string.IsNullOrWhiteSpace(name)) {
                    return "Gelieve alle velden in te vullen of na te kijken";
            }

            customValidator validator = new customValidator();
            if (!validator.validDate(startDate) || !validator.validDate(endDate))
                return "Gelieve geldige datums in te vullen (dd/mm/yyyy)";

            if (!validator.hour(startHour) || !validator.hour(endHour))
                return "Gelieve geldige uren in te vullen (hh:mm)";

            // if all is validated, continue...
            crud crud = new crud();
            course course = crud.selectCourse(Convert.ToInt32(courseID));

            course.name = name;
            course.description = description;
            course.courseType = crud.selectCourseType(Convert.ToInt32(courseTypeID));
            course.startDate = Convert.ToDateTime(startDate);
            course.endDateInclusive = Convert.ToDateTime(endDate);
            course.location = crud.selectLocation(Convert.ToInt32(locationID));
            course.maxSubscriptions = Convert.ToInt32(maxSubscriptions);
            course.price = Convert.ToInt32(price);
            course.startHour = startHour;
            course.endHour = endHour;

            if (crud.updateCourse(course) > 0) { return success; };

            return failed;
        }
        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.");
            };
        }