{"id":30594,"date":"2024-11-06T10:17:27","date_gmt":"2024-11-06T09:17:27","guid":{"rendered":"https:\/\/www.africafestival.org\/?page_id=30594"},"modified":"2025-10-22T10:08:10","modified_gmt":"2025-10-22T08:08:10","slug":"africa-festival-tickets","status":"publish","type":"page","link":"https:\/\/www.africafestival.org\/en\/tickets\/africa-festival-tickets\/","title":{"rendered":"Tickets for the 37th International Africa Festival"},"content":{"rendered":"\r\n        <div class=\"evma dreiwm-event-container\">\r\n            <form id=\"evma-presale-new\" class=\"evma__form\" method=\"post\" name=\"evma-form\"\r\n                  data-event-id=\"14\"\r\n                  action=\"\"\r\n            >\r\n\t\t\t\t                <input type=\"hidden\" name=\"action\" value=\"evma-start-event-payment\">\r\n                <input type=\"hidden\" name=\"evma-locale\" value=\"en\">\r\n\r\n                <input type=\"hidden\" name=\"evma-event-id\" value=\"14\">\r\n\r\n                <div style=\"padding: 2rem;\">\r\n                    <h3>\r\n                        <span class=\"evma-title-extra\"> <\/span>\r\n\t\t\t\t\t\t37th Africa Festival - Concert Tickets                    <\/h3>\r\n                    <div class=\"evma-controls\">\r\n                        <input id=\"old-tickets-selection\"\r\n                               type=\"submit\"\r\n                               value=\"Buy here\"\r\n                               class=\"button action\"\r\n                               style=\"max-width: 300px;\"\r\n                        \/>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/form>\r\n        <\/div>\r\n\r\n        <script>\r\n            jQuery(function($) {\r\n\r\n                let isLoading = false\r\n\r\n                const formSelector = 'form.evma__form[data-event-id=\"14\"]'\r\n\r\n                \/\/ initialize stack data structures\r\n                window.evmaHtml = []\r\n                window.evmaFormData = []\r\n\r\n                $(formSelector).on('submit', submit_form)\r\n\r\n                function submit_form(event) {\r\n\r\n                    if ($(this).attr(\"action\") !== \"\") {\r\n                        $(\".evma-next\").attr(\"disabled\", true)\r\n                        $(\".evma-next\").prop(\"disabled\", true)\r\n                        return\r\n                    }\r\n\r\n                    if (isLoading === false) {\r\n\r\n                        isLoading = true\r\n\r\n                        const formData = new FormData($(this)[0])\r\n\r\n                        \/\/ remove empty input fields\r\n                        for (let [name, value] of formData.entries()) {\r\n                            if (value === \"\") {\r\n                                formData.delete(name)\r\n                            }\r\n                        }\r\n\r\n                        \/\/ create form data object for ajax request\r\n                        const form_data_obj = Object.fromEntries(formData)\r\n\r\n                        \/\/ save current html in case user wants to go back\r\n                        window.evmaHtml.push($(this).html())\r\n\r\n                        \/\/ save form data in case we need to restore it\r\n                        window.history.pushState(\"evma\", \"\")\r\n                        window.evmaFormData.push(form_data_obj)\r\n\r\n                        $(\".evma-next\").attr(\"disabled\", true)\r\n                        $(\".evma-next\").prop(\"disabled\", true)\r\n\r\n\r\n                        $.ajax({\r\n                            url : \"https:\/\/www.africafestival.org\/wp-admin\/admin-ajax.php\", \/\/ Here goes our WordPress AJAX endpoint.\r\n                            type : 'post',\r\n                            dataType: 'html',\r\n                            crossDomain: true,\r\n                            data : form_data_obj,\r\n                            success : function(response) {\r\n                                $(formSelector).html(response)\r\n                                const form = document.querySelector(formSelector)\r\n                                form.scrollIntoView(true)\r\n                                isLoading = false\r\n                            },\r\n                            fail : function(error, textStatus, errorThrown) {\r\n                                isLoading = false\r\n                                console.log(\"Errors below\")\r\n                                console.log(error)\r\n                                console.log(textStatus)\r\n                                console.log(errorThrown)\r\n                                \/**\r\n                                 * The error callback is for when the Ajax round-trip could not be completed successfully,\r\n                                 * not something based on your server logic. It would be your responsibility to check for\r\n                                 * what you consider to be a successful response inside the success callback.\r\n                                 *\/\r\n                            }\r\n                        })\r\n\r\n                        return false\r\n                    }\r\n                    else {\r\n                        event.preventDefault()\r\n                    }\r\n\r\n                }\r\n\r\n                \/\/ triggers when user goes back in history\r\n                $(window).on(\"popstate\", function(event) {\r\n\r\n                    const currentHtml = window.evmaHtml.pop()\r\n                    const currentFormData = window.evmaFormData.pop()\r\n                    if ((currentHtml !== undefined) && (currentFormData !== undefined)) {\r\n                        \/\/ restore action attribute of form (in case we were on the payment summary page)\r\n                        if ($(formSelector).attr(\"action\") !== \"\") {\r\n                            $(formSelector).attr(\"action\", \"\")\r\n                        }\r\n\r\n                        \/\/ restore previous html partial\r\n                        $(formSelector).html(currentHtml)\r\n\r\n                        \/\/ restore form data\r\n                        \/\/ console.log(Object.entries(currentFormData))\r\n                        for (const [inputName, inputValue] of Object.entries(currentFormData)) {\r\n                            $(`${formSelector} input[name='${inputName}'], ${formSelector} select[name='${inputName}']`).each(function() {\r\n                                if ($(this).is(\"select\")) {\r\n                                    $(this).find(`option[value=${inputValue}]`).attr('selected', 'selected')\r\n                                } else {\r\n                                    if ($(this).val() === \"\") {\r\n                                        $(this).val(inputValue)\r\n                                        return false\r\n                                    }\r\n                                }\r\n                            })\r\n                        }\r\n                    }\r\n\r\n                })\r\n\r\n            })\r\n        <\/script>\r\n\r\n\t\t\n\n\n\r\n        <div class=\"evma dreiwm-event-container\">\r\n            <form id=\"evma-presale-new\" class=\"evma__form\" method=\"post\" name=\"evma-form\"\r\n                  data-event-id=\"15\"\r\n                  action=\"\"\r\n            >\r\n\t\t\t\t                <input type=\"hidden\" name=\"action\" value=\"evma-start-event-payment\">\r\n                <input type=\"hidden\" name=\"evma-locale\" value=\"en\">\r\n\r\n                <input type=\"hidden\" name=\"evma-event-id\" value=\"15\">\r\n\r\n                <div style=\"padding: 2rem;\">\r\n                    <h3>\r\n                        <span class=\"evma-title-extra\"> <\/span>\r\n\t\t\t\t\t\t37th Africa Festival - 3-Day-Pass                    <\/h3>\r\n                    <div class=\"evma-controls\">\r\n                        <input id=\"old-tickets-selection\"\r\n                               type=\"submit\"\r\n                               value=\"Buy here\"\r\n                               class=\"button action\"\r\n                               style=\"max-width: 300px;\"\r\n                        \/>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/form>\r\n        <\/div>\r\n\r\n        <script>\r\n            jQuery(function($) {\r\n\r\n                let isLoading = false\r\n\r\n                const formSelector = 'form.evma__form[data-event-id=\"15\"]'\r\n\r\n                \/\/ initialize stack data structures\r\n                window.evmaHtml = []\r\n                window.evmaFormData = []\r\n\r\n                $(formSelector).on('submit', submit_form)\r\n\r\n                function submit_form(event) {\r\n\r\n                    if ($(this).attr(\"action\") !== \"\") {\r\n                        $(\".evma-next\").attr(\"disabled\", true)\r\n                        $(\".evma-next\").prop(\"disabled\", true)\r\n                        return\r\n                    }\r\n\r\n                    if (isLoading === false) {\r\n\r\n                        isLoading = true\r\n\r\n                        const formData = new FormData($(this)[0])\r\n\r\n                        \/\/ remove empty input fields\r\n                        for (let [name, value] of formData.entries()) {\r\n                            if (value === \"\") {\r\n                                formData.delete(name)\r\n                            }\r\n                        }\r\n\r\n                        \/\/ create form data object for ajax request\r\n                        const form_data_obj = Object.fromEntries(formData)\r\n\r\n                        \/\/ save current html in case user wants to go back\r\n                        window.evmaHtml.push($(this).html())\r\n\r\n                        \/\/ save form data in case we need to restore it\r\n                        window.history.pushState(\"evma\", \"\")\r\n                        window.evmaFormData.push(form_data_obj)\r\n\r\n                        $(\".evma-next\").attr(\"disabled\", true)\r\n                        $(\".evma-next\").prop(\"disabled\", true)\r\n\r\n\r\n                        $.ajax({\r\n                            url : \"https:\/\/www.africafestival.org\/wp-admin\/admin-ajax.php\", \/\/ Here goes our WordPress AJAX endpoint.\r\n                            type : 'post',\r\n                            dataType: 'html',\r\n                            crossDomain: true,\r\n                            data : form_data_obj,\r\n                            success : function(response) {\r\n                                $(formSelector).html(response)\r\n                                const form = document.querySelector(formSelector)\r\n                                form.scrollIntoView(true)\r\n                                isLoading = false\r\n                            },\r\n                            fail : function(error, textStatus, errorThrown) {\r\n                                isLoading = false\r\n                                console.log(\"Errors below\")\r\n                                console.log(error)\r\n                                console.log(textStatus)\r\n                                console.log(errorThrown)\r\n                                \/**\r\n                                 * The error callback is for when the Ajax round-trip could not be completed successfully,\r\n                                 * not something based on your server logic. It would be your responsibility to check for\r\n                                 * what you consider to be a successful response inside the success callback.\r\n                                 *\/\r\n                            }\r\n                        })\r\n\r\n                        return false\r\n                    }\r\n                    else {\r\n                        event.preventDefault()\r\n                    }\r\n\r\n                }\r\n\r\n                \/\/ triggers when user goes back in history\r\n                $(window).on(\"popstate\", function(event) {\r\n\r\n                    const currentHtml = window.evmaHtml.pop()\r\n                    const currentFormData = window.evmaFormData.pop()\r\n                    if ((currentHtml !== undefined) && (currentFormData !== undefined)) {\r\n                        \/\/ restore action attribute of form (in case we were on the payment summary page)\r\n                        if ($(formSelector).attr(\"action\") !== \"\") {\r\n                            $(formSelector).attr(\"action\", \"\")\r\n                        }\r\n\r\n                        \/\/ restore previous html partial\r\n                        $(formSelector).html(currentHtml)\r\n\r\n                        \/\/ restore form data\r\n                        \/\/ console.log(Object.entries(currentFormData))\r\n                        for (const [inputName, inputValue] of Object.entries(currentFormData)) {\r\n                            $(`${formSelector} input[name='${inputName}'], ${formSelector} select[name='${inputName}']`).each(function() {\r\n                                if ($(this).is(\"select\")) {\r\n                                    $(this).find(`option[value=${inputValue}]`).attr('selected', 'selected')\r\n                                } else {\r\n                                    if ($(this).val() === \"\") {\r\n                                        $(this).val(inputValue)\r\n                                        return false\r\n                                    }\r\n                                }\r\n                            })\r\n                        }\r\n                    }\r\n\r\n                })\r\n\r\n            })\r\n        <\/script>\r\n\r\n\t\t\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":910,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-30594","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/pages\/30594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/comments?post=30594"}],"version-history":[{"count":4,"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/pages\/30594\/revisions"}],"predecessor-version":[{"id":39522,"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/pages\/30594\/revisions\/39522"}],"up":[{"embeddable":true,"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/pages\/910"}],"wp:attachment":[{"href":"https:\/\/www.africafestival.org\/en\/wp-json\/wp\/v2\/media?parent=30594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}